[AIX] do not emit visibility attribute into IR when there is -mignore-xcoff-visibility
SUMMARY: n the patch https://reviews.llvm.org/D87451 "add new option -mignore-xcoff-visibility" we did as "The option -mignore-xcoff-visibility has no effect on visibility attribute when compile with -emit-llvm option to generated LLVM IR." in these patch we let -mignore-xcoff-visibility effect on generating IR too. the new feature only work on AIX OS Reviewer: Jason Liu, Differential Revision: https://reviews.llvm.org/D89986
This commit is contained in:
@@ -39,7 +39,6 @@ CODEGENOPT(AssumeSaneOperatorNew , 1, 1) ///< implicit __attribute__((malloc)) o
|
||||
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(EHContGuard , 1, 0) ///< -ehcontguard
|
||||
|
||||
@@ -267,6 +267,7 @@ BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd re
|
||||
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")
|
||||
|
||||
@@ -1487,10 +1487,13 @@ LinkageInfo LinkageComputer::getLVForDecl(const NamedDecl *D,
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
@@ -549,7 +549,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
|
||||
Options.EnableMachineFunctionSplitter = CodeGenOpts.SplitMachineFunctions;
|
||||
Options.FunctionSections = CodeGenOpts.FunctionSections;
|
||||
Options.DataSections = CodeGenOpts.DataSections;
|
||||
Options.IgnoreXCOFFVisibility = CodeGenOpts.IgnoreXCOFFVisibility;
|
||||
Options.IgnoreXCOFFVisibility = LangOpts.IgnoreXCOFFVisibility;
|
||||
Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
|
||||
Options.UniqueBasicBlockSectionNames =
|
||||
CodeGenOpts.UniqueBasicBlockSectionNames;
|
||||
|
||||
@@ -1483,9 +1483,6 @@ void CompilerInvocation::GenerateCodeGenArgs(
|
||||
GenerateArg(Args, Opt, SA);
|
||||
}
|
||||
|
||||
if (Opts.IgnoreXCOFFVisibility)
|
||||
GenerateArg(Args, OPT_mignore_xcoff_visibility, SA);
|
||||
|
||||
if (Opts.EnableAIXExtendedAltivecABI)
|
||||
GenerateArg(Args, OPT_mabi_EQ_vec_extabi, SA);
|
||||
|
||||
@@ -1831,27 +1828,6 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
||||
}
|
||||
}
|
||||
|
||||
// This is the reason why '-fvisibility' needs to be always generated:
|
||||
// its absence implies '-mignore-xcoff-visibility'.
|
||||
//
|
||||
// Suppose the original cc1 command line does contain '-fvisibility default':
|
||||
// '-mignore-xcoff-visibility' should not be implied.
|
||||
// * If '-fvisibility' is not generated (as most options with default values
|
||||
// don't), its absence would imply '-mignore-xcoff-visibility'. This changes
|
||||
// the command line semantics.
|
||||
// * If '-fvisibility' is generated regardless of its presence and value,
|
||||
// '-mignore-xcoff-visibility' won't be implied and the command line
|
||||
// semantics are kept intact.
|
||||
//
|
||||
// When the original cc1 command line does **not** contain '-fvisibility',
|
||||
// '-mignore-xcoff-visibility' is implied. The generated command line will
|
||||
// contain both '-fvisibility default' and '-mignore-xcoff-visibility' and
|
||||
// subsequent calls to `CreateFromArgs`/`generateCC1CommandLine` will always
|
||||
// produce the same arguments.
|
||||
if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility) ||
|
||||
!Args.hasArg(OPT_fvisibility)))
|
||||
Opts.IgnoreXCOFFVisibility = 1;
|
||||
|
||||
if (Arg *A =
|
||||
Args.getLastArg(OPT_mabi_EQ_vec_default, OPT_mabi_EQ_vec_extabi)) {
|
||||
if (!T.isOSAIX())
|
||||
@@ -3342,6 +3318,9 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts,
|
||||
Twine(Major) + "." + Twine(Minor) + "." + Twine(Patch), SA);
|
||||
}
|
||||
|
||||
if (Opts.IgnoreXCOFFVisibility)
|
||||
GenerateArg(Args, OPT_mignore_xcoff_visibility, SA);
|
||||
|
||||
if (Opts.SignedOverflowBehavior == LangOptions::SOB_Trapping) {
|
||||
GenerateArg(Args, OPT_ftrapv, SA);
|
||||
GenerateArg(Args, OPT_ftrapv_handler, Opts.OverflowHandler, SA);
|
||||
@@ -3649,6 +3628,30 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
||||
Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
|
||||
}
|
||||
|
||||
// In AIX OS, the -mignore-xcoff-visibility is enable by default if there is
|
||||
// no -fvisibility=* option.
|
||||
// This is the reason why '-fvisibility' needs to be always generated:
|
||||
// its absence implies '-mignore-xcoff-visibility'.
|
||||
//
|
||||
// Suppose the original cc1 command line does contain '-fvisibility default':
|
||||
// '-mignore-xcoff-visibility' should not be implied.
|
||||
// * If '-fvisibility' is not generated (as most options with default values
|
||||
// don't), its absence would imply '-mignore-xcoff-visibility'. This changes
|
||||
// the command line semantics.
|
||||
// * If '-fvisibility' is generated regardless of its presence and value,
|
||||
// '-mignore-xcoff-visibility' won't be implied and the command line
|
||||
// semantics are kept intact.
|
||||
//
|
||||
// When the original cc1 command line does **not** contain '-fvisibility',
|
||||
// '-mignore-xcoff-visibility' is implied. The generated command line will
|
||||
// contain both '-fvisibility default' and '-mignore-xcoff-visibility' and
|
||||
// subsequent calls to `CreateFromArgs`/`generateCC1CommandLine` will always
|
||||
// produce the same arguments.
|
||||
|
||||
if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility) ||
|
||||
!Args.hasArg(OPT_fvisibility)))
|
||||
Opts.IgnoreXCOFFVisibility = 1;
|
||||
|
||||
if (Args.hasArg(OPT_ftrapv)) {
|
||||
Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping);
|
||||
// Set the handler, if one is specified.
|
||||
|
||||
@@ -1,28 +1,21 @@
|
||||
// REQUIRES: powerpc-registered-target
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -o - -x c++ -S %s |\
|
||||
// RUN: FileCheck --check-prefix=IGNOREVISIBILITY-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 -o - -x c++ -S %s | \
|
||||
// RUN: FileCheck -check-prefix=IGNOREVISIBILITY-ASM %s
|
||||
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -mignore-xcoff-visibility -fvisibility default -o - -x c++ -S %s | \
|
||||
// RUN: FileCheck -check-prefix=IGNOREVISIBILITY-ASM %s
|
||||
|
||||
// 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 -mignore-xcoff-visibility -fvisibility default -o - -x c++ -S %s | \
|
||||
// RUN: FileCheck -check-prefix=IGNOREVISIBILITY-ASM %s
|
||||
|
||||
// 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 -round-trip-args -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 -mignore-xcoff-visibility -fvisibility default -emit-llvm -round-trip-args -o - -x c++ %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
|
||||
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -fvisibility default -round-trip-args -emit-llvm -o - -x c++ %s | \
|
||||
// RUN: FileCheck -check-prefix=VISIBILITY-IR %s
|
||||
|
||||
__attribute__((visibility("hidden"))) void foo_h(int *p) {
|
||||
(*p)++;
|
||||
}
|
||||
@@ -70,28 +63,11 @@ void prambar() {}
|
||||
// VISIBILITY-IR: define weak_odr protected i32 @_ZN5basicIiE7getdataEv(%class.basic* {{[^,]*}} %this)
|
||||
// VISIBILITY-IR: define hidden void @_Z7prambarv()
|
||||
|
||||
// VISIBILITY-ASM: .globl _Z5foo_hPi[DS],hidden
|
||||
// VISIBILITY-ASM: .globl ._Z5foo_hPi,hidden
|
||||
// VISIBILITY-ASM: .globl _Z3barv[DS],protected
|
||||
// VISIBILITY-ASM: .globl ._Z3barv,protected
|
||||
// VISIBILITY-ASM: .weak _ZNK9TestClass5valueEv[DS],hidden
|
||||
// VISIBILITY-ASM: .weak ._ZNK9TestClass5valueEv,hidden
|
||||
// VISIBILITY-ASM: .weak _ZN5basicIiE7getdataEv[DS],protected
|
||||
// VISIBILITY-ASM: .weak ._ZN5basicIiE7getdataEv,protected
|
||||
// VISIBILITY-ASM: .globl _Z7prambarv[DS],hidden
|
||||
// VISIBILITY-ASM: .globl ._Z7prambarv,hidden
|
||||
// VISIBILITY-ASM: .globl b,protected
|
||||
// VISIBILITY-ASM: .globl pramb,hidden
|
||||
|
||||
// IGNOREVISIBILITY-ASM: .globl _Z5foo_hPi[DS]
|
||||
// IGNOREVISIBILITY-ASM: .globl ._Z5foo_hPi
|
||||
// IGNOREVISIBILITY-ASM: .globl _Z3barv[DS]
|
||||
// IGNOREVISIBILITY-ASM: .globl ._Z3barv
|
||||
// IGNOREVISIBILITY-ASM: .weak _ZNK9TestClass5valueEv[DS]
|
||||
// IGNOREVISIBILITY-ASM: .weak ._ZNK9TestClass5valueEv
|
||||
// IGNOREVISIBILITY-ASM: .weak _ZN5basicIiE7getdataEv[DS]
|
||||
// IGNOREVISIBILITY-ASM: .weak ._ZN5basicIiE7getdataEv
|
||||
// IGNOREVISIBILITY-ASM: .globl _Z7prambarv[DS]
|
||||
// IGNOREVISIBILITY-ASM: .globl ._Z7prambarv
|
||||
// IGNOREVISIBILITY-ASM: .globl b
|
||||
// IGNOREVISIBILITY-ASM: .globl pramb
|
||||
// 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()
|
||||
|
||||
37
clang/test/CodeGen/aix-visibility-inlines-hidden.cpp
Normal file
37
clang/test/CodeGen/aix-visibility-inlines-hidden.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -emit-llvm -o - -x c++ %s | \
|
||||
// RUN: FileCheck -check-prefix=NOVISIBILITY-IR %s
|
||||
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large \
|
||||
// RUN: -fvisibility-inlines-hidden -emit-llvm -o - -x c++ %s | \
|
||||
// RUN: FileCheck -check-prefix=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-prefix=VISIBILITY-IR %s
|
||||
|
||||
// RUN: %clang_cc1 -triple powerpc-unknown-aix -mcmodel=large -mignore-xcoff-visibility -emit-llvm \
|
||||
// RUN: -fvisibility-inlines-hidden -fvisibility default -o - -x c++ %s | \
|
||||
// RUN: FileCheck -check-prefix=NOVISIBILITY-IR %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()
|
||||
|
||||
// VISIBILITY-IR: define linkonce_odr hidden void @_Z3foov()
|
||||
// NOVISIBILITY-IR: define linkonce_odr void @_Z3foov()
|
||||
Reference in New Issue
Block a user