diff options
Diffstat (limited to 'contrib/llvm/tools/llvm-objdump/COFFDump.cpp')
-rw-r--r-- | contrib/llvm/tools/llvm-objdump/COFFDump.cpp | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/contrib/llvm/tools/llvm-objdump/COFFDump.cpp b/contrib/llvm/tools/llvm-objdump/COFFDump.cpp index 55607ec299be..1ba0a68902c9 100644 --- a/contrib/llvm/tools/llvm-objdump/COFFDump.cpp +++ b/contrib/llvm/tools/llvm-objdump/COFFDump.cpp @@ -1,9 +1,8 @@ //===-- COFFDump.cpp - COFF-specific dumper ---------------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// @@ -25,10 +24,10 @@ #include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" -using namespace llvm; -using namespace object; +using namespace llvm::object; using namespace llvm::Win64EH; +namespace llvm { // Returns the name of the unwind code. static StringRef getUnwindCodeTypeName(uint8_t Code) { switch(Code) { @@ -156,70 +155,68 @@ static void printAllUnwindCodes(ArrayRef<UnwindCode> UCs) { } // Given a symbol sym this functions returns the address and section of it. -static std::error_code -resolveSectionAndAddress(const COFFObjectFile *Obj, const SymbolRef &Sym, - const coff_section *&ResolvedSection, - uint64_t &ResolvedAddr) { +static Error resolveSectionAndAddress(const COFFObjectFile *Obj, + const SymbolRef &Sym, + const coff_section *&ResolvedSection, + uint64_t &ResolvedAddr) { Expected<uint64_t> ResolvedAddrOrErr = Sym.getAddress(); if (!ResolvedAddrOrErr) - return errorToErrorCode(ResolvedAddrOrErr.takeError()); + return ResolvedAddrOrErr.takeError(); ResolvedAddr = *ResolvedAddrOrErr; Expected<section_iterator> Iter = Sym.getSection(); if (!Iter) - return errorToErrorCode(Iter.takeError()); + return Iter.takeError(); ResolvedSection = Obj->getCOFFSection(**Iter); - return std::error_code(); + return Error::success(); } // Given a vector of relocations for a section and an offset into this section // the function returns the symbol used for the relocation at the offset. -static std::error_code resolveSymbol(const std::vector<RelocationRef> &Rels, +static Error resolveSymbol(const std::vector<RelocationRef> &Rels, uint64_t Offset, SymbolRef &Sym) { for (auto &R : Rels) { uint64_t Ofs = R.getOffset(); if (Ofs == Offset) { Sym = *R.getSymbol(); - return std::error_code(); + return Error::success(); } } - return object_error::parse_failed; + return make_error<BinaryError>(); } // Given a vector of relocations for a section and an offset into this section // the function resolves the symbol used for the relocation at the offset and // returns the section content and the address inside the content pointed to // by the symbol. -static std::error_code +static Error getSectionContents(const COFFObjectFile *Obj, const std::vector<RelocationRef> &Rels, uint64_t Offset, ArrayRef<uint8_t> &Contents, uint64_t &Addr) { SymbolRef Sym; - if (std::error_code EC = resolveSymbol(Rels, Offset, Sym)) - return EC; + if (Error E = resolveSymbol(Rels, Offset, Sym)) + return E; const coff_section *Section; - if (std::error_code EC = resolveSectionAndAddress(Obj, Sym, Section, Addr)) - return EC; - if (std::error_code EC = Obj->getSectionContents(Section, Contents)) - return EC; - return std::error_code(); + if (Error E = resolveSectionAndAddress(Obj, Sym, Section, Addr)) + return E; + return Obj->getSectionContents(Section, Contents); } // Given a vector of relocations for a section and an offset into this section // the function returns the name of the symbol used for the relocation at the // offset. -static std::error_code resolveSymbolName(const std::vector<RelocationRef> &Rels, - uint64_t Offset, StringRef &Name) { +static Error resolveSymbolName(const std::vector<RelocationRef> &Rels, + uint64_t Offset, StringRef &Name) { SymbolRef Sym; - if (std::error_code EC = resolveSymbol(Rels, Offset, Sym)) + if (Error EC = resolveSymbol(Rels, Offset, Sym)) return EC; Expected<StringRef> NameOrErr = Sym.getName(); if (!NameOrErr) - return errorToErrorCode(NameOrErr.takeError()); + return NameOrErr.takeError(); Name = *NameOrErr; - return std::error_code(); + return Error::success(); } -static void printCOFFSymbolAddress(llvm::raw_ostream &Out, +static void printCOFFSymbolAddress(raw_ostream &Out, const std::vector<RelocationRef> &Rels, uint64_t Offset, uint32_t Disp) { StringRef Sym; @@ -469,6 +466,18 @@ static bool getPDataSection(const COFFObjectFile *Obj, return false; } +Error getCOFFRelocationValueString(const COFFObjectFile *Obj, + const RelocationRef &Rel, + SmallVectorImpl<char> &Result) { + symbol_iterator SymI = Rel.getSymbol(); + Expected<StringRef> SymNameOrErr = SymI->getName(); + if (!SymNameOrErr) + return SymNameOrErr.takeError(); + StringRef SymName = *SymNameOrErr; + Result.append(SymName.begin(), SymName.end()); + return Error::success(); +} + static void printWin64EHUnwindInfo(const Win64EH::UnwindInfo *UI) { // The casts to int are required in order to output the value as number. // Without the casts the value would be interpreted as char data (which @@ -578,7 +587,7 @@ static void printRuntimeFunctionRels(const COFFObjectFile *Obj, printWin64EHUnwindInfo(UI); } -void llvm::printCOFFUnwindInfo(const COFFObjectFile *Obj) { +void printCOFFUnwindInfo(const COFFObjectFile *Obj) { if (Obj->getMachine() != COFF::IMAGE_FILE_MACHINE_AMD64) { WithColor::error(errs(), "llvm-objdump") << "unsupported image machine type " @@ -607,7 +616,7 @@ void llvm::printCOFFUnwindInfo(const COFFObjectFile *Obj) { } } -void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) { +void printCOFFFileHeader(const object::ObjectFile *Obj) { const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj); printTLSDirectory(file); printLoadConfiguration(file); @@ -615,7 +624,7 @@ void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) { printExportTable(file); } -void llvm::printCOFFSymbolTable(const object::COFFImportFile *i) { +void printCOFFSymbolTable(const object::COFFImportFile *i) { unsigned Index = 0; bool IsCode = i->getCOFFImportHeader()->getType() == COFF::IMPORT_CODE; @@ -623,7 +632,7 @@ void llvm::printCOFFSymbolTable(const object::COFFImportFile *i) { std::string Name; raw_string_ostream NS(Name); - Sym.printName(NS); + cantFail(Sym.printName(NS)); NS.flush(); outs() << "[" << format("%2d", Index) << "]" @@ -638,11 +647,11 @@ void llvm::printCOFFSymbolTable(const object::COFFImportFile *i) { } } -void llvm::printCOFFSymbolTable(const COFFObjectFile *coff) { +void printCOFFSymbolTable(const COFFObjectFile *coff) { for (unsigned SI = 0, SE = coff->getNumberOfSymbols(); SI != SE; ++SI) { Expected<COFFSymbolRef> Symbol = coff->getSymbol(SI); StringRef Name; - error(errorToErrorCode(Symbol.takeError())); + error(Symbol.takeError()); error(coff->getSymbolName(*Symbol, Name)); outs() << "[" << format("%2d", SI) << "]" @@ -709,3 +718,4 @@ void llvm::printCOFFSymbolTable(const COFFObjectFile *coff) { } } } +} // namespace llvm |