diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp index ee8a700f988d..2991778a1bbc 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp @@ -21,6 +21,8 @@ #include "llvm/IR/Module.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" +#include "llvm/Target/TargetLoweringObjectFile.h" + using namespace llvm; static std::pair<Type *, Align> getArgumentTypeAlign(const Argument &Arg, @@ -38,6 +40,27 @@ static std::pair<Type *, Align> getArgumentTypeAlign(const Argument &Arg, return std::pair(Ty, *ArgAlign); } +/// Find the mangled symbol name for the runtime handle for \p EnqueuedBlock +static std::string getEnqueuedBlockSymbolName(const AMDGPUTargetMachine &TM, + const Function &EnqueuedBlock) { + const MDNode *Associated = + EnqueuedBlock.getMetadata(LLVMContext::MD_associated); + if (!Associated) + return ""; + + auto *VM = cast<ValueAsMetadata>(Associated->getOperand(0)); + auto *RuntimeHandle = + dyn_cast<GlobalVariable>(VM->getValue()->stripPointerCasts()); + if (!RuntimeHandle || + RuntimeHandle->getSection() != ".amdgpu.kernel.runtime.handle") + return ""; + + SmallString<128> Name; + TM.getNameWithPrefix(Name, RuntimeHandle, + TM.getObjFileLowering()->getMangler()); + return Name.str().str(); +} + namespace llvm { static cl::opt<bool> DumpHSAMetadata( @@ -230,7 +253,8 @@ void MetadataStreamerMsgPackV4::emitKernelLanguage(const Function &Func, Kern[".language_version"] = LanguageVersion; } -void MetadataStreamerMsgPackV4::emitKernelAttrs(const Function &Func, +void MetadataStreamerMsgPackV4::emitKernelAttrs(const AMDGPUTargetMachine &TM, + const Function &Func, msgpack::MapDocNode Kern) { if (auto *Node = Func.getMetadata("reqd_work_group_size")) @@ -244,11 +268,13 @@ void MetadataStreamerMsgPackV4::emitKernelAttrs(const Function &Func, mdconst::extract<ConstantInt>(Node->getOperand(1))->getZExtValue()), /*Copy=*/true); } - if (Func.hasFnAttribute("runtime-handle")) { - Kern[".device_enqueue_symbol"] = Kern.getDocument()->getNode( - Func.getFnAttribute("runtime-handle").getValueAsString().str(), - /*Copy=*/true); + + std::string HandleName = getEnqueuedBlockSymbolName(TM, Func); + if (!HandleName.empty()) { + Kern[".device_enqueue_symbol"] = + Kern.getDocument()->getNode(std::move(HandleName), /*Copy=*/true); } + if (Func.hasFnAttribute("device-init")) Kern[".kind"] = Kern.getDocument()->getNode("init"); else if (Func.hasFnAttribute("device-fini")) @@ -567,12 +593,13 @@ void MetadataStreamerMsgPackV4::emitKernel(const MachineFunction &MF, auto Kernels = getRootMetadata("amdhsa.kernels").getArray(/*Convert=*/true); + auto &TM = static_cast<const AMDGPUTargetMachine &>(MF.getTarget()); { Kern[".name"] = Kern.getDocument()->getNode(Func.getName()); Kern[".symbol"] = Kern.getDocument()->getNode( (Twine(Func.getName()) + Twine(".kd")).str(), /*Copy=*/true); emitKernelLanguage(Func, Kern); - emitKernelAttrs(Func, Kern); + emitKernelAttrs(TM, Func, Kern); emitKernelArgs(MF, Kern); } @@ -698,9 +725,10 @@ void MetadataStreamerMsgPackV5::emitHiddenKernelArgs( emitKernelArg(DL, Int8PtrTy, Align(8), "hidden_queue_ptr", Offset, Args); } -void MetadataStreamerMsgPackV5::emitKernelAttrs(const Function &Func, +void MetadataStreamerMsgPackV5::emitKernelAttrs(const AMDGPUTargetMachine &TM, + const Function &Func, msgpack::MapDocNode Kern) { - MetadataStreamerMsgPackV4::emitKernelAttrs(Func, Kern); + MetadataStreamerMsgPackV4::emitKernelAttrs(TM, Func, Kern); if (Func.getFnAttribute("uniform-work-group-size").getValueAsBool()) Kern[".uniform_work_group_size"] = Kern.getDocument()->getNode(1); |
