Emit debug info for data-only files. ARM version.
[oota-llvm.git] / lib / Target / ARM / ARMAsmPrinter.cpp
1 //===-- ARMAsmPrinter.cpp - ARM LLVM assembly writer ----------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains a printer that converts from our internal representation
11 // of machine-dependent LLVM code to GAS-format ARM assembly language.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #define DEBUG_TYPE "asm-printer"
16 #include "ARM.h"
17 #include "ARMTargetMachine.h"
18 #include "ARMAddressingModes.h"
19 #include "ARMConstantPoolValue.h"
20 #include "ARMMachineFunctionInfo.h"
21 #include "llvm/Constants.h"
22 #include "llvm/Module.h"
23 #include "llvm/CodeGen/AsmPrinter.h"
24 #include "llvm/CodeGen/DwarfWriter.h"
25 #include "llvm/CodeGen/MachineModuleInfo.h"
26 #include "llvm/CodeGen/MachineFunctionPass.h"
27 #include "llvm/CodeGen/MachineJumpTableInfo.h"
28 #include "llvm/Target/TargetAsmInfo.h"
29 #include "llvm/Target/TargetData.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/ADT/Statistic.h"
33 #include "llvm/ADT/StringExtras.h"
34 #include "llvm/Support/Compiler.h"
35 #include "llvm/Support/Mangler.h"
36 #include "llvm/Support/MathExtras.h"
37 #include <cctype>
38 using namespace llvm;
39
40 STATISTIC(EmittedInsts, "Number of machine instrs printed");
41
42 namespace {
43   struct VISIBILITY_HIDDEN ARMAsmPrinter : public AsmPrinter {
44     ARMAsmPrinter(std::ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
45       : AsmPrinter(O, TM, T), DW(O, this, T), MMI(NULL), AFI(NULL), 
46         InCPMode(false) {
47       Subtarget = &TM.getSubtarget<ARMSubtarget>();
48     }
49
50     DwarfWriter DW;
51     MachineModuleInfo *MMI;
52
53     /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
54     /// make the right decision when printing asm code for different targets.
55     const ARMSubtarget *Subtarget;
56
57     /// AFI - Keep a pointer to ARMFunctionInfo for the current
58     /// MachineFunction
59     ARMFunctionInfo *AFI;
60
61     /// We name each basic block in a Function with a unique number, so
62     /// that we can consistently refer to them later. This is cleared
63     /// at the beginning of each call to runOnMachineFunction().
64     ///
65     typedef std::map<const Value *, unsigned> ValueMapTy;
66     ValueMapTy NumberForBB;
67
68     /// Keeps the set of GlobalValues that require non-lazy-pointers for
69     /// indirect access.
70     std::set<std::string> GVNonLazyPtrs;
71
72     /// Keeps the set of external function GlobalAddresses that the asm
73     /// printer should generate stubs for.
74     std::set<std::string> FnStubs;
75
76     /// True if asm printer is printing a series of CONSTPOOL_ENTRY.
77     bool InCPMode;
78     
79     virtual const char *getPassName() const {
80       return "ARM Assembly Printer";
81     }
82
83     void printOperand(const MachineInstr *MI, int opNum,
84                       const char *Modifier = 0);
85     void printSOImmOperand(const MachineInstr *MI, int opNum);
86     void printSOImm2PartOperand(const MachineInstr *MI, int opNum);
87     void printSORegOperand(const MachineInstr *MI, int opNum);
88     void printAddrMode2Operand(const MachineInstr *MI, int OpNo);
89     void printAddrMode2OffsetOperand(const MachineInstr *MI, int OpNo);
90     void printAddrMode3Operand(const MachineInstr *MI, int OpNo);
91     void printAddrMode3OffsetOperand(const MachineInstr *MI, int OpNo);
92     void printAddrMode4Operand(const MachineInstr *MI, int OpNo,
93                                const char *Modifier = 0);
94     void printAddrMode5Operand(const MachineInstr *MI, int OpNo,
95                                const char *Modifier = 0);
96     void printAddrModePCOperand(const MachineInstr *MI, int OpNo,
97                                 const char *Modifier = 0);
98     void printThumbAddrModeRROperand(const MachineInstr *MI, int OpNo);
99     void printThumbAddrModeRI5Operand(const MachineInstr *MI, int OpNo,
100                                       unsigned Scale);
101     void printThumbAddrModeS1Operand(const MachineInstr *MI, int OpNo);
102     void printThumbAddrModeS2Operand(const MachineInstr *MI, int OpNo);
103     void printThumbAddrModeS4Operand(const MachineInstr *MI, int OpNo);
104     void printThumbAddrModeSPOperand(const MachineInstr *MI, int OpNo);
105     void printPredicateOperand(const MachineInstr *MI, int opNum);
106     void printSBitModifierOperand(const MachineInstr *MI, int opNum);
107     void printPCLabel(const MachineInstr *MI, int opNum);
108     void printRegisterList(const MachineInstr *MI, int opNum);
109     void printCPInstOperand(const MachineInstr *MI, int opNum,
110                             const char *Modifier);
111     void printJTBlockOperand(const MachineInstr *MI, int opNum);
112
113     virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
114                                  unsigned AsmVariant, const char *ExtraCode);
115
116     bool printInstruction(const MachineInstr *MI);  // autogenerated.
117     void printMachineInstruction(const MachineInstr *MI);
118     bool runOnMachineFunction(MachineFunction &F);
119     bool doInitialization(Module &M);
120     bool doFinalization(Module &M);
121
122     virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
123       printDataDirective(MCPV->getType());
124
125       ARMConstantPoolValue *ACPV = (ARMConstantPoolValue*)MCPV;
126       GlobalValue *GV = ACPV->getGV();
127       std::string Name = GV ? Mang->getValueName(GV) : TAI->getGlobalPrefix();
128       if (!GV)
129         Name += ACPV->getSymbol();
130       if (ACPV->isNonLazyPointer()) {
131         GVNonLazyPtrs.insert(Name);
132         printSuffixedName(Name, "$non_lazy_ptr");
133       } else if (ACPV->isStub()) {
134         FnStubs.insert(Name);
135         printSuffixedName(Name, "$stub");
136       } else
137         O << Name;
138       if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")";
139       if (ACPV->getPCAdjustment() != 0) {
140         O << "-(" << TAI->getPrivateGlobalPrefix() << "PC"
141           << utostr(ACPV->getLabelId())
142           << "+" << (unsigned)ACPV->getPCAdjustment();
143          if (ACPV->mustAddCurrentAddress())
144            O << "-.";
145          O << ")";
146       }
147       O << "\n";
148
149       // If the constant pool value is a extern weak symbol, remember to emit
150       // the weak reference.
151       if (GV && GV->hasExternalWeakLinkage())
152         ExtWeakSymbols.insert(GV);
153     }
154     
155     void getAnalysisUsage(AnalysisUsage &AU) const {
156       AsmPrinter::getAnalysisUsage(AU);
157       AU.setPreservesAll();
158       AU.addRequired<MachineModuleInfo>();
159     }
160   };
161 } // end of anonymous namespace
162
163 #include "ARMGenAsmWriter.inc"
164
165 /// createARMCodePrinterPass - Returns a pass that prints the ARM
166 /// assembly code for a MachineFunction to the given output stream,
167 /// using the given target machine description.  This should work
168 /// regardless of whether the function is in SSA form.
169 ///
170 FunctionPass *llvm::createARMCodePrinterPass(std::ostream &o,
171                                              ARMTargetMachine &tm) {
172   return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo());
173 }
174
175 /// runOnMachineFunction - This uses the printInstruction()
176 /// method to print assembly for each instruction.
177 ///
178 bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
179   AFI = MF.getInfo<ARMFunctionInfo>();
180
181   SetupMachineFunction(MF);
182   O << "\n";
183
184   // NOTE: we don't print out constant pools here, they are handled as
185   // instructions.
186
187   O << "\n";
188   // Print out labels for the function.
189   const Function *F = MF.getFunction();
190   switch (F->getLinkage()) {
191   default: assert(0 && "Unknown linkage type!");
192   case Function::InternalLinkage:
193     SwitchToTextSection("\t.text", F);
194     break;
195   case Function::ExternalLinkage:
196     SwitchToTextSection("\t.text", F);
197     O << "\t.globl\t" << CurrentFnName << "\n";
198     break;
199   case Function::WeakLinkage:
200   case Function::LinkOnceLinkage:
201     if (Subtarget->isTargetDarwin()) {
202       SwitchToTextSection(
203                 ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F);
204       O << "\t.globl\t" << CurrentFnName << "\n";
205       O << "\t.weak_definition\t" << CurrentFnName << "\n";
206     } else {
207       O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
208     }
209     break;
210   }
211
212   const char *VisibilityDirective = NULL;
213   if (F->hasHiddenVisibility())
214     VisibilityDirective = TAI->getHiddenDirective();
215   else if (F->hasProtectedVisibility())
216     VisibilityDirective = TAI->getProtectedDirective();
217
218   if (VisibilityDirective)
219     O << VisibilityDirective << CurrentFnName << "\n";
220
221   if (AFI->isThumbFunction()) {
222     EmitAlignment(1, F, AFI->getAlign());
223     O << "\t.code\t16\n";
224     O << "\t.thumb_func";
225     if (Subtarget->isTargetDarwin())
226       O << "\t" << CurrentFnName;
227     O << "\n";
228     InCPMode = false;
229   } else
230     EmitAlignment(2, F);
231
232   O << CurrentFnName << ":\n";
233   // Emit pre-function debug information.
234   DW.BeginFunction(&MF);
235
236   if (Subtarget->isTargetDarwin()) {
237     // If the function is empty, then we need to emit *something*. Otherwise,
238     // the function's label might be associated with something that it wasn't
239     // meant to be associated with. We emit a noop in this situation.
240     MachineFunction::iterator I = MF.begin();
241
242     if (++I == MF.end() && MF.front().empty())
243       O << "\tnop\n";
244   }
245
246   // Print out code for the function.
247   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
248        I != E; ++I) {
249     // Print a label for the basic block.
250     if (I != MF.begin()) {
251       printBasicBlockLabel(I, true, true);
252       O << '\n';
253     }
254     for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end();
255          II != E; ++II) {
256       // Print the assembly for the instruction.
257       printMachineInstruction(II);
258     }
259   }
260
261   if (TAI->hasDotTypeDotSizeDirective())
262     O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
263
264   // Emit post-function debug information.
265   DW.EndFunction();
266
267   return false;
268 }
269
270 void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
271                                  const char *Modifier) {
272   const MachineOperand &MO = MI->getOperand(opNum);
273   switch (MO.getType()) {
274   case MachineOperand::MO_Register:
275     if (TargetRegisterInfo::isPhysicalRegister(MO.getReg()))
276       O << TM.getRegisterInfo()->get(MO.getReg()).AsmName;
277     else
278       assert(0 && "not implemented");
279     break;
280   case MachineOperand::MO_Immediate: {
281     if (!Modifier || strcmp(Modifier, "no_hash") != 0)
282       O << "#";
283
284     O << (int)MO.getImm();
285     break;
286   }
287   case MachineOperand::MO_MachineBasicBlock:
288     printBasicBlockLabel(MO.getMBB());
289     return;
290   case MachineOperand::MO_GlobalAddress: {
291     bool isCallOp = Modifier && !strcmp(Modifier, "call");
292     GlobalValue *GV = MO.getGlobal();
293     std::string Name = Mang->getValueName(GV);
294     bool isExt = (GV->isDeclaration() || GV->hasWeakLinkage() ||
295                   GV->hasLinkOnceLinkage());
296     if (isExt && isCallOp && Subtarget->isTargetDarwin() &&
297         TM.getRelocationModel() != Reloc::Static) {
298       printSuffixedName(Name, "$stub");
299       FnStubs.insert(Name);
300     } else
301       O << Name;
302     
303     if (MO.getOffset() > 0)
304       O << '+' << MO.getOffset();
305     else if (MO.getOffset() < 0)
306       O << MO.getOffset();
307     
308     if (isCallOp && Subtarget->isTargetELF() &&
309         TM.getRelocationModel() == Reloc::PIC_)
310       O << "(PLT)";
311     if (GV->hasExternalWeakLinkage())
312       ExtWeakSymbols.insert(GV);
313     break;
314   }
315   case MachineOperand::MO_ExternalSymbol: {
316     bool isCallOp = Modifier && !strcmp(Modifier, "call");
317     std::string Name(TAI->getGlobalPrefix());
318     Name += MO.getSymbolName();
319     if (isCallOp && Subtarget->isTargetDarwin() &&
320         TM.getRelocationModel() != Reloc::Static) {
321       printSuffixedName(Name, "$stub");
322       FnStubs.insert(Name);
323     } else
324       O << Name;
325     if (isCallOp && Subtarget->isTargetELF() &&
326         TM.getRelocationModel() == Reloc::PIC_)
327       O << "(PLT)";
328     break;
329   }
330   case MachineOperand::MO_ConstantPoolIndex:
331     O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
332       << '_' << MO.getIndex();
333     break;
334   case MachineOperand::MO_JumpTableIndex:
335     O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
336       << '_' << MO.getIndex();
337     break;
338   default:
339     O << "<unknown operand type>"; abort (); break;
340   }
341 }
342
343 static void printSOImm(std::ostream &O, int64_t V, const TargetAsmInfo *TAI) {
344   assert(V < (1 << 12) && "Not a valid so_imm value!");
345   unsigned Imm = ARM_AM::getSOImmValImm(V);
346   unsigned Rot = ARM_AM::getSOImmValRot(V);
347   
348   // Print low-level immediate formation info, per
349   // A5.1.3: "Data-processing operands - Immediate".
350   if (Rot) {
351     O << "#" << Imm << ", " << Rot;
352     // Pretty printed version.
353     O << ' ' << TAI->getCommentString() << ' ' << (int)ARM_AM::rotr32(Imm, Rot);
354   } else {
355     O << "#" << Imm;
356   }
357 }
358
359 /// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
360 /// immediate in bits 0-7.
361 void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum) {
362   const MachineOperand &MO = MI->getOperand(OpNum);
363   assert(MO.isImmediate() && "Not a valid so_imm value!");
364   printSOImm(O, MO.getImm(), TAI);
365 }
366
367 /// printSOImm2PartOperand - SOImm is broken into two pieces using a mov
368 /// followed by a or to materialize.
369 void ARMAsmPrinter::printSOImm2PartOperand(const MachineInstr *MI, int OpNum) {
370   const MachineOperand &MO = MI->getOperand(OpNum);
371   assert(MO.isImmediate() && "Not a valid so_imm value!");
372   unsigned V1 = ARM_AM::getSOImmTwoPartFirst(MO.getImm());
373   unsigned V2 = ARM_AM::getSOImmTwoPartSecond(MO.getImm());
374   printSOImm(O, ARM_AM::getSOImmVal(V1), TAI);
375   O << "\n\torr";
376   printPredicateOperand(MI, 2);
377   O << " ";
378   printOperand(MI, 0); 
379   O << ", ";
380   printOperand(MI, 0); 
381   O << ", ";
382   printSOImm(O, ARM_AM::getSOImmVal(V2), TAI);
383 }
384
385 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
386 // "Addressing Mode 1 - Data-processing operands" forms.  This includes:
387 //    REG 0   0    - e.g. R5
388 //    REG REG 0,SH_OPC     - e.g. R5, ROR R3
389 //    REG 0   IMM,SH_OPC  - e.g. R5, LSL #3
390 void ARMAsmPrinter::printSORegOperand(const MachineInstr *MI, int Op) {
391   const MachineOperand &MO1 = MI->getOperand(Op);
392   const MachineOperand &MO2 = MI->getOperand(Op+1);
393   const MachineOperand &MO3 = MI->getOperand(Op+2);
394
395   assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg()));
396   O << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
397
398   // Print the shift opc.
399   O << ", "
400     << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm()))
401     << " ";
402
403   if (MO2.getReg()) {
404     assert(TargetRegisterInfo::isPhysicalRegister(MO2.getReg()));
405     O << TM.getRegisterInfo()->get(MO2.getReg()).AsmName;
406     assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
407   } else {
408     O << "#" << ARM_AM::getSORegOffset(MO3.getImm());
409   }
410 }
411
412 void ARMAsmPrinter::printAddrMode2Operand(const MachineInstr *MI, int Op) {
413   const MachineOperand &MO1 = MI->getOperand(Op);
414   const MachineOperand &MO2 = MI->getOperand(Op+1);
415   const MachineOperand &MO3 = MI->getOperand(Op+2);
416
417   if (!MO1.isRegister()) {   // FIXME: This is for CP entries, but isn't right.
418     printOperand(MI, Op);
419     return;
420   }
421
422   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
423
424   if (!MO2.getReg()) {
425     if (ARM_AM::getAM2Offset(MO3.getImm()))  // Don't print +0.
426       O << ", #"
427         << (char)ARM_AM::getAM2Op(MO3.getImm())
428         << ARM_AM::getAM2Offset(MO3.getImm());
429     O << "]";
430     return;
431   }
432
433   O << ", "
434     << (char)ARM_AM::getAM2Op(MO3.getImm())
435     << TM.getRegisterInfo()->get(MO2.getReg()).AsmName;
436   
437   if (unsigned ShImm = ARM_AM::getAM2Offset(MO3.getImm()))
438     O << ", "
439       << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO3.getImm()))
440       << " #" << ShImm;
441   O << "]";
442 }
443
444 void ARMAsmPrinter::printAddrMode2OffsetOperand(const MachineInstr *MI, int Op){
445   const MachineOperand &MO1 = MI->getOperand(Op);
446   const MachineOperand &MO2 = MI->getOperand(Op+1);
447
448   if (!MO1.getReg()) {
449     unsigned ImmOffs = ARM_AM::getAM2Offset(MO2.getImm());
450     assert(ImmOffs && "Malformed indexed load / store!");
451     O << "#"
452       << (char)ARM_AM::getAM2Op(MO2.getImm())
453       << ImmOffs;
454     return;
455   }
456
457   O << (char)ARM_AM::getAM2Op(MO2.getImm())
458     << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
459   
460   if (unsigned ShImm = ARM_AM::getAM2Offset(MO2.getImm()))
461     O << ", "
462       << ARM_AM::getShiftOpcStr(ARM_AM::getAM2ShiftOpc(MO2.getImm()))
463       << " #" << ShImm;
464 }
465
466 void ARMAsmPrinter::printAddrMode3Operand(const MachineInstr *MI, int Op) {
467   const MachineOperand &MO1 = MI->getOperand(Op);
468   const MachineOperand &MO2 = MI->getOperand(Op+1);
469   const MachineOperand &MO3 = MI->getOperand(Op+2);
470   
471   assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg()));
472   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
473
474   if (MO2.getReg()) {
475     O << ", "
476       << (char)ARM_AM::getAM3Op(MO3.getImm())
477       << TM.getRegisterInfo()->get(MO2.getReg()).AsmName
478       << "]";
479     return;
480   }
481   
482   if (unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm()))
483     O << ", #"
484       << (char)ARM_AM::getAM3Op(MO3.getImm())
485       << ImmOffs;
486   O << "]";
487 }
488
489 void ARMAsmPrinter::printAddrMode3OffsetOperand(const MachineInstr *MI, int Op){
490   const MachineOperand &MO1 = MI->getOperand(Op);
491   const MachineOperand &MO2 = MI->getOperand(Op+1);
492
493   if (MO1.getReg()) {
494     O << (char)ARM_AM::getAM3Op(MO2.getImm())
495       << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
496     return;
497   }
498
499   unsigned ImmOffs = ARM_AM::getAM3Offset(MO2.getImm());
500   assert(ImmOffs && "Malformed indexed load / store!");
501   O << "#"
502     << (char)ARM_AM::getAM3Op(MO2.getImm())
503     << ImmOffs;
504 }
505   
506 void ARMAsmPrinter::printAddrMode4Operand(const MachineInstr *MI, int Op,
507                                           const char *Modifier) {
508   const MachineOperand &MO1 = MI->getOperand(Op);
509   const MachineOperand &MO2 = MI->getOperand(Op+1);
510   ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MO2.getImm());
511   if (Modifier && strcmp(Modifier, "submode") == 0) {
512     if (MO1.getReg() == ARM::SP) {
513       bool isLDM = (MI->getOpcode() == ARM::LDM ||
514                     MI->getOpcode() == ARM::LDM_RET);
515       O << ARM_AM::getAMSubModeAltStr(Mode, isLDM);
516     } else
517       O << ARM_AM::getAMSubModeStr(Mode);
518   } else {
519     printOperand(MI, Op);
520     if (ARM_AM::getAM4WBFlag(MO2.getImm()))
521       O << "!";
522   }
523 }
524
525 void ARMAsmPrinter::printAddrMode5Operand(const MachineInstr *MI, int Op,
526                                           const char *Modifier) {
527   const MachineOperand &MO1 = MI->getOperand(Op);
528   const MachineOperand &MO2 = MI->getOperand(Op+1);
529
530   if (!MO1.isRegister()) {   // FIXME: This is for CP entries, but isn't right.
531     printOperand(MI, Op);
532     return;
533   }
534   
535   assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg()));
536
537   if (Modifier && strcmp(Modifier, "submode") == 0) {
538     ARM_AM::AMSubMode Mode = ARM_AM::getAM5SubMode(MO2.getImm());
539     if (MO1.getReg() == ARM::SP) {
540       bool isFLDM = (MI->getOpcode() == ARM::FLDMD ||
541                      MI->getOpcode() == ARM::FLDMS);
542       O << ARM_AM::getAMSubModeAltStr(Mode, isFLDM);
543     } else
544       O << ARM_AM::getAMSubModeStr(Mode);
545     return;
546   } else if (Modifier && strcmp(Modifier, "base") == 0) {
547     // Used for FSTM{D|S} and LSTM{D|S} operations.
548     O << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
549     if (ARM_AM::getAM5WBFlag(MO2.getImm()))
550       O << "!";
551     return;
552   }
553   
554   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
555   
556   if (unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm())) {
557     O << ", #"
558       << (char)ARM_AM::getAM5Op(MO2.getImm())
559       << ImmOffs*4;
560   }
561   O << "]";
562 }
563
564 void ARMAsmPrinter::printAddrModePCOperand(const MachineInstr *MI, int Op,
565                                            const char *Modifier) {
566   if (Modifier && strcmp(Modifier, "label") == 0) {
567     printPCLabel(MI, Op+1);
568     return;
569   }
570
571   const MachineOperand &MO1 = MI->getOperand(Op);
572   assert(TargetRegisterInfo::isPhysicalRegister(MO1.getReg()));
573   O << "[pc, +" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName << "]";
574 }
575
576 void
577 ARMAsmPrinter::printThumbAddrModeRROperand(const MachineInstr *MI, int Op) {
578   const MachineOperand &MO1 = MI->getOperand(Op);
579   const MachineOperand &MO2 = MI->getOperand(Op+1);
580   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
581   O << ", " << TM.getRegisterInfo()->get(MO2.getReg()).AsmName << "]";
582 }
583
584 void
585 ARMAsmPrinter::printThumbAddrModeRI5Operand(const MachineInstr *MI, int Op,
586                                             unsigned Scale) {
587   const MachineOperand &MO1 = MI->getOperand(Op);
588   const MachineOperand &MO2 = MI->getOperand(Op+1);
589   const MachineOperand &MO3 = MI->getOperand(Op+2);
590
591   if (!MO1.isRegister()) {   // FIXME: This is for CP entries, but isn't right.
592     printOperand(MI, Op);
593     return;
594   }
595
596   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
597   if (MO3.getReg())
598     O << ", " << TM.getRegisterInfo()->get(MO3.getReg()).AsmName;
599   else if (unsigned ImmOffs = MO2.getImm()) {
600     O << ", #" << ImmOffs;
601     if (Scale > 1)
602       O << " * " << Scale;
603   }
604   O << "]";
605 }
606
607 void
608 ARMAsmPrinter::printThumbAddrModeS1Operand(const MachineInstr *MI, int Op) {
609   printThumbAddrModeRI5Operand(MI, Op, 1);
610 }
611 void
612 ARMAsmPrinter::printThumbAddrModeS2Operand(const MachineInstr *MI, int Op) {
613   printThumbAddrModeRI5Operand(MI, Op, 2);
614 }
615 void
616 ARMAsmPrinter::printThumbAddrModeS4Operand(const MachineInstr *MI, int Op) {
617   printThumbAddrModeRI5Operand(MI, Op, 4);
618 }
619
620 void ARMAsmPrinter::printThumbAddrModeSPOperand(const MachineInstr *MI,int Op) {
621   const MachineOperand &MO1 = MI->getOperand(Op);
622   const MachineOperand &MO2 = MI->getOperand(Op+1);
623   O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
624   if (unsigned ImmOffs = MO2.getImm())
625     O << ", #" << ImmOffs << " * 4";
626   O << "]";
627 }
628
629 void ARMAsmPrinter::printPredicateOperand(const MachineInstr *MI, int opNum) {
630   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(opNum).getImm();
631   if (CC != ARMCC::AL)
632     O << ARMCondCodeToString(CC);
633 }
634
635 void ARMAsmPrinter::printSBitModifierOperand(const MachineInstr *MI, int opNum){
636   unsigned Reg = MI->getOperand(opNum).getReg();
637   if (Reg) {
638     assert(Reg == ARM::CPSR && "Expect ARM CPSR register!");
639     O << 's';
640   }
641 }
642
643 void ARMAsmPrinter::printPCLabel(const MachineInstr *MI, int opNum) {
644   int Id = (int)MI->getOperand(opNum).getImm();
645   O << TAI->getPrivateGlobalPrefix() << "PC" << Id;
646 }
647
648 void ARMAsmPrinter::printRegisterList(const MachineInstr *MI, int opNum) {
649   O << "{";
650   for (unsigned i = opNum, e = MI->getNumOperands(); i != e; ++i) {
651     printOperand(MI, i);
652     if (i != e-1) O << ", ";
653   }
654   O << "}";
655 }
656
657 void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNo,
658                                        const char *Modifier) {
659   assert(Modifier && "This operand only works with a modifier!");
660   // There are two aspects to a CONSTANTPOOL_ENTRY operand, the label and the
661   // data itself.
662   if (!strcmp(Modifier, "label")) {
663     unsigned ID = MI->getOperand(OpNo).getImm();
664     O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
665       << '_' << ID << ":\n";
666   } else {
667     assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE");
668     unsigned CPI = MI->getOperand(OpNo).getIndex();
669
670     const MachineConstantPoolEntry &MCPE =  // Chasing pointers is fun?
671       MI->getParent()->getParent()->getConstantPool()->getConstants()[CPI];
672     
673     if (MCPE.isMachineConstantPoolEntry())
674       EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal);
675     else {
676       EmitGlobalConstant(MCPE.Val.ConstVal);
677       // remember to emit the weak reference
678       if (const GlobalValue *GV = dyn_cast<GlobalValue>(MCPE.Val.ConstVal))
679         if (GV->hasExternalWeakLinkage())
680           ExtWeakSymbols.insert(GV);
681     }
682   }
683 }
684
685 void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNo) {
686   const MachineOperand &MO1 = MI->getOperand(OpNo);
687   const MachineOperand &MO2 = MI->getOperand(OpNo+1); // Unique Id
688   unsigned JTI = MO1.getIndex();
689   O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
690     << '_' << JTI << '_' << MO2.getImm() << ":\n";
691
692   const char *JTEntryDirective = TAI->getJumpTableDirective();
693   if (!JTEntryDirective)
694     JTEntryDirective = TAI->getData32bitsDirective();
695
696   const MachineFunction *MF = MI->getParent()->getParent();
697   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
698   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
699   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
700   bool UseSet= TAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_;
701   std::set<MachineBasicBlock*> JTSets;
702   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
703     MachineBasicBlock *MBB = JTBBs[i];
704     if (UseSet && JTSets.insert(MBB).second)
705       printPICJumpTableSetLabel(JTI, MO2.getImm(), MBB);
706
707     O << JTEntryDirective << ' ';
708     if (UseSet)
709       O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
710         << '_' << JTI << '_' << MO2.getImm()
711         << "_set_" << MBB->getNumber();
712     else if (TM.getRelocationModel() == Reloc::PIC_) {
713       printBasicBlockLabel(MBB, false, false, false);
714       // If the arch uses custom Jump Table directives, don't calc relative to JT
715       if (!TAI->getJumpTableDirective()) 
716         O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
717           << getFunctionNumber() << '_' << JTI << '_' << MO2.getImm();
718     } else
719       printBasicBlockLabel(MBB, false, false, false);
720     if (i != e-1)
721       O << '\n';
722   }
723 }
724
725
726 bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
727                                     unsigned AsmVariant, const char *ExtraCode){
728   // Does this asm operand have a single letter operand modifier?
729   if (ExtraCode && ExtraCode[0]) {
730     if (ExtraCode[1] != 0) return true; // Unknown modifier.
731     
732     switch (ExtraCode[0]) {
733     default: return true;  // Unknown modifier.
734     case 'c': // Don't print "$" before a global var name or constant.
735     case 'P': // Print a VFP double precision register.
736       printOperand(MI, OpNo);
737       return false;
738     case 'Q':
739       if (TM.getTargetData()->isLittleEndian())
740         break;
741       // Fallthrough
742     case 'R':
743       if (TM.getTargetData()->isBigEndian())
744         break;
745       // Fallthrough
746     case 'H': // Write second word of DI / DF reference.  
747       // Verify that this operand has two consecutive registers.
748       if (!MI->getOperand(OpNo).isRegister() ||
749           OpNo+1 == MI->getNumOperands() ||
750           !MI->getOperand(OpNo+1).isRegister())
751         return true;
752       ++OpNo;   // Return the high-part.
753     }
754   }
755   
756   printOperand(MI, OpNo);
757   return false;
758 }
759
760 void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
761   ++EmittedInsts;
762
763   int Opc = MI->getOpcode();
764   switch (Opc) {
765   case ARM::CONSTPOOL_ENTRY:
766     if (!InCPMode && AFI->isThumbFunction()) {
767       EmitAlignment(2);
768       InCPMode = true;
769     }
770     break;
771   default: {
772     if (InCPMode && AFI->isThumbFunction())
773       InCPMode = false;
774     switch (Opc) {
775     case ARM::PICADD:
776     case ARM::PICLD:
777     case ARM::PICLDZH:
778     case ARM::PICLDZB:
779     case ARM::PICLDH:
780     case ARM::PICLDB:
781     case ARM::PICLDSH:
782     case ARM::PICLDSB:
783     case ARM::PICSTR:
784     case ARM::PICSTRH:
785     case ARM::PICSTRB:
786     case ARM::tPICADD:
787       break;
788     default:
789       break;
790     }
791   }}
792
793   // Call the autogenerated instruction printer routines.
794   printInstruction(MI);
795 }
796
797 bool ARMAsmPrinter::doInitialization(Module &M) {
798   // Emit initial debug information.
799   DW.BeginModule(&M);
800   
801   bool Result = AsmPrinter::doInitialization(M);
802
803   // AsmPrinter::doInitialization should have done this analysis.
804   MMI = getAnalysisToUpdate<MachineModuleInfo>();
805   assert(MMI);
806   DW.SetModuleInfo(MMI);
807
808   // Darwin wants symbols to be quoted if they have complex names.
809   if (Subtarget->isTargetDarwin())
810     Mang->setUseQuotes(true);
811
812   return Result;
813 }
814
815 /// PrintUnmangledNameSafely - Print out the printable characters in the name.
816 /// Don't print things like \n or \0.
817 static void PrintUnmangledNameSafely(const Value *V, std::ostream &OS) {
818   for (const char *Name = V->getNameStart(), *E = Name+V->getNameLen();
819        Name != E; ++Name)
820     if (isprint(*Name))
821       OS << *Name;
822 }
823
824 bool ARMAsmPrinter::doFinalization(Module &M) {
825   const TargetData *TD = TM.getTargetData();
826
827   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
828        I != E; ++I) {
829     if (!I->hasInitializer())   // External global require no code
830       continue;
831
832     if (EmitSpecialLLVMGlobal(I)) {
833       if (Subtarget->isTargetDarwin() &&
834           TM.getRelocationModel() == Reloc::Static) {
835         if (I->getName() == "llvm.global_ctors")
836           O << ".reference .constructors_used\n";
837         else if (I->getName() == "llvm.global_dtors")
838           O << ".reference .destructors_used\n";
839       }
840       continue;
841     }
842
843     std::string name = Mang->getValueName(I);
844     Constant *C = I->getInitializer();
845     const Type *Type = C->getType();
846     unsigned Size = TD->getABITypeSize(Type);
847     unsigned Align = TD->getPreferredAlignmentLog(I);
848
849     const char *VisibilityDirective = NULL;
850     if (I->hasHiddenVisibility())
851       VisibilityDirective = TAI->getHiddenDirective();
852     else if (I->hasProtectedVisibility())
853       VisibilityDirective = TAI->getProtectedDirective();
854
855     if (VisibilityDirective)
856       O << VisibilityDirective << name << "\n";
857
858     if (Subtarget->isTargetELF())
859       O << "\t.type " << name << ",%object\n";
860     
861     if (C->isNullValue() && !I->hasSection() && !I->isThreadLocal()) {
862       if (I->hasExternalLinkage()) {
863         if (const char *Directive = TAI->getZeroFillDirective()) {
864           O << "\t.globl\t" << name << "\n";
865           O << Directive << "__DATA, __common, " << name << ", "
866             << Size << ", " << Align << "\n";
867           continue;
868         }
869       }
870
871       if (I->hasInternalLinkage() || I->hasWeakLinkage() ||
872           I->hasLinkOnceLinkage()) {
873         if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
874         if (!NoZerosInBSS && TAI->getBSSSection())
875           SwitchToDataSection(TAI->getBSSSection(), I);
876         else
877           SwitchToDataSection(TAI->getDataSection(), I);
878         if (TAI->getLCOMMDirective() != NULL) {
879           if (I->hasInternalLinkage()) {
880             O << TAI->getLCOMMDirective() << name << "," << Size;
881             if (Subtarget->isTargetDarwin())
882               O << "," << Align;
883           } else
884             O << TAI->getCOMMDirective()  << name << "," << Size;
885         } else {
886           if (I->hasInternalLinkage())
887             O << "\t.local\t" << name << "\n";
888           O << TAI->getCOMMDirective()  << name << "," << Size;
889           if (TAI->getCOMMDirectiveTakesAlignment())
890             O << "," << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
891         }
892         O << "\t\t" << TAI->getCommentString() << " ";
893         PrintUnmangledNameSafely(I, O);
894         O << "\n";
895         continue;
896       }
897     }
898
899     switch (I->getLinkage()) {
900     case GlobalValue::LinkOnceLinkage:
901     case GlobalValue::WeakLinkage:
902       if (Subtarget->isTargetDarwin()) {
903         O << "\t.globl " << name << "\n"
904           << "\t.weak_definition " << name << "\n";
905         SwitchToDataSection("\t.section __DATA,__datacoal_nt,coalesced", I);
906       } else {
907         std::string SectionName("\t.section\t.llvm.linkonce.d." +
908                                 name +
909                                 ",\"aw\",%progbits");
910         SwitchToDataSection(SectionName.c_str(), I);
911         O << "\t.weak " << name << "\n";
912       }
913       break;
914     case GlobalValue::AppendingLinkage:
915       // FIXME: appending linkage variables should go into a section of
916       // their name or something.  For now, just emit them as external.
917     case GlobalValue::ExternalLinkage:
918       O << "\t.globl " << name << "\n";
919       // FALL THROUGH
920     case GlobalValue::InternalLinkage: {
921       if (I->isConstant()) {
922         const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
923         if (TAI->getCStringSection() && CVA && CVA->isCString()) {
924           SwitchToDataSection(TAI->getCStringSection(), I);
925           break;
926         }
927       }
928       // FIXME: special handling for ".ctors" & ".dtors" sections
929       if (I->hasSection() &&
930           (I->getSection() == ".ctors" ||
931            I->getSection() == ".dtors")) {
932         assert(!Subtarget->isTargetDarwin());
933         std::string SectionName = ".section " + I->getSection();
934         SectionName += ",\"aw\",%progbits";
935         SwitchToDataSection(SectionName.c_str());
936       } else if (I->hasSection() && Subtarget->isTargetDarwin()) {
937         // Honor all section names on Darwin; ObjC uses this
938         std::string SectionName = ".section " + I->getSection();
939         SwitchToDataSection(SectionName.c_str());
940       } else {
941         if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection())
942           SwitchToDataSection(I->isThreadLocal() ? TAI->getTLSBSSSection() :
943                               TAI->getBSSSection(), I);
944         else if (!I->isConstant())
945           SwitchToDataSection(I->isThreadLocal() ? TAI->getTLSDataSection() :
946                               TAI->getDataSection(), I);
947         else if (I->isThreadLocal())
948           SwitchToDataSection(TAI->getTLSDataSection());
949         else {
950           // Read-only data.
951           bool HasReloc = C->ContainsRelocations();
952           if (HasReloc &&
953               Subtarget->isTargetDarwin() &&
954               TM.getRelocationModel() != Reloc::Static)
955             SwitchToDataSection("\t.const_data\n");
956           else if (!HasReloc && Size == 4 &&
957                    TAI->getFourByteConstantSection())
958             SwitchToDataSection(TAI->getFourByteConstantSection(), I);
959           else if (!HasReloc && Size == 8 &&
960                    TAI->getEightByteConstantSection())
961             SwitchToDataSection(TAI->getEightByteConstantSection(), I);
962           else if (!HasReloc && Size == 16 &&
963                    TAI->getSixteenByteConstantSection())
964             SwitchToDataSection(TAI->getSixteenByteConstantSection(), I);
965           else if (TAI->getReadOnlySection())
966             SwitchToDataSection(TAI->getReadOnlySection(), I);
967           else
968             SwitchToDataSection(TAI->getDataSection(), I);
969         }
970       }
971
972       break;
973     }
974     default:
975       assert(0 && "Unknown linkage type!");
976       break;
977     }
978
979     EmitAlignment(Align, I);
980     O << name << ":\t\t\t\t" << TAI->getCommentString() << " ";
981     PrintUnmangledNameSafely(I, O);
982     O << "\n";
983     if (TAI->hasDotTypeDotSizeDirective())
984       O << "\t.size " << name << ", " << Size << "\n";
985     // If the initializer is a extern weak symbol, remember to emit the weak
986     // reference!
987     if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
988       if (GV->hasExternalWeakLinkage())
989       ExtWeakSymbols.insert(GV);
990
991     EmitGlobalConstant(C);
992     O << '\n';
993   }
994
995   if (Subtarget->isTargetDarwin()) {
996     SwitchToDataSection("");
997
998     // Output stubs for dynamically-linked functions
999     unsigned j = 1;
1000     for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end();
1001          i != e; ++i, ++j) {
1002       if (TM.getRelocationModel() == Reloc::PIC_)
1003         SwitchToTextSection(".section __TEXT,__picsymbolstub4,symbol_stubs,"
1004                             "none,16", 0);
1005       else
1006         SwitchToTextSection(".section __TEXT,__symbol_stub4,symbol_stubs,"
1007                             "none,12", 0);
1008
1009       EmitAlignment(2);
1010       O << "\t.code\t32\n";
1011
1012       std::string p = *i;
1013       printSuffixedName(p, "$stub");
1014       O << ":\n";
1015       O << "\t.indirect_symbol " << *i << "\n";
1016       O << "\tldr ip, ";
1017       printSuffixedName(p, "$slp");
1018       O << "\n";
1019       if (TM.getRelocationModel() == Reloc::PIC_) {
1020         printSuffixedName(p, "$scv");
1021         O << ":\n";
1022         O << "\tadd ip, pc, ip\n";
1023       }
1024       O << "\tldr pc, [ip, #0]\n";
1025       printSuffixedName(p, "$slp");
1026       O << ":\n";
1027       O << "\t.long\t";
1028       printSuffixedName(p, "$lazy_ptr");
1029       if (TM.getRelocationModel() == Reloc::PIC_) {
1030         O << "-(";
1031         printSuffixedName(p, "$scv");
1032         O << "+8)\n";
1033       } else
1034         O << "\n";
1035       SwitchToDataSection(".lazy_symbol_pointer", 0);
1036       printSuffixedName(p, "$lazy_ptr");
1037       O << ":\n";
1038       O << "\t.indirect_symbol " << *i << "\n";
1039       O << "\t.long\tdyld_stub_binding_helper\n";
1040     }
1041     O << "\n";
1042
1043     // Output non-lazy-pointers for external and common global variables.
1044     if (!GVNonLazyPtrs.empty())
1045       SwitchToDataSection(".non_lazy_symbol_pointer", 0);
1046     for (std::set<std::string>::iterator i = GVNonLazyPtrs.begin(),
1047            e = GVNonLazyPtrs.end(); i != e; ++i) {
1048       std::string p = *i;
1049       printSuffixedName(p, "$non_lazy_ptr");
1050       O << ":\n";
1051       O << "\t.indirect_symbol " << *i << "\n";
1052       O << "\t.long\t0\n";
1053     }
1054
1055     // Emit initial debug information.
1056     DW.EndModule();
1057
1058     // Funny Darwin hack: This flag tells the linker that no global symbols
1059     // contain code that falls through to other global symbols (e.g. the obvious
1060     // implementation of multiple entry points).  If this doesn't occur, the
1061     // linker can safely perform dead code stripping.  Since LLVM never
1062     // generates code that does this, it is always safe to set.
1063     O << "\t.subsections_via_symbols\n";
1064   } else {
1065     // Emit final debug information for ELF.
1066     DW.EndModule();
1067   }
1068
1069   return AsmPrinter::doFinalization(M);
1070 }