diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-07-09 18:11:40 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-09 18:11:40 +0000 |
commit | 2603a8fa243e6e3db4550395a4183ec59f12edfd (patch) | |
tree | 3bf01e6b7318fc2d48bec97041fb227af2f5d68b /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 0f7f8d41f7a3f7c78634a5c93e52f2369225068e (diff) | |
download | bcm5719-llvm-2603a8fa243e6e3db4550395a4183ec59f12edfd.tar.gz bcm5719-llvm-2603a8fa243e6e3db4550395a4183ec59f12edfd.zip |
[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.
llvm-svn: 241830
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index c61bd98e9eb..8d906daecc0 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -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() << '>'; } } |