|
@@ -1141,33 +1141,23 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
|
|
|
std::vector<RelocationRef>::const_iterator RelEnd = Rels.end();
|
|
|
// Disassemble symbol by symbol.
|
|
|
for (unsigned SI = 0, SE = Symbols.size(); SI != SE; ++SI) {
|
|
|
- uint64_t Start = std::get<0>(Symbols[SI]) - SectionAddr;
|
|
|
- // The end is either the section end or the beginning of the next
|
|
|
- // symbol.
|
|
|
- uint64_t End = (SI == SE - 1)
|
|
|
- ? SectSize
|
|
|
- : std::get<0>(Symbols[SI + 1]) - SectionAddr;
|
|
|
- // Don't try to disassemble beyond the end of section contents.
|
|
|
- if (End > SectSize)
|
|
|
- End = SectSize;
|
|
|
- // If this symbol has the same address as the next symbol, then skip it.
|
|
|
- if (Start >= End)
|
|
|
- continue;
|
|
|
-
|
|
|
- // Check if we need to skip symbol
|
|
|
- // Skip if the symbol's data is not between StartAddress and StopAddress
|
|
|
- if (End + SectionAddr <= StartAddress ||
|
|
|
- Start + SectionAddr >= StopAddress)
|
|
|
+ // Skip if --disassemble-functions is not empty and the symbol is not in
|
|
|
+ // the list.
|
|
|
+ if (!DisasmFuncsSet.empty() &&
|
|
|
+ !DisasmFuncsSet.count(std::get<1>(Symbols[SI])))
|
|
|
continue;
|
|
|
|
|
|
- // Stop disassembly at the stop address specified
|
|
|
- if (End + SectionAddr > StopAddress)
|
|
|
- End = StopAddress - SectionAddr;
|
|
|
+ uint64_t Start = std::get<0>(Symbols[SI]);
|
|
|
|
|
|
- /// Skip if user requested specific symbols and this is not in the list
|
|
|
- if (!DisasmFuncsSet.empty() &&
|
|
|
- !DisasmFuncsSet.count(std::get<1>(Symbols[SI])))
|
|
|
+ // The end is the section end, the beginning of the next symbol, or
|
|
|
+ // --stop-address.
|
|
|
+ uint64_t End = std::min<uint64_t>(SectionAddr + SectSize, StopAddress);
|
|
|
+ if (SI + 1 < SE)
|
|
|
+ End = std::min(End, std::get<0>(Symbols[SI + 1]));
|
|
|
+ if (Start >= End || Start >= StopAddress || End <= StartAddress)
|
|
|
continue;
|
|
|
+ Start -= SectionAddr;
|
|
|
+ End -= SectionAddr;
|
|
|
|
|
|
if (!PrintedSection) {
|
|
|
PrintedSection = true;
|