c690982751b0cf851c49607316922a32946c0728
[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     explicit PPCAsmPrinter(raw_ostream &O, TargetMachine &TM,
58                            const TargetAsmInfo *T, unsigned OL, bool V)
59       : AsmPrinter(O, TM, T, OL, V),
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     explicit PPCLinuxAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
301                                 const TargetAsmInfo *T, unsigned OL, bool V)
302       : PPCAsmPrinter(O, TM, T, OL, V), 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     explicit PPCDarwinAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
330                                  const TargetAsmInfo *T, unsigned OL, bool V)
331       : PPCAsmPrinter(O, TM, T, OL, V), 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;
427   getGlobalLinkName(GV, Name);
428   if (TM.getRelocationModel() != Reloc::Static) {
429     if (GV->hasHiddenVisibility())
430       HiddenGVStubs.insert(Name);
431     else
432       GVStubs.insert(Name);
433     printSuffixedName(Name, "$non_lazy_ptr");
434     return;
435   }
436   O << Name;
437 }
438
439 /// PrintAsmOperand - Print out an operand for an inline asm expression.
440 ///
441 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
442                                     unsigned AsmVariant,
443                                     const char *ExtraCode) {
444   // Does this asm operand have a single letter operand modifier?
445   if (ExtraCode && ExtraCode[0]) {
446     if (ExtraCode[1] != 0) return true; // Unknown modifier.
447
448     switch (ExtraCode[0]) {
449     default: return true;  // Unknown modifier.
450     case 'c': // Don't print "$" before a global var name or constant.
451       // PPC never has a prefix.
452       printOperand(MI, OpNo);
453       return false;
454     case 'L': // Write second word of DImode reference.
455       // Verify that this operand has two consecutive registers.
456       if (!MI->getOperand(OpNo).isReg() ||
457           OpNo+1 == MI->getNumOperands() ||
458           !MI->getOperand(OpNo+1).isReg())
459         return true;
460       ++OpNo;   // Return the high-part.
461       break;
462     case 'I':
463       // Write 'i' if an integer constant, otherwise nothing.  Used to print
464       // addi vs add, etc.
465       if (MI->getOperand(OpNo).isImm())
466         O << "i";
467       return false;
468     }
469   }
470
471   printOperand(MI, OpNo);
472   return false;
473 }
474
475 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
476                                           unsigned AsmVariant,
477                                           const char *ExtraCode) {
478   if (ExtraCode && ExtraCode[0])
479     return true; // Unknown modifier.
480   if (MI->getOperand(OpNo).isReg())
481     printMemRegReg(MI, OpNo);
482   else
483     printMemRegImm(MI, OpNo);
484   return false;
485 }
486
487 void PPCAsmPrinter::printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
488                                           const char *Modifier) {
489   assert(Modifier && "Must specify 'cc' or 'reg' as predicate op modifier!");
490   unsigned Code = MI->getOperand(OpNo).getImm();
491   if (!strcmp(Modifier, "cc")) {
492     switch ((PPC::Predicate)Code) {
493     case PPC::PRED_ALWAYS: return; // Don't print anything for always.
494     case PPC::PRED_LT: O << "lt"; return;
495     case PPC::PRED_LE: O << "le"; return;
496     case PPC::PRED_EQ: O << "eq"; return;
497     case PPC::PRED_GE: O << "ge"; return;
498     case PPC::PRED_GT: O << "gt"; return;
499     case PPC::PRED_NE: O << "ne"; return;
500     case PPC::PRED_UN: O << "un"; return;
501     case PPC::PRED_NU: O << "nu"; return;
502     }
503
504   } else {
505     assert(!strcmp(Modifier, "reg") &&
506            "Need to specify 'cc' or 'reg' as predicate op modifier!");
507     // Don't print the register for 'always'.
508     if (Code == PPC::PRED_ALWAYS) return;
509     printOperand(MI, OpNo+1);
510   }
511 }
512
513
514 /// printMachineInstruction -- Print out a single PowerPC MI in Darwin syntax to
515 /// the current output stream.
516 ///
517 void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
518   ++EmittedInsts;
519
520   // Check for slwi/srwi mnemonics.
521   if (MI->getOpcode() == PPC::RLWINM) {
522     bool FoundMnemonic = false;
523     unsigned char SH = MI->getOperand(2).getImm();
524     unsigned char MB = MI->getOperand(3).getImm();
525     unsigned char ME = MI->getOperand(4).getImm();
526     if (SH <= 31 && MB == 0 && ME == (31-SH)) {
527       O << "\tslwi "; FoundMnemonic = true;
528     }
529     if (SH <= 31 && MB == (32-SH) && ME == 31) {
530       O << "\tsrwi "; FoundMnemonic = true;
531       SH = 32-SH;
532     }
533     if (FoundMnemonic) {
534       printOperand(MI, 0);
535       O << ", ";
536       printOperand(MI, 1);
537       O << ", " << (unsigned int)SH << '\n';
538       return;
539     }
540   } else if (MI->getOpcode() == PPC::OR || MI->getOpcode() == PPC::OR8) {
541     if (MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) {
542       O << "\tmr ";
543       printOperand(MI, 0);
544       O << ", ";
545       printOperand(MI, 1);
546       O << '\n';
547       return;
548     }
549   } else if (MI->getOpcode() == PPC::RLDICR) {
550     unsigned char SH = MI->getOperand(2).getImm();
551     unsigned char ME = MI->getOperand(3).getImm();
552     // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH
553     if (63-SH == ME) {
554       O << "\tsldi ";
555       printOperand(MI, 0);
556       O << ", ";
557       printOperand(MI, 1);
558       O << ", " << (unsigned int)SH << '\n';
559       return;
560     }
561   }
562
563   if (printInstruction(MI))
564     return; // Printer was automatically generated
565
566   assert(0 && "Unhandled instruction in asm writer!");
567   abort();
568   return;
569 }
570
571 /// runOnMachineFunction - This uses the printMachineInstruction()
572 /// method to print assembly for each instruction.
573 ///
574 bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
575   this->MF = &MF;
576
577   SetupMachineFunction(MF);
578   O << "\n\n";
579
580   // Print out constants referenced by the function
581   EmitConstantPool(MF.getConstantPool());
582
583   // Print out labels for the function.
584   const Function *F = MF.getFunction();
585   SwitchToSection(TAI->SectionForGlobal(F));
586
587   switch (F->getLinkage()) {
588   default: assert(0 && "Unknown linkage type!");
589   case Function::PrivateLinkage:
590   case Function::InternalLinkage:  // Symbols default to internal.
591     break;
592   case Function::ExternalLinkage:
593     O << "\t.global\t" << CurrentFnName << '\n'
594       << "\t.type\t" << CurrentFnName << ", @function\n";
595     break;
596   case Function::WeakAnyLinkage:
597   case Function::WeakODRLinkage:
598   case Function::LinkOnceAnyLinkage:
599   case Function::LinkOnceODRLinkage:
600     O << "\t.global\t" << CurrentFnName << '\n';
601     O << "\t.weak\t" << CurrentFnName << '\n';
602     break;
603   }
604
605   printVisibility(CurrentFnName, F->getVisibility());
606
607   EmitAlignment(2, F);
608   O << CurrentFnName << ":\n";
609
610   // Emit pre-function debug information.
611   DW->BeginFunction(&MF);
612
613   // Print out code for the function.
614   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
615        I != E; ++I) {
616     // Print a label for the basic block.
617     if (I != MF.begin()) {
618       printBasicBlockLabel(I, true, true);
619       O << '\n';
620     }
621     for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
622          II != E; ++II) {
623       // Print the assembly for the instruction.
624       printMachineInstruction(II);
625     }
626   }
627
628   O << "\t.size\t" << CurrentFnName << ",.-" << CurrentFnName << '\n';
629
630   // Print out jump tables referenced by the function.
631   EmitJumpTableInfo(MF.getJumpTableInfo(), MF);
632
633   SwitchToSection(TAI->SectionForGlobal(F));
634
635   // Emit post-function debug information.
636   DW->EndFunction(&MF);
637
638   O.flush();
639
640   // We didn't modify anything.
641   return false;
642 }
643
644 bool PPCLinuxAsmPrinter::doInitialization(Module &M) {
645   bool Result = AsmPrinter::doInitialization(M);
646
647   // Emit initial debug information.
648   MMI = getAnalysisIfAvailable<MachineModuleInfo>();
649   assert(MMI);
650   DW = getAnalysisIfAvailable<DwarfWriter>();
651   assert(DW && "DwarfWriter is not available");
652   DW->BeginModule(&M, MMI, O, this, TAI);
653
654   // GNU as handles section names wrapped in quotes
655   Mang->setUseQuotes(true);
656
657   SwitchToSection(TAI->getTextSection());
658
659   return Result;
660 }
661
662 /// PrintUnmangledNameSafely - Print out the printable characters in the name.
663 /// Don't print things like \\n or \\0.
664 static void PrintUnmangledNameSafely(const Value *V, raw_ostream &OS) {
665   for (const char *Name = V->getNameStart(), *E = Name+V->getNameLen();
666        Name != E; ++Name)
667     if (isprint(*Name))
668       OS << *Name;
669 }
670
671 void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
672   const TargetData *TD = TM.getTargetData();
673
674   if (!GVar->hasInitializer())
675     return;   // External global require no code
676
677   // Check to see if this is a special global used by LLVM, if so, emit it.
678   if (EmitSpecialLLVMGlobal(GVar))
679     return;
680
681   std::string name = Mang->getValueName(GVar);
682
683   printVisibility(name, GVar->getVisibility());
684
685   Constant *C = GVar->getInitializer();
686   const Type *Type = C->getType();
687   unsigned Size = TD->getTypePaddedSize(Type);
688   unsigned Align = TD->getPreferredAlignmentLog(GVar);
689
690   SwitchToSection(TAI->SectionForGlobal(GVar));
691
692   if (C->isNullValue() && /* FIXME: Verify correct */
693       !GVar->hasSection() &&
694       (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
695        GVar->isWeakForLinker())) {
696       if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
697
698       if (GVar->hasExternalLinkage()) {
699         O << "\t.global " << name << '\n';
700         O << "\t.type " << name << ", @object\n";
701         O << name << ":\n";
702         O << "\t.zero " << Size << '\n';
703       } else if (GVar->hasLocalLinkage()) {
704         O << TAI->getLCOMMDirective() << name << ',' << Size;
705       } else {
706         O << ".comm " << name << ',' << Size;
707       }
708       if (VerboseAsm) {
709         O << "\t\t" << TAI->getCommentString() << " '";
710         PrintUnmangledNameSafely(GVar, O);
711         O << "'";
712       }
713       O << '\n';
714       return;
715   }
716
717   switch (GVar->getLinkage()) {
718    case GlobalValue::LinkOnceAnyLinkage:
719    case GlobalValue::LinkOnceODRLinkage:
720    case GlobalValue::WeakAnyLinkage:
721    case GlobalValue::WeakODRLinkage:
722    case GlobalValue::CommonLinkage:
723     O << "\t.global " << name << '\n'
724       << "\t.type " << name << ", @object\n"
725       << "\t.weak " << name << '\n';
726     break;
727    case GlobalValue::AppendingLinkage:
728     // FIXME: appending linkage variables should go into a section of
729     // their name or something.  For now, just emit them as external.
730    case GlobalValue::ExternalLinkage:
731     // If external or appending, declare as a global symbol
732     O << "\t.global " << name << '\n'
733       << "\t.type " << name << ", @object\n";
734     // FALL THROUGH
735    case GlobalValue::InternalLinkage:
736    case GlobalValue::PrivateLinkage:
737     break;
738    default:
739     cerr << "Unknown linkage type!";
740     abort();
741   }
742
743   EmitAlignment(Align, GVar);
744   O << name << ":";
745   if (VerboseAsm) {
746     O << "\t\t\t\t" << TAI->getCommentString() << " '";
747     PrintUnmangledNameSafely(GVar, O);
748     O << "'";
749   }
750   O << '\n';
751
752   // If the initializer is a extern weak symbol, remember to emit the weak
753   // reference!
754   if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
755     if (GV->hasExternalWeakLinkage())
756       ExtWeakSymbols.insert(GV);
757
758   EmitGlobalConstant(C);
759   O << '\n';
760 }
761
762 bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
763   // Print out module-level global variables here.
764   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
765        I != E; ++I)
766     printModuleLevelGV(I);
767
768   // TODO
769
770   // Emit initial debug information.
771   DW->EndModule();
772
773   return AsmPrinter::doFinalization(M);
774 }
775
776 /// runOnMachineFunction - This uses the printMachineInstruction()
777 /// method to print assembly for each instruction.
778 ///
779 bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
780   this->MF = &MF;
781
782   SetupMachineFunction(MF);
783   O << "\n\n";
784
785   // Print out constants referenced by the function
786   EmitConstantPool(MF.getConstantPool());
787
788   // Print out labels for the function.
789   const Function *F = MF.getFunction();
790   SwitchToSection(TAI->SectionForGlobal(F));
791
792   switch (F->getLinkage()) {
793   default: assert(0 && "Unknown linkage type!");
794   case Function::PrivateLinkage:
795   case Function::InternalLinkage:  // Symbols default to internal.
796     break;
797   case Function::ExternalLinkage:
798     O << "\t.globl\t" << CurrentFnName << '\n';
799     break;
800   case Function::WeakAnyLinkage:
801   case Function::WeakODRLinkage:
802   case Function::LinkOnceAnyLinkage:
803   case Function::LinkOnceODRLinkage:
804     O << "\t.globl\t" << CurrentFnName << '\n';
805     O << "\t.weak_definition\t" << CurrentFnName << '\n';
806     break;
807   }
808
809   printVisibility(CurrentFnName, F->getVisibility());
810
811   EmitAlignment(F->hasFnAttr(Attribute::OptimizeForSize) ? 2 : 4, F);
812   O << CurrentFnName << ":\n";
813
814   // Emit pre-function debug information.
815   DW->BeginFunction(&MF);
816
817   // If the function is empty, then we need to emit *something*. Otherwise, the
818   // function's label might be associated with something that it wasn't meant to
819   // be associated with. We emit a noop in this situation.
820   MachineFunction::iterator I = MF.begin();
821
822   if (++I == MF.end() && MF.front().empty())
823     O << "\tnop\n";
824
825   // Print out code for the function.
826   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
827        I != E; ++I) {
828     // Print a label for the basic block.
829     if (I != MF.begin()) {
830       printBasicBlockLabel(I, true, true, VerboseAsm);
831       O << '\n';
832     }
833     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
834          II != IE; ++II) {
835       // Print the assembly for the instruction.
836       printMachineInstruction(II);
837     }
838   }
839
840   // Print out jump tables referenced by the function.
841   EmitJumpTableInfo(MF.getJumpTableInfo(), MF);
842
843   // Emit post-function debug information.
844   DW->EndFunction(&MF);
845
846   // We didn't modify anything.
847   return false;
848 }
849
850
851 bool PPCDarwinAsmPrinter::doInitialization(Module &M) {
852   static const char *const CPUDirectives[] = {
853     "",
854     "ppc",
855     "ppc601",
856     "ppc602",
857     "ppc603",
858     "ppc7400",
859     "ppc750",
860     "ppc970",
861     "ppc64"
862   };
863
864   unsigned Directive = Subtarget.getDarwinDirective();
865   if (Subtarget.isGigaProcessor() && Directive < PPC::DIR_970)
866     Directive = PPC::DIR_970;
867   if (Subtarget.hasAltivec() && Directive < PPC::DIR_7400)
868     Directive = PPC::DIR_7400;
869   if (Subtarget.isPPC64() && Directive < PPC::DIR_970)
870     Directive = PPC::DIR_64;
871   assert(Directive <= PPC::DIR_64 && "Directive out of range.");
872   O << "\t.machine " << CPUDirectives[Directive] << '\n';
873
874   bool Result = AsmPrinter::doInitialization(M);
875
876   // Emit initial debug information.
877   // We need this for Personality functions.
878   // AsmPrinter::doInitialization should have done this analysis.
879   MMI = getAnalysisIfAvailable<MachineModuleInfo>();
880   assert(MMI);
881   DW = getAnalysisIfAvailable<DwarfWriter>();
882   assert(DW && "DwarfWriter is not available");
883   DW->BeginModule(&M, MMI, O, this, TAI);
884
885   // Darwin wants symbols to be quoted if they have complex names.
886   Mang->setUseQuotes(true);
887
888   // Prime text sections so they are adjacent.  This reduces the likelihood a
889   // large data or debug section causes a branch to exceed 16M limit.
890   SwitchToTextSection("\t.section __TEXT,__textcoal_nt,coalesced,"
891                       "pure_instructions");
892   if (TM.getRelocationModel() == Reloc::PIC_) {
893     SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs,"
894                           "pure_instructions,32");
895   } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) {
896     SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
897                         "pure_instructions,16");
898   }
899   SwitchToSection(TAI->getTextSection());
900
901   return Result;
902 }
903
904 void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
905   const TargetData *TD = TM.getTargetData();
906
907   if (!GVar->hasInitializer())
908     return;   // External global require no code
909
910   // Check to see if this is a special global used by LLVM, if so, emit it.
911   if (EmitSpecialLLVMGlobal(GVar)) {
912     if (TM.getRelocationModel() == Reloc::Static) {
913       if (GVar->getName() == "llvm.global_ctors")
914         O << ".reference .constructors_used\n";
915       else if (GVar->getName() == "llvm.global_dtors")
916         O << ".reference .destructors_used\n";
917     }
918     return;
919   }
920
921   std::string name = Mang->getValueName(GVar);
922
923   printVisibility(name, GVar->getVisibility());
924
925   Constant *C = GVar->getInitializer();
926   const Type *Type = C->getType();
927   unsigned Size = TD->getTypePaddedSize(Type);
928   unsigned Align = TD->getPreferredAlignmentLog(GVar);
929
930   SwitchToSection(TAI->SectionForGlobal(GVar));
931
932   if (C->isNullValue() && /* FIXME: Verify correct */
933       !GVar->hasSection() &&
934       (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
935        GVar->isWeakForLinker()) &&
936       TAI->SectionKindForGlobal(GVar) != SectionKind::RODataMergeStr) {
937     if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
938
939     if (GVar->hasExternalLinkage()) {
940       O << "\t.globl " << name << '\n';
941       O << "\t.zerofill __DATA, __common, " << name << ", "
942         << Size << ", " << Align;
943     } else if (GVar->hasLocalLinkage()) {
944       O << TAI->getLCOMMDirective() << name << ',' << Size << ',' << Align;
945     } else if (!GVar->hasCommonLinkage()) {
946       O << "\t.globl " << name << '\n'
947         << TAI->getWeakDefDirective() << name << '\n';
948       EmitAlignment(Align, GVar);
949       O << name << ":";
950       if (VerboseAsm) {
951         O << "\t\t\t\t" << TAI->getCommentString() << " ";
952         PrintUnmangledNameSafely(GVar, O);
953       }
954       O << '\n';
955       EmitGlobalConstant(C);
956       return;
957     } else {
958       O << ".comm " << name << ',' << Size;
959       // Darwin 9 and above support aligned common data.
960       if (Subtarget.isDarwin9())
961         O << ',' << Align;
962     }
963     if (VerboseAsm) {
964       O << "\t\t" << TAI->getCommentString() << " '";
965       PrintUnmangledNameSafely(GVar, O);
966       O << "'";
967     }
968     O << '\n';
969     return;
970   }
971
972   switch (GVar->getLinkage()) {
973    case GlobalValue::LinkOnceAnyLinkage:
974    case GlobalValue::LinkOnceODRLinkage:
975    case GlobalValue::WeakAnyLinkage:
976    case GlobalValue::WeakODRLinkage:
977    case GlobalValue::CommonLinkage:
978     O << "\t.globl " << name << '\n'
979       << "\t.weak_definition " << name << '\n';
980     break;
981    case GlobalValue::AppendingLinkage:
982     // FIXME: appending linkage variables should go into a section of
983     // their name or something.  For now, just emit them as external.
984    case GlobalValue::ExternalLinkage:
985     // If external or appending, declare as a global symbol
986     O << "\t.globl " << name << '\n';
987     // FALL THROUGH
988    case GlobalValue::InternalLinkage:
989    case GlobalValue::PrivateLinkage:
990     break;
991    default:
992     cerr << "Unknown linkage type!";
993     abort();
994   }
995
996   EmitAlignment(Align, GVar);
997   O << name << ":";
998   if (VerboseAsm) {
999     O << "\t\t\t\t" << TAI->getCommentString() << " '";
1000     PrintUnmangledNameSafely(GVar, O);
1001     O << "'";
1002   }
1003   O << '\n';
1004
1005   // If the initializer is a extern weak symbol, remember to emit the weak
1006   // reference!
1007   if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
1008     if (GV->hasExternalWeakLinkage())
1009       ExtWeakSymbols.insert(GV);
1010
1011   EmitGlobalConstant(C);
1012   O << '\n';
1013 }
1014
1015 bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
1016   const TargetData *TD = TM.getTargetData();
1017
1018   // Print out module-level global variables here.
1019   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
1020        I != E; ++I)
1021     printModuleLevelGV(I);
1022
1023   bool isPPC64 = TD->getPointerSizeInBits() == 64;
1024
1025   // Output stubs for dynamically-linked functions
1026   if (TM.getRelocationModel() == Reloc::PIC_) {
1027     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
1028          i != e; ++i) {
1029       SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs,"
1030                           "pure_instructions,32");
1031       EmitAlignment(4);
1032       const char *p = i->getKeyData();
1033       bool hasQuote = p[0]=='\"';
1034       printSuffixedName(p, "$stub");
1035       O << ":\n";
1036       O << "\t.indirect_symbol " << p << '\n';
1037       O << "\tmflr r0\n";
1038       O << "\tbcl 20,31,";
1039       if (hasQuote)
1040         O << "\"L0$" << &p[1];
1041       else
1042         O << "L0$" << p;
1043       O << '\n';
1044       if (hasQuote)
1045         O << "\"L0$" << &p[1];
1046       else
1047         O << "L0$" << p;
1048       O << ":\n";
1049       O << "\tmflr r11\n";
1050       O << "\taddis r11,r11,ha16(";
1051       printSuffixedName(p, "$lazy_ptr");
1052       O << "-";
1053       if (hasQuote)
1054         O << "\"L0$" << &p[1];
1055       else
1056         O << "L0$" << p;
1057       O << ")\n";
1058       O << "\tmtlr r0\n";
1059       if (isPPC64)
1060         O << "\tldu r12,lo16(";
1061       else
1062         O << "\tlwzu r12,lo16(";
1063       printSuffixedName(p, "$lazy_ptr");
1064       O << "-";
1065       if (hasQuote)
1066         O << "\"L0$" << &p[1];
1067       else
1068         O << "L0$" << p;
1069       O << ")(r11)\n";
1070       O << "\tmtctr r12\n";
1071       O << "\tbctr\n";
1072       SwitchToDataSection(".lazy_symbol_pointer");
1073       printSuffixedName(p, "$lazy_ptr");
1074       O << ":\n";
1075       O << "\t.indirect_symbol " << p << '\n';
1076       if (isPPC64)
1077         O << "\t.quad dyld_stub_binding_helper\n";
1078       else
1079         O << "\t.long dyld_stub_binding_helper\n";
1080     }
1081   } else {
1082     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
1083          i != e; ++i) {
1084       SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
1085                           "pure_instructions,16");
1086       EmitAlignment(4);
1087       const char *p = i->getKeyData();
1088       printSuffixedName(p, "$stub");
1089       O << ":\n";
1090       O << "\t.indirect_symbol " << p << '\n';
1091       O << "\tlis r11,ha16(";
1092       printSuffixedName(p, "$lazy_ptr");
1093       O << ")\n";
1094       if (isPPC64)
1095         O << "\tldu r12,lo16(";
1096       else
1097         O << "\tlwzu r12,lo16(";
1098       printSuffixedName(p, "$lazy_ptr");
1099       O << ")(r11)\n";
1100       O << "\tmtctr r12\n";
1101       O << "\tbctr\n";
1102       SwitchToDataSection(".lazy_symbol_pointer");
1103       printSuffixedName(p, "$lazy_ptr");
1104       O << ":\n";
1105       O << "\t.indirect_symbol " << p << '\n';
1106       if (isPPC64)
1107         O << "\t.quad dyld_stub_binding_helper\n";
1108       else
1109         O << "\t.long dyld_stub_binding_helper\n";
1110     }
1111   }
1112
1113   O << '\n';
1114
1115   if (TAI->doesSupportExceptionHandling() && MMI) {
1116     // Add the (possibly multiple) personalities to the set of global values.
1117     // Only referenced functions get into the Personalities list.
1118     const std::vector<Function *>& Personalities = MMI->getPersonalities();
1119
1120     for (std::vector<Function *>::const_iterator I = Personalities.begin(),
1121            E = Personalities.end(); I != E; ++I)
1122       if (*I) GVStubs.insert("_" + (*I)->getName());
1123   }
1124
1125   // Output stubs for external and common global variables.
1126   if (!GVStubs.empty()) {
1127     SwitchToDataSection(".non_lazy_symbol_pointer");
1128     for (StringSet<>::iterator i = GVStubs.begin(), e = GVStubs.end();
1129          i != e; ++i) {
1130       std::string p = i->getKeyData();
1131       printSuffixedName(p, "$non_lazy_ptr");
1132       O << ":\n";
1133       O << "\t.indirect_symbol " << p << '\n';
1134       if (isPPC64)
1135         O << "\t.quad\t0\n";
1136       else
1137         O << "\t.long\t0\n";
1138     }
1139   }
1140
1141   if (!HiddenGVStubs.empty()) {
1142     SwitchToSection(TAI->getDataSection());
1143     for (StringSet<>::iterator i = HiddenGVStubs.begin(), e = HiddenGVStubs.end();
1144          i != e; ++i) {
1145       std::string p = i->getKeyData();
1146       EmitAlignment(isPPC64 ? 3 : 2);
1147       printSuffixedName(p, "$non_lazy_ptr");
1148       O << ":\n";
1149       if (isPPC64)
1150         O << "\t.quad\t";
1151       else
1152         O << "\t.long\t";
1153       O << p << '\n';
1154     }
1155   }
1156
1157
1158   // Emit initial debug information.
1159   DW->EndModule();
1160
1161   // Funny Darwin hack: This flag tells the linker that no global symbols
1162   // contain code that falls through to other global symbols (e.g. the obvious
1163   // implementation of multiple entry points).  If this doesn't occur, the
1164   // linker can safely perform dead code stripping.  Since LLVM never generates
1165   // code that does this, it is always safe to set.
1166   O << "\t.subsections_via_symbols\n";
1167
1168   return AsmPrinter::doFinalization(M);
1169 }
1170
1171
1172
1173 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
1174 /// for a MachineFunction to the given output stream, in a format that the
1175 /// Darwin assembler can deal with.
1176 ///
1177 FunctionPass *llvm::createPPCAsmPrinterPass(raw_ostream &o,
1178                                             PPCTargetMachine &tm,
1179                                             unsigned OptLevel, bool verbose) {
1180   const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>();
1181
1182   if (Subtarget->isDarwin()) {
1183     return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo(),
1184                                    OptLevel, verbose);
1185   } else {
1186     return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(),
1187                                   OptLevel, verbose);
1188   }
1189 }
1190
1191 namespace {
1192   static struct Register {
1193     Register() {
1194       PPCTargetMachine::registerAsmPrinter(createPPCAsmPrinterPass);
1195     }
1196   } Registrator;
1197 }
1198
1199 extern "C" int PowerPCAsmPrinterForceLink;
1200 int PowerPCAsmPrinterForceLink = 0;