Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky
, '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

Add CompressSymbols opt-out option in NativeAOT - #85192

Merged
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping
Aug 2, 2023
Merged

Add CompressSymbols opt-out option in NativeAOT#85192
jkotas merged 4 commits into
dotnet:mainfrom
am11:feature/nativeaot/symbol-stripping

Conversation

@am11

@am11am11 commented Apr 22, 2023

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix#85188

@ghostghost added area-NativeAOT-coreclr community-contribution Indicates that the PR has been added by a community member labels Apr 22, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

Compressed symbols option shaves ~9+ MB off of .dbg file with api template app on linux-arm64.

Even with StripSymbols=false, the "fat binary" with embedded symbols goes from 34.6M to 26.1M.

Fix #85188

Author:am11
Assignees:-
Labels:

area-NativeAOT-coreclr

Milestone:-

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

gdb and lldb recognize compressed format, e.g. before and after the compression, the disassembly of an internal method with gdb remained the same:

# with `<LinkerArg Include="-gz=zlib" />` item in project file
$ dotnet publish -p:PublishAot=true -o dist -c Release -p:StripSymbols=true
$ gdb dist/app1 -batch -ex 'disassemble S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules'
Dump of assembler code for function S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules:
0x0000000000244980 <+0>:	stp	x29, x30, [sp, #-80]!
0x0000000000244984 <+4>:	stp	x19, x20, [sp, #40]
0x0000000000244988 <+8>:	stp	x21, x22, [sp, #56]
0x000000000024498c <+12>:	str	x23, [sp, #72]
0x0000000000244990 <+16>:	mov	x29, sp
0x0000000000244994 <+20>:	mov	x19, x0
0x0000000000244998 <+24>:	mov	x21, x1
0x000000000024499c <+28>:	mov	w20, w2
0x00000000002449a0 <+32>:	mov	x22, x3
0x00000000002449a4 <+36>:	mov	w23, w4
0x00000000002449a8 <+40>:	add	x0, x29, #0x180x00000000002449ac <+44>:	bl	0x212c8 <RhpReversePInvoke(ReversePInvokeFrame*)>
0x00000000002449b0 <+48>:	mov	x0, x19
0x00000000002449b4 <+52>:	bl	0x1e174 <RhpRegisterOsModule(HANDLE)>
0x00000000002449b8 <+56>:	mov	x0, x19
0x00000000002449bc <+60>:	mov	x1, x21
0x00000000002449c0 <+64>:	mov	w2, w20
0x00000000002449c4 <+68>:	mov	x3, x22
0x00000000002449c8 <+72>:	mov	w4, w23
0x00000000002449cc <+76>:	bl	0x244b80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__CreateTypeManagers>
0x00000000002449d0 <+80>:	mov	x19, x0
0x00000000002449d4 <+84>:	sxtw	x1, w20
0x00000000002449d8 <+88>:	adrp	x0, 0xaba0000x00000000002449dc <+92>:	add	x0, x0, #0x7000x00000000002449e0 <+96>:	bl	0x636e0 <RhpNewArray>
0x00000000002449e4 <+100>:	mov	x20, x0
0x00000000002449e8 <+104>:	mov	w21, wzr
0x00000000002449ec <+108>:	ldr	w22, [x19, #8]
0x00000000002449f0 <+112>:	cmp	w22, #0x00x00000000002449f4 <+116>:	b.le	0x244a1c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+156>
0x00000000002449f8 <+120>:	ubfiz	x0, x21, #3, #320x00000000002449fc <+124>:	add	x0, x0, #0x100x0000000000244a00 <+128>:	ldr	x0, [x19, x0]
0x0000000000244a04 <+132>:	mov	w1, w21
0x0000000000244a08 <+136>:	mov	x2, x20
0x0000000000244a0c <+140>:	bl	0x244d80 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeGlobalTablesForModule>
0x0000000000244a10 <+144>:	add	w21, w21, #0x10x0000000000244a14 <+148>:	cmp	w22, w21
0x0000000000244a18 <+152>:	b.gt	0x2449f8 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+120>
0x0000000000244a1c <+156>:	mov	x0, x20
0x0000000000244a20 <+160>:	mov	w1, #0x2 // #20x0000000000244a24 <+164>:	bl	0x216fc0 <S_P_CoreLib_System_Runtime_RuntimeImports__RhHandleAlloc>
0x0000000000244a28 <+168>:	adrp	x1, 0x8b20000x0000000000244a2c <+172>:	add	x1, x1, #0xf400x0000000000244a30 <+176>:	str	x0, [x1, #16]
0x0000000000244a34 <+180>:	adrp	x14, 0x8940000x0000000000244a38 <+184>:	add	x14, x14, #0x7d00x0000000000244a3c <+188>:	ldr	x14, [x14]
0x0000000000244a40 <+192>:	add	x14, x14, #0x80x0000000000244a44 <+196>:	mov	x15, x19
0x0000000000244a48 <+200>:	bl	0x64b38 <RhpAssignRefArm64>
0x0000000000244a4c <+204>:	str	w22, [x1, #8]
0x0000000000244a50 <+208>:	mov	w20, wzr
0x0000000000244a54 <+212>:	cmp	w22, #0x00x0000000000244a58 <+216>:	b.le	0x244a7c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+252>
0x0000000000244a5c <+220>:	ubfiz	x0, x20, #3, #320x0000000000244a60 <+224>:	add	x0, x0, #0x100x0000000000244a64 <+228>:	ldr	x0, [x19, x0]
0x0000000000244a68 <+232>:	mov	w1, #0xcd // #2050x0000000000244a6c <+236>:	bl	0x244ee0 <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__RunInitializers>
0x0000000000244a70 <+240>:	add	w20, w20, #0x10x0000000000244a74 <+244>:	cmp	w22, w20
0x0000000000244a78 <+248>:	b.gt	0x244a5c <S_P_CoreLib_Internal_Runtime_CompilerHelpers_StartupCodeHelpers__InitializeModules+220>
0x0000000000244a7c <+252>:	add	x0, x29, #0x180x0000000000244a80 <+256>:	bl	0x21394 <RhpReversePInvokeReturn(ReversePInvokeFrame*)>
0x0000000000244a84 <+260>:	ldr	x23, [sp, #72]
0x0000000000244a88 <+264>:	ldp	x21, x22, [sp, #56]
0x0000000000244a8c <+268>:	ldp	x19, x20, [sp, #40]
0x0000000000244a90 <+272>:	ldp	x29, x30, [sp], #800x0000000000244a94 <+276>:	ret
End of assembler dump.

@am11
am11 marked this pull request as ready for review April 22, 2023 13:07
@am11
am11 requested a review from jkotasApril 22, 2023 14:36
@jkotas

Copy link
Copy Markdown
Member

Compressed symbols option shaves ~9+ MB off of .dbg file with api

This is less that what I was expecting. I was expecting that this will be as effective as running gzip on the .dbg file. Here are the numbers that I am seeing on .NET 8 P3 with dotnet new api -aot:

  • .dbg: 37,794,320 bytes
  • .dbg w/ -gz: 25,524,832 bytes
  • gzip .dbg: 6,378,687 bytes

Why is the -gz option leaving so much on the table?

@MichalPetryka

Copy link
Copy Markdown
Contributor

Why is the -gz option leaving so much on the table?

Maybe it uses the lowest possible compression level? Could you compare that?

@am11

am11 commented Apr 22, 2023

Copy link
Copy Markdown
MemberAuthor

Why is the -gz option leaving so much on the table?

Clang's -gz=zlib or llvm-objcopy's --compress-debug-sections=zlib only compress sections, they do not compress the whole file. Also, we do not have control over which compression level is selected.

gzip .dbg: 6,378,687 bytes

Both debuggers, lldb and gdb, are unable to load this file.

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor

@jkotas, should we take this in 8.0?

@jkotasjkotas closed this Jul 25, 2023
@jkotasjkotas reopened this Jul 25, 2023

@jkotasjkotas left a comment

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.

@jkotas, should we take this in 8.0?

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

It may have some interactions with #89358

@am11

am11 commented Jul 25, 2023

Copy link
Copy Markdown
MemberAuthor
 Found 0 warnings and errors
Found 0 warnings and errors, expected between 11000 and 13000

😮

Not sure if we can attribute it to compression, it's a test bug or bug in dwarfdump tool? Will try to run it locally tonight.

@agocke

Copy link
Copy Markdown
Member

My suspicion is a problem with dwarfdump, but it would need investigation.

@MichalStrehovsky

Copy link
Copy Markdown
Member

Sounds reasonable to me. @agocke@MichalStrehovsky Do you have an opinion?

Sounds reasonable to me too. I had a look at why we're not getting a great compression and it looks like strings don't get compressed at all.

If dwarfdump doesn't understand these, we could opt the test out of compression.

Comment threadsrc/tests/nativeaot/SmokeTests/DwarfDump/Program.cs Outdated
@am11

am11 commented Jul 26, 2023

Copy link
Copy Markdown
MemberAuthor

With llvm-dwarfdump-16 installed from Ubuntu packages, test passed. However, the llvm-dwardump (also v16) we are packaging in SuperFileCheck assets was built without zlib support, so we get these errors:

error: failed to decompress '.debug_abbrev', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_info', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_aranges', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loc', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_loclists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_str_offsets', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_addr', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_line_str', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time
error: failed to decompress '.debug_rnglists', LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at build time

that's why the line count on stdout was zero. We can add the zlib enabled llvm-dwarfdump in SuperFileCheck to fix it and temporarily disable this test until the update is flown.

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@am11am11 closed this Aug 2, 2023
@am11am11 reopened this Aug 2, 2023
@am11

am11 commented Aug 2, 2023

Copy link
Copy Markdown
MemberAuthor

llvm with zlib was picked up today. NativeAOT legs are passing now.

@jkotas
jkotas merged commit 30db24b into dotnet:mainAug 2, 2023
@jkotas

Copy link
Copy Markdown
Member

Thank you!

@ghostghost locked as resolved and limited conversation to collaborators Sep 2, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-NativeAOT-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support compressed symbols for Native AOT on Linux

5 participants

@am11@jkotas@MichalPetryka@agocke@MichalStrehovsky