[llvm-commits] [llvm] r160183 - in /llvm/trunk: lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp test/MC/Mips/r-mips-got-disp.ll

Jack Carter jcarter at mips.com
Fri Jul 13 12:15:47 PDT 2012


Author: jacksprat
Date: Fri Jul 13 14:15:47 2012
New Revision: 160183

URL: http://llvm.org/viewvc/llvm-project?rev=160183&view=rev
Log:
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.

Added:
    llvm/trunk/test/MC/Mips/r-mips-got-disp.ll
Modified:
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=160183&r1=160182&r2=160183&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp Fri Jul 13 14:15:47 2012
@@ -40,6 +40,7 @@
   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 @@
       { "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)

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp?rev=160183&r1=160182&r2=160183&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp Fri Jul 13 14:15:47 2012
@@ -156,6 +156,9 @@
   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);

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h?rev=160183&r1=160182&r2=160183&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h Fri Jul 13 14:15:47 2012
@@ -107,6 +107,9 @@
     // 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

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp?rev=160183&r1=160182&r2=160183&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp Fri Jul 13 14:15:47 2012
@@ -201,9 +201,6 @@
   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 @@
   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;

Added: llvm/trunk/test/MC/Mips/r-mips-got-disp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/r-mips-got-disp.ll?rev=160183&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/r-mips-got-disp.ll (added)
+++ llvm/trunk/test/MC/Mips/r-mips-got-disp.ll Fri Jul 13 14:15:47 2012
@@ -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)
+
+ at shl = global i64 1, align 8
+ at .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
+





More information about the llvm-commits mailing list