[NVPTX] Add GenericToNVVM IR converter to better handle idiomatic LLVM IR inputs
[oota-llvm.git] / lib / Target / NVPTX / NVPTXAsmPrinter.cpp
1 //===-- NVPTXAsmPrinter.cpp - NVPTX 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 NVPTX assembly language.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "NVPTXAsmPrinter.h"
16 #include "MCTargetDesc/NVPTXMCAsmInfo.h"
17 #include "NVPTX.h"
18 #include "NVPTXInstrInfo.h"
19 #include "NVPTXNumRegisters.h"
20 #include "NVPTXRegisterInfo.h"
21 #include "NVPTXTargetMachine.h"
22 #include "NVPTXUtilities.h"
23 #include "cl_common_defines.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/Analysis/ConstantFolding.h"
26 #include "llvm/Assembly/Writer.h"
27 #include "llvm/CodeGen/Analysis.h"
28 #include "llvm/CodeGen/MachineFrameInfo.h"
29 #include "llvm/CodeGen/MachineModuleInfo.h"
30 #include "llvm/CodeGen/MachineRegisterInfo.h"
31 #include "llvm/DebugInfo.h"
32 #include "llvm/IR/DerivedTypes.h"
33 #include "llvm/IR/Function.h"
34 #include "llvm/IR/GlobalVariable.h"
35 #include "llvm/IR/Module.h"
36 #include "llvm/IR/Operator.h"
37 #include "llvm/MC/MCStreamer.h"
38 #include "llvm/MC/MCSymbol.h"
39 #include "llvm/Support/CommandLine.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/FormattedStream.h"
42 #include "llvm/Support/Path.h"
43 #include "llvm/Support/TargetRegistry.h"
44 #include "llvm/Support/TimeValue.h"
45 #include "llvm/Target/Mangler.h"
46 #include "llvm/Target/TargetLoweringObjectFile.h"
47 #include <sstream>
48 using namespace llvm;
49
50 #include "NVPTXGenAsmWriter.inc"
51
52 bool RegAllocNilUsed = true;
53
54 #define DEPOTNAME "__local_depot"
55
56 static cl::opt<bool>
57 EmitLineNumbers("nvptx-emit-line-numbers",
58                 cl::desc("NVPTX Specific: Emit Line numbers even without -G"),
59                 cl::init(true));
60
61 namespace llvm { bool InterleaveSrcInPtx = false; }
62
63 static cl::opt<bool, true>
64 InterleaveSrc("nvptx-emit-src", cl::ZeroOrMore,
65               cl::desc("NVPTX Specific: Emit source line in ptx file"),
66               cl::location(llvm::InterleaveSrcInPtx));
67
68 namespace {
69 /// DiscoverDependentGlobals - Return a set of GlobalVariables on which \p V
70 /// depends.
71 void DiscoverDependentGlobals(const Value *V,
72                               DenseSet<const GlobalVariable *> &Globals) {
73   if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
74     Globals.insert(GV);
75   else {
76     if (const User *U = dyn_cast<User>(V)) {
77       for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) {
78         DiscoverDependentGlobals(U->getOperand(i), Globals);
79       }
80     }
81   }
82 }
83
84 /// VisitGlobalVariableForEmission - Add \p GV to the list of GlobalVariable
85 /// instances to be emitted, but only after any dependents have been added
86 /// first.
87 void VisitGlobalVariableForEmission(
88     const GlobalVariable *GV, SmallVectorImpl<const GlobalVariable *> &Order,
89     DenseSet<const GlobalVariable *> &Visited,
90     DenseSet<const GlobalVariable *> &Visiting) {
91   // Have we already visited this one?
92   if (Visited.count(GV))
93     return;
94
95   // Do we have a circular dependency?
96   if (Visiting.count(GV))
97     report_fatal_error("Circular dependency found in global variable set");
98
99   // Start visiting this global
100   Visiting.insert(GV);
101
102   // Make sure we visit all dependents first
103   DenseSet<const GlobalVariable *> Others;
104   for (unsigned i = 0, e = GV->getNumOperands(); i != e; ++i)
105     DiscoverDependentGlobals(GV->getOperand(i), Others);
106
107   for (DenseSet<const GlobalVariable *>::iterator I = Others.begin(),
108                                                   E = Others.end();
109        I != E; ++I)
110     VisitGlobalVariableForEmission(*I, Order, Visited, Visiting);
111
112   // Now we can visit ourself
113   Order.push_back(GV);
114   Visited.insert(GV);
115   Visiting.erase(GV);
116 }
117 }
118
119 // @TODO: This is a copy from AsmPrinter.cpp.  The function is static, so we
120 // cannot just link to the existing version.
121 /// LowerConstant - Lower the specified LLVM Constant to an MCExpr.
122 ///
123 using namespace nvptx;
124 const MCExpr *nvptx::LowerConstant(const Constant *CV, AsmPrinter &AP) {
125   MCContext &Ctx = AP.OutContext;
126
127   if (CV->isNullValue() || isa<UndefValue>(CV))
128     return MCConstantExpr::Create(0, Ctx);
129
130   if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
131     return MCConstantExpr::Create(CI->getZExtValue(), Ctx);
132
133   if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
134     return MCSymbolRefExpr::Create(AP.Mang->getSymbol(GV), Ctx);
135
136   if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
137     return MCSymbolRefExpr::Create(AP.GetBlockAddressSymbol(BA), Ctx);
138
139   const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
140   if (CE == 0)
141     llvm_unreachable("Unknown constant value to lower!");
142
143   switch (CE->getOpcode()) {
144   default:
145     // If the code isn't optimized, there may be outstanding folding
146     // opportunities. Attempt to fold the expression using DataLayout as a
147     // last resort before giving up.
148     if (Constant *C = ConstantFoldConstantExpression(CE, AP.TM.getDataLayout()))
149       if (C != CE)
150         return LowerConstant(C, AP);
151
152     // Otherwise report the problem to the user.
153     {
154       std::string S;
155       raw_string_ostream OS(S);
156       OS << "Unsupported expression in static initializer: ";
157       WriteAsOperand(OS, CE, /*PrintType=*/ false,
158                      !AP.MF ? 0 : AP.MF->getFunction()->getParent());
159       report_fatal_error(OS.str());
160     }
161   case Instruction::GetElementPtr: {
162     const DataLayout &TD = *AP.TM.getDataLayout();
163     // Generate a symbolic expression for the byte address
164     APInt OffsetAI(TD.getPointerSizeInBits(), 0);
165     cast<GEPOperator>(CE)->accumulateConstantOffset(TD, OffsetAI);
166
167     const MCExpr *Base = LowerConstant(CE->getOperand(0), AP);
168     if (!OffsetAI)
169       return Base;
170
171     int64_t Offset = OffsetAI.getSExtValue();
172     return MCBinaryExpr::CreateAdd(Base, MCConstantExpr::Create(Offset, Ctx),
173                                    Ctx);
174   }
175
176   case Instruction::Trunc:
177     // We emit the value and depend on the assembler to truncate the generated
178     // expression properly.  This is important for differences between
179     // blockaddress labels.  Since the two labels are in the same function, it
180     // is reasonable to treat their delta as a 32-bit value.
181   // FALL THROUGH.
182   case Instruction::BitCast:
183     return LowerConstant(CE->getOperand(0), AP);
184
185   case Instruction::IntToPtr: {
186     const DataLayout &TD = *AP.TM.getDataLayout();
187     // Handle casts to pointers by changing them into casts to the appropriate
188     // integer type.  This promotes constant folding and simplifies this code.
189     Constant *Op = CE->getOperand(0);
190     Op = ConstantExpr::getIntegerCast(Op, TD.getIntPtrType(CV->getContext()),
191                                       false /*ZExt*/);
192     return LowerConstant(Op, AP);
193   }
194
195   case Instruction::PtrToInt: {
196     const DataLayout &TD = *AP.TM.getDataLayout();
197     // Support only foldable casts to/from pointers that can be eliminated by
198     // changing the pointer to the appropriately sized integer type.
199     Constant *Op = CE->getOperand(0);
200     Type *Ty = CE->getType();
201
202     const MCExpr *OpExpr = LowerConstant(Op, AP);
203
204     // We can emit the pointer value into this slot if the slot is an
205     // integer slot equal to the size of the pointer.
206     if (TD.getTypeAllocSize(Ty) == TD.getTypeAllocSize(Op->getType()))
207       return OpExpr;
208
209     // Otherwise the pointer is smaller than the resultant integer, mask off
210     // the high bits so we are sure to get a proper truncation if the input is
211     // a constant expr.
212     unsigned InBits = TD.getTypeAllocSizeInBits(Op->getType());
213     const MCExpr *MaskExpr =
214         MCConstantExpr::Create(~0ULL >> (64 - InBits), Ctx);
215     return MCBinaryExpr::CreateAnd(OpExpr, MaskExpr, Ctx);
216   }
217
218     // The MC library also has a right-shift operator, but it isn't consistently
219   // signed or unsigned between different targets.
220   case Instruction::Add:
221   case Instruction::Sub:
222   case Instruction::Mul:
223   case Instruction::SDiv:
224   case Instruction::SRem:
225   case Instruction::Shl:
226   case Instruction::And:
227   case Instruction::Or:
228   case Instruction::Xor: {
229     const MCExpr *LHS = LowerConstant(CE->getOperand(0), AP);
230     const MCExpr *RHS = LowerConstant(CE->getOperand(1), AP);
231     switch (CE->getOpcode()) {
232     default:
233       llvm_unreachable("Unknown binary operator constant cast expr");
234     case Instruction::Add:
235       return MCBinaryExpr::CreateAdd(LHS, RHS, Ctx);
236     case Instruction::Sub:
237       return MCBinaryExpr::CreateSub(LHS, RHS, Ctx);
238     case Instruction::Mul:
239       return MCBinaryExpr::CreateMul(LHS, RHS, Ctx);
240     case Instruction::SDiv:
241       return MCBinaryExpr::CreateDiv(LHS, RHS, Ctx);
242     case Instruction::SRem:
243       return MCBinaryExpr::CreateMod(LHS, RHS, Ctx);
244     case Instruction::Shl:
245       return MCBinaryExpr::CreateShl(LHS, RHS, Ctx);
246     case Instruction::And:
247       return MCBinaryExpr::CreateAnd(LHS, RHS, Ctx);
248     case Instruction::Or:
249       return MCBinaryExpr::CreateOr(LHS, RHS, Ctx);
250     case Instruction::Xor:
251       return MCBinaryExpr::CreateXor(LHS, RHS, Ctx);
252     }
253   }
254   }
255 }
256
257 void NVPTXAsmPrinter::emitLineNumberAsDotLoc(const MachineInstr &MI) {
258   if (!EmitLineNumbers)
259     return;
260   if (ignoreLoc(MI))
261     return;
262
263   DebugLoc curLoc = MI.getDebugLoc();
264
265   if (prevDebugLoc.isUnknown() && curLoc.isUnknown())
266     return;
267
268   if (prevDebugLoc == curLoc)
269     return;
270
271   prevDebugLoc = curLoc;
272
273   if (curLoc.isUnknown())
274     return;
275
276   const MachineFunction *MF = MI.getParent()->getParent();
277   //const TargetMachine &TM = MF->getTarget();
278
279   const LLVMContext &ctx = MF->getFunction()->getContext();
280   DIScope Scope(curLoc.getScope(ctx));
281
282   if (!Scope.Verify())
283     return;
284
285   StringRef fileName(Scope.getFilename());
286   StringRef dirName(Scope.getDirectory());
287   SmallString<128> FullPathName = dirName;
288   if (!dirName.empty() && !sys::path::is_absolute(fileName)) {
289     sys::path::append(FullPathName, fileName);
290     fileName = FullPathName.str();
291   }
292
293   if (filenameMap.find(fileName.str()) == filenameMap.end())
294     return;
295
296   // Emit the line from the source file.
297   if (llvm::InterleaveSrcInPtx)
298     this->emitSrcInText(fileName.str(), curLoc.getLine());
299
300   std::stringstream temp;
301   temp << "\t.loc " << filenameMap[fileName.str()] << " " << curLoc.getLine()
302        << " " << curLoc.getCol();
303   OutStreamer.EmitRawText(Twine(temp.str().c_str()));
304 }
305
306 void NVPTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
307   SmallString<128> Str;
308   raw_svector_ostream OS(Str);
309   if (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA)
310     emitLineNumberAsDotLoc(*MI);
311   printInstruction(MI, OS);
312   OutStreamer.EmitRawText(OS.str());
313 }
314
315 void NVPTXAsmPrinter::printReturnValStr(const Function *F, raw_ostream &O) {
316   const DataLayout *TD = TM.getDataLayout();
317   const TargetLowering *TLI = TM.getTargetLowering();
318
319   Type *Ty = F->getReturnType();
320
321   bool isABI = (nvptxSubtarget.getSmVersion() >= 20);
322
323   if (Ty->getTypeID() == Type::VoidTyID)
324     return;
325
326   O << " (";
327
328   if (isABI) {
329     if (Ty->isPrimitiveType() || Ty->isIntegerTy()) {
330       unsigned size = 0;
331       if (const IntegerType *ITy = dyn_cast<IntegerType>(Ty)) {
332         size = ITy->getBitWidth();
333         if (size < 32)
334           size = 32;
335       } else {
336         assert(Ty->isFloatingPointTy() && "Floating point type expected here");
337         size = Ty->getPrimitiveSizeInBits();
338       }
339
340       O << ".param .b" << size << " func_retval0";
341     } else if (isa<PointerType>(Ty)) {
342       O << ".param .b" << TLI->getPointerTy().getSizeInBits()
343         << " func_retval0";
344     } else {
345       if ((Ty->getTypeID() == Type::StructTyID) || isa<VectorType>(Ty)) {
346         SmallVector<EVT, 16> vtparts;
347         ComputeValueVTs(*TLI, Ty, vtparts);
348         unsigned totalsz = 0;
349         for (unsigned i = 0, e = vtparts.size(); i != e; ++i) {
350           unsigned elems = 1;
351           EVT elemtype = vtparts[i];
352           if (vtparts[i].isVector()) {
353             elems = vtparts[i].getVectorNumElements();
354             elemtype = vtparts[i].getVectorElementType();
355           }
356           for (unsigned j = 0, je = elems; j != je; ++j) {
357             unsigned sz = elemtype.getSizeInBits();
358             if (elemtype.isInteger() && (sz < 8))
359               sz = 8;
360             totalsz += sz / 8;
361           }
362         }
363         unsigned retAlignment = 0;
364         if (!llvm::getAlign(*F, 0, retAlignment))
365           retAlignment = TD->getABITypeAlignment(Ty);
366         O << ".param .align " << retAlignment << " .b8 func_retval0[" << totalsz
367           << "]";
368       } else
369         assert(false && "Unknown return type");
370     }
371   } else {
372     SmallVector<EVT, 16> vtparts;
373     ComputeValueVTs(*TLI, Ty, vtparts);
374     unsigned idx = 0;
375     for (unsigned i = 0, e = vtparts.size(); i != e; ++i) {
376       unsigned elems = 1;
377       EVT elemtype = vtparts[i];
378       if (vtparts[i].isVector()) {
379         elems = vtparts[i].getVectorNumElements();
380         elemtype = vtparts[i].getVectorElementType();
381       }
382
383       for (unsigned j = 0, je = elems; j != je; ++j) {
384         unsigned sz = elemtype.getSizeInBits();
385         if (elemtype.isInteger() && (sz < 32))
386           sz = 32;
387         O << ".reg .b" << sz << " func_retval" << idx;
388         if (j < je - 1)
389           O << ", ";
390         ++idx;
391       }
392       if (i < e - 1)
393         O << ", ";
394     }
395   }
396   O << ") ";
397   return;
398 }
399
400 void NVPTXAsmPrinter::printReturnValStr(const MachineFunction &MF,
401                                         raw_ostream &O) {
402   const Function *F = MF.getFunction();
403   printReturnValStr(F, O);
404 }
405
406 void NVPTXAsmPrinter::EmitFunctionEntryLabel() {
407   SmallString<128> Str;
408   raw_svector_ostream O(Str);
409
410   if (!GlobalsEmitted) {
411     emitGlobals(*MF->getFunction()->getParent());
412     GlobalsEmitted = true;
413   }
414   
415   // Set up
416   MRI = &MF->getRegInfo();
417   F = MF->getFunction();
418   emitLinkageDirective(F, O);
419   if (llvm::isKernelFunction(*F))
420     O << ".entry ";
421   else {
422     O << ".func ";
423     printReturnValStr(*MF, O);
424   }
425
426   O << *CurrentFnSym;
427
428   emitFunctionParamList(*MF, O);
429
430   if (llvm::isKernelFunction(*F))
431     emitKernelFunctionDirectives(*F, O);
432
433   OutStreamer.EmitRawText(O.str());
434
435   prevDebugLoc = DebugLoc();
436 }
437
438 void NVPTXAsmPrinter::EmitFunctionBodyStart() {
439   const TargetRegisterInfo &TRI = *TM.getRegisterInfo();
440   unsigned numRegClasses = TRI.getNumRegClasses();
441   VRidGlobal2LocalMap = new std::map<unsigned, unsigned>[numRegClasses + 1];
442   OutStreamer.EmitRawText(StringRef("{\n"));
443   setAndEmitFunctionVirtualRegisters(*MF);
444
445   SmallString<128> Str;
446   raw_svector_ostream O(Str);
447   emitDemotedVars(MF->getFunction(), O);
448   OutStreamer.EmitRawText(O.str());
449 }
450
451 void NVPTXAsmPrinter::EmitFunctionBodyEnd() {
452   OutStreamer.EmitRawText(StringRef("}\n"));
453   delete[] VRidGlobal2LocalMap;
454 }
455
456 void NVPTXAsmPrinter::emitKernelFunctionDirectives(const Function &F,
457                                                    raw_ostream &O) const {
458   // If the NVVM IR has some of reqntid* specified, then output
459   // the reqntid directive, and set the unspecified ones to 1.
460   // If none of reqntid* is specified, don't output reqntid directive.
461   unsigned reqntidx, reqntidy, reqntidz;
462   bool specified = false;
463   if (llvm::getReqNTIDx(F, reqntidx) == false)
464     reqntidx = 1;
465   else
466     specified = true;
467   if (llvm::getReqNTIDy(F, reqntidy) == false)
468     reqntidy = 1;
469   else
470     specified = true;
471   if (llvm::getReqNTIDz(F, reqntidz) == false)
472     reqntidz = 1;
473   else
474     specified = true;
475
476   if (specified)
477     O << ".reqntid " << reqntidx << ", " << reqntidy << ", " << reqntidz
478       << "\n";
479
480   // If the NVVM IR has some of maxntid* specified, then output
481   // the maxntid directive, and set the unspecified ones to 1.
482   // If none of maxntid* is specified, don't output maxntid directive.
483   unsigned maxntidx, maxntidy, maxntidz;
484   specified = false;
485   if (llvm::getMaxNTIDx(F, maxntidx) == false)
486     maxntidx = 1;
487   else
488     specified = true;
489   if (llvm::getMaxNTIDy(F, maxntidy) == false)
490     maxntidy = 1;
491   else
492     specified = true;
493   if (llvm::getMaxNTIDz(F, maxntidz) == false)
494     maxntidz = 1;
495   else
496     specified = true;
497
498   if (specified)
499     O << ".maxntid " << maxntidx << ", " << maxntidy << ", " << maxntidz
500       << "\n";
501
502   unsigned mincta;
503   if (llvm::getMinCTASm(F, mincta))
504     O << ".minnctapersm " << mincta << "\n";
505 }
506
507 void NVPTXAsmPrinter::getVirtualRegisterName(unsigned vr, bool isVec,
508                                              raw_ostream &O) {
509   const TargetRegisterClass *RC = MRI->getRegClass(vr);
510   unsigned id = RC->getID();
511
512   std::map<unsigned, unsigned> &regmap = VRidGlobal2LocalMap[id];
513   unsigned mapped_vr = regmap[vr];
514
515   if (!isVec) {
516     O << getNVPTXRegClassStr(RC) << mapped_vr;
517     return;
518   }
519   report_fatal_error("Bad register!");
520 }
521
522 void NVPTXAsmPrinter::emitVirtualRegister(unsigned int vr, bool isVec,
523                                           raw_ostream &O) {
524   getVirtualRegisterName(vr, isVec, O);
525 }
526
527 void NVPTXAsmPrinter::printVecModifiedImmediate(
528     const MachineOperand &MO, const char *Modifier, raw_ostream &O) {
529   static const char vecelem[] = { '0', '1', '2', '3', '0', '1', '2', '3' };
530   int Imm = (int) MO.getImm();
531   if (0 == strcmp(Modifier, "vecelem"))
532     O << "_" << vecelem[Imm];
533   else if (0 == strcmp(Modifier, "vecv4comm1")) {
534     if ((Imm < 0) || (Imm > 3))
535       O << "//";
536   } else if (0 == strcmp(Modifier, "vecv4comm2")) {
537     if ((Imm < 4) || (Imm > 7))
538       O << "//";
539   } else if (0 == strcmp(Modifier, "vecv4pos")) {
540     if (Imm < 0)
541       Imm = 0;
542     O << "_" << vecelem[Imm % 4];
543   } else if (0 == strcmp(Modifier, "vecv2comm1")) {
544     if ((Imm < 0) || (Imm > 1))
545       O << "//";
546   } else if (0 == strcmp(Modifier, "vecv2comm2")) {
547     if ((Imm < 2) || (Imm > 3))
548       O << "//";
549   } else if (0 == strcmp(Modifier, "vecv2pos")) {
550     if (Imm < 0)
551       Imm = 0;
552     O << "_" << vecelem[Imm % 2];
553   } else
554     llvm_unreachable("Unknown Modifier on immediate operand");
555 }
556
557 void NVPTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
558                                    raw_ostream &O, const char *Modifier) {
559   const MachineOperand &MO = MI->getOperand(opNum);
560   switch (MO.getType()) {
561   case MachineOperand::MO_Register:
562     if (TargetRegisterInfo::isPhysicalRegister(MO.getReg())) {
563       if (MO.getReg() == NVPTX::VRDepot)
564         O << DEPOTNAME << getFunctionNumber();
565       else
566         O << getRegisterName(MO.getReg());
567     } else {
568       if (!Modifier)
569         emitVirtualRegister(MO.getReg(), false, O);
570       else {
571         if (strcmp(Modifier, "vecfull") == 0)
572           emitVirtualRegister(MO.getReg(), true, O);
573         else
574           llvm_unreachable(
575               "Don't know how to handle the modifier on virtual register.");
576       }
577     }
578     return;
579
580   case MachineOperand::MO_Immediate:
581     if (!Modifier)
582       O << MO.getImm();
583     else if (strstr(Modifier, "vec") == Modifier)
584       printVecModifiedImmediate(MO, Modifier, O);
585     else
586       llvm_unreachable(
587           "Don't know how to handle modifier on immediate operand");
588     return;
589
590   case MachineOperand::MO_FPImmediate:
591     printFPConstant(MO.getFPImm(), O);
592     break;
593
594   case MachineOperand::MO_GlobalAddress:
595     O << *Mang->getSymbol(MO.getGlobal());
596     break;
597
598   case MachineOperand::MO_ExternalSymbol: {
599     const char *symbname = MO.getSymbolName();
600     if (strstr(symbname, ".PARAM") == symbname) {
601       unsigned index;
602       sscanf(symbname + 6, "%u[];", &index);
603       printParamName(index, O);
604     } else if (strstr(symbname, ".HLPPARAM") == symbname) {
605       unsigned index;
606       sscanf(symbname + 9, "%u[];", &index);
607       O << *CurrentFnSym << "_param_" << index << "_offset";
608     } else
609       O << symbname;
610     break;
611   }
612
613   case MachineOperand::MO_MachineBasicBlock:
614     O << *MO.getMBB()->getSymbol();
615     return;
616
617   default:
618     llvm_unreachable("Operand type not supported.");
619   }
620 }
621
622 void NVPTXAsmPrinter::printImplicitDef(const MachineInstr *MI,
623                                        raw_ostream &O) const {
624 #ifndef __OPTIMIZE__
625   O << "\t// Implicit def :";
626   //printOperand(MI, 0);
627   O << "\n";
628 #endif
629 }
630
631 void NVPTXAsmPrinter::printMemOperand(const MachineInstr *MI, int opNum,
632                                       raw_ostream &O, const char *Modifier) {
633   printOperand(MI, opNum, O);
634
635   if (Modifier && !strcmp(Modifier, "add")) {
636     O << ", ";
637     printOperand(MI, opNum + 1, O);
638   } else {
639     if (MI->getOperand(opNum + 1).isImm() &&
640         MI->getOperand(opNum + 1).getImm() == 0)
641       return; // don't print ',0' or '+0'
642     O << "+";
643     printOperand(MI, opNum + 1, O);
644   }
645 }
646
647 void NVPTXAsmPrinter::printLdStCode(const MachineInstr *MI, int opNum,
648                                     raw_ostream &O, const char *Modifier) {
649   if (Modifier) {
650     const MachineOperand &MO = MI->getOperand(opNum);
651     int Imm = (int) MO.getImm();
652     if (!strcmp(Modifier, "volatile")) {
653       if (Imm)
654         O << ".volatile";
655     } else if (!strcmp(Modifier, "addsp")) {
656       switch (Imm) {
657       case NVPTX::PTXLdStInstCode::GLOBAL:
658         O << ".global";
659         break;
660       case NVPTX::PTXLdStInstCode::SHARED:
661         O << ".shared";
662         break;
663       case NVPTX::PTXLdStInstCode::LOCAL:
664         O << ".local";
665         break;
666       case NVPTX::PTXLdStInstCode::PARAM:
667         O << ".param";
668         break;
669       case NVPTX::PTXLdStInstCode::CONSTANT:
670         O << ".const";
671         break;
672       case NVPTX::PTXLdStInstCode::GENERIC:
673         if (!nvptxSubtarget.hasGenericLdSt())
674           O << ".global";
675         break;
676       default:
677         llvm_unreachable("Wrong Address Space");
678       }
679     } else if (!strcmp(Modifier, "sign")) {
680       if (Imm == NVPTX::PTXLdStInstCode::Signed)
681         O << "s";
682       else if (Imm == NVPTX::PTXLdStInstCode::Unsigned)
683         O << "u";
684       else
685         O << "f";
686     } else if (!strcmp(Modifier, "vec")) {
687       if (Imm == NVPTX::PTXLdStInstCode::V2)
688         O << ".v2";
689       else if (Imm == NVPTX::PTXLdStInstCode::V4)
690         O << ".v4";
691     } else
692       llvm_unreachable("Unknown Modifier");
693   } else
694     llvm_unreachable("Empty Modifier");
695 }
696
697 void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) {
698
699   emitLinkageDirective(F, O);
700   if (llvm::isKernelFunction(*F))
701     O << ".entry ";
702   else
703     O << ".func ";
704   printReturnValStr(F, O);
705   O << *CurrentFnSym << "\n";
706   emitFunctionParamList(F, O);
707   O << ";\n";
708 }
709
710 static bool usedInGlobalVarDef(const Constant *C) {
711   if (!C)
712     return false;
713
714   if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
715     if (GV->getName().str() == "llvm.used")
716       return false;
717     return true;
718   }
719
720   for (Value::const_use_iterator ui = C->use_begin(), ue = C->use_end();
721        ui != ue; ++ui) {
722     const Constant *C = dyn_cast<Constant>(*ui);
723     if (usedInGlobalVarDef(C))
724       return true;
725   }
726   return false;
727 }
728
729 static bool usedInOneFunc(const User *U, Function const *&oneFunc) {
730   if (const GlobalVariable *othergv = dyn_cast<GlobalVariable>(U)) {
731     if (othergv->getName().str() == "llvm.used")
732       return true;
733   }
734
735   if (const Instruction *instr = dyn_cast<Instruction>(U)) {
736     if (instr->getParent() && instr->getParent()->getParent()) {
737       const Function *curFunc = instr->getParent()->getParent();
738       if (oneFunc && (curFunc != oneFunc))
739         return false;
740       oneFunc = curFunc;
741       return true;
742     } else
743       return false;
744   }
745
746   if (const MDNode *md = dyn_cast<MDNode>(U))
747     if (md->hasName() && ((md->getName().str() == "llvm.dbg.gv") ||
748                           (md->getName().str() == "llvm.dbg.sp")))
749       return true;
750
751   for (User::const_use_iterator ui = U->use_begin(), ue = U->use_end();
752        ui != ue; ++ui) {
753     if (usedInOneFunc(*ui, oneFunc) == false)
754       return false;
755   }
756   return true;
757 }
758
759 /* Find out if a global variable can be demoted to local scope.
760  * Currently, this is valid for CUDA shared variables, which have local
761  * scope and global lifetime. So the conditions to check are :
762  * 1. Is the global variable in shared address space?
763  * 2. Does it have internal linkage?
764  * 3. Is the global variable referenced only in one function?
765  */
766 static bool canDemoteGlobalVar(const GlobalVariable *gv, Function const *&f) {
767   if (gv->hasInternalLinkage() == false)
768     return false;
769   const PointerType *Pty = gv->getType();
770   if (Pty->getAddressSpace() != llvm::ADDRESS_SPACE_SHARED)
771     return false;
772
773   const Function *oneFunc = 0;
774
775   bool flag = usedInOneFunc(gv, oneFunc);
776   if (flag == false)
777     return false;
778   if (!oneFunc)
779     return false;
780   f = oneFunc;
781   return true;
782 }
783
784 static bool useFuncSeen(const Constant *C,
785                         llvm::DenseMap<const Function *, bool> &seenMap) {
786   for (Value::const_use_iterator ui = C->use_begin(), ue = C->use_end();
787        ui != ue; ++ui) {
788     if (const Constant *cu = dyn_cast<Constant>(*ui)) {
789       if (useFuncSeen(cu, seenMap))
790         return true;
791     } else if (const Instruction *I = dyn_cast<Instruction>(*ui)) {
792       const BasicBlock *bb = I->getParent();
793       if (!bb)
794         continue;
795       const Function *caller = bb->getParent();
796       if (!caller)
797         continue;
798       if (seenMap.find(caller) != seenMap.end())
799         return true;
800     }
801   }
802   return false;
803 }
804
805 void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) {
806   llvm::DenseMap<const Function *, bool> seenMap;
807   for (Module::const_iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) {
808     const Function *F = FI;
809
810     if (F->isDeclaration()) {
811       if (F->use_empty())
812         continue;
813       if (F->getIntrinsicID())
814         continue;
815       CurrentFnSym = Mang->getSymbol(F);
816       emitDeclaration(F, O);
817       continue;
818     }
819     for (Value::const_use_iterator iter = F->use_begin(),
820                                    iterEnd = F->use_end();
821          iter != iterEnd; ++iter) {
822       if (const Constant *C = dyn_cast<Constant>(*iter)) {
823         if (usedInGlobalVarDef(C)) {
824           // The use is in the initialization of a global variable
825           // that is a function pointer, so print a declaration
826           // for the original function
827           CurrentFnSym = Mang->getSymbol(F);
828           emitDeclaration(F, O);
829           break;
830         }
831         // Emit a declaration of this function if the function that
832         // uses this constant expr has already been seen.
833         if (useFuncSeen(C, seenMap)) {
834           CurrentFnSym = Mang->getSymbol(F);
835           emitDeclaration(F, O);
836           break;
837         }
838       }
839
840       if (!isa<Instruction>(*iter))
841         continue;
842       const Instruction *instr = cast<Instruction>(*iter);
843       const BasicBlock *bb = instr->getParent();
844       if (!bb)
845         continue;
846       const Function *caller = bb->getParent();
847       if (!caller)
848         continue;
849
850       // If a caller has already been seen, then the caller is
851       // appearing in the module before the callee. so print out
852       // a declaration for the callee.
853       if (seenMap.find(caller) != seenMap.end()) {
854         CurrentFnSym = Mang->getSymbol(F);
855         emitDeclaration(F, O);
856         break;
857       }
858     }
859     seenMap[F] = true;
860   }
861 }
862
863 void NVPTXAsmPrinter::recordAndEmitFilenames(Module &M) {
864   DebugInfoFinder DbgFinder;
865   DbgFinder.processModule(M);
866
867   unsigned i = 1;
868   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
869                                  E = DbgFinder.compile_unit_end();
870        I != E; ++I) {
871     DICompileUnit DIUnit(*I);
872     StringRef Filename(DIUnit.getFilename());
873     StringRef Dirname(DIUnit.getDirectory());
874     SmallString<128> FullPathName = Dirname;
875     if (!Dirname.empty() && !sys::path::is_absolute(Filename)) {
876       sys::path::append(FullPathName, Filename);
877       Filename = FullPathName.str();
878     }
879     if (filenameMap.find(Filename.str()) != filenameMap.end())
880       continue;
881     filenameMap[Filename.str()] = i;
882     OutStreamer.EmitDwarfFileDirective(i, "", Filename.str());
883     ++i;
884   }
885
886   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
887                                  E = DbgFinder.subprogram_end();
888        I != E; ++I) {
889     DISubprogram SP(*I);
890     StringRef Filename(SP.getFilename());
891     StringRef Dirname(SP.getDirectory());
892     SmallString<128> FullPathName = Dirname;
893     if (!Dirname.empty() && !sys::path::is_absolute(Filename)) {
894       sys::path::append(FullPathName, Filename);
895       Filename = FullPathName.str();
896     }
897     if (filenameMap.find(Filename.str()) != filenameMap.end())
898       continue;
899     filenameMap[Filename.str()] = i;
900     ++i;
901   }
902 }
903
904 bool NVPTXAsmPrinter::doInitialization(Module &M) {
905
906   SmallString<128> Str1;
907   raw_svector_ostream OS1(Str1);
908
909   MMI = getAnalysisIfAvailable<MachineModuleInfo>();
910   MMI->AnalyzeModule(M);
911
912   // We need to call the parent's one explicitly.
913   //bool Result = AsmPrinter::doInitialization(M);
914
915   // Initialize TargetLoweringObjectFile.
916   const_cast<TargetLoweringObjectFile &>(getObjFileLowering())
917       .Initialize(OutContext, TM);
918
919   Mang = new Mangler(OutContext, *TM.getDataLayout());
920
921   // Emit header before any dwarf directives are emitted below.
922   emitHeader(M, OS1);
923   OutStreamer.EmitRawText(OS1.str());
924
925   // Already commented out
926   //bool Result = AsmPrinter::doInitialization(M);
927
928   if (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA)
929     recordAndEmitFilenames(M);
930
931   GlobalsEmitted = false;
932     
933   return false; // success
934 }
935
936 void NVPTXAsmPrinter::emitGlobals(const Module &M) {
937   SmallString<128> Str2;
938   raw_svector_ostream OS2(Str2);
939
940   emitDeclarations(M, OS2);
941
942   // As ptxas does not support forward references of globals, we need to first
943   // sort the list of module-level globals in def-use order. We visit each
944   // global variable in order, and ensure that we emit it *after* its dependent
945   // globals. We use a little extra memory maintaining both a set and a list to
946   // have fast searches while maintaining a strict ordering.
947   SmallVector<const GlobalVariable *, 8> Globals;
948   DenseSet<const GlobalVariable *> GVVisited;
949   DenseSet<const GlobalVariable *> GVVisiting;
950
951   // Visit each global variable, in order
952   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
953        I != E; ++I)
954     VisitGlobalVariableForEmission(I, Globals, GVVisited, GVVisiting);
955
956   assert(GVVisited.size() == M.getGlobalList().size() &&
957          "Missed a global variable");
958   assert(GVVisiting.size() == 0 && "Did not fully process a global variable");
959
960   // Print out module-level global variables in proper order
961   for (unsigned i = 0, e = Globals.size(); i != e; ++i)
962     printModuleLevelGV(Globals[i], OS2);
963
964   OS2 << '\n';
965
966   OutStreamer.EmitRawText(OS2.str());
967 }
968
969 void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O) {
970   O << "//\n";
971   O << "// Generated by LLVM NVPTX Back-End\n";
972   O << "//\n";
973   O << "\n";
974
975   unsigned PTXVersion = nvptxSubtarget.getPTXVersion();
976   O << ".version " << (PTXVersion / 10) << "." << (PTXVersion % 10) << "\n";
977
978   O << ".target ";
979   O << nvptxSubtarget.getTargetName();
980
981   if (nvptxSubtarget.getDrvInterface() == NVPTX::NVCL)
982     O << ", texmode_independent";
983   if (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA) {
984     if (!nvptxSubtarget.hasDouble())
985       O << ", map_f64_to_f32";
986   }
987
988   if (MAI->doesSupportDebugInformation())
989     O << ", debug";
990
991   O << "\n";
992
993   O << ".address_size ";
994   if (nvptxSubtarget.is64Bit())
995     O << "64";
996   else
997     O << "32";
998   O << "\n";
999
1000   O << "\n";
1001 }
1002
1003 bool NVPTXAsmPrinter::doFinalization(Module &M) {
1004
1005   // If we did not emit any functions, then the global declarations have not
1006   // yet been emitted.
1007   if (!GlobalsEmitted) {
1008     emitGlobals(M);
1009     GlobalsEmitted = true;
1010   }
1011
1012   // XXX Temproarily remove global variables so that doFinalization() will not
1013   // emit them again (global variables are emitted at beginning).
1014
1015   Module::GlobalListType &global_list = M.getGlobalList();
1016   int i, n = global_list.size();
1017   GlobalVariable **gv_array = new GlobalVariable *[n];
1018
1019   // first, back-up GlobalVariable in gv_array
1020   i = 0;
1021   for (Module::global_iterator I = global_list.begin(), E = global_list.end();
1022        I != E; ++I)
1023     gv_array[i++] = &*I;
1024
1025   // second, empty global_list
1026   while (!global_list.empty())
1027     global_list.remove(global_list.begin());
1028
1029   // call doFinalization
1030   bool ret = AsmPrinter::doFinalization(M);
1031
1032   // now we restore global variables
1033   for (i = 0; i < n; i++)
1034     global_list.insert(global_list.end(), gv_array[i]);
1035
1036   delete[] gv_array;
1037   return ret;
1038
1039   //bool Result = AsmPrinter::doFinalization(M);
1040   // Instead of calling the parents doFinalization, we may
1041   // clone parents doFinalization and customize here.
1042   // Currently, we if NVISA out the EmitGlobals() in
1043   // parent's doFinalization, which is too intrusive.
1044   //
1045   // Same for the doInitialization.
1046   //return Result;
1047 }
1048
1049 // This function emits appropriate linkage directives for
1050 // functions and global variables.
1051 //
1052 // extern function declaration            -> .extern
1053 // extern function definition             -> .visible
1054 // external global variable with init     -> .visible
1055 // external without init                  -> .extern
1056 // appending                              -> not allowed, assert.
1057
1058 void NVPTXAsmPrinter::emitLinkageDirective(const GlobalValue *V,
1059                                            raw_ostream &O) {
1060   if (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA) {
1061     if (V->hasExternalLinkage()) {
1062       if (isa<GlobalVariable>(V)) {
1063         const GlobalVariable *GVar = cast<GlobalVariable>(V);
1064         if (GVar) {
1065           if (GVar->hasInitializer())
1066             O << ".visible ";
1067           else
1068             O << ".extern ";
1069         }
1070       } else if (V->isDeclaration())
1071         O << ".extern ";
1072       else
1073         O << ".visible ";
1074     } else if (V->hasAppendingLinkage()) {
1075       std::string msg;
1076       msg.append("Error: ");
1077       msg.append("Symbol ");
1078       if (V->hasName())
1079         msg.append(V->getName().str());
1080       msg.append("has unsupported appending linkage type");
1081       llvm_unreachable(msg.c_str());
1082     }
1083   }
1084 }
1085
1086 void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
1087                                          raw_ostream &O,
1088                                          bool processDemoted) {
1089
1090   // Skip meta data
1091   if (GVar->hasSection()) {
1092     if (GVar->getSection() == "llvm.metadata")
1093       return;
1094   }
1095
1096   const DataLayout *TD = TM.getDataLayout();
1097
1098   // GlobalVariables are always constant pointers themselves.
1099   const PointerType *PTy = GVar->getType();
1100   Type *ETy = PTy->getElementType();
1101
1102   if (GVar->hasExternalLinkage()) {
1103     if (GVar->hasInitializer())
1104       O << ".visible ";
1105     else
1106       O << ".extern ";
1107   }
1108
1109   if (llvm::isTexture(*GVar)) {
1110     O << ".global .texref " << llvm::getTextureName(*GVar) << ";\n";
1111     return;
1112   }
1113
1114   if (llvm::isSurface(*GVar)) {
1115     O << ".global .surfref " << llvm::getSurfaceName(*GVar) << ";\n";
1116     return;
1117   }
1118
1119   if (GVar->isDeclaration()) {
1120     // (extern) declarations, no definition or initializer
1121     // Currently the only known declaration is for an automatic __local
1122     // (.shared) promoted to global.
1123     emitPTXGlobalVariable(GVar, O);
1124     O << ";\n";
1125     return;
1126   }
1127
1128   if (llvm::isSampler(*GVar)) {
1129     O << ".global .samplerref " << llvm::getSamplerName(*GVar);
1130
1131     const Constant *Initializer = NULL;
1132     if (GVar->hasInitializer())
1133       Initializer = GVar->getInitializer();
1134     const ConstantInt *CI = NULL;
1135     if (Initializer)
1136       CI = dyn_cast<ConstantInt>(Initializer);
1137     if (CI) {
1138       unsigned sample = CI->getZExtValue();
1139
1140       O << " = { ";
1141
1142       for (int i = 0,
1143                addr = ((sample & __CLK_ADDRESS_MASK) >> __CLK_ADDRESS_BASE);
1144            i < 3; i++) {
1145         O << "addr_mode_" << i << " = ";
1146         switch (addr) {
1147         case 0:
1148           O << "wrap";
1149           break;
1150         case 1:
1151           O << "clamp_to_border";
1152           break;
1153         case 2:
1154           O << "clamp_to_edge";
1155           break;
1156         case 3:
1157           O << "wrap";
1158           break;
1159         case 4:
1160           O << "mirror";
1161           break;
1162         }
1163         O << ", ";
1164       }
1165       O << "filter_mode = ";
1166       switch ((sample & __CLK_FILTER_MASK) >> __CLK_FILTER_BASE) {
1167       case 0:
1168         O << "nearest";
1169         break;
1170       case 1:
1171         O << "linear";
1172         break;
1173       case 2:
1174         assert(0 && "Anisotropic filtering is not supported");
1175       default:
1176         O << "nearest";
1177         break;
1178       }
1179       if (!((sample & __CLK_NORMALIZED_MASK) >> __CLK_NORMALIZED_BASE)) {
1180         O << ", force_unnormalized_coords = 1";
1181       }
1182       O << " }";
1183     }
1184
1185     O << ";\n";
1186     return;
1187   }
1188
1189   if (GVar->hasPrivateLinkage()) {
1190
1191     if (!strncmp(GVar->getName().data(), "unrollpragma", 12))
1192       return;
1193
1194     // FIXME - need better way (e.g. Metadata) to avoid generating this global
1195     if (!strncmp(GVar->getName().data(), "filename", 8))
1196       return;
1197     if (GVar->use_empty())
1198       return;
1199   }
1200
1201   const Function *demotedFunc = 0;
1202   if (!processDemoted && canDemoteGlobalVar(GVar, demotedFunc)) {
1203     O << "// " << GVar->getName().str() << " has been demoted\n";
1204     if (localDecls.find(demotedFunc) != localDecls.end())
1205       localDecls[demotedFunc].push_back(GVar);
1206     else {
1207       std::vector<const GlobalVariable *> temp;
1208       temp.push_back(GVar);
1209       localDecls[demotedFunc] = temp;
1210     }
1211     return;
1212   }
1213
1214   O << ".";
1215   emitPTXAddressSpace(PTy->getAddressSpace(), O);
1216   if (GVar->getAlignment() == 0)
1217     O << " .align " << (int) TD->getPrefTypeAlignment(ETy);
1218   else
1219     O << " .align " << GVar->getAlignment();
1220
1221   if (ETy->isPrimitiveType() || ETy->isIntegerTy() || isa<PointerType>(ETy)) {
1222     O << " .";
1223     // Special case: ABI requires that we use .u8 for predicates
1224     if (ETy->isIntegerTy(1))
1225       O << "u8";
1226     else
1227       O << getPTXFundamentalTypeStr(ETy, false);
1228     O << " ";
1229     O << *Mang->getSymbol(GVar);
1230
1231     // Ptx allows variable initilization only for constant and global state
1232     // spaces.
1233     if (((PTy->getAddressSpace() == llvm::ADDRESS_SPACE_GLOBAL) ||
1234          (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST_NOT_GEN) ||
1235          (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST)) &&
1236         GVar->hasInitializer()) {
1237       const Constant *Initializer = GVar->getInitializer();
1238       if (!Initializer->isNullValue()) {
1239         O << " = ";
1240         printScalarConstant(Initializer, O);
1241       }
1242     }
1243   } else {
1244     unsigned int ElementSize = 0;
1245
1246     // Although PTX has direct support for struct type and array type and
1247     // LLVM IR is very similar to PTX, the LLVM CodeGen does not support for
1248     // targets that support these high level field accesses. Structs, arrays
1249     // and vectors are lowered into arrays of bytes.
1250     switch (ETy->getTypeID()) {
1251     case Type::StructTyID:
1252     case Type::ArrayTyID:
1253     case Type::VectorTyID:
1254       ElementSize = TD->getTypeStoreSize(ETy);
1255       // Ptx allows variable initilization only for constant and
1256       // global state spaces.
1257       if (((PTy->getAddressSpace() == llvm::ADDRESS_SPACE_GLOBAL) ||
1258            (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST_NOT_GEN) ||
1259            (PTy->getAddressSpace() == llvm::ADDRESS_SPACE_CONST)) &&
1260           GVar->hasInitializer()) {
1261         const Constant *Initializer = GVar->getInitializer();
1262         if (!isa<UndefValue>(Initializer) && !Initializer->isNullValue()) {
1263           AggBuffer aggBuffer(ElementSize, O, *this);
1264           bufferAggregateConstant(Initializer, &aggBuffer);
1265           if (aggBuffer.numSymbols) {
1266             if (nvptxSubtarget.is64Bit()) {
1267               O << " .u64 " << *Mang->getSymbol(GVar) << "[";
1268               O << ElementSize / 8;
1269             } else {
1270               O << " .u32 " << *Mang->getSymbol(GVar) << "[";
1271               O << ElementSize / 4;
1272             }
1273             O << "]";
1274           } else {
1275             O << " .b8 " << *Mang->getSymbol(GVar) << "[";
1276             O << ElementSize;
1277             O << "]";
1278           }
1279           O << " = {";
1280           aggBuffer.print();
1281           O << "}";
1282         } else {
1283           O << " .b8 " << *Mang->getSymbol(GVar);
1284           if (ElementSize) {
1285             O << "[";
1286             O << ElementSize;
1287             O << "]";
1288           }
1289         }
1290       } else {
1291         O << " .b8 " << *Mang->getSymbol(GVar);
1292         if (ElementSize) {
1293           O << "[";
1294           O << ElementSize;
1295           O << "]";
1296         }
1297       }
1298       break;
1299     default:
1300       assert(0 && "type not supported yet");
1301     }
1302
1303   }
1304   O << ";\n";
1305 }
1306
1307 void NVPTXAsmPrinter::emitDemotedVars(const Function *f, raw_ostream &O) {
1308   if (localDecls.find(f) == localDecls.end())
1309     return;
1310
1311   std::vector<const GlobalVariable *> &gvars = localDecls[f];
1312
1313   for (unsigned i = 0, e = gvars.size(); i != e; ++i) {
1314     O << "\t// demoted variable\n\t";
1315     printModuleLevelGV(gvars[i], O, true);
1316   }
1317 }
1318
1319 void NVPTXAsmPrinter::emitPTXAddressSpace(unsigned int AddressSpace,
1320                                           raw_ostream &O) const {
1321   switch (AddressSpace) {
1322   case llvm::ADDRESS_SPACE_LOCAL:
1323     O << "local";
1324     break;
1325   case llvm::ADDRESS_SPACE_GLOBAL:
1326     O << "global";
1327     break;
1328   case llvm::ADDRESS_SPACE_CONST:
1329     // This logic should be consistent with that in
1330     // getCodeAddrSpace() (NVPTXISelDATToDAT.cpp)
1331     if (nvptxSubtarget.hasGenericLdSt())
1332       O << "global";
1333     else
1334       O << "const";
1335     break;
1336   case llvm::ADDRESS_SPACE_CONST_NOT_GEN:
1337     O << "const";
1338     break;
1339   case llvm::ADDRESS_SPACE_SHARED:
1340     O << "shared";
1341     break;
1342   default:
1343     report_fatal_error("Bad address space found while emitting PTX");
1344     break;
1345   }
1346 }
1347
1348 std::string
1349 NVPTXAsmPrinter::getPTXFundamentalTypeStr(const Type *Ty, bool useB4PTR) const {
1350   switch (Ty->getTypeID()) {
1351   default:
1352     llvm_unreachable("unexpected type");
1353     break;
1354   case Type::IntegerTyID: {
1355     unsigned NumBits = cast<IntegerType>(Ty)->getBitWidth();
1356     if (NumBits == 1)
1357       return "pred";
1358     else if (NumBits <= 64) {
1359       std::string name = "u";
1360       return name + utostr(NumBits);
1361     } else {
1362       llvm_unreachable("Integer too large");
1363       break;
1364     }
1365     break;
1366   }
1367   case Type::FloatTyID:
1368     return "f32";
1369   case Type::DoubleTyID:
1370     return "f64";
1371   case Type::PointerTyID:
1372     if (nvptxSubtarget.is64Bit())
1373       if (useB4PTR)
1374         return "b64";
1375       else
1376         return "u64";
1377     else if (useB4PTR)
1378       return "b32";
1379     else
1380       return "u32";
1381   }
1382   llvm_unreachable("unexpected type");
1383   return NULL;
1384 }
1385
1386 void NVPTXAsmPrinter::emitPTXGlobalVariable(const GlobalVariable *GVar,
1387                                             raw_ostream &O) {
1388
1389   const DataLayout *TD = TM.getDataLayout();
1390
1391   // GlobalVariables are always constant pointers themselves.
1392   const PointerType *PTy = GVar->getType();
1393   Type *ETy = PTy->getElementType();
1394
1395   O << ".";
1396   emitPTXAddressSpace(PTy->getAddressSpace(), O);
1397   if (GVar->getAlignment() == 0)
1398     O << " .align " << (int) TD->getPrefTypeAlignment(ETy);
1399   else
1400     O << " .align " << GVar->getAlignment();
1401
1402   if (ETy->isPrimitiveType() || ETy->isIntegerTy() || isa<PointerType>(ETy)) {
1403     O << " .";
1404     O << getPTXFundamentalTypeStr(ETy);
1405     O << " ";
1406     O << *Mang->getSymbol(GVar);
1407     return;
1408   }
1409
1410   int64_t ElementSize = 0;
1411
1412   // Although PTX has direct support for struct type and array type and LLVM IR
1413   // is very similar to PTX, the LLVM CodeGen does not support for targets that
1414   // support these high level field accesses. Structs and arrays are lowered
1415   // into arrays of bytes.
1416   switch (ETy->getTypeID()) {
1417   case Type::StructTyID:
1418   case Type::ArrayTyID:
1419   case Type::VectorTyID:
1420     ElementSize = TD->getTypeStoreSize(ETy);
1421     O << " .b8 " << *Mang->getSymbol(GVar) << "[";
1422     if (ElementSize) {
1423       O << itostr(ElementSize);
1424     }
1425     O << "]";
1426     break;
1427   default:
1428     assert(0 && "type not supported yet");
1429   }
1430   return;
1431 }
1432
1433 static unsigned int getOpenCLAlignment(const DataLayout *TD, Type *Ty) {
1434   if (Ty->isPrimitiveType() || Ty->isIntegerTy() || isa<PointerType>(Ty))
1435     return TD->getPrefTypeAlignment(Ty);
1436
1437   const ArrayType *ATy = dyn_cast<ArrayType>(Ty);
1438   if (ATy)
1439     return getOpenCLAlignment(TD, ATy->getElementType());
1440
1441   const VectorType *VTy = dyn_cast<VectorType>(Ty);
1442   if (VTy) {
1443     Type *ETy = VTy->getElementType();
1444     unsigned int numE = VTy->getNumElements();
1445     unsigned int alignE = TD->getPrefTypeAlignment(ETy);
1446     if (numE == 3)
1447       return 4 * alignE;
1448     else
1449       return numE * alignE;
1450   }
1451
1452   const StructType *STy = dyn_cast<StructType>(Ty);
1453   if (STy) {
1454     unsigned int alignStruct = 1;
1455     // Go through each element of the struct and find the
1456     // largest alignment.
1457     for (unsigned i = 0, e = STy->getNumElements(); i != e; i++) {
1458       Type *ETy = STy->getElementType(i);
1459       unsigned int align = getOpenCLAlignment(TD, ETy);
1460       if (align > alignStruct)
1461         alignStruct = align;
1462     }
1463     return alignStruct;
1464   }
1465
1466   const FunctionType *FTy = dyn_cast<FunctionType>(Ty);
1467   if (FTy)
1468     return TD->getPointerPrefAlignment();
1469   return TD->getPrefTypeAlignment(Ty);
1470 }
1471
1472 void NVPTXAsmPrinter::printParamName(Function::const_arg_iterator I,
1473                                      int paramIndex, raw_ostream &O) {
1474   if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
1475       (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
1476     O << *CurrentFnSym << "_param_" << paramIndex;
1477   else {
1478     std::string argName = I->getName();
1479     const char *p = argName.c_str();
1480     while (*p) {
1481       if (*p == '.')
1482         O << "_";
1483       else
1484         O << *p;
1485       p++;
1486     }
1487   }
1488 }
1489
1490 void NVPTXAsmPrinter::printParamName(int paramIndex, raw_ostream &O) {
1491   Function::const_arg_iterator I, E;
1492   int i = 0;
1493
1494   if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
1495       (nvptxSubtarget.getDrvInterface() == NVPTX::CUDA)) {
1496     O << *CurrentFnSym << "_param_" << paramIndex;
1497     return;
1498   }
1499
1500   for (I = F->arg_begin(), E = F->arg_end(); I != E; ++I, i++) {
1501     if (i == paramIndex) {
1502       printParamName(I, paramIndex, O);
1503       return;
1504     }
1505   }
1506   llvm_unreachable("paramIndex out of bound");
1507 }
1508
1509 void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) {
1510   const DataLayout *TD = TM.getDataLayout();
1511   const AttributeSet &PAL = F->getAttributes();
1512   const TargetLowering *TLI = TM.getTargetLowering();
1513   Function::const_arg_iterator I, E;
1514   unsigned paramIndex = 0;
1515   bool first = true;
1516   bool isKernelFunc = llvm::isKernelFunction(*F);
1517   bool isABI = (nvptxSubtarget.getSmVersion() >= 20);
1518   MVT thePointerTy = TLI->getPointerTy();
1519
1520   O << "(\n";
1521
1522   for (I = F->arg_begin(), E = F->arg_end(); I != E; ++I, paramIndex++) {
1523     Type *Ty = I->getType();
1524
1525     if (!first)
1526       O << ",\n";
1527
1528     first = false;
1529
1530     // Handle image/sampler parameters
1531     if (llvm::isSampler(*I) || llvm::isImage(*I)) {
1532       if (llvm::isImage(*I)) {
1533         std::string sname = I->getName();
1534         if (llvm::isImageWriteOnly(*I))
1535           O << "\t.param .surfref " << *CurrentFnSym << "_param_" << paramIndex;
1536         else // Default image is read_only
1537           O << "\t.param .texref " << *CurrentFnSym << "_param_" << paramIndex;
1538       } else // Should be llvm::isSampler(*I)
1539         O << "\t.param .samplerref " << *CurrentFnSym << "_param_"
1540           << paramIndex;
1541       continue;
1542     }
1543
1544     if (PAL.hasAttribute(paramIndex + 1, Attribute::ByVal) == false) {
1545       if (Ty->isVectorTy()) {
1546         // Just print .param .b8 .align <a> .param[size];
1547         // <a> = PAL.getparamalignment
1548         // size = typeallocsize of element type
1549         unsigned align = PAL.getParamAlignment(paramIndex + 1);
1550         if (align == 0)
1551           align = TD->getABITypeAlignment(Ty);
1552
1553         unsigned sz = TD->getTypeAllocSize(Ty);
1554         O << "\t.param .align " << align << " .b8 ";
1555         printParamName(I, paramIndex, O);
1556         O << "[" << sz << "]";
1557
1558         continue;
1559       }
1560       // Just a scalar
1561       const PointerType *PTy = dyn_cast<PointerType>(Ty);
1562       if (isKernelFunc) {
1563         if (PTy) {
1564           // Special handling for pointer arguments to kernel
1565           O << "\t.param .u" << thePointerTy.getSizeInBits() << " ";
1566
1567           if (nvptxSubtarget.getDrvInterface() != NVPTX::CUDA) {
1568             Type *ETy = PTy->getElementType();
1569             int addrSpace = PTy->getAddressSpace();
1570             switch (addrSpace) {
1571             default:
1572               O << ".ptr ";
1573               break;
1574             case llvm::ADDRESS_SPACE_CONST_NOT_GEN:
1575               O << ".ptr .const ";
1576               break;
1577             case llvm::ADDRESS_SPACE_SHARED:
1578               O << ".ptr .shared ";
1579               break;
1580             case llvm::ADDRESS_SPACE_GLOBAL:
1581             case llvm::ADDRESS_SPACE_CONST:
1582               O << ".ptr .global ";
1583               break;
1584             }
1585             O << ".align " << (int) getOpenCLAlignment(TD, ETy) << " ";
1586           }
1587           printParamName(I, paramIndex, O);
1588           continue;
1589         }
1590
1591         // non-pointer scalar to kernel func
1592         O << "\t.param .";
1593         // Special case: predicate operands become .u8 types
1594         if (Ty->isIntegerTy(1))
1595           O << "u8";
1596         else
1597           O << getPTXFundamentalTypeStr(Ty);
1598         O << " ";
1599         printParamName(I, paramIndex, O);
1600         continue;
1601       }
1602       // Non-kernel function, just print .param .b<size> for ABI
1603       // and .reg .b<size> for non ABY
1604       unsigned sz = 0;
1605       if (isa<IntegerType>(Ty)) {
1606         sz = cast<IntegerType>(Ty)->getBitWidth();
1607         if (sz < 32)
1608           sz = 32;
1609       } else if (isa<PointerType>(Ty))
1610         sz = thePointerTy.getSizeInBits();
1611       else
1612         sz = Ty->getPrimitiveSizeInBits();
1613       if (isABI)
1614         O << "\t.param .b" << sz << " ";
1615       else
1616         O << "\t.reg .b" << sz << " ";
1617       printParamName(I, paramIndex, O);
1618       continue;
1619     }
1620
1621     // param has byVal attribute. So should be a pointer
1622     const PointerType *PTy = dyn_cast<PointerType>(Ty);
1623     assert(PTy && "Param with byval attribute should be a pointer type");
1624     Type *ETy = PTy->getElementType();
1625
1626     if (isABI || isKernelFunc) {
1627       // Just print .param .b8 .align <a> .param[size];
1628       // <a> = PAL.getparamalignment
1629       // size = typeallocsize of element type
1630       unsigned align = PAL.getParamAlignment(paramIndex + 1);
1631       if (align == 0)
1632         align = TD->getABITypeAlignment(ETy);
1633
1634       unsigned sz = TD->getTypeAllocSize(ETy);
1635       O << "\t.param .align " << align << " .b8 ";
1636       printParamName(I, paramIndex, O);
1637       O << "[" << sz << "]";
1638       continue;
1639     } else {
1640       // Split the ETy into constituent parts and
1641       // print .param .b<size> <name> for each part.
1642       // Further, if a part is vector, print the above for
1643       // each vector element.
1644       SmallVector<EVT, 16> vtparts;
1645       ComputeValueVTs(*TLI, ETy, vtparts);
1646       for (unsigned i = 0, e = vtparts.size(); i != e; ++i) {
1647         unsigned elems = 1;
1648         EVT elemtype = vtparts[i];
1649         if (vtparts[i].isVector()) {
1650           elems = vtparts[i].getVectorNumElements();
1651           elemtype = vtparts[i].getVectorElementType();
1652         }
1653
1654         for (unsigned j = 0, je = elems; j != je; ++j) {
1655           unsigned sz = elemtype.getSizeInBits();
1656           if (elemtype.isInteger() && (sz < 32))
1657             sz = 32;
1658           O << "\t.reg .b" << sz << " ";
1659           printParamName(I, paramIndex, O);
1660           if (j < je - 1)
1661             O << ",\n";
1662           ++paramIndex;
1663         }
1664         if (i < e - 1)
1665           O << ",\n";
1666       }
1667       --paramIndex;
1668       continue;
1669     }
1670   }
1671
1672   O << "\n)\n";
1673 }
1674
1675 void NVPTXAsmPrinter::emitFunctionParamList(const MachineFunction &MF,
1676                                             raw_ostream &O) {
1677   const Function *F = MF.getFunction();
1678   emitFunctionParamList(F, O);
1679 }
1680
1681 void NVPTXAsmPrinter::setAndEmitFunctionVirtualRegisters(
1682     const MachineFunction &MF) {
1683   SmallString<128> Str;
1684   raw_svector_ostream O(Str);
1685
1686   // Map the global virtual register number to a register class specific
1687   // virtual register number starting from 1 with that class.
1688   const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
1689   //unsigned numRegClasses = TRI->getNumRegClasses();
1690
1691   // Emit the Fake Stack Object
1692   const MachineFrameInfo *MFI = MF.getFrameInfo();
1693   int NumBytes = (int) MFI->getStackSize();
1694   if (NumBytes) {
1695     O << "\t.local .align " << MFI->getMaxAlignment() << " .b8 \t" << DEPOTNAME
1696       << getFunctionNumber() << "[" << NumBytes << "];\n";
1697     if (nvptxSubtarget.is64Bit()) {
1698       O << "\t.reg .b64 \t%SP;\n";
1699       O << "\t.reg .b64 \t%SPL;\n";
1700     } else {
1701       O << "\t.reg .b32 \t%SP;\n";
1702       O << "\t.reg .b32 \t%SPL;\n";
1703     }
1704   }
1705
1706   // Go through all virtual registers to establish the mapping between the
1707   // global virtual
1708   // register number and the per class virtual register number.
1709   // We use the per class virtual register number in the ptx output.
1710   unsigned int numVRs = MRI->getNumVirtRegs();
1711   for (unsigned i = 0; i < numVRs; i++) {
1712     unsigned int vr = TRI->index2VirtReg(i);
1713     const TargetRegisterClass *RC = MRI->getRegClass(vr);
1714     std::map<unsigned, unsigned> &regmap = VRidGlobal2LocalMap[RC->getID()];
1715     int n = regmap.size();
1716     regmap.insert(std::make_pair(vr, n + 1));
1717   }
1718
1719   // Emit register declarations
1720   // @TODO: Extract out the real register usage
1721   O << "\t.reg .pred %p<" << NVPTXNumRegisters << ">;\n";
1722   O << "\t.reg .s16 %rc<" << NVPTXNumRegisters << ">;\n";
1723   O << "\t.reg .s16 %rs<" << NVPTXNumRegisters << ">;\n";
1724   O << "\t.reg .s32 %r<" << NVPTXNumRegisters << ">;\n";
1725   O << "\t.reg .s64 %rl<" << NVPTXNumRegisters << ">;\n";
1726   O << "\t.reg .f32 %f<" << NVPTXNumRegisters << ">;\n";
1727   O << "\t.reg .f64 %fl<" << NVPTXNumRegisters << ">;\n";
1728
1729   // Emit declaration of the virtual registers or 'physical' registers for
1730   // each register class
1731   //for (unsigned i=0; i< numRegClasses; i++) {
1732   //    std::map<unsigned, unsigned> &regmap = VRidGlobal2LocalMap[i];
1733   //    const TargetRegisterClass *RC = TRI->getRegClass(i);
1734   //    std::string rcname = getNVPTXRegClassName(RC);
1735   //    std::string rcStr = getNVPTXRegClassStr(RC);
1736   //    //int n = regmap.size();
1737   //    if (!isNVPTXVectorRegClass(RC)) {
1738   //      O << "\t.reg " << rcname << " \t" << rcStr << "<"
1739   //        << NVPTXNumRegisters << ">;\n";
1740   //    }
1741
1742   // Only declare those registers that may be used. And do not emit vector
1743   // registers as
1744   // they are all elementized to scalar registers.
1745   //if (n && !isNVPTXVectorRegClass(RC)) {
1746   //    if (RegAllocNilUsed) {
1747   //        O << "\t.reg " << rcname << " \t" << rcStr << "<" << (n+1)
1748   //          << ">;\n";
1749   //    }
1750   //    else {
1751   //        O << "\t.reg " << rcname << " \t" << StrToUpper(rcStr)
1752   //          << "<" << 32 << ">;\n";
1753   //    }
1754   //}
1755   //}
1756
1757   OutStreamer.EmitRawText(O.str());
1758 }
1759
1760 void NVPTXAsmPrinter::printFPConstant(const ConstantFP *Fp, raw_ostream &O) {
1761   APFloat APF = APFloat(Fp->getValueAPF()); // make a copy
1762   bool ignored;
1763   unsigned int numHex;
1764   const char *lead;
1765
1766   if (Fp->getType()->getTypeID() == Type::FloatTyID) {
1767     numHex = 8;
1768     lead = "0f";
1769     APF.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &ignored);
1770   } else if (Fp->getType()->getTypeID() == Type::DoubleTyID) {
1771     numHex = 16;
1772     lead = "0d";
1773     APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &ignored);
1774   } else
1775     llvm_unreachable("unsupported fp type");
1776
1777   APInt API = APF.bitcastToAPInt();
1778   std::string hexstr(utohexstr(API.getZExtValue()));
1779   O << lead;
1780   if (hexstr.length() < numHex)
1781     O << std::string(numHex - hexstr.length(), '0');
1782   O << utohexstr(API.getZExtValue());
1783 }
1784
1785 void NVPTXAsmPrinter::printScalarConstant(const Constant *CPV, raw_ostream &O) {
1786   if (const ConstantInt *CI = dyn_cast<ConstantInt>(CPV)) {
1787     O << CI->getValue();
1788     return;
1789   }
1790   if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CPV)) {
1791     printFPConstant(CFP, O);
1792     return;
1793   }
1794   if (isa<ConstantPointerNull>(CPV)) {
1795     O << "0";
1796     return;
1797   }
1798   if (const GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
1799     O << *Mang->getSymbol(GVar);
1800     return;
1801   }
1802   if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
1803     const Value *v = Cexpr->stripPointerCasts();
1804     if (const GlobalValue *GVar = dyn_cast<GlobalValue>(v)) {
1805       O << *Mang->getSymbol(GVar);
1806       return;
1807     } else {
1808       O << *LowerConstant(CPV, *this);
1809       return;
1810     }
1811   }
1812   llvm_unreachable("Not scalar type found in printScalarConstant()");
1813 }
1814
1815 void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
1816                                    AggBuffer *aggBuffer) {
1817
1818   const DataLayout *TD = TM.getDataLayout();
1819
1820   if (isa<UndefValue>(CPV) || CPV->isNullValue()) {
1821     int s = TD->getTypeAllocSize(CPV->getType());
1822     if (s < Bytes)
1823       s = Bytes;
1824     aggBuffer->addZeros(s);
1825     return;
1826   }
1827
1828   unsigned char *ptr;
1829   switch (CPV->getType()->getTypeID()) {
1830
1831   case Type::IntegerTyID: {
1832     const Type *ETy = CPV->getType();
1833     if (ETy == Type::getInt8Ty(CPV->getContext())) {
1834       unsigned char c =
1835           (unsigned char)(dyn_cast<ConstantInt>(CPV))->getZExtValue();
1836       ptr = &c;
1837       aggBuffer->addBytes(ptr, 1, Bytes);
1838     } else if (ETy == Type::getInt16Ty(CPV->getContext())) {
1839       short int16 = (short)(dyn_cast<ConstantInt>(CPV))->getZExtValue();
1840       ptr = (unsigned char *)&int16;
1841       aggBuffer->addBytes(ptr, 2, Bytes);
1842     } else if (ETy == Type::getInt32Ty(CPV->getContext())) {
1843       if (const ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
1844         int int32 = (int)(constInt->getZExtValue());
1845         ptr = (unsigned char *)&int32;
1846         aggBuffer->addBytes(ptr, 4, Bytes);
1847         break;
1848       } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
1849         if (const ConstantInt *constInt = dyn_cast<ConstantInt>(
1850                 ConstantFoldConstantExpression(Cexpr, TD))) {
1851           int int32 = (int)(constInt->getZExtValue());
1852           ptr = (unsigned char *)&int32;
1853           aggBuffer->addBytes(ptr, 4, Bytes);
1854           break;
1855         }
1856         if (Cexpr->getOpcode() == Instruction::PtrToInt) {
1857           Value *v = Cexpr->getOperand(0)->stripPointerCasts();
1858           aggBuffer->addSymbol(v);
1859           aggBuffer->addZeros(4);
1860           break;
1861         }
1862       }
1863       llvm_unreachable("unsupported integer const type");
1864     } else if (ETy == Type::getInt64Ty(CPV->getContext())) {
1865       if (const ConstantInt *constInt = dyn_cast<ConstantInt>(CPV)) {
1866         long long int64 = (long long)(constInt->getZExtValue());
1867         ptr = (unsigned char *)&int64;
1868         aggBuffer->addBytes(ptr, 8, Bytes);
1869         break;
1870       } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
1871         if (const ConstantInt *constInt = dyn_cast<ConstantInt>(
1872                 ConstantFoldConstantExpression(Cexpr, TD))) {
1873           long long int64 = (long long)(constInt->getZExtValue());
1874           ptr = (unsigned char *)&int64;
1875           aggBuffer->addBytes(ptr, 8, Bytes);
1876           break;
1877         }
1878         if (Cexpr->getOpcode() == Instruction::PtrToInt) {
1879           Value *v = Cexpr->getOperand(0)->stripPointerCasts();
1880           aggBuffer->addSymbol(v);
1881           aggBuffer->addZeros(8);
1882           break;
1883         }
1884       }
1885       llvm_unreachable("unsupported integer const type");
1886     } else
1887       llvm_unreachable("unsupported integer const type");
1888     break;
1889   }
1890   case Type::FloatTyID:
1891   case Type::DoubleTyID: {
1892     const ConstantFP *CFP = dyn_cast<ConstantFP>(CPV);
1893     const Type *Ty = CFP->getType();
1894     if (Ty == Type::getFloatTy(CPV->getContext())) {
1895       float float32 = (float) CFP->getValueAPF().convertToFloat();
1896       ptr = (unsigned char *)&float32;
1897       aggBuffer->addBytes(ptr, 4, Bytes);
1898     } else if (Ty == Type::getDoubleTy(CPV->getContext())) {
1899       double float64 = CFP->getValueAPF().convertToDouble();
1900       ptr = (unsigned char *)&float64;
1901       aggBuffer->addBytes(ptr, 8, Bytes);
1902     } else {
1903       llvm_unreachable("unsupported fp const type");
1904     }
1905     break;
1906   }
1907   case Type::PointerTyID: {
1908     if (const GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
1909       aggBuffer->addSymbol(GVar);
1910     } else if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
1911       const Value *v = Cexpr->stripPointerCasts();
1912       aggBuffer->addSymbol(v);
1913     }
1914     unsigned int s = TD->getTypeAllocSize(CPV->getType());
1915     aggBuffer->addZeros(s);
1916     break;
1917   }
1918
1919   case Type::ArrayTyID:
1920   case Type::VectorTyID:
1921   case Type::StructTyID: {
1922     if (isa<ConstantArray>(CPV) || isa<ConstantVector>(CPV) ||
1923         isa<ConstantStruct>(CPV)) {
1924       int ElementSize = TD->getTypeAllocSize(CPV->getType());
1925       bufferAggregateConstant(CPV, aggBuffer);
1926       if (Bytes > ElementSize)
1927         aggBuffer->addZeros(Bytes - ElementSize);
1928     } else if (isa<ConstantAggregateZero>(CPV))
1929       aggBuffer->addZeros(Bytes);
1930     else
1931       llvm_unreachable("Unexpected Constant type");
1932     break;
1933   }
1934
1935   default:
1936     llvm_unreachable("unsupported type");
1937   }
1938 }
1939
1940 void NVPTXAsmPrinter::bufferAggregateConstant(const Constant *CPV,
1941                                               AggBuffer *aggBuffer) {
1942   const DataLayout *TD = TM.getDataLayout();
1943   int Bytes;
1944
1945   // Old constants
1946   if (isa<ConstantArray>(CPV) || isa<ConstantVector>(CPV)) {
1947     if (CPV->getNumOperands())
1948       for (unsigned i = 0, e = CPV->getNumOperands(); i != e; ++i)
1949         bufferLEByte(cast<Constant>(CPV->getOperand(i)), 0, aggBuffer);
1950     return;
1951   }
1952
1953   if (const ConstantDataSequential *CDS =
1954           dyn_cast<ConstantDataSequential>(CPV)) {
1955     if (CDS->getNumElements())
1956       for (unsigned i = 0; i < CDS->getNumElements(); ++i)
1957         bufferLEByte(cast<Constant>(CDS->getElementAsConstant(i)), 0,
1958                      aggBuffer);
1959     return;
1960   }
1961
1962   if (isa<ConstantStruct>(CPV)) {
1963     if (CPV->getNumOperands()) {
1964       StructType *ST = cast<StructType>(CPV->getType());
1965       for (unsigned i = 0, e = CPV->getNumOperands(); i != e; ++i) {
1966         if (i == (e - 1))
1967           Bytes = TD->getStructLayout(ST)->getElementOffset(0) +
1968                   TD->getTypeAllocSize(ST) -
1969                   TD->getStructLayout(ST)->getElementOffset(i);
1970         else
1971           Bytes = TD->getStructLayout(ST)->getElementOffset(i + 1) -
1972                   TD->getStructLayout(ST)->getElementOffset(i);
1973         bufferLEByte(cast<Constant>(CPV->getOperand(i)), Bytes, aggBuffer);
1974       }
1975     }
1976     return;
1977   }
1978   llvm_unreachable("unsupported constant type in printAggregateConstant()");
1979 }
1980
1981 // buildTypeNameMap - Run through symbol table looking for type names.
1982 //
1983
1984 bool NVPTXAsmPrinter::isImageType(const Type *Ty) {
1985
1986   std::map<const Type *, std::string>::iterator PI = TypeNameMap.find(Ty);
1987
1988   if (PI != TypeNameMap.end() && (!PI->second.compare("struct._image1d_t") ||
1989                                   !PI->second.compare("struct._image2d_t") ||
1990                                   !PI->second.compare("struct._image3d_t")))
1991     return true;
1992
1993   return false;
1994 }
1995
1996 /// PrintAsmOperand - Print out an operand for an inline asm expression.
1997 ///
1998 bool NVPTXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
1999                                       unsigned AsmVariant,
2000                                       const char *ExtraCode, raw_ostream &O) {
2001   if (ExtraCode && ExtraCode[0]) {
2002     if (ExtraCode[1] != 0)
2003       return true; // Unknown modifier.
2004
2005     switch (ExtraCode[0]) {
2006     default:
2007       // See if this is a generic print operand
2008       return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O);
2009     case 'r':
2010       break;
2011     }
2012   }
2013
2014   printOperand(MI, OpNo, O);
2015
2016   return false;
2017 }
2018
2019 bool NVPTXAsmPrinter::PrintAsmMemoryOperand(
2020     const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant,
2021     const char *ExtraCode, raw_ostream &O) {
2022   if (ExtraCode && ExtraCode[0])
2023     return true; // Unknown modifier
2024
2025   O << '[';
2026   printMemOperand(MI, OpNo, O);
2027   O << ']';
2028
2029   return false;
2030 }
2031
2032 bool NVPTXAsmPrinter::ignoreLoc(const MachineInstr &MI) {
2033   switch (MI.getOpcode()) {
2034   default:
2035     return false;
2036   case NVPTX::CallArgBeginInst:
2037   case NVPTX::CallArgEndInst0:
2038   case NVPTX::CallArgEndInst1:
2039   case NVPTX::CallArgF32:
2040   case NVPTX::CallArgF64:
2041   case NVPTX::CallArgI16:
2042   case NVPTX::CallArgI32:
2043   case NVPTX::CallArgI32imm:
2044   case NVPTX::CallArgI64:
2045   case NVPTX::CallArgI8:
2046   case NVPTX::CallArgParam:
2047   case NVPTX::CallVoidInst:
2048   case NVPTX::CallVoidInstReg:
2049   case NVPTX::Callseq_End:
2050   case NVPTX::CallVoidInstReg64:
2051   case NVPTX::DeclareParamInst:
2052   case NVPTX::DeclareRetMemInst:
2053   case NVPTX::DeclareRetRegInst:
2054   case NVPTX::DeclareRetScalarInst:
2055   case NVPTX::DeclareScalarParamInst:
2056   case NVPTX::DeclareScalarRegInst:
2057   case NVPTX::StoreParamF32:
2058   case NVPTX::StoreParamF64:
2059   case NVPTX::StoreParamI16:
2060   case NVPTX::StoreParamI32:
2061   case NVPTX::StoreParamI64:
2062   case NVPTX::StoreParamI8:
2063   case NVPTX::StoreParamS32I8:
2064   case NVPTX::StoreParamU32I8:
2065   case NVPTX::StoreParamS32I16:
2066   case NVPTX::StoreParamU32I16:
2067   case NVPTX::StoreRetvalF32:
2068   case NVPTX::StoreRetvalF64:
2069   case NVPTX::StoreRetvalI16:
2070   case NVPTX::StoreRetvalI32:
2071   case NVPTX::StoreRetvalI64:
2072   case NVPTX::StoreRetvalI8:
2073   case NVPTX::LastCallArgF32:
2074   case NVPTX::LastCallArgF64:
2075   case NVPTX::LastCallArgI16:
2076   case NVPTX::LastCallArgI32:
2077   case NVPTX::LastCallArgI32imm:
2078   case NVPTX::LastCallArgI64:
2079   case NVPTX::LastCallArgI8:
2080   case NVPTX::LastCallArgParam:
2081   case NVPTX::LoadParamMemF32:
2082   case NVPTX::LoadParamMemF64:
2083   case NVPTX::LoadParamMemI16:
2084   case NVPTX::LoadParamMemI32:
2085   case NVPTX::LoadParamMemI64:
2086   case NVPTX::LoadParamMemI8:
2087   case NVPTX::LoadParamRegF32:
2088   case NVPTX::LoadParamRegF64:
2089   case NVPTX::LoadParamRegI16:
2090   case NVPTX::LoadParamRegI32:
2091   case NVPTX::LoadParamRegI64:
2092   case NVPTX::LoadParamRegI8:
2093   case NVPTX::PrototypeInst:
2094   case NVPTX::DBG_VALUE:
2095     return true;
2096   }
2097   return false;
2098 }
2099
2100 // Force static initialization.
2101 extern "C" void LLVMInitializeNVPTXBackendAsmPrinter() {
2102   RegisterAsmPrinter<NVPTXAsmPrinter> X(TheNVPTXTarget32);
2103   RegisterAsmPrinter<NVPTXAsmPrinter> Y(TheNVPTXTarget64);
2104 }
2105
2106 void NVPTXAsmPrinter::emitSrcInText(StringRef filename, unsigned line) {
2107   std::stringstream temp;
2108   LineReader *reader = this->getReader(filename.str());
2109   temp << "\n//";
2110   temp << filename.str();
2111   temp << ":";
2112   temp << line;
2113   temp << " ";
2114   temp << reader->readLine(line);
2115   temp << "\n";
2116   this->OutStreamer.EmitRawText(Twine(temp.str()));
2117 }
2118
2119 LineReader *NVPTXAsmPrinter::getReader(std::string filename) {
2120   if (reader == NULL) {
2121     reader = new LineReader(filename);
2122   }
2123
2124   if (reader->fileName() != filename) {
2125     delete reader;
2126     reader = new LineReader(filename);
2127   }
2128
2129   return reader;
2130 }
2131
2132 std::string LineReader::readLine(unsigned lineNum) {
2133   if (lineNum < theCurLine) {
2134     theCurLine = 0;
2135     fstr.seekg(0, std::ios::beg);
2136   }
2137   while (theCurLine < lineNum) {
2138     fstr.getline(buff, 500);
2139     theCurLine++;
2140   }
2141   return buff;
2142 }
2143
2144 // Force static initialization.
2145 extern "C" void LLVMInitializeNVPTXAsmPrinter() {
2146   RegisterAsmPrinter<NVPTXAsmPrinter> X(TheNVPTXTarget32);
2147   RegisterAsmPrinter<NVPTXAsmPrinter> Y(TheNVPTXTarget64);
2148 }