diff --git a/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml b/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml --- a/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml +++ b/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml @@ -1,87 +1,103 @@ ## Test that in the presence of SHT_LLVM_BB_ADDR_MAP sections, ## --symbolize-operands can display labels. -# RUN: yaml2obj --docnum=1 %s -o %t1 +## Executable object file. +# RUN: yaml2obj --docnum=1 -DTYPE=ET_EXEC -DFOO_ADDR=0x4000 -DBAR_ADDR=0x5000 %s -o %t1 # RUN: llvm-objdump %t1 -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \ -# RUN: FileCheck %s --match-full-lines --check-prefix=INTEL +# RUN: FileCheck %s -DSYM=symbol --match-full-lines --check-prefixes=INTEL # RUN: llvm-objdump %t1 -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \ -# RUN: FileCheck %s --match-full-lines --check-prefix=ATT +# RUN: FileCheck %s -DSYM=symbol --match-full-lines --check-prefixes=ATT -# RUN: yaml2obj --docnum=2 %s -o %t2 +## Relocatable object file. +# RUN: yaml2obj --docnum=1 -DTYPE=ET_REL -DFOO_ADDR=0x0 -DBAR_ADDR=0x0 %s -o %t2 # RUN: llvm-objdump %t2 -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \ -# RUN: FileCheck %s --match-full-lines --check-prefixes=INTEL,INTEL-MULTISECTION +# RUN: FileCheck %s -DSYM=foo+0x200c --match-full-lines --check-prefix=INTEL # RUN: llvm-objdump %t2 -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \ -# RUN: FileCheck %s --match-full-lines --check-prefixes=ATT,ATT-MULTISECTION +# RUN: FileCheck %s -DSYM=foo+0x200c --match-full-lines --check-prefix=ATT + +## Executable object file with a single SHT_LLVM_BB_ADDR_MAP for multiple text sections. +# RUN: yaml2obj --docnum=2 %s -o %t3 +# RUN: llvm-objdump %t3 -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \ +# RUN: FileCheck %s -DSYM=symbol --match-full-lines --check-prefixes=INTEL +# RUN: llvm-objdump %t3 -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \ +# RUN: FileCheck %s -DSYM=symbol --match-full-lines --check-prefixes=ATT ## Expect to find the branch and basic block labels and global variable name. # ATT: : # ATT-NEXT: : # ATT-NEXT: pushq %rax # ATT-NEXT: : -# ATT-NEXT: cmpl , %eax +# ATT-NEXT: cmpl , %eax <[[SYM]]> # ATT-NEXT: nop # ATT-NEXT: : # ATT-NEXT: jge # ATT-NEXT: jmp # ATT-NEXT: : # ATT-NEXT: retq -# ATT-MULTISECTION: : -# ATT-MULTISECTION-NEXT: : -# ATT-MULTISECTION-NEXT: pushq %rax -# ATT-MULTISECTION-NEXT: movl %edx, %eax -# ATT-MULTISECTION-NEXT: je -# ATT-MULTISECTION-NEXT: : -# ATT-MULTISECTION-NEXT: xorl %esi, %esi -# ATT-MULTISECTION-NEXT: : -# ATT-MULTISECTION-NEXT: callq -# ATT-MULTISECTION-NEXT: retq +# ATT: : +# ATT-NEXT: : +# ATT-NEXT: pushq %rax +# ATT-NEXT: movl %edx, %eax +# ATT-NEXT: je +# ATT-NEXT: : +# ATT-NEXT: xorl %esi, %esi +# ATT-NEXT: : +# ATT-NEXT: callq +# ATT-NEXT: retq # INTEL: : # INTEL-NEXT: : # INTEL-NEXT: push rax # INTEL-NEXT: : -# INTEL-NEXT: cmp eax, dword ptr +# INTEL-NEXT: cmp eax, dword ptr <[[SYM]]> # INTEL-NEXT: nop # INTEL-NEXT: : # INTEL-NEXT: jge # INTEL-NEXT: jmp # INTEL-NEXT: : # INTEL-NEXT: ret -# INTEL-MULTISECTION: : -# INTEL-MULTISECTION-NEXT: : -# INTEL-MULTISECTION-NEXT: push rax -# INTEL-MULTISECTION-NEXT: mov eax, edx -# INTEL-MULTISECTION-NEXT: je -# INTEL-MULTISECTION-NEXT: : -# INTEL-MULTISECTION-NEXT: xor esi, esi -# INTEL-MULTISECTION-NEXT: : -# INTEL-MULTISECTION-NEXT: call -# INTEL-MULTISECTION-NEXT: ret +# INTEL: : +# INTEL-NEXT: : +# INTEL-NEXT: push rax +# INTEL-NEXT: mov eax, edx +# INTEL-NEXT: je +# INTEL-NEXT: : +# INTEL-NEXT: xor esi, esi +# INTEL-NEXT: : +# INTEL-NEXT: call +# INTEL-NEXT: ret -## This object file contains a text section, a SHT_LLVM_BB_ADDR_MAP section -## linked to it, and a data section. +## This object file contains a separate text section and SHT_LLVM_BB_ADDR_MAP +## section for each of the two functions foo and bar. +## This is used to test --symbolize-operands on reloctable and non-relocotable +## object files. --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB - Type: ET_EXEC + Type: [[TYPE]] Machine: EM_X86_64 Sections: - - Name: .text + - Name: .text.foo Type: SHT_PROGBITS - Address: 0x4000 + Address: [[FOO_ADDR]] + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Content: '503b0505200000907d02ebf5c3' + - Name: .text.bar + Type: SHT_PROGBITS + Address: [[BAR_ADDR]] Flags: [SHF_ALLOC, SHF_EXECINSTR] - Content: '503b0505100000907d02ebf5c3' + Content: '5089d0740231f6e8f4ffffffc3' - Name: .data Type: SHT_PROGBITS Flags: [SHF_ALLOC, SHF_WRITE] - Address: 0x5000 - - Name: bb_addr_map_1 + Address: 0x6000 + - Name: .llvm_bb_addr_map.foo Type: SHT_LLVM_BB_ADDR_MAP - Link: .text + Link: .text.foo Entries: - Version: 1 - Address: 0x4000 + Address: [[FOO_ADDR]] BBEntries: - AddressOffset: 0x0 Size: 0x1 @@ -95,17 +111,36 @@ - AddressOffset: 0x0 Size: 0x1 Metadata: 0x2 + - Name: .llvm_bb_addr_map.bar + Type: SHT_LLVM_BB_ADDR_MAP + Link: .text.bar + Entries: + - Version: 1 + Address: [[BAR_ADDR]] + BBEntries: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 + - AddressOffset: 0x4 + Size: 0x2 + Metadata: 0x0 + - AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 + Symbols: - Name: foo - Section: .text - Value: 0x4000 + Section: .text.foo + Value: [[FOO_ADDR]] + - Name: bar + Section: .text.bar + Value: [[BAR_ADDR]] - Name: symbol Section: .data - Value: 0x500c + Value: 0x600c -## This object file contains a separate text section and SHT_LLVM_BB_ADDR_MAP -## section for each of the two functions foo and bar. foo's section contents -## are identical to the ones above. +## This object file contains a single SHT_LLVM_BB_ADDR_MAP for two text +## sections .text.foo and .text.bar. --- !ELF FileHeader: Class: ELFCLASS64 @@ -127,7 +162,7 @@ Type: SHT_PROGBITS Flags: [SHF_ALLOC, SHF_WRITE] Address: 0x6000 - - Name: bb_addr_map.foo + - Name: .llvm_bb_addr_map.foo Type: SHT_LLVM_BB_ADDR_MAP Link: .text.foo Entries: @@ -146,10 +181,6 @@ - AddressOffset: 0x0 Size: 0x1 Metadata: 0x2 - - Name: bb_addr_map.bar - Type: SHT_LLVM_BB_ADDR_MAP - Link: .text.bar - Entries: - Version: 1 Address: 0x5000 BBEntries: diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1278,6 +1278,25 @@ LLVM_DEBUG(LVP.dump()); + std::unordered_map AddrToBBAddrMap; + auto ReadBBAddrMap = [&](Optional SectionIndex = None) { + AddrToBBAddrMap.clear(); + if (const auto *Elf = dyn_cast(&Obj)) { + auto BBAddrMapsOrErr = Elf->readBBAddrMap(SectionIndex); + if (!BBAddrMapsOrErr) + reportWarning(toString(BBAddrMapsOrErr.takeError()), + Obj.getFileName()); + for (auto &FunctionBBAddrMap : *BBAddrMapsOrErr) + AddrToBBAddrMap.emplace(FunctionBBAddrMap.Addr, + std::move(FunctionBBAddrMap)); + } + }; + + // For non-relocatable objects, Read all LLVM_BB_ADDR_MAP sections into a + // single mapping, since they don't have any conflicts. + if (SymbolizeOperands && !Obj.isRelocatableObject()) + ReadBBAddrMap(); + for (const SectionRef &Section : ToolSectionFilter(Obj)) { if (FilterSections.empty() && !DisassembleAll && (!Section.isText() || Section.isVirtual())) @@ -1288,19 +1307,10 @@ if (!SectSize) continue; - std::unordered_map AddrToBBAddrMap; - if (SymbolizeOperands) { - if (auto *Elf = dyn_cast(&Obj)) { - // Read the BB-address-map corresponding to this section, if present. - auto SectionBBAddrMapsOrErr = Elf->readBBAddrMap(Section.getIndex()); - if (!SectionBBAddrMapsOrErr) - reportWarning(toString(SectionBBAddrMapsOrErr.takeError()), - Obj.getFileName()); - for (auto &FunctionBBAddrMap : *SectionBBAddrMapsOrErr) - AddrToBBAddrMap.emplace(FunctionBBAddrMap.Addr, - std::move(FunctionBBAddrMap)); - } - } + // For relocatable object files, read the LLVM_BB_ADDR_MAP section + // corresponding to this section, if present. + if (SymbolizeOperands && Obj.isRelocatableObject()) + ReadBBAddrMap(Section.getIndex()); // Get the list of all the symbols in this section. SectionSymbolsTy &Symbols = AllSymbols[Section];