#include "NVPTXAsmPrinter.h"
#include "MCTargetDesc/NVPTXBaseInfo.h"
#include "MCTargetDesc/NVPTXInstPrinter.h"
#include "MCTargetDesc/NVPTXMCAsmInfo.h"
#include "MCTargetDesc/NVPTXTargetStreamer.h"
#include "NVPTX.h"
#include "NVPTXMCExpr.h"
#include "NVPTXMachineFunctionInfo.h"
#include "NVPTXRegisterInfo.h"
#include "NVPTXSubtarget.h"
#include "NVPTXTargetMachine.h"
#include "NVPTXUtilities.h"
#include "TargetInfo/NVPTXTargetInfo.h"
#include "cl_common_defines.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/CodeGen/Analysis.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/NativeFormatting.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Utils/UnrollLoop.h"
#include <cassert>
#include <cstdint>
#include <cstring>
#include <new>
#include <string>
#include <utility>
#include <vector>
usingnamespacellvm;
static cl::opt<bool>
LowerCtorDtor("nvptx-lower-global-ctor-dtor",
cl::desc("Lower GPU ctor / dtors to globals on the device."),
cl::init(false), cl::Hidden);
#define DEPOTNAME …
static void
DiscoverDependentGlobals(const Value *V,
DenseSet<const GlobalVariable *> &Globals) { … }
static void
VisitGlobalVariableForEmission(const GlobalVariable *GV,
SmallVectorImpl<const GlobalVariable *> &Order,
DenseSet<const GlobalVariable *> &Visited,
DenseSet<const GlobalVariable *> &Visiting) { … }
void NVPTXAsmPrinter::emitInstruction(const MachineInstr *MI) { … }
bool NVPTXAsmPrinter::lowerImageHandleOperand(const MachineInstr *MI,
unsigned OpNo, MCOperand &MCOp) { … }
void NVPTXAsmPrinter::lowerImageHandleSymbol(unsigned Index, MCOperand &MCOp) { … }
void NVPTXAsmPrinter::lowerToMCInst(const MachineInstr *MI, MCInst &OutMI) { … }
bool NVPTXAsmPrinter::lowerOperand(const MachineOperand &MO,
MCOperand &MCOp) { … }
unsigned NVPTXAsmPrinter::encodeVirtualRegister(unsigned Reg) { … }
MCOperand NVPTXAsmPrinter::GetSymbolRef(const MCSymbol *Symbol) { … }
static bool ShouldPassAsArray(Type *Ty) { … }
void NVPTXAsmPrinter::printReturnValStr(const Function *F, raw_ostream &O) { … }
void NVPTXAsmPrinter::printReturnValStr(const MachineFunction &MF,
raw_ostream &O) { … }
bool NVPTXAsmPrinter::isLoopHeaderOfNoUnroll(
const MachineBasicBlock &MBB) const { … }
void NVPTXAsmPrinter::emitBasicBlockStart(const MachineBasicBlock &MBB) { … }
void NVPTXAsmPrinter::emitFunctionEntryLabel() { … }
bool NVPTXAsmPrinter::runOnMachineFunction(MachineFunction &F) { … }
void NVPTXAsmPrinter::emitFunctionBodyStart() { … }
void NVPTXAsmPrinter::emitFunctionBodyEnd() { … }
const MCSymbol *NVPTXAsmPrinter::getFunctionFrameSymbol() const { … }
void NVPTXAsmPrinter::emitImplicitDef(const MachineInstr *MI) const { … }
void NVPTXAsmPrinter::emitKernelFunctionDirectives(const Function &F,
raw_ostream &O) const { … }
std::string NVPTXAsmPrinter::getVirtualRegisterName(unsigned Reg) const { … }
void NVPTXAsmPrinter::emitVirtualRegister(unsigned int vr,
raw_ostream &O) { … }
void NVPTXAsmPrinter::emitAliasDeclaration(const GlobalAlias *GA,
raw_ostream &O) { … }
void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) { … }
void NVPTXAsmPrinter::emitDeclarationWithName(const Function *F, MCSymbol *S,
raw_ostream &O) { … }
static bool usedInGlobalVarDef(const Constant *C) { … }
static bool usedInOneFunc(const User *U, Function const *&oneFunc) { … }
static bool canDemoteGlobalVar(const GlobalVariable *gv, Function const *&f) { … }
static bool useFuncSeen(const Constant *C,
DenseMap<const Function *, bool> &seenMap) { … }
void NVPTXAsmPrinter::emitDeclarations(const Module &M, raw_ostream &O) { … }
static bool isEmptyXXStructor(GlobalVariable *GV) { … }
void NVPTXAsmPrinter::emitStartOfAsmFile(Module &M) { … }
bool NVPTXAsmPrinter::doInitialization(Module &M) { … }
void NVPTXAsmPrinter::emitGlobals(const Module &M) { … }
void NVPTXAsmPrinter::emitGlobalAlias(const Module &M, const GlobalAlias &GA) { … }
void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O,
const NVPTXSubtarget &STI) { … }
bool NVPTXAsmPrinter::doFinalization(Module &M) { … }
void NVPTXAsmPrinter::emitLinkageDirective(const GlobalValue *V,
raw_ostream &O) { … }
void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar,
raw_ostream &O, bool processDemoted,
const NVPTXSubtarget &STI) { … }
void NVPTXAsmPrinter::AggBuffer::printSymbol(unsigned nSym, raw_ostream &os) { … }
void NVPTXAsmPrinter::AggBuffer::printBytes(raw_ostream &os) { … }
void NVPTXAsmPrinter::AggBuffer::printWords(raw_ostream &os) { … }
void NVPTXAsmPrinter::emitDemotedVars(const Function *f, raw_ostream &O) { … }
void NVPTXAsmPrinter::emitPTXAddressSpace(unsigned int AddressSpace,
raw_ostream &O) const { … }
std::string
NVPTXAsmPrinter::getPTXFundamentalTypeStr(Type *Ty, bool useB4PTR) const { … }
void NVPTXAsmPrinter::emitPTXGlobalVariable(const GlobalVariable *GVar,
raw_ostream &O,
const NVPTXSubtarget &STI) { … }
void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) { … }
void NVPTXAsmPrinter::setAndEmitFunctionVirtualRegisters(
const MachineFunction &MF) { … }
void NVPTXAsmPrinter::encodeDebugInfoRegisterNumbers(
const MachineFunction &MF) { … }
void NVPTXAsmPrinter::printFPConstant(const ConstantFP *Fp, raw_ostream &O) { … }
void NVPTXAsmPrinter::printScalarConstant(const Constant *CPV, raw_ostream &O) { … }
void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
AggBuffer *AggBuffer) { … }
void NVPTXAsmPrinter::bufferAggregateConstant(const Constant *CPV,
AggBuffer *aggBuffer) { … }
const MCExpr *
NVPTXAsmPrinter::lowerConstantForGV(const Constant *CV, bool ProcessingGeneric) { … }
void NVPTXAsmPrinter::printMCExpr(const MCExpr &Expr, raw_ostream &OS) { … }
bool NVPTXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
const char *ExtraCode, raw_ostream &O) { … }
bool NVPTXAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
unsigned OpNo,
const char *ExtraCode,
raw_ostream &O) { … }
void NVPTXAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
raw_ostream &O) { … }
void NVPTXAsmPrinter::printMemOperand(const MachineInstr *MI, unsigned OpNum,
raw_ostream &O, const char *Modifier) { … }
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeNVPTXAsmPrinter() { … }