## Show that when "DATA" is used with an address, it forces the found location
## to be symbolized as data, including the source information.
# RUN: yaml2obj %s -o %t.so
# RUN: llvm-symbolizer 'DATA 0x304d0' 'DATA 0x304d1' 'DATA 0x304d3' \
# RUN: 'DATA 0x304c0' 'DATA 0x304c8' 'DATA 0x304d4' 'DATA 0x304dc' \
# RUN: 'DATA 0x304d8' --obj=%t.so | FileCheck %s
# CHECK: bss_global
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:1
# CHECK-EMPTY:
## Check that lookups in the middle of the symbol are also resolved correctly.
# CHECK: bss_global
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:1
# CHECK-EMPTY:
# CHECK: bss_global
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:1
# CHECK-EMPTY:
## Now, the remainder of the symbols.
# CHECK-NEXT: data_global
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:2
# CHECK-EMPTY:
# CHECK-NEXT: str
# CHECK-NEXT: {{[0-9]+}} 8
# CHECK-NEXT: /tmp/file.cpp:4
# CHECK-EMPTY:
# CHECK-NEXT: f()::function_global
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:8
# CHECK-EMPTY:
## Including the one that includes an addend.
# CHECK-NEXT: alpha
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:12
# CHECK-EMPTY:
# CHECK-NEXT: beta
# CHECK-NEXT: {{[0-9]+}} 4
# CHECK-NEXT: /tmp/file.cpp:13
# CHECK-EMPTY:
## Ensure there's still a global that's offset-based.
# RUN: llvm-dwarfdump --debug-info %t.so | FileCheck %s --check-prefix=OFFSET
# OFFSET: DW_AT_location (DW_OP_addrx 0x4, DW_OP_plus_uconst 0x4)
################################################################################
## File below was generated using:
##
## $ clang++ -g -O3 /tmp/file.cpp -shared -fuse-ld=lld -nostdlib \
## -target aarch64-linux-gnuabi -mllvm -global-merge-ignore-single-use \
## -o /tmp/file.so
##
## With /tmp/file.cpp as:
## 1: int bss_global;
## 2: int data_global = 2;
## 3:
## 4: const char* str =
## 5: "12345678";
## 6:
## 7: int* f() {
## 8: static int function_global;
## 9: return &function_global;
## 10: }
## 11:
## 12: static int alpha;
## 13: static int beta;
## 14: int *f(bool b) { return beta ? &alpha : β }
## 15:
##
## ... then, one can get the offsets using `nm`, like:
## $ nm out.so | grep bss_global
## 00000000000038fc B bss_global
##
## Note the use of the aarch64 target (with -nostdlib in order to allow linkage
## without libraries for cross-compilation) as well as -O3 and
## -global-merge-ignore-single-use. This is a specific combination that makes
## the compiler emit the `alpha` global variable with a more complex
## DW_AT_location than just a DW_OP_addr/DW_OP_addrx. In this instance, it
## outputs a `DW_AT_location (DW_OP_addrx 0x4, DW_OP_plus_uconst 0x4)`.
##
## Ideally, this would be tested by invoking clang directly on a C source file,
## but unfortunately there's no way to do that for LLVM tests. The other option
## is to compile IR to an objfile, but llvm-symbolizer doesn't understand that
## two symbols can have the same address in different sections. In the code
## above, for example, we'd have bss_global at .bss+0x0, and data_global at
## .data+0x0, and so the symbolizer would only print one of them. Hence, we have
## the ugly dso-to-yaml blob below.
##
## For now, constant strings don't have a debuginfo entry, and so can't be
## symbolized correctly. In future (if D123534 gets merged), this can be updated
## to include a check that llvm-symbolizer can also symbolize constant strings,
## like `str` above (basically that &"12345678" should be symbolizable)
## to the specific line. Then, you can find the address of the constant string
## from the relocation:
##
## $ nm out.so | grep str
## 00000000000038c0 D str
## $ llvm-objdump -R out.so | grep 38c0
## 00000000000038c0 R_X86_64_RELATIVE *ABS*+0x4f8 # <-- 0x4f8
################################################################################
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_AARCH64
ProgramHeaders:
- Type: PT_PHDR
Flags: [ PF_R ]
VAddr: 0x40
Align: 0x8
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .dynsym
LastSec: .eh_frame
Align: 0x10000
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .text
LastSec: .text
VAddr: 0x103E4
Align: 0x10000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x20410
Align: 0x10000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .data
LastSec: .bss
VAddr: 0x304C0
Align: 0x10000
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x20410
Align: 0x8
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x20410
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x37C
Align: 0x4
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x0
Sections:
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x238
Link: .dynstr
AddressAlign: 0x8
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2C8
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x1
Shift2: 0x1A
BloomFilter: [ 0x400188002180000C ]
HashBuckets: [ 0x1 ]
HashValues: [ 0xEE8502A, 0xEE85016, 0xC033991C, 0x61F7372E, 0xB88AB7F ]
- Name: .hash
Type: SHT_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F8
Link: .dynsym
AddressAlign: 0x4
Bucket: [ 5, 0, 4, 0, 3, 0 ]
Chain: [ 0, 0, 0, 1, 2, 0 ]
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x330
AddressAlign: 0x1
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x358
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x304C8
Type: R_AARCH64_RELATIVE
Addend: 880
- Name: .rodata
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
Address: 0x370
AddressAlign: 0x1
EntSize: 0x1
Content: '313233343536373800'
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x37C
AddressAlign: 0x4
Content: 011B033B18000000020000006800010034000000740001004C000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x398
AddressAlign: 0x8
Content: 1400000000000000017A5200017C1E011B0C1F0000000000140000001C0000002C0001000C00000000000000000000001400000034000000200001001C000000000000000000000000000000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x103E4
AddressAlign: 0x4
Content: 0001009000501391C0035FD60801009008611391E90308AA2A4540B85F0100710001899AC0035FD6
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x20410
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_RELA
Value: 0x358
- Tag: DT_RELASZ
Value: 0x18
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_RELACOUNT
Value: 0x1
- Tag: DT_SYMTAB
Value: 0x238
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_STRTAB
Value: 0x330
- Tag: DT_STRSZ
Value: 0x28
- Tag: DT_GNU_HASH
Value: 0x2C8
- Tag: DT_HASH
Value: 0x2F8
- Tag: DT_NULL
Value: 0x0
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x304C0
AddressAlign: 0x8
Content: '02000000000000000000000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x304D0
AddressAlign: 0x4
Size: 0x10
- Name: .debug_abbrev
Type: SHT_PROGBITS
AddressAlign: 0x1
Content: 011101252513050325721710171B25111B120673170000023400032549133F193A0B3B0B0218000003240003253E0B0B0B0000040F004913000005260049130000062E01111B120640187A196E2503253A0B3B0B49133F190000073400032549133A0B3B0B02180000083400032549133A0B3B0B02186E25000009050003253A0B3B0B4913000000
- Name: .debug_info
Type: SHT_PROGBITS
AddressAlign: 0x1
Content: AB0000000500010800000000010021000108000000000000000205280000000800000002032E000000000102A1000304050402052E000000000202A101020648000000000402A102044D00000005520000000307080106050C000000016F0D0E0007A500000007082E000000000802A1030008092E000000000D02A1040A080B2E000000000C04A10423040C06061C000000016F0F0E000EA50000000910000EAA00000000042E0000000311020100
- Name: .debug_str_offsets
Type: SHT_PROGBITS
AddressAlign: 0x1
Content: 4C00000005000000A2000000000000002C00000059000000280000001C00000072000000640000008C0000008700000069000000140000007B0000009C0000001A0000000E0000008500000076000000
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4C696E6B65723A204C4C442031352E302E300000636C616E672076657273696F6E2031352E302E30202868747470733A2F2F6769746875622E636F6D2F6C6C766D2F6C6C766D2D70726F6A6563742E67697420306462616566363162353666306566306162306366333865613932666663316633356265653366662900
- Name: .debug_line
Type: SHT_PROGBITS
AddressAlign: 0x1
Content: 620000000500080037000000010101FB0E0D00010101010000000100000101011F010E00000003011F020F051E0100000000006C97BBE59F7DC6A9EA956633431DA63E0400000902E4030100000000001805030A140500BF05190A0105120608740204000101
- Name: .debug_line_str
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 2F746D702F66696C652E637070002F7573722F6C6F63616C2F676F6F676C652F686F6D652F6D69746368702F6C6C766D2D6275696C642F6F707400
Symbols:
- Name: file.cpp
Type: STT_FILE
Index: SHN_ABS
- Name: '$x.0'
Section: .text
Value: 0x103E4
- Name: _ZZ1fvE15function_global
Type: STT_OBJECT
Section: .bss
Value: 0x304D4
Size: 0x4
- Name: '$d.1'
Section: .bss
Value: 0x304D0
- Name: '$d.2'
Section: .data
Value: 0x304C0
- Name: '$d.3'
Section: .rodata
Value: 0x370
- Name: '$d.4'
Section: .debug_abbrev
- Name: '$d.5'
Section: .debug_info
- Name: '$d.6'
Section: .debug_str_offsets
- Name: '$d.7'
Section: .debug_str
Value: 0xA2
- Name: '$d.8'
Section: .debug_addr
- Name: _ZL4beta
Type: STT_OBJECT
Section: .bss
Value: 0x304D8
Size: 0x4
- Name: _ZL5alpha
Type: STT_OBJECT
Section: .bss
Value: 0x304DC
Size: 0x4
- Name: '$d.9'
Section: .comment
Value: 0x13
- Name: '$d.10'
Section: .eh_frame
Value: 0x398
- Name: '$d.11'
Section: .debug_line
- Name: '$d.12'
Section: .debug_line_str
Value: 0xE
- Name: _DYNAMIC
Section: .dynamic
Value: 0x20410
Other: [ STV_HIDDEN ]
- Name: _Z1fv
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x103E4
Size: 0xC
- Name: _Z1fb
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x103F0
Size: 0x1C
- Name: bss_global
Type: STT_OBJECT
Section: .bss
Binding: STB_GLOBAL
Value: 0x304D0
Size: 0x4
- Name: data_global
Type: STT_OBJECT
Section: .data
Binding: STB_GLOBAL
Value: 0x304C0
Size: 0x4
- Name: str
Type: STT_OBJECT
Section: .data
Binding: STB_GLOBAL
Value: 0x304C8
Size: 0x8
DynamicSymbols:
- Name: _Z1fv
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x103E4
Size: 0xC
- Name: _Z1fb
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x103F0
Size: 0x1C
- Name: bss_global
Type: STT_OBJECT
Section: .bss
Binding: STB_GLOBAL
Value: 0x304D0
Size: 0x4
- Name: data_global
Type: STT_OBJECT
Section: .data
Binding: STB_GLOBAL
Value: 0x304C0
Size: 0x4
- Name: str
Type: STT_OBJECT
Section: .data
Binding: STB_GLOBAL
Value: 0x304C8
Size: 0x8
DWARF:
debug_str:
- '/tmp/file.cpp'
- _Z1fb
- alpha
- f
- data_global
- int
- '/usr/local/google/home/mitchp/llvm-build/opt'
- bss_global
- char
- _ZL4beta
- str
- bool
- _ZL5alpha
- b
- beta
- function_global
- _Z1fv
- 'clang version 15.0.0 (https://github.com/llvm/llvm-project.git 0dbaef61b56f0ef0ab0cf38ea92ffc1f35bee3ff)'
debug_addr:
- Length: 0x3C
Version: 0x5
AddressSize: 0x8
Entries:
- Address: 0x304D0
- Address: 0x304C0
- Address: 0x304C8
- Address: 0x304D4
- Address: 0x304D8
- Address: 0x103E4
- Address: 0x103F0
...