diff options
Diffstat (limited to 'llvm/lib/Object/ELF.cpp')
-rw-r--r-- | llvm/lib/Object/ELF.cpp | 71 |
1 files changed, 40 insertions, 31 deletions
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index ca2ed4449120..84181ae5e501 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -246,6 +246,9 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); } break; + case ELF::EM_MSP430: + switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_MSP430_ATTRIBUTES); } + break; case ELF::EM_RISCV: switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_RISCV_ATTRIBUTES); } break; @@ -333,40 +336,26 @@ ELFFile<ELFT>::decode_relrs(Elf_Relr_Range relrs) const { std::vector<Elf_Rel> Relocs; // Word type: uint32_t for Elf32, and uint64_t for Elf64. - typedef typename ELFT::uint Word; - - // Word size in number of bytes. - const size_t WordSize = sizeof(Word); + using Addr = typename ELFT::uint; - // Number of bits used for the relocation offsets bitmap. - // These many relative relocations can be encoded in a single entry. - const size_t NBits = 8*WordSize - 1; - - Word Base = 0; - for (const Elf_Relr &R : relrs) { - Word Entry = R; - if ((Entry&1) == 0) { + Addr Base = 0; + for (Elf_Relr R : relrs) { + typename ELFT::uint Entry = R; + if ((Entry & 1) == 0) { // Even entry: encodes the offset for next relocation. Rel.r_offset = Entry; Relocs.push_back(Rel); // Set base offset for subsequent bitmap entries. - Base = Entry + WordSize; - continue; - } - - // Odd entry: encodes bitmap for relocations starting at base. - Word Offset = Base; - while (Entry != 0) { - Entry >>= 1; - if ((Entry&1) != 0) { - Rel.r_offset = Offset; - Relocs.push_back(Rel); - } - Offset += WordSize; + Base = Entry + sizeof(Addr); + } else { + // Odd entry: encodes bitmap for relocations starting at base. + for (Addr Offset = Base; (Entry >>= 1) != 0; Offset += sizeof(Addr)) + if ((Entry & 1) != 0) { + Rel.r_offset = Offset; + Relocs.push_back(Rel); + } + Base += (CHAR_BIT * sizeof(Entry) - 1) * sizeof(Addr); } - - // Advance base offset by NBits words. - Base += NBits * WordSize; } return Relocs; @@ -474,6 +463,14 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, } break; + case ELF::EM_PPC: + switch (Type) { +#define PPC_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) +#include "llvm/BinaryFormat/DynamicTags.def" +#undef PPC_DYNAMIC_TAG + } + break; + case ELF::EM_PPC64: switch (Type) { #define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) @@ -481,6 +478,14 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, #undef PPC64_DYNAMIC_TAG } break; + + case ELF::EM_RISCV: + switch (Type) { +#define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value) +#include "llvm/BinaryFormat/DynamicTags.def" +#undef RISCV_DYNAMIC_TAG + } + break; } #undef DYNAMIC_TAG switch (Type) { @@ -488,7 +493,9 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, #define AARCH64_DYNAMIC_TAG(name, value) #define MIPS_DYNAMIC_TAG(name, value) #define HEXAGON_DYNAMIC_TAG(name, value) +#define PPC_DYNAMIC_TAG(name, value) #define PPC64_DYNAMIC_TAG(name, value) +#define RISCV_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) case value: return #name; @@ -497,7 +504,9 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch, #undef AARCH64_DYNAMIC_TAG #undef MIPS_DYNAMIC_TAG #undef HEXAGON_DYNAMIC_TAG +#undef PPC_DYNAMIC_TAG #undef PPC64_DYNAMIC_TAG +#undef RISCV_DYNAMIC_TAG #undef DYNAMIC_TAG_MARKER #undef DYNAMIC_STRINGIFY_ENUM default: @@ -613,14 +622,14 @@ ELFFile<ELFT>::toMappedAddr(uint64_t VAddr, WarningHandler WarnHandler) const { } template <class ELFT> -Expected<std::vector<typename ELFT::BBAddrMap>> +Expected<std::vector<BBAddrMap>> ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const { Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec); if (!ContentsOrErr) return ContentsOrErr.takeError(); ArrayRef<uint8_t> Content = *ContentsOrErr; DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4); - std::vector<Elf_BBAddrMap> FunctionEntries; + std::vector<BBAddrMap> FunctionEntries; DataExtractor::Cursor Cur(0); Error ULEBSizeErr = Error::success(); @@ -647,7 +656,7 @@ ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const { while (!ULEBSizeErr && Cur && Cur.tell() < Content.size()) { uintX_t Address = static_cast<uintX_t>(Data.getAddress(Cur)); uint32_t NumBlocks = ReadULEB128AsUInt32(); - std::vector<typename Elf_BBAddrMap::BBEntry> BBEntries; + std::vector<BBAddrMap::BBEntry> BBEntries; for (uint32_t BlockID = 0; !ULEBSizeErr && Cur && (BlockID < NumBlocks); ++BlockID) { uint32_t Offset = ReadULEB128AsUInt32(); |