[BOLT][AARCH64] Skip R_AARCH64_LD_PREL_LO19 relocation

Supress failed to analyze relocations warning for R_AARCH64_LD_PREL_LO19
relocation. This relocation is mostly used to get value stored in CI and
we don't process it since we are caluclating target address using the
instruction value in evaluateMemOperandTarget().

Differential Revision: https://reviews.llvm.org/D127413
This commit is contained in:
Vladislav Khmelevsky 2022-06-09 19:00:24 +03:00
parent 93b4a41b55
commit 6e26ffa064
3 changed files with 17 additions and 2 deletions

View File

@ -55,7 +55,10 @@ struct Relocation {
/// Return size of this relocation.
size_t getSize() const { return getSizeForType(Type); }
/// Handle special cases when relocation should not be processed by bolt
/// Skip relocations that we don't want to handle in BOLT
static bool skipRelocationType(uint64_t Type);
/// Handle special cases when relocation should not be processed by BOLT
static bool skipRelocationProcess(uint64_t Type, uint64_t Contents);
// Adjust value depending on relocation type (make it PC relative or not)

View File

@ -165,6 +165,12 @@ size_t getSizeForTypeAArch64(uint64_t Type) {
}
}
bool skipRelocationTypeX86(uint64_t Type) { return Type == ELF::R_X86_64_NONE; }
bool skipRelocationTypeAArch64(uint64_t Type) {
return Type == ELF::R_AARCH64_NONE || Type == ELF::R_AARCH64_LD_PREL_LO19;
}
bool skipRelocationProcessX86(uint64_t Type, uint64_t Contents) {
return false;
}
@ -536,6 +542,12 @@ size_t Relocation::getSizeForType(uint64_t Type) {
return getSizeForTypeX86(Type);
}
bool Relocation::skipRelocationType(uint64_t Type) {
if (Arch == Triple::aarch64)
return skipRelocationTypeAArch64(Type);
return skipRelocationTypeX86(Type);
}
bool Relocation::skipRelocationProcess(uint64_t Type, uint64_t Contents) {
if (Arch == Triple::aarch64)
return skipRelocationProcessAArch64(Type, Contents);

View File

@ -2332,7 +2332,7 @@ void RewriteInstance::readRelocations(const SectionRef &Section) {
SmallString<16> TypeName;
Rel.getTypeName(TypeName);
uint64_t RType = Rel.getType();
if (Relocation::isNone(RType))
if (Relocation::skipRelocationType(RType))
continue;
// Adjust the relocation type as the linker might have skewed it.