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.
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
//===- DXILFinalizeLinkage.cpp - Finalize linkage of functions ------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "DXILFinalizeLinkage.h"
|
|
#include "DirectX.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/GlobalValue.h"
|
|
#include "llvm/IR/Metadata.h"
|
|
#include "llvm/IR/Module.h"
|
|
|
|
#define DEBUG_TYPE "dxil-finalize-linkage"
|
|
|
|
using namespace llvm;
|
|
|
|
static bool finalizeLinkage(Module &M) {
|
|
SmallVector<Function *> Funcs;
|
|
|
|
// Collect non-entry and non-exported functions to set to internal linkage.
|
|
for (Function &EF : M.functions()) {
|
|
if (EF.isIntrinsic())
|
|
continue;
|
|
if (EF.hasExternalLinkage() && EF.hasDefaultVisibility())
|
|
continue;
|
|
if (EF.hasFnAttribute("hlsl.shader"))
|
|
continue;
|
|
Funcs.push_back(&EF);
|
|
}
|
|
|
|
for (Function *F : Funcs) {
|
|
if (F->getLinkage() == GlobalValue::ExternalLinkage)
|
|
F->setLinkage(GlobalValue::InternalLinkage);
|
|
if (F->isDefTriviallyDead())
|
|
M.getFunctionList().erase(F);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
PreservedAnalyses DXILFinalizeLinkage::run(Module &M,
|
|
ModuleAnalysisManager &AM) {
|
|
if (finalizeLinkage(M))
|
|
return PreservedAnalyses::none();
|
|
return PreservedAnalyses::all();
|
|
}
|
|
|
|
bool DXILFinalizeLinkageLegacy::runOnModule(Module &M) {
|
|
return finalizeLinkage(M);
|
|
}
|
|
|
|
char DXILFinalizeLinkageLegacy::ID = 0;
|
|
|
|
INITIALIZE_PASS_BEGIN(DXILFinalizeLinkageLegacy, DEBUG_TYPE,
|
|
"DXIL Finalize Linkage", false, false)
|
|
INITIALIZE_PASS_END(DXILFinalizeLinkageLegacy, DEBUG_TYPE,
|
|
"DXIL Finalize Linkage", false, false)
|
|
|
|
ModulePass *llvm::createDXILFinalizeLinkageLegacyPass() {
|
|
return new DXILFinalizeLinkageLegacy();
|
|
}
|