3de290f1a8da84e454271e6a401443989ddc408b
[oota-llvm.git] / lib / Target / PowerPC / AsmPrinter / PPCAsmPrinter.cpp
1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly --------=//
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 PowerPC assembly language. This printer is
12 // the output mechanism used by `llc'.
13 //
14 // Documentation at http://developer.apple.com/documentation/DeveloperTools/
15 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
16 //
17 //===----------------------------------------------------------------------===//
18
19 #define DEBUG_TYPE "asmprinter"
20 #include "PPC.h"
21 #include "PPCPredicates.h"
22 #include "PPCTargetMachine.h"
23 #include "PPCSubtarget.h"
24 #include "llvm/Constants.h"
25 #include "llvm/DerivedTypes.h"
26 #include "llvm/Module.h"
27 #include "llvm/Assembly/Writer.h"
28 #include "llvm/CodeGen/AsmPrinter.h"
29 #include "llvm/CodeGen/DwarfWriter.h"
30 #include "llvm/CodeGen/MachineModuleInfo.h"
31 #include "llvm/CodeGen/MachineFunctionPass.h"
32 #include "llvm/CodeGen/MachineInstr.h"
33 #include "llvm/CodeGen/MachineInstrBuilder.h"
34 #include "llvm/Support/Mangler.h"
35 #include "llvm/Support/MathExtras.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/Debug.h"
38 #include "llvm/Support/Compiler.h"
39 #include "llvm/Support/raw_ostream.h"
40 #include "llvm/Target/TargetAsmInfo.h"
41 #include "llvm/Target/TargetRegisterInfo.h"
42 #include "llvm/Target/TargetInstrInfo.h"
43 #include "llvm/Target/TargetOptions.h"
44 #include "llvm/ADT/Statistic.h"
45 #include "llvm/ADT/StringExtras.h"
46 #include "llvm/ADT/StringSet.h"
47 using namespace llvm;
48
49 STATISTIC(EmittedInsts, "Number of machine instrs printed");
50
51 namespace {
52   class VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter {
53   protected:
54     StringSet<> FnStubs, GVStubs, HiddenGVStubs;
55     const PPCSubtarget &Subtarget;
56   public:
57     PPCAsmPrinter(raw_ostream &O, TargetMachine &TM,
58                   const TargetAsmInfo *T, bool F)
59       : AsmPrinter(O, TM, T, F),
60         Subtarget(TM.getSubtarget<PPCSubtarget>()) {}
61
62     virtual const char *getPassName() const {
63       return "PowerPC Assembly Printer";
64     }
65
66     PPCTargetMachine &getTM() {
67       return static_cast<PPCTargetMachine&>(TM);
68     }
69
70     unsigned enumRegToMachineReg(unsigned enumReg) {
71       switch (enumReg) {
72       default: assert(0 && "Unhandled register!"); break;
73       case PPC::CR0:  return  0;
74       case PPC::CR1:  return  1;
75       case PPC::CR2:  return  2;
76       case PPC::CR3:  return  3;
77       case PPC::CR4:  return  4;
78       case PPC::CR5:  return  5;
79       case PPC::CR6:  return  6;
80       case PPC::CR7:  return  7;
81       }
82       abort();
83     }
84
85     /// printInstruction - This method is automatically generated by tablegen
86     /// from the instruction set description.  This method returns true if the
87     /// machine instruction was sufficiently described to print it, otherwise it
88     /// returns false.
89     bool printInstruction(const MachineInstr *MI);
90
91     void printMachineInstruction(const MachineInstr *MI);
92     void printOp(const MachineOperand &MO);
93
94     /// stripRegisterPrefix - This method strips the character prefix from a
95     /// register name so that only the number is left.  Used by for linux asm.
96     const char *stripRegisterPrefix(const char *RegName) {
97       switch (RegName[0]) {
98       case 'r':
99       case 'f':
100       case 'v': return RegName + 1;
101       case 'c': if (RegName[1] == 'r') return RegName + 2;
102       }
103
104       return RegName;
105     }
106
107     /// printRegister - Print register according to target requirements.
108     ///
109     void printRegister(const MachineOperand &MO, bool R0AsZero) {
110       unsigned RegNo = MO.getReg();
111       assert(TargetRegisterInfo::isPhysicalRegister(RegNo) && "Not physreg??");
112
113       // If we should use 0 for R0.
114       if (R0AsZero && RegNo == PPC::R0) {
115         O << "0";
116         return;
117       }
118
119       const char *RegName = TM.getRegisterInfo()->get(RegNo).AsmName;
120       // Linux assembler (Others?) does not take register mnemonics.
121       // FIXME - What about special registers used in mfspr/mtspr?
122       if (!Subtarget.isDarwin()) RegName = stripRegisterPrefix(RegName);
123       O << RegName;
124     }
125
126     void printOperand(const MachineInstr *MI, unsigned OpNo) {
127       const MachineOperand &MO = MI->getOperand(OpNo);
128       if (MO.isReg()) {
129         printRegister(MO, false);
130       } else if (MO.isImm()) {
131         O << MO.getImm();
132       } else {
133         printOp(MO);
134       }
135     }
136
137     bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
138                          unsigned AsmVariant, const char *ExtraCode);
139     bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
140                                unsigned AsmVariant, const char *ExtraCode);
141
142
143     void printS5ImmOperand(const MachineInstr *MI, unsigned OpNo) {
144       char value = MI->getOperand(OpNo).getImm();
145       value = (value << (32-5)) >> (32-5);
146       O << (int)value;
147     }
148     void printU5ImmOperand(const MachineInstr *MI, unsigned OpNo) {
149       unsigned char value = MI->getOperand(OpNo).getImm();
150       assert(value <= 31 && "Invalid u5imm argument!");
151       O << (unsigned int)value;
152     }
153     void printU6ImmOperand(const MachineInstr *MI, unsigned OpNo) {
154       unsigned char value = MI->getOperand(OpNo).getImm();
155       assert(value <= 63 && "Invalid u6imm argument!");
156       O << (unsigned int)value;
157     }
158     void printS16ImmOperand(const MachineInstr *MI, unsigned OpNo) {
159       O << (short)MI->getOperand(OpNo).getImm();
160     }
161     void printU16ImmOperand(const MachineInstr *MI, unsigned OpNo) {
162       O << (unsigned short)MI->getOperand(OpNo).getImm();
163     }
164     void printS16X4ImmOperand(const MachineInstr *MI, unsigned OpNo) {
165       if (MI->getOperand(OpNo).isImm()) {
166         O << (short)(MI->getOperand(OpNo).getImm()*4);
167       } else {
168         O << "lo16(";
169         printOp(MI->getOperand(OpNo));
170         if (TM.getRelocationModel() == Reloc::PIC_)
171           O << "-\"L" << getFunctionNumber() << "$pb\")";
172         else
173           O << ')';
174       }
175     }
176     void printBranchOperand(const MachineInstr *MI, unsigned OpNo) {
177       // Branches can take an immediate operand.  This is used by the branch
178       // selection pass to print $+8, an eight byte displacement from the PC.
179       if (MI->getOperand(OpNo).isImm()) {
180         O << "$+" << MI->getOperand(OpNo).getImm()*4;
181       } else {
182         printOp(MI->getOperand(OpNo));
183       }
184     }
185     void printCallOperand(const MachineInstr *MI, unsigned OpNo) {
186       const MachineOperand &MO = MI->getOperand(OpNo);
187       if (TM.getRelocationModel() != Reloc::Static) {
188         if (MO.getType() == MachineOperand::MO_GlobalAddress) {
189           GlobalValue *GV = MO.getGlobal();
190           if (((GV->isDeclaration() || GV->hasWeakLinkage() ||
191                 GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) {
192             // Dynamically-resolved functions need a stub for the function.
193             std::string Name = Mang->getValueName(GV);
194             FnStubs.insert(Name);
195             printSuffixedName(Name, "$stub");
196             if (GV->hasExternalWeakLinkage())
197               ExtWeakSymbols.insert(GV);
198             return;
199           }
200         }
201         if (MO.getType() == MachineOperand::MO_ExternalSymbol) {
202           std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName();
203           FnStubs.insert(Name);
204           printSuffixedName(Name, "$stub");
205           return;
206         }
207       }
208
209       printOp(MI->getOperand(OpNo));
210     }
211     void printAbsAddrOperand(const MachineInstr *MI, unsigned OpNo) {
212      O << (int)MI->getOperand(OpNo).getImm()*4;
213     }
214     void printPICLabel(const MachineInstr *MI, unsigned OpNo) {
215       O << "\"L" << getFunctionNumber() << "$pb\"\n";
216       O << "\"L" << getFunctionNumber() << "$pb\":";
217     }
218     void printSymbolHi(const MachineInstr *MI, unsigned OpNo) {
219       if (MI->getOperand(OpNo).isImm()) {
220         printS16ImmOperand(MI, OpNo);
221       } else {
222         if (Subtarget.isDarwin()) O << "ha16(";
223         printOp(MI->getOperand(OpNo));
224         if (TM.getRelocationModel() == Reloc::PIC_)
225           O << "-\"L" << getFunctionNumber() << "$pb\"";
226         if (Subtarget.isDarwin())
227           O << ')';
228         else
229           O << "@ha";
230       }
231     }
232     void printSymbolLo(const MachineInstr *MI, unsigned OpNo) {
233       if (MI->getOperand(OpNo).isImm()) {
234         printS16ImmOperand(MI, OpNo);
235       } else {
236         if (Subtarget.isDarwin()) O << "lo16(";
237         printOp(MI->getOperand(OpNo));
238         if (TM.getRelocationModel() == Reloc::PIC_)
239           O << "-\"L" << getFunctionNumber() << "$pb\"";
240         if (Subtarget.isDarwin())
241           O << ')';
242         else
243           O << "@l";
244       }
245     }
246     void printcrbitm(const MachineInstr *MI, unsigned OpNo) {
247       unsigned CCReg = MI->getOperand(OpNo).getReg();
248       unsigned RegNo = enumRegToMachineReg(CCReg);
249       O << (0x80 >> RegNo);
250     }
251     // The new addressing mode printers.
252     void printMemRegImm(const MachineInstr *MI, unsigned OpNo) {
253       printSymbolLo(MI, OpNo);
254       O << '(';
255       if (MI->getOperand(OpNo+1).isReg() &&
256           MI->getOperand(OpNo+1).getReg() == PPC::R0)
257         O << "0";
258       else
259         printOperand(MI, OpNo+1);
260       O << ')';
261     }
262     void printMemRegImmShifted(const MachineInstr *MI, unsigned OpNo) {
263       if (MI->getOperand(OpNo).isImm())
264         printS16X4ImmOperand(MI, OpNo);
265       else
266         printSymbolLo(MI, OpNo);
267       O << '(';
268       if (MI->getOperand(OpNo+1).isReg() &&
269           MI->getOperand(OpNo+1).getReg() == PPC::R0)
270         O << "0";
271       else
272         printOperand(MI, OpNo+1);
273       O << ')';
274     }
275
276     void printMemRegReg(const MachineInstr *MI, unsigned OpNo) {
277       // When used as the base register, r0 reads constant zero rather than
278       // the value contained in the register.  For this reason, the darwin
279       // assembler requires that we print r0 as 0 (no r) when used as the base.
280       const MachineOperand &MO = MI->getOperand(OpNo);
281       printRegister(MO, true);
282       O << ", ";
283       printOperand(MI, OpNo+1);
284     }
285
286     void printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
287                                const char *Modifier);
288
289     virtual bool runOnMachineFunction(MachineFunction &F) = 0;
290     virtual bool doFinalization(Module &M) = 0;
291
292     virtual void EmitExternalGlobal(const GlobalVariable *GV);
293   };
294
295   /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
296   class VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter {
297     DwarfWriter *DW;
298     MachineModuleInfo *MMI;
299   public:
300     PPCLinuxAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
301                        const TargetAsmInfo *T, bool F)
302       : PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0) {}
303
304     virtual const char *getPassName() const {
305       return "Linux PPC Assembly Printer";
306     }
307
308     bool runOnMachineFunction(MachineFunction &F);
309     bool doInitialization(Module &M);
310     bool doFinalization(Module &M);
311
312     void getAnalysisUsage(AnalysisUsage &AU) const {
313       AU.setPreservesAll();
314       AU.addRequired<MachineModuleInfo>();
315       AU.addRequired<DwarfWriter>();
316       PPCAsmPrinter::getAnalysisUsage(AU);
317     }
318
319     void printModuleLevelGV(const GlobalVariable* GVar);
320   };
321
322   /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac
323   /// OS X
324   class VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter {
325     DwarfWriter *DW;
326     MachineModuleInfo *MMI;
327     raw_ostream &OS;
328   public:
329     PPCDarwinAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
330                         const TargetAsmInfo *T, bool F)
331       : PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0), OS(O) {}
332
333     virtual const char *getPassName() const {
334       return "Darwin PPC Assembly Printer";
335     }
336
337     bool runOnMachineFunction(MachineFunction &F);
338     bool doInitialization(Module &M);
339     bool doFinalization(Module &M);
340
341     void getAnalysisUsage(AnalysisUsage &AU) const {
342       AU.setPreservesAll();
343       AU.addRequired<MachineModuleInfo>();
344       AU.addRequired<DwarfWriter>();
345       PPCAsmPrinter::getAnalysisUsage(AU);
346     }
347
348     void printModuleLevelGV(const GlobalVariable* GVar);
349   };
350 } // end of anonymous namespace
351
352 // Include the auto-generated portion of the assembly writer
353 #include "PPCGenAsmWriter.inc"
354
355 void PPCAsmPrinter::printOp(const MachineOperand &MO) {
356   switch (MO.getType()) {
357   case MachineOperand::MO_Immediate:
358     cerr << "printOp() does not handle immediate values\n";
359     abort();
360     return;
361
362   case MachineOperand::MO_MachineBasicBlock:
363     printBasicBlockLabel(MO.getMBB());
364     return;
365   case MachineOperand::MO_JumpTableIndex:
366     O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
367       << '_' << MO.getIndex();
368     // FIXME: PIC relocation model
369     return;
370   case MachineOperand::MO_ConstantPoolIndex:
371     O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
372       << '_' << MO.getIndex();
373     return;
374   case MachineOperand::MO_ExternalSymbol:
375     // Computing the address of an external symbol, not calling it.
376     if (TM.getRelocationModel() != Reloc::Static) {
377       std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName();
378       GVStubs.insert(Name);
379       printSuffixedName(Name, "$non_lazy_ptr");
380       return;
381     }
382     O << TAI->getGlobalPrefix() << MO.getSymbolName();
383     return;
384   case MachineOperand::MO_GlobalAddress: {
385     // Computing the address of a global symbol, not calling it.
386     GlobalValue *GV = MO.getGlobal();
387     std::string Name = Mang->getValueName(GV);
388
389     // External or weakly linked global variables need non-lazily-resolved stubs
390     if (TM.getRelocationModel() != Reloc::Static) {
391       if (GV->isDeclaration() || GV->isWeakForLinker()) {
392         if (GV->hasHiddenVisibility()) {
393           if (!GV->isDeclaration() && !GV->hasCommonLinkage())
394             O << Name;
395           else {
396             HiddenGVStubs.insert(Name);
397             printSuffixedName(Name, "$non_lazy_ptr");
398           }
399         } else {
400           GVStubs.insert(Name);
401           printSuffixedName(Name, "$non_lazy_ptr");
402         }
403         if (GV->hasExternalWeakLinkage())
404           ExtWeakSymbols.insert(GV);
405         return;
406       }
407     }
408     O << Name;
409
410     printOffset(MO.getOffset());
411
412     if (GV->hasExternalWeakLinkage())
413       ExtWeakSymbols.insert(GV);
414     return;
415   }
416
417   default:
418     O << "<unknown operand type: " << MO.getType() << ">";
419     return;
420   }
421 }
422
423 /// EmitExternalGlobal - In this case we need to use the indirect symbol.
424 ///
425 void PPCAsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) {
426   std::string Name = getGlobalLinkName(GV);
427   if (TM.getRelocationModel() != Reloc::Static) {
428     if (GV->hasHiddenVisibility())
429       HiddenGVStubs.insert(Name);
430     else
431       GVStubs.insert(Name);
432     printSuffixedName(Name, "$non_lazy_ptr");
433     return;
434   }
435   O << Name;
436 }
437
438 /// PrintAsmOperand - Print out an operand for an inline asm expression.
439 ///
440 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
441                                     unsigned AsmVariant,
442                                     const char *ExtraCode) {
443   // Does this asm operand have a single letter operand modifier?
444   if (ExtraCode && ExtraCode[0]) {
445     if (ExtraCode[1] != 0) return true; // Unknown modifier.
446
447     switch (ExtraCode[0]) {
448     default: return true;  // Unknown modifier.
449     case 'c': // Don't print "$" before a global var name or constant.
450       // PPC never has a prefix.
451       printOperand(MI, OpNo);
452       return false;
453     case 'L': // Write second word of DImode reference.
454       // Verify that this operand has two consecutive registers.
455       if (!MI->getOperand(OpNo).isReg() ||
456           OpNo+1 == MI->getNumOperands() ||
457           !MI->getOperand(OpNo+1).isReg())
458         return true;
459       ++OpNo;   // Return the high-part.
460       break;
461     case 'I':
462       // Write 'i' if an integer constant, otherwise nothing.  Used to print
463       // addi vs add, etc.
464       if (MI->getOperand(OpNo).isImm())
465         O << "i";
466       return false;
467     }
468   }
469
470   printOperand(MI, OpNo);
471   return false;
472 }
473
474 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
475                                           unsigned AsmVariant,
476                                           const char *ExtraCode) {
477   if (ExtraCode && ExtraCode[0])
478     return true; // Unknown modifier.
479   if (MI->getOperand(OpNo).isReg())
480     printMemRegReg(MI, OpNo);
481   else
482     printMemRegImm(MI, OpNo);
483   return false;
484 }
485
486 void PPCAsmPrinter::printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
487                                           const char *Modifier) {
488   assert(Modifier && "Must specify 'cc' or 'reg' as predicate op modifier!");
489   unsigned Code = MI->getOperand(OpNo).getImm();
490   if (!strcmp(Modifier, "cc")) {
491     switch ((PPC::Predicate)Code) {
492     case PPC::PRED_ALWAYS: return; // Don't print anything for always.
493     case PPC::PRED_LT: O << "lt"; return;
494     case PPC::PRED_LE: O << "le"; return;
495     case PPC::PRED_EQ: O << "eq"; return;
496     case PPC::PRED_GE: O << "ge"; return;
497     case PPC::PRED_GT: O << "gt"; return;
498     case PPC::PRED_NE: O << "ne"; return;
499     case PPC::PRED_UN: O << "un"; return;
500     case PPC::PRED_NU: O << "nu"; return;
501     }
502
503   } else {
504     assert(!strcmp(Modifier, "reg") &&
505            "Need to specify 'cc' or 'reg' as predicate op modifier!");
506     // Don't print the register for 'always'.
507     if (Code == PPC::PRED_ALWAYS) return;
508     printOperand(MI, OpNo+1);
509   }
510 }
511
512
513 /// printMachineInstruction -- Print out a single PowerPC MI in Darwin syntax to
514 /// the current output stream.
515 ///
516 void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
517   ++EmittedInsts;
518
519   // Check for slwi/srwi mnemonics.
520   if (MI->getOpcode() == PPC::RLWINM) {
521     bool FoundMnemonic = false;
522     unsigned char SH = MI->getOperand(2).getImm();
523     unsigned char MB = MI->getOperand(3).getImm();
524     unsigned char ME = MI->getOperand(4).getImm();
525     if (SH <= 31 && MB == 0 && ME == (31-SH)) {
526       O << "\tslwi "; FoundMnemonic = true;
527     }
528     if (SH <= 31 && MB == (32-SH) && ME == 31) {
529       O << "\tsrwi "; FoundMnemonic = true;
530       SH = 32-SH;
531     }
532     if (FoundMnemonic) {
533       printOperand(MI, 0);
534       O << ", ";
535       printOperand(MI, 1);
536       O << ", " << (unsigned int)SH << '\n';
537       return;
538     }
539   } else if (MI->getOpcode() == PPC::OR || MI->getOpcode() == PPC::OR8) {
540     if (MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) {
541       O << "\tmr ";
542       printOperand(MI, 0);
543       O << ", ";
544       printOperand(MI, 1);
545       O << '\n';
546       return;
547     }
548   } else if (MI->getOpcode() == PPC::RLDICR) {
549     unsigned char SH = MI->getOperand(2).getImm();
550     unsigned char ME = MI->getOperand(3).getImm();
551     // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH
552     if (63-SH == ME) {
553       O << "\tsldi ";
554       printOperand(MI, 0);
555       O << ", ";
556       printOperand(MI, 1);
557       O << ", " << (unsigned int)SH << '\n';
558       return;
559     }
560   }
561
562   if (printInstruction(MI))
563     return; // Printer was automatically generated
564
565   assert(0 && "Unhandled instruction in asm writer!");
566   abort();
567   return;
568 }
569
570 /// runOnMachineFunction - This uses the printMachineInstruction()
571 /// method to print assembly for each instruction.
572 ///
573 bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
574   this->MF = &MF;
575
576   SetupMachineFunction(MF);
577   O << "\n\n";
578
579   // Print out constants referenced by the function
580   EmitConstantPool(MF.getConstantPool());
581
582   // Print out labels for the function.
583   const Function *F = MF.getFunction();
584   SwitchToSection(TAI->SectionForGlobal(F));
585
586   switch (F->getLinkage()) {
587   default: assert(0 && "Unknown linkage type!");
588   case Function::PrivateLinkage:
589   case Function::InternalLinkage:  // Symbols default to internal.
590     break;
591   case Function::ExternalLinkage:
592     O << "\t.global\t" << CurrentFnName << '\n'
593       << "\t.type\t" << CurrentFnName << ", @function\n";
594     break;
595   case Function::WeakAnyLinkage:
596   case Function::WeakODRLinkage:
597   case Function::LinkOnceAnyLinkage:
598   case Function::LinkOnceODRLinkage:
599     O << "\t.global\t" << CurrentFnName << '\n';
600     O << "\t.weak\t" << CurrentFnName << '\n';
601     break;
602   }
603
604   printVisibility(CurrentFnName, F->getVisibility());
605
606   EmitAlignment(2, F);
607   O << CurrentFnName << ":\n";
608
609   // Emit pre-function debug information.
610   DW->BeginFunction(&MF);
611
612   // Print out code for the function.
613   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
614        I != E; ++I) {
615     // Print a label for the basic block.
616     if (I != MF.begin()) {
617       printBasicBlockLabel(I, true, true);
618       O << '\n';
619     }
620     for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
621          II != E; ++II) {
622       // Print the assembly for the instruction.
623       printMachineInstruction(II);
624     }
625   }
626
627   O << "\t.size\t" << CurrentFnName << ",.-" << CurrentFnName << '\n';
628
629   // Print out jump tables referenced by the function.
630   EmitJumpTableInfo(MF.getJumpTableInfo(), MF);
631
632   SwitchToSection(TAI->SectionForGlobal(F));
633
634   // Emit post-function debug information.
635   DW->EndFunction(&MF);
636
637   O.flush();
638
639   // We didn't modify anything.
640   return false;
641 }
642
643 bool PPCLinuxAsmPrinter::doInitialization(Module &M) {
644   bool Result = AsmPrinter::doInitialization(M);
645
646   // Emit initial debug information.
647   MMI = getAnalysisIfAvailable<MachineModuleInfo>();
648   assert(MMI);
649   DW = getAnalysisIfAvailable<DwarfWriter>();
650   assert(DW && "DwarfWriter is not available");
651   DW->BeginModule(&M, MMI, O, this, TAI);
652
653   // GNU as handles section names wrapped in quotes
654   Mang->setUseQuotes(true);
655
656   SwitchToSection(TAI->getTextSection());
657
658   return Result;
659 }
660
661 /// PrintUnmangledNameSafely - Print out the printable characters in the name.
662 /// Don't print things like \\n or \\0.
663 static void PrintUnmangledNameSafely(const Value *V, raw_ostream &OS) {
664   for (const char *Name = V->getNameStart(), *E = Name+V->getNameLen();
665        Name != E; ++Name)
666     if (isprint(*Name))
667       OS << *Name;
668 }
669
670 void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
671   const TargetData *TD = TM.getTargetData();
672
673   if (!GVar->hasInitializer())
674     return;   // External global require no code
675
676   // Check to see if this is a special global used by LLVM, if so, emit it.
677   if (EmitSpecialLLVMGlobal(GVar))
678     return;
679
680   std::string name = Mang->getValueName(GVar);
681
682   printVisibility(name, GVar->getVisibility());
683
684   Constant *C = GVar->getInitializer();
685   const Type *Type = C->getType();
686   unsigned Size = TD->getTypePaddedSize(Type);
687   unsigned Align = TD->getPreferredAlignmentLog(GVar);
688
689   SwitchToSection(TAI->SectionForGlobal(GVar));
690
691   if (C->isNullValue() && /* FIXME: Verify correct */
692       !GVar->hasSection() &&
693       (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
694        GVar->isWeakForLinker())) {
695       if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
696
697       if (GVar->hasExternalLinkage()) {
698         O << "\t.global " << name << '\n';
699         O << "\t.type " << name << ", @object\n";
700         O << name << ":\n";
701         O << "\t.zero " << Size << '\n';
702       } else if (GVar->hasLocalLinkage()) {
703         O << TAI->getLCOMMDirective() << name << ',' << Size;
704       } else {
705         O << ".comm " << name << ',' << Size;
706       }
707       O << "\t\t" << TAI->getCommentString() << " '";
708       PrintUnmangledNameSafely(GVar, O);
709       O << "'\n";
710       return;
711   }
712
713   switch (GVar->getLinkage()) {
714    case GlobalValue::LinkOnceAnyLinkage:
715    case GlobalValue::LinkOnceODRLinkage:
716    case GlobalValue::WeakAnyLinkage:
717    case GlobalValue::WeakODRLinkage:
718    case GlobalValue::CommonLinkage:
719     O << "\t.global " << name << '\n'
720       << "\t.type " << name << ", @object\n"
721       << "\t.weak " << name << '\n';
722     break;
723    case GlobalValue::AppendingLinkage:
724     // FIXME: appending linkage variables should go into a section of
725     // their name or something.  For now, just emit them as external.
726    case GlobalValue::ExternalLinkage:
727     // If external or appending, declare as a global symbol
728     O << "\t.global " << name << '\n'
729       << "\t.type " << name << ", @object\n";
730     // FALL THROUGH
731    case GlobalValue::InternalLinkage:
732    case GlobalValue::PrivateLinkage:
733     break;
734    default:
735     cerr << "Unknown linkage type!";
736     abort();
737   }
738
739   EmitAlignment(Align, GVar);
740   O << name << ":\t\t\t\t" << TAI->getCommentString() << " '";
741   PrintUnmangledNameSafely(GVar, O);
742   O << "'\n";
743
744   // If the initializer is a extern weak symbol, remember to emit the weak
745   // reference!
746   if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
747     if (GV->hasExternalWeakLinkage())
748       ExtWeakSymbols.insert(GV);
749
750   EmitGlobalConstant(C);
751   O << '\n';
752 }
753
754 bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
755   // Print out module-level global variables here.
756   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
757        I != E; ++I)
758     printModuleLevelGV(I);
759
760   // TODO
761
762   // Emit initial debug information.
763   DW->EndModule();
764
765   return AsmPrinter::doFinalization(M);
766 }
767
768 /// runOnMachineFunction - This uses the printMachineInstruction()
769 /// method to print assembly for each instruction.
770 ///
771 bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
772   this->MF = &MF;
773
774   SetupMachineFunction(MF);
775   O << "\n\n";
776
777   // Print out constants referenced by the function
778   EmitConstantPool(MF.getConstantPool());
779
780   // Print out labels for the function.
781   const Function *F = MF.getFunction();
782   SwitchToSection(TAI->SectionForGlobal(F));
783
784   switch (F->getLinkage()) {
785   default: assert(0 && "Unknown linkage type!");
786   case Function::PrivateLinkage:
787   case Function::InternalLinkage:  // Symbols default to internal.
788     break;
789   case Function::ExternalLinkage:
790     O << "\t.globl\t" << CurrentFnName << '\n';
791     break;
792   case Function::WeakAnyLinkage:
793   case Function::WeakODRLinkage:
794   case Function::LinkOnceAnyLinkage:
795   case Function::LinkOnceODRLinkage:
796     O << "\t.globl\t" << CurrentFnName << '\n';
797     O << "\t.weak_definition\t" << CurrentFnName << '\n';
798     break;
799   }
800
801   printVisibility(CurrentFnName, F->getVisibility());
802
803   EmitAlignment(F->hasFnAttr(Attribute::OptimizeForSize) ? 2 : 4, F);
804   O << CurrentFnName << ":\n";
805
806   // Emit pre-function debug information.
807   DW->BeginFunction(&MF);
808
809   // If the function is empty, then we need to emit *something*. Otherwise, the
810   // function's label might be associated with something that it wasn't meant to
811   // be associated with. We emit a noop in this situation.
812   MachineFunction::iterator I = MF.begin();
813
814   if (++I == MF.end() && MF.front().empty())
815     O << "\tnop\n";
816
817   // Print out code for the function.
818   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
819        I != E; ++I) {
820     // Print a label for the basic block.
821     if (I != MF.begin()) {
822       printBasicBlockLabel(I, true, true);
823       O << '\n';
824     }
825     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
826          II != IE; ++II) {
827       // Print the assembly for the instruction.
828       printMachineInstruction(II);
829     }
830   }
831
832   // Print out jump tables referenced by the function.
833   EmitJumpTableInfo(MF.getJumpTableInfo(), MF);
834
835   // Emit post-function debug information.
836   DW->EndFunction(&MF);
837
838   // We didn't modify anything.
839   return false;
840 }
841
842
843 bool PPCDarwinAsmPrinter::doInitialization(Module &M) {
844   static const char *const CPUDirectives[] = {
845     "",
846     "ppc",
847     "ppc601",
848     "ppc602",
849     "ppc603",
850     "ppc7400",
851     "ppc750",
852     "ppc970",
853     "ppc64"
854   };
855
856   unsigned Directive = Subtarget.getDarwinDirective();
857   if (Subtarget.isGigaProcessor() && Directive < PPC::DIR_970)
858     Directive = PPC::DIR_970;
859   if (Subtarget.hasAltivec() && Directive < PPC::DIR_7400)
860     Directive = PPC::DIR_7400;
861   if (Subtarget.isPPC64() && Directive < PPC::DIR_970)
862     Directive = PPC::DIR_64;
863   assert(Directive <= PPC::DIR_64 && "Directive out of range.");
864   O << "\t.machine " << CPUDirectives[Directive] << '\n';
865
866   bool Result = AsmPrinter::doInitialization(M);
867
868   // Emit initial debug information.
869   // We need this for Personality functions.
870   // AsmPrinter::doInitialization should have done this analysis.
871   MMI = getAnalysisIfAvailable<MachineModuleInfo>();
872   assert(MMI);
873   DW = getAnalysisIfAvailable<DwarfWriter>();
874   assert(DW && "DwarfWriter is not available");
875   DW->BeginModule(&M, MMI, O, this, TAI);
876
877   // Darwin wants symbols to be quoted if they have complex names.
878   Mang->setUseQuotes(true);
879
880   // Prime text sections so they are adjacent.  This reduces the likelihood a
881   // large data or debug section causes a branch to exceed 16M limit.
882   SwitchToTextSection("\t.section __TEXT,__textcoal_nt,coalesced,"
883                       "pure_instructions");
884   if (TM.getRelocationModel() == Reloc::PIC_) {
885     SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs,"
886                           "pure_instructions,32");
887   } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) {
888     SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
889                         "pure_instructions,16");
890   }
891   SwitchToSection(TAI->getTextSection());
892
893   return Result;
894 }
895
896 void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
897   const TargetData *TD = TM.getTargetData();
898
899   if (!GVar->hasInitializer())
900     return;   // External global require no code
901
902   // Check to see if this is a special global used by LLVM, if so, emit it.
903   if (EmitSpecialLLVMGlobal(GVar)) {
904     if (TM.getRelocationModel() == Reloc::Static) {
905       if (GVar->getName() == "llvm.global_ctors")
906         O << ".reference .constructors_used\n";
907       else if (GVar->getName() == "llvm.global_dtors")
908         O << ".reference .destructors_used\n";
909     }
910     return;
911   }
912
913   std::string name = Mang->getValueName(GVar);
914
915   printVisibility(name, GVar->getVisibility());
916
917   Constant *C = GVar->getInitializer();
918   const Type *Type = C->getType();
919   unsigned Size = TD->getTypePaddedSize(Type);
920   unsigned Align = TD->getPreferredAlignmentLog(GVar);
921
922   SwitchToSection(TAI->SectionForGlobal(GVar));
923
924   if (C->isNullValue() && /* FIXME: Verify correct */
925       !GVar->hasSection() &&
926       (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
927        GVar->isWeakForLinker()) &&
928       TAI->SectionKindForGlobal(GVar) != SectionKind::RODataMergeStr) {
929     if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
930
931     if (GVar->hasExternalLinkage()) {
932       O << "\t.globl " << name << '\n';
933       O << "\t.zerofill __DATA, __common, " << name << ", "
934         << Size << ", " << Align;
935     } else if (GVar->hasLocalLinkage()) {
936       O << TAI->getLCOMMDirective() << name << ',' << Size << ',' << Align;
937     } else if (!GVar->hasCommonLinkage()) {
938       O << "\t.globl " << name << '\n'
939         << TAI->getWeakDefDirective() << name << '\n';
940       EmitAlignment(Align, GVar);
941       O << name << ":\t\t\t\t" << TAI->getCommentString() << " ";
942       PrintUnmangledNameSafely(GVar, O);
943       O << '\n';
944       EmitGlobalConstant(C);
945       return;
946     } else {
947       O << ".comm " << name << ',' << Size;
948       // Darwin 9 and above support aligned common data.
949       if (Subtarget.isDarwin9())
950         O << ',' << Align;
951     }
952     O << "\t\t" << TAI->getCommentString() << " '";
953     PrintUnmangledNameSafely(GVar, O);
954     O << "'\n";
955     return;
956   }
957
958   switch (GVar->getLinkage()) {
959    case GlobalValue::LinkOnceAnyLinkage:
960    case GlobalValue::LinkOnceODRLinkage:
961    case GlobalValue::WeakAnyLinkage:
962    case GlobalValue::WeakODRLinkage:
963    case GlobalValue::CommonLinkage:
964     O << "\t.globl " << name << '\n'
965       << "\t.weak_definition " << name << '\n';
966     break;
967    case GlobalValue::AppendingLinkage:
968     // FIXME: appending linkage variables should go into a section of
969     // their name or something.  For now, just emit them as external.
970    case GlobalValue::ExternalLinkage:
971     // If external or appending, declare as a global symbol
972     O << "\t.globl " << name << '\n';
973     // FALL THROUGH
974    case GlobalValue::InternalLinkage:
975    case GlobalValue::PrivateLinkage:
976     break;
977    default:
978     cerr << "Unknown linkage type!";
979     abort();
980   }
981
982   EmitAlignment(Align, GVar);
983   O << name << ":\t\t\t\t" << TAI->getCommentString() << " '";
984   PrintUnmangledNameSafely(GVar, O);
985   O << "'\n";
986
987   // If the initializer is a extern weak symbol, remember to emit the weak
988   // reference!
989   if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
990     if (GV->hasExternalWeakLinkage())
991       ExtWeakSymbols.insert(GV);
992
993   EmitGlobalConstant(C);
994   O << '\n';
995 }
996
997 bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
998   const TargetData *TD = TM.getTargetData();
999
1000   // Print out module-level global variables here.
1001   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
1002        I != E; ++I)
1003     printModuleLevelGV(I);
1004
1005   bool isPPC64 = TD->getPointerSizeInBits() == 64;
1006
1007   // Output stubs for dynamically-linked functions
1008   if (TM.getRelocationModel() == Reloc::PIC_) {
1009     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
1010          i != e; ++i) {
1011       SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs,"
1012                           "pure_instructions,32");
1013       EmitAlignment(4);
1014       const char *p = i->getKeyData();
1015       bool hasQuote = p[0]=='\"';
1016       printSuffixedName(p, "$stub");
1017       O << ":\n";
1018       O << "\t.indirect_symbol " << p << '\n';
1019       O << "\tmflr r0\n";
1020       O << "\tbcl 20,31,";
1021       if (hasQuote)
1022         O << "\"L0$" << &p[1];
1023       else
1024         O << "L0$" << p;
1025       O << '\n';
1026       if (hasQuote)
1027         O << "\"L0$" << &p[1];
1028       else
1029         O << "L0$" << p;
1030       O << ":\n";
1031       O << "\tmflr r11\n";
1032       O << "\taddis r11,r11,ha16(";
1033       printSuffixedName(p, "$lazy_ptr");
1034       O << "-";
1035       if (hasQuote)
1036         O << "\"L0$" << &p[1];
1037       else
1038         O << "L0$" << p;
1039       O << ")\n";
1040       O << "\tmtlr r0\n";
1041       if (isPPC64)
1042         O << "\tldu r12,lo16(";
1043       else
1044         O << "\tlwzu r12,lo16(";
1045       printSuffixedName(p, "$lazy_ptr");
1046       O << "-";
1047       if (hasQuote)
1048         O << "\"L0$" << &p[1];
1049       else
1050         O << "L0$" << p;
1051       O << ")(r11)\n";
1052       O << "\tmtctr r12\n";
1053       O << "\tbctr\n";
1054       SwitchToDataSection(".lazy_symbol_pointer");
1055       printSuffixedName(p, "$lazy_ptr");
1056       O << ":\n";
1057       O << "\t.indirect_symbol " << p << '\n';
1058       if (isPPC64)
1059         O << "\t.quad dyld_stub_binding_helper\n";
1060       else
1061         O << "\t.long dyld_stub_binding_helper\n";
1062     }
1063   } else {
1064     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
1065          i != e; ++i) {
1066       SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
1067                           "pure_instructions,16");
1068       EmitAlignment(4);
1069       const char *p = i->getKeyData();
1070       printSuffixedName(p, "$stub");
1071       O << ":\n";
1072       O << "\t.indirect_symbol " << p << '\n';
1073       O << "\tlis r11,ha16(";
1074       printSuffixedName(p, "$lazy_ptr");
1075       O << ")\n";
1076       if (isPPC64)
1077         O << "\tldu r12,lo16(";
1078       else
1079         O << "\tlwzu r12,lo16(";
1080       printSuffixedName(p, "$lazy_ptr");
1081       O << ")(r11)\n";
1082       O << "\tmtctr r12\n";
1083       O << "\tbctr\n";
1084       SwitchToDataSection(".lazy_symbol_pointer");
1085       printSuffixedName(p, "$lazy_ptr");
1086       O << ":\n";
1087       O << "\t.indirect_symbol " << p << '\n';
1088       if (isPPC64)
1089         O << "\t.quad dyld_stub_binding_helper\n";
1090       else
1091         O << "\t.long dyld_stub_binding_helper\n";
1092     }
1093   }
1094
1095   O << '\n';
1096
1097   if (TAI->doesSupportExceptionHandling() && MMI) {
1098     // Add the (possibly multiple) personalities to the set of global values.
1099     // Only referenced functions get into the Personalities list.
1100     const std::vector<Function *>& Personalities = MMI->getPersonalities();
1101
1102     for (std::vector<Function *>::const_iterator I = Personalities.begin(),
1103            E = Personalities.end(); I != E; ++I)
1104       if (*I) GVStubs.insert("_" + (*I)->getName());
1105   }
1106
1107   // Output stubs for external and common global variables.
1108   if (!GVStubs.empty()) {
1109     SwitchToDataSection(".non_lazy_symbol_pointer");
1110     for (StringSet<>::iterator i = GVStubs.begin(), e = GVStubs.end();
1111          i != e; ++i) {
1112       std::string p = i->getKeyData();
1113       printSuffixedName(p, "$non_lazy_ptr");
1114       O << ":\n";
1115       O << "\t.indirect_symbol " << p << '\n';
1116       if (isPPC64)
1117         O << "\t.quad\t0\n";
1118       else
1119         O << "\t.long\t0\n";
1120     }
1121   }
1122
1123   if (!HiddenGVStubs.empty()) {
1124     SwitchToSection(TAI->getDataSection());
1125     for (StringSet<>::iterator i = HiddenGVStubs.begin(), e = HiddenGVStubs.end();
1126          i != e; ++i) {
1127       std::string p = i->getKeyData();
1128       EmitAlignment(isPPC64 ? 3 : 2);
1129       printSuffixedName(p, "$non_lazy_ptr");
1130       O << ":\n";
1131       if (isPPC64)
1132         O << "\t.quad\t";
1133       else
1134         O << "\t.long\t";
1135       O << p << '\n';
1136     }
1137   }
1138
1139
1140   // Emit initial debug information.
1141   DW->EndModule();
1142
1143   // Funny Darwin hack: This flag tells the linker that no global symbols
1144   // contain code that falls through to other global symbols (e.g. the obvious
1145   // implementation of multiple entry points).  If this doesn't occur, the
1146   // linker can safely perform dead code stripping.  Since LLVM never generates
1147   // code that does this, it is always safe to set.
1148   O << "\t.subsections_via_symbols\n";
1149
1150   return AsmPrinter::doFinalization(M);
1151 }
1152
1153
1154
1155 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
1156 /// for a MachineFunction to the given output stream, in a format that the
1157 /// Darwin assembler can deal with.
1158 ///
1159 FunctionPass *llvm::createPPCAsmPrinterPass(raw_ostream &o,
1160                                             PPCTargetMachine &tm,
1161                                             bool fast) {
1162   const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>();
1163
1164   if (Subtarget->isDarwin()) {
1165     return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
1166   } else {
1167     return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
1168   }
1169 }
1170
1171 namespace {
1172   static struct Register {
1173     Register() {
1174       PPCTargetMachine::registerAsmPrinter(createPPCAsmPrinterPass);
1175     }
1176   } Registrator;
1177 }
1178
1179 extern "C" int PowerPCAsmPrinterForceLink;
1180 int PowerPCAsmPrinterForceLink = 0;