summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-07-09 18:11:40 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-07-09 18:11:40 +0000
commit2603a8fa243e6e3db4550395a4183ec59f12edfd (patch)
tree3bf01e6b7318fc2d48bec97041fb227af2f5d68b /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent0f7f8d41f7a3f7c78634a5c93e52f2369225068e (diff)
downloadbcm5719-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.cpp23
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() << '>';
}
}
OpenPOWER on IntegriCloud