Skip to content

Commit af7ac50

Browse files
committed
[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.
1 parent 8188931 commit af7ac50

File tree

7 files changed

+12
-13
lines changed

7 files changed

+12
-13
lines changed

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -444,14 +444,6 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
444444
}
445445
}
446446

447-
void CGHLSLRuntime::setHLSLFunctionAttributes(const FunctionDecl *FD,
448-
llvm::Function *Fn) {
449-
if (FD->isInExportDeclContext()) {
450-
const StringRef ExportAttrKindStr = "hlsl.export";
451-
Fn->addFnAttr(ExportAttrKindStr);
452-
}
453-
}
454-
455447
static void gatherFunctions(SmallVectorImpl<Function *> &Fns, llvm::Module &M,
456448
bool CtorOrDtor) {
457449
const auto *GV =

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ class CGHLSLRuntime {
151151
void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn);
152152

153153
void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn);
154-
void setHLSLFunctionAttributes(const FunctionDecl *FD, llvm::Function *Fn);
155154

156155
llvm::Instruction *getConvergenceToken(llvm::BasicBlock &BB);
157156

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
12741274
if (FD->hasAttr<HLSLShaderAttr>()) {
12751275
CGM.getHLSLRuntime().emitEntryFunction(FD, Fn);
12761276
}
1277-
CGM.getHLSLRuntime().setHLSLFunctionAttributes(FD, Fn);
12781277
}
12791278

12801279
EmitFunctionProlog(*CurFnInfo, CurFn, Args);

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,11 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
16551655
return;
16561656
}
16571657

1658+
if (Context.getLangOpts().HLSL && !D->isInExportDeclContext()) {
1659+
GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
1660+
return;
1661+
}
1662+
16581663
if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
16591664
// Reject incompatible dlllstorage and visibility annotations.
16601665
if (!LV.isVisibilityExplicit())

llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ static bool finalizeLinkage(Module &M) {
2424
for (Function &EF : M.functions()) {
2525
if (EF.isIntrinsic())
2626
continue;
27-
if (EF.hasFnAttribute("hlsl.shader") || EF.hasFnAttribute("hlsl.export"))
27+
if (EF.hasExternalLinkage() && EF.hasDefaultVisibility())
28+
continue;
29+
if (EF.hasFnAttribute("hlsl.shader"))
2830
continue;
2931
Funcs.push_back(&EF);
3032
}

llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
444444
.addUse(FuncVReg);
445445
addStringImm(F.getName(), MIB);
446446
} else if (F.getLinkage() != GlobalValue::InternalLinkage &&
447-
F.getLinkage() != GlobalValue::PrivateLinkage) {
447+
F.getLinkage() != GlobalValue::PrivateLinkage &&
448+
F.getVisibility() != GlobalValue::HiddenVisibility) {
448449
SPIRV::LinkageType::LinkageType LnkTy =
449450
F.isDeclaration()
450451
? SPIRV::LinkageType::Import

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,8 @@ bool SPIRVInstructionSelector::selectGlobalValue(
38953895
if (hasInitializer(GlobalVar) && !Init)
38963896
return true;
38973897

3898-
bool HasLnkTy = !GV->hasInternalLinkage() && !GV->hasPrivateLinkage();
3898+
bool HasLnkTy = !GV->hasInternalLinkage() && !GV->hasPrivateLinkage() &&
3899+
!GV->hasHiddenVisibility();
38993900
SPIRV::LinkageType::LinkageType LnkType =
39003901
GV->isDeclarationForLinker()
39013902
? SPIRV::LinkageType::Import

0 commit comments

Comments
 (0)