diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 66a3c57..9512b35 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -401,6 +401,41 @@ void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags, } } +static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, + llvm::Module &M) { + if (!LO.VisibilityFromDLLStorageClass) + return; + + llvm::GlobalValue::VisibilityTypes DLLExportVisibility = + CodeGenModule::GetLLVMVisibility(LO.getDLLExportVisibility()); + llvm::GlobalValue::VisibilityTypes NoDLLStorageClassVisibility = + CodeGenModule::GetLLVMVisibility(LO.getNoDLLStorageClassVisibility()); + llvm::GlobalValue::VisibilityTypes ExternDeclDLLImportVisibility = + CodeGenModule::GetLLVMVisibility(LO.getExternDeclDLLImportVisibility()); + llvm::GlobalValue::VisibilityTypes ExternDeclNoDLLStorageClassVisibility = + CodeGenModule::GetLLVMVisibility( + LO.getExternDeclNoDLLStorageClassVisibility()); + + for (llvm::GlobalValue &GV : M.global_values()) { + if (GV.hasAppendingLinkage() || GV.hasLocalLinkage()) + return; + + if (GV.isDeclarationForLinker()) { + GV.setVisibility(GV.getDLLStorageClass() == + llvm::GlobalValue::DLLImportStorageClass + ? ExternDeclDLLImportVisibility + : ExternDeclNoDLLStorageClassVisibility); + } else { + GV.setVisibility(GV.getDLLStorageClass() == + llvm::GlobalValue::DLLExportStorageClass + ? DLLExportVisibility + : NoDLLStorageClassVisibility); + } + + GV.setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); + } +} + void CodeGenModule::Release() { EmitDeferred(); EmitVTablesOpportunistically(); @@ -688,6 +723,12 @@ void CodeGenModule::Release() { getTargetCodeGenInfo().emitTargetMetadata(*this, MangledDeclNames); EmitBackendOptionsMetadata(getCodeGenOpts()); + + // Set visibility from DLL export class + // We do this at the end of LLVM IR generation; after any operation + // that might affect the DLL storage class or the visibility, and + // before anything that might act on these. + setVisibilityFromDLLStorageClass(LangOpts, getModule()); } void CodeGenModule::EmitOpenCLMetadata() { |