[clang] [llvm] [HLSL] Use hidden visibility for external linkage. (PR #140292)
Steven Perron via cfe-commits
cfe-commits at lists.llvm.org
Fri May 16 11:23:37 PDT 2025
https://github.com/s-perron created https://github.com/llvm/llvm-project/pull/140292
Implements
https://github.com/llvm/wg-hlsl/blob/main/proposals/0026-symbol-visibility.md.
The change is to stop using the `hlsl.export` attribute. Instead,
symbols with "program linkage" in HLSL will have export linkage with
default visibility, and symbols with "external linkage" in HLSL will
have export linkage with hidden visibility.
>From 7738afa7780b0db19139eb25a71cd213d0f7fec6 Mon Sep 17 00:00:00 2001
From: Steven Perron <stevenperron at google.com>
Date: Fri, 16 May 2025 14:21:01 -0400
Subject: [PATCH] [HLSL] Use hidden visibility for external linkage.
Implements
https://github.com/llvm/wg-hlsl/blob/main/proposals/0026-symbol-visibility.md.
The change is to stop using the `hlsl.export` attribute. Instead,
symbols with "program linkage" in HLSL will have export linkage with
default visibility, and symbols with "external linkage" in HLSL will
have export linkage with hidden visibility.
---
clang/lib/CodeGen/CGHLSLRuntime.cpp | 8 --------
clang/lib/CodeGen/CGHLSLRuntime.h | 1 -
clang/lib/CodeGen/CodeGenFunction.cpp | 1 -
clang/lib/CodeGen/CodeGenModule.cpp | 5 +++++
llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp | 4 +++-
llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 4 +++-
llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 4 +++-
llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp | 3 ++-
8 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index a708b3aea129d..f441e4b3177c7 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -444,14 +444,6 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
}
}
-void CGHLSLRuntime::setHLSLFunctionAttributes(const FunctionDecl *FD,
- llvm::Function *Fn) {
- if (FD->isInExportDeclContext()) {
- const StringRef ExportAttrKindStr = "hlsl.export";
- Fn->addFnAttr(ExportAttrKindStr);
- }
-}
-
static void gatherFunctions(SmallVectorImpl<Function *> &Fns, llvm::Module &M,
bool CtorOrDtor) {
const auto *GV =
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h
index e40864d8ed854..621d6f66a76ca 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.h
+++ b/clang/lib/CodeGen/CGHLSLRuntime.h
@@ -151,7 +151,6 @@ class CGHLSLRuntime {
void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn);
void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn);
- void setHLSLFunctionAttributes(const FunctionDecl *FD, llvm::Function *Fn);
llvm::Instruction *getConvergenceToken(llvm::BasicBlock &BB);
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index ac40aab97820d..601b521fc5cef 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1274,7 +1274,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
if (FD->hasAttr<HLSLShaderAttr>()) {
CGM.getHLSLRuntime().emitEntryFunction(FD, Fn);
}
- CGM.getHLSLRuntime().setHLSLFunctionAttributes(FD, Fn);
}
EmitFunctionProlog(*CurFnInfo, CurFn, Args);
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 16e010adbeb5f..4d4cac4980108 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1655,6 +1655,11 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
return;
}
+ if (Context.getLangOpts().HLSL && !D->isInExportDeclContext()) {
+ GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+ return;
+ }
+
if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
// Reject incompatible dlllstorage and visibility annotations.
if (!LV.isVisibilityExplicit())
diff --git a/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp b/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
index 035899205bf8c..94b2dbe78c4f7 100644
--- a/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
+++ b/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
@@ -24,7 +24,9 @@ static bool finalizeLinkage(Module &M) {
for (Function &EF : M.functions()) {
if (EF.isIntrinsic())
continue;
- if (EF.hasFnAttribute("hlsl.shader") || EF.hasFnAttribute("hlsl.export"))
+ if (EF.hasExternalLinkage() && EF.hasDefaultVisibility())
+ continue;
+ if (EF.hasFnAttribute("hlsl.shader"))
continue;
Funcs.push_back(&EF);
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index 5991a9af6364d..dff6ae1f3de8d 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -444,7 +444,8 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
.addUse(FuncVReg);
addStringImm(F.getName(), MIB);
} else if (F.getLinkage() != GlobalValue::InternalLinkage &&
- F.getLinkage() != GlobalValue::PrivateLinkage) {
+ F.getLinkage() != GlobalValue::PrivateLinkage &&
+ F.getVisibility() != GlobalValue::HiddenVisibility) {
SPIRV::LinkageType::LinkageType LnkTy =
F.isDeclaration()
? SPIRV::LinkageType::Import
@@ -453,6 +454,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
SPIRV::Extension::SPV_KHR_linkonce_odr)
? SPIRV::LinkageType::LinkOnceODR
: SPIRV::LinkageType::Export);
+ dbgs() << "(Call) Setting linkage attribute for " << F.getName() << "\n";
buildOpDecorate(FuncVReg, MIRBuilder, SPIRV::Decoration::LinkageAttributes,
{static_cast<uint32_t>(LnkTy)}, F.getName());
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
index ac397fc486e19..efd1aa58667bc 100644
--- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
@@ -775,9 +775,11 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Alignment, {Alignment});
}
- if (HasLinkageTy)
+ if (HasLinkageTy) {
+ dbgs() << "Setting linkage attribute for " << Name << "\n";
buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::LinkageAttributes,
{static_cast<uint32_t>(LinkageType)}, Name);
+ }
SPIRV::BuiltIn::BuiltIn BuiltInId;
if (getSpirvBuiltInIdByName(Name, BuiltInId))
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index 0db60c068bdff..bd6a3dd6a68b6 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -3895,7 +3895,8 @@ bool SPIRVInstructionSelector::selectGlobalValue(
if (hasInitializer(GlobalVar) && !Init)
return true;
- bool HasLnkTy = !GV->hasInternalLinkage() && !GV->hasPrivateLinkage();
+ bool HasLnkTy = !GV->hasInternalLinkage() && !GV->hasPrivateLinkage() &&
+ !GV->hasHiddenVisibility();
SPIRV::LinkageType::LinkageType LnkType =
GV->isDeclarationForLinker()
? SPIRV::LinkageType::Import
More information about the cfe-commits
mailing list