Be bug compatible with gcc by returning MMX values in RAX.
[oota-llvm.git] / lib / Target / XCore / XCoreAsmPrinter.cpp
index edd70468b4167a090d862593638327188ce9c5e9..9e6e19fe44fd78382588c852314486e29c51e395 100644 (file)
@@ -56,10 +56,10 @@ namespace {
   struct VISIBILITY_HIDDEN XCoreAsmPrinter : public AsmPrinter {
     XCoreAsmPrinter(raw_ostream &O, XCoreTargetMachine &TM,
                     const TargetAsmInfo *T)
-      : AsmPrinter(O, TM, T), DW(O, this, T),
+      : AsmPrinter(O, TM, T), DW(0),
         Subtarget(*TM.getSubtargetImpl()) { }
 
-    DwarfWriter DW;
+    DwarfWriter *DW;
     const XCoreSubtarget &Subtarget;
 
     virtual const char *getPassName() const {
@@ -91,6 +91,7 @@ namespace {
       AsmPrinter::getAnalysisUsage(AU);
       AU.setPreservesAll();
       AU.addRequired<MachineModuleInfo>();
+      AU.addRequired<DwarfWriter>();
     }
   };
 } // end of anonymous namespace
@@ -197,6 +198,7 @@ emitGlobal(const GlobalVariable *GV)
       }
       // FALL THROUGH
     case GlobalValue::InternalLinkage:
+    case GlobalValue::PrivateLinkage:
       break;
     case GlobalValue::GhostLinkage:
       cerr << "Should not have any unmaterialized functions!\n";
@@ -213,7 +215,7 @@ emitGlobal(const GlobalVariable *GV)
 
     EmitAlignment(Align, GV, 2);
     
-    unsigned Size = TD->getABITypeSize(C->getType());
+    unsigned Size = TD->getTypePaddedSize(C->getType());
     if (GV->isThreadLocal()) {
       Size *= MaxThreads;
     }
@@ -258,6 +260,7 @@ emitFunctionStart(MachineFunction &MF)
   switch (F->getLinkage()) {
   default: assert(0 && "Unknown linkage type!");
   case Function::InternalLinkage:  // Symbols default to internal.
+  case Function::PrivateLinkage:
     break;
   case Function::ExternalLinkage:
     emitGlobalDirective(CurrentFnName);
@@ -298,14 +301,11 @@ bool XCoreAsmPrinter::runOnMachineFunction(MachineFunction &MF)
   // Print out jump tables referenced by the function
   EmitJumpTableInfo(MF.getJumpTableInfo(), MF);
 
-  // What's my mangled name?
-  CurrentFnName = Mang->getValueName(MF.getFunction());
-
   // Emit the function start directives
   emitFunctionStart(MF);
   
   // Emit pre-function debug information.
-  DW.BeginFunction(&MF);
+  DW->BeginFunction(&MF);
 
   // Print out code for the function.
   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
@@ -332,7 +332,7 @@ bool XCoreAsmPrinter::runOnMachineFunction(MachineFunction &MF)
   emitFunctionEnd(MF);
   
   // Emit post-function debug information.
-  DW.EndFunction(&MF);
+  DW->EndFunction(&MF);
 
   // We didn't modify anything.
   return false;
@@ -366,9 +366,12 @@ void XCoreAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
     printBasicBlockLabel(MO.getMBB());
     break;
   case MachineOperand::MO_GlobalAddress:
-    O << Mang->getValueName(MO.getGlobal());
-    if (MO.getGlobal()->hasExternalWeakLinkage())
-      ExtWeakSymbols.insert(MO.getGlobal());
+    {
+      const GlobalValue *GV = MO.getGlobal();
+      O << Mang->getValueName(GV);
+      if (GV->hasExternalWeakLinkage())
+        ExtWeakSymbols.insert(GV);
+    }
     break;
   case MachineOperand::MO_ExternalSymbol:
     O << MO.getSymbolName();
@@ -399,8 +402,8 @@ void XCoreAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
   ++EmittedInsts;
 
   // Check for mov mnemonic
-  unsigned src, dst;
-  if (TM.getInstrInfo()->isMoveInstr(*MI, src, dst)) {
+  unsigned src, dst, srcSR, dstSR;
+  if (TM.getInstrInfo()->isMoveInstr(*MI, src, dst, srcSR, dstSR)) {
     O << "\tmov ";
     O << TM.getRegisterInfo()->get(dst).AsmName;
     O << ", ";
@@ -438,9 +441,10 @@ bool XCoreAsmPrinter::doInitialization(Module &M) {
   }
 
   // Emit initial debug information.
-  DW.BeginModule(&M);
-
-  DW.SetModuleInfo(getAnalysisToUpdate<MachineModuleInfo>());
+  DW = getAnalysisIfAvailable<DwarfWriter>();
+  assert(DW && "Dwarf Writer is not available");
+  DW->BeginModule(&M, getAnalysisIfAvailable<MachineModuleInfo>(),
+                  O, this, TAI);
   return Result;
 }
 
@@ -453,7 +457,7 @@ bool XCoreAsmPrinter::doFinalization(Module &M) {
   }
   
   // Emit final debug information.
-  DW.EndModule();
+  DW->EndModule();
 
   return AsmPrinter::doFinalization(M);
 }