1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly --------=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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'.
14 // Documentation at http://developer.apple.com/documentation/DeveloperTools/
15 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
17 //===----------------------------------------------------------------------===//
19 #define DEBUG_TYPE "asmprinter"
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"
49 STATISTIC(EmittedInsts
, "Number of machine instrs printed");
52 class VISIBILITY_HIDDEN PPCAsmPrinter
: public AsmPrinter
{
54 StringSet
<> FnStubs
, GVStubs
, HiddenGVStubs
;
55 const PPCSubtarget
&Subtarget
;
57 PPCAsmPrinter(raw_ostream
&O
, TargetMachine
&TM
,
58 const TargetAsmInfo
*T
, bool F
, bool V
)
59 : AsmPrinter(O
, TM
, T
, F
, V
),
60 Subtarget(TM
.getSubtarget
<PPCSubtarget
>()) {}
62 virtual const char *getPassName() const {
63 return "PowerPC Assembly Printer";
66 PPCTargetMachine
&getTM() {
67 return static_cast<PPCTargetMachine
&>(TM
);
70 unsigned enumRegToMachineReg(unsigned 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;
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
89 bool printInstruction(const MachineInstr
*MI
);
91 void printMachineInstruction(const MachineInstr
*MI
);
92 void printOp(const MachineOperand
&MO
);
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
) {
100 case 'v': return RegName
+ 1;
101 case 'c': if (RegName
[1] == 'r') return RegName
+ 2;
107 /// printRegister - Print register according to target requirements.
109 void printRegister(const MachineOperand
&MO
, bool R0AsZero
) {
110 unsigned RegNo
= MO
.getReg();
111 assert(TargetRegisterInfo::isPhysicalRegister(RegNo
) && "Not physreg??");
113 // If we should use 0 for R0.
114 if (R0AsZero
&& RegNo
== PPC::R0
) {
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
);
126 void printOperand(const MachineInstr
*MI
, unsigned OpNo
) {
127 const MachineOperand
&MO
= MI
->getOperand(OpNo
);
129 printRegister(MO
, false);
130 } else if (MO
.isImm()) {
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
);
143 void printS5ImmOperand(const MachineInstr
*MI
, unsigned OpNo
) {
144 char value
= MI
->getOperand(OpNo
).getImm();
145 value
= (value
<< (32-5)) >> (32-5);
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
;
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
;
158 void printS16ImmOperand(const MachineInstr
*MI
, unsigned OpNo
) {
159 O
<< (short)MI
->getOperand(OpNo
).getImm();
161 void printU16ImmOperand(const MachineInstr
*MI
, unsigned OpNo
) {
162 O
<< (unsigned short)MI
->getOperand(OpNo
).getImm();
164 void printS16X4ImmOperand(const MachineInstr
*MI
, unsigned OpNo
) {
165 if (MI
->getOperand(OpNo
).isImm()) {
166 O
<< (short)(MI
->getOperand(OpNo
).getImm()*4);
169 printOp(MI
->getOperand(OpNo
));
170 if (TM
.getRelocationModel() == Reloc::PIC_
)
171 O
<< "-\"L" << getFunctionNumber() << "$pb\")";
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;
182 printOp(MI
->getOperand(OpNo
));
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
);
201 if (MO
.getType() == MachineOperand::MO_ExternalSymbol
) {
202 std::string
Name(TAI
->getGlobalPrefix()); Name
+= MO
.getSymbolName();
203 FnStubs
.insert(Name
);
204 printSuffixedName(Name
, "$stub");
209 printOp(MI
->getOperand(OpNo
));
211 void printAbsAddrOperand(const MachineInstr
*MI
, unsigned OpNo
) {
212 O
<< (int)MI
->getOperand(OpNo
).getImm()*4;
214 void printPICLabel(const MachineInstr
*MI
, unsigned OpNo
) {
215 O
<< "\"L" << getFunctionNumber() << "$pb\"\n";
216 O
<< "\"L" << getFunctionNumber() << "$pb\":";
218 void printSymbolHi(const MachineInstr
*MI
, unsigned OpNo
) {
219 if (MI
->getOperand(OpNo
).isImm()) {
220 printS16ImmOperand(MI
, OpNo
);
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())
232 void printSymbolLo(const MachineInstr
*MI
, unsigned OpNo
) {
233 if (MI
->getOperand(OpNo
).isImm()) {
234 printS16ImmOperand(MI
, OpNo
);
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())
246 void printcrbitm(const MachineInstr
*MI
, unsigned OpNo
) {
247 unsigned CCReg
= MI
->getOperand(OpNo
).getReg();
248 unsigned RegNo
= enumRegToMachineReg(CCReg
);
249 O
<< (0x80 >> RegNo
);
251 // The new addressing mode printers.
252 void printMemRegImm(const MachineInstr
*MI
, unsigned OpNo
) {
253 printSymbolLo(MI
, OpNo
);
255 if (MI
->getOperand(OpNo
+1).isReg() &&
256 MI
->getOperand(OpNo
+1).getReg() == PPC::R0
)
259 printOperand(MI
, OpNo
+1);
262 void printMemRegImmShifted(const MachineInstr
*MI
, unsigned OpNo
) {
263 if (MI
->getOperand(OpNo
).isImm())
264 printS16X4ImmOperand(MI
, OpNo
);
266 printSymbolLo(MI
, OpNo
);
268 if (MI
->getOperand(OpNo
+1).isReg() &&
269 MI
->getOperand(OpNo
+1).getReg() == PPC::R0
)
272 printOperand(MI
, OpNo
+1);
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);
283 printOperand(MI
, OpNo
+1);
286 void printPredicateOperand(const MachineInstr
*MI
, unsigned OpNo
,
287 const char *Modifier
);
289 virtual bool runOnMachineFunction(MachineFunction
&F
) = 0;
290 virtual bool doFinalization(Module
&M
) = 0;
292 virtual void EmitExternalGlobal(const GlobalVariable
*GV
);
295 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
296 class VISIBILITY_HIDDEN PPCLinuxAsmPrinter
: public PPCAsmPrinter
{
298 MachineModuleInfo
*MMI
;
300 PPCLinuxAsmPrinter(raw_ostream
&O
, PPCTargetMachine
&TM
,
301 const TargetAsmInfo
*T
, bool F
, bool V
)
302 : PPCAsmPrinter(O
, TM
, T
, F
, V
), DW(0), MMI(0) {}
304 virtual const char *getPassName() const {
305 return "Linux PPC Assembly Printer";
308 bool runOnMachineFunction(MachineFunction
&F
);
309 bool doInitialization(Module
&M
);
310 bool doFinalization(Module
&M
);
312 void getAnalysisUsage(AnalysisUsage
&AU
) const {
313 AU
.setPreservesAll();
314 AU
.addRequired
<MachineModuleInfo
>();
315 AU
.addRequired
<DwarfWriter
>();
316 PPCAsmPrinter::getAnalysisUsage(AU
);
319 void printModuleLevelGV(const GlobalVariable
* GVar
);
322 /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac
324 class VISIBILITY_HIDDEN PPCDarwinAsmPrinter
: public PPCAsmPrinter
{
326 MachineModuleInfo
*MMI
;
329 PPCDarwinAsmPrinter(raw_ostream
&O
, PPCTargetMachine
&TM
,
330 const TargetAsmInfo
*T
, bool F
, bool V
)
331 : PPCAsmPrinter(O
, TM
, T
, F
, V
), DW(0), MMI(0), OS(O
) {}
333 virtual const char *getPassName() const {
334 return "Darwin PPC Assembly Printer";
337 bool runOnMachineFunction(MachineFunction
&F
);
338 bool doInitialization(Module
&M
);
339 bool doFinalization(Module
&M
);
341 void getAnalysisUsage(AnalysisUsage
&AU
) const {
342 AU
.setPreservesAll();
343 AU
.addRequired
<MachineModuleInfo
>();
344 AU
.addRequired
<DwarfWriter
>();
345 PPCAsmPrinter::getAnalysisUsage(AU
);
348 void printModuleLevelGV(const GlobalVariable
* GVar
);
350 } // end of anonymous namespace
352 // Include the auto-generated portion of the assembly writer
353 #include "PPCGenAsmWriter.inc"
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";
362 case MachineOperand::MO_MachineBasicBlock
:
363 printBasicBlockLabel(MO
.getMBB());
365 case MachineOperand::MO_JumpTableIndex
:
366 O
<< TAI
->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
367 << '_' << MO
.getIndex();
368 // FIXME: PIC relocation model
370 case MachineOperand::MO_ConstantPoolIndex
:
371 O
<< TAI
->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
372 << '_' << MO
.getIndex();
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");
382 O
<< TAI
->getGlobalPrefix() << MO
.getSymbolName();
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
);
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())
396 HiddenGVStubs
.insert(Name
);
397 printSuffixedName(Name
, "$non_lazy_ptr");
400 GVStubs
.insert(Name
);
401 printSuffixedName(Name
, "$non_lazy_ptr");
403 if (GV
->hasExternalWeakLinkage())
404 ExtWeakSymbols
.insert(GV
);
410 printOffset(MO
.getOffset());
412 if (GV
->hasExternalWeakLinkage())
413 ExtWeakSymbols
.insert(GV
);
418 O
<< "<unknown operand type: " << MO
.getType() << ">";
423 /// EmitExternalGlobal - In this case we need to use the indirect symbol.
425 void PPCAsmPrinter::EmitExternalGlobal(const GlobalVariable
*GV
) {
427 getGlobalLinkName(GV
, Name
);
428 if (TM
.getRelocationModel() != Reloc::Static
) {
429 if (GV
->hasHiddenVisibility())
430 HiddenGVStubs
.insert(Name
);
432 GVStubs
.insert(Name
);
433 printSuffixedName(Name
, "$non_lazy_ptr");
439 /// PrintAsmOperand - Print out an operand for an inline asm expression.
441 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr
*MI
, unsigned OpNo
,
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.
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
);
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())
460 ++OpNo
; // Return the high-part.
463 // Write 'i' if an integer constant, otherwise nothing. Used to print
465 if (MI
->getOperand(OpNo
).isImm())
471 printOperand(MI
, OpNo
);
475 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr
*MI
, unsigned OpNo
,
477 const char *ExtraCode
) {
478 if (ExtraCode
&& ExtraCode
[0])
479 return true; // Unknown modifier.
480 if (MI
->getOperand(OpNo
).isReg())
481 printMemRegReg(MI
, OpNo
);
483 printMemRegImm(MI
, OpNo
);
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;
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);
514 /// printMachineInstruction -- Print out a single PowerPC MI in Darwin syntax to
515 /// the current output stream.
517 void PPCAsmPrinter::printMachineInstruction(const MachineInstr
*MI
) {
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;
529 if (SH
<= 31 && MB
== (32-SH
) && ME
== 31) {
530 O
<< "\tsrwi "; FoundMnemonic
= true;
537 O
<< ", " << (unsigned int)SH
<< '\n';
540 } else if (MI
->getOpcode() == PPC::OR
|| MI
->getOpcode() == PPC::OR8
) {
541 if (MI
->getOperand(1).getReg() == MI
->getOperand(2).getReg()) {
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
558 O
<< ", " << (unsigned int)SH
<< '\n';
563 if (printInstruction(MI
))
564 return; // Printer was automatically generated
566 assert(0 && "Unhandled instruction in asm writer!");
571 /// runOnMachineFunction - This uses the printMachineInstruction()
572 /// method to print assembly for each instruction.
574 bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction
&MF
) {
577 SetupMachineFunction(MF
);
580 // Print out constants referenced by the function
581 EmitConstantPool(MF
.getConstantPool());
583 // Print out labels for the function.
584 const Function
*F
= MF
.getFunction();
585 SwitchToSection(TAI
->SectionForGlobal(F
));
587 switch (F
->getLinkage()) {
588 default: assert(0 && "Unknown linkage type!");
589 case Function::PrivateLinkage
:
590 case Function::InternalLinkage
: // Symbols default to internal.
592 case Function::ExternalLinkage
:
593 O
<< "\t.global\t" << CurrentFnName
<< '\n'
594 << "\t.type\t" << CurrentFnName
<< ", @function\n";
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';
605 printVisibility(CurrentFnName
, F
->getVisibility());
608 O
<< CurrentFnName
<< ":\n";
610 // Emit pre-function debug information.
611 DW
->BeginFunction(&MF
);
613 // Print out code for the function.
614 for (MachineFunction::const_iterator I
= MF
.begin(), E
= MF
.end();
616 // Print a label for the basic block.
617 if (I
!= MF
.begin()) {
618 printBasicBlockLabel(I
, true, true);
621 for (MachineBasicBlock::const_iterator II
= I
->begin(), E
= I
->end();
623 // Print the assembly for the instruction.
624 printMachineInstruction(II
);
628 O
<< "\t.size\t" << CurrentFnName
<< ",.-" << CurrentFnName
<< '\n';
630 // Print out jump tables referenced by the function.
631 EmitJumpTableInfo(MF
.getJumpTableInfo(), MF
);
633 SwitchToSection(TAI
->SectionForGlobal(F
));
635 // Emit post-function debug information.
636 DW
->EndFunction(&MF
);
640 // We didn't modify anything.
644 bool PPCLinuxAsmPrinter::doInitialization(Module
&M
) {
645 bool Result
= AsmPrinter::doInitialization(M
);
647 // Emit initial debug information.
648 MMI
= getAnalysisIfAvailable
<MachineModuleInfo
>();
650 DW
= getAnalysisIfAvailable
<DwarfWriter
>();
651 assert(DW
&& "DwarfWriter is not available");
652 DW
->BeginModule(&M
, MMI
, O
, this, TAI
);
654 // GNU as handles section names wrapped in quotes
655 Mang
->setUseQuotes(true);
657 SwitchToSection(TAI
->getTextSection());
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();
671 void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable
* GVar
) {
672 const TargetData
*TD
= TM
.getTargetData();
674 if (!GVar
->hasInitializer())
675 return; // External global require no code
677 // Check to see if this is a special global used by LLVM, if so, emit it.
678 if (EmitSpecialLLVMGlobal(GVar
))
681 std::string name
= Mang
->getValueName(GVar
);
683 printVisibility(name
, GVar
->getVisibility());
685 Constant
*C
= GVar
->getInitializer();
686 const Type
*Type
= C
->getType();
687 unsigned Size
= TD
->getTypePaddedSize(Type
);
688 unsigned Align
= TD
->getPreferredAlignmentLog(GVar
);
690 SwitchToSection(TAI
->SectionForGlobal(GVar
));
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.
698 if (GVar
->hasExternalLinkage()) {
699 O
<< "\t.global " << name
<< '\n';
700 O
<< "\t.type " << name
<< ", @object\n";
702 O
<< "\t.zero " << Size
<< '\n';
703 } else if (GVar
->hasLocalLinkage()) {
704 O
<< TAI
->getLCOMMDirective() << name
<< ',' << Size
;
706 O
<< ".comm " << name
<< ',' << Size
;
709 O
<< "\t\t" << TAI
->getCommentString() << " '";
710 PrintUnmangledNameSafely(GVar
, O
);
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';
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";
735 case GlobalValue::InternalLinkage
:
736 case GlobalValue::PrivateLinkage
:
739 cerr
<< "Unknown linkage type!";
743 EmitAlignment(Align
, GVar
);
746 O
<< "\t\t\t\t" << TAI
->getCommentString() << " '";
747 PrintUnmangledNameSafely(GVar
, O
);
752 // If the initializer is a extern weak symbol, remember to emit the weak
754 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(C
))
755 if (GV
->hasExternalWeakLinkage())
756 ExtWeakSymbols
.insert(GV
);
758 EmitGlobalConstant(C
);
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();
766 printModuleLevelGV(I
);
770 // Emit initial debug information.
773 return AsmPrinter::doFinalization(M
);
776 /// runOnMachineFunction - This uses the printMachineInstruction()
777 /// method to print assembly for each instruction.
779 bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction
&MF
) {
782 SetupMachineFunction(MF
);
785 // Print out constants referenced by the function
786 EmitConstantPool(MF
.getConstantPool());
788 // Print out labels for the function.
789 const Function
*F
= MF
.getFunction();
790 SwitchToSection(TAI
->SectionForGlobal(F
));
792 switch (F
->getLinkage()) {
793 default: assert(0 && "Unknown linkage type!");
794 case Function::PrivateLinkage
:
795 case Function::InternalLinkage
: // Symbols default to internal.
797 case Function::ExternalLinkage
:
798 O
<< "\t.globl\t" << CurrentFnName
<< '\n';
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';
809 printVisibility(CurrentFnName
, F
->getVisibility());
811 EmitAlignment(F
->hasFnAttr(Attribute::OptimizeForSize
) ? 2 : 4, F
);
812 O
<< CurrentFnName
<< ":\n";
814 // Emit pre-function debug information.
815 DW
->BeginFunction(&MF
);
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();
822 if (++I
== MF
.end() && MF
.front().empty())
825 // Print out code for the function.
826 for (MachineFunction::const_iterator I
= MF
.begin(), E
= MF
.end();
828 // Print a label for the basic block.
829 if (I
!= MF
.begin()) {
830 printBasicBlockLabel(I
, true, true, VerboseAsm
);
833 for (MachineBasicBlock::const_iterator II
= I
->begin(), IE
= I
->end();
835 // Print the assembly for the instruction.
836 printMachineInstruction(II
);
840 // Print out jump tables referenced by the function.
841 EmitJumpTableInfo(MF
.getJumpTableInfo(), MF
);
843 // Emit post-function debug information.
844 DW
->EndFunction(&MF
);
846 // We didn't modify anything.
851 bool PPCDarwinAsmPrinter::doInitialization(Module
&M
) {
852 static const char *const CPUDirectives
[] = {
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';
874 bool Result
= AsmPrinter::doInitialization(M
);
876 // Emit initial debug information.
877 // We need this for Personality functions.
878 // AsmPrinter::doInitialization should have done this analysis.
879 MMI
= getAnalysisIfAvailable
<MachineModuleInfo
>();
881 DW
= getAnalysisIfAvailable
<DwarfWriter
>();
882 assert(DW
&& "DwarfWriter is not available");
883 DW
->BeginModule(&M
, MMI
, O
, this, TAI
);
885 // Darwin wants symbols to be quoted if they have complex names.
886 Mang
->setUseQuotes(true);
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");
899 SwitchToSection(TAI
->getTextSection());
904 void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable
* GVar
) {
905 const TargetData
*TD
= TM
.getTargetData();
907 if (!GVar
->hasInitializer())
908 return; // External global require no code
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";
921 std::string name
= Mang
->getValueName(GVar
);
923 printVisibility(name
, GVar
->getVisibility());
925 Constant
*C
= GVar
->getInitializer();
926 const Type
*Type
= C
->getType();
927 unsigned Size
= TD
->getTypePaddedSize(Type
);
928 unsigned Align
= TD
->getPreferredAlignmentLog(GVar
);
930 SwitchToSection(TAI
->SectionForGlobal(GVar
));
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.
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
);
951 O
<< "\t\t\t\t" << TAI
->getCommentString() << " ";
952 PrintUnmangledNameSafely(GVar
, O
);
955 EmitGlobalConstant(C
);
958 O
<< ".comm " << name
<< ',' << Size
;
959 // Darwin 9 and above support aligned common data.
960 if (Subtarget
.isDarwin9())
964 O
<< "\t\t" << TAI
->getCommentString() << " '";
965 PrintUnmangledNameSafely(GVar
, O
);
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';
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';
988 case GlobalValue::InternalLinkage
:
989 case GlobalValue::PrivateLinkage
:
992 cerr
<< "Unknown linkage type!";
996 EmitAlignment(Align
, GVar
);
999 O
<< "\t\t\t\t" << TAI
->getCommentString() << " '";
1000 PrintUnmangledNameSafely(GVar
, O
);
1005 // If the initializer is a extern weak symbol, remember to emit the weak
1007 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(C
))
1008 if (GV
->hasExternalWeakLinkage())
1009 ExtWeakSymbols
.insert(GV
);
1011 EmitGlobalConstant(C
);
1015 bool PPCDarwinAsmPrinter::doFinalization(Module
&M
) {
1016 const TargetData
*TD
= TM
.getTargetData();
1018 // Print out module-level global variables here.
1019 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
1021 printModuleLevelGV(I
);
1023 bool isPPC64
= TD
->getPointerSizeInBits() == 64;
1025 // Output stubs for dynamically-linked functions
1026 if (TM
.getRelocationModel() == Reloc::PIC_
) {
1027 for (StringSet
<>::iterator i
= FnStubs
.begin(), e
= FnStubs
.end();
1029 SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs,"
1030 "pure_instructions,32");
1032 const char *p
= i
->getKeyData();
1033 bool hasQuote
= p
[0]=='\"';
1034 printSuffixedName(p
, "$stub");
1036 O
<< "\t.indirect_symbol " << p
<< '\n';
1038 O
<< "\tbcl 20,31,";
1040 O
<< "\"L0$" << &p
[1];
1045 O
<< "\"L0$" << &p
[1];
1049 O
<< "\tmflr r11\n";
1050 O
<< "\taddis r11,r11,ha16(";
1051 printSuffixedName(p
, "$lazy_ptr");
1054 O
<< "\"L0$" << &p
[1];
1060 O
<< "\tldu r12,lo16(";
1062 O
<< "\tlwzu r12,lo16(";
1063 printSuffixedName(p
, "$lazy_ptr");
1066 O
<< "\"L0$" << &p
[1];
1070 O
<< "\tmtctr r12\n";
1072 SwitchToDataSection(".lazy_symbol_pointer");
1073 printSuffixedName(p
, "$lazy_ptr");
1075 O
<< "\t.indirect_symbol " << p
<< '\n';
1077 O
<< "\t.quad dyld_stub_binding_helper\n";
1079 O
<< "\t.long dyld_stub_binding_helper\n";
1082 for (StringSet
<>::iterator i
= FnStubs
.begin(), e
= FnStubs
.end();
1084 SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs,"
1085 "pure_instructions,16");
1087 const char *p
= i
->getKeyData();
1088 printSuffixedName(p
, "$stub");
1090 O
<< "\t.indirect_symbol " << p
<< '\n';
1091 O
<< "\tlis r11,ha16(";
1092 printSuffixedName(p
, "$lazy_ptr");
1095 O
<< "\tldu r12,lo16(";
1097 O
<< "\tlwzu r12,lo16(";
1098 printSuffixedName(p
, "$lazy_ptr");
1100 O
<< "\tmtctr r12\n";
1102 SwitchToDataSection(".lazy_symbol_pointer");
1103 printSuffixedName(p
, "$lazy_ptr");
1105 O
<< "\t.indirect_symbol " << p
<< '\n';
1107 O
<< "\t.quad dyld_stub_binding_helper\n";
1109 O
<< "\t.long dyld_stub_binding_helper\n";
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();
1120 for (std::vector
<Function
*>::const_iterator I
= Personalities
.begin(),
1121 E
= Personalities
.end(); I
!= E
; ++I
)
1122 if (*I
) GVStubs
.insert("_" + (*I
)->getName());
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();
1130 std::string p
= i
->getKeyData();
1131 printSuffixedName(p
, "$non_lazy_ptr");
1133 O
<< "\t.indirect_symbol " << p
<< '\n';
1135 O
<< "\t.quad\t0\n";
1137 O
<< "\t.long\t0\n";
1141 if (!HiddenGVStubs
.empty()) {
1142 SwitchToSection(TAI
->getDataSection());
1143 for (StringSet
<>::iterator i
= HiddenGVStubs
.begin(), e
= HiddenGVStubs
.end();
1145 std::string p
= i
->getKeyData();
1146 EmitAlignment(isPPC64
? 3 : 2);
1147 printSuffixedName(p
, "$non_lazy_ptr");
1158 // Emit initial debug information.
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";
1168 return AsmPrinter::doFinalization(M
);
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.
1177 FunctionPass
*llvm::createPPCAsmPrinterPass(raw_ostream
&o
,
1178 PPCTargetMachine
&tm
,
1179 bool fast
, bool verbose
) {
1180 const PPCSubtarget
*Subtarget
= &tm
.getSubtarget
<PPCSubtarget
>();
1182 if (Subtarget
->isDarwin()) {
1183 return new PPCDarwinAsmPrinter(o
, tm
, tm
.getTargetAsmInfo(), fast
, verbose
);
1185 return new PPCLinuxAsmPrinter(o
, tm
, tm
.getTargetAsmInfo(), fast
, verbose
);
1190 static struct Register
{
1192 PPCTargetMachine::registerAsmPrinter(createPPCAsmPrinterPass
);
1197 extern "C" int PowerPCAsmPrinterForceLink
;
1198 int PowerPCAsmPrinterForceLink
= 0;