mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
The Mips specific relocation R_MIPS_GOT_DISP
is used in cases where global symbols are directly represented in the GOT and we use an offset into the global offset table. This patch adds direct object support for R_MIPS_GOT_DISP. llvm-svn: 160183
This commit is contained in:
parent
d4d064d1da
commit
b8e3cf5fbc
@ -40,6 +40,7 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
|
||||
case Mips::fixup_Mips_GPOFF_LO:
|
||||
case Mips::fixup_Mips_GOT_PAGE:
|
||||
case Mips::fixup_Mips_GOT_OFST:
|
||||
case Mips::fixup_Mips_GOT_DISP:
|
||||
break;
|
||||
case Mips::fixup_Mips_PC16:
|
||||
// So far we are only using this type for branches.
|
||||
@ -166,7 +167,8 @@ public:
|
||||
{ "fixup_Mips_GPOFF_HI", 0, 16, 0 },
|
||||
{ "fixup_Mips_GPOFF_LO", 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 }
|
||||
};
|
||||
|
||||
if (Kind < FirstTargetFixupKind)
|
||||
|
@ -156,6 +156,9 @@ unsigned MipsELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
case Mips::fixup_Mips_GOT_OFST:
|
||||
Type = ELF::R_MIPS_GOT_OFST;
|
||||
break;
|
||||
case Mips::fixup_Mips_GOT_DISP:
|
||||
Type = ELF::R_MIPS_GOT_DISP;
|
||||
break;
|
||||
case Mips::fixup_Mips_GPOFF_HI:
|
||||
Type = setRType((unsigned)ELF::R_MIPS_GPREL16, Type);
|
||||
Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type);
|
||||
|
@ -107,6 +107,9 @@ namespace Mips {
|
||||
// resulting in - R_MIPS_GOT_OFST
|
||||
fixup_Mips_GOT_OFST,
|
||||
|
||||
// resulting in - R_MIPS_GOT_DISP
|
||||
fixup_Mips_GOT_DISP,
|
||||
|
||||
// Marker
|
||||
LastTargetFixupKind,
|
||||
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
||||
|
@ -201,9 +201,6 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
||||
switch(cast<MCSymbolRefExpr>(Expr)->getKind()) {
|
||||
default: llvm_unreachable("Unknown fixup kind!");
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_DISP :
|
||||
llvm_unreachable("fixup kind VK_Mips_GOT_DISP not supported for direct object!");
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPOFF_HI :
|
||||
FixupKind = Mips::fixup_Mips_GPOFF_HI;
|
||||
break;
|
||||
@ -216,6 +213,9 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_OFST :
|
||||
FixupKind = Mips::fixup_Mips_GOT_OFST;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_DISP :
|
||||
FixupKind = Mips::fixup_Mips_GOT_DISP;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPREL:
|
||||
FixupKind = Mips::fixup_Mips_GPREL16;
|
||||
break;
|
||||
|
18
test/MC/Mips/r-mips-got-disp.ll
Normal file
18
test/MC/Mips/r-mips-got-disp.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 < %s -o - | elf-dump --dump-section-data | FileCheck %s
|
||||
|
||||
; Check that the R_MIPS_GOT_DISP relocations were created.
|
||||
|
||||
; CHECK: ('r_type', 0x13)
|
||||
|
||||
@shl = global i64 1, align 8
|
||||
@.str = private unnamed_addr constant [8 x i8] c"0x%llx\0A\00", align 1
|
||||
|
||||
define i32 @main() nounwind {
|
||||
entry:
|
||||
%0 = load i64* @shl, align 8
|
||||
%call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i64 0, i64 0), i64 %0) nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @printf(i8* nocapture, ...) nounwind
|
||||
|
Loading…
x
Reference in New Issue
Block a user