summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2015-11-17 20:08:31 +0000
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2015-11-17 20:08:31 +0000
commit36b8626b0067a0ee2893377a0caccd50fc6dd741 (patch)
treecbf6afaf42159f2775bd4321e3ba9fbe63f359a9
parent0dd18316fd75a0a5f7610cf5015f226a4fcfb9b8 (diff)
downloadbcm5719-llvm-36b8626b0067a0ee2893377a0caccd50fc6dd741.tar.gz
bcm5719-llvm-36b8626b0067a0ee2893377a0caccd50fc6dd741.zip
[RuntimeDyld] Fix resolving R_PPC64_REL24 relocations
When resolving R_PPC64_REL24, code used to check for an address delta that fits in 24 bits, while the instructions that take this relocation actually can process address deltas that fit into *26* bits (as those instructions have a 24 bit field, but implicitly append two zero bits at the end since all instruction addresses are a multiple of 4). This means that code would signal overflow once a single object's text section exceeds 8 MB, while we can actually support up to 32 MB. Partially fixes PR25540. llvm-svn: 253369
-rw-r--r--llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
index 5358f58e622..6576eb1dad3 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
@@ -983,7 +983,7 @@ void RuntimeDyldELF::resolvePPC64Relocation(const SectionEntry &Section,
case ELF::R_PPC64_REL24: {
uint64_t FinalAddress = (Section.LoadAddress + Offset);
int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend);
- if (SignExtend32<24>(delta) != delta)
+ if (SignExtend32<26>(delta) != delta)
llvm_unreachable("Relocation R_PPC64_REL24 overflow");
// Generates a 'bl <address>' instruction
writeInt32BE(LocalAddress, 0x48000001 | (delta & 0x03FFFFFC));
@@ -1443,8 +1443,8 @@ relocation_iterator RuntimeDyldELF::processRelocationRef(
}
uint8_t *RelocTarget = Sections[Value.SectionID].Address + Value.Addend;
int32_t delta = static_cast<int32_t>(Target - RelocTarget);
- // If it is within 24-bits branch range, just set the branch target
- if (SignExtend32<24>(delta) == delta) {
+ // If it is within 26-bits branch range, just set the branch target
+ if (SignExtend32<26>(delta) == delta) {
RelocationEntry RE(SectionID, Offset, RelType, Value.Addend);
if (Value.SymbolName)
addRelocationForSymbol(RE, Value.SymbolName);
OpenPOWER on IntegriCloud