[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Native] Migrate timing logging to printf - #12153

Merged
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging
Jul 20, 2026
Merged

[Native] Migrate timing logging to printf#12153
jonathanpeppers merged 12 commits into
mainfrom
dev/simonrozsival/nativeaot-timing-printf-logging

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 in the shared native timing infrastructure.

The timing headers are used by MonoVM, CoreCLR, and NativeAOT. All three runtimes now use the same printf-style path for variable timing diagnostics rather than maintaining MonoVM-only std::format branches.

Base/dependency:#12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only the timing migration.

Part of #12139.

Scope

Only two shared timing headers change:

  • src/native/common/include/runtime-base/timing.hh
  • src/native/common/include/runtime-base/timing-internal.hh

These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12155.

Changes

Managed timing records

  • replace the owning std::format result in Timing::do_log() with log_writef() for every runtime;
  • preserve the exact message; elapsed: seconds:milliseconds::nanoseconds field order;
  • pass duration values as explicitly converted unsigned long long values matching %llu.

Fast timing diagnostics

Migrate variable diagnostics to log_warnf() for every runtime:

  • timing event buffer reallocation sizes;
  • CLOCK_MONOTONIC_RAW errors;
  • unknown event-kind values;
  • invalid event-index source method names.

Constant warning messages continue using the existing non-formatting string_view overload.

Behavior preserved

  • timing enablement and category gating are unchanged;
  • timing sequence acquisition/release is unchanged;
  • elapsed duration units, values, and output order are unchanged;
  • event-buffer growth, clock error handling, unknown-event fallback, and index validation are unchanged;
  • no timing data structures, locks, vectors, strings, or event lifecycle code change.

Runtime behavior

RuntimeResult
NativeAOTUses #12140 printf helpers for variable timing diagnostics
CoreCLRUses #12140 printf helpers for variable timing diagnostics
MonoVMUses the matching MonoVM printf helper implementation from #12140

Measured impact

Representative Android arm64 Release objects compiled before the MonoVM path was unified:

Runtime/objectBeforeAfterDifference
CoreCLR internal-pinvokes-clr.cc.o145,472 B17,080 B-128,392 B (-88.26%)
NativeAOT host.cc.o176,104 B175,960 B-144 B

CoreCLR's representative object drops from 58 formatting symbols to zero. NativeAOT's representative object still contains formatting symbols from other included functionality, but the timing call sites migrated here no longer instantiate them.

Non-goals

  • no new timing tests or logging test framework;
  • no change to timing data ownership or synchronization;
  • no changes to the logging helper implementation introduced by [Native] Add printf-style native logging #12140;
  • no attempt to migrate unrelated timing output/file-generation code outside these shared timing headers.

Validation

  • git diff --check;
  • NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
  • NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
  • NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
  • representative before/after object compilation, size comparison, and symbol inspection;
  • focused review of chrono values, integer format widths, source-location output, and category semantics;
  • latest head: 21ff66b26.

Introduce printf-style native logging and abort helpers while preserving the existing std::format APIs for MonoVM and CoreCLR. Migrate the NativeAOT-specific formatted call sites to the new primitives.
Refs #12139
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 187b207a-083b-461e-9071-e9aab61c9d07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Keep the printf logging PR focused on the runtime implementation instead of introducing new host-native logging test infrastructure.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Use #12140 printf helpers for shared timing diagnostics while preserving MonoVM std::format behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates shared native timing logging for CoreCLR/NativeAOT to the printf-style helpers introduced in #12140, while keeping MonoVM’s existing std::format-based timing output behind XA_HOST_MONOVM.

Changes:

  • Switch Timing::do_log() (managed timing records) to log_writef() for CoreCLR/NativeAOT while preserving MonoVM’s std::format path.
  • Migrate several FastTiming diagnostics (buffer growth, clock failures, unknown kinds, invalid indices) to log_warnf() for CoreCLR/NativeAOT, preserving MonoVM’s existing logging path.
