diff options
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/ELF.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Object/ModuleSymbolTable.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Object/ObjectFile.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Object/RelocationResolver.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/Object/XCOFFObjectFile.cpp | 54 |
7 files changed, 72 insertions, 30 deletions
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index d491288579df..f17a6da23d7d 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -477,7 +477,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, #define PPC64_DYNAMIC_TAG(name, value) // Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc. #define DYNAMIC_TAG_MARKER(name, value) -#define DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) +#define DYNAMIC_TAG(name, value) case value: return #name; #include "llvm/BinaryFormat/DynamicTags.def" #undef DYNAMIC_TAG #undef AARCH64_DYNAMIC_TAG diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index c0c873f97354..8540b7ab03cd 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -128,6 +128,10 @@ static unsigned getCPUType(const MachOObjectFile &O) { return O.getHeader().cputype; } +static unsigned getCPUSubType(const MachOObjectFile &O) { + return O.getHeader().cpusubtype; +} + static uint32_t getPlainRelocationAddress(const MachO::any_relocation_info &RE) { return RE.r_word0; @@ -2565,7 +2569,7 @@ StringRef MachOObjectFile::getFileFormatName() const { } } -Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) { +Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType) { switch (CPUType) { case MachO::CPU_TYPE_I386: return Triple::x86; @@ -2737,7 +2741,7 @@ ArrayRef<StringRef> MachOObjectFile::getValidArchs() { } Triple::ArchType MachOObjectFile::getArch() const { - return getArch(getCPUType(*this)); + return getArch(getCPUType(*this), getCPUSubType(*this)); } Triple MachOObjectFile::getArchTriple(const char **McpuDefault) const { diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp b/llvm/lib/Object/ModuleSymbolTable.cpp index d1e0ce5edae1..17ac4afda2d6 100644 --- a/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/llvm/lib/Object/ModuleSymbolTable.cpp @@ -83,7 +83,8 @@ initializeRecordStreamer(const Module &M, if (!MRI) return; - std::unique_ptr<MCAsmInfo> MAI(T->createMCAsmInfo(*MRI, TT.str())); + MCTargetOptions MCOptions; + std::unique_ptr<MCAsmInfo> MAI(T->createMCAsmInfo(*MRI, TT.str(), MCOptions)); if (!MAI) return; @@ -109,7 +110,6 @@ initializeRecordStreamer(const Module &M, std::unique_ptr<MCAsmParser> Parser( createMCAsmParser(SrcMgr, MCCtx, Streamer, *MAI)); - MCTargetOptions MCOptions; std::unique_ptr<MCTargetAsmParser> TAP( T->createMCAsmParser(*STI, *Parser, *MCII, MCOptions)); if (!TAP) diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index e0e63a5a7d76..098b3d8f8dd0 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -32,6 +32,13 @@ using namespace llvm; using namespace object; +raw_ostream &object::operator<<(raw_ostream &OS, const SectionedAddress &Addr) { + OS << "SectionedAddress{" << format_hex(Addr.Address, 10); + if (Addr.SectionIndex != SectionedAddress::UndefSection) + OS << ", " << Addr.SectionIndex; + return OS << "}"; +} + void ObjectFile::anchor() {} ObjectFile::ObjectFile(unsigned int Type, MemoryBufferRef Source) diff --git a/llvm/lib/Object/RelocationResolver.cpp b/llvm/lib/Object/RelocationResolver.cpp index ca89f5671b8a..31478be7899e 100644 --- a/llvm/lib/Object/RelocationResolver.cpp +++ b/llvm/lib/Object/RelocationResolver.cpp @@ -105,6 +105,7 @@ static bool supportsMips64(uint64_t Type) { case ELF::R_MIPS_32: case ELF::R_MIPS_64: case ELF::R_MIPS_TLS_DTPREL64: + case ELF::R_MIPS_PC32: return true; default: return false; @@ -119,6 +120,8 @@ static uint64_t resolveMips64(RelocationRef R, uint64_t S, uint64_t A) { return S + getELFAddend(R); case ELF::R_MIPS_TLS_DTPREL64: return S + getELFAddend(R) - 0x8000; + case ELF::R_MIPS_PC32: + return S + getELFAddend(R) - R.getOffset(); default: llvm_unreachable("Invalid relocation type"); } @@ -336,6 +339,7 @@ static bool supportsRISCV(uint64_t Type) { switch (Type) { case ELF::R_RISCV_NONE: case ELF::R_RISCV_32: + case ELF::R_RISCV_32_PCREL: case ELF::R_RISCV_64: case ELF::R_RISCV_SET6: case ELF::R_RISCV_SUB6: @@ -360,12 +364,14 @@ static uint64_t resolveRISCV(RelocationRef R, uint64_t S, uint64_t A) { return A; case ELF::R_RISCV_32: return (S + RA) & 0xFFFFFFFF; + case ELF::R_RISCV_32_PCREL: + return (S + RA - R.getOffset()) & 0xFFFFFFFF; case ELF::R_RISCV_64: return S + RA; case ELF::R_RISCV_SET6: - return (A + (S + RA)) & 0xFF; + return (A & 0xC0) | ((S + RA) & 0x3F); case ELF::R_RISCV_SUB6: - return (A - (S + RA)) & 0xFF; + return (A & 0xC0) | (((A & 0x3F) - (S + RA)) & 0x3F); case ELF::R_RISCV_ADD8: return (A + (S + RA)) & 0xFF; case ELF::R_RISCV_SUB8: diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 014b403556df..ab8918ce1919 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -343,7 +343,7 @@ Error WasmObjectFile::parseDylinkSection(ReadContext &Ctx) { Error WasmObjectFile::parseNameSection(ReadContext &Ctx) { llvm::DenseSet<uint64_t> Seen; - if (Functions.size() != FunctionTypes.size()) { + if (FunctionTypes.size() && !SeenCodeSection) { return make_error<GenericBinaryError>("Names must come after code section", object_error::parse_failed); } @@ -389,7 +389,7 @@ Error WasmObjectFile::parseNameSection(ReadContext &Ctx) { Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) { HasLinkingSection = true; - if (Functions.size() != FunctionTypes.size()) { + if (FunctionTypes.size() && !SeenCodeSection) { return make_error<GenericBinaryError>( "Linking data must come after code section", object_error::parse_failed); @@ -940,6 +940,7 @@ Error WasmObjectFile::parseImportSection(ReadContext &Ctx) { Error WasmObjectFile::parseFunctionSection(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); FunctionTypes.reserve(Count); + Functions.resize(Count); uint32_t NumTypes = Signatures.size(); while (Count--) { uint32_t Type = readVaruint32(Ctx); @@ -1029,9 +1030,11 @@ Error WasmObjectFile::parseExportSection(ReadContext &Ctx) { Ex.Index = readVaruint32(Ctx); switch (Ex.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: - if (!isValidFunctionIndex(Ex.Index)) + + if (!isDefinedFunctionIndex(Ex.Index)) return make_error<GenericBinaryError>("Invalid function export", object_error::parse_failed); + getDefinedFunction(Ex.Index).ExportName = Ex.Name; break; case wasm::WASM_EXTERNAL_GLOBAL: if (!isValidGlobalIndex(Ex.Index)) @@ -1132,6 +1135,7 @@ Error WasmObjectFile::parseStartSection(ReadContext &Ctx) { } Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { + SeenCodeSection = true; CodeSection = Sections.size(); uint32_t FunctionCount = readVaruint32(Ctx); if (FunctionCount != FunctionTypes.size()) { @@ -1139,14 +1143,14 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { object_error::parse_failed); } - while (FunctionCount--) { - wasm::WasmFunction Function; + for (uint32_t i = 0; i < FunctionCount; i++) { + wasm::WasmFunction& Function = Functions[i]; const uint8_t *FunctionStart = Ctx.Ptr; uint32_t Size = readVaruint32(Ctx); const uint8_t *FunctionEnd = Ctx.Ptr + Size; Function.CodeOffset = Ctx.Ptr - FunctionStart; - Function.Index = NumImportedFunctions + Functions.size(); + Function.Index = NumImportedFunctions + i; Function.CodeSectionOffset = FunctionStart - Ctx.Start; Function.Size = FunctionEnd - FunctionStart; @@ -1165,7 +1169,6 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { Function.Comdat = UINT32_MAX; Ctx.Ptr += BodySize; assert(Ctx.Ptr == FunctionEnd); - Functions.push_back(Function); } if (Ctx.Ptr != Ctx.End) return make_error<GenericBinaryError>("Code section ended prematurely", diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 98782c2701c1..f98cd69a0d37 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/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 |