1 //===-- ARMAsmPrinter.cpp - Print machine code to an ARM .s file ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains a printer that converts from our internal representation 11 // of machine-dependent LLVM code to GAS-format ARM assembly language. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #define DEBUG_TYPE "asm-printer" 16 #include "ARM.h" 17 #include "ARMAsmPrinter.h" 18 #include "ARMBuildAttrs.h" 19 #include "ARMBaseRegisterInfo.h" 20 #include "ARMConstantPoolValue.h" 21 #include "ARMMachineFunctionInfo.h" 22 #include "ARMTargetMachine.h" 23 #include "ARMTargetObjectFile.h" 24 #include "InstPrinter/ARMInstPrinter.h" 25 #include "MCTargetDesc/ARMAddressingModes.h" 26 #include "MCTargetDesc/ARMMCExpr.h" 27 #include "llvm/Analysis/DebugInfo.h" 28 #include "llvm/Constants.h" 29 #include "llvm/Module.h" 30 #include "llvm/Type.h" 31 #include "llvm/Assembly/Writer.h" 32 #include "llvm/CodeGen/MachineModuleInfoImpls.h" 33 #include "llvm/CodeGen/MachineFunctionPass.h" 34 #include "llvm/CodeGen/MachineJumpTableInfo.h" 35 #include "llvm/MC/MCAsmInfo.h" 36 #include "llvm/MC/MCAssembler.h" 37 #include "llvm/MC/MCContext.h" 38 #include "llvm/MC/MCExpr.h" 39 #include "llvm/MC/MCInst.h" 40 #include "llvm/MC/MCSectionMachO.h" 41 #include "llvm/MC/MCObjectStreamer.h" 42 #include "llvm/MC/MCStreamer.h" 43 #include "llvm/MC/MCSymbol.h" 44 #include "llvm/Target/Mangler.h" 45 #include "llvm/Target/TargetData.h" 46 #include "llvm/Target/TargetMachine.h" 47 #include "llvm/Target/TargetOptions.h" 48 #include "llvm/ADT/SmallPtrSet.h" 49 #include "llvm/ADT/SmallString.h" 50 #include "llvm/Support/CommandLine.h" 51 #include "llvm/Support/Debug.h" 52 #include "llvm/Support/ErrorHandling.h" 53 #include "llvm/Support/TargetRegistry.h" 54 #include "llvm/Support/raw_ostream.h" 55 #include <cctype> 56 using namespace llvm; 57 58 namespace { 59 60 // Per section and per symbol attributes are not supported. 61 // To implement them we would need the ability to delay this emission 62 // until the assembly file is fully parsed/generated as only then do we 63 // know the symbol and section numbers. 64 class AttributeEmitter { 65 public: 66 virtual void MaybeSwitchVendor(StringRef Vendor) = 0; 67 virtual void EmitAttribute(unsigned Attribute, unsigned Value) = 0; 68 virtual void EmitTextAttribute(unsigned Attribute, StringRef String) = 0; 69 virtual void Finish() = 0; 70 virtual ~AttributeEmitter() {} 71 }; 72 73 class AsmAttributeEmitter : public AttributeEmitter { 74 MCStreamer &Streamer; 75 76 public: 77 AsmAttributeEmitter(MCStreamer &Streamer_) : Streamer(Streamer_) {} 78 void MaybeSwitchVendor(StringRef Vendor) { } 79 80 void EmitAttribute(unsigned Attribute, unsigned Value) { 81 Streamer.EmitRawText("\t.eabi_attribute " + 82 Twine(Attribute) + ", " + Twine(Value)); 83 } 84 85 void EmitTextAttribute(unsigned Attribute, StringRef String) { 86 switch (Attribute) { 87 default: llvm_unreachable("Unsupported Text attribute in ASM Mode"); 88 case ARMBuildAttrs::CPU_name: 89 Streamer.EmitRawText(StringRef("\t.cpu ") + String.lower()); 90 break; 91 /* GAS requires .fpu to be emitted regardless of EABI attribute */ 92 case ARMBuildAttrs::Advanced_SIMD_arch: 93 case ARMBuildAttrs::VFP_arch: 94 Streamer.EmitRawText(StringRef("\t.fpu ") + String.lower()); 95 break; 96 } 97 } 98 void Finish() { } 99 }; 100 101 class ObjectAttributeEmitter : public AttributeEmitter { 102 // This structure holds all attributes, accounting for 103 // their string/numeric value, so we can later emmit them 104 // in declaration order, keeping all in the same vector 105 struct AttributeItemType { 106 enum { 107 HiddenAttribute = 0, 108 NumericAttribute, 109 TextAttribute 110 } Type; 111 unsigned Tag; 112 unsigned IntValue; 113 StringRef StringValue; 114 } AttributeItem; 115 116 MCObjectStreamer &Streamer; 117 StringRef CurrentVendor; 118 SmallVector<AttributeItemType, 64> Contents; 119 120 // Account for the ULEB/String size of each item, 121 // not just the number of items 122 size_t ContentsSize; 123 // FIXME: this should be in a more generic place, but 124 // getULEBSize() is in MCAsmInfo and will be moved to MCDwarf 125 size_t getULEBSize(int Value) { 126 size_t Size = 0; 127 do { 128 Value >>= 7; 129 Size += sizeof(int8_t); // Is this really necessary? 130 } while (Value); 131 return Size; 132 } 133 134 public: 135 ObjectAttributeEmitter(MCObjectStreamer &Streamer_) : 136 Streamer(Streamer_), CurrentVendor(""), ContentsSize(0) { } 137 138 void MaybeSwitchVendor(StringRef Vendor) { 139 assert(!Vendor.empty() && "Vendor cannot be empty."); 140 141 if (CurrentVendor.empty()) 142 CurrentVendor = Vendor; 143 else if (CurrentVendor == Vendor) 144 return; 145 else 146 Finish(); 147 148 CurrentVendor = Vendor; 149 150 assert(Contents.size() == 0); 151 } 152 153 void EmitAttribute(unsigned Attribute, unsigned Value) { 154 AttributeItemType attr = { 155 AttributeItemType::NumericAttribute, 156 Attribute, 157 Value, 158 StringRef("") 159 }; 160 ContentsSize += getULEBSize(Attribute); 161 ContentsSize += getULEBSize(Value); 162 Contents.push_back(attr); 163 } 164 165 void EmitTextAttribute(unsigned Attribute, StringRef String) { 166 AttributeItemType attr = { 167 AttributeItemType::TextAttribute, 168 Attribute, 169 0, 170 String 171 }; 172 ContentsSize += getULEBSize(Attribute); 173 // String + \0 174 ContentsSize += String.size()+1; 175 176 Contents.push_back(attr); 177 } 178 179 void Finish() { 180 // Vendor size + Vendor name + '\0' 181 const size_t VendorHeaderSize = 4 + CurrentVendor.size() + 1; 182 183 // Tag + Tag Size 184 const size_t TagHeaderSize = 1 + 4; 185 186 Streamer.EmitIntValue(VendorHeaderSize + TagHeaderSize + ContentsSize, 4); 187 Streamer.EmitBytes(CurrentVendor, 0); 188 Streamer.EmitIntValue(0, 1); // '\0' 189 190 Streamer.EmitIntValue(ARMBuildAttrs::File, 1); 191 Streamer.EmitIntValue(TagHeaderSize + ContentsSize, 4); 192 193 // Size should have been accounted for already, now 194 // emit each field as its type (ULEB or String) 195 for (unsigned int i=0; i<Contents.size(); ++i) { 196 AttributeItemType item = Contents[i]; 197 Streamer.EmitULEB128IntValue(item.Tag, 0); 198 switch (item.Type) { 199 default: llvm_unreachable("Invalid attribute type"); 200 case AttributeItemType::NumericAttribute: 201 Streamer.EmitULEB128IntValue(item.IntValue, 0); 202 break; 203 case AttributeItemType::TextAttribute: 204 Streamer.EmitBytes(item.StringValue.upper(), 0); 205 Streamer.EmitIntValue(0, 1); // '\0' 206 break; 207 } 208 } 209 210 Contents.clear(); 211 } 212 }; 213 214 } // end of anonymous namespace 215 216 MachineLocation ARMAsmPrinter:: 217 getDebugValueLocation(const MachineInstr *MI) const { 218 MachineLocation Location; 219 assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!"); 220 // Frame address. Currently handles register +- offset only. 221 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) 222 Location.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); 223 else { 224 DEBUG(dbgs() << "DBG_VALUE instruction ignored! " << *MI << "\n"); 225 } 226 return Location; 227 } 228 229 /// EmitDwarfRegOp - Emit dwarf register operation. 230 void ARMAsmPrinter::EmitDwarfRegOp(const MachineLocation &MLoc) const { 231 const TargetRegisterInfo *RI = TM.getRegisterInfo(); 232 if (RI->getDwarfRegNum(MLoc.getReg(), false) != -1) 233 AsmPrinter::EmitDwarfRegOp(MLoc); 234 else { 235 unsigned Reg = MLoc.getReg(); 236 if (Reg >= ARM::S0 && Reg <= ARM::S31) { 237 assert(ARM::S0 + 31 == ARM::S31 && "Unexpected ARM S register numbering"); 238 // S registers are described as bit-pieces of a register 239 // S[2x] = DW_OP_regx(256 + (x>>1)) DW_OP_bit_piece(32, 0) 240 // S[2x+1] = DW_OP_regx(256 + (x>>1)) DW_OP_bit_piece(32, 32) 241 242 unsigned SReg = Reg - ARM::S0; 243 bool odd = SReg & 0x1; 244 unsigned Rx = 256 + (SReg >> 1); 245 246 OutStreamer.AddComment("DW_OP_regx for S register"); 247 EmitInt8(dwarf::DW_OP_regx); 248 249 OutStreamer.AddComment(Twine(SReg)); 250 EmitULEB128(Rx); 251 252 if (odd) { 253 OutStreamer.AddComment("DW_OP_bit_piece 32 32"); 254 EmitInt8(dwarf::DW_OP_bit_piece); 255 EmitULEB128(32); 256 EmitULEB128(32); 257 } else { 258 OutStreamer.AddComment("DW_OP_bit_piece 32 0"); 259 EmitInt8(dwarf::DW_OP_bit_piece); 260 EmitULEB128(32); 261 EmitULEB128(0); 262 } 263 } else if (Reg >= ARM::Q0 && Reg <= ARM::Q15) { 264 assert(ARM::Q0 + 15 == ARM::Q15 && "Unexpected ARM Q register numbering"); 265 // Q registers Q0-Q15 are described by composing two D registers together. 266 // Qx = DW_OP_regx(256+2x) DW_OP_piece(8) DW_OP_regx(256+2x+1) 267 // DW_OP_piece(8) 268 269 unsigned QReg = Reg - ARM::Q0; 270 unsigned D1 = 256 + 2 * QReg; 271 unsigned D2 = D1 + 1; 272 273 OutStreamer.AddComment("DW_OP_regx for Q register: D1"); 274 EmitInt8(dwarf::DW_OP_regx); 275 EmitULEB128(D1); 276 OutStreamer.AddComment("DW_OP_piece 8"); 277 EmitInt8(dwarf::DW_OP_piece); 278 EmitULEB128(8); 279 280 OutStreamer.AddComment("DW_OP_regx for Q register: D2"); 281 EmitInt8(dwarf::DW_OP_regx); 282 EmitULEB128(D2); 283 OutStreamer.AddComment("DW_OP_piece 8"); 284 EmitInt8(dwarf::DW_OP_piece); 285 EmitULEB128(8); 286 } 287 } 288 } 289 290 void ARMAsmPrinter::EmitFunctionEntryLabel() { 291 OutStreamer.ForceCodeRegion(); 292 293 if (AFI->isThumbFunction()) { 294 OutStreamer.EmitAssemblerFlag(MCAF_Code16); 295 OutStreamer.EmitThumbFunc(CurrentFnSym); 296 } 297 298 OutStreamer.EmitLabel(CurrentFnSym); 299 } 300 301 void ARMAsmPrinter::EmitXXStructor(const Constant *CV) { 302 uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); 303 assert(Size && "C++ constructor pointer had zero size!"); 304 305 const GlobalValue *GV = dyn_cast<GlobalValue>(CV->stripPointerCasts()); 306 assert(GV && "C++ constructor pointer was not a GlobalValue!"); 307 308 const MCExpr *E = MCSymbolRefExpr::Create(Mang->getSymbol(GV), 309 (Subtarget->isTargetDarwin() 310 ? MCSymbolRefExpr::VK_None 311 : MCSymbolRefExpr::VK_ARM_TARGET1), 312 OutContext); 313 314 OutStreamer.EmitValue(E, Size); 315 } 316 317 /// runOnMachineFunction - This uses the EmitInstruction() 318 /// method to print assembly for each instruction. 319 /// 320 bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 321 AFI = MF.getInfo<ARMFunctionInfo>(); 322 MCP = MF.getConstantPool(); 323 324 return AsmPrinter::runOnMachineFunction(MF); 325 } 326 327 void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, 328 raw_ostream &O, const char *Modifier) { 329 const MachineOperand &MO = MI->getOperand(OpNum); 330 unsigned TF = MO.getTargetFlags(); 331 332 switch (MO.getType()) { 333 default: llvm_unreachable("<unknown operand type>"); 334 case MachineOperand::MO_Register: { 335 unsigned Reg = MO.getReg(); 336 assert(TargetRegisterInfo::isPhysicalRegister(Reg)); 337 assert(!MO.getSubReg() && "Subregs should be eliminated!"); 338 O << ARMInstPrinter::getRegisterName(Reg); 339 break; 340 } 341 case MachineOperand::MO_Immediate: { 342 int64_t Imm = MO.getImm(); 343 O << '#'; 344 if ((Modifier && strcmp(Modifier, "lo16") == 0) || 345 (TF == ARMII::MO_LO16)) 346 O << ":lower16:"; 347 else if ((Modifier && strcmp(Modifier, "hi16") == 0) || 348 (TF == ARMII::MO_HI16)) 349 O << ":upper16:"; 350 O << Imm; 351 break; 352 } 353 case MachineOperand::MO_MachineBasicBlock: 354 O << *MO.getMBB()->getSymbol(); 355 return; 356 case MachineOperand::MO_GlobalAddress: { 357 const GlobalValue *GV = MO.getGlobal(); 358 if ((Modifier && strcmp(Modifier, "lo16") == 0) || 359 (TF & ARMII::MO_LO16)) 360 O << ":lower16:"; 361 else if ((Modifier && strcmp(Modifier, "hi16") == 0) || 362 (TF & ARMII::MO_HI16)) 363 O << ":upper16:"; 364 O << *Mang->getSymbol(GV); 365 366 printOffset(MO.getOffset(), O); 367 if (TF == ARMII::MO_PLT) 368 O << "(PLT)"; 369 break; 370 } 371 case MachineOperand::MO_ExternalSymbol: { 372 O << *GetExternalSymbolSymbol(MO.getSymbolName()); 373 if (TF == ARMII::MO_PLT) 374 O << "(PLT)"; 375 break; 376 } 377 case MachineOperand::MO_ConstantPoolIndex: 378 O << *GetCPISymbol(MO.getIndex()); 379 break; 380 case MachineOperand::MO_JumpTableIndex: 381 O << *GetJTISymbol(MO.getIndex()); 382 break; 383 } 384 } 385 386 //===--------------------------------------------------------------------===// 387 388 MCSymbol *ARMAsmPrinter:: 389 GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, 390 const MachineBasicBlock *MBB) const { 391 SmallString<60> Name; 392 raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() 393 << getFunctionNumber() << '_' << uid << '_' << uid2 394 << "_set_" << MBB->getNumber(); 395 return OutContext.GetOrCreateSymbol(Name.str()); 396 } 397 398 MCSymbol *ARMAsmPrinter:: 399 GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const { 400 SmallString<60> Name; 401 raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "JTI" 402 << getFunctionNumber() << '_' << uid << '_' << uid2; 403 return OutContext.GetOrCreateSymbol(Name.str()); 404 } 405 406 407 MCSymbol *ARMAsmPrinter::GetARMSJLJEHLabel(void) const { 408 SmallString<60> Name; 409 raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "SJLJEH" 410 << getFunctionNumber(); 411 return OutContext.GetOrCreateSymbol(Name.str()); 412 } 413 414 bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, 415 unsigned AsmVariant, const char *ExtraCode, 416 raw_ostream &O) { 417 // Does this asm operand have a single letter operand modifier? 418 if (ExtraCode && ExtraCode[0]) { 419 if (ExtraCode[1] != 0) return true; // Unknown modifier. 420 421 switch (ExtraCode[0]) { 422 default: return true; // Unknown modifier. 423 case 'a': // Print as a memory address. 424 if (MI->getOperand(OpNum).isReg()) { 425 O << "[" 426 << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg()) 427 << "]"; 428 return false; 429 } 430 // Fallthrough 431 case 'c': // Don't print "#" before an immediate operand. 432 if (!MI->getOperand(OpNum).isImm()) 433 return true; 434 O << MI->getOperand(OpNum).getImm(); 435 return false; 436 case 'P': // Print a VFP double precision register. 437 case 'q': // Print a NEON quad precision register. 438 printOperand(MI, OpNum, O); 439 return false; 440 case 'y': // Print a VFP single precision register as indexed double. 441 // This uses the ordering of the alias table to get the first 'd' register 442 // that overlaps the 's' register. Also, s0 is an odd register, hence the 443 // odd modulus check below. 444 if (MI->getOperand(OpNum).isReg()) { 445 unsigned Reg = MI->getOperand(OpNum).getReg(); 446 const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo(); 447 O << ARMInstPrinter::getRegisterName(TRI->getAliasSet(Reg)[0]) << 448 (((Reg % 2) == 1) ? "[0]" : "[1]"); 449 return false; 450 } 451 return true; 452 case 'B': // Bitwise inverse of integer or symbol without a preceding #. 453 if (!MI->getOperand(OpNum).isImm()) 454 return true; 455 O << ~(MI->getOperand(OpNum).getImm()); 456 return false; 457 case 'L': // The low 16 bits of an immediate constant. 458 if (!MI->getOperand(OpNum).isImm()) 459 return true; 460 O << (MI->getOperand(OpNum).getImm() & 0xffff); 461 return false; 462 case 'M': { // A register range suitable for LDM/STM. 463 if (!MI->getOperand(OpNum).isReg()) 464 return true; 465 const MachineOperand &MO = MI->getOperand(OpNum); 466 unsigned RegBegin = MO.getReg(); 467 // This takes advantage of the 2 operand-ness of ldm/stm and that we've 468 // already got the operands in registers that are operands to the 469 // inline asm statement. 470 471 O << "{" << ARMInstPrinter::getRegisterName(RegBegin); 472 473 // FIXME: The register allocator not only may not have given us the 474 // registers in sequence, but may not be in ascending registers. This 475 // will require changes in the register allocator that'll need to be 476 // propagated down here if the operands change. 477 unsigned RegOps = OpNum + 1; 478 while (MI->getOperand(RegOps).isReg()) { 479 O << ", " 480 << ARMInstPrinter::getRegisterName(MI->getOperand(RegOps).getReg()); 481 RegOps++; 482 } 483 484 O << "}"; 485 486 return false; 487 } 488 case 'R': // The most significant register of a pair. 489 case 'Q': { // The least significant register of a pair. 490 if (OpNum == 0) 491 return true; 492 const MachineOperand &FlagsOP = MI->getOperand(OpNum - 1); 493 if (!FlagsOP.isImm()) 494 return true; 495 unsigned Flags = FlagsOP.getImm(); 496 unsigned NumVals = InlineAsm::getNumOperandRegisters(Flags); 497 if (NumVals != 2) 498 return true; 499 unsigned RegOp = ExtraCode[0] == 'Q' ? OpNum : OpNum + 1; 500 if (RegOp >= MI->getNumOperands()) 501 return true; 502 const MachineOperand &MO = MI->getOperand(RegOp); 503 if (!MO.isReg()) 504 return true; 505 unsigned Reg = MO.getReg(); 506 O << ARMInstPrinter::getRegisterName(Reg); 507 return false; 508 } 509 510 case 'e': // The low doubleword register of a NEON quad register. 511 case 'f': { // The high doubleword register of a NEON quad register. 512 if (!MI->getOperand(OpNum).isReg()) 513 return true; 514 unsigned Reg = MI->getOperand(OpNum).getReg(); 515 if (!ARM::QPRRegClass.contains(Reg)) 516 return true; 517 const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo(); 518 unsigned SubReg = TRI->getSubReg(Reg, ExtraCode[0] == 'e' ? 519 ARM::dsub_0 : ARM::dsub_1); 520 O << ARMInstPrinter::getRegisterName(SubReg); 521 return false; 522 } 523 524 // These modifiers are not yet supported. 525 case 'h': // A range of VFP/NEON registers suitable for VLD1/VST1. 526 case 'H': // The highest-numbered register of a pair. 527 return true; 528 } 529 } 530 531 printOperand(MI, OpNum, O); 532 return false; 533 } 534 535 bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, 536 unsigned OpNum, unsigned AsmVariant, 537 const char *ExtraCode, 538 raw_ostream &O) { 539 // Does this asm operand have a single letter operand modifier? 540 if (ExtraCode && ExtraCode[0]) { 541 if (ExtraCode[1] != 0) return true; // Unknown modifier. 542 543 switch (ExtraCode[0]) { 544 case 'A': // A memory operand for a VLD1/VST1 instruction. 545 default: return true; // Unknown modifier. 546 case 'm': // The base register of a memory operand. 547 if (!MI->getOperand(OpNum).isReg()) 548 return true; 549 O << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg()); 550 return false; 551 } 552 } 553 554 const MachineOperand &MO = MI->getOperand(OpNum); 555 assert(MO.isReg() && "unexpected inline asm memory operand"); 556 O << "[" << ARMInstPrinter::getRegisterName(MO.getReg()) << "]"; 557 return false; 558 } 559 560 void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) { 561 if (Subtarget->isTargetDarwin()) { 562 Reloc::Model RelocM = TM.getRelocationModel(); 563 if (RelocM == Reloc::PIC_ || RelocM == Reloc::DynamicNoPIC) { 564 // Declare all the text sections up front (before the DWARF sections 565 // emitted by AsmPrinter::doInitialization) so the assembler will keep 566 // them together at the beginning of the object file. This helps 567 // avoid out-of-range branches that are due a fundamental limitation of 568 // the way symbol offsets are encoded with the current Darwin ARM 569 // relocations. 570 const TargetLoweringObjectFileMachO &TLOFMacho = 571 static_cast<const TargetLoweringObjectFileMachO &>( 572 getObjFileLowering()); 573 OutStreamer.SwitchSection(TLOFMacho.getTextSection()); 574 OutStreamer.SwitchSection(TLOFMacho.getTextCoalSection()); 575 OutStreamer.SwitchSection(TLOFMacho.getConstTextCoalSection()); 576 if (RelocM == Reloc::DynamicNoPIC) { 577 const MCSection *sect = 578 OutContext.getMachOSection("__TEXT", "__symbol_stub4", 579 MCSectionMachO::S_SYMBOL_STUBS, 580 12, SectionKind::getText()); 581 OutStreamer.SwitchSection(sect); 582 } else { 583 const MCSection *sect = 584 OutContext.getMachOSection("__TEXT", "__picsymbolstub4", 585 MCSectionMachO::S_SYMBOL_STUBS, 586 16, SectionKind::getText()); 587 OutStreamer.SwitchSection(sect); 588 } 589 const MCSection *StaticInitSect = 590 OutContext.getMachOSection("__TEXT", "__StaticInit", 591 MCSectionMachO::S_REGULAR | 592 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 593 SectionKind::getText()); 594 OutStreamer.SwitchSection(StaticInitSect); 595 } 596 } 597 598 // Use unified assembler syntax. 599 OutStreamer.EmitAssemblerFlag(MCAF_SyntaxUnified); 600 601 // Emit ARM Build Attributes 602 if (Subtarget->isTargetELF()) { 603 604 emitAttributes(); 605 } 606 } 607 608 609 void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { 610 if (Subtarget->isTargetDarwin()) { 611 // All darwin targets use mach-o. 612 const TargetLoweringObjectFileMachO &TLOFMacho = 613 static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering()); 614 MachineModuleInfoMachO &MMIMacho = 615 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 616 617 // Output non-lazy-pointers for external and common global variables. 618 MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList(); 619 620 if (!Stubs.empty()) { 621 // Switch with ".non_lazy_symbol_pointer" directive. 622 OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection()); 623 EmitAlignment(2); 624 for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 625 // L_foo$stub: 626 OutStreamer.EmitLabel(Stubs[i].first); 627 // .indirect_symbol _foo 628 MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; 629 OutStreamer.EmitSymbolAttribute(MCSym.getPointer(),MCSA_IndirectSymbol); 630 631 if (MCSym.getInt()) 632 // External to current translation unit. 633 OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/); 634 else 635 // Internal to current translation unit. 636 // 637 // When we place the LSDA into the TEXT section, the type info 638 // pointers need to be indirect and pc-rel. We accomplish this by 639 // using NLPs; however, sometimes the types are local to the file. 640 // We need to fill in the value for the NLP in those cases. 641 OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), 642 OutContext), 643 4/*size*/, 0/*addrspace*/); 644 } 645 646 Stubs.clear(); 647 OutStreamer.AddBlankLine(); 648 } 649 650 Stubs = MMIMacho.GetHiddenGVStubList(); 651 if (!Stubs.empty()) { 652 OutStreamer.SwitchSection(getObjFileLowering().getDataSection()); 653 EmitAlignment(2); 654 for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 655 // L_foo$stub: 656 OutStreamer.EmitLabel(Stubs[i].first); 657 // .long _foo 658 OutStreamer.EmitValue(MCSymbolRefExpr:: 659 Create(Stubs[i].second.getPointer(), 660 OutContext), 661 4/*size*/, 0/*addrspace*/); 662 } 663 664 Stubs.clear(); 665 OutStreamer.AddBlankLine(); 666 } 667 668 // Funny Darwin hack: This flag tells the linker that no global symbols 669 // contain code that falls through to other global symbols (e.g. the obvious 670 // implementation of multiple entry points). If this doesn't occur, the 671 // linker can safely perform dead code stripping. Since LLVM never 672 // generates code that does this, it is always safe to set. 673 OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols); 674 } 675 } 676 677 //===----------------------------------------------------------------------===// 678 // Helper routines for EmitStartOfAsmFile() and EmitEndOfAsmFile() 679 // FIXME: 680 // The following seem like one-off assembler flags, but they actually need 681 // to appear in the .ARM.attributes section in ELF. 682 // Instead of subclassing the MCELFStreamer, we do the work here. 683 684 void ARMAsmPrinter::emitAttributes() { 685 686 emitARMAttributeSection(); 687 688 /* GAS expect .fpu to be emitted, regardless of VFP build attribute */ 689 bool emitFPU = false; 690 AttributeEmitter *AttrEmitter; 691 if (OutStreamer.hasRawTextSupport()) { 692 AttrEmitter = new AsmAttributeEmitter(OutStreamer); 693 emitFPU = true; 694 } else { 695 MCObjectStreamer &O = static_cast<MCObjectStreamer&>(OutStreamer); 696 AttrEmitter = new ObjectAttributeEmitter(O); 697 } 698 699 AttrEmitter->MaybeSwitchVendor("aeabi"); 700 701 std::string CPUString = Subtarget->getCPUString(); 702 703 if (CPUString == "cortex-a8" || 704 Subtarget->isCortexA8()) { 705 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::CPU_name, "cortex-a8"); 706 AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v7); 707 AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch_profile, 708 ARMBuildAttrs::ApplicationProfile); 709 AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use, 710 ARMBuildAttrs::Allowed); 711 AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use, 712 ARMBuildAttrs::AllowThumb32); 713 // Fixme: figure out when this is emitted. 714 //AttrEmitter->EmitAttribute(ARMBuildAttrs::WMMX_arch, 715 // ARMBuildAttrs::AllowWMMXv1); 716 // 717 718 /// ADD additional Else-cases here! 719 } else if (CPUString == "xscale") { 720 AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v5TEJ); 721 AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use, 722 ARMBuildAttrs::Allowed); 723 AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use, 724 ARMBuildAttrs::Allowed); 725 } else if (CPUString == "generic") { 726 // FIXME: Why these defaults? 727 AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v4T); 728 AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use, 729 ARMBuildAttrs::Allowed); 730 AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use, 731 ARMBuildAttrs::Allowed); 732 } 733 734 if (Subtarget->hasNEON() && emitFPU) { 735 /* NEON is not exactly a VFP architecture, but GAS emit one of 736 * neon/neon-vfpv4/vfpv3/vfpv2 for .fpu parameters */ 737 if (Subtarget->hasNEONVFP4()) 738 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::Advanced_SIMD_arch, "neon-vfpv4"); 739 else 740 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::Advanced_SIMD_arch, "neon"); 741 /* If emitted for NEON, omit from VFP below, since you can have both 742 * NEON and VFP in build attributes but only one .fpu */ 743 emitFPU = false; 744 } 745 746 /* VFPv4 + .fpu */ 747 if (Subtarget->hasVFP4()) { 748 AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, 749 ARMBuildAttrs::AllowFPv4A); 750 if (emitFPU) 751 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv4"); 752 753 /* VFPv3 + .fpu */ 754 } else if (Subtarget->hasVFP3()) { 755 AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, 756 ARMBuildAttrs::AllowFPv3A); 757 if (emitFPU) 758 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv3"); 759 760 /* VFPv2 + .fpu */ 761 } else if (Subtarget->hasVFP2()) { 762 AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, 763 ARMBuildAttrs::AllowFPv2); 764 if (emitFPU) 765 AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv2"); 766 } 767 768 /* TODO: ARMBuildAttrs::Allowed is not completely accurate, 769 * since NEON can have 1 (allowed) or 2 (MAC operations) */ 770 if (Subtarget->hasNEON()) { 771 AttrEmitter->EmitAttribute(ARMBuildAttrs::Advanced_SIMD_arch, 772 ARMBuildAttrs::Allowed); 773 } 774 775 // Signal various FP modes. 776 if (!TM.Options.UnsafeFPMath) { 777 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_denormal, 778 ARMBuildAttrs::Allowed); 779 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_exceptions, 780 ARMBuildAttrs::Allowed); 781 } 782 783 if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath) 784 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model, 785 ARMBuildAttrs::Allowed); 786 else 787 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model, 788 ARMBuildAttrs::AllowIEE754); 789 790 // FIXME: add more flags to ARMBuildAttrs.h 791 // 8-bytes alignment stuff. 792 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_align8_needed, 1); 793 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_align8_preserved, 1); 794 795 // Hard float. Use both S and D registers and conform to AAPCS-VFP. 796 if (Subtarget->isAAPCS_ABI() && TM.Options.FloatABIType == FloatABI::Hard) { 797 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_HardFP_use, 3); 798 AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_VFP_args, 1); 799 } 800 // FIXME: Should we signal R9 usage? 801 802 if (Subtarget->hasDivide()) 803 AttrEmitter->EmitAttribute(ARMBuildAttrs::DIV_use, 1); 804 805 AttrEmitter->Finish(); 806 delete AttrEmitter; 807 } 808 809 void ARMAsmPrinter::emitARMAttributeSection() { 810 // <format-version> 811 // [ <section-length> "vendor-name" 812 // [ <file-tag> <size> <attribute>* 813 // | <section-tag> <size> <section-number>* 0 <attribute>* 814 // | <symbol-tag> <size> <symbol-number>* 0 <attribute>* 815 // ]+ 816 // ]* 817 818 if (OutStreamer.hasRawTextSupport()) 819 return; 820 821 const ARMElfTargetObjectFile &TLOFELF = 822 static_cast<const ARMElfTargetObjectFile &> 823 (getObjFileLowering()); 824 825 OutStreamer.SwitchSection(TLOFELF.getAttributesSection()); 826 827 // Format version 828 OutStreamer.EmitIntValue(0x41, 1); 829 } 830 831 //===----------------------------------------------------------------------===// 832 833 static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber, 834 unsigned LabelId, MCContext &Ctx) { 835 836 MCSymbol *Label = Ctx.GetOrCreateSymbol(Twine(Prefix) 837 + "PC" + Twine(FunctionNumber) + "_" + Twine(LabelId)); 838 return Label; 839 } 840 841 static MCSymbolRefExpr::VariantKind 842 getModifierVariantKind(ARMCP::ARMCPModifier Modifier) { 843 switch (Modifier) { 844 case ARMCP::no_modifier: return MCSymbolRefExpr::VK_None; 845 case ARMCP::TLSGD: return MCSymbolRefExpr::VK_ARM_TLSGD; 846 case ARMCP::TPOFF: return MCSymbolRefExpr::VK_ARM_TPOFF; 847 case ARMCP::GOTTPOFF: return MCSymbolRefExpr::VK_ARM_GOTTPOFF; 848 case ARMCP::GOT: return MCSymbolRefExpr::VK_ARM_GOT; 849 case ARMCP::GOTOFF: return MCSymbolRefExpr::VK_ARM_GOTOFF; 850 } 851 llvm_unreachable("Invalid ARMCPModifier!"); 852 } 853 854 MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV) { 855 bool isIndirect = Subtarget->isTargetDarwin() && 856 Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel()); 857 if (!isIndirect) 858 return Mang->getSymbol(GV); 859 860 // FIXME: Remove this when Darwin transition to @GOT like syntax. 861 MCSymbol *MCSym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); 862 MachineModuleInfoMachO &MMIMachO = 863 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 864 MachineModuleInfoImpl::StubValueTy &StubSym = 865 GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(MCSym) : 866 MMIMachO.getGVStubEntry(MCSym); 867 if (StubSym.getPointer() == 0) 868 StubSym = MachineModuleInfoImpl:: 869 StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); 870 return MCSym; 871 } 872 873 void ARMAsmPrinter:: 874 EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 875 int Size = TM.getTargetData()->getTypeAllocSize(MCPV->getType()); 876 877 ARMConstantPoolValue *ACPV = static_cast<ARMConstantPoolValue*>(MCPV); 878 879 MCSymbol *MCSym; 880 if (ACPV->isLSDA()) { 881 SmallString<128> Str; 882 raw_svector_ostream OS(Str); 883 OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber(); 884 MCSym = OutContext.GetOrCreateSymbol(OS.str()); 885 } else if (ACPV->isBlockAddress()) { 886 const BlockAddress *BA = 887 cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress(); 888 MCSym = GetBlockAddressSymbol(BA); 889 } else if (ACPV->isGlobalValue()) { 890 const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV(); 891 MCSym = GetARMGVSymbol(GV); 892 } else if (ACPV->isMachineBasicBlock()) { 893 const MachineBasicBlock *MBB = cast<ARMConstantPoolMBB>(ACPV)->getMBB(); 894 MCSym = MBB->getSymbol(); 895 } else { 896 assert(ACPV->isExtSymbol() && "unrecognized constant pool value"); 897 const char *Sym = cast<ARMConstantPoolSymbol>(ACPV)->getSymbol(); 898 MCSym = GetExternalSymbolSymbol(Sym); 899 } 900 901 // Create an MCSymbol for the reference. 902 const MCExpr *Expr = 903 MCSymbolRefExpr::Create(MCSym, getModifierVariantKind(ACPV->getModifier()), 904 OutContext); 905 906 if (ACPV->getPCAdjustment()) { 907 MCSymbol *PCLabel = getPICLabel(MAI->getPrivateGlobalPrefix(), 908 getFunctionNumber(), 909 ACPV->getLabelId(), 910 OutContext); 911 const MCExpr *PCRelExpr = MCSymbolRefExpr::Create(PCLabel, OutContext); 912 PCRelExpr = 913 MCBinaryExpr::CreateAdd(PCRelExpr, 914 MCConstantExpr::Create(ACPV->getPCAdjustment(), 915 OutContext), 916 OutContext); 917 if (ACPV->mustAddCurrentAddress()) { 918 // We want "(<expr> - .)", but MC doesn't have a concept of the '.' 919 // label, so just emit a local label end reference that instead. 920 MCSymbol *DotSym = OutContext.CreateTempSymbol(); 921 OutStreamer.EmitLabel(DotSym); 922 const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); 923 PCRelExpr = MCBinaryExpr::CreateSub(PCRelExpr, DotExpr, OutContext); 924 } 925 Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext); 926 } 927 OutStreamer.EmitValue(Expr, Size); 928 } 929 930 void ARMAsmPrinter::EmitJumpTable(const MachineInstr *MI) { 931 unsigned Opcode = MI->getOpcode(); 932 int OpNum = 1; 933 if (Opcode == ARM::BR_JTadd) 934 OpNum = 2; 935 else if (Opcode == ARM::BR_JTm) 936 OpNum = 3; 937 938 const MachineOperand &MO1 = MI->getOperand(OpNum); 939 const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id 940 unsigned JTI = MO1.getIndex(); 941 942 // Tag the jump table appropriately for precise disassembly. 943 OutStreamer.EmitJumpTable32Region(); 944 945 // Emit a label for the jump table. 946 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); 947 OutStreamer.EmitLabel(JTISymbol); 948 949 // Emit each entry of the table. 950 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); 951 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 952 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; 953 954 for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { 955 MachineBasicBlock *MBB = JTBBs[i]; 956 // Construct an MCExpr for the entry. We want a value of the form: 957 // (BasicBlockAddr - TableBeginAddr) 958 // 959 // For example, a table with entries jumping to basic blocks BB0 and BB1 960 // would look like: 961 // LJTI_0_0: 962 // .word (LBB0 - LJTI_0_0) 963 // .word (LBB1 - LJTI_0_0) 964 const MCExpr *Expr = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 965 966 if (TM.getRelocationModel() == Reloc::PIC_) 967 Expr = MCBinaryExpr::CreateSub(Expr, MCSymbolRefExpr::Create(JTISymbol, 968 OutContext), 969 OutContext); 970 // If we're generating a table of Thumb addresses in static relocation 971 // model, we need to add one to keep interworking correctly. 972 else if (AFI->isThumbFunction()) 973 Expr = MCBinaryExpr::CreateAdd(Expr, MCConstantExpr::Create(1,OutContext), 974 OutContext); 975 OutStreamer.EmitValue(Expr, 4); 976 } 977 } 978 979 void ARMAsmPrinter::EmitJump2Table(const MachineInstr *MI) { 980 unsigned Opcode = MI->getOpcode(); 981 int OpNum = (Opcode == ARM::t2BR_JT) ? 2 : 1; 982 const MachineOperand &MO1 = MI->getOperand(OpNum); 983 const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id 984 unsigned JTI = MO1.getIndex(); 985 986 // Emit a label for the jump table. 987 if (MI->getOpcode() == ARM::t2TBB_JT) { 988 OutStreamer.EmitJumpTable8Region(); 989 } else if (MI->getOpcode() == ARM::t2TBH_JT) { 990 OutStreamer.EmitJumpTable16Region(); 991 } else { 992 OutStreamer.EmitJumpTable32Region(); 993 } 994 995 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm()); 996 OutStreamer.EmitLabel(JTISymbol); 997 998 // Emit each entry of the table. 999 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); 1000 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 1001 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; 1002 unsigned OffsetWidth = 4; 1003 if (MI->getOpcode() == ARM::t2TBB_JT) 1004 OffsetWidth = 1; 1005 else if (MI->getOpcode() == ARM::t2TBH_JT) 1006 OffsetWidth = 2; 1007 1008 for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { 1009 MachineBasicBlock *MBB = JTBBs[i]; 1010 const MCExpr *MBBSymbolExpr = MCSymbolRefExpr::Create(MBB->getSymbol(), 1011 OutContext); 1012 // If this isn't a TBB or TBH, the entries are direct branch instructions. 1013 if (OffsetWidth == 4) { 1014 MCInst BrInst; 1015 BrInst.setOpcode(ARM::t2B); 1016 BrInst.addOperand(MCOperand::CreateExpr(MBBSymbolExpr)); 1017 BrInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1018 BrInst.addOperand(MCOperand::CreateReg(0)); 1019 OutStreamer.EmitInstruction(BrInst); 1020 continue; 1021 } 1022 // Otherwise it's an offset from the dispatch instruction. Construct an 1023 // MCExpr for the entry. We want a value of the form: 1024 // (BasicBlockAddr - TableBeginAddr) / 2 1025 // 1026 // For example, a TBB table with entries jumping to basic blocks BB0 and BB1 1027 // would look like: 1028 // LJTI_0_0: 1029 // .byte (LBB0 - LJTI_0_0) / 2 1030 // .byte (LBB1 - LJTI_0_0) / 2 1031 const MCExpr *Expr = 1032 MCBinaryExpr::CreateSub(MBBSymbolExpr, 1033 MCSymbolRefExpr::Create(JTISymbol, OutContext), 1034 OutContext); 1035 Expr = MCBinaryExpr::CreateDiv(Expr, MCConstantExpr::Create(2, OutContext), 1036 OutContext); 1037 OutStreamer.EmitValue(Expr, OffsetWidth); 1038 } 1039 } 1040 1041 void ARMAsmPrinter::PrintDebugValueComment(const MachineInstr *MI, 1042 raw_ostream &OS) { 1043 unsigned NOps = MI->getNumOperands(); 1044 assert(NOps==4); 1045 OS << '\t' << MAI->getCommentString() << "DEBUG_VALUE: "; 1046 // cast away const; DIetc do not take const operands for some reason. 1047 DIVariable V(const_cast<MDNode *>(MI->getOperand(NOps-1).getMetadata())); 1048 OS << V.getName(); 1049 OS << " <- "; 1050 // Frame address. Currently handles register +- offset only. 1051 assert(MI->getOperand(0).isReg() && MI->getOperand(1).isImm()); 1052 OS << '['; printOperand(MI, 0, OS); OS << '+'; printOperand(MI, 1, OS); 1053 OS << ']'; 1054 OS << "+"; 1055 printOperand(MI, NOps-2, OS); 1056 } 1057 1058 static void populateADROperands(MCInst &Inst, unsigned Dest, 1059 const MCSymbol *Label, 1060 unsigned pred, unsigned ccreg, 1061 MCContext &Ctx) { 1062 const MCExpr *SymbolExpr = MCSymbolRefExpr::Create(Label, Ctx); 1063 Inst.addOperand(MCOperand::CreateReg(Dest)); 1064 Inst.addOperand(MCOperand::CreateExpr(SymbolExpr)); 1065 // Add predicate operands. 1066 Inst.addOperand(MCOperand::CreateImm(pred)); 1067 Inst.addOperand(MCOperand::CreateReg(ccreg)); 1068 } 1069 1070 void ARMAsmPrinter::EmitPatchedInstruction(const MachineInstr *MI, 1071 unsigned Opcode) { 1072 MCInst TmpInst; 1073 1074 // Emit the instruction as usual, just patch the opcode. 1075 LowerARMMachineInstrToMCInst(MI, TmpInst, *this); 1076 TmpInst.setOpcode(Opcode); 1077 OutStreamer.EmitInstruction(TmpInst); 1078 } 1079 1080 void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) { 1081 assert(MI->getFlag(MachineInstr::FrameSetup) && 1082 "Only instruction which are involved into frame setup code are allowed"); 1083 1084 const MachineFunction &MF = *MI->getParent()->getParent(); 1085 const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo(); 1086 const ARMFunctionInfo &AFI = *MF.getInfo<ARMFunctionInfo>(); 1087 1088 unsigned FramePtr = RegInfo->getFrameRegister(MF); 1089 unsigned Opc = MI->getOpcode(); 1090 unsigned SrcReg, DstReg; 1091 1092 if (Opc == ARM::tPUSH || Opc == ARM::tLDRpci) { 1093 // Two special cases: 1094 // 1) tPUSH does not have src/dst regs. 1095 // 2) for Thumb1 code we sometimes materialize the constant via constpool 1096 // load. Yes, this is pretty fragile, but for now I don't see better 1097 // way... :( 1098 SrcReg = DstReg = ARM::SP; 1099 } else { 1100 SrcReg = MI->getOperand(1).getReg(); 1101 DstReg = MI->getOperand(0).getReg(); 1102 } 1103 1104 // Try to figure out the unwinding opcode out of src / dst regs. 1105 if (MI->mayStore()) { 1106 // Register saves. 1107 assert(DstReg == ARM::SP && 1108 "Only stack pointer as a destination reg is supported"); 1109 1110 SmallVector<unsigned, 4> RegList; 1111 // Skip src & dst reg, and pred ops. 1112 unsigned StartOp = 2 + 2; 1113 // Use all the operands. 1114 unsigned NumOffset = 0; 1115 1116 switch (Opc) { 1117 default: 1118 MI->dump(); 1119 llvm_unreachable("Unsupported opcode for unwinding information"); 1120 case ARM::tPUSH: 1121 // Special case here: no src & dst reg, but two extra imp ops. 1122 StartOp = 2; NumOffset = 2; 1123 case ARM::STMDB_UPD: 1124 case ARM::t2STMDB_UPD: 1125 case ARM::VSTMDDB_UPD: 1126 assert(SrcReg == ARM::SP && 1127 "Only stack pointer as a source reg is supported"); 1128 for (unsigned i = StartOp, NumOps = MI->getNumOperands() - NumOffset; 1129 i != NumOps; ++i) 1130 RegList.push_back(MI->getOperand(i).getReg()); 1131 break; 1132 case ARM::STR_PRE_IMM: 1133 case ARM::STR_PRE_REG: 1134 case ARM::t2STR_PRE: 1135 assert(MI->getOperand(2).getReg() == ARM::SP && 1136 "Only stack pointer as a source reg is supported"); 1137 RegList.push_back(SrcReg); 1138 break; 1139 } 1140 OutStreamer.EmitRegSave(RegList, Opc == ARM::VSTMDDB_UPD); 1141 } else { 1142 // Changes of stack / frame pointer. 1143 if (SrcReg == ARM::SP) { 1144 int64_t Offset = 0; 1145 switch (Opc) { 1146 default: 1147 MI->dump(); 1148 llvm_unreachable("Unsupported opcode for unwinding information"); 1149 case ARM::MOVr: 1150 case ARM::tMOVr: 1151 Offset = 0; 1152 break; 1153 case ARM::ADDri: 1154 Offset = -MI->getOperand(2).getImm(); 1155 break; 1156 case ARM::SUBri: 1157 case ARM::t2SUBri: 1158 Offset = MI->getOperand(2).getImm(); 1159 break; 1160 case ARM::tSUBspi: 1161 Offset = MI->getOperand(2).getImm()*4; 1162 break; 1163 case ARM::tADDspi: 1164 case ARM::tADDrSPi: 1165 Offset = -MI->getOperand(2).getImm()*4; 1166 break; 1167 case ARM::tLDRpci: { 1168 // Grab the constpool index and check, whether it corresponds to 1169 // original or cloned constpool entry. 1170 unsigned CPI = MI->getOperand(1).getIndex(); 1171 const MachineConstantPool *MCP = MF.getConstantPool(); 1172 if (CPI >= MCP->getConstants().size()) 1173 CPI = AFI.getOriginalCPIdx(CPI); 1174 assert(CPI != -1U && "Invalid constpool index"); 1175 1176 // Derive the actual offset. 1177 const MachineConstantPoolEntry &CPE = MCP->getConstants()[CPI]; 1178 assert(!CPE.isMachineConstantPoolEntry() && "Invalid constpool entry"); 1179 // FIXME: Check for user, it should be "add" instruction! 1180 Offset = -cast<ConstantInt>(CPE.Val.ConstVal)->getSExtValue(); 1181 break; 1182 } 1183 } 1184 1185 if (DstReg == FramePtr && FramePtr != ARM::SP) 1186 // Set-up of the frame pointer. Positive values correspond to "add" 1187 // instruction. 1188 OutStreamer.EmitSetFP(FramePtr, ARM::SP, -Offset); 1189 else if (DstReg == ARM::SP) { 1190 // Change of SP by an offset. Positive values correspond to "sub" 1191 // instruction. 1192 OutStreamer.EmitPad(Offset); 1193 } else { 1194 MI->dump(); 1195 llvm_unreachable("Unsupported opcode for unwinding information"); 1196 } 1197 } else if (DstReg == ARM::SP) { 1198 // FIXME: .movsp goes here 1199 MI->dump(); 1200 llvm_unreachable("Unsupported opcode for unwinding information"); 1201 } 1202 else { 1203 MI->dump(); 1204 llvm_unreachable("Unsupported opcode for unwinding information"); 1205 } 1206 } 1207 } 1208 1209 extern cl::opt<bool> EnableARMEHABI; 1210 1211 // Simple pseudo-instructions have their lowering (with expansion to real 1212 // instructions) auto-generated. 1213 #include "ARMGenMCPseudoLowering.inc" 1214 1215 void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { 1216 if (MI->getOpcode() != ARM::CONSTPOOL_ENTRY) 1217 OutStreamer.EmitCodeRegion(); 1218 1219 // Emit unwinding stuff for frame-related instructions 1220 if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup)) 1221 EmitUnwindingInstruction(MI); 1222 1223 // Do any auto-generated pseudo lowerings. 1224 if (emitPseudoExpansionLowering(OutStreamer, MI)) 1225 return; 1226 1227 assert(!convertAddSubFlagsOpcode(MI->getOpcode()) && 1228 "Pseudo flag setting opcode should be expanded early"); 1229 1230 // Check for manual lowerings. 1231 unsigned Opc = MI->getOpcode(); 1232 switch (Opc) { 1233 case ARM::t2MOVi32imm: llvm_unreachable("Should be lowered by thumb2it pass"); 1234 case ARM::DBG_VALUE: { 1235 if (isVerbose() && OutStreamer.hasRawTextSupport()) { 1236 SmallString<128> TmpStr; 1237 raw_svector_ostream OS(TmpStr); 1238 PrintDebugValueComment(MI, OS); 1239 OutStreamer.EmitRawText(StringRef(OS.str())); 1240 } 1241 return; 1242 } 1243 case ARM::LEApcrel: 1244 case ARM::tLEApcrel: 1245 case ARM::t2LEApcrel: { 1246 // FIXME: Need to also handle globals and externals 1247 MCInst TmpInst; 1248 TmpInst.setOpcode(MI->getOpcode() == ARM::t2LEApcrel ? ARM::t2ADR 1249 : (MI->getOpcode() == ARM::tLEApcrel ? ARM::tADR 1250 : ARM::ADR)); 1251 populateADROperands(TmpInst, MI->getOperand(0).getReg(), 1252 GetCPISymbol(MI->getOperand(1).getIndex()), 1253 MI->getOperand(2).getImm(), MI->getOperand(3).getReg(), 1254 OutContext); 1255 OutStreamer.EmitInstruction(TmpInst); 1256 return; 1257 } 1258 case ARM::LEApcrelJT: 1259 case ARM::tLEApcrelJT: 1260 case ARM::t2LEApcrelJT: { 1261 MCInst TmpInst; 1262 TmpInst.setOpcode(MI->getOpcode() == ARM::t2LEApcrelJT ? ARM::t2ADR 1263 : (MI->getOpcode() == ARM::tLEApcrelJT ? ARM::tADR 1264 : ARM::ADR)); 1265 populateADROperands(TmpInst, MI->getOperand(0).getReg(), 1266 GetARMJTIPICJumpTableLabel2(MI->getOperand(1).getIndex(), 1267 MI->getOperand(2).getImm()), 1268 MI->getOperand(3).getImm(), MI->getOperand(4).getReg(), 1269 OutContext); 1270 OutStreamer.EmitInstruction(TmpInst); 1271 return; 1272 } 1273 // Darwin call instructions are just normal call instructions with different 1274 // clobber semantics (they clobber R9). 1275 case ARM::BXr9_CALL: 1276 case ARM::BX_CALL: { 1277 { 1278 MCInst TmpInst; 1279 TmpInst.setOpcode(ARM::MOVr); 1280 TmpInst.addOperand(MCOperand::CreateReg(ARM::LR)); 1281 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1282 // Add predicate operands. 1283 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1284 TmpInst.addOperand(MCOperand::CreateReg(0)); 1285 // Add 's' bit operand (always reg0 for this) 1286 TmpInst.addOperand(MCOperand::CreateReg(0)); 1287 OutStreamer.EmitInstruction(TmpInst); 1288 } 1289 { 1290 MCInst TmpInst; 1291 TmpInst.setOpcode(ARM::BX); 1292 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1293 OutStreamer.EmitInstruction(TmpInst); 1294 } 1295 return; 1296 } 1297 case ARM::tBXr9_CALL: 1298 case ARM::tBX_CALL: { 1299 { 1300 MCInst TmpInst; 1301 TmpInst.setOpcode(ARM::tMOVr); 1302 TmpInst.addOperand(MCOperand::CreateReg(ARM::LR)); 1303 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1304 // Add predicate operands. 1305 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1306 TmpInst.addOperand(MCOperand::CreateReg(0)); 1307 OutStreamer.EmitInstruction(TmpInst); 1308 } 1309 { 1310 MCInst TmpInst; 1311 TmpInst.setOpcode(ARM::tBX); 1312 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1313 // Add predicate operands. 1314 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1315 TmpInst.addOperand(MCOperand::CreateReg(0)); 1316 OutStreamer.EmitInstruction(TmpInst); 1317 } 1318 return; 1319 } 1320 case ARM::BMOVPCRXr9_CALL: 1321 case ARM::BMOVPCRX_CALL: { 1322 { 1323 MCInst TmpInst; 1324 TmpInst.setOpcode(ARM::MOVr); 1325 TmpInst.addOperand(MCOperand::CreateReg(ARM::LR)); 1326 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1327 // Add predicate operands. 1328 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1329 TmpInst.addOperand(MCOperand::CreateReg(0)); 1330 // Add 's' bit operand (always reg0 for this) 1331 TmpInst.addOperand(MCOperand::CreateReg(0)); 1332 OutStreamer.EmitInstruction(TmpInst); 1333 } 1334 { 1335 MCInst TmpInst; 1336 TmpInst.setOpcode(ARM::MOVr); 1337 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1338 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1339 // Add predicate operands. 1340 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1341 TmpInst.addOperand(MCOperand::CreateReg(0)); 1342 // Add 's' bit operand (always reg0 for this) 1343 TmpInst.addOperand(MCOperand::CreateReg(0)); 1344 OutStreamer.EmitInstruction(TmpInst); 1345 } 1346 return; 1347 } 1348 case ARM::MOVi16_ga_pcrel: 1349 case ARM::t2MOVi16_ga_pcrel: { 1350 MCInst TmpInst; 1351 TmpInst.setOpcode(Opc == ARM::MOVi16_ga_pcrel? ARM::MOVi16 : ARM::t2MOVi16); 1352 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1353 1354 unsigned TF = MI->getOperand(1).getTargetFlags(); 1355 bool isPIC = TF == ARMII::MO_LO16_NONLAZY_PIC; 1356 const GlobalValue *GV = MI->getOperand(1).getGlobal(); 1357 MCSymbol *GVSym = GetARMGVSymbol(GV); 1358 const MCExpr *GVSymExpr = MCSymbolRefExpr::Create(GVSym, OutContext); 1359 if (isPIC) { 1360 MCSymbol *LabelSym = getPICLabel(MAI->getPrivateGlobalPrefix(), 1361 getFunctionNumber(), 1362 MI->getOperand(2).getImm(), OutContext); 1363 const MCExpr *LabelSymExpr= MCSymbolRefExpr::Create(LabelSym, OutContext); 1364 unsigned PCAdj = (Opc == ARM::MOVi16_ga_pcrel) ? 8 : 4; 1365 const MCExpr *PCRelExpr = 1366 ARMMCExpr::CreateLower16(MCBinaryExpr::CreateSub(GVSymExpr, 1367 MCBinaryExpr::CreateAdd(LabelSymExpr, 1368 MCConstantExpr::Create(PCAdj, OutContext), 1369 OutContext), OutContext), OutContext); 1370 TmpInst.addOperand(MCOperand::CreateExpr(PCRelExpr)); 1371 } else { 1372 const MCExpr *RefExpr= ARMMCExpr::CreateLower16(GVSymExpr, OutContext); 1373 TmpInst.addOperand(MCOperand::CreateExpr(RefExpr)); 1374 } 1375 1376 // Add predicate operands. 1377 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1378 TmpInst.addOperand(MCOperand::CreateReg(0)); 1379 // Add 's' bit operand (always reg0 for this) 1380 TmpInst.addOperand(MCOperand::CreateReg(0)); 1381 OutStreamer.EmitInstruction(TmpInst); 1382 return; 1383 } 1384 case ARM::MOVTi16_ga_pcrel: 1385 case ARM::t2MOVTi16_ga_pcrel: { 1386 MCInst TmpInst; 1387 TmpInst.setOpcode(Opc == ARM::MOVTi16_ga_pcrel 1388 ? ARM::MOVTi16 : ARM::t2MOVTi16); 1389 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1390 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); 1391 1392 unsigned TF = MI->getOperand(2).getTargetFlags(); 1393 bool isPIC = TF == ARMII::MO_HI16_NONLAZY_PIC; 1394 const GlobalValue *GV = MI->getOperand(2).getGlobal(); 1395 MCSymbol *GVSym = GetARMGVSymbol(GV); 1396 const MCExpr *GVSymExpr = MCSymbolRefExpr::Create(GVSym, OutContext); 1397 if (isPIC) { 1398 MCSymbol *LabelSym = getPICLabel(MAI->getPrivateGlobalPrefix(), 1399 getFunctionNumber(), 1400 MI->getOperand(3).getImm(), OutContext); 1401 const MCExpr *LabelSymExpr= MCSymbolRefExpr::Create(LabelSym, OutContext); 1402 unsigned PCAdj = (Opc == ARM::MOVTi16_ga_pcrel) ? 8 : 4; 1403 const MCExpr *PCRelExpr = 1404 ARMMCExpr::CreateUpper16(MCBinaryExpr::CreateSub(GVSymExpr, 1405 MCBinaryExpr::CreateAdd(LabelSymExpr, 1406 MCConstantExpr::Create(PCAdj, OutContext), 1407 OutContext), OutContext), OutContext); 1408 TmpInst.addOperand(MCOperand::CreateExpr(PCRelExpr)); 1409 } else { 1410 const MCExpr *RefExpr= ARMMCExpr::CreateUpper16(GVSymExpr, OutContext); 1411 TmpInst.addOperand(MCOperand::CreateExpr(RefExpr)); 1412 } 1413 // Add predicate operands. 1414 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1415 TmpInst.addOperand(MCOperand::CreateReg(0)); 1416 // Add 's' bit operand (always reg0 for this) 1417 TmpInst.addOperand(MCOperand::CreateReg(0)); 1418 OutStreamer.EmitInstruction(TmpInst); 1419 return; 1420 } 1421 case ARM::tPICADD: { 1422 // This is a pseudo op for a label + instruction sequence, which looks like: 1423 // LPC0: 1424 // add r0, pc 1425 // This adds the address of LPC0 to r0. 1426 1427 // Emit the label. 1428 OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(), 1429 getFunctionNumber(), MI->getOperand(2).getImm(), 1430 OutContext)); 1431 1432 // Form and emit the add. 1433 MCInst AddInst; 1434 AddInst.setOpcode(ARM::tADDhirr); 1435 AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1436 AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1437 AddInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1438 // Add predicate operands. 1439 AddInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1440 AddInst.addOperand(MCOperand::CreateReg(0)); 1441 OutStreamer.EmitInstruction(AddInst); 1442 return; 1443 } 1444 case ARM::PICADD: { 1445 // This is a pseudo op for a label + instruction sequence, which looks like: 1446 // LPC0: 1447 // add r0, pc, r0 1448 // This adds the address of LPC0 to r0. 1449 1450 // Emit the label. 1451 OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(), 1452 getFunctionNumber(), MI->getOperand(2).getImm(), 1453 OutContext)); 1454 1455 // Form and emit the add. 1456 MCInst AddInst; 1457 AddInst.setOpcode(ARM::ADDrr); 1458 AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1459 AddInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1460 AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); 1461 // Add predicate operands. 1462 AddInst.addOperand(MCOperand::CreateImm(MI->getOperand(3).getImm())); 1463 AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(4).getReg())); 1464 // Add 's' bit operand (always reg0 for this) 1465 AddInst.addOperand(MCOperand::CreateReg(0)); 1466 OutStreamer.EmitInstruction(AddInst); 1467 return; 1468 } 1469 case ARM::PICSTR: 1470 case ARM::PICSTRB: 1471 case ARM::PICSTRH: 1472 case ARM::PICLDR: 1473 case ARM::PICLDRB: 1474 case ARM::PICLDRH: 1475 case ARM::PICLDRSB: 1476 case ARM::PICLDRSH: { 1477 // This is a pseudo op for a label + instruction sequence, which looks like: 1478 // LPC0: 1479 // OP r0, [pc, r0] 1480 // The LCP0 label is referenced by a constant pool entry in order to get 1481 // a PC-relative address at the ldr instruction. 1482 1483 // Emit the label. 1484 OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(), 1485 getFunctionNumber(), MI->getOperand(2).getImm(), 1486 OutContext)); 1487 1488 // Form and emit the load 1489 unsigned Opcode; 1490 switch (MI->getOpcode()) { 1491 default: 1492 llvm_unreachable("Unexpected opcode!"); 1493 case ARM::PICSTR: Opcode = ARM::STRrs; break; 1494 case ARM::PICSTRB: Opcode = ARM::STRBrs; break; 1495 case ARM::PICSTRH: Opcode = ARM::STRH; break; 1496 case ARM::PICLDR: Opcode = ARM::LDRrs; break; 1497 case ARM::PICLDRB: Opcode = ARM::LDRBrs; break; 1498 case ARM::PICLDRH: Opcode = ARM::LDRH; break; 1499 case ARM::PICLDRSB: Opcode = ARM::LDRSB; break; 1500 case ARM::PICLDRSH: Opcode = ARM::LDRSH; break; 1501 } 1502 MCInst LdStInst; 1503 LdStInst.setOpcode(Opcode); 1504 LdStInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1505 LdStInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1506 LdStInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); 1507 LdStInst.addOperand(MCOperand::CreateImm(0)); 1508 // Add predicate operands. 1509 LdStInst.addOperand(MCOperand::CreateImm(MI->getOperand(3).getImm())); 1510 LdStInst.addOperand(MCOperand::CreateReg(MI->getOperand(4).getReg())); 1511 OutStreamer.EmitInstruction(LdStInst); 1512 1513 return; 1514 } 1515 case ARM::CONSTPOOL_ENTRY: { 1516 /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool 1517 /// in the function. The first operand is the ID# for this instruction, the 1518 /// second is the index into the MachineConstantPool that this is, the third 1519 /// is the size in bytes of this constant pool entry. 1520 /// The required alignment is specified on the basic block holding this MI. 1521 unsigned LabelId = (unsigned)MI->getOperand(0).getImm(); 1522 unsigned CPIdx = (unsigned)MI->getOperand(1).getIndex(); 1523 1524 // Mark the constant pool entry as data if we're not already in a data 1525 // region. 1526 OutStreamer.EmitDataRegion(); 1527 OutStreamer.EmitLabel(GetCPISymbol(LabelId)); 1528 1529 const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx]; 1530 if (MCPE.isMachineConstantPoolEntry()) 1531 EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal); 1532 else 1533 EmitGlobalConstant(MCPE.Val.ConstVal); 1534 return; 1535 } 1536 case ARM::t2BR_JT: { 1537 // Lower and emit the instruction itself, then the jump table following it. 1538 MCInst TmpInst; 1539 TmpInst.setOpcode(ARM::tMOVr); 1540 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1541 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1542 // Add predicate operands. 1543 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1544 TmpInst.addOperand(MCOperand::CreateReg(0)); 1545 OutStreamer.EmitInstruction(TmpInst); 1546 // Output the data for the jump table itself 1547 EmitJump2Table(MI); 1548 return; 1549 } 1550 case ARM::t2TBB_JT: { 1551 // Lower and emit the instruction itself, then the jump table following it. 1552 MCInst TmpInst; 1553 1554 TmpInst.setOpcode(ARM::t2TBB); 1555 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1556 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1557 // Add predicate operands. 1558 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1559 TmpInst.addOperand(MCOperand::CreateReg(0)); 1560 OutStreamer.EmitInstruction(TmpInst); 1561 // Output the data for the jump table itself 1562 EmitJump2Table(MI); 1563 // Make sure the next instruction is 2-byte aligned. 1564 EmitAlignment(1); 1565 return; 1566 } 1567 case ARM::t2TBH_JT: { 1568 // Lower and emit the instruction itself, then the jump table following it. 1569 MCInst TmpInst; 1570 1571 TmpInst.setOpcode(ARM::t2TBH); 1572 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1573 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1574 // Add predicate operands. 1575 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1576 TmpInst.addOperand(MCOperand::CreateReg(0)); 1577 OutStreamer.EmitInstruction(TmpInst); 1578 // Output the data for the jump table itself 1579 EmitJump2Table(MI); 1580 return; 1581 } 1582 case ARM::tBR_JTr: 1583 case ARM::BR_JTr: { 1584 // Lower and emit the instruction itself, then the jump table following it. 1585 // mov pc, target 1586 MCInst TmpInst; 1587 unsigned Opc = MI->getOpcode() == ARM::BR_JTr ? 1588 ARM::MOVr : ARM::tMOVr; 1589 TmpInst.setOpcode(Opc); 1590 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1591 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1592 // Add predicate operands. 1593 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1594 TmpInst.addOperand(MCOperand::CreateReg(0)); 1595 // Add 's' bit operand (always reg0 for this) 1596 if (Opc == ARM::MOVr) 1597 TmpInst.addOperand(MCOperand::CreateReg(0)); 1598 OutStreamer.EmitInstruction(TmpInst); 1599 1600 // Make sure the Thumb jump table is 4-byte aligned. 1601 if (Opc == ARM::tMOVr) 1602 EmitAlignment(2); 1603 1604 // Output the data for the jump table itself 1605 EmitJumpTable(MI); 1606 return; 1607 } 1608 case ARM::BR_JTm: { 1609 // Lower and emit the instruction itself, then the jump table following it. 1610 // ldr pc, target 1611 MCInst TmpInst; 1612 if (MI->getOperand(1).getReg() == 0) { 1613 // literal offset 1614 TmpInst.setOpcode(ARM::LDRi12); 1615 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1616 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1617 TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); 1618 } else { 1619 TmpInst.setOpcode(ARM::LDRrs); 1620 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1621 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1622 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); 1623 TmpInst.addOperand(MCOperand::CreateImm(0)); 1624 } 1625 // Add predicate operands. 1626 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1627 TmpInst.addOperand(MCOperand::CreateReg(0)); 1628 OutStreamer.EmitInstruction(TmpInst); 1629 1630 // Output the data for the jump table itself 1631 EmitJumpTable(MI); 1632 return; 1633 } 1634 case ARM::BR_JTadd: { 1635 // Lower and emit the instruction itself, then the jump table following it. 1636 // add pc, target, idx 1637 MCInst TmpInst; 1638 TmpInst.setOpcode(ARM::ADDrr); 1639 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1640 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); 1641 TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); 1642 // Add predicate operands. 1643 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1644 TmpInst.addOperand(MCOperand::CreateReg(0)); 1645 // Add 's' bit operand (always reg0 for this) 1646 TmpInst.addOperand(MCOperand::CreateReg(0)); 1647 OutStreamer.EmitInstruction(TmpInst); 1648 1649 // Output the data for the jump table itself 1650 EmitJumpTable(MI); 1651 return; 1652 } 1653 case ARM::TRAP: { 1654 // Non-Darwin binutils don't yet support the "trap" mnemonic. 1655 // FIXME: Remove this special case when they do. 1656 if (!Subtarget->isTargetDarwin()) { 1657 //.long 0xe7ffdefe @ trap 1658 uint32_t Val = 0xe7ffdefeUL; 1659 OutStreamer.AddComment("trap"); 1660 OutStreamer.EmitIntValue(Val, 4); 1661 return; 1662 } 1663 break; 1664 } 1665 case ARM::tTRAP: { 1666 // Non-Darwin binutils don't yet support the "trap" mnemonic. 1667 // FIXME: Remove this special case when they do. 1668 if (!Subtarget->isTargetDarwin()) { 1669 //.short 57086 @ trap 1670 uint16_t Val = 0xdefe; 1671 OutStreamer.AddComment("trap"); 1672 OutStreamer.EmitIntValue(Val, 2); 1673 return; 1674 } 1675 break; 1676 } 1677 case ARM::t2Int_eh_sjlj_setjmp: 1678 case ARM::t2Int_eh_sjlj_setjmp_nofp: 1679 case ARM::tInt_eh_sjlj_setjmp: { 1680 // Two incoming args: GPR:$src, GPR:$val 1681 // mov $val, pc 1682 // adds $val, #7 1683 // str $val, [$src, #4] 1684 // movs r0, #0 1685 // b 1f 1686 // movs r0, #1 1687 // 1: 1688 unsigned SrcReg = MI->getOperand(0).getReg(); 1689 unsigned ValReg = MI->getOperand(1).getReg(); 1690 MCSymbol *Label = GetARMSJLJEHLabel(); 1691 { 1692 MCInst TmpInst; 1693 TmpInst.setOpcode(ARM::tMOVr); 1694 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1695 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1696 // Predicate. 1697 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1698 TmpInst.addOperand(MCOperand::CreateReg(0)); 1699 OutStreamer.AddComment("eh_setjmp begin"); 1700 OutStreamer.EmitInstruction(TmpInst); 1701 } 1702 { 1703 MCInst TmpInst; 1704 TmpInst.setOpcode(ARM::tADDi3); 1705 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1706 // 's' bit operand 1707 TmpInst.addOperand(MCOperand::CreateReg(ARM::CPSR)); 1708 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1709 TmpInst.addOperand(MCOperand::CreateImm(7)); 1710 // Predicate. 1711 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1712 TmpInst.addOperand(MCOperand::CreateReg(0)); 1713 OutStreamer.EmitInstruction(TmpInst); 1714 } 1715 { 1716 MCInst TmpInst; 1717 TmpInst.setOpcode(ARM::tSTRi); 1718 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1719 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1720 // The offset immediate is #4. The operand value is scaled by 4 for the 1721 // tSTR instruction. 1722 TmpInst.addOperand(MCOperand::CreateImm(1)); 1723 // Predicate. 1724 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1725 TmpInst.addOperand(MCOperand::CreateReg(0)); 1726 OutStreamer.EmitInstruction(TmpInst); 1727 } 1728 { 1729 MCInst TmpInst; 1730 TmpInst.setOpcode(ARM::tMOVi8); 1731 TmpInst.addOperand(MCOperand::CreateReg(ARM::R0)); 1732 TmpInst.addOperand(MCOperand::CreateReg(ARM::CPSR)); 1733 TmpInst.addOperand(MCOperand::CreateImm(0)); 1734 // Predicate. 1735 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1736 TmpInst.addOperand(MCOperand::CreateReg(0)); 1737 OutStreamer.EmitInstruction(TmpInst); 1738 } 1739 { 1740 const MCExpr *SymbolExpr = MCSymbolRefExpr::Create(Label, OutContext); 1741 MCInst TmpInst; 1742 TmpInst.setOpcode(ARM::tB); 1743 TmpInst.addOperand(MCOperand::CreateExpr(SymbolExpr)); 1744 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1745 TmpInst.addOperand(MCOperand::CreateReg(0)); 1746 OutStreamer.EmitInstruction(TmpInst); 1747 } 1748 { 1749 MCInst TmpInst; 1750 TmpInst.setOpcode(ARM::tMOVi8); 1751 TmpInst.addOperand(MCOperand::CreateReg(ARM::R0)); 1752 TmpInst.addOperand(MCOperand::CreateReg(ARM::CPSR)); 1753 TmpInst.addOperand(MCOperand::CreateImm(1)); 1754 // Predicate. 1755 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1756 TmpInst.addOperand(MCOperand::CreateReg(0)); 1757 OutStreamer.AddComment("eh_setjmp end"); 1758 OutStreamer.EmitInstruction(TmpInst); 1759 } 1760 OutStreamer.EmitLabel(Label); 1761 return; 1762 } 1763 1764 case ARM::Int_eh_sjlj_setjmp_nofp: 1765 case ARM::Int_eh_sjlj_setjmp: { 1766 // Two incoming args: GPR:$src, GPR:$val 1767 // add $val, pc, #8 1768 // str $val, [$src, #+4] 1769 // mov r0, #0 1770 // add pc, pc, #0 1771 // mov r0, #1 1772 unsigned SrcReg = MI->getOperand(0).getReg(); 1773 unsigned ValReg = MI->getOperand(1).getReg(); 1774 1775 { 1776 MCInst TmpInst; 1777 TmpInst.setOpcode(ARM::ADDri); 1778 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1779 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1780 TmpInst.addOperand(MCOperand::CreateImm(8)); 1781 // Predicate. 1782 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1783 TmpInst.addOperand(MCOperand::CreateReg(0)); 1784 // 's' bit operand (always reg0 for this). 1785 TmpInst.addOperand(MCOperand::CreateReg(0)); 1786 OutStreamer.AddComment("eh_setjmp begin"); 1787 OutStreamer.EmitInstruction(TmpInst); 1788 } 1789 { 1790 MCInst TmpInst; 1791 TmpInst.setOpcode(ARM::STRi12); 1792 TmpInst.addOperand(MCOperand::CreateReg(ValReg)); 1793 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1794 TmpInst.addOperand(MCOperand::CreateImm(4)); 1795 // Predicate. 1796 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1797 TmpInst.addOperand(MCOperand::CreateReg(0)); 1798 OutStreamer.EmitInstruction(TmpInst); 1799 } 1800 { 1801 MCInst TmpInst; 1802 TmpInst.setOpcode(ARM::MOVi); 1803 TmpInst.addOperand(MCOperand::CreateReg(ARM::R0)); 1804 TmpInst.addOperand(MCOperand::CreateImm(0)); 1805 // Predicate. 1806 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1807 TmpInst.addOperand(MCOperand::CreateReg(0)); 1808 // 's' bit operand (always reg0 for this). 1809 TmpInst.addOperand(MCOperand::CreateReg(0)); 1810 OutStreamer.EmitInstruction(TmpInst); 1811 } 1812 { 1813 MCInst TmpInst; 1814 TmpInst.setOpcode(ARM::ADDri); 1815 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1816 TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); 1817 TmpInst.addOperand(MCOperand::CreateImm(0)); 1818 // Predicate. 1819 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1820 TmpInst.addOperand(MCOperand::CreateReg(0)); 1821 // 's' bit operand (always reg0 for this). 1822 TmpInst.addOperand(MCOperand::CreateReg(0)); 1823 OutStreamer.EmitInstruction(TmpInst); 1824 } 1825 { 1826 MCInst TmpInst; 1827 TmpInst.setOpcode(ARM::MOVi); 1828 TmpInst.addOperand(MCOperand::CreateReg(ARM::R0)); 1829 TmpInst.addOperand(MCOperand::CreateImm(1)); 1830 // Predicate. 1831 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1832 TmpInst.addOperand(MCOperand::CreateReg(0)); 1833 // 's' bit operand (always reg0 for this). 1834 TmpInst.addOperand(MCOperand::CreateReg(0)); 1835 OutStreamer.AddComment("eh_setjmp end"); 1836 OutStreamer.EmitInstruction(TmpInst); 1837 } 1838 return; 1839 } 1840 case ARM::Int_eh_sjlj_longjmp: { 1841 // ldr sp, [$src, #8] 1842 // ldr $scratch, [$src, #4] 1843 // ldr r7, [$src] 1844 // bx $scratch 1845 unsigned SrcReg = MI->getOperand(0).getReg(); 1846 unsigned ScratchReg = MI->getOperand(1).getReg(); 1847 { 1848 MCInst TmpInst; 1849 TmpInst.setOpcode(ARM::LDRi12); 1850 TmpInst.addOperand(MCOperand::CreateReg(ARM::SP)); 1851 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1852 TmpInst.addOperand(MCOperand::CreateImm(8)); 1853 // Predicate. 1854 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1855 TmpInst.addOperand(MCOperand::CreateReg(0)); 1856 OutStreamer.EmitInstruction(TmpInst); 1857 } 1858 { 1859 MCInst TmpInst; 1860 TmpInst.setOpcode(ARM::LDRi12); 1861 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1862 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1863 TmpInst.addOperand(MCOperand::CreateImm(4)); 1864 // Predicate. 1865 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1866 TmpInst.addOperand(MCOperand::CreateReg(0)); 1867 OutStreamer.EmitInstruction(TmpInst); 1868 } 1869 { 1870 MCInst TmpInst; 1871 TmpInst.setOpcode(ARM::LDRi12); 1872 TmpInst.addOperand(MCOperand::CreateReg(ARM::R7)); 1873 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1874 TmpInst.addOperand(MCOperand::CreateImm(0)); 1875 // Predicate. 1876 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1877 TmpInst.addOperand(MCOperand::CreateReg(0)); 1878 OutStreamer.EmitInstruction(TmpInst); 1879 } 1880 { 1881 MCInst TmpInst; 1882 TmpInst.setOpcode(ARM::BX); 1883 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1884 // Predicate. 1885 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1886 TmpInst.addOperand(MCOperand::CreateReg(0)); 1887 OutStreamer.EmitInstruction(TmpInst); 1888 } 1889 return; 1890 } 1891 case ARM::tInt_eh_sjlj_longjmp: { 1892 // ldr $scratch, [$src, #8] 1893 // mov sp, $scratch 1894 // ldr $scratch, [$src, #4] 1895 // ldr r7, [$src] 1896 // bx $scratch 1897 unsigned SrcReg = MI->getOperand(0).getReg(); 1898 unsigned ScratchReg = MI->getOperand(1).getReg(); 1899 { 1900 MCInst TmpInst; 1901 TmpInst.setOpcode(ARM::tLDRi); 1902 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1903 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1904 // The offset immediate is #8. The operand value is scaled by 4 for the 1905 // tLDR instruction. 1906 TmpInst.addOperand(MCOperand::CreateImm(2)); 1907 // Predicate. 1908 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1909 TmpInst.addOperand(MCOperand::CreateReg(0)); 1910 OutStreamer.EmitInstruction(TmpInst); 1911 } 1912 { 1913 MCInst TmpInst; 1914 TmpInst.setOpcode(ARM::tMOVr); 1915 TmpInst.addOperand(MCOperand::CreateReg(ARM::SP)); 1916 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1917 // Predicate. 1918 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1919 TmpInst.addOperand(MCOperand::CreateReg(0)); 1920 OutStreamer.EmitInstruction(TmpInst); 1921 } 1922 { 1923 MCInst TmpInst; 1924 TmpInst.setOpcode(ARM::tLDRi); 1925 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1926 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1927 TmpInst.addOperand(MCOperand::CreateImm(1)); 1928 // Predicate. 1929 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1930 TmpInst.addOperand(MCOperand::CreateReg(0)); 1931 OutStreamer.EmitInstruction(TmpInst); 1932 } 1933 { 1934 MCInst TmpInst; 1935 TmpInst.setOpcode(ARM::tLDRr); 1936 TmpInst.addOperand(MCOperand::CreateReg(ARM::R7)); 1937 TmpInst.addOperand(MCOperand::CreateReg(SrcReg)); 1938 TmpInst.addOperand(MCOperand::CreateReg(0)); 1939 // Predicate. 1940 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1941 TmpInst.addOperand(MCOperand::CreateReg(0)); 1942 OutStreamer.EmitInstruction(TmpInst); 1943 } 1944 { 1945 MCInst TmpInst; 1946 TmpInst.setOpcode(ARM::tBX); 1947 TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); 1948 // Predicate. 1949 TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); 1950 TmpInst.addOperand(MCOperand::CreateReg(0)); 1951 OutStreamer.EmitInstruction(TmpInst); 1952 } 1953 return; 1954 } 1955 } 1956 1957 MCInst TmpInst; 1958 LowerARMMachineInstrToMCInst(MI, TmpInst, *this); 1959 1960 OutStreamer.EmitInstruction(TmpInst); 1961 } 1962 1963 //===----------------------------------------------------------------------===// 1964 // Target Registry Stuff 1965 //===----------------------------------------------------------------------===// 1966 1967 // Force static initialization. 1968 extern "C" void LLVMInitializeARMAsmPrinter() { 1969 RegisterAsmPrinter<ARMAsmPrinter> X(TheARMTarget); 1970 RegisterAsmPrinter<ARMAsmPrinter> Y(TheThumbTarget); 1971 } 1972