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 @@ -1202,11 +1202,13 @@ StringSaver Saver(A); addPltEntries(Obj, AllSymbols, Saver); - // Create a mapping from virtual address to section. + // Create a mapping from virtual address to section. An empty section can + // cause more than one section at the same address. Use a stable sort to + // stabalize the output. std::vector> SectionAddresses; for (SectionRef Sec : Obj->sections()) SectionAddresses.emplace_back(Sec.getAddress(), Sec); - array_pod_sort(SectionAddresses.begin(), SectionAddresses.end()); + stable_sort(SectionAddresses); // Linked executables (.exe and .dll files) typically don't include a real // symbol table but they might contain an export table. @@ -1236,11 +1238,12 @@ } // Sort all the symbols, this allows us to use a simple binary search to find - // a symbol near an address. + // Multiple symbols can have the same address. Use a stable sort to stabalize + // the output. StringSet<> FoundDisasmSymbolSet; for (std::pair &SecSyms : AllSymbols) - array_pod_sort(SecSyms.second.begin(), SecSyms.second.end()); - array_pod_sort(AbsoluteSymbols.begin(), AbsoluteSymbols.end()); + stable_sort(SecSyms.second); + stable_sort(AbsoluteSymbols); for (const SectionRef &Section : ToolSectionFilter(*Obj)) { if (FilterSections.empty() && !DisassembleAll &&