Skip to content

Commit

Permalink
Mips relocations R_MIPS_HIGHER and R_MIPS_HIGHEST.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Jack Carter committed Aug 6, 2012
1 parent f45717e commit fc54d9e
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,17 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
break;
case Mips::fixup_Mips_HI16:
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;
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;
Expand Down Expand Up @@ -168,7 +176,9 @@ class MipsAsmBackend : public MCAsmBackend {
{ "fixup_Mips_GPOFF_LO", 0, 16, 0 },
{ "fixup_Mips_GOT_PAGE", 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)
Expand Down
6 changes: 6 additions & 0 deletions lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,12 @@ unsigned MipsELFObjectWriter::GetRelocType(const MCValue &Target,
Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type);
Type = setRType3((unsigned)ELF::R_MIPS_LO16, Type);
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;
}
Expand Down
6 changes: 6 additions & 0 deletions lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ namespace Mips {
// resulting in - R_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
LastTargetFixupKind,
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
Expand Down
6 changes: 6 additions & 0 deletions lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,12 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
case MCSymbolRefExpr::VK_Mips_TPREL_LO:
FixupKind = Mips::fixup_Mips_TPREL_LO;
break;
case MCSymbolRefExpr::VK_Mips_HIGHER:
FixupKind = Mips::fixup_Mips_HIGHER;
break;
case MCSymbolRefExpr::VK_Mips_HIGHEST:
FixupKind = Mips::fixup_Mips_HIGHEST;
break;
} // switch

Fixups.push_back(MCFixup::Create(0, MO.getExpr(), MCFixupKind(FixupKind)));
Expand Down
27 changes: 27 additions & 0 deletions test/MC/Mips/higher_highest.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit fc54d9e

Please sign in to comment.