Show a summary per file
FileDescription
src/native/common/include/runtime-base/timing.hhUse log_writef() for CoreCLR/NativeAOT managed timing record formatting; keep MonoVM on std::format.
src/native/common/include/runtime-base/timing-internal.hhUse log_warnf() for CoreCLR/NativeAOT FastTiming diagnostics under compile-time guards; keep MonoVM behavior unchanged.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Comment threadsrc/native/common/include/runtime-base/timing-internal.hh Outdated
@simonrozsivalsimonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
@simonrozsivalsimonrozsival changed the title [CoreCLR/NativeAOT] Migrate timing logging to printf[Native] Migrate timing logging to printfJul 17, 2026
simonrozsival added a commit that referenced this pull request Jul 20, 2026
## Summary
Introduce printf-style native logging primitives and migrate the initial NativeAOT formatted logging call sites to them.
This is the first implementation step from #12139 toward removing the Android NativeAOT dependency on libc++.
## Changes
- add `log_writev()`, `log_writef()`, `log_debugf()`, `log_infof()`, `log_warnf()`, and `log_errorf()` alongside the existing `std::format` APIs;
- implement the same printf helpers in the CLR and MonoVM shared logging backends so shared runtime code can use one logging path;
- add `Helpers::abort_applicationf()` for formatted fatal messages without truncating tombstone text;
- include `<cstdio>` explicitly for `vasprintf()`;
- omit an unused `log_fatalf()` wrapper; formatted fatal termination uses `abort_applicationf()` instead;
- replace the NativeAOT GC-user-peer initialization error's `std::format`;
- replace the NativeAOT JNI on-load debug message's `{}` formatting;
- avoid `std::format` inside `Helpers::abort_application()`.
The existing `std::format` APIs remain available so unrelated call sites can be migrated incrementally. The current stacked migrations are #12148 (shared runtime utilities), #12150 (JNI reference logging), #12153 (timing logging), and #12155 (configuration diagnostics).
## Runtime behavior
- NativeAOT and CoreCLR use the CLR shared logging implementation.
- MonoVM uses its own shared logging implementation with the same printf helper surface.
- category filtering and Android log priorities remain unchanged.
- null format pointers are logged as `<null>` rather than passed to `__android_log_vprint()`.
## Validation
- `git diff --check`;
- Release build of `src/native/native-nativeaot.csproj`;
- Release build of `src/native/native-clr.csproj`;
- NDK Clang C++23 syntax compilation of the CLR helper changes across NativeAOT/CoreCLR configurations;
- NDK Clang C++23 syntax compilation of the MonoVM printf implementation in 8 Android configurations;
- focused review of `va_list`, category filtering, format checking, source-location behavior, and Android log-priority mapping;
- latest head: `09f0690da`.
Part of #12139.
Base automatically changed from dev/simonrozsival/nativeaot-printf-logging to mainJuly 20, 2026 13:44
@jonathanpeppers
jonathanpeppers merged commit 6865e9e into mainJul 20, 2026
44 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/nativeaot-timing-printf-logging branch July 20, 2026 16:44
jonathanpeppers added a commit that referenced this pull request Jul 21, 2026
## Summary
Continue the printf-style logging migration introduced by #12140 for native configuration and parsing diagnostics.
This PR converts CoreCLR/NativeAOT host-environment messages and the shared MonoVM/CoreCLR/NativeAOT integer-parsing messages to the printf helpers from #12140. Shared code now has one logging path instead of runtime-specific format branches.
**Base/dependency:** #12140 must merge first. This PR targets `dev/simonrozsival/nativeaot-printf-logging` so its diff contains only this migration.
Part of #12139.
## Scope
Only two files change:
- `src/native/clr/include/host/host-environment.hh`
- `src/native/common/include/runtime-base/strings.hh`
These files do not overlap #12141, #12142, #12145, #12148, #12150, or #12153.
## Changes
### Host environment diagnostics
`host-environment.hh` is shared by CoreCLR and NativeAOT, but not MonoVM.
- migrate generated system-property diagnostics to `%s` formatting;
- migrate XDG directory creation diagnostics to `%s` formatting;
- migrate XDG directory failure diagnostics while preserving the original errno text;
- retain `optional_string()` handling for null C-string inputs.
### Integer parsing diagnostics
`strings.hh` is shared by all three runtimes. Its variable diagnostics now use `log_errorf()` without runtime-specific branches:
- an invalid starting index, using `%zu` for `size_t`;
- signed/unsigned range failures, using explicitly converted `%lld` / `%llu` values;
- values that do not represent an integer in the selected `%d` base;
- trailing non-numeric characters.
The header forward-declares only `log_errorf()` instead of including the heavyweight formatting declarations from `shared/log_types.hh`.
## Behavior preserved
- integer conversion logic, range checks, errno handling, and output assignment are unchanged;
- the copied parse buffer remains NUL-terminated before `%s` logging;
- host environment variables and XDG directory creation behavior are unchanged;
- debug category gating and unconditional error/warning semantics remain unchanged.
## Runtime behavior
| Runtime | Result |
|---|---|
| NativeAOT | Uses #12140 printf helpers for all migrated diagnostics |
| CoreCLR | Uses #12140 printf helpers for shared parsing and host-environment diagnostics |
| MonoVM | Uses the matching MonoVM `log_errorf()` implementation for shared parsing diagnostics |
## Measured impact
Representative Android arm64 Release objects compiled before the MonoVM path was unified:
| Runtime/object | Before | After | Difference |
|---|---:|---:|---:|
| NativeAOT `host-environment.cc.o` | 131,288 B | 130,848 B | -440 B |
| CoreCLR `timing-internal.cc.o` | 194,048 B | 193,088 B | -960 B |
These call sites did not contain explicit `std::format` expressions, so the impact is smaller than #12150/#12153; the change prevents their formatted logging templates from being instantiated.
## Non-goals
- no new configuration or parsing behavior;
- no changes to environment-variable storage, XDG path construction, or integer parsing buffers;
- no new logging tests;
- no attempt to migrate unrelated configuration code outside these two headers.
## Validation
- `git diff --check`;
- NDK Clang C++23 syntax compilation of all 36 Android arm64 Release NativeAOT source variants;
- NDK Clang C++23 syntax compilation of all 38 Android arm64 Release CoreCLR source variants;
- NDK Clang C++23 syntax compilation of all 31 Android arm64 Release MonoVM source variants;
- representative before/after object compilation and size comparison;
- focused review of signed/unsigned conversions, format widths, null termination, include dependencies, and runtime behavior;
- latest head: `72cad5d01`.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

drop-libcppWork to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers