| //===--------- lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h ---------------===// |
| // |
| // The LLVM Linker |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLD_READER_WRITER_ELF_ARM_ARM_LINKING_CONTEXT_H |
| #define LLD_READER_WRITER_ELF_ARM_ARM_LINKING_CONTEXT_H |
| |
| #include "lld/ReaderWriter/ELFLinkingContext.h" |
| #include "llvm/Object/ELF.h" |
| #include "llvm/Support/ELF.h" |
| |
| namespace lld { |
| namespace elf { |
| |
| class ARMLinkingContext final : public ELFLinkingContext { |
| public: |
| int getMachineType() const override { return llvm::ELF::EM_ARM; } |
| ARMLinkingContext(llvm::Triple); |
| |
| void addPasses(PassManager &) override; |
| void registerRelocationNames(Registry &r) override; |
| |
| bool isRelaOutputFormat() const override { return false; } |
| |
| uint64_t getBaseAddress() const override { |
| if (_baseAddress == 0) |
| return 0x400000; |
| return _baseAddress; |
| } |
| |
| bool isDynamicRelocation(const Reference &r) const override { |
| if (r.kindNamespace() != Reference::KindNamespace::ELF) |
| return false; |
| assert(r.kindArch() == Reference::KindArch::ARM); |
| switch (r.kindValue()) { |
| case llvm::ELF::R_ARM_GLOB_DAT: |
| case llvm::ELF::R_ARM_TLS_TPOFF32: |
| case llvm::ELF::R_ARM_COPY: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool isCopyRelocation(const Reference &r) const override { |
| if (r.kindNamespace() != Reference::KindNamespace::ELF) |
| return false; |
| assert(r.kindArch() == Reference::KindArch::ARM); |
| return r.kindValue() == llvm::ELF::R_ARM_COPY; |
| } |
| |
| bool isPLTRelocation(const Reference &r) const override { |
| if (r.kindNamespace() != Reference::KindNamespace::ELF) |
| return false; |
| assert(r.kindArch() == Reference::KindArch::ARM); |
| switch (r.kindValue()) { |
| case llvm::ELF::R_ARM_JUMP_SLOT: |
| case llvm::ELF::R_ARM_IRELATIVE: |
| return true; |
| default: |
| return false; |
| } |
| } |
| }; |
| |
| // Special methods to check code model of atoms. |
| bool isARMCode(const DefinedAtom *atom); |
| bool isARMCode(DefinedAtom::CodeModel codeModel); |
| bool isThumbCode(const DefinedAtom *atom); |
| bool isThumbCode(DefinedAtom::CodeModel codeModel); |
| |
| } // end namespace elf |
| } // end namespace lld |
| |
| #endif |