15 #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXASMPRINTER_H
16 #define LLVM_LIB_TARGET_NVPTX_NVPTXASMPRINTER_H
50 std::string theFileName;
55 fstr.open(filename.c_str());
87 std::vector<unsigned char> buffer;
105 :
size(size), buffer(size), O(O), AP(AP) {
108 EmitGeneric = AP.EmitGeneric;
110 unsigned addBytes(
unsigned char *Ptr,
int Num,
int Bytes) {
111 assert((curpos + Num) <= size);
112 assert((curpos + Bytes) <= size);
113 for (
int i = 0; i < Num; ++i) {
114 buffer[curpos] = Ptr[i];
117 for (
int i = Num; i < Bytes; ++i) {
123 unsigned addZeros(
int Num) {
124 assert((curpos + Num) <= size);
125 for (
int i = 0; i < Num; ++i) {
131 void addSymbol(
const Value *GVar,
const Value *GVarBeforeStripping) {
132 symbolPosInBuffer.push_back(curpos);
134 SymbolsBeforeStripping.push_back(GVarBeforeStripping);
138 if (numSymbols == 0) {
140 for (
unsigned i = 0; i <
size; i++) {
143 O << (
unsigned int) buffer[i];
147 unsigned int pos = 0;
148 unsigned int nSym = 0;
149 unsigned int nextSymbolPos = symbolPosInBuffer[nSym];
150 unsigned int nBytes = 4;
151 if (static_cast<const NVPTXTargetMachine &>(AP.
TM).is64Bit())
153 for (pos = 0; pos <
size; pos += nBytes) {
156 if (pos == nextSymbolPos) {
158 const Value *v0 = SymbolsBeforeStripping[nSym];
159 if (
const GlobalValue *GVar = dyn_cast<GlobalValue>(v)) {
162 bool IsNonGenericPointer =
false;
164 IsNonGenericPointer =
true;
166 if (EmitGeneric && !isa<Function>(v) && !IsNonGenericPointer) {
173 }
else if (
const ConstantExpr *CExpr = dyn_cast<ConstantExpr>(v0)) {
175 AP.lowerConstantForGV(cast<Constant>(CExpr),
false);
176 AP.printMCExpr(*Expr, O);
180 if (nSym >= numSymbols)
181 nextSymbolPos = size + 1;
183 nextSymbolPos = symbolPosInBuffer[nSym];
184 }
else if (nBytes == 4)
185 O << *(
unsigned int *)(&buffer[pos]);
187 O << *(
unsigned long long *)(&buffer[pos]);
193 friend class AggBuffer;
198 const char *getPassName()
const override {
return "NVPTX Assembly Printer"; }
201 std::string CurrentFnName;
204 void EmitFunctionEntryLabel()
override;
205 void EmitFunctionBodyStart()
override;
206 void EmitFunctionBodyEnd()
override;
213 unsigned encodeVirtualRegister(
unsigned Reg);
215 void EmitAlignment(
unsigned NumBits,
const GlobalValue *GV =
nullptr)
const {}
217 void printVecModifiedImmediate(
const MachineOperand &MO,
const char *Modifier,
219 void printMemOperand(
const MachineInstr *
MI,
int opNum, raw_ostream &O,
220 const char *Modifier =
nullptr);
221 void printImplicitDef(
const MachineInstr *
MI, raw_ostream &O)
const;
222 void printModuleLevelGV(
const GlobalVariable *GVar, raw_ostream &O,
224 void printParamName(
int paramIndex, raw_ostream &O);
227 void emitGlobals(
const Module &M);
228 void emitHeader(Module &M, raw_ostream &O,
const NVPTXSubtarget &STI);
229 void emitKernelFunctionDirectives(
const Function &
F, raw_ostream &O)
const;
230 void emitVirtualRegister(
unsigned int vr, raw_ostream &);
231 void emitFunctionExternParamList(
const MachineFunction &MF);
232 void emitFunctionParamList(
const Function *, raw_ostream &O);
233 void emitFunctionParamList(
const MachineFunction &MF, raw_ostream &O);
234 void setAndEmitFunctionVirtualRegisters(
const MachineFunction &MF);
235 void emitFunctionTempData(
const MachineFunction &MF,
unsigned &FrameSize);
236 bool isImageType(
const Type *Ty);
237 void printReturnValStr(
const Function *, raw_ostream &O);
238 void printReturnValStr(
const MachineFunction &MF, raw_ostream &O);
239 bool PrintAsmOperand(
const MachineInstr *
MI,
unsigned OpNo,
240 unsigned AsmVariant,
const char *ExtraCode,
241 raw_ostream &)
override;
242 void printOperand(
const MachineInstr *
MI,
int opNum, raw_ostream &O,
243 const char *Modifier =
nullptr);
244 bool PrintAsmMemoryOperand(
const MachineInstr *
MI,
unsigned OpNo,
245 unsigned AsmVariant,
const char *ExtraCode,
246 raw_ostream &)
override;
248 const MCExpr *lowerConstantForGV(
const Constant *CV,
bool ProcessingGeneric);
249 void printMCExpr(
const MCExpr &Expr, raw_ostream &OS);
252 bool doInitialization(Module &M)
override;
253 bool doFinalization(Module &M)
override;
256 std::string CurrentBankselLabelInBasicBlock;
261 const MachineRegisterInfo *MRI;
265 typedef DenseMap<unsigned, unsigned> VRegMap;
266 typedef DenseMap<const TargetRegisterClass *, VRegMap> VRegRCMap;
267 VRegRCMap VRegMapping;
270 const NVPTXSubtarget *nvptxSubtarget;
274 std::map<const Type *, std::string> TypeNameMap;
277 std::map<const Function *, std::vector<const GlobalVariable *> > localDecls;
280 std::map<std::string, unsigned> filenameMap;
281 void recordAndEmitFilenames(Module &);
283 void emitPTXGlobalVariable(
const GlobalVariable *GVar, raw_ostream &O);
284 void emitPTXAddressSpace(
unsigned int AddressSpace, raw_ostream &O)
const;
285 std::string getPTXFundamentalTypeStr(
const Type *Ty,
bool =
true)
const;
286 void printScalarConstant(
const Constant *CPV, raw_ostream &O);
287 void printFPConstant(
const ConstantFP *Fp, raw_ostream &O);
288 void bufferLEByte(
const Constant *CPV,
int Bytes, AggBuffer *aggBuffer);
289 void bufferAggregateConstant(
const Constant *CV, AggBuffer *aggBuffer);
291 void printOperandProper(
const MachineOperand &MO);
293 void emitLinkageDirective(
const GlobalValue *V, raw_ostream &O);
294 void emitDeclarations(
const Module &, raw_ostream &O);
295 void emitDeclaration(
const Function *, raw_ostream &O);
298 void emitDemotedVars(
const Function *, raw_ostream &);
300 bool lowerImageHandleOperand(
const MachineInstr *
MI,
unsigned OpNo,
302 void lowerImageHandleSymbol(
unsigned Index, MCOperand &MCOp);
304 bool isLoopHeaderOfNoUnroll(
const MachineBasicBlock &MBB)
const;
307 LineReader *getReader(std::string);
327 CurrentBankselLabelInBasicBlock =
"";
347 std::string getVirtualRegisterName(
unsigned)
const;
MCSymbol * getSymbol(const GlobalValue *GV) const
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol, HexagonAsmPrinter &Printer)
unsigned getAddressSpace() const
Return the address space of the Pointer type.
std::string readLine(unsigned line)
AnalysisUsage & addRequired()
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Base class for the full range of assembler expressions which are needed for parsing.
Reg
All possible values of the reg field in the ModR/M byte.
static void printOperand(raw_ostream &OS, uint8_t Opcode, unsigned OperandIdx, uint64_t Operand, uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor)
Print Opcode's operand number OperandIdx which has value Operand.
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
static std::string getRegisterName(const TargetRegisterInfo *TRI, unsigned Reg)
ConstantExpr - a constant value that is initialized with an expression using other constant values...
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
Instances of this class represent a single low-level machine instruction.
PointerType - Class to represent pointers.
LineReader(std::string filename)
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
StringRef filename(StringRef path)
Get filename.
const MCAsmInfo * MAI
Target Asm Printer information.
TargetMachine & TM
Target machine description.
This class is intended to be used as a driving class for all asm writers.
Represent the analysis usage information of a pass.
#define LLVM_LIBRARY_VISIBILITY
LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked into a shared library...
NVPTXAsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
MachineOperand class - Representation of each machine instruction operand.
Type * getType() const
All values are typed, get the type of this value.
bool runOnMachineFunction(MachineFunction &F) override
Emit the specified function out to the OutStreamer.
LLVM_ATTRIBUTE_UNUSED_RESULT std::enable_if< !is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Representation of each machine instruction.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream...
Primary interface to the complete machine description for the target machine.
StringRef - Represent a constant reference to a string, i.e.
ArgumentListType::const_iterator const_arg_iterator
Instances of this class represent operands of the MCInst class.