Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas
, '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

Remove unused code from nativeaot libunwind dependency - #128415

Closed
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce
Closed

Remove unused code from nativeaot libunwind dependency#128415
sbomer wants to merge 6 commits into
dotnet:mainfrom
sbomer:libunwind-reduce

Conversation

@sbomer

Copy link
Copy Markdown
Member

Trying another approach for #121172.

sbomerand others added 3 commits May 18, 2026 09:54
NativeAOT's llvm-libunwind dependency includes many files that are never
compiled or used. This reduces the vendored copy to only what's needed.
Removed source files not compiled by NativeAOT (not in llvm-libunwind.cmake):
- UnwindLevel1.c (zero-cost exception APIs)
- UnwindLevel1-gcc-ext.c (GCC extension APIs)
- Unwind-seh.cpp (SEH unwinding)
- Unwind-sjlj.c (setjmp/longjmp exceptions)
- Unwind-wasm.c (WASM exceptions)
- Unwind_AIXExtras.cpp (AIX-specific)
Removed directories and files not used in the dotnet build:
- test/ (llvm test suite)
- docs/ (llvm documentation)
- cmake/ (standalone CMake modules)
- CMakeLists.txt files (standalone build system)
- .clang-format, libunwind.modulemap
Removed dead _LIBUNWIND_DISABLE_ZERO_COST_APIS define from NativeAOT
CMakeLists.txt - this macro is not referenced anywhere in llvm-libunwind
source. The zero-cost API files (UnwindLevel1.c, UnwindLevel1-gcc-ext.c)
were never compiled in the first place.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
NativeAOT uses llvm-libunwind's internal C++ classes directly
(DwarfInstructions, CompactUnwinder, UnwindCursor, LocalAddressSpace)
and does not call any of the public unw_* C API functions defined in
libunwind.cpp. Removing it from the build eliminates 20 globally-visible
symbols that conflict with platform libunwind on Android NDK r29.
The only symbol from libunwind.cpp that NativeAOT references is
LocalAddressSpace::sThisAddressSpace (a static singleton). This is now
defined directly in UnixNativeCodeManager.cpp.
Eliminated symbols: __unw_init_local, __unw_step, __unw_step_stage2,
__unw_get_reg, __unw_set_reg, __unw_get_fpreg, __unw_set_fpreg,
__unw_get_proc_info, __unw_get_proc_name, __unw_resume, __unw_is_fpreg,
__unw_is_signal_frame, __unw_regname, __unw_iterate_dwarf_unwind_cache,
__unw_add_dynamic_fde, __unw_remove_dynamic_fde,
__unw_add_dynamic_eh_frame_section, __unw_remove_dynamic_eh_frame_section,
unw_local_addr_space, and their weak aliases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
The static member LocalAddressSpace::sThisAddressSpace conflicts with
the same symbol in Android NDK r29's libunwind.a. Remove the static
member declaration from AddressSpace.hpp and switch
UnixNativeCodeManager.cpp to use the existing _addressSpace instance
from UnwindHelpers.cpp via an extern declaration. Both are instances
of the same stateless type.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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

This PR reduces the vendored llvm-libunwind footprint used by NativeAOT and adjusts NativeAOT’s unwinding integration to avoid Android link failures caused by duplicate libunwind symbols.

Changes:

  • Removes large portions of upstream llvm-libunwind (tests/docs/CMake scaffolding and several source files) from the repo.
  • Stops building llvm-libunwind/src/libunwind.cpp via src/native/external/llvm-libunwind.cmake and switches NativeAOT’s unwind-section discovery to use a LocalAddressSpace instance defined in UnwindHelpers.cpp.
  • Drops an unused NativeAOT CMake definition related to disabling _Unwind_*-style APIs.
