diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 | 
| commit | 044eb2f6afba375a914ac9d8024f8f5142bb912e (patch) | |
| tree | 1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /tools/llvm-objdump/llvm-objdump.cpp | |
| parent | eb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff) | |
Notes
Diffstat (limited to 'tools/llvm-objdump/llvm-objdump.cpp')
| -rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 61 | 
1 files changed, 26 insertions, 35 deletions
| diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 74593e6202aaa..79204c6e95332 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -62,8 +62,8 @@  #include <cctype>  #include <cstring>  #include <system_error> -#include <utility>  #include <unordered_map> +#include <utility>  using namespace llvm;  using namespace object; @@ -191,7 +191,7 @@ cl::opt<bool> PrintFaultMaps("fault-map-section",  cl::opt<DIDumpType> llvm::DwarfDumpType(      "dwarf", cl::init(DIDT_Null), cl::desc("Dump of dwarf debug sections:"), -    cl::values(clEnumValN(DIDT_Frames, "frames", ".debug_frame"))); +    cl::values(clEnumValN(DIDT_DebugFrame, "frames", ".debug_frame")));  cl::opt<bool> PrintSource(      "source", @@ -362,29 +362,11 @@ static const Target *getTarget(const ObjectFile *Obj = nullptr) {    llvm::Triple TheTriple("unknown-unknown-unknown");    if (TripleName.empty()) {      if (Obj) { -      auto Arch = Obj->getArch(); -      TheTriple.setArch(Triple::ArchType(Arch)); - -      // For ARM targets, try to use the build attributes to build determine -      // the build target. Target features are also added, but later during -      // disassembly. -      if (Arch == Triple::arm || Arch == Triple::armeb) { -        Obj->setARMSubArch(TheTriple); -      } - -      // TheTriple defaults to ELF, and COFF doesn't have an environment: -      // the best we can do here is indicate that it is mach-o. -      if (Obj->isMachO()) -        TheTriple.setObjectFormat(Triple::MachO); - -      if (Obj->isCOFF()) { -        const auto COFFObj = dyn_cast<COFFObjectFile>(Obj); -        if (COFFObj->getArch() == Triple::thumb) -          TheTriple.setTriple("thumbv7-windows"); -      } +      TheTriple = Obj->makeTriple();      }    } else {      TheTriple.setTriple(Triple::normalize(TripleName)); +      // Use the triple, but also try to combine with ARM build attributes.      if (Obj) {        auto Arch = Obj->getArch(); @@ -418,7 +400,7 @@ namespace {  class SourcePrinter {  protected:    DILineInfo OldLineInfo; -  const ObjectFile *Obj; +  const ObjectFile *Obj = nullptr;    std::unique_ptr<symbolize::LLVMSymbolizer> Symbolizer;    // File name to file contents of source    std::unordered_map<std::string, std::unique_ptr<MemoryBuffer>> SourceCache; @@ -426,22 +408,22 @@ protected:    std::unordered_map<std::string, std::vector<StringRef>> LineCache;  private: -  bool cacheSource(std::string File); +  bool cacheSource(const std::string& File);  public: -  virtual ~SourcePrinter() {} -  SourcePrinter() : Obj(nullptr), Symbolizer(nullptr) {} +  SourcePrinter() = default;    SourcePrinter(const ObjectFile *Obj, StringRef DefaultArch) : Obj(Obj) {      symbolize::LLVMSymbolizer::Options SymbolizerOpts(          DILineInfoSpecifier::FunctionNameKind::None, true, false, false,          DefaultArch);      Symbolizer.reset(new symbolize::LLVMSymbolizer(SymbolizerOpts));    } +  virtual ~SourcePrinter() = default;    virtual void printSourceLine(raw_ostream &OS, uint64_t Address,                                 StringRef Delimiter = "; ");  }; -bool SourcePrinter::cacheSource(std::string File) { +bool SourcePrinter::cacheSource(const std::string& File) {    auto BufferOrError = MemoryBuffer::getFile(File);    if (!BufferOrError)      return false; @@ -509,7 +491,7 @@ static bool isArmElf(const ObjectFile *Obj) {  class PrettyPrinter {  public: -  virtual ~PrettyPrinter(){} +  virtual ~PrettyPrinter() = default;    virtual void printInst(MCInstPrinter &IP, const MCInst *MI,                           ArrayRef<uint8_t> Bytes, uint64_t Address,                           raw_ostream &OS, StringRef Annot, @@ -883,8 +865,19 @@ static void printRelocationTargetName(const MachOObjectFile *O,    } else {      section_iterator SI = O->section_begin();      // Adjust for the fact that sections are 1-indexed. -    advance(SI, Val - 1); -    SI->getName(S); +    if (Val == 0) { +      fmt << "0 (?,?)"; +      return; +    } +    uint32_t i = Val - 1; +    while (i != 0 && SI != O->section_end()) { +      i--; +      advance(SI, 1); +    } +    if (SI == O->section_end()) +      fmt << Val << " (?,?)"; +    else +      SI->getName(S);    }    fmt << S; @@ -1223,7 +1216,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {    MCObjectFileInfo MOFI;    MCContext Ctx(AsmInfo.get(), MRI.get(), &MOFI);    // FIXME: for now initialize MCObjectFileInfo with default values -  MOFI.InitMCObjectFileInfo(Triple(TripleName), false, CodeModel::Default, Ctx); +  MOFI.InitMCObjectFileInfo(Triple(TripleName), false, Ctx);    std::unique_ptr<MCDisassembler> DisAsm(      TheTarget->createMCDisassembler(*STI, Ctx)); @@ -2081,11 +2074,10 @@ static void DumpObject(ObjectFile *o, const Archive *a = nullptr) {    if (PrintFaultMaps)      printFaultMaps(o);    if (DwarfDumpType != DIDT_Null) { -    std::unique_ptr<DIContext> DICtx(new DWARFContextInMemory(*o)); +    std::unique_ptr<DIContext> DICtx = DWARFContext::create(*o);      // Dump the complete DWARF structure.      DIDumpOptions DumpOpts;      DumpOpts.DumpType = DwarfDumpType; -    DumpOpts.DumpEH = true;      DICtx->dump(outs(), DumpOpts);    }  } @@ -2205,8 +2197,7 @@ int main(int argc, char **argv) {      return 2;    } -  std::for_each(InputFilenames.begin(), InputFilenames.end(), -                DumpInput); +  llvm::for_each(InputFilenames, DumpInput);    return EXIT_SUCCESS;  } | 
