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,126 +1,84 @@ ## 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 -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 -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 ## 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 - -## This object file contains a text section, a SHT_LLVM_BB_ADDR_MAP section -## linked to it, and a data section. ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC - Machine: EM_X86_64 -Sections: - - Name: .text - Type: SHT_PROGBITS - Address: 0x4000 - Flags: [SHF_ALLOC, SHF_EXECINSTR] - Content: '503b0505100000907d02ebf5c3' - - Name: .data - Type: SHT_PROGBITS - Flags: [SHF_ALLOC, SHF_WRITE] - Address: 0x5000 - - Name: bb_addr_map_1 - Type: SHT_LLVM_BB_ADDR_MAP - Link: .text - Entries: - - Version: 1 - Address: 0x4000 - BBEntries: - - AddressOffset: 0x0 - Size: 0x1 - Metadata: 0x1 - - AddressOffset: 0x0 - Size: 0x6 - Metadata: 0x0 - - AddressOffset: 0x1 - Size: 0x4 - Metadata: 0x0 - - AddressOffset: 0x0 - Size: 0x1 - Metadata: 0x2 -Symbols: - - Name: foo - Section: .text - Value: 0x4000 - - Name: symbol - Section: .data - Value: 0x500c +# 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 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. +## 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.foo Type: SHT_PROGBITS - Address: 0x4000 + Address: [[FOO_ADDR]] Flags: [SHF_ALLOC, SHF_EXECINSTR] Content: '503b0505200000907d02ebf5c3' - Name: .text.bar Type: SHT_PROGBITS - Address: 0x5000 + Address: [[BAR_ADDR]] Flags: [SHF_ALLOC, SHF_EXECINSTR] Content: '5089d0740231f6e8f4ffffffc3' - Name: .data @@ -132,7 +90,7 @@ Link: .text.foo Entries: - Version: 1 - Address: 0x4000 + Address: [[FOO_ADDR]] BBEntries: - AddressOffset: 0x0 Size: 0x1 @@ -151,7 +109,7 @@ Link: .text.bar Entries: - Version: 1 - Address: 0x5000 + Address: [[BAR_ADDR]] BBEntries: - AddressOffset: 0x0 Size: 0x1 @@ -166,10 +124,10 @@ Symbols: - Name: foo Section: .text.foo - Value: 0x4000 + Value: [[FOO_ADDR]] - Name: bar Section: .text.bar - Value: 0x5000 + Value: [[BAR_ADDR]] - Name: symbol Section: .data Value: 0x600c 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,26 @@ 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 +1308,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];