From 68226a4d4627804c594d31344901455eb95ec93c Mon Sep 17 00:00:00 2001 From: Justin Holewinski Date: Sun, 9 Oct 2011 15:42:02 +0000 Subject: [PATCH] PTX: Print .ptr kernel attributes if PTX version >= 2.2 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141508 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PTX/PTXAsmPrinter.cpp | 38 +++++++++++++++++++++++++++++- lib/Target/PTX/PTXISelLowering.cpp | 6 +++++ lib/Target/PTX/PTXISelLowering.h | 2 ++ lib/Target/PTX/PTXSubtarget.h | 4 ++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/lib/Target/PTX/PTXAsmPrinter.cpp b/lib/Target/PTX/PTXAsmPrinter.cpp index 590a51b7b4d..733744bbd08 100644 --- a/lib/Target/PTX/PTXAsmPrinter.cpp +++ b/lib/Target/PTX/PTXAsmPrinter.cpp @@ -20,7 +20,9 @@ #include "PTXParamManager.h" #include "PTXRegisterInfo.h" #include "PTXTargetMachine.h" +#include "llvm/Argument.h" #include "llvm/DerivedTypes.h" +#include "llvm/Function.h" #include "llvm/Module.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" @@ -445,9 +447,11 @@ void PTXAsmPrinter::EmitFunctionEntryLabel() { decl += " ("; + const Function *F = MF->getFunction(); + // Print parameters if (isKernel || ST.useParamSpaceForDeviceArgs()) { - for (PTXParamManager::param_iterator i = PM.arg_begin(), e = PM.arg_end(), + /*for (PTXParamManager::param_iterator i = PM.arg_begin(), e = PM.arg_end(), b = i; i != e; ++i) { if (i != b) { decl += ", "; @@ -457,6 +461,38 @@ void PTXAsmPrinter::EmitFunctionEntryLabel() { decl += utostr(PM.getParamSize(*i)); decl += " "; decl += PM.getParamName(*i); + }*/ + int Counter = 1; + for (Function::const_arg_iterator i = F->arg_begin(), e = F->arg_end(), + b = i; i != e; ++i) { + if (i != b) + decl += ", "; + const Type *ArgType = (*i).getType(); + decl += ".param .b"; + if (ArgType->isPointerTy()) { + if (ST.is64Bit()) + decl += "64"; + else + decl += "32"; + } else { + decl += utostr(ArgType->getPrimitiveSizeInBits()); + } + if (ArgType->isPointerTy() && ST.emitPtrAttribute()) { + const PointerType *PtrType = dyn_cast(ArgType); + decl += " .ptr"; + switch (PtrType->getAddressSpace()) { + default: + llvm_unreachable("Unknown address space in argument"); + case PTXStateSpace::Global: + decl += " .global"; + break; + case PTXStateSpace::Shared: + decl += " .shared"; + break; + } + } + decl += " __param_"; + decl += utostr(Counter++); } } else { for (PTXMachineFunctionInfo::reg_iterator diff --git a/lib/Target/PTX/PTXISelLowering.cpp b/lib/Target/PTX/PTXISelLowering.cpp index f2234906d9d..3307d91a618 100644 --- a/lib/Target/PTX/PTXISelLowering.cpp +++ b/lib/Target/PTX/PTXISelLowering.cpp @@ -414,3 +414,9 @@ PTXTargetLowering::LowerCall(SDValue Chain, SDValue Callee, return Chain; } + +unsigned PTXTargetLowering::getNumRegisters(LLVMContext &Context, EVT VT) { + // All arguments consist of one "register," regardless of the type. + return 1; +} + diff --git a/lib/Target/PTX/PTXISelLowering.h b/lib/Target/PTX/PTXISelLowering.h index f88349f865c..4d2566540af 100644 --- a/lib/Target/PTX/PTXISelLowering.h +++ b/lib/Target/PTX/PTXISelLowering.h @@ -75,6 +75,8 @@ class PTXTargetLowering : public TargetLowering { virtual EVT getSetCCResultType(EVT VT) const; + virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT); + private: SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; }; // class PTXTargetLowering diff --git a/lib/Target/PTX/PTXSubtarget.h b/lib/Target/PTX/PTXSubtarget.h index 04042009920..b946d7c11ce 100644 --- a/lib/Target/PTX/PTXSubtarget.h +++ b/lib/Target/PTX/PTXSubtarget.h @@ -119,6 +119,10 @@ class StringRef; (PTXTarget >= PTX_COMPUTE_2_0 && PTXTarget < PTX_LAST_COMPUTE); } + bool emitPtrAttribute() const { + return PTXVersion >= PTX_VERSION_2_2; + } + void ParseSubtargetFeatures(StringRef CPU, StringRef FS); }; // class PTXSubtarget } // namespace llvm