diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -37,7 +37,6 @@ CODEGENOPT(Autolink , 1, 1) ///< -fno-autolink CODEGENOPT(ObjCAutoRefCountExceptions , 1, 0) ///< Whether ARC should be EH-safe. CODEGENOPT(Backchain , 1, 0) ///< -mbackchain -CODEGENOPT(IgnoreXCOFFVisibility , 1, 0) ///< -mignore-xcoff-visibility CODEGENOPT(ControlFlowGuardNoChecks , 1, 0) ///< -cfguard-no-checks CODEGENOPT(ControlFlowGuard , 1, 0) ///< -cfguard CODEGENOPT(CXAAtExit , 1, 1) ///< Use __cxa_atexit for calling destructors. diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -262,6 +262,7 @@ BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "dumping the layouts of emitted vtables") LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings") BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden visibility for inline C++ methods") +BENIGN_LANGOPT(IgnoreXCOFFVisibility, 1, 0, "All the visibility attributes that are specified in the source code are ignored in aix XCOFF.") BENIGN_LANGOPT(VisibilityInlinesHiddenStaticLocalVar, 1, 0, "hidden visibility for static local variables in inline C++ " "methods when -fvisibility-inlines hidden is enabled") diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1478,10 +1478,14 @@ } LinkageInfo LinkageComputer::getDeclLinkageAndVisibility(const NamedDecl *D) { - return getLVForDecl(D, - LVComputationKind(usesTypeVisibility(D) - ? NamedDecl::VisibilityForType - : NamedDecl::VisibilityForValue)); + NamedDecl::ExplicitVisibilityKind EK = usesTypeVisibility(D) + ? NamedDecl::VisibilityForType + : NamedDecl::VisibilityForValue; + LVComputationKind CK(EK); + + return getLVForDecl(D, D->getASTContext().getLangOpts().IgnoreXCOFFVisibility + ? CK.forLinkageOnly() + : CK); } Module *Decl::getOwningModuleForLinkage(bool IgnoreLinkage) const { diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -517,7 +517,6 @@ Options.EnableMachineFunctionSplitter = CodeGenOpts.SplitMachineFunctions; Options.FunctionSections = CodeGenOpts.FunctionSections; Options.DataSections = CodeGenOpts.DataSections; - Options.IgnoreXCOFFVisibility = CodeGenOpts.IgnoreXCOFFVisibility; Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames; Options.UniqueBasicBlockSectionNames = CodeGenOpts.UniqueBasicBlockSectionNames; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1354,10 +1354,6 @@ } } - if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility) || - !Args.hasArg(OPT_fvisibility))) - Opts.IgnoreXCOFFVisibility = 1; - Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib); Opts.LinkerOptions = Args.getAllArgValues(OPT_linker_option); bool NeedLocTracking = false; @@ -2772,6 +2768,12 @@ Opts.setValueVisibilityMode(DefaultVisibility); } + // In AIX OS, the -mignore-xcoff-visibility is enable by default if there is + // no -fvisibility=* option. + if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility) || + !Args.hasArg(OPT_fvisibility))) + Opts.IgnoreXCOFFVisibility = 1; + // The type-visibility mode defaults to the value-visibility mode. if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) { Opts.setTypeVisibilityMode(parseVisibility(typeVisOpt, Args, Diags)); diff --git a/clang/test/CodeGen/aix-ignore-xcoff-visibility.cpp b/clang/test/CodeGen/aix-ignore-xcoff-visibility.cpp --- a/clang/test/CodeGen/aix-ignore-xcoff-visibility.cpp +++ b/clang/test/CodeGen/aix-ignore-xcoff-visibility.cpp @@ -17,8 +17,11 @@ // RUN: %clang_cc1 -triple powerpc-unknown-aix -fvisibility default -o - -x c++ -S %s | \ // RUN: FileCheck -check-prefix=VISIBILITY-ASM %s +// RUN: %clang_cc1 -triple powerpc-unknown-aix -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefix=NOVISIBILITY-IR %s + // RUN: %clang_cc1 -triple powerpc-unknown-aix -mignore-xcoff-visibility -fvisibility default -emit-llvm -o - -x c++ %s | \ -// RUN: FileCheck -check-prefix=VISIBILITY-IR %s +// RUN: FileCheck -check-prefix=NOVISIBILITY-IR %s // RUN: %clang_cc1 -triple powerpc-unknown-aix -fvisibility default -emit-llvm -o - -x c++ %s | \ // RUN: FileCheck -check-prefix=VISIBILITY-IR %s @@ -70,6 +73,15 @@ // VISIBILITY-IR: define weak_odr protected i32 @_ZN5basicIiE7getdataEv(%class.basic* %this) // VISIBILITY-IR: define hidden void @_Z7prambarv() +// NOVISIBILITY-IR: @b = global i32 0 +// NOVISIBILITY-IR: @pramb = global i32 0 +// NOVISIBILITY-IR: define void @_Z5foo_hPi(i32* %p) +// NOVISIBILITY-IR: declare void @_Z12zoo_extern_hv() +// NOVISIBILITY-IR: define void @_Z3barv() +// NOVISIBILITY-IR: define linkonce_odr i32 @_ZNK9TestClass5valueEv(%class.TestClass* %this) +// NOVISIBILITY-IR: define weak_odr i32 @_ZN5basicIiE7getdataEv(%class.basic* %this) +// NOVISIBILITY-IR: define void @_Z7prambarv() + // VISIBILITY-ASM: .globl _Z5foo_hPi[DS],hidden // VISIBILITY-ASM: .globl ._Z5foo_hPi,hidden // VISIBILITY-ASM: .globl _Z3barv[DS],protected diff --git a/clang/test/CodeGen/aix-visibility-inlines-hidden.cpp b/clang/test/CodeGen/aix-visibility-inlines-hidden.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/aix-visibility-inlines-hidden.cpp @@ -0,0 +1,68 @@ +// REQUIRES: powerpc-registered-target + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefixes=COMMON-IR,NOVISIBILITY-IR %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -fvisibility-inlines-hidden -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefixes=COMMON-IR,NOVISIBILITY-IR %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -fvisibility-inlines-hidden \ +// RUN: -fvisibility default -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefixes=COMMON-IR,VISIBILITY-IR %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -mignore-xcoff-visibility -fvisibility-inlines-hidden \ +// RUN: -fvisibility default -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefixes=COMMON-IR,NOVISIBILITY-IR %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -o - -x c++ -S %s |\ +// RUN: FileCheck --check-prefixes=NOP-ASM,COMMON-ASM %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -fvisibility-inlines-hidden -o - -x c++ -S %s | \ +// RUN: FileCheck --check-prefixes=NOP-ASM,COMMON-ASM %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -fvisibility-inlines-hidden \ +// RUN: -fvisibility default -o - -x c++ -S %s | \ +// RUN: FileCheck --check-prefix=COMMON-ASM %s + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -mignore-xcoff-visibility \ +// RUN: -fvisibility-inlines-hidden -fvisibility default -o - -x c++ -S %s | \ +// RUN: FileCheck --check-prefixes=NOP-ASM,COMMON-ASM %s +int x = 66; +__attribute__((__noinline__)) inline void f() { + x = 55; +} + +#pragma GCC visibility push(hidden) +__attribute__((__noinline__)) inline void foo() { + x = 55; +} +#pragma GCC visibility pop + +int bar() { + f(); + foo(); + return x; +} + +// VISIBILITY-IR: define linkonce_odr hidden void @_Z1fv() +// NOVISIBILITY-IR: define linkonce_odr void @_Z1fv() +// COMMON-IR-NEXT: entry: +// COMMON-IR-NEXT: store i32 55, i32* @x, align 4 +// COMMON-IR-NEXT: ret void + +// VISIBILITY-IR: define linkonce_odr hidden void @_Z3foov() +// NOVISIBILITY-IR: define linkonce_odr void @_Z3foov() +// COMMON-IR-NEXT: entry: +// COMMON-IR-NEXT: store i32 55, i32* @x, align 4 + +// COMMON-ASM: mflr 0 +// COMMON-ASM-NEXT: stw 0, 8(1) +// COMMON-ASM-NEXT: stwu 1, -64(1) +// COMMON-ASM-NEXT: bl ._Z1fv +// NOP-ASM-NEXT: nop +// COMMON-ASM-NEXT: bl ._Z3foov +// NOP-ASM-NEXT: nop + +// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -fvisibility-inlines-hidden -fvisibility default -o - -x c++ -S %s | \ +// RUN: FileCheck --check-prefix=CHECK %s +/// CHECK-NOT: nop