mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Mips relocations R_MIPS_HIGHER and R_MIPS_HIGHEST.
These 2 relocations gain access to the highest and the second highest 16 bits of a 64 bit object. R_MIPS_HIGHER %higher(A+S) The %higher(x) function is [ (((long long) x + 0x80008000LL) >> 32) & 0xffff ]. R_MIPS_HIGHEST %highest(A+S) The %highest(x) function is [ (((long long) x + 0x800080008000LL) >> 48) & 0xffff ]. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161348 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f45717e985
commit
fc54d9e47a
@ -59,9 +59,17 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
|
|||||||
break;
|
break;
|
||||||
case Mips::fixup_Mips_HI16:
|
case Mips::fixup_Mips_HI16:
|
||||||
case Mips::fixup_Mips_GOT_Local:
|
case Mips::fixup_Mips_GOT_Local:
|
||||||
// Get the higher 16-bits. Also add 1 if bit 15 is 1.
|
// Get the 2nd 16-bits. Also add 1 if bit 15 is 1.
|
||||||
Value = ((Value + 0x8000) >> 16) & 0xffff;
|
Value = ((Value + 0x8000) >> 16) & 0xffff;
|
||||||
break;
|
break;
|
||||||
|
case Mips::fixup_Mips_HIGHER:
|
||||||
|
// Get the 3rd 16-bits.
|
||||||
|
Value = ((Value + 0x80008000LL) >> 32) & 0xffff;
|
||||||
|
break;
|
||||||
|
case Mips::fixup_Mips_HIGHEST:
|
||||||
|
// Get the 4th 16-bits.
|
||||||
|
Value = ((Value + 0x800080008000LL) >> 48) & 0xffff;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Value;
|
return Value;
|
||||||
@ -168,7 +176,9 @@ public:
|
|||||||
{ "fixup_Mips_GPOFF_LO", 0, 16, 0 },
|
{ "fixup_Mips_GPOFF_LO", 0, 16, 0 },
|
||||||
{ "fixup_Mips_GOT_PAGE", 0, 16, 0 },
|
{ "fixup_Mips_GOT_PAGE", 0, 16, 0 },
|
||||||
{ "fixup_Mips_GOT_OFST", 0, 16, 0 },
|
{ "fixup_Mips_GOT_OFST", 0, 16, 0 },
|
||||||
{ "fixup_Mips_GOT_DISP", 0, 16, 0 }
|
{ "fixup_Mips_GOT_DISP", 0, 16, 0 },
|
||||||
|
{ "fixup_Mips_HIGHER", 0, 16, 0 },
|
||||||
|
{ "fixup_Mips_HIGHEST", 0, 16, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Kind < FirstTargetFixupKind)
|
if (Kind < FirstTargetFixupKind)
|
||||||
|
@ -169,6 +169,12 @@ unsigned MipsELFObjectWriter::GetRelocType(const MCValue &Target,
|
|||||||
Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type);
|
Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type);
|
||||||
Type = setRType3((unsigned)ELF::R_MIPS_LO16, Type);
|
Type = setRType3((unsigned)ELF::R_MIPS_LO16, Type);
|
||||||
break;
|
break;
|
||||||
|
case Mips::fixup_Mips_HIGHER:
|
||||||
|
Type = ELF::R_MIPS_HIGHER;
|
||||||
|
break;
|
||||||
|
case Mips::fixup_Mips_HIGHEST:
|
||||||
|
Type = ELF::R_MIPS_HIGHEST;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return Type;
|
return Type;
|
||||||
}
|
}
|
||||||
|
@ -110,6 +110,12 @@ namespace Mips {
|
|||||||
// resulting in - R_MIPS_GOT_DISP
|
// resulting in - R_MIPS_GOT_DISP
|
||||||
fixup_Mips_GOT_DISP,
|
fixup_Mips_GOT_DISP,
|
||||||
|
|
||||||
|
// resulting in - R_MIPS_GOT_HIGHER
|
||||||
|
fixup_Mips_HIGHER,
|
||||||
|
|
||||||
|
// resulting in - R_MIPS_HIGHEST
|
||||||
|
fixup_Mips_HIGHEST,
|
||||||
|
|
||||||
// Marker
|
// Marker
|
||||||
LastTargetFixupKind,
|
LastTargetFixupKind,
|
||||||
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
||||||
|
@ -255,6 +255,12 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
|||||||
case MCSymbolRefExpr::VK_Mips_TPREL_LO:
|
case MCSymbolRefExpr::VK_Mips_TPREL_LO:
|
||||||
FixupKind = Mips::fixup_Mips_TPREL_LO;
|
FixupKind = Mips::fixup_Mips_TPREL_LO;
|
||||||
break;
|
break;
|
||||||
|
case MCSymbolRefExpr::VK_Mips_HIGHER:
|
||||||
|
FixupKind = Mips::fixup_Mips_HIGHER;
|
||||||
|
break;
|
||||||
|
case MCSymbolRefExpr::VK_Mips_HIGHEST:
|
||||||
|
FixupKind = Mips::fixup_Mips_HIGHEST;
|
||||||
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
|
|
||||||
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), MCFixupKind(FixupKind)));
|
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), MCFixupKind(FixupKind)));
|
||||||
|
27
test/MC/Mips/higher_highest.ll
Normal file
27
test/MC/Mips/higher_highest.ll
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
; RUN: llc -march=mips64el -mcpu=mips64 -mattr=n64 -force-mips-long-branch -filetype=obj < %s -o - | elf-dump --dump-section-data | FileCheck %s
|
||||||
|
|
||||||
|
; Check that the R_MIPS_HIGHER and R_MIPS_HIGHEST relocations were created.
|
||||||
|
|
||||||
|
; CHECK: ('r_type', 0x1d)
|
||||||
|
; CHECK: ('r_type', 0x1d)
|
||||||
|
; CHECK: ('r_type', 0x1c)
|
||||||
|
; CHECK: ('r_type', 0x1c)
|
||||||
|
|
||||||
|
@g0 = external global i32
|
||||||
|
|
||||||
|
define void @foo1(i32 %s) nounwind {
|
||||||
|
entry:
|
||||||
|
|
||||||
|
%tobool = icmp eq i32 %s, 0
|
||||||
|
br i1 %tobool, label %if.end, label %if.then
|
||||||
|
|
||||||
|
if.then: ; preds = %entry
|
||||||
|
%0 = load i32* @g0, align 4
|
||||||
|
%add = add nsw i32 %0, 12
|
||||||
|
store i32 %add, i32* @g0, align 4
|
||||||
|
br label %if.end
|
||||||
|
|
||||||
|
if.end: ; preds = %entry, %if.then
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user