diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:50:12 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:50:12 +0000 |
commit | e6d1592492a3a379186bfb02bd0f4eda0669c0d5 (patch) | |
tree | 599ab169a01f1c86eda9adc774edaedde2f2db5b /tools/llvm-objdump/llvm-objdump.h | |
parent | 1a56a5ead7a2e84bee8240f5f6b033b5f1707154 (diff) | |
download | src-e6d1592492a3a379186bfb02bd0f4eda0669c0d5.tar.gz src-e6d1592492a3a379186bfb02bd0f4eda0669c0d5.zip |
Vendor import of stripped llvm trunk r366426 (just before the release_90vendor/llvm/llvm-trunk-r366426
branch point):
https://llvm.org/svn/llvm-project/llvm/trunk@366426
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=351278
svn path=/vendor/llvm/llvm-trunk-r366426/; revision=351279; tag=vendor/llvm/llvm-trunk-r366426
Diffstat (limited to 'tools/llvm-objdump/llvm-objdump.h')
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.h | 153 |
1 files changed, 92 insertions, 61 deletions
diff --git a/tools/llvm-objdump/llvm-objdump.h b/tools/llvm-objdump/llvm-objdump.h index fe2cb05fe227..e58d4a05c2e6 100644 --- a/tools/llvm-objdump/llvm-objdump.h +++ b/tools/llvm-objdump/llvm-objdump.h @@ -1,8 +1,7 @@ // -// 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 // //===----------------------------------------------------------------------===// @@ -19,57 +18,86 @@ namespace llvm { class StringRef; namespace object { - class COFFObjectFile; - class COFFImportFile; - class MachOObjectFile; - class MachOUniversalBinary; - class ObjectFile; - class Archive; - class RelocationRef; +class COFFObjectFile; +class COFFImportFile; +class ELFObjectFileBase; +class ELFSectionRef; +class MachOObjectFile; +class MachOUniversalBinary; +class RelocationRef; } -extern cl::opt<std::string> TripleName; -extern cl::opt<std::string> ArchName; -extern cl::opt<std::string> MCPU; -extern cl::list<std::string> MAttrs; -extern cl::list<std::string> FilterSections; -extern cl::opt<bool> AllHeaders; extern cl::opt<bool> Demangle; -extern cl::opt<bool> Disassemble; -extern cl::opt<bool> DisassembleAll; -extern cl::opt<bool> NoShowRawInsn; -extern cl::opt<bool> NoLeadingAddr; -extern cl::opt<bool> PrivateHeaders; -extern cl::opt<bool> FileHeaders; -extern cl::opt<bool> FirstPrivateHeader; -extern cl::opt<bool> ExportsTrie; -extern cl::opt<bool> Rebase; -extern cl::opt<bool> Bind; -extern cl::opt<bool> LazyBind; -extern cl::opt<bool> WeakBind; -extern cl::opt<bool> RawClangAST; -extern cl::opt<bool> UniversalHeaders; -extern cl::opt<bool> ArchiveHeaders; -extern cl::opt<bool> IndirectSymbols; -extern cl::opt<bool> DataInCode; -extern cl::opt<bool> LinkOptHints; -extern cl::opt<bool> InfoPlist; -extern cl::opt<bool> DylibsUsed; -extern cl::opt<bool> DylibId; -extern cl::opt<bool> ObjcMetaData; -extern cl::opt<std::string> DisSymName; -extern cl::opt<bool> NonVerbose; -extern cl::opt<bool> Relocations; -extern cl::opt<bool> DynamicRelocations; -extern cl::opt<bool> SectionHeaders; -extern cl::opt<bool> SectionContents; -extern cl::opt<bool> SymbolTable; -extern cl::opt<bool> UnwindInfo; -extern cl::opt<bool> PrintImmHex; -extern cl::opt<DIDumpType> DwarfDumpType; + +typedef std::function<bool(llvm::object::SectionRef const &)> FilterPredicate; + +class SectionFilterIterator { +public: + SectionFilterIterator(FilterPredicate P, + llvm::object::section_iterator const &I, + llvm::object::section_iterator const &E) + : Predicate(std::move(P)), Iterator(I), End(E) { + ScanPredicate(); + } + const llvm::object::SectionRef &operator*() const { return *Iterator; } + SectionFilterIterator &operator++() { + ++Iterator; + ScanPredicate(); + return *this; + } + bool operator!=(SectionFilterIterator const &Other) const { + return Iterator != Other.Iterator; + } + +private: + void ScanPredicate() { + while (Iterator != End && !Predicate(*Iterator)) { + ++Iterator; + } + } + FilterPredicate Predicate; + llvm::object::section_iterator Iterator; + llvm::object::section_iterator End; +}; + +class SectionFilter { +public: + SectionFilter(FilterPredicate P, llvm::object::ObjectFile const &O) + : Predicate(std::move(P)), Object(O) {} + SectionFilterIterator begin() { + return SectionFilterIterator(Predicate, Object.section_begin(), + Object.section_end()); + } + SectionFilterIterator end() { + return SectionFilterIterator(Predicate, Object.section_end(), + Object.section_end()); + } + +private: + FilterPredicate Predicate; + llvm::object::ObjectFile const &Object; +}; // Various helper functions. +SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O); + +Error getELFRelocationValueString(const object::ELFObjectFileBase *Obj, + const object::RelocationRef &Rel, + llvm::SmallVectorImpl<char> &Result); +Error getCOFFRelocationValueString(const object::COFFObjectFile *Obj, + const object::RelocationRef &Rel, + llvm::SmallVectorImpl<char> &Result); +Error getWasmRelocationValueString(const object::WasmObjectFile *Obj, + const object::RelocationRef &RelRef, + llvm::SmallVectorImpl<char> &Result); +Error getMachORelocationValueString(const object::MachOObjectFile *Obj, + const object::RelocationRef &RelRef, + llvm::SmallVectorImpl<char> &Result); + +uint64_t getELFSectionLMA(const object::ELFSectionRef& Sec); + void error(std::error_code ec); +void error(Error E); bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B); void parseInputMachO(StringRef Filename); void parseInputMachO(object::MachOUniversalBinary *UB); @@ -82,6 +110,7 @@ void printMachOLazyBindTable(object::MachOObjectFile *O); void printMachOWeakBindTable(object::MachOObjectFile *O); void printELFFileHeader(const object::ObjectFile *O); void printELFDynamicSection(const object::ObjectFile *Obj); +void printELFSymbolVersionInfo(const object::ObjectFile *Obj); void printCOFFFileHeader(const object::ObjectFile *O); void printCOFFSymbolTable(const object::COFFImportFile *I); void printCOFFSymbolTable(const object::COFFObjectFile *O); @@ -103,18 +132,20 @@ void printSymbolTable(const object::ObjectFile *O, StringRef ArchiveName, void warn(StringRef Message); LLVM_ATTRIBUTE_NORETURN void error(Twine Message); LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, Twine Message); -LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, std::error_code EC); -LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, llvm::Error E); -LLVM_ATTRIBUTE_NORETURN void report_error(StringRef FileName, - StringRef ArchiveName, - llvm::Error E, - StringRef ArchitectureName - = StringRef()); -LLVM_ATTRIBUTE_NORETURN void report_error(StringRef ArchiveName, - const object::Archive::Child &C, - llvm::Error E, - StringRef ArchitectureName - = StringRef()); +LLVM_ATTRIBUTE_NORETURN void report_error(Error E, StringRef File); +LLVM_ATTRIBUTE_NORETURN void +report_error(Error E, StringRef FileName, StringRef ArchiveName, + StringRef ArchitectureName = StringRef()); +LLVM_ATTRIBUTE_NORETURN void +report_error(Error E, StringRef ArchiveName, const object::Archive::Child &C, + StringRef ArchitectureName = StringRef()); + +template <typename T, typename... Ts> +T unwrapOrError(Expected<T> EO, Ts &&... Args) { + if (EO) + return std::move(*EO); + report_error(EO.takeError(), std::forward<Ts>(Args)...); +} } // end namespace llvm |