diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:00:03 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:00:03 +0000 |
commit | 480093f4440d54b30b3025afeac24b48f2ba7a2e (patch) | |
tree | 162e72994062888647caf0d875428db9445491a8 /contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp | |
parent | 489b1cf2ecf5b9b4a394857987014bfb09067726 (diff) | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp index 98782c2701c1..f98cd69a0d37 100644 --- a/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/contrib/llvm-project/llvm/lib/Object/XCOFFObjectFile.cpp @@ -46,6 +46,21 @@ static StringRef generateXCOFFFixedNameStringRef(const char *Name) { : StringRef(Name, XCOFF::NameSize); } +template <typename T> StringRef XCOFFSectionHeader<T>::getName() const { + const T &DerivedXCOFFSectionHeader = static_cast<const T &>(*this); + return generateXCOFFFixedNameStringRef(DerivedXCOFFSectionHeader.Name); +} + +template <typename T> uint16_t XCOFFSectionHeader<T>::getSectionType() const { + const T &DerivedXCOFFSectionHeader = static_cast<const T &>(*this); + return DerivedXCOFFSectionHeader.Flags & SectionFlagsTypeMask; +} + +template <typename T> +bool XCOFFSectionHeader<T>::isReservedSectionType() const { + return getSectionType() & SectionFlagsReservedMask; +} + bool XCOFFRelocation32::isRelocationSigned() const { return Info & XR_SIGN_INDICATOR_MASK; } @@ -176,9 +191,8 @@ Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const { } Expected<uint64_t> XCOFFObjectFile::getSymbolAddress(DataRefImpl Symb) const { - uint64_t Result = 0; - llvm_unreachable("Not yet implemented!"); - return Result; + assert(!is64Bit() && "Symbol table support not implemented for 64-bit."); + return toSymbolEntry(Symb)->Value; } uint64_t XCOFFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const { @@ -251,7 +265,21 @@ uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const { Expected<ArrayRef<uint8_t>> XCOFFObjectFile::getSectionContents(DataRefImpl Sec) const { - llvm_unreachable("Not yet implemented!"); + if (isSectionVirtual(Sec)) + return ArrayRef<uint8_t>(); + + uint64_t OffsetToRaw; + if (is64Bit()) + OffsetToRaw = toSection64(Sec)->FileOffsetToRawData; + else + OffsetToRaw = toSection32(Sec)->FileOffsetToRawData; + + const uint8_t * ContentStart = base() + OffsetToRaw; + uint64_t SectionSize = getSectionSize(Sec); + if (checkOffset(Data, uintptr_t(ContentStart), SectionSize)) + return make_error<BinaryError>(); + + return makeArrayRef(ContentStart,SectionSize); } uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const { @@ -281,9 +309,8 @@ bool XCOFFObjectFile::isSectionBSS(DataRefImpl Sec) const { } bool XCOFFObjectFile::isSectionVirtual(DataRefImpl Sec) const { - bool Result = false; - llvm_unreachable("Not yet implemented!"); - return Result; + return is64Bit() ? toSection64(Sec)->FileOffsetToRawData == 0 + : toSection32(Sec)->FileOffsetToRawData == 0; } relocation_iterator XCOFFObjectFile::section_rel_begin(DataRefImpl Sec) const { @@ -369,7 +396,6 @@ Triple::ArchType XCOFFObjectFile::getArch() const { } SubtargetFeatures XCOFFObjectFile::getFeatures() const { - llvm_unreachable("Not yet implemented!"); return SubtargetFeatures(); } @@ -688,14 +714,6 @@ ObjectFile::createXCOFFObjectFile(MemoryBufferRef MemBufRef, return XCOFFObjectFile::create(FileType, MemBufRef); } -StringRef XCOFFSectionHeader32::getName() const { - return generateXCOFFFixedNameStringRef(Name); -} - -StringRef XCOFFSectionHeader64::getName() const { - return generateXCOFFFixedNameStringRef(Name); -} - XCOFF::StorageClass XCOFFSymbolRef::getStorageClass() const { return OwningObjectPtr->toSymbolEntry(SymEntDataRef)->StorageClass; } @@ -762,5 +780,9 @@ bool XCOFFSymbolRef::isFunction() const { return (OwningObjectPtr->getSectionFlags(SI.get()) & XCOFF::STYP_TEXT); } +// Explictly instantiate template classes. +template struct XCOFFSectionHeader<XCOFFSectionHeader32>; +template struct XCOFFSectionHeader<XCOFFSectionHeader64>; + } // namespace object } // namespace llvm |