diff --git a/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test b/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test new file mode 100644 index 000000000000..cbb77884f0c3 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test @@ -0,0 +1,39 @@ +## This test shows that llvm-objdump can handle sections with the same address +## when symbols in those sections are referenced. In the past, the section +## picked was non-deterministic, resulting in different symbols being found for +## the section. The test uses YAML for the input, as we need a fully linked ELF +## to reproduce the original failure. + +# RUN: yaml2obj %s -o %t1 -D SECTION=.second +# RUN: llvm-objdump -d %t1 | FileCheck %s +# RUN: yaml2obj %s -o %t2 -D SECTION=.first +## FIXME: this case should print "" too. +# RUN: llvm-objdump -d %t2 | FileCheck %s --check-prefix=FAIL + +# CHECK: callq 0x5 +# FAIL: callq 0x5{{$}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .caller + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 0x0 + Content: e800000000 # Call instruction to next address. + - Name: .first + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 0x5 + - Name: .second + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 0x5 +Symbols: + - Name: target + Section: [[SECTION]] + Value: 0x5 diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 06a4978a0736..2f9c6f13ed19 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1249,7 +1249,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, std::vector> SectionAddresses; for (SectionRef Sec : Obj->sections()) SectionAddresses.emplace_back(Sec.getAddress(), Sec); - stable_sort(SectionAddresses); + llvm::stable_sort(SectionAddresses, llvm::less_first()); // Linked executables (.exe and .dll files) typically don't include a real // symbol table but they might contain an export table.