diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.cpp | 14 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.h | 1 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 18 |
3 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index dbfdd0e..6d267e6 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -624,6 +624,20 @@ void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl, } } +void CGHLSLRuntime::handleGlobalVarDefinition(const VarDecl *VD, + llvm::GlobalVariable *GV) { + if (auto Attr = VD->getAttr<HLSLVkExtBuiltinInputAttr>()) { + LLVMContext &Ctx = GV->getContext(); + IRBuilder<> B(GV->getContext()); + MDNode *Operands = MDNode::get( + Ctx, {ConstantAsMetadata::get( + B.getInt32(/* Spirv::Decoration::BuiltIn */ 11)), + ConstantAsMetadata::get(B.getInt32(Attr->getBuiltIn()))}); + MDNode *Decoration = MDNode::get(Ctx, {Operands}); + GV->addMetadata("spirv.Decorations", *Decoration); + } +} + llvm::Instruction *CGHLSLRuntime::getConvergenceToken(BasicBlock &BB) { if (!CGM.shouldEmitConvergenceTokens()) return nullptr; diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 34c6b8d..f7ca207 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -157,6 +157,7 @@ public: void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn); void setHLSLFunctionAttributes(const FunctionDecl *FD, llvm::Function *Fn); + void handleGlobalVarDefinition(const VarDecl *VD, llvm::GlobalVariable *Var); llvm::Instruction *getConvergenceToken(llvm::BasicBlock &BB); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 9383c57..468fc6e 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -5763,7 +5763,17 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D, getCUDARuntime().handleVarRegistration(D, *GV); } - GV->setInitializer(Init); + if (LangOpts.HLSL && GetGlobalVarAddressSpace(D) == LangAS::hlsl_input) { + // HLSL Input variables are considered to be set by the driver/pipeline, but + // only visible to a single thread/wave. + GV->setExternallyInitialized(true); + } else { + GV->setInitializer(Init); + } + + if (LangOpts.HLSL) + getHLSLRuntime().handleGlobalVarDefinition(D, GV); + if (emitter) emitter->finalize(GV); @@ -5806,6 +5816,12 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D, !D->hasAttr<ConstInitAttr>()) Linkage = llvm::GlobalValue::InternalLinkage; + // HLSL variables in the input address space maps like memory-mapped + // variables. Even if they are 'static', they are externally initialized and + // read/write by the hardware/driver/pipeline. + if (LangOpts.HLSL && GetGlobalVarAddressSpace(D) == LangAS::hlsl_input) + Linkage = llvm::GlobalValue::ExternalLinkage; + GV->setLinkage(Linkage); if (D->hasAttr<DLLImportAttr>()) GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); |