Show a summary per file
FileDescription
src/native/external/llvm-libunwind/test/unwind_scalable_vectors.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unwind_leaffunction.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_resume.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/unw_getcontext.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/signal_frame.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/remember_state_leak.pass.sh.sRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/lit.cfg.pyRemoved upstream lit “canary” config.
src/native/external/llvm-libunwind/test/libunwind_02.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/libunwind_01.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/frameheadercache_test.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/forceunwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/floatregister.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/eh_frame_fde_pc_range.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-static-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/llvm-libunwind-merged.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/ibm-libunwind-shared.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/cmake-bridge.cfg.inRemoved upstream test config bridge.
src/native/external/llvm-libunwind/test/configs/armv7m-picolibc-libunwind.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/configs/apple-libunwind-system.cfg.inRemoved upstream test config.
src/native/external/llvm-libunwind/test/CMakeLists.txtRemoved upstream test suite CMake integration.
src/native/external/llvm-libunwind/test/bad_unwind_info.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/alignment.compile.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_signal_unwind.pass.sh.SRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aix_runtime_link.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_za_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/test/aarch64_vg_unwind.pass.cppRemoved upstream libunwind test.
src/native/external/llvm-libunwind/src/UnwindLevel1.cRemoved upstream zero-cost EH implementation.
src/native/external/llvm-libunwind/src/UnwindLevel1-gcc-ext.cRemoved upstream gcc extension implementation.
src/native/external/llvm-libunwind/src/Unwind-wasm.cRemoved upstream wasm EH implementation.
src/native/external/llvm-libunwind/src/Unwind-sjlj.cRemoved upstream SJLJ EH implementation.
src/native/external/llvm-libunwind/src/Unwind-seh.cppRemoved upstream SEH EH implementation.
src/native/external/llvm-libunwind/src/Unwind_AIXExtras.cppRemoved upstream AIX extras implementation.
src/native/external/llvm-libunwind/src/CMakeLists.txtRemoved upstream libunwind build definition.
src/native/external/llvm-libunwind/src/AddressSpace.hppRemoves LocalAddressSpace::sThisAddressSpace declaration.
src/native/external/llvm-libunwind/include/libunwind.modulemapRemoved upstream modulemap.
src/native/external/llvm-libunwind/include/CMakeLists.txtRemoved upstream include install CMake.
src/native/external/llvm-libunwind/docs/README.txtRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/index.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/conf.pyRemoved upstream docs file.
src/native/external/llvm-libunwind/docs/CMakeLists.txtRemoved upstream docs CMake integration.
src/native/external/llvm-libunwind/docs/BuildingLibunwind.rstRemoved upstream docs file.
src/native/external/llvm-libunwind/CMakeLists.txtRemoved upstream top-level CMake integration.
src/native/external/llvm-libunwind/cmake/Modules/HandleLibunwindFlags.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/cmake/config-ix.cmakeRemoved upstream CMake module.
src/native/external/llvm-libunwind/.clang-formatRemoved upstream formatting config.
src/native/external/llvm-libunwind.cmakeDrops src/libunwind.cpp from the NativeAOT libunwind source list.
src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cppSwitches unwind section discovery to a shared LocalAddressSpace instance.
src/coreclr/nativeaot/Runtime/CMakeLists.txtRemoves _LIBUNWIND_DISABLE_ZERO_COST_APIS definition.

Copilot's findings

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

src/Unwind-EHABI.cpp
src/libunwind.cpp
)

Comment on lines +25 to +30
// Use the LocalAddressSpace instance from UnwindHelpers.cpp instead of
// the static member LocalAddressSpace::sThisAddressSpace (which was
// previously defined in libunwind.cpp). This avoids exporting a symbol
// that conflicts with platform libunwind on Android.
extern libunwind::LocalAddressSpace _addressSpace;

1. Guard EHABI zero-cost exception APIs with _LIBUNWIND_DISABLE_ZERO_COST_APIS.
Unwind-EHABI.cpp's C++ exception dispatch functions (__aeabi_unwind_cpp_pr*,
_Unwind_RaiseException, unwind_phase1/2, etc.) call __unw_step and other
public unw_* functions from libunwind.cpp, which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret from this file. The guard
compiles out the unused dispatch code, avoiding undefined symbol errors
on ARM EHABI targets.
2. Replace extern _addressSpace with UnwindHelpers::FindUnwindSections().
Instead of exposing a cross-TU global with a generic name,
UnixNativeCodeManager now calls a typed static method on UnwindHelpers
which internally uses the file-local LocalAddressSpace instance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@@ -1,116 +0,0 @@
# HandleLibcxxFlags - A set of macros used to setup the flags used to compile

@jkotasjkotasMay 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We do not mind having some unused code under src/native/external to make the updates easy.

If there are large chunks of code (e.g. tests) that are worth deleting, it needs to be noted in https://github.com/dotnet/runtime/blob/main/src/native/external/llvm-libunwind-version.txt

Example of existing file with exclusions https://github.com/dotnet/runtime/blob/main/src/native/external/zlib-ng-version.txt

sbomerand others added 2 commits May 20, 2026 13:41
Delete the zero-cost exception dispatch functions that NativeAOT does
not use: __aeabi_unwind_cpp_pr0/1/2, unwindOneFrame, ProcessDescriptors,
unwind_phase1/2, _Unwind_RaiseException, and related helpers. These
depend on __unw_step and other public unw_* functions from libunwind.cpp
which is no longer compiled.
NativeAOT only uses _Unwind_VRS_Interpret (the ARM EHABI bytecode
interpreter) and decode_eht_entry from this file. The Descriptor::Format
enum is retained as it is referenced by decode_eht_entry.
Reduces Unwind-EHABI.cpp from 1,213 to 303 lines.
Also removes the _LIBUNWIND_DISABLE_ZERO_COST_APIS define that was
re-added in the previous commit, since the code it would have guarded
is now deleted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
logAPIs(), logUnwinding(), and logDWARF() are declared in config.h when
NDEBUG is not defined and were previously implemented in libunwind.cpp.
Since libunwind.cpp is no longer compiled, provide these definitions in
UnwindHelpers.cpp to fix undefined symbols in Debug builds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude:claude-opus-4.6-1m
@sbomer

Copy link
Copy Markdown
MemberAuthor

Closing in favor of #128667

@sbomersbomer closed this May 27, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants

@sbomer@jkotas