kallsyms: ignore local block labels generated by compiler
PATCH 1/1 kallsyms: ignore local block labels generated by compiler
The llvm compiler can generate lots of local block labels and they might overlap with C defined symbols. So let's ignore such local labels.
Before this change, dumpstack shows a local symbol for epc:
[ 0.040341][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.040376][ T0] epc : .LBB6_14+0x22/0x6a [ 0.040452][ T0] ra : restore_all+0x12/0x6e
After this change, the C defined symbol is shown which is expected:
[ 0.035795][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.036332][ T0] epc : trace_hardirqs_on+0x54/0x13c [ 0.036567][ T0] ra : restore_all+0x12/0x6e
--- scripts/kallsyms.c | 1 + 1 file changed, 1 insertion(+)
scripts/kallsyms.c +1 -0
@@ -108,6 +108,7 @@ static bool is_ignored_symbol(const char *name, char type)/* Symbol names that begin with the following are ignored.*/ static const char *const ignored_prefixes[] = {"$" ,/* local symbols for ARM, MIPS, etc. */ +".LBB" ,/* local block labels generated by compiler */ ".LASANPC" ,/* s390 kasan local symbols */ "__crc_" ,/* modversions */ "__efistub_" ,/* arm64 EFI stub namespace */
Signature · 1 line
2.32.0
Quoted 23 lines · Changbin Du
The llvm compiler can generate lots of local block labels and they might overlap with C defined symbols. So let's ignore such local labels.
Before this change, dumpstack shows a local symbol for epc:
[ 0.040341][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.040376][ T0] epc : .LBB6_14+0x22/0x6a [ 0.040452][ T0] ra : restore_all+0x12/0x6eAfter this change, the C defined symbol is shown which is expected:
[ 0.035795][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.036332][ T0] epc : trace_hardirqs_on+0x54/0x13c [ 0.036567][ T0] ra : restore_all+0x12/0x6eSigned-off-by Changbin Du <[email protected]>--- scripts/kallsyms.c | 1 + 1 file changed, 1 insertion(+)scripts/kallsyms.c +0
-0
scripts/kallsyms.c static bool is_ignored_symbol(const char *name, char type) · line 111
Quoted 4 lines
scripts/kallsyms.c +1
-0@@ -108,6 +108,7 @@ static bool is_ignored_symbol(const char *name, char type)/* Symbol names that begin with the following are ignored.*/ static const char *const ignored_prefixes[] = {"$" ,/* local symbols for ARM, MIPS, etc. */ +".LBB" ,/* local block labels generated by compiler */
I aslo found many symbols like '.Ltmpxxx', '.L__unnamed_xx'. So should we just ignore all symbols prefixed by '.L'?
Quoted 6 lines
scripts/kallsyms.c +0
-0".LASANPC" ,/* s390 kasan local symbols */ "__crc_" ,/* modversions */ "__efistub_", /* arm64 EFI stub namespace */Signature · 1 line
2.32.0
Signature · 2 lines
Cheers, Changbin Du
Quoted 20 lines · Changbin Du
Quoted 18 lines · Changbin Du
The llvm compiler can generate lots of local block labels and they might overlap with C defined symbols. So let's ignore such local labels.
Before this change, dumpstack shows a local symbol for epc:
[ 0.040341][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.040376][ T0] epc : .LBB6_14+0x22/0x6a [ 0.040452][ T0] ra : restore_all+0x12/0x6eAfter this change, the C defined symbol is shown which is expected:
[ 0.035795][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.036332][ T0] epc : trace_hardirqs_on+0x54/0x13c [ 0.036567][ T0] ra : restore_all+0x12/0x6eSigned-off-by Changbin Du <[email protected]>--- scripts/kallsyms.c | 1 + 1 file changed, 1 insertion(+)
Quoted 11 lines
scripts/kallsyms.c static bool is_ignored_symbol(const char *name, char type) · line 111
Quoted 9 lines
scripts/kallsyms.c +1
-0@@ -108,6 +108,7 @@ static bool is_ignored_symbol(const char *name, char type)/* Symbol names that begin with the following are ignored.*/ static const char *const ignored_prefixes[] = {"$" ,/* local symbols for ARM, MIPS, etc. */ +".LBB" ,/* local block labels generated by compiler */ I aslo found many symbols like '.Ltmpxxx', '.L__unnamed_xx'. So should we just ignore all symbols prefixed by '.L'?
.L prefixes are "local labels" meaning they don't get an entry in the symbol table. The trade off is that there is no such convention between compiler generated local label naming conventions, vs hand written ones. If we omit all local labels, then it might be surprising that a handwritten local label disappeared from this list. I think though that we should omit all local labels, and if someone needs a label to appear in their dumpstack, then they should simply drop the .L prefix on their handwritten label.
Quoted 11 lines
Quoted 7 lines
scripts/kallsyms.c +0
-1".LASANPC" ,/* s390 kasan local symbols */ "__crc_" ,/* modversions */ "__efistub_", /* arm64 EFI stub namespace */ --2.32.0
--
Cheers,
Changbin Du
Signature · 2 lines
Thanks, ~Nick Desaulniers
Quoted 33 lines · Nick Desaulniers
Quoted 20 lines · Changbin Du
Quoted 18 lines · Changbin Du
The llvm compiler can generate lots of local block labels and they might overlap with C defined symbols. So let's ignore such local labels.
Before this change, dumpstack shows a local symbol for epc:
[ 0.040341][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.040376][ T0] epc : .LBB6_14+0x22/0x6a [ 0.040452][ T0] ra : restore_all+0x12/0x6eAfter this change, the C defined symbol is shown which is expected:
[ 0.035795][ T0] Hardware name: riscv-virtio,qemu (DT) [ 0.036332][ T0] epc : trace_hardirqs_on+0x54/0x13c [ 0.036567][ T0] ra : restore_all+0x12/0x6eSigned-off-by Changbin Du <[email protected]>--- scripts/kallsyms.c | 1 + 1 file changed, 1 insertion(+)Quoted 11 lines
scripts/kallsyms.c static bool is_ignored_symbol(const char *name, char type) · line 111
Quoted 9 lines
scripts/kallsyms.c +1
-0@@ -108,6 +108,7 @@ static bool is_ignored_symbol(const char *name, char type)/* Symbol names that begin with the following are ignored.*/ static const char *const ignored_prefixes[] = {"$" ,/* local symbols for ARM, MIPS, etc. */ +".LBB" ,/* local block labels generated by compiler */ I aslo found many symbols like '.Ltmpxxx', '.L__unnamed_xx'. So should we just ignore all symbols prefixed by '.L'?
Quoted 9 lines
.L prefixes are "local labels" meaning they don't get an entry in the symbol table. The trade off is that there is no such convention between compiler generated local label naming conventions, vs hand written ones. If we omit all local labels, then it might be surprising that a handwritten local label disappeared from this list. I think though that we should omit all local labels, and if someone needs a label to appear in their dumpstack, then they should simply drop the .L prefix on their handwritten label.
Agree. I checked vmlinux for riscv and x86, seeing no handwritten function labels prefixed by '.L'. (just some data definition symbols). It should be safte to simply ignore all these symbols.
Quoted 17 lines
Quoted 11 lines
Quoted 7 lines
scripts/kallsyms.c +0
-1".LASANPC" ,/* s390 kasan local symbols */ "__crc_" ,/* modversions */ "__efistub_", /* arm64 EFI stub namespace */ --2.32.0
--
Cheers,
Changbin DuSignature · 2 lines
Thanks, ~Nick Desaulniers
Signature · 2 lines
Cheers, Changbin Du