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 @@ -2779,8 +2779,12 @@ Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode()); } - if (Args.hasArg(OPT_fvisibility_inlines_hidden)) - Opts.InlineVisibilityHidden = 1; + if (Args.hasArg(OPT_fvisibility_inlines_hidden)) { + if (T.isOSAIX() && !Args.hasArg(OPT_fvisibility)) + Opts.InlineVisibilityHidden = 0; + else + Opts.InlineVisibilityHidden = 1; + } if (Args.hasArg(OPT_fvisibility_inlines_hidden_static_local_var)) Opts.VisibilityInlinesHiddenStaticLocalVar = 1; 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,44 @@ +// REQUIRES: powerpc-registered-target + +// 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 -fvisibility default -o - -x c++ -S %s | \ +// RUN: FileCheck --check-prefix=COMMON-ASM %s + +// 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 -fvisibility default -emit-llvm -o - -x c++ %s | \ +// RUN: FileCheck -check-prefixes=COMMON-IR,VISIBILITY-IR %s + +int x = 66; +__attribute__((__noinline__)) inline void f() { + x = 55; +} +int bar() { + f(); + return x; +} + +// 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 + +// 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 + +// 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