This is the first of several patches for Mips direct object generation.
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 25 Oct 2011 18:13:20 +0000 (18:13 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 25 Oct 2011 18:13:20 +0000 (18:13 +0000)
This first patch is for expression variable kinds.

Patch by Jack Carter!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142934 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCExpr.h
lib/MC/MCELFStreamer.cpp
lib/MC/MCExpr.cpp

index 0f285999ad62028b593616585f7bb78e842336f6..3172fd75ce671e78970d651999c13f897adbdac4 100644 (file)
@@ -174,7 +174,23 @@ public:
     VK_PPC_DARWIN_HA16,  // ha16(symbol)
     VK_PPC_DARWIN_LO16,  // lo16(symbol)
     VK_PPC_GAS_HA16,     // symbol@ha
     VK_PPC_DARWIN_HA16,  // ha16(symbol)
     VK_PPC_DARWIN_LO16,  // lo16(symbol)
     VK_PPC_GAS_HA16,     // symbol@ha
-    VK_PPC_GAS_LO16      // symbol@l
+    VK_PPC_GAS_LO16,      // symbol@l
+
+    VK_Mips_None,
+    VK_Mips_GPREL,
+    VK_Mips_GOT_CALL,
+    VK_Mips_GOT,
+    VK_Mips_ABS_HI,
+    VK_Mips_ABS_LO,
+    VK_Mips_TLSGD,
+    VK_Mips_GOTTPREL,
+    VK_Mips_TPREL_HI,
+    VK_Mips_TPREL_LO,
+    VK_Mips_GPOFF_HI,
+    VK_Mips_GPOFF_LO,
+    VK_Mips_GOT_DISP,
+    VK_Mips_GOT_PAGE,
+    VK_Mips_GOT_OFST 
   };
 
 private:
   };
 
 private:
index 9ada08ea953048e9fc1787e8cc6b14ce1d4d1341..0b366da44ced424adf7e00834330b2cea7539806 100644 (file)
@@ -308,6 +308,10 @@ void  MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
     case MCSymbolRefExpr::VK_ARM_TLSGD:
     case MCSymbolRefExpr::VK_ARM_TPOFF:
     case MCSymbolRefExpr::VK_ARM_GOTTPOFF:
     case MCSymbolRefExpr::VK_ARM_TLSGD:
     case MCSymbolRefExpr::VK_ARM_TPOFF:
     case MCSymbolRefExpr::VK_ARM_GOTTPOFF:
+    case MCSymbolRefExpr::VK_Mips_TLSGD:
+    case MCSymbolRefExpr::VK_Mips_GOTTPREL:
+    case MCSymbolRefExpr::VK_Mips_TPREL_HI:
+    case MCSymbolRefExpr::VK_Mips_TPREL_LO:
       break;
     }
     MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
       break;
     }
     MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
index da297fb1d95a0cf1cd8d932655641a9ca9b4594b..4af27ab1288e1335517663d5184ad0f7476c60f4 100644 (file)
@@ -26,6 +26,38 @@ STATISTIC(MCExprEvaluate, "Number of MCExpr evaluations");
 }
 }
 
 }
 }
 
+static bool printMipsSymbolRef(const MCSymbolRefExpr &SRE,
+                               const MCSymbol &Sym, raw_ostream &OS) {
+  MCSymbolRefExpr::VariantKind Kind= SRE.getKind();
+
+  switch (Kind) {
+  default:
+    return false;
+  case MCSymbolRefExpr::VK_Mips_None:     break;
+  case MCSymbolRefExpr::VK_Mips_GPREL:    OS << "%gp_rel("; break;
+  case MCSymbolRefExpr::VK_Mips_GOT_CALL: OS << "%call16("; break;
+  case MCSymbolRefExpr::VK_Mips_GOT:      OS << "%got(";    break;
+  case MCSymbolRefExpr::VK_Mips_ABS_HI:   OS << "%hi(";     break;
+  case MCSymbolRefExpr::VK_Mips_ABS_LO:   OS << "%lo(";     break;
+  case MCSymbolRefExpr::VK_Mips_TLSGD:    OS << "%tlsgd(";  break;
+  case MCSymbolRefExpr::VK_Mips_GOTTPREL: OS << "%gottprel("; break;
+  case MCSymbolRefExpr::VK_Mips_TPREL_HI: OS << "%tprel_hi("; break;
+  case MCSymbolRefExpr::VK_Mips_TPREL_LO: OS << "%tprel_lo("; break;
+  case MCSymbolRefExpr::VK_Mips_GPOFF_HI: OS << "%hi(%neg(%gp_rel("; break;
+  case MCSymbolRefExpr::VK_Mips_GPOFF_LO: OS << "%lo(%neg(%gp_rel("; break;
+  case MCSymbolRefExpr::VK_Mips_GOT_DISP: OS << "%got_disp("; break;
+  case MCSymbolRefExpr::VK_Mips_GOT_PAGE: OS << "%got_page("; break;
+  case MCSymbolRefExpr::VK_Mips_GOT_OFST: OS << "%got_ofst("; break;
+  }
+
+  OS << Sym;
+
+  if (Kind != MCSymbolRefExpr::VK_Mips_None)
+    OS << ')';
+
+  return true;
+}
+
 void MCExpr::print(raw_ostream &OS) const {
   switch (getKind()) {
   case MCExpr::Target:
 void MCExpr::print(raw_ostream &OS) const {
   switch (getKind()) {
   case MCExpr::Target:
@@ -41,6 +73,9 @@ void MCExpr::print(raw_ostream &OS) const {
     // absolute names.
     bool UseParens = Sym.getName()[0] == '$';
 
     // absolute names.
     bool UseParens = Sym.getName()[0] == '$';
 
+    if (printMipsSymbolRef(SRE, Sym, OS))
+      return;
+
     if (SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_HA16 ||
         SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_LO16) {
       OS << MCSymbolRefExpr::getVariantKindName(SRE.getKind());
     if (SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_HA16 ||
         SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_LO16) {
       OS << MCSymbolRefExpr::getVariantKindName(SRE.getKind());