Implement proper asmprinting for the globals. This eliminates bogus "call" modifier...
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 11 Oct 2009 19:14:02 +0000 (19:14 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 11 Oct 2009 19:14:02 +0000 (19:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83784 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/MSP430/AsmPrinter/MSP430AsmPrinter.cpp
lib/Target/MSP430/MSP430InstrInfo.td

index 0f70e483159873f98458420774871ccf25fd0bbc..852019febf5e8bd3d1bd075b2bf39a55eb3301db 100644 (file)
@@ -149,7 +149,7 @@ void MSP430AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
 
   // Call the autogenerated instruction printer routines.
   printInstruction(MI);
-  
+
   if (VerboseAsm && !MI->getDebugLoc().isUnknown())
     EmitComments(*MI);
   O << '\n';
@@ -174,26 +174,26 @@ void MSP430AsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
     return;
   case MachineOperand::MO_GlobalAddress: {
     bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-    bool isCallOp = Modifier && !strcmp(Modifier, "call");
     std::string Name = Mang->getMangledName(MO.getGlobal());
-    assert(MO.getOffset() == 0 && "No offsets allowed!");
+    uint64_t Offset = MO.getOffset();
 
-    if (isCallOp)
-      O << '#';
-    else if (isMemOp)
-      O << '&';
+    O << (isMemOp ? '&' : '#');
+    if (Offset)
+      O << '(' << Offset << '+';
 
     O << Name;
+    if (Offset)
+      O << ')';
 
     return;
   }
   case MachineOperand::MO_ExternalSymbol: {
-    bool isCallOp = Modifier && !strcmp(Modifier, "call");
+    bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
     std::string Name(MAI->getGlobalPrefix());
     Name += MO.getSymbolName();
-    if (isCallOp)
-      O << '#';
-    O << Name;
+
+    O << (isMemOp ? '&' : '#') << Name;
+
     return;
   }
   default:
index ced612e863123e0dab3712f5aed725ba37e62620..37a949209daeaa9dc529ecaf44a8166f3e7b1b36 100644 (file)
@@ -155,7 +155,7 @@ let isCall = 1 in
   let Defs = [R12W, R13W, R14W, R15W, SRW],
       Uses = [SPW] in {
     def CALLi     : Pseudo<(outs), (ins i16imm:$dst, variable_ops),
-                           "call\t${dst:call}", [(MSP430call imm:$dst)]>;
+                           "call\t$dst", [(MSP430call imm:$dst)]>;
     def CALLr     : Pseudo<(outs), (ins GR16:$dst, variable_ops),
                            "call\t$dst", [(MSP430call GR16:$dst)]>;
     def CALLm     : Pseudo<(outs), (ins memsrc:$dst, variable_ops),