delete the fixme too! :)
[oota-llvm.git] / lib / Target / X86 / X86CodeEmitter.cpp
index 0c472a725bcd21d1f45e0e9291dde1b39e86ce0e..5ce6f3c4a19af5c98d120063429b3c2d7854682f 100644 (file)
@@ -30,6 +30,7 @@
 #include "llvm/Function.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCInst.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Debug.h"
@@ -323,32 +324,27 @@ void Emitter<CodeEmitter>::emitDisplacementField(const MachineOperand *RelocOp,
 
   // Otherwise, this is something that requires a relocation.  Emit it as such
   // now.
+  unsigned RelocType = Is64BitMode ?
+    (IsPCRel ? X86::reloc_pcrel_word : X86::reloc_absolute_word_sext)
+    : (IsPIC ? X86::reloc_picrel_word : X86::reloc_absolute_word);
   if (RelocOp->isGlobal()) {
     // In 64-bit static small code model, we could potentially emit absolute.
     // But it's probably not beneficial. If the MCE supports using RIP directly
     // do it, otherwise fallback to absolute (this is determined by IsPCRel). 
     //  89 05 00 00 00 00     mov    %eax,0(%rip)  # PC-relative
     //  89 04 25 00 00 00 00  mov    %eax,0x0      # Absolute
-    unsigned rt = Is64BitMode ?
-      (IsPCRel ? X86::reloc_pcrel_word : X86::reloc_absolute_word_sext)
-      : (IsPIC ? X86::reloc_picrel_word : X86::reloc_absolute_word);
     bool NeedStub = isa<Function>(RelocOp->getGlobal());
     bool Indirect = gvNeedsNonLazyPtr(*RelocOp, TM);
-    emitGlobalAddress(RelocOp->getGlobal(), rt, RelocOp->getOffset(),
+    emitGlobalAddress(RelocOp->getGlobal(), RelocType, RelocOp->getOffset(),
                       Adj, NeedStub, Indirect);
+  } else if (RelocOp->isSymbol()) {
+    emitExternalSymbolAddress(RelocOp->getSymbolName(), RelocType);
   } else if (RelocOp->isCPI()) {
-    unsigned rt = Is64BitMode ?
-      (IsPCRel ? X86::reloc_pcrel_word : X86::reloc_absolute_word_sext)
-      : (IsPCRel ? X86::reloc_picrel_word : X86::reloc_absolute_word);
-    emitConstPoolAddress(RelocOp->getIndex(), rt,
+    emitConstPoolAddress(RelocOp->getIndex(), RelocType,
                          RelocOp->getOffset(), Adj);
-  } else if (RelocOp->isJTI()) {
-    unsigned rt = Is64BitMode ?
-      (IsPCRel ? X86::reloc_pcrel_word : X86::reloc_absolute_word_sext)
-      : (IsPCRel ? X86::reloc_picrel_word : X86::reloc_absolute_word);
-    emitJumpTableAddress(RelocOp->getIndex(), rt, Adj);
   } else {
-    llvm_unreachable("Unknown value to relocate!");
+    assert(RelocOp->isJTI() && "Unexpected machine operand!");
+    emitJumpTableAddress(RelocOp->getIndex(), RelocType, Adj);
   }
 }
 
@@ -363,6 +359,8 @@ void Emitter<CodeEmitter>::emitMemModRMByte(const MachineInstr &MI,
   // Figure out what sort of displacement we have to handle here.
   if (Op3.isGlobal()) {
     DispForReloc = &Op3;
+  } else if (Op3.isSymbol()) {
+    DispForReloc = &Op3;
   } else if (Op3.isCPI()) {
     if (!MCE.earlyResolveAddresses() || Is64BitMode || IsPIC) {
       DispForReloc = &Op3;
@@ -594,6 +592,7 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI,
       break;
     case TargetInstrInfo::DBG_LABEL:
     case TargetInstrInfo::EH_LABEL:
+    case TargetInstrInfo::GC_LABEL:
       MCE.emitLabel(MI.getOperand(0).getImm());
       break;
     case TargetInstrInfo::IMPLICIT_DEF:
@@ -968,12 +967,12 @@ public:
       Instr->addOperand(MachineOperand::CreateImm(Op.getImm()));
       return true;
     }
-    if (!Op.isMCValue())
+    if (!Op.isExpr())
       return false;
 
-    const MCValue &Val = Op.getMCValue();
-    if (Val.isAbsolute()) {
-      Instr->addOperand(MachineOperand::CreateImm(Val.getConstant()));
+    const MCExpr *Expr = Op.getExpr();
+    if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) {
+      Instr->addOperand(MachineOperand::CreateImm(CE->getValue()));
       return true;
     }
 
@@ -1036,9 +1035,8 @@ public:
       if (CurOp < NumOps) {
         // Hack to make branches work.
         if (!(Desc.TSFlags & X86II::ImmMask) &&
-            MI.getOperand(0).isMCValue() && 
-            MI.getOperand(0).getMCValue().getSymA() &&
-            !MI.getOperand(0).getMCValue().getSymB())
+            MI.getOperand(0).isExpr() &&
+            isa<MCSymbolRefExpr>(MI.getOperand(0).getExpr()))
           Instr->addOperand(MachineOperand::CreateMBB(DummyMBB));
         else
           OK &= AddImmToInstr(MI, Instr, CurOp);
@@ -1094,7 +1092,7 @@ public:
 
     if (!OK) {
       errs() << "couldn't convert inst '";
-      MI.print(errs());
+      MI.dump();
       errs() << "' to machine instr:\n";
       Instr->dump();
     }