diff options
Diffstat (limited to 'include/llvm/Object')
-rw-r--r-- | include/llvm/Object/Archive.h | 4 | ||||
-rw-r--r-- | include/llvm/Object/ArchiveWriter.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/Binary.h | 4 | ||||
-rw-r--r-- | include/llvm/Object/COFF.h | 1 | ||||
-rw-r--r-- | include/llvm/Object/COFFYAML.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/ELFObjectFile.h | 90 | ||||
-rw-r--r-- | include/llvm/Object/ELFTypes.h | 11 | ||||
-rw-r--r-- | include/llvm/Object/IRObjectFile.h | 4 | ||||
-rw-r--r-- | include/llvm/Object/MachO.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/MachOUniversal.h | 4 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/RelocVisitor.h | 88 | ||||
-rw-r--r-- | include/llvm/Object/SymbolicFile.h | 4 |
13 files changed, 70 insertions, 160 deletions
diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index 8da6919..3a52a9d 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -217,7 +217,7 @@ private: unsigned IsThin : 1; }; -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/ArchiveWriter.h b/include/llvm/Object/ArchiveWriter.h index 1616e46..8a394fa 100644 --- a/include/llvm/Object/ArchiveWriter.h +++ b/include/llvm/Object/ArchiveWriter.h @@ -46,6 +46,6 @@ std::pair<StringRef, std::error_code> writeArchive(StringRef ArcName, std::vector<NewArchiveIterator> &NewMembers, bool WriteSymtab); -} +} // namespace llvm #endif diff --git a/include/llvm/Object/Binary.h b/include/llvm/Object/Binary.h index a3d6d0d..949edf8 100644 --- a/include/llvm/Object/Binary.h +++ b/include/llvm/Object/Binary.h @@ -178,7 +178,7 @@ template <typename T> const T* OwningBinary<T>::getBinary() const { } ErrorOr<OwningBinary<Binary>> createBinary(StringRef Path); -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 564eb7a..ad657b5 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -641,7 +641,6 @@ protected: std::error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const override; symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; - section_iterator getRelocationSection(DataRefImpl Rel) const override; std::error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const override; std::error_code diff --git a/include/llvm/Object/COFFYAML.h b/include/llvm/Object/COFFYAML.h index 12a2522..5ba3db3 100644 --- a/include/llvm/Object/COFFYAML.h +++ b/include/llvm/Object/COFFYAML.h @@ -37,7 +37,7 @@ inline DLLCharacteristics operator|(DLLCharacteristics a, uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b); return static_cast<DLLCharacteristics>(Ret); } -} +} // namespace COFF // The structure of the yaml files is not an exact 1:1 match to COFF. In order // to use yaml::IO, we use these structures which are closer to the source. @@ -87,8 +87,8 @@ namespace COFFYAML { std::vector<Symbol> Symbols; Object(); }; -} -} +} // namespace COFFYAML +} // namespace llvm LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section) LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol) diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 78d77be..7fc56ad 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -40,14 +40,15 @@ protected: ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source); public: - virtual std::error_code getRelocationAddend(DataRefImpl Rel, - int64_t &Res) const = 0; + virtual ErrorOr<int64_t> getRelocationAddend(DataRefImpl Rel) const = 0; + + // FIXME: This is a bit of a hack. Every caller should know if it expecting + // and addend or not. + virtual bool hasRelocationAddend(DataRefImpl Rel) const = 0; + virtual std::pair<symbol_iterator, symbol_iterator> getELFDynamicSymbolIterators() const = 0; - virtual std::error_code getSymbolVersion(SymbolRef Symb, StringRef &Version, - bool &IsDefault) const = 0; - virtual uint64_t getSectionFlags(SectionRef Sec) const = 0; virtual uint32_t getSectionType(SectionRef Sec) const = 0; @@ -112,7 +113,6 @@ protected: std::error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const override; symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; - section_iterator getRelocationSection(DataRefImpl Rel) const override; std::error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const override; std::error_code @@ -208,10 +208,8 @@ public: section_iterator section_begin() const override; section_iterator section_end() const override; - std::error_code getRelocationAddend(DataRefImpl Rel, - int64_t &Res) const override; - std::error_code getSymbolVersion(SymbolRef Symb, StringRef &Version, - bool &IsDefault) const override; + ErrorOr<int64_t> getRelocationAddend(DataRefImpl Rel) const override; + bool hasRelocationAddend(DataRefImpl Rel) const override; uint64_t getSectionFlags(SectionRef Sec) const override; uint32_t getSectionType(SectionRef Sec) const override; @@ -261,20 +259,6 @@ std::error_code ELFObjectFile<ELFT>::getSymbolName(DataRefImpl Symb, } template <class ELFT> -std::error_code ELFObjectFile<ELFT>::getSymbolVersion(SymbolRef SymRef, - StringRef &Version, - bool &IsDefault) const { - DataRefImpl Symb = SymRef.getRawDataRefImpl(); - const Elf_Sym *symb = getSymbol(Symb); - ErrorOr<StringRef> Ver = - EF.getSymbolVersion(EF.getSection(Symb.d.b), symb, IsDefault); - if (!Ver) - return Ver.getError(); - Version = *Ver; - return std::error_code(); -} - -template <class ELFT> uint64_t ELFObjectFile<ELFT>::getSectionFlags(SectionRef Sec) const { DataRefImpl DRI = Sec.getRawDataRefImpl(); return toELFShdrIter(DRI)->sh_flags; @@ -584,20 +568,6 @@ ELFObjectFile<ELFT>::getRelocationSymbol(DataRefImpl Rel) const { return symbol_iterator(SymbolRef(SymbolData, this)); } -// ELF relocations can target sections, by targetting a symbol of type -// STT_SECTION -template <class ELFT> -section_iterator -ELFObjectFile<ELFT>::getRelocationSection(DataRefImpl Rel) const { - symbol_iterator Sym = getRelocationSymbol(Rel); - if (Sym == symbol_end()) - return section_end(); - const Elf_Sym *ESym = getSymbol(Sym->getRawDataRefImpl()); - if (ESym->getType() != ELF::STT_SECTION) - return section_end(); - return getSymbolSection(ESym); -} - template <class ELFT> std::error_code ELFObjectFile<ELFT>::getRelocationAddress(DataRefImpl Rel, @@ -686,22 +656,16 @@ std::error_code ELFObjectFile<ELFT>::getRelocationTypeName( } template <class ELFT> -std::error_code -ELFObjectFile<ELFT>::getRelocationAddend(DataRefImpl Rel, - int64_t &Result) const { - const Elf_Shdr *sec = getRelSection(Rel); - switch (sec->sh_type) { - default: - report_fatal_error("Invalid section type in Rel!"); - case ELF::SHT_REL: { - Result = 0; - return std::error_code(); - } - case ELF::SHT_RELA: { - Result = getRela(Rel)->r_addend; - return std::error_code(); - } - } +ErrorOr<int64_t> +ELFObjectFile<ELFT>::getRelocationAddend(DataRefImpl Rel) const { + if (getRelSection(Rel)->sh_type != ELF::SHT_RELA) + return object_error::parse_failed; + return (int64_t)getRela(Rel)->r_addend; +} + +template <class ELFT> +bool ELFObjectFile<ELFT>::hasRelocationAddend(DataRefImpl Rel) const { + return getRelSection(Rel)->sh_type == ELF::SHT_RELA; } template <class ELFT> @@ -879,26 +843,12 @@ template <class ELFT> bool ELFObjectFile<ELFT>::isRelocatableObject() const { return EF.getHeader()->e_type == ELF::ET_REL; } -inline std::error_code getELFRelocationAddend(const RelocationRef R, - int64_t &Addend) { - const ObjectFile *Obj = R.getObjectFile(); - DataRefImpl DRI = R.getRawDataRefImpl(); - return cast<ELFObjectFileBase>(Obj)->getRelocationAddend(DRI, Addend); -} - inline std::pair<symbol_iterator, symbol_iterator> getELFDynamicSymbolIterators(const SymbolicFile *Obj) { return cast<ELFObjectFileBase>(Obj)->getELFDynamicSymbolIterators(); } -inline std::error_code GetELFSymbolVersion(const ObjectFile *Obj, - const SymbolRef &Sym, - StringRef &Version, - bool &IsDefault) { - return cast<ELFObjectFileBase>(Obj) - ->getSymbolVersion(Sym, Version, IsDefault); -} -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/ELFTypes.h b/include/llvm/Object/ELFTypes.h index 3f323b5..2eda0c1 100644 --- a/include/llvm/Object/ELFTypes.h +++ b/include/llvm/Object/ELFTypes.h @@ -156,11 +156,13 @@ struct Elf_Sym_Impl : Elf_Sym_Base<ELFT> { using Elf_Sym_Base<ELFT>::st_info; using Elf_Sym_Base<ELFT>::st_shndx; using Elf_Sym_Base<ELFT>::st_other; + using Elf_Sym_Base<ELFT>::st_value; // These accessors and mutators correspond to the ELF32_ST_BIND, // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: unsigned char getBinding() const { return st_info >> 4; } unsigned char getType() const { return st_info & 0x0f; } + uint64_t getValue() const { return st_value; } void setBinding(unsigned char b) { setBindingAndType(b, getType()); } void setType(unsigned char t) { setBindingAndType(getBinding(), t); } void setBindingAndType(unsigned char b, unsigned char t) { @@ -182,10 +184,7 @@ struct Elf_Sym_Impl : Elf_Sym_Base<ELFT> { bool isCommon() const { return getType() == ELF::STT_COMMON || st_shndx == ELF::SHN_COMMON; } - bool isDefined() const { - return !isUndefined() && - !(st_shndx >= ELF::SHN_LORESERVE && st_shndx < ELF::SHN_ABS); - } + bool isDefined() const { return !isUndefined(); } bool isProcessorSpecific() const { return st_shndx >= ELF::SHN_LOPROC && st_shndx <= ELF::SHN_HIPROC; } @@ -193,7 +192,9 @@ struct Elf_Sym_Impl : Elf_Sym_Base<ELFT> { return st_shndx >= ELF::SHN_LOOS && st_shndx <= ELF::SHN_HIOS; } bool isReserved() const { - return st_shndx > ELF::SHN_HIOS && st_shndx < ELF::SHN_ABS; + // ELF::SHN_HIRESERVE is 0xffff so st_shndx <= ELF::SHN_HIRESERVE is always + // true and some compilers warn about it. + return st_shndx >= ELF::SHN_LORESERVE; } bool isUndefined() const { return st_shndx == ELF::SHN_UNDEF; } }; diff --git a/include/llvm/Object/IRObjectFile.h b/include/llvm/Object/IRObjectFile.h index ef65528..f713570 100644 --- a/include/llvm/Object/IRObjectFile.h +++ b/include/llvm/Object/IRObjectFile.h @@ -68,7 +68,7 @@ public: static ErrorOr<std::unique_ptr<IRObjectFile>> create(MemoryBufferRef Object, LLVMContext &Context); }; -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index b163534..4350a75 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -236,7 +236,7 @@ public: std::error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const override; symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; - section_iterator getRelocationSection(DataRefImpl Rel) const override; + section_iterator getRelocationSection(DataRefImpl Rel) const; std::error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const override; std::error_code @@ -503,8 +503,8 @@ inline const ObjectFile *DiceRef::getObjectFile() const { return OwningObject; } -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h index 05119b2..ebc8b90 100644 --- a/include/llvm/Object/MachOUniversal.h +++ b/include/llvm/Object/MachOUniversal.h @@ -112,7 +112,7 @@ public: getObjectForArch(Triple::ArchType Arch) const; }; -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index a1ae19e..e00fe0e 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -53,7 +53,6 @@ public: std::error_code getAddress(uint64_t &Result) const; std::error_code getOffset(uint64_t &Result) const; symbol_iterator getSymbol() const; - section_iterator getSection() const; std::error_code getType(uint64_t &Result) const; /// @brief Indicates whether this relocation should hidden when listing @@ -241,7 +240,6 @@ protected: virtual std::error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const = 0; virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const = 0; - virtual section_iterator getRelocationSection(DataRefImpl Rel) const = 0; virtual std::error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const = 0; virtual std::error_code @@ -459,10 +457,6 @@ inline symbol_iterator RelocationRef::getSymbol() const { return OwningObject->getRelocationSymbol(RelocationPimpl); } -inline section_iterator RelocationRef::getSection() const { - return OwningObject->getRelocationSection(RelocationPimpl); -} - inline std::error_code RelocationRef::getType(uint64_t &Result) const { return OwningObject->getRelocationType(RelocationPimpl, Result); } diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 02ffda5..f80ee0a 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -239,36 +239,13 @@ private: return RelocToApply(); } - int64_t getELFAddend32LE(RelocationRef R) { - const ELF32LEObjectFile *Obj = cast<ELF32LEObjectFile>(R.getObjectFile()); + int64_t getELFAddend(RelocationRef R) { + const auto *Obj = cast<ELFObjectFileBase>(R.getObjectFile()); DataRefImpl DRI = R.getRawDataRefImpl(); - int64_t Addend; - Obj->getRelocationAddend(DRI, Addend); - return Addend; - } - - int64_t getELFAddend64LE(RelocationRef R) { - const ELF64LEObjectFile *Obj = cast<ELF64LEObjectFile>(R.getObjectFile()); - DataRefImpl DRI = R.getRawDataRefImpl(); - int64_t Addend; - Obj->getRelocationAddend(DRI, Addend); - return Addend; - } - - int64_t getELFAddend32BE(RelocationRef R) { - const ELF32BEObjectFile *Obj = cast<ELF32BEObjectFile>(R.getObjectFile()); - DataRefImpl DRI = R.getRawDataRefImpl(); - int64_t Addend; - Obj->getRelocationAddend(DRI, Addend); - return Addend; - } - - int64_t getELFAddend64BE(RelocationRef R) { - const ELF64BEObjectFile *Obj = cast<ELF64BEObjectFile>(R.getObjectFile()); - DataRefImpl DRI = R.getRawDataRefImpl(); - int64_t Addend; - Obj->getRelocationAddend(DRI, Addend); - return Addend; + ErrorOr<int64_t> AddendOrErr = Obj->getRelocationAddend(DRI); + if (std::error_code EC = AddendOrErr.getError()) + report_fatal_error(EC.message()); + return *AddendOrErr; } uint8_t getLengthMachO64(RelocationRef R) { @@ -286,15 +263,13 @@ private: // Ideally the Addend here will be the addend in the data for // the relocation. It's not actually the case for Rel relocations. RelocToApply visitELF_386_32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend32LE(R); - return RelocToApply(Value + Addend, 4); + return RelocToApply(Value, 4); } RelocToApply visitELF_386_PC32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend32LE(R); uint64_t Address; R.getOffset(Address); - return RelocToApply(Value + Addend - Address, 4); + return RelocToApply(Value - Address, 4); } /// X86-64 ELF @@ -302,65 +277,59 @@ private: return RelocToApply(0, 0); } RelocToApply visitELF_X86_64_64(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64LE(R); + int64_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 8); } RelocToApply visitELF_X86_64_PC32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64LE(R); + int64_t Addend = getELFAddend(R); uint64_t Address; R.getOffset(Address); return RelocToApply(Value + Addend - Address, 4); } RelocToApply visitELF_X86_64_32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64LE(R); + int64_t Addend = getELFAddend(R); uint32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } RelocToApply visitELF_X86_64_32S(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64LE(R); + int64_t Addend = getELFAddend(R); int32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } /// PPC64 ELF RelocToApply visitELF_PPC64_ADDR32(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); + int64_t Addend = getELFAddend(R); uint32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } RelocToApply visitELF_PPC64_ADDR64(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); + int64_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 8); } /// PPC32 ELF RelocToApply visitELF_PPC_ADDR32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend32BE(R); + int64_t Addend = getELFAddend(R); uint32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } /// MIPS ELF RelocToApply visitELF_MIPS_32(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); - uint32_t Res = (Value + Addend) & 0xFFFFFFFF; + uint32_t Res = (Value)&0xFFFFFFFF; return RelocToApply(Res, 4); } RelocToApply visitELF_MIPS_64(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); + int64_t Addend = getELFAddend(R); uint64_t Res = (Value + Addend); return RelocToApply(Res, 8); } // AArch64 ELF RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); + int64_t Addend = getELFAddend(R); int64_t Res = Value + Addend; // Overflow check allows for both signed and unsigned interpretation. @@ -371,14 +340,13 @@ private: } RelocToApply visitELF_AARCH64_ABS64(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); + int64_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 8); } // SystemZ ELF RelocToApply visitELF_390_32(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64BE(R); + int64_t Addend = getELFAddend(R); int64_t Res = Value + Addend; // Overflow check allows for both signed and unsigned interpretation. @@ -389,29 +357,27 @@ private: } RelocToApply visitELF_390_64(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64BE(R); + int64_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 8); } RelocToApply visitELF_SPARC_32(RelocationRef R, uint32_t Value) { - int32_t Addend = getELFAddend32BE(R); + int32_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 4); } RelocToApply visitELF_SPARCV9_32(RelocationRef R, uint64_t Value) { - int32_t Addend = getELFAddend64BE(R); + int32_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 4); } RelocToApply visitELF_SPARCV9_64(RelocationRef R, uint64_t Value) { - int64_t Addend = getELFAddend64BE(R); + int64_t Addend = getELFAddend(R); return RelocToApply(Value + Addend, 8); } RelocToApply visitELF_ARM_ABS32(RelocationRef R, uint64_t Value) { - int64_t Addend; - getELFRelocationAddend(R, Addend); - int64_t Res = Value + Addend; + int64_t Res = Value; // Overflow check allows for both signed and unsigned interpretation. if (Res < INT32_MIN || Res > UINT32_MAX) @@ -446,6 +412,6 @@ private: } }; -} -} +} // namespace object +} // namespace llvm #endif diff --git a/include/llvm/Object/SymbolicFile.h b/include/llvm/Object/SymbolicFile.h index 2bfff4c..bf46599 100644 --- a/include/llvm/Object/SymbolicFile.h +++ b/include/llvm/Object/SymbolicFile.h @@ -195,7 +195,7 @@ inline const SymbolicFile *BasicSymbolRef::getObject() const { return OwningObject; } -} -} +} // namespace object +} // namespace llvm #endif |