Don't set GlobalPrefix to the default value.
[oota-llvm.git] / lib / Target / PowerPC / MCTargetDesc / PPCMCExpr.cpp
index 3b794fe86228b5023f595728275242e4cbe0e881..d7e84021595ea0c078d9230e756767f304b9095e 100644 (file)
@@ -17,17 +17,17 @@ using namespace llvm;
 
 const PPCMCExpr*
 PPCMCExpr::Create(VariantKind Kind, const MCExpr *Expr,
-                       MCContext &Ctx) {
-  int AssemblerDialect = Ctx.getAsmInfo()->getAssemblerDialect();
-  return new (Ctx) PPCMCExpr(Kind, Expr, AssemblerDialect);
+                  bool isDarwin, MCContext &Ctx) {
+  return new (Ctx) PPCMCExpr(Kind, Expr, isDarwin);
 }
 
 void PPCMCExpr::PrintImpl(raw_ostream &OS) const {
   if (isDarwinSyntax()) {
     switch (Kind) {
     default: llvm_unreachable("Invalid kind!");
-    case VK_PPC_HA16: OS << "ha16"; break;
-    case VK_PPC_LO16: OS << "lo16"; break;
+    case VK_PPC_LO: OS << "lo16"; break;
+    case VK_PPC_HI: OS << "hi16"; break;
+    case VK_PPC_HA: OS << "ha16"; break;
     }
 
     OS << '(';
@@ -38,8 +38,13 @@ void PPCMCExpr::PrintImpl(raw_ostream &OS) const {
 
     switch (Kind) {
     default: llvm_unreachable("Invalid kind!");
-    case VK_PPC_HA16: OS << "@ha"; break;
-    case VK_PPC_LO16: OS << "@l"; break;
+    case VK_PPC_LO: OS << "@l"; break;
+    case VK_PPC_HI: OS << "@h"; break;
+    case VK_PPC_HA: OS << "@ha"; break;
+    case VK_PPC_HIGHER: OS << "@higher"; break;
+    case VK_PPC_HIGHERA: OS << "@highera"; break;
+    case VK_PPC_HIGHEST: OS << "@highest"; break;
+    case VK_PPC_HIGHESTA: OS << "@highesta"; break;
     }
   }
 }
@@ -49,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
                                      const MCAsmLayout *Layout) const {
   MCValue Value;
 
-  if (!getSubExpr()->EvaluateAsRelocatable(Value, *Layout))
+  if (!Layout || !getSubExpr()->EvaluateAsRelocatable(Value, *Layout))
     return false;
 
   if (Value.isAbsolute()) {
@@ -57,12 +62,27 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
     switch (Kind) {
       default:
         llvm_unreachable("Invalid kind!");
-      case VK_PPC_HA16:
-        Result = ((Result >> 16) + ((Result & 0x8000) ? 1 : 0)) & 0xffff;
-        break;
-      case VK_PPC_LO16:
+      case VK_PPC_LO:
         Result = Result & 0xffff;
         break;
+      case VK_PPC_HI:
+        Result = (Result >> 16) & 0xffff;
+        break;
+      case VK_PPC_HA:
+        Result = ((Result + 0x8000) >> 16) & 0xffff;
+        break;
+      case VK_PPC_HIGHER:
+        Result = (Result >> 32) & 0xffff;
+        break;
+      case VK_PPC_HIGHERA:
+        Result = ((Result + 0x8000) >> 32) & 0xffff;
+        break;
+      case VK_PPC_HIGHEST:
+        Result = (Result >> 48) & 0xffff;
+        break;
+      case VK_PPC_HIGHESTA:
+        Result = ((Result + 0x8000) >> 48) & 0xffff;
+        break;
     }
     Res = MCValue::get(Result);
   } else {
@@ -74,11 +94,26 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
     switch (Kind) {
       default:
         llvm_unreachable("Invalid kind!");
-      case VK_PPC_HA16:
-        Modifier = MCSymbolRefExpr::VK_PPC_ADDR16_HA;
+      case VK_PPC_LO:
+        Modifier = MCSymbolRefExpr::VK_PPC_LO;
+        break;
+      case VK_PPC_HI:
+        Modifier = MCSymbolRefExpr::VK_PPC_HI;
+        break;
+      case VK_PPC_HA:
+        Modifier = MCSymbolRefExpr::VK_PPC_HA;
+        break;
+      case VK_PPC_HIGHERA:
+        Modifier = MCSymbolRefExpr::VK_PPC_HIGHERA;
+        break;
+      case VK_PPC_HIGHER:
+        Modifier = MCSymbolRefExpr::VK_PPC_HIGHER;
+        break;
+      case VK_PPC_HIGHEST:
+        Modifier = MCSymbolRefExpr::VK_PPC_HIGHEST;
         break;
-      case VK_PPC_LO16:
-        Modifier = MCSymbolRefExpr::VK_PPC_ADDR16_LO;
+      case VK_PPC_HIGHESTA:
+        Modifier = MCSymbolRefExpr::VK_PPC_HIGHESTA;
         break;
     }
     Sym = MCSymbolRefExpr::Create(&Sym->getSymbol(), Modifier, Context);