summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorJoel Galenson <jgalenson@google.com>2018-08-24 15:21:57 +0000
committerJoel Galenson <jgalenson@google.com>2018-08-24 15:21:57 +0000
commit134cf47dcbe7ff4b58bc2001926b412b28138afc (patch)
treeb9cf314f6b11111cbb95424de39273878019bb30 /llvm/tools
parentd36fb48a274bd6c53ce289e968be4c53c189e0a7 (diff)
downloadbcm5719-llvm-134cf47dcbe7ff4b58bc2001926b412b28138afc.tar.gz
bcm5719-llvm-134cf47dcbe7ff4b58bc2001926b412b28138afc.zip
[llvm-objdump] Label calls to the PLT.
Differential Revision: https://reviews.llvm.org/D50204 llvm-svn: 340611
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 09fa0c6fff8..68e03d474b2 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -56,6 +56,7 @@
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/StringSaver.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
@@ -1235,6 +1236,37 @@ addDynamicElfSymbols(const ObjectFile *Obj,
llvm_unreachable("Unsupported binary format");
}
+static void addPltEntries(const ObjectFile *Obj,
+ std::map<SectionRef, SectionSymbolsTy> &AllSymbols,
+ StringSaver &Saver) {
+ Optional<SectionRef> Plt = None;
+ for (const SectionRef &Section : Obj->sections()) {
+ StringRef Name;
+ if (Section.getName(Name))
+ continue;
+ if (Name == ".plt")
+ Plt = Section;
+ }
+ if (!Plt)
+ return;
+ if (auto *ElfObj = dyn_cast<ELFObjectFileBase>(Obj)) {
+ for (auto PltEntry : ElfObj->getPltAddresses()) {
+ SymbolRef Symbol(PltEntry.first, ElfObj);
+
+ uint8_t SymbolType = getElfSymbolType(Obj, Symbol);
+
+ Expected<StringRef> NameOrErr = Symbol.getName();
+ if (!NameOrErr)
+ report_error(Obj->getFileName(), NameOrErr.takeError());
+ if (NameOrErr->empty())
+ continue;
+ StringRef Name = Saver.save((*NameOrErr + "@plt").str());
+
+ AllSymbols[*Plt].emplace_back(PltEntry.second, Name, SymbolType);
+ }
+ }
+}
+
static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
if (StartAddress > StopAddress)
error("Start address should be less than stop address");
@@ -1342,6 +1374,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
if (AllSymbols.empty() && Obj->isELF())
addDynamicElfSymbols(Obj, AllSymbols);
+ BumpPtrAllocator A;
+ StringSaver Saver(A);
+ addPltEntries(Obj, AllSymbols, Saver);
+
// Create a mapping from virtual address to section.
std::vector<std::pair<uint64_t, SectionRef>> SectionAddresses;
for (SectionRef Sec : Obj->sections())
OpenPOWER on IntegriCloud