diff options
Diffstat (limited to 'llvm/include/llvm/Object/ObjectFile.h')
-rw-r--r-- | llvm/include/llvm/Object/ObjectFile.h | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/llvm/include/llvm/Object/ObjectFile.h b/llvm/include/llvm/Object/ObjectFile.h index 2f14934576059..8e8937201716b 100644 --- a/llvm/include/llvm/Object/ObjectFile.h +++ b/llvm/include/llvm/Object/ObjectFile.h @@ -18,13 +18,11 @@ #include "llvm/ADT/Triple.h" #include "llvm/ADT/iterator_range.h" #include "llvm/BinaryFormat/Magic.h" -#include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Error.h" #include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" -#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include <cassert> #include <cstdint> @@ -34,6 +32,7 @@ namespace llvm { class ARMAttributeParser; +class SubtargetFeatures; namespace object { @@ -123,6 +122,9 @@ public: /// contains data (e.g. PROGBITS), but is not text. bool isBerkeleyData() const; + /// Whether this section is a debug section. + bool isDebugSection(StringRef SectionName) const; + bool containsSymbol(SymbolRef S) const; relocation_iterator relocation_begin() const; @@ -185,7 +187,7 @@ public: /// Return the value of the symbol depending on the object this can be an /// offset or a virtual address. - uint64_t getValue() const; + Expected<uint64_t> getValue() const; /// Get the alignment of this symbol as the actual value (not log 2). uint32_t getAlignment() const; @@ -272,6 +274,7 @@ protected: virtual bool isSectionStripped(DataRefImpl Sec) const; virtual bool isBerkeleyText(DataRefImpl Sec) const; virtual bool isBerkeleyData(DataRefImpl Sec) const; + virtual bool isDebugSection(StringRef SectionName) const; virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const = 0; virtual relocation_iterator section_rel_end(DataRefImpl Sec) const = 0; virtual Expected<section_iterator> getRelocatedSection(DataRefImpl Sec) const; @@ -285,14 +288,18 @@ protected: virtual void getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl<char> &Result) const = 0; - uint64_t getSymbolValue(DataRefImpl Symb) const; + Expected<uint64_t> getSymbolValue(DataRefImpl Symb) const; public: ObjectFile() = delete; ObjectFile(const ObjectFile &other) = delete; uint64_t getCommonSymbolSize(DataRefImpl Symb) const { - assert(getSymbolFlags(Symb) & SymbolRef::SF_Common); + Expected<uint32_t> SymbolFlagsOrErr = getSymbolFlags(Symb); + if (!SymbolFlagsOrErr) + // TODO: Actually report errors helpfully. + report_fatal_error(SymbolFlagsOrErr.takeError()); + assert(*SymbolFlagsOrErr & SymbolRef::SF_Common); return getCommonSymbolSizeImpl(Symb); } @@ -382,7 +389,7 @@ inline Expected<uint64_t> SymbolRef::getAddress() const { return getObject()->getSymbolAddress(getRawDataRefImpl()); } -inline uint64_t SymbolRef::getValue() const { +inline Expected<uint64_t> SymbolRef::getValue() const { return getObject()->getSymbolValue(getRawDataRefImpl()); } @@ -495,6 +502,10 @@ inline bool SectionRef::isBerkeleyData() const { return OwningObject->isBerkeleyData(SectionPimpl); } +inline bool SectionRef::isDebugSection(StringRef SectionName) const { + return OwningObject->isDebugSection(SectionName); +} + inline relocation_iterator SectionRef::relocation_begin() const { return OwningObject->section_rel_begin(SectionPimpl); } |