forked from OSchip/llvm-project
				
			Implement proper asmprinting for the globals. This eliminates bogus "call" modifier and also adds support for offsets wrt globals.
llvm-svn: 83784
This commit is contained in:
		
							parent
							
								
									3525a4a268
								
							
						
					
					
						commit
						a58a3f930a
					
				| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue