summaryrefslogtreecommitdiff
path: root/bolt/lib
diff options
context:
space:
mode:
authorAmir Ayupov <aaupov@fb.com>2023-03-14 17:29:23 -0700
committerAmir Ayupov <aaupov@fb.com>2023-03-14 17:34:25 -0700
commitedda85771a5cbcc99920908774a93199677f659f (patch)
tree6ce21e42e0c44ad0d5b61bc9ee7d86bcde2fe6ac /bolt/lib
parentcb45be2b4f62f93493db9c95c66b452b2faa178f (diff)
downloadllvm-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.cpp16
-rw-r--r--bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp46
-rw-r--r--bolt/lib/Target/X86/X86MCPlusBuilder.cpp23
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 {