AsmPrinter.cpp revision 1a9edae76b2e7cf15c5f7c36928b3701ac2ef47b
1//===-- AsmPrinter.cpp - Common AsmPrinter code ---------------------------===// 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 implements the AsmPrinter class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/CodeGen/AsmPrinter.h" 15#include "llvm/Assembly/Writer.h" 16#include "llvm/DerivedTypes.h" 17#include "llvm/Constants.h" 18#include "llvm/Module.h" 19#include "llvm/CodeGen/GCMetadataPrinter.h" 20#include "llvm/CodeGen/MachineConstantPool.h" 21#include "llvm/CodeGen/MachineJumpTableInfo.h" 22#include "llvm/CodeGen/MachineModuleInfo.h" 23#include "llvm/Support/Mangler.h" 24#include "llvm/Support/raw_ostream.h" 25#include "llvm/Target/TargetAsmInfo.h" 26#include "llvm/Target/TargetData.h" 27#include "llvm/Target/TargetLowering.h" 28#include "llvm/Target/TargetMachine.h" 29#include "llvm/Target/TargetOptions.h" 30#include "llvm/Target/TargetRegisterInfo.h" 31#include "llvm/ADT/SmallPtrSet.h" 32#include "llvm/ADT/SmallString.h" 33#include "llvm/ADT/StringExtras.h" 34#include <cerrno> 35using namespace llvm; 36 37char AsmPrinter::ID = 0; 38AsmPrinter::AsmPrinter(raw_ostream &o, TargetMachine &tm, 39 const TargetAsmInfo *T) 40 : MachineFunctionPass(&ID), FunctionNumber(0), O(o), 41 TM(tm), TAI(T), TRI(tm.getRegisterInfo()), 42 IsInTextSection(false) 43{} 44 45AsmPrinter::~AsmPrinter() { 46 for (gcp_iterator I = GCMetadataPrinters.begin(), 47 E = GCMetadataPrinters.end(); I != E; ++I) 48 delete I->second; 49} 50 51/// SwitchToTextSection - Switch to the specified text section of the executable 52/// if we are not already in it! 53/// 54void AsmPrinter::SwitchToTextSection(const char *NewSection, 55 const GlobalValue *GV) { 56 std::string NS; 57 if (GV && GV->hasSection()) 58 NS = TAI->getSwitchToSectionDirective() + GV->getSection(); 59 else 60 NS = NewSection; 61 62 // If we're already in this section, we're done. 63 if (CurrentSection == NS) return; 64 65 // Close the current section, if applicable. 66 if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 67 O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 68 69 CurrentSection = NS; 70 71 if (!CurrentSection.empty()) 72 O << CurrentSection << TAI->getTextSectionStartSuffix() << '\n'; 73 74 IsInTextSection = true; 75} 76 77/// SwitchToDataSection - Switch to the specified data section of the executable 78/// if we are not already in it! 79/// 80void AsmPrinter::SwitchToDataSection(const char *NewSection, 81 const GlobalValue *GV) { 82 std::string NS; 83 if (GV && GV->hasSection()) 84 NS = TAI->getSwitchToSectionDirective() + GV->getSection(); 85 else 86 NS = NewSection; 87 88 // If we're already in this section, we're done. 89 if (CurrentSection == NS) return; 90 91 // Close the current section, if applicable. 92 if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 93 O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 94 95 CurrentSection = NS; 96 97 if (!CurrentSection.empty()) 98 O << CurrentSection << TAI->getDataSectionStartSuffix() << '\n'; 99 100 IsInTextSection = false; 101} 102 103/// SwitchToSection - Switch to the specified section of the executable if we 104/// are not already in it! 105void AsmPrinter::SwitchToSection(const Section* NS) { 106 const std::string& NewSection = NS->getName(); 107 108 // If we're already in this section, we're done. 109 if (CurrentSection == NewSection) return; 110 111 // Close the current section, if applicable. 112 if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 113 O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 114 115 // FIXME: Make CurrentSection a Section* in the future 116 CurrentSection = NewSection; 117 118 if (!CurrentSection.empty()) { 119 // If section is named we need to switch into it via special '.section' 120 // directive and also append funky flags. Otherwise - section name is just 121 // some magic assembler directive. 122 if (NS->isNamed()) 123 O << TAI->getSwitchToSectionDirective() 124 << CurrentSection 125 << TAI->getSectionFlags(NS->getFlags()); 126 else 127 O << CurrentSection; 128 O << TAI->getDataSectionStartSuffix() << '\n'; 129 } 130 131 IsInTextSection = (NS->getFlags() & SectionFlags::Code); 132} 133 134void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 135 MachineFunctionPass::getAnalysisUsage(AU); 136 AU.addRequired<GCModuleInfo>(); 137} 138 139bool AsmPrinter::doInitialization(Module &M) { 140 Mang = new Mangler(M, TAI->getGlobalPrefix()); 141 142 GCModuleInfo *MI = getAnalysisToUpdate<GCModuleInfo>(); 143 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 144 for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 145 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 146 MP->beginAssembly(O, *this, *TAI); 147 148 if (!M.getModuleInlineAsm().empty()) 149 O << TAI->getCommentString() << " Start of file scope inline assembly\n" 150 << M.getModuleInlineAsm() 151 << '\n' << TAI->getCommentString() 152 << " End of file scope inline assembly\n"; 153 154 SwitchToDataSection(""); // Reset back to no section. 155 156 MMI = getAnalysisToUpdate<MachineModuleInfo>(); 157 if (MMI) MMI->AnalyzeModule(M); 158 159 return false; 160} 161 162bool AsmPrinter::doFinalization(Module &M) { 163 if (TAI->getWeakRefDirective()) { 164 if (!ExtWeakSymbols.empty()) 165 SwitchToDataSection(""); 166 167 for (std::set<const GlobalValue*>::iterator i = ExtWeakSymbols.begin(), 168 e = ExtWeakSymbols.end(); i != e; ++i) { 169 const GlobalValue *GV = *i; 170 std::string Name = Mang->getValueName(GV); 171 O << TAI->getWeakRefDirective() << Name << '\n'; 172 } 173 } 174 175 if (TAI->getSetDirective()) { 176 if (!M.alias_empty()) 177 SwitchToTextSection(TAI->getTextSection()); 178 179 O << '\n'; 180 for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 181 I!=E; ++I) { 182 std::string Name = Mang->getValueName(I); 183 std::string Target; 184 185 const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 186 Target = Mang->getValueName(GV); 187 188 if (I->hasExternalLinkage() || !TAI->getWeakRefDirective()) 189 O << "\t.globl\t" << Name << '\n'; 190 else if (I->hasWeakLinkage()) 191 O << TAI->getWeakRefDirective() << Name << '\n'; 192 else if (!I->hasInternalLinkage()) 193 assert(0 && "Invalid alias linkage"); 194 195 if (I->hasHiddenVisibility()) { 196 if (const char *Directive = TAI->getHiddenDirective()) 197 O << Directive << Name << '\n'; 198 } else if (I->hasProtectedVisibility()) { 199 if (const char *Directive = TAI->getProtectedDirective()) 200 O << Directive << Name << '\n'; 201 } 202 203 O << TAI->getSetDirective() << ' ' << Name << ", " << Target << '\n'; 204 205 // If the aliasee has external weak linkage it can be referenced only by 206 // alias itself. In this case it can be not in ExtWeakSymbols list. Emit 207 // weak reference in such case. 208 if (GV->hasExternalWeakLinkage()) { 209 if (TAI->getWeakRefDirective()) 210 O << TAI->getWeakRefDirective() << Target << '\n'; 211 else 212 O << "\t.globl\t" << Target << '\n'; 213 } 214 } 215 } 216 217 GCModuleInfo *MI = getAnalysisToUpdate<GCModuleInfo>(); 218 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 219 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 220 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 221 MP->finishAssembly(O, *this, *TAI); 222 223 // If we don't have any trampolines, then we don't require stack memory 224 // to be executable. Some targets have a directive to declare this. 225 Function* InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 226 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 227 if (TAI->getNonexecutableStackDirective()) 228 O << TAI->getNonexecutableStackDirective() << '\n'; 229 230 delete Mang; Mang = 0; 231 return false; 232} 233 234std::string AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) { 235 assert(MF && "No machine function?"); 236 std::string Name = MF->getFunction()->getName(); 237 if (Name.empty()) 238 Name = Mang->getValueName(MF->getFunction()); 239 return Mang->makeNameProper(Name + ".eh", TAI->getGlobalPrefix()); 240} 241 242void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 243 // What's my mangled name? 244 CurrentFnName = Mang->getValueName(MF.getFunction()); 245 IncrementFunctionNumber(); 246} 247 248/// EmitConstantPool - Print to the current output stream assembly 249/// representations of the constants in the constant pool MCP. This is 250/// used to print out constants which have been "spilled to memory" by 251/// the code generator. 252/// 253void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { 254 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 255 if (CP.empty()) return; 256 257 // Some targets require 4-, 8-, and 16- byte constant literals to be placed 258 // in special sections. 259 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > FourByteCPs; 260 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > EightByteCPs; 261 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > SixteenByteCPs; 262 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > OtherCPs; 263 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > TargetCPs; 264 for (unsigned i = 0, e = CP.size(); i != e; ++i) { 265 MachineConstantPoolEntry CPE = CP[i]; 266 const Type *Ty = CPE.getType(); 267 if (TAI->getFourByteConstantSection() && 268 TM.getTargetData()->getABITypeSize(Ty) == 4) 269 FourByteCPs.push_back(std::make_pair(CPE, i)); 270 else if (TAI->getEightByteConstantSection() && 271 TM.getTargetData()->getABITypeSize(Ty) == 8) 272 EightByteCPs.push_back(std::make_pair(CPE, i)); 273 else if (TAI->getSixteenByteConstantSection() && 274 TM.getTargetData()->getABITypeSize(Ty) == 16) 275 SixteenByteCPs.push_back(std::make_pair(CPE, i)); 276 else 277 OtherCPs.push_back(std::make_pair(CPE, i)); 278 } 279 280 unsigned Alignment = MCP->getConstantPoolAlignment(); 281 EmitConstantPool(Alignment, TAI->getFourByteConstantSection(), FourByteCPs); 282 EmitConstantPool(Alignment, TAI->getEightByteConstantSection(), EightByteCPs); 283 EmitConstantPool(Alignment, TAI->getSixteenByteConstantSection(), 284 SixteenByteCPs); 285 EmitConstantPool(Alignment, TAI->getConstantPoolSection(), OtherCPs); 286} 287 288void AsmPrinter::EmitConstantPool(unsigned Alignment, const char *Section, 289 std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP) { 290 if (CP.empty()) return; 291 292 SwitchToDataSection(Section); 293 EmitAlignment(Alignment); 294 for (unsigned i = 0, e = CP.size(); i != e; ++i) { 295 O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 296 << CP[i].second << ":\t\t\t\t\t"; 297 // O << TAI->getCommentString() << ' ' << 298 // WriteTypeSymbolic(O, CP[i].first.getType(), 0); 299 O << '\n'; 300 if (CP[i].first.isMachineConstantPoolEntry()) 301 EmitMachineConstantPoolValue(CP[i].first.Val.MachineCPVal); 302 else 303 EmitGlobalConstant(CP[i].first.Val.ConstVal); 304 if (i != e-1) { 305 const Type *Ty = CP[i].first.getType(); 306 unsigned EntSize = 307 TM.getTargetData()->getABITypeSize(Ty); 308 unsigned ValEnd = CP[i].first.getOffset() + EntSize; 309 // Emit inter-object padding for alignment. 310 EmitZeros(CP[i+1].first.getOffset()-ValEnd); 311 } 312 } 313} 314 315/// EmitJumpTableInfo - Print assembly representations of the jump tables used 316/// by the current function to the current output stream. 317/// 318void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, 319 MachineFunction &MF) { 320 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 321 if (JT.empty()) return; 322 323 bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 324 325 // Pick the directive to use to print the jump table entries, and switch to 326 // the appropriate section. 327 TargetLowering *LoweringInfo = TM.getTargetLowering(); 328 329 const char* JumpTableDataSection = TAI->getJumpTableDataSection(); 330 const Function *F = MF.getFunction(); 331 unsigned SectionFlags = TAI->SectionFlagsForGlobal(F); 332 if ((IsPic && !(LoweringInfo && LoweringInfo->usesGlobalOffsetTable())) || 333 !JumpTableDataSection || 334 SectionFlags & SectionFlags::Linkonce) { 335 // In PIC mode, we need to emit the jump table to the same section as the 336 // function body itself, otherwise the label differences won't make sense. 337 // We should also do if the section name is NULL or function is declared in 338 // discardable section. 339 SwitchToSection(TAI->SectionForGlobal(F)); 340 } else { 341 SwitchToDataSection(JumpTableDataSection); 342 } 343 344 EmitAlignment(Log2_32(MJTI->getAlignment())); 345 346 for (unsigned i = 0, e = JT.size(); i != e; ++i) { 347 const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; 348 349 // If this jump table was deleted, ignore it. 350 if (JTBBs.empty()) continue; 351 352 // For PIC codegen, if possible we want to use the SetDirective to reduce 353 // the number of relocations the assembler will generate for the jump table. 354 // Set directives are all printed before the jump table itself. 355 SmallPtrSet<MachineBasicBlock*, 16> EmittedSets; 356 if (TAI->getSetDirective() && IsPic) 357 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 358 if (EmittedSets.insert(JTBBs[ii])) 359 printPICJumpTableSetLabel(i, JTBBs[ii]); 360 361 // On some targets (e.g. darwin) we want to emit two consequtive labels 362 // before each jump table. The first label is never referenced, but tells 363 // the assembler and linker the extents of the jump table object. The 364 // second label is actually referenced by the code. 365 if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix()) 366 O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n"; 367 368 O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 369 << '_' << i << ":\n"; 370 371 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 372 printPICJumpTableEntry(MJTI, JTBBs[ii], i); 373 O << '\n'; 374 } 375 } 376} 377 378void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 379 const MachineBasicBlock *MBB, 380 unsigned uid) const { 381 bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 382 383 // Use JumpTableDirective otherwise honor the entry size from the jump table 384 // info. 385 const char *JTEntryDirective = TAI->getJumpTableDirective(); 386 bool HadJTEntryDirective = JTEntryDirective != NULL; 387 if (!HadJTEntryDirective) { 388 JTEntryDirective = MJTI->getEntrySize() == 4 ? 389 TAI->getData32bitsDirective() : TAI->getData64bitsDirective(); 390 } 391 392 O << JTEntryDirective << ' '; 393 394 // If we have emitted set directives for the jump table entries, print 395 // them rather than the entries themselves. If we're emitting PIC, then 396 // emit the table entries as differences between two text section labels. 397 // If we're emitting non-PIC code, then emit the entries as direct 398 // references to the target basic blocks. 399 if (IsPic) { 400 if (TAI->getSetDirective()) { 401 O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() 402 << '_' << uid << "_set_" << MBB->getNumber(); 403 } else { 404 printBasicBlockLabel(MBB, false, false, false); 405 // If the arch uses custom Jump Table directives, don't calc relative to 406 // JT 407 if (!HadJTEntryDirective) 408 O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" 409 << getFunctionNumber() << '_' << uid; 410 } 411 } else { 412 printBasicBlockLabel(MBB, false, false, false); 413 } 414} 415 416 417/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 418/// special global used by LLVM. If so, emit it and return true, otherwise 419/// do nothing and return false. 420bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 421 if (GV->getName() == "llvm.used") { 422 if (TAI->getUsedDirective() != 0) // No need to emit this at all. 423 EmitLLVMUsedList(GV->getInitializer()); 424 return true; 425 } 426 427 // Ignore debug and non-emitted data. 428 if (GV->getSection() == "llvm.metadata") return true; 429 430 if (!GV->hasAppendingLinkage()) return false; 431 432 assert(GV->hasInitializer() && "Not a special LLVM global!"); 433 434 const TargetData *TD = TM.getTargetData(); 435 unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 436 if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) { 437 SwitchToDataSection(TAI->getStaticCtorsSection()); 438 EmitAlignment(Align, 0); 439 EmitXXStructorList(GV->getInitializer()); 440 return true; 441 } 442 443 if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) { 444 SwitchToDataSection(TAI->getStaticDtorsSection()); 445 EmitAlignment(Align, 0); 446 EmitXXStructorList(GV->getInitializer()); 447 return true; 448 } 449 450 return false; 451} 452 453/// findGlobalValue - if CV is an expression equivalent to a single 454/// global value, return that value. 455const GlobalValue * AsmPrinter::findGlobalValue(const Constant *CV) { 456 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) 457 return GV; 458 else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 459 const TargetData *TD = TM.getTargetData(); 460 unsigned Opcode = CE->getOpcode(); 461 switch (Opcode) { 462 case Instruction::GetElementPtr: { 463 const Constant *ptrVal = CE->getOperand(0); 464 SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 465 if (TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], idxVec.size())) 466 return 0; 467 return findGlobalValue(ptrVal); 468 } 469 case Instruction::BitCast: 470 return findGlobalValue(CE->getOperand(0)); 471 default: 472 return 0; 473 } 474 } 475 return 0; 476} 477 478/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each 479/// global in the specified llvm.used list for which emitUsedDirectiveFor 480/// is true, as being used with this directive. 481 482void AsmPrinter::EmitLLVMUsedList(Constant *List) { 483 const char *Directive = TAI->getUsedDirective(); 484 485 // Should be an array of 'sbyte*'. 486 ConstantArray *InitList = dyn_cast<ConstantArray>(List); 487 if (InitList == 0) return; 488 489 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 490 const GlobalValue *GV = findGlobalValue(InitList->getOperand(i)); 491 if (TAI->emitUsedDirectiveFor(GV, Mang)) { 492 O << Directive; 493 EmitConstantValueOnly(InitList->getOperand(i)); 494 O << '\n'; 495 } 496 } 497} 498 499/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 500/// function pointers, ignoring the init priority. 501void AsmPrinter::EmitXXStructorList(Constant *List) { 502 // Should be an array of '{ int, void ()* }' structs. The first value is the 503 // init priority, which we ignore. 504 if (!isa<ConstantArray>(List)) return; 505 ConstantArray *InitList = cast<ConstantArray>(List); 506 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 507 if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 508 if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 509 510 if (CS->getOperand(1)->isNullValue()) 511 return; // Found a null terminator, exit printing. 512 // Emit the function pointer. 513 EmitGlobalConstant(CS->getOperand(1)); 514 } 515} 516 517/// getGlobalLinkName - Returns the asm/link name of of the specified 518/// global variable. Should be overridden by each target asm printer to 519/// generate the appropriate value. 520const std::string AsmPrinter::getGlobalLinkName(const GlobalVariable *GV) const{ 521 std::string LinkName; 522 523 if (isa<Function>(GV)) { 524 LinkName += TAI->getFunctionAddrPrefix(); 525 LinkName += Mang->getValueName(GV); 526 LinkName += TAI->getFunctionAddrSuffix(); 527 } else { 528 LinkName += TAI->getGlobalVarAddrPrefix(); 529 LinkName += Mang->getValueName(GV); 530 LinkName += TAI->getGlobalVarAddrSuffix(); 531 } 532 533 return LinkName; 534} 535 536/// EmitExternalGlobal - Emit the external reference to a global variable. 537/// Should be overridden if an indirect reference should be used. 538void AsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) { 539 O << getGlobalLinkName(GV); 540} 541 542 543 544//===----------------------------------------------------------------------===// 545/// LEB 128 number encoding. 546 547/// PrintULEB128 - Print a series of hexidecimal values (separated by commas) 548/// representing an unsigned leb128 value. 549void AsmPrinter::PrintULEB128(unsigned Value) const { 550 do { 551 unsigned Byte = Value & 0x7f; 552 Value >>= 7; 553 if (Value) Byte |= 0x80; 554 O << "0x" << utohexstr(Byte); 555 if (Value) O << ", "; 556 } while (Value); 557} 558 559/// PrintSLEB128 - Print a series of hexidecimal values (separated by commas) 560/// representing a signed leb128 value. 561void AsmPrinter::PrintSLEB128(int Value) const { 562 int Sign = Value >> (8 * sizeof(Value) - 1); 563 bool IsMore; 564 565 do { 566 unsigned Byte = Value & 0x7f; 567 Value >>= 7; 568 IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 569 if (IsMore) Byte |= 0x80; 570 O << "0x" << utohexstr(Byte); 571 if (IsMore) O << ", "; 572 } while (IsMore); 573} 574 575//===--------------------------------------------------------------------===// 576// Emission and print routines 577// 578 579/// PrintHex - Print a value as a hexidecimal value. 580/// 581void AsmPrinter::PrintHex(int Value) const { 582 O << "0x" << utohexstr(static_cast<unsigned>(Value)); 583} 584 585/// EOL - Print a newline character to asm stream. If a comment is present 586/// then it will be printed first. Comments should not contain '\n'. 587void AsmPrinter::EOL() const { 588 O << '\n'; 589} 590 591void AsmPrinter::EOL(const std::string &Comment) const { 592 if (VerboseAsm && !Comment.empty()) { 593 O << '\t' 594 << TAI->getCommentString() 595 << ' ' 596 << Comment; 597 } 598 O << '\n'; 599} 600 601void AsmPrinter::EOL(const char* Comment) const { 602 if (VerboseAsm && *Comment) { 603 O << '\t' 604 << TAI->getCommentString() 605 << ' ' 606 << Comment; 607 } 608 O << '\n'; 609} 610 611/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 612/// unsigned leb128 value. 613void AsmPrinter::EmitULEB128Bytes(unsigned Value) const { 614 if (TAI->hasLEB128()) { 615 O << "\t.uleb128\t" 616 << Value; 617 } else { 618 O << TAI->getData8bitsDirective(); 619 PrintULEB128(Value); 620 } 621} 622 623/// EmitSLEB128Bytes - print an assembler byte data directive to compose a 624/// signed leb128 value. 625void AsmPrinter::EmitSLEB128Bytes(int Value) const { 626 if (TAI->hasLEB128()) { 627 O << "\t.sleb128\t" 628 << Value; 629 } else { 630 O << TAI->getData8bitsDirective(); 631 PrintSLEB128(Value); 632 } 633} 634 635/// EmitInt8 - Emit a byte directive and value. 636/// 637void AsmPrinter::EmitInt8(int Value) const { 638 O << TAI->getData8bitsDirective(); 639 PrintHex(Value & 0xFF); 640} 641 642/// EmitInt16 - Emit a short directive and value. 643/// 644void AsmPrinter::EmitInt16(int Value) const { 645 O << TAI->getData16bitsDirective(); 646 PrintHex(Value & 0xFFFF); 647} 648 649/// EmitInt32 - Emit a long directive and value. 650/// 651void AsmPrinter::EmitInt32(int Value) const { 652 O << TAI->getData32bitsDirective(); 653 PrintHex(Value); 654} 655 656/// EmitInt64 - Emit a long long directive and value. 657/// 658void AsmPrinter::EmitInt64(uint64_t Value) const { 659 if (TAI->getData64bitsDirective()) { 660 O << TAI->getData64bitsDirective(); 661 PrintHex(Value); 662 } else { 663 if (TM.getTargetData()->isBigEndian()) { 664 EmitInt32(unsigned(Value >> 32)); O << '\n'; 665 EmitInt32(unsigned(Value)); 666 } else { 667 EmitInt32(unsigned(Value)); O << '\n'; 668 EmitInt32(unsigned(Value >> 32)); 669 } 670 } 671} 672 673/// toOctal - Convert the low order bits of X into an octal digit. 674/// 675static inline char toOctal(int X) { 676 return (X&7)+'0'; 677} 678 679/// printStringChar - Print a char, escaped if necessary. 680/// 681static void printStringChar(raw_ostream &O, char C) { 682 if (C == '"') { 683 O << "\\\""; 684 } else if (C == '\\') { 685 O << "\\\\"; 686 } else if (isprint(C)) { 687 O << C; 688 } else { 689 switch(C) { 690 case '\b': O << "\\b"; break; 691 case '\f': O << "\\f"; break; 692 case '\n': O << "\\n"; break; 693 case '\r': O << "\\r"; break; 694 case '\t': O << "\\t"; break; 695 default: 696 O << '\\'; 697 O << toOctal(C >> 6); 698 O << toOctal(C >> 3); 699 O << toOctal(C >> 0); 700 break; 701 } 702 } 703} 704 705/// EmitString - Emit a string with quotes and a null terminator. 706/// Special characters are emitted properly. 707/// \literal (Eg. '\t') \endliteral 708void AsmPrinter::EmitString(const std::string &String) const { 709 const char* AscizDirective = TAI->getAscizDirective(); 710 if (AscizDirective) 711 O << AscizDirective; 712 else 713 O << TAI->getAsciiDirective(); 714 O << '\"'; 715 for (unsigned i = 0, N = String.size(); i < N; ++i) { 716 unsigned char C = String[i]; 717 printStringChar(O, C); 718 } 719 if (AscizDirective) 720 O << '\"'; 721 else 722 O << "\\0\""; 723} 724 725 726/// EmitFile - Emit a .file directive. 727void AsmPrinter::EmitFile(unsigned Number, const std::string &Name) const { 728 O << "\t.file\t" << Number << " \""; 729 for (unsigned i = 0, N = Name.size(); i < N; ++i) { 730 unsigned char C = Name[i]; 731 printStringChar(O, C); 732 } 733 O << '\"'; 734} 735 736 737//===----------------------------------------------------------------------===// 738 739// EmitAlignment - Emit an alignment directive to the specified power of 740// two boundary. For example, if you pass in 3 here, you will get an 8 741// byte alignment. If a global value is specified, and if that global has 742// an explicit alignment requested, it will unconditionally override the 743// alignment request. However, if ForcedAlignBits is specified, this value 744// has final say: the ultimate alignment will be the max of ForcedAlignBits 745// and the alignment computed with NumBits and the global. 746// 747// The algorithm is: 748// Align = NumBits; 749// if (GV && GV->hasalignment) Align = GV->getalignment(); 750// Align = std::max(Align, ForcedAlignBits); 751// 752void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 753 unsigned ForcedAlignBits, 754 bool UseFillExpr) const { 755 if (GV && GV->getAlignment()) 756 NumBits = Log2_32(GV->getAlignment()); 757 NumBits = std::max(NumBits, ForcedAlignBits); 758 759 if (NumBits == 0) return; // No need to emit alignment. 760 if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits; 761 O << TAI->getAlignDirective() << NumBits; 762 763 unsigned FillValue = TAI->getTextAlignFillValue(); 764 UseFillExpr &= IsInTextSection && FillValue; 765 if (UseFillExpr) O << ",0x" << utohexstr(FillValue); 766 O << '\n'; 767} 768 769 770/// EmitZeros - Emit a block of zeros. 771/// 772void AsmPrinter::EmitZeros(uint64_t NumZeros) const { 773 if (NumZeros) { 774 if (TAI->getZeroDirective()) { 775 O << TAI->getZeroDirective() << NumZeros; 776 if (TAI->getZeroDirectiveSuffix()) 777 O << TAI->getZeroDirectiveSuffix(); 778 O << '\n'; 779 } else { 780 for (; NumZeros; --NumZeros) 781 O << TAI->getData8bitsDirective() << "0\n"; 782 } 783 } 784} 785 786// Print out the specified constant, without a storage class. Only the 787// constants valid in constant expressions can occur here. 788void AsmPrinter::EmitConstantValueOnly(const Constant *CV) { 789 if (CV->isNullValue() || isa<UndefValue>(CV)) 790 O << '0'; 791 else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 792 O << CI->getZExtValue(); 793 } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { 794 // This is a constant address for a global variable or function. Use the 795 // name of the variable or function as the address value, possibly 796 // decorating it with GlobalVarAddrPrefix/Suffix or 797 // FunctionAddrPrefix/Suffix (these all default to "" ) 798 if (isa<Function>(GV)) { 799 O << TAI->getFunctionAddrPrefix() 800 << Mang->getValueName(GV) 801 << TAI->getFunctionAddrSuffix(); 802 } else { 803 O << TAI->getGlobalVarAddrPrefix() 804 << Mang->getValueName(GV) 805 << TAI->getGlobalVarAddrSuffix(); 806 } 807 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 808 const TargetData *TD = TM.getTargetData(); 809 unsigned Opcode = CE->getOpcode(); 810 switch (Opcode) { 811 case Instruction::GetElementPtr: { 812 // generate a symbolic expression for the byte address 813 const Constant *ptrVal = CE->getOperand(0); 814 SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 815 if (int64_t Offset = TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], 816 idxVec.size())) { 817 if (Offset) 818 O << '('; 819 EmitConstantValueOnly(ptrVal); 820 if (Offset > 0) 821 O << ") + " << Offset; 822 else if (Offset < 0) 823 O << ") - " << -Offset; 824 } else { 825 EmitConstantValueOnly(ptrVal); 826 } 827 break; 828 } 829 case Instruction::Trunc: 830 case Instruction::ZExt: 831 case Instruction::SExt: 832 case Instruction::FPTrunc: 833 case Instruction::FPExt: 834 case Instruction::UIToFP: 835 case Instruction::SIToFP: 836 case Instruction::FPToUI: 837 case Instruction::FPToSI: 838 assert(0 && "FIXME: Don't yet support this kind of constant cast expr"); 839 break; 840 case Instruction::BitCast: 841 return EmitConstantValueOnly(CE->getOperand(0)); 842 843 case Instruction::IntToPtr: { 844 // Handle casts to pointers by changing them into casts to the appropriate 845 // integer type. This promotes constant folding and simplifies this code. 846 Constant *Op = CE->getOperand(0); 847 Op = ConstantExpr::getIntegerCast(Op, TD->getIntPtrType(), false/*ZExt*/); 848 return EmitConstantValueOnly(Op); 849 } 850 851 852 case Instruction::PtrToInt: { 853 // Support only foldable casts to/from pointers that can be eliminated by 854 // changing the pointer to the appropriately sized integer type. 855 Constant *Op = CE->getOperand(0); 856 const Type *Ty = CE->getType(); 857 858 // We can emit the pointer value into this slot if the slot is an 859 // integer slot greater or equal to the size of the pointer. 860 if (TD->getABITypeSize(Ty) >= TD->getABITypeSize(Op->getType())) 861 return EmitConstantValueOnly(Op); 862 863 O << "(("; 864 EmitConstantValueOnly(Op); 865 APInt ptrMask = APInt::getAllOnesValue(TD->getABITypeSizeInBits(Ty)); 866 867 SmallString<40> S; 868 ptrMask.toStringUnsigned(S); 869 O << ") & " << S.c_str() << ')'; 870 break; 871 } 872 case Instruction::Add: 873 case Instruction::Sub: 874 case Instruction::And: 875 case Instruction::Or: 876 case Instruction::Xor: 877 O << '('; 878 EmitConstantValueOnly(CE->getOperand(0)); 879 O << ')'; 880 switch (Opcode) { 881 case Instruction::Add: 882 O << " + "; 883 break; 884 case Instruction::Sub: 885 O << " - "; 886 break; 887 case Instruction::And: 888 O << " & "; 889 break; 890 case Instruction::Or: 891 O << " | "; 892 break; 893 case Instruction::Xor: 894 O << " ^ "; 895 break; 896 default: 897 break; 898 } 899 O << '('; 900 EmitConstantValueOnly(CE->getOperand(1)); 901 O << ')'; 902 break; 903 default: 904 assert(0 && "Unsupported operator!"); 905 } 906 } else { 907 assert(0 && "Unknown constant value!"); 908 } 909} 910 911/// printAsCString - Print the specified array as a C compatible string, only if 912/// the predicate isString is true. 913/// 914static void printAsCString(raw_ostream &O, const ConstantArray *CVA, 915 unsigned LastElt) { 916 assert(CVA->isString() && "Array is not string compatible!"); 917 918 O << '\"'; 919 for (unsigned i = 0; i != LastElt; ++i) { 920 unsigned char C = 921 (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getZExtValue(); 922 printStringChar(O, C); 923 } 924 O << '\"'; 925} 926 927/// EmitString - Emit a zero-byte-terminated string constant. 928/// 929void AsmPrinter::EmitString(const ConstantArray *CVA) const { 930 unsigned NumElts = CVA->getNumOperands(); 931 if (TAI->getAscizDirective() && NumElts && 932 cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { 933 O << TAI->getAscizDirective(); 934 printAsCString(O, CVA, NumElts-1); 935 } else { 936 O << TAI->getAsciiDirective(); 937 printAsCString(O, CVA, NumElts); 938 } 939 O << '\n'; 940} 941 942/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 943void AsmPrinter::EmitGlobalConstant(const Constant *CV) { 944 const TargetData *TD = TM.getTargetData(); 945 unsigned Size = TD->getABITypeSize(CV->getType()); 946 947 if (CV->isNullValue() || isa<UndefValue>(CV)) { 948 EmitZeros(Size); 949 return; 950 } else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) { 951 if (CVA->isString()) { 952 EmitString(CVA); 953 } else { // Not a string. Print the values in successive locations 954 for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) 955 EmitGlobalConstant(CVA->getOperand(i)); 956 } 957 return; 958 } else if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) { 959 // Print the fields in successive locations. Pad to align if needed! 960 const StructLayout *cvsLayout = TD->getStructLayout(CVS->getType()); 961 uint64_t sizeSoFar = 0; 962 for (unsigned i = 0, e = CVS->getNumOperands(); i != e; ++i) { 963 const Constant* field = CVS->getOperand(i); 964 965 // Check if padding is needed and insert one or more 0s. 966 uint64_t fieldSize = TD->getABITypeSize(field->getType()); 967 uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1)) 968 - cvsLayout->getElementOffset(i)) - fieldSize; 969 sizeSoFar += fieldSize + padSize; 970 971 // Now print the actual field value. 972 EmitGlobalConstant(field); 973 974 // Insert padding - this may include padding to increase the size of the 975 // current field up to the ABI size (if the struct is not packed) as well 976 // as padding to ensure that the next field starts at the right offset. 977 EmitZeros(padSize); 978 } 979 assert(sizeSoFar == cvsLayout->getSizeInBytes() && 980 "Layout of constant struct may be incorrect!"); 981 return; 982 } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { 983 // FP Constants are printed as integer constants to avoid losing 984 // precision... 985 if (CFP->getType() == Type::DoubleTy) { 986 double Val = CFP->getValueAPF().convertToDouble(); // for comment only 987 uint64_t i = CFP->getValueAPF().convertToAPInt().getZExtValue(); 988 if (TAI->getData64bitsDirective()) 989 O << TAI->getData64bitsDirective() << i << '\t' 990 << TAI->getCommentString() << " double value: " << Val << '\n'; 991 else if (TD->isBigEndian()) { 992 O << TAI->getData32bitsDirective() << unsigned(i >> 32) 993 << '\t' << TAI->getCommentString() 994 << " double most significant word " << Val << '\n'; 995 O << TAI->getData32bitsDirective() << unsigned(i) 996 << '\t' << TAI->getCommentString() 997 << " double least significant word " << Val << '\n'; 998 } else { 999 O << TAI->getData32bitsDirective() << unsigned(i) 1000 << '\t' << TAI->getCommentString() 1001 << " double least significant word " << Val << '\n'; 1002 O << TAI->getData32bitsDirective() << unsigned(i >> 32) 1003 << '\t' << TAI->getCommentString() 1004 << " double most significant word " << Val << '\n'; 1005 } 1006 return; 1007 } else if (CFP->getType() == Type::FloatTy) { 1008 float Val = CFP->getValueAPF().convertToFloat(); // for comment only 1009 O << TAI->getData32bitsDirective() 1010 << CFP->getValueAPF().convertToAPInt().getZExtValue() 1011 << '\t' << TAI->getCommentString() << " float " << Val << '\n'; 1012 return; 1013 } else if (CFP->getType() == Type::X86_FP80Ty) { 1014 // all long double variants are printed as hex 1015 // api needed to prevent premature destruction 1016 APInt api = CFP->getValueAPF().convertToAPInt(); 1017 const uint64_t *p = api.getRawData(); 1018 APFloat DoubleVal = CFP->getValueAPF(); 1019 DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven); 1020 if (TD->isBigEndian()) { 1021 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 48) 1022 << '\t' << TAI->getCommentString() 1023 << " long double most significant halfword of ~" 1024 << DoubleVal.convertToDouble() << '\n'; 1025 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 32) 1026 << '\t' << TAI->getCommentString() 1027 << " long double next halfword\n"; 1028 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 16) 1029 << '\t' << TAI->getCommentString() 1030 << " long double next halfword\n"; 1031 O << TAI->getData16bitsDirective() << uint16_t(p[0]) 1032 << '\t' << TAI->getCommentString() 1033 << " long double next halfword\n"; 1034 O << TAI->getData16bitsDirective() << uint16_t(p[1]) 1035 << '\t' << TAI->getCommentString() 1036 << " long double least significant halfword\n"; 1037 } else { 1038 O << TAI->getData16bitsDirective() << uint16_t(p[1]) 1039 << '\t' << TAI->getCommentString() 1040 << " long double least significant halfword of ~" 1041 << DoubleVal.convertToDouble() << '\n'; 1042 O << TAI->getData16bitsDirective() << uint16_t(p[0]) 1043 << '\t' << TAI->getCommentString() 1044 << " long double next halfword\n"; 1045 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 16) 1046 << '\t' << TAI->getCommentString() 1047 << " long double next halfword\n"; 1048 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 32) 1049 << '\t' << TAI->getCommentString() 1050 << " long double next halfword\n"; 1051 O << TAI->getData16bitsDirective() << uint16_t(p[0] >> 48) 1052 << '\t' << TAI->getCommentString() 1053 << " long double most significant halfword\n"; 1054 } 1055 EmitZeros(Size - TD->getTypeStoreSize(Type::X86_FP80Ty)); 1056 return; 1057 } else if (CFP->getType() == Type::PPC_FP128Ty) { 1058 // all long double variants are printed as hex 1059 // api needed to prevent premature destruction 1060 APInt api = CFP->getValueAPF().convertToAPInt(); 1061 const uint64_t *p = api.getRawData(); 1062 if (TD->isBigEndian()) { 1063 O << TAI->getData32bitsDirective() << uint32_t(p[0] >> 32) 1064 << '\t' << TAI->getCommentString() 1065 << " long double most significant word\n"; 1066 O << TAI->getData32bitsDirective() << uint32_t(p[0]) 1067 << '\t' << TAI->getCommentString() 1068 << " long double next word\n"; 1069 O << TAI->getData32bitsDirective() << uint32_t(p[1] >> 32) 1070 << '\t' << TAI->getCommentString() 1071 << " long double next word\n"; 1072 O << TAI->getData32bitsDirective() << uint32_t(p[1]) 1073 << '\t' << TAI->getCommentString() 1074 << " long double least significant word\n"; 1075 } else { 1076 O << TAI->getData32bitsDirective() << uint32_t(p[1]) 1077 << '\t' << TAI->getCommentString() 1078 << " long double least significant word\n"; 1079 O << TAI->getData32bitsDirective() << uint32_t(p[1] >> 32) 1080 << '\t' << TAI->getCommentString() 1081 << " long double next word\n"; 1082 O << TAI->getData32bitsDirective() << uint32_t(p[0]) 1083 << '\t' << TAI->getCommentString() 1084 << " long double next word\n"; 1085 O << TAI->getData32bitsDirective() << uint32_t(p[0] >> 32) 1086 << '\t' << TAI->getCommentString() 1087 << " long double most significant word\n"; 1088 } 1089 return; 1090 } else assert(0 && "Floating point constant type not handled"); 1091 } else if (CV->getType()->isInteger() && 1092 cast<IntegerType>(CV->getType())->getBitWidth() >= 64) { 1093 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1094 unsigned BitWidth = CI->getBitWidth(); 1095 assert(isPowerOf2_32(BitWidth) && 1096 "Non-power-of-2-sized integers not handled!"); 1097 1098 // We don't expect assemblers to support integer data directives 1099 // for more than 64 bits, so we emit the data in at most 64-bit 1100 // quantities at a time. 1101 const uint64_t *RawData = CI->getValue().getRawData(); 1102 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 1103 uint64_t Val; 1104 if (TD->isBigEndian()) 1105 Val = RawData[e - i - 1]; 1106 else 1107 Val = RawData[i]; 1108 1109 if (TAI->getData64bitsDirective()) 1110 O << TAI->getData64bitsDirective() << Val << '\n'; 1111 else if (TD->isBigEndian()) { 1112 O << TAI->getData32bitsDirective() << unsigned(Val >> 32) 1113 << '\t' << TAI->getCommentString() 1114 << " Double-word most significant word " << Val << '\n'; 1115 O << TAI->getData32bitsDirective() << unsigned(Val) 1116 << '\t' << TAI->getCommentString() 1117 << " Double-word least significant word " << Val << '\n'; 1118 } else { 1119 O << TAI->getData32bitsDirective() << unsigned(Val) 1120 << '\t' << TAI->getCommentString() 1121 << " Double-word least significant word " << Val << '\n'; 1122 O << TAI->getData32bitsDirective() << unsigned(Val >> 32) 1123 << '\t' << TAI->getCommentString() 1124 << " Double-word most significant word " << Val << '\n'; 1125 } 1126 } 1127 return; 1128 } 1129 } else if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) { 1130 const VectorType *PTy = CP->getType(); 1131 1132 for (unsigned I = 0, E = PTy->getNumElements(); I < E; ++I) 1133 EmitGlobalConstant(CP->getOperand(I)); 1134 1135 return; 1136 } 1137 1138 const Type *type = CV->getType(); 1139 printDataDirective(type); 1140 EmitConstantValueOnly(CV); 1141 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1142 SmallString<40> S; 1143 CI->getValue().toStringUnsigned(S, 16); 1144 O << "\t\t\t" << TAI->getCommentString() << " 0x" << S.c_str(); 1145 } 1146 O << '\n'; 1147} 1148 1149void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1150 // Target doesn't support this yet! 1151 abort(); 1152} 1153 1154/// PrintSpecial - Print information related to the specified machine instr 1155/// that is independent of the operand, and may be independent of the instr 1156/// itself. This can be useful for portably encoding the comment character 1157/// or other bits of target-specific knowledge into the asmstrings. The 1158/// syntax used is ${:comment}. Targets can override this to add support 1159/// for their own strange codes. 1160void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) { 1161 if (!strcmp(Code, "private")) { 1162 O << TAI->getPrivateGlobalPrefix(); 1163 } else if (!strcmp(Code, "comment")) { 1164 O << TAI->getCommentString(); 1165 } else if (!strcmp(Code, "uid")) { 1166 // Assign a unique ID to this machine instruction. 1167 static const MachineInstr *LastMI = 0; 1168 static const Function *F = 0; 1169 static unsigned Counter = 0U-1; 1170 1171 // Comparing the address of MI isn't sufficient, because machineinstrs may 1172 // be allocated to the same address across functions. 1173 const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1174 1175 // If this is a new machine instruction, bump the counter. 1176 if (LastMI != MI || F != ThisF) { 1177 ++Counter; 1178 LastMI = MI; 1179 F = ThisF; 1180 } 1181 O << Counter; 1182 } else { 1183 cerr << "Unknown special formatter '" << Code 1184 << "' for machine instr: " << *MI; 1185 exit(1); 1186 } 1187} 1188 1189 1190/// printInlineAsm - This method formats and prints the specified machine 1191/// instruction that is an inline asm. 1192void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1193 unsigned NumOperands = MI->getNumOperands(); 1194 1195 // Count the number of register definitions. 1196 unsigned NumDefs = 0; 1197 for (; MI->getOperand(NumDefs).isRegister() && MI->getOperand(NumDefs).isDef(); 1198 ++NumDefs) 1199 assert(NumDefs != NumOperands-1 && "No asm string?"); 1200 1201 assert(MI->getOperand(NumDefs).isExternalSymbol() && "No asm string?"); 1202 1203 // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1204 const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 1205 1206 // If this asmstr is empty, just print the #APP/#NOAPP markers. 1207 // These are useful to see where empty asm's wound up. 1208 if (AsmStr[0] == 0) { 1209 O << TAI->getInlineAsmStart() << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 1210 return; 1211 } 1212 1213 O << TAI->getInlineAsmStart() << "\n\t"; 1214 1215 // The variant of the current asmprinter. 1216 int AsmPrinterVariant = TAI->getAssemblerDialect(); 1217 1218 int CurVariant = -1; // The number of the {.|.|.} region we are in. 1219 const char *LastEmitted = AsmStr; // One past the last character emitted. 1220 1221 while (*LastEmitted) { 1222 switch (*LastEmitted) { 1223 default: { 1224 // Not a special case, emit the string section literally. 1225 const char *LiteralEnd = LastEmitted+1; 1226 while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 1227 *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 1228 ++LiteralEnd; 1229 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1230 O.write(LastEmitted, LiteralEnd-LastEmitted); 1231 LastEmitted = LiteralEnd; 1232 break; 1233 } 1234 case '\n': 1235 ++LastEmitted; // Consume newline character. 1236 O << '\n'; // Indent code with newline. 1237 break; 1238 case '$': { 1239 ++LastEmitted; // Consume '$' character. 1240 bool Done = true; 1241 1242 // Handle escapes. 1243 switch (*LastEmitted) { 1244 default: Done = false; break; 1245 case '$': // $$ -> $ 1246 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1247 O << '$'; 1248 ++LastEmitted; // Consume second '$' character. 1249 break; 1250 case '(': // $( -> same as GCC's { character. 1251 ++LastEmitted; // Consume '(' character. 1252 if (CurVariant != -1) { 1253 cerr << "Nested variants found in inline asm string: '" 1254 << AsmStr << "'\n"; 1255 exit(1); 1256 } 1257 CurVariant = 0; // We're in the first variant now. 1258 break; 1259 case '|': 1260 ++LastEmitted; // consume '|' character. 1261 if (CurVariant == -1) { 1262 cerr << "Found '|' character outside of variant in inline asm " 1263 << "string: '" << AsmStr << "'\n"; 1264 exit(1); 1265 } 1266 ++CurVariant; // We're in the next variant. 1267 break; 1268 case ')': // $) -> same as GCC's } char. 1269 ++LastEmitted; // consume ')' character. 1270 if (CurVariant == -1) { 1271 cerr << "Found '}' character outside of variant in inline asm " 1272 << "string: '" << AsmStr << "'\n"; 1273 exit(1); 1274 } 1275 CurVariant = -1; 1276 break; 1277 } 1278 if (Done) break; 1279 1280 bool HasCurlyBraces = false; 1281 if (*LastEmitted == '{') { // ${variable} 1282 ++LastEmitted; // Consume '{' character. 1283 HasCurlyBraces = true; 1284 } 1285 1286 const char *IDStart = LastEmitted; 1287 char *IDEnd; 1288 errno = 0; 1289 long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 1290 if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 1291 cerr << "Bad $ operand number in inline asm string: '" 1292 << AsmStr << "'\n"; 1293 exit(1); 1294 } 1295 LastEmitted = IDEnd; 1296 1297 char Modifier[2] = { 0, 0 }; 1298 1299 if (HasCurlyBraces) { 1300 // If we have curly braces, check for a modifier character. This 1301 // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1302 if (*LastEmitted == ':') { 1303 ++LastEmitted; // Consume ':' character. 1304 if (*LastEmitted == 0) { 1305 cerr << "Bad ${:} expression in inline asm string: '" 1306 << AsmStr << "'\n"; 1307 exit(1); 1308 } 1309 1310 Modifier[0] = *LastEmitted; 1311 ++LastEmitted; // Consume modifier character. 1312 } 1313 1314 if (*LastEmitted != '}') { 1315 cerr << "Bad ${} expression in inline asm string: '" 1316 << AsmStr << "'\n"; 1317 exit(1); 1318 } 1319 ++LastEmitted; // Consume '}' character. 1320 } 1321 1322 if ((unsigned)Val >= NumOperands-1) { 1323 cerr << "Invalid $ operand number in inline asm string: '" 1324 << AsmStr << "'\n"; 1325 exit(1); 1326 } 1327 1328 // Okay, we finally have a value number. Ask the target to print this 1329 // operand! 1330 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1331 unsigned OpNo = 1; 1332 1333 bool Error = false; 1334 1335 // Scan to find the machine operand number for the operand. 1336 for (; Val; --Val) { 1337 if (OpNo >= MI->getNumOperands()) break; 1338 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1339 OpNo += (OpFlags >> 3) + 1; 1340 } 1341 1342 if (OpNo >= MI->getNumOperands()) { 1343 Error = true; 1344 } else { 1345 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1346 ++OpNo; // Skip over the ID number. 1347 1348 if (Modifier[0]=='l') // labels are target independent 1349 printBasicBlockLabel(MI->getOperand(OpNo).getMBB(), 1350 false, false, false); 1351 else { 1352 AsmPrinter *AP = const_cast<AsmPrinter*>(this); 1353 if ((OpFlags & 7) == 4) { 1354 Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1355 Modifier[0] ? Modifier : 0); 1356 } else { 1357 Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1358 Modifier[0] ? Modifier : 0); 1359 } 1360 } 1361 } 1362 if (Error) { 1363 cerr << "Invalid operand found in inline asm: '" 1364 << AsmStr << "'\n"; 1365 MI->dump(); 1366 exit(1); 1367 } 1368 } 1369 break; 1370 } 1371 } 1372 } 1373 O << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 1374} 1375 1376/// printImplicitDef - This method prints the specified machine instruction 1377/// that is an implicit def. 1378void AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1379 O << '\t' << TAI->getCommentString() << " implicit-def: " 1380 << TRI->getAsmName(MI->getOperand(0).getReg()) << '\n'; 1381} 1382 1383/// printLabel - This method prints a local label used by debug and 1384/// exception handling tables. 1385void AsmPrinter::printLabel(const MachineInstr *MI) const { 1386 printLabel(MI->getOperand(0).getImm()); 1387} 1388 1389void AsmPrinter::printLabel(unsigned Id) const { 1390 O << TAI->getPrivateGlobalPrefix() << "label" << Id << ":\n"; 1391} 1392 1393/// printDeclare - This method prints a local variable declaration used by 1394/// debug tables. 1395/// FIXME: It doesn't really print anything rather it inserts a DebugVariable 1396/// entry into dwarf table. 1397void AsmPrinter::printDeclare(const MachineInstr *MI) const { 1398 int FI = MI->getOperand(0).getIndex(); 1399 GlobalValue *GV = MI->getOperand(1).getGlobal(); 1400 MMI->RecordVariable(GV, FI); 1401} 1402 1403/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 1404/// instruction, using the specified assembler variant. Targets should 1405/// overried this to format as appropriate. 1406bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1407 unsigned AsmVariant, const char *ExtraCode) { 1408 // Target doesn't support this yet! 1409 return true; 1410} 1411 1412bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1413 unsigned AsmVariant, 1414 const char *ExtraCode) { 1415 // Target doesn't support this yet! 1416 return true; 1417} 1418 1419/// printBasicBlockLabel - This method prints the label for the specified 1420/// MachineBasicBlock 1421void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB, 1422 bool printAlign, 1423 bool printColon, 1424 bool printComment) const { 1425 if (printAlign) { 1426 unsigned Align = MBB->getAlignment(); 1427 if (Align) 1428 EmitAlignment(Log2_32(Align)); 1429 } 1430 1431 O << TAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_' 1432 << MBB->getNumber(); 1433 if (printColon) 1434 O << ':'; 1435 if (printComment && MBB->getBasicBlock()) 1436 O << '\t' << TAI->getCommentString() << ' ' 1437 << MBB->getBasicBlock()->getNameStart(); 1438} 1439 1440/// printPICJumpTableSetLabel - This method prints a set label for the 1441/// specified MachineBasicBlock for a jumptable entry. 1442void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, 1443 const MachineBasicBlock *MBB) const { 1444 if (!TAI->getSetDirective()) 1445 return; 1446 1447 O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1448 << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; 1449 printBasicBlockLabel(MBB, false, false, false); 1450 O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1451 << '_' << uid << '\n'; 1452} 1453 1454void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 1455 const MachineBasicBlock *MBB) const { 1456 if (!TAI->getSetDirective()) 1457 return; 1458 1459 O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1460 << getFunctionNumber() << '_' << uid << '_' << uid2 1461 << "_set_" << MBB->getNumber() << ','; 1462 printBasicBlockLabel(MBB, false, false, false); 1463 O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1464 << '_' << uid << '_' << uid2 << '\n'; 1465} 1466 1467/// printDataDirective - This method prints the asm directive for the 1468/// specified type. 1469void AsmPrinter::printDataDirective(const Type *type) { 1470 const TargetData *TD = TM.getTargetData(); 1471 switch (type->getTypeID()) { 1472 case Type::IntegerTyID: { 1473 unsigned BitWidth = cast<IntegerType>(type)->getBitWidth(); 1474 if (BitWidth <= 8) 1475 O << TAI->getData8bitsDirective(); 1476 else if (BitWidth <= 16) 1477 O << TAI->getData16bitsDirective(); 1478 else if (BitWidth <= 32) 1479 O << TAI->getData32bitsDirective(); 1480 else if (BitWidth <= 64) { 1481 assert(TAI->getData64bitsDirective() && 1482 "Target cannot handle 64-bit constant exprs!"); 1483 O << TAI->getData64bitsDirective(); 1484 } else { 1485 assert(0 && "Target cannot handle given data directive width!"); 1486 } 1487 break; 1488 } 1489 case Type::PointerTyID: 1490 if (TD->getPointerSize() == 8) { 1491 assert(TAI->getData64bitsDirective() && 1492 "Target cannot handle 64-bit pointer exprs!"); 1493 O << TAI->getData64bitsDirective(); 1494 } else { 1495 O << TAI->getData32bitsDirective(); 1496 } 1497 break; 1498 case Type::FloatTyID: case Type::DoubleTyID: 1499 case Type::X86_FP80TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: 1500 assert (0 && "Should have already output floating point constant."); 1501 default: 1502 assert (0 && "Can't handle printing this type of thing"); 1503 break; 1504 } 1505} 1506 1507void AsmPrinter::printSuffixedName(const char *Name, const char *Suffix, 1508 const char *Prefix) { 1509 if (Name[0]=='\"') 1510 O << '\"'; 1511 O << TAI->getPrivateGlobalPrefix(); 1512 if (Prefix) O << Prefix; 1513 if (Name[0]=='\"') 1514 O << '\"'; 1515 if (Name[0]=='\"') 1516 O << Name[1]; 1517 else 1518 O << Name; 1519 O << Suffix; 1520 if (Name[0]=='\"') 1521 O << '\"'; 1522} 1523 1524void AsmPrinter::printSuffixedName(const std::string &Name, const char* Suffix) { 1525 printSuffixedName(Name.c_str(), Suffix); 1526} 1527 1528void AsmPrinter::printVisibility(const std::string& Name, 1529 unsigned Visibility) const { 1530 if (Visibility == GlobalValue::HiddenVisibility) { 1531 if (const char *Directive = TAI->getHiddenDirective()) 1532 O << Directive << Name << '\n'; 1533 } else if (Visibility == GlobalValue::ProtectedVisibility) { 1534 if (const char *Directive = TAI->getProtectedDirective()) 1535 O << Directive << Name << '\n'; 1536 } 1537} 1538 1539GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 1540 if (!S->usesMetadata()) 1541 return 0; 1542 1543 gcp_iterator GCPI = GCMetadataPrinters.find(S); 1544 if (GCPI != GCMetadataPrinters.end()) 1545 return GCPI->second; 1546 1547 const char *Name = S->getName().c_str(); 1548 1549 for (GCMetadataPrinterRegistry::iterator 1550 I = GCMetadataPrinterRegistry::begin(), 1551 E = GCMetadataPrinterRegistry::end(); I != E; ++I) 1552 if (strcmp(Name, I->getName()) == 0) { 1553 GCMetadataPrinter *GMP = I->instantiate(); 1554 GMP->S = S; 1555 GCMetadataPrinters.insert(std::make_pair(S, GMP)); 1556 return GMP; 1557 } 1558 1559 cerr << "no GCMetadataPrinter registered for GC: " << Name << "\n"; 1560 abort(); 1561} 1562