diff options
author | Amir Ayupov <aaupov@fb.com> | 2023-03-14 17:29:23 -0700 |
---|---|---|
committer | Amir Ayupov <aaupov@fb.com> | 2023-03-14 17:34:25 -0700 |
commit | edda85771a5cbcc99920908774a93199677f659f (patch) | |
tree | 6ce21e42e0c44ad0d5b61bc9ee7d86bcde2fe6ac /bolt/lib | |
parent | cb45be2b4f62f93493db9c95c66b452b2faa178f (diff) | |
download | llvm-edda85771a5cbcc99920908774a93199677f659f.tar.gz |
[BOLT][NFC] Move addRelocation{X86,AArch64} into MCPlusBuilder
The two methods don't belong in BinaryFunction methods.
Move the dispatch tables into target-specific MCPlusBuilder methods.
Reviewed By: rafauler
Differential Revision: https://reviews.llvm.org/D131813
Diffstat (limited to 'bolt/lib')
-rw-r--r-- | bolt/lib/Core/BinaryFunction.cpp | 16 | ||||
-rw-r--r-- | bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp | 46 | ||||
-rw-r--r-- | bolt/lib/Target/X86/X86MCPlusBuilder.cpp | 23 |
3 files changed, 85 insertions, 0 deletions
diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp index 3bfcfc046d8e..e91eb10a85a4 100644 --- a/bolt/lib/Core/BinaryFunction.cpp +++ b/bolt/lib/Core/BinaryFunction.cpp @@ -4517,5 +4517,21 @@ bool BinaryFunction::isAArch64Veneer() const { return true; } +void BinaryFunction::addRelocation(uint64_t Address, MCSymbol *Symbol, + uint64_t RelType, uint64_t Addend, + uint64_t Value) { + assert(Address >= getAddress() && Address < getAddress() + getMaxSize() && + "address is outside of the function"); + uint64_t Offset = Address - getAddress(); + LLVM_DEBUG(dbgs() << "BOLT-DEBUG: addRelocation in " + << formatv("{0}@{1:x} against {2}\n", this, Offset, + Symbol->getName())); + bool IsCI = BC.isAArch64() && isInConstantIsland(Address); + std::map<uint64_t, Relocation> &Rels = + IsCI ? Islands->Relocations : Relocations; + if (BC.MIB->shouldRecordCodeRelocation(RelType)) + Rels[Offset] = Relocation{Offset, Symbol, RelType, Addend, Value}; +} + } // namespace bolt } // namespace llvm diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index 309de84618ba..ec9f78d48981 100644 --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -1089,6 +1089,52 @@ public: return true; } + bool shouldRecordCodeRelocation(uint64_t RelType) const override { + switch (RelType) { + case ELF::R_AARCH64_ABS64: + case ELF::R_AARCH64_ABS32: + case ELF::R_AARCH64_ABS16: + case ELF::R_AARCH64_ADD_ABS_LO12_NC: + case ELF::R_AARCH64_ADR_GOT_PAGE: + case ELF::R_AARCH64_ADR_PREL_LO21: + case ELF::R_AARCH64_ADR_PREL_PG_HI21: + case ELF::R_AARCH64_ADR_PREL_PG_HI21_NC: + case ELF::R_AARCH64_LD64_GOT_LO12_NC: + case ELF::R_AARCH64_LDST8_ABS_LO12_NC: + case ELF::R_AARCH64_LDST16_ABS_LO12_NC: + case ELF::R_AARCH64_LDST32_ABS_LO12_NC: + case ELF::R_AARCH64_LDST64_ABS_LO12_NC: + case ELF::R_AARCH64_LDST128_ABS_LO12_NC: + case ELF::R_AARCH64_TLSDESC_ADD_LO12: + case ELF::R_AARCH64_TLSDESC_ADR_PAGE21: + case ELF::R_AARCH64_TLSDESC_ADR_PREL21: + case ELF::R_AARCH64_TLSDESC_LD64_LO12: + case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case ELF::R_AARCH64_MOVW_UABS_G0: + case ELF::R_AARCH64_MOVW_UABS_G0_NC: + case ELF::R_AARCH64_MOVW_UABS_G1: + case ELF::R_AARCH64_MOVW_UABS_G1_NC: + case ELF::R_AARCH64_MOVW_UABS_G2: + case ELF::R_AARCH64_MOVW_UABS_G2_NC: + case ELF::R_AARCH64_MOVW_UABS_G3: + case ELF::R_AARCH64_PREL16: + case ELF::R_AARCH64_PREL32: + case ELF::R_AARCH64_PREL64: + return true; + case ELF::R_AARCH64_CALL26: + case ELF::R_AARCH64_JUMP26: + case ELF::R_AARCH64_TSTBR14: + case ELF::R_AARCH64_CONDBR19: + case ELF::R_AARCH64_TLSDESC_CALL: + case ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12: + case ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + return false; + default: + llvm_unreachable("Unexpected AArch64 relocation type in code"); + } + } + bool createReturn(MCInst &Inst) const override { Inst.setOpcode(AArch64::RET); Inst.clear(); diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp index dbbc6888feaf..ad80255dcf35 100644 --- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp +++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp @@ -388,6 +388,29 @@ public: return (Desc.TSFlags & X86II::OpPrefixMask) == X86II::PD; } + bool shouldRecordCodeRelocation(uint64_t RelType) const override { + switch (RelType) { + case ELF::R_X86_64_8: + case ELF::R_X86_64_16: + case ELF::R_X86_64_32: + case ELF::R_X86_64_32S: + case ELF::R_X86_64_64: + case ELF::R_X86_64_PC8: + case ELF::R_X86_64_PC32: + case ELF::R_X86_64_PC64: + case ELF::R_X86_64_GOTPCRELX: + case ELF::R_X86_64_REX_GOTPCRELX: + return true; + case ELF::R_X86_64_PLT32: + case ELF::R_X86_64_GOTPCREL: + case ELF::R_X86_64_TPOFF32: + case ELF::R_X86_64_GOTTPOFF: + return false; + default: + llvm_unreachable("Unexpected x86 relocation type in code"); + } + } + unsigned getTrapFillValue() const override { return 0xCC; } struct IndJmpMatcherFrag1 : MCInstMatcher { |