From: Scott Linder Date: Mon, 28 Jan 2019 17:12:19 +0000 (+0000) Subject: Add -fapply-global-visibility-to-externs for -cc1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e68bc49943ebc9e3fb7452a9e0ac13998bbbd443;p=clang Add -fapply-global-visibility-to-externs for -cc1 Introduce an option to request global visibility settings be applied to declarations without a definition or an explicit visibility, rather than the existing behavior of giving these default visibility. When the visibility of all or most extern definitions are known this allows for the same optimisations -fvisibility permits without updating source code to annotate all declarations. Differential Revision: https://reviews.llvm.org/D56868 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352391 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 36d3764c74..4e391d2562 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -261,6 +261,8 @@ ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility, "default visibility for functions and variables [-fvisibility]") ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility, "default visibility for types [-ftype-visibility]") +LANGOPT(SetVisibilityForExternDecls, 1, 0, + "apply global symbol visibility to external declarations without an explicit visibility") ENUM_LANGOPT(StackProtector, StackProtectorMode, 2, SSPOff, "stack protector mode") ENUM_LANGOPT(TrivialAutoVarInit, TrivialAutoVarInitKind, 2, TrivialAutoVarInitKind::Uninitialized, diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 4cce9e63c3..cead87201e 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -702,6 +702,8 @@ def fvisibility : Separate<["-"], "fvisibility">, HelpText<"Default type and symbol visibility">; def ftype_visibility : Separate<["-"], "ftype-visibility">, HelpText<"Default type visibility">; +def fapply_global_visibility_to_externs : Flag<["-"], "fapply-global-visibility-to-externs">, + HelpText<"Apply global symbol visibility to external declarations without an explicit visibility">; def ftemplate_depth : Separate<["-"], "ftemplate-depth">, HelpText<"Maximum depth of recursive template instantiation">; def foperator_arrow_depth : Separate<["-"], "foperator-arrow-depth">, diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 0be4bad7ee..5a1b7cfe4f 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -731,9 +731,11 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, } if (!D) return; - // Set visibility for definitions. + // Set visibility for definitions, and for declarations if requested globally + // or set explicitly. LinkageInfo LV = D->getLinkageAndVisibility(); - if (LV.isVisibilityExplicit() || !GV->isDeclarationForLinker()) + if (LV.isVisibilityExplicit() || getLangOpts().SetVisibilityForExternDecls || + !GV->isDeclarationForLinker()) GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); } diff --git a/lib/Driver/ToolChains/AMDGPU.cpp b/lib/Driver/ToolChains/AMDGPU.cpp index a03a607330..b9300bcc42 100644 --- a/lib/Driver/ToolChains/AMDGPU.cpp +++ b/lib/Driver/ToolChains/AMDGPU.cpp @@ -108,5 +108,6 @@ void AMDGPUToolChain::addClangTargetOptions( options::OPT_fvisibility_ms_compat)) { CC1Args.push_back("-fvisibility"); CC1Args.push_back("hidden"); + CC1Args.push_back("-fapply-global-visibility-to-externs"); } } diff --git a/lib/Driver/ToolChains/HIP.cpp b/lib/Driver/ToolChains/HIP.cpp index f55dd2fc04..cd8ed6118f 100644 --- a/lib/Driver/ToolChains/HIP.cpp +++ b/lib/Driver/ToolChains/HIP.cpp @@ -293,8 +293,10 @@ void HIPToolChain::addClangTargetOptions( // Default to "hidden" visibility, as object level linking will not be // supported for the foreseeable future. if (!DriverArgs.hasArg(options::OPT_fvisibility_EQ, - options::OPT_fvisibility_ms_compat)) + options::OPT_fvisibility_ms_compat)) { CC1Args.append({"-fvisibility", "hidden"}); + CC1Args.push_back("-fapply-global-visibility-to-externs"); + } } llvm::opt::DerivedArgList * diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 4d72924fad..dbc29e24ae 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2501,6 +2501,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, if (Args.hasArg(OPT_fvisibility_global_new_delete_hidden)) Opts.GlobalAllocationFunctionVisibilityHidden = 1; + if (Args.hasArg(OPT_fapply_global_visibility_to_externs)) + Opts.SetVisibilityForExternDecls = 1; + if (Args.hasArg(OPT_ftrapv)) { Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping); // Set the handler, if one is specified. diff --git a/test/CodeGen/set-visibility-for-decls.c b/test/CodeGen/set-visibility-for-decls.c new file mode 100644 index 0000000000..04232f8715 --- /dev/null +++ b/test/CodeGen/set-visibility-for-decls.c @@ -0,0 +1,42 @@ +// RUN: %clang_cc1 %s -std=c11 -triple=x86_64-pc-linux -fvisibility hidden -fapply-global-visibility-to-externs -emit-llvm -o - | FileCheck --check-prefix=CHECK-HIDDEN %s +// RUN: %clang_cc1 %s -std=c11 -triple=x86_64-pc-linux -fvisibility protected -fapply-global-visibility-to-externs -emit-llvm -o - | FileCheck --check-prefix=CHECK-PROTECTED %s +// RUN: %clang_cc1 %s -std=c11 -triple=x86_64-pc-linux -fvisibility default -fapply-global-visibility-to-externs -emit-llvm -o - | FileCheck --check-prefix=CHECK-DEFAULT %s + +// CHECK-HIDDEN: @var_hidden = external hidden global +// CHECK-PROTECTED: @var_hidden = external hidden global +// CHECK-DEFAULT: @var_hidden = external hidden global +__attribute__((visibility("hidden"))) extern int var_hidden; +// CHECK-HIDDEN: @var_protected = external protected global +// CHECK-PROTECTED: @var_protected = external protected global +// CHECK-DEFAULT: @var_protected = external protected global +__attribute__((visibility("protected"))) extern int var_protected; +// CHECK-HIDDEN: @var_default = external global +// CHECK-PROTECTED: @var_default = external global +// CHECK-DEFAULT: @var_default = external global +__attribute__((visibility("default"))) extern int var_default; +// CHECK-HIDDEN: @var = external hidden global +// CHECK-PROTECTED: @var = external protected global +// CHECK-DEFAULT: @var = external global +extern int var; + +// CHECK-HIDDEN: declare hidden i32 @func_hidden() +// CHECK-PROTECTED: declare hidden i32 @func_hidden() +// CHECK-DEFAULT: declare hidden i32 @func_hidden() +__attribute__((visibility("hidden"))) int func_hidden(void); +// CHECK-HIDDEN: declare protected i32 @func_protected() +// CHECK-PROTECTED: declare protected i32 @func_protected() +// CHECK-DEFAULT: declare protected i32 @func_protected() +__attribute__((visibility("protected"))) int func_protected(void); +// CHECK-HIDDEN: declare i32 @func_default() +// CHECK-PROTECTED: declare i32 @func_default() +// CHECK-DEFAULT: declare i32 @func_default() +__attribute__((visibility("default"))) int func_default(void); +// CHECK-HIDDEN: declare hidden i32 @func() +// CHECK-PROTECTED: declare protected i32 @func() +// CHECK-DEFAULT: declare i32 @func() +int func(void); + +int use() { + return var_hidden + var_protected + var_default + var + + func_hidden() + func_protected() + func_default() + func(); +} diff --git a/test/Driver/amdgpu-visibility.cl b/test/Driver/amdgpu-visibility.cl index 35969db034..19756d4744 100644 --- a/test/Driver/amdgpu-visibility.cl +++ b/test/Driver/amdgpu-visibility.cl @@ -2,6 +2,14 @@ // RUN: %clang -### -target amdgcn-amd-amdhsa -x cl -c -emit-llvm -fvisibility=protected %s 2>&1 | FileCheck -check-prefix=OVERRIDE-PROTECTED %s // RUN: %clang -### -target amdgcn-amd-amdhsa -x cl -c -emit-llvm -fvisibility-ms-compat %s 2>&1 | FileCheck -check-prefix=OVERRIDE-MS %s -// DEFAULT: "-fvisibility" "hidden" +// DEFAULT-DAG: "-fvisibility" "hidden" +// DEFAULT-DAG: "-fapply-global-visibility-to-externs" + +// OVERRIDE-PROTECTED-NOT: "-fapply-global-visibility-to-externs" // OVERRIDE-PROTECTED: "-fvisibility" "protected" -// OVERRIDE-MS: "-fvisibility" "hidden" "-ftype-visibility" "default" +// OVERRIDE-PROTECTED-NOT: "-fapply-global-visibility-to-externs" + +// OVERRIDE-MS-NOT: "-fapply-global-visibility-to-externs" +// OVERRIDE-MS-DAG: "-fvisibility" "hidden" +// OVERRIDE-MS-DAG: "-ftype-visibility" "default" +// OVERRIDE-MS-NOT: "-fapply-global-visibility-to-externs" diff --git a/test/Driver/hip-toolchain-no-rdc.hip b/test/Driver/hip-toolchain-no-rdc.hip index 4f31a39a72..e8e491858f 100644 --- a/test/Driver/hip-toolchain-no-rdc.hip +++ b/test/Driver/hip-toolchain-no-rdc.hip @@ -20,6 +20,7 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "a.cu" {{.*}} "-target-cpu" "gfx803" // CHECK-SAME: "-fcuda-is-device" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[A_BC_803:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[A_SRC:".*a.cu"]] @@ -47,6 +48,7 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "a.cu" {{.*}} "-target-cpu" "gfx900" // CHECK-SAME: "-fcuda-is-device" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[A_BC_900:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[A_SRC]] @@ -89,6 +91,7 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "b.hip" {{.*}} "-target-cpu" "gfx803" // CHECK-SAME: "-fcuda-is-device" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[B_BC_803:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[B_SRC:".*b.hip"]] @@ -116,6 +119,7 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "b.hip" {{.*}} "-target-cpu" "gfx900" // CHECK-SAME: "-fcuda-is-device" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[B_BC_900:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[B_SRC]] diff --git a/test/Driver/hip-toolchain-rdc.hip b/test/Driver/hip-toolchain-rdc.hip index 5f3fd9250b..dc6fc6f651 100644 --- a/test/Driver/hip-toolchain-rdc.hip +++ b/test/Driver/hip-toolchain-rdc.hip @@ -12,10 +12,11 @@ // RUN: %S/Inputs/hip_multiple_inputs/b.hip \ // RUN: 2>&1 | FileCheck %s -// CHECK: [[CLANG:".*clang.*"]] "-cc1" "-triple" "amdgcn-amd-amdhsa" +// CHECK: [[CLANG:".*clang.*"]] "-cc1" "-triple" "amdgcn-amd-amdhsa" // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "a.cu" {{.*}} "-target-cpu" "gfx803" // CHECK-SAME: "-fcuda-is-device" "-fgpu-rdc" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[A_BC:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[A_SRC:".*a.cu"]] @@ -23,6 +24,7 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" "-emit-llvm-bc" // CHECK-SAME: {{.*}} "-main-file-name" "b.hip" {{.*}} "-target-cpu" "gfx803" // CHECK-SAME: "-fcuda-is-device" "-fgpu-rdc" "-fvisibility" "hidden" +// CHECK-SAME: "-fapply-global-visibility-to-externs" // CHECK-SAME: {{.*}} "-o" [[B_BC:".*bc"]] "-x" "hip" // CHECK-SAME: {{.*}} [[B_SRC:".*b.hip"]]