mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-18 10:24:45 +00:00
[llvm-objdump] Require that jump targets shown in -d are functions
Don't let the disassembler pick call <.text> if a function happens to live at the start of the section by only using function symbols. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241830 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -817,6 +817,9 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
std::vector<std::pair<uint64_t, StringRef>> AllSymbols;
|
||||
if (MIA) {
|
||||
for (const SymbolRef &Symbol : Obj->symbols()) {
|
||||
if (Symbol.getType() != SymbolRef::ST_Function)
|
||||
continue;
|
||||
|
||||
ErrorOr<uint64_t> AddressOrErr = Symbol.getAddress();
|
||||
if (error(AddressOrErr.getError()))
|
||||
break;
|
||||
@@ -937,17 +940,25 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
SectionAddr + Index, outs(), "", *STI);
|
||||
outs() << CommentStream.str();
|
||||
Comments.clear();
|
||||
if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst))) {
|
||||
if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst) ||
|
||||
MIA->isConditionalBranch(Inst))) {
|
||||
uint64_t Target;
|
||||
if (MIA->evaluateBranch(Inst, SectionAddr + Index, Size, Target)) {
|
||||
const auto &TargetSym =
|
||||
std::lower_bound(AllSymbols.begin(), AllSymbols.end(),
|
||||
std::make_pair(Target, StringRef()));
|
||||
auto TargetSym = std::upper_bound(
|
||||
AllSymbols.begin(), AllSymbols.end(), Target,
|
||||
[](uint64_t LHS, std::pair<uint64_t, StringRef> &RHS) {
|
||||
return LHS < RHS.first;
|
||||
});
|
||||
if (TargetSym != AllSymbols.begin())
|
||||
--TargetSym;
|
||||
else
|
||||
TargetSym = AllSymbols.end();
|
||||
|
||||
if (TargetSym != AllSymbols.end()) {
|
||||
outs() << " <" << TargetSym->second;
|
||||
uint64_t Disp = TargetSym->first - Target;
|
||||
uint64_t Disp = Target - TargetSym->first;
|
||||
if (Disp)
|
||||
outs() << '-' << Disp;
|
||||
outs() << '+' << utohexstr(Disp);
|
||||
outs() << '>';
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user