mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
[mips64] Emit correct addend for some PC-relative relocations
So far, LLVM has not emitted correct addend for N64 and N32 ABI. This patch fixes that. It also removes fixup from MCJIT for R_MIPS_PC16 relocation. Patch by Vladimir Radosavljevic. Differential Revision: http://reviews.llvm.org/D10565 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240404 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -59,10 +59,6 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
|
||||
case Mips::fixup_MIPS_PCLO16:
|
||||
break;
|
||||
case Mips::fixup_Mips_PC16:
|
||||
// So far we are only using this type for branches.
|
||||
// For branches we start 1 instruction after the branch
|
||||
// so the displacement will be one instruction size less.
|
||||
Value -= 4;
|
||||
// The displacement is then divided by 4 to give us an 18 bit
|
||||
// address range. Forcing a signed division because Value can be negative.
|
||||
Value = (int64_t)Value / 4;
|
||||
@@ -135,7 +131,6 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
|
||||
Ctx->reportFatalError(Fixup.getLoc(), "out of range PC18 fixup");
|
||||
break;
|
||||
case Mips::fixup_MIPS_PC21_S2:
|
||||
Value -= 4;
|
||||
// Forcing a signed division because Value can be negative.
|
||||
Value = (int64_t) Value / 4;
|
||||
// We now check if Value can be encoded as a 21-bit signed immediate.
|
||||
@@ -143,7 +138,6 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
|
||||
Ctx->reportFatalError(Fixup.getLoc(), "out of range PC21 fixup");
|
||||
break;
|
||||
case Mips::fixup_MIPS_PC26_S2:
|
||||
Value -= 4;
|
||||
// Forcing a signed division because Value can be negative.
|
||||
Value = (int64_t) Value / 4;
|
||||
// We now check if Value can be encoded as a 26-bit signed immediate.
|
||||
|
||||
@@ -226,8 +226,9 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
|
||||
assert(MO.isExpr() &&
|
||||
"getBranchTargetOpValue expects only expressions or immediates");
|
||||
|
||||
const MCExpr *Expr = MO.getExpr();
|
||||
Fixups.push_back(MCFixup::create(0, Expr,
|
||||
const MCExpr *FixupExpression = MCBinaryExpr::createAdd(
|
||||
MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx);
|
||||
Fixups.push_back(MCFixup::create(0, FixupExpression,
|
||||
MCFixupKind(Mips::fixup_Mips_PC16)));
|
||||
return 0;
|
||||
}
|
||||
@@ -315,8 +316,9 @@ getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo,
|
||||
assert(MO.isExpr() &&
|
||||
"getBranchTarget21OpValue expects only expressions or immediates");
|
||||
|
||||
const MCExpr *Expr = MO.getExpr();
|
||||
Fixups.push_back(MCFixup::create(0, Expr,
|
||||
const MCExpr *FixupExpression = MCBinaryExpr::createAdd(
|
||||
MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx);
|
||||
Fixups.push_back(MCFixup::create(0, FixupExpression,
|
||||
MCFixupKind(Mips::fixup_MIPS_PC21_S2)));
|
||||
return 0;
|
||||
}
|
||||
@@ -337,8 +339,9 @@ getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo,
|
||||
assert(MO.isExpr() &&
|
||||
"getBranchTarget26OpValue expects only expressions or immediates");
|
||||
|
||||
const MCExpr *Expr = MO.getExpr();
|
||||
Fixups.push_back(MCFixup::create(0, Expr,
|
||||
const MCExpr *FixupExpression = MCBinaryExpr::createAdd(
|
||||
MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx);
|
||||
Fixups.push_back(MCFixup::create(0, FixupExpression,
|
||||
MCFixupKind(Mips::fixup_MIPS_PC26_S2)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user