diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 49374efbeb28b..a3f1cd3b80b22 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -536,6 +536,10 @@ ENUM_CODEGENOPT(WinControlFlowGuardMechanism, ControlFlowGuardMechanism, /// Adds attributes that prevent outlining (`-mno-outline`) CODEGENOPT(DisableOutlining, 1, 0, Benign) +/// Controlls the emission of function name in PPA1 on z/OS. +ENUM_CODEGENOPT(ZOSPPA1Name, ZOSPPA1NameKind, + 2, ZOSPPA1NameKind::Default, Benign) + /// FIXME: Make DebugOptions its own top-level .def file. #include "DebugOptions.def" diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index 97d68877467fd..61019e2c163d7 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -227,6 +227,13 @@ class CodeGenOptions : public CodeGenOptionsBase { NonStrictDefault = NonZero }; + enum class ZOSPPA1NameKind { + Default, /// Optimization for size level decides whether to + /// emit the function name in PPA1 on z/OS. + Emit, /// Emit the function name in PPA1 on z/OS. + NoEmit, /// Do not emit the function name in PPA1 on z/OS. + }; + /// The code model to use (-mcmodel). std::string CodeModel; diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 935c95846d4f6..b4d03a1a3e0b5 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -295,8 +295,6 @@ LANGOPT(ConstantNSDictionaryLiterals , 1, 0, NotCompatible, "constant dictionary LANGOPT(InlineVisibilityHidden , 1, 0, Benign, "hidden visibility for inline C++ methods") ENUM_LANGOPT(DefaultVisibilityExportMapping, DefaultVisiblityExportMapping, 2, DefaultVisiblityExportMapping::None, Benign, "controls mapping of default visibility to dllexport") LANGOPT(IgnoreXCOFFVisibility, 1, 0, Benign, "All the visibility attributes that are specified in the source code are ignored in aix XCOFF.") -ENUM_LANGOPT(ZOSPPA1Name, ZOSPPA1NameKind, 2, ZOSPPA1NameKind::Default, Benign, - "Emit the function name in PPA1 on z/OS.") LANGOPT(VisibilityInlinesHiddenStaticLocalVar, 1, 0, Benign, "hidden visibility for static local variables in inline C++ " "methods when -fvisibility-inlines hidden is enabled") diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index fceac5c2946f2..6c86300fc5581 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -451,16 +451,6 @@ class LangOptionsBase { Microsoft = 2, }; - enum class ZOSPPA1NameKind { - /// Optimization for size level decides whether to emit the function name - /// in PPA1 on z/OS. - Default, - /// Emit the function name in PPA1 on z/OS. - Emit, - /// Do not emit the function name in PPA1 on z/OS. - NoEmit, - }; - // Define simple language options (with no accessors). #define LANGOPT(Name, Bits, Default, Compatibility, Description) \ unsigned Name : Bits; diff --git a/clang/lib/CodeGen/Targets/SystemZ.cpp b/clang/lib/CodeGen/Targets/SystemZ.cpp index 10f69ef379ba6..d50ebf14a656a 100644 --- a/clang/lib/CodeGen/Targets/SystemZ.cpp +++ b/clang/lib/CodeGen/Targets/SystemZ.cpp @@ -600,10 +600,10 @@ class ZOSXPLinkTargetCodeGenInfo : public TargetCodeGenInfo { CodeGen::CodeGenModule &M) const override { if (dyn_cast_or_null(D)) { if (auto *Fn = dyn_cast(GV)) { - auto ZOSPPA1Name = M.getLangOpts().getZOSPPA1Name(); - if (ZOSPPA1Name == clang::LangOptions::ZOSPPA1NameKind::Emit) + auto ZOSPPA1Name = M.getCodeGenOpts().getZOSPPA1Name(); + if (ZOSPPA1Name == clang::CodeGenOptions::ZOSPPA1NameKind::Emit) Fn->addFnAttr("zos-ppa1-name", "all"); - else if (ZOSPPA1Name == clang::LangOptions::ZOSPPA1NameKind::NoEmit) + else if (ZOSPPA1Name == clang::CodeGenOptions::ZOSPPA1NameKind::NoEmit) Fn->addFnAttr("zos-ppa1-name", "none"); } } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index b84b082a8a361..0bae762f5fd25 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1766,6 +1766,11 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts, if (Opts.XCOFFReadOnlyPointers) GenerateArg(Consumer, OPT_mxcoff_roptr); + if (Opts.getZOSPPA1Name() == CodeGenOptions::ZOSPPA1NameKind::Emit) + GenerateArg(Consumer, OPT_mzos_ppa1_name); + else if (Opts.getZOSPPA1Name() == CodeGenOptions::ZOSPPA1NameKind::NoEmit) + GenerateArg(Consumer, OPT_mno_zos_ppa1_name); + if (!Opts.OptRecordPasses.empty()) GenerateArg(Consumer, OPT_opt_record_passes, Opts.OptRecordPasses); @@ -2193,6 +2198,16 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, << A->getSpelling() << T.str(); } + if (T.isOSzOS()) { + if (const Arg *A = + Args.getLastArg(OPT_mzos_ppa1_name, OPT_mno_zos_ppa1_name)) { + if (A->getOption().matches(OPT_mzos_ppa1_name)) + Opts.setZOSPPA1Name(CodeGenOptions::ZOSPPA1NameKind::Emit); + else + Opts.setZOSPPA1Name(CodeGenOptions::ZOSPPA1NameKind::NoEmit); + } + } + bool NeedLocTracking = false; if (!Opts.OptRecordFile.empty()) @@ -3822,11 +3837,6 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, if (Opts.IgnoreXCOFFVisibility) GenerateArg(Consumer, OPT_mignore_xcoff_visibility); - if (Opts.getZOSPPA1Name() == LangOptions::ZOSPPA1NameKind::Emit) - GenerateArg(Consumer, OPT_mzos_ppa1_name); - else if (Opts.getZOSPPA1Name() == LangOptions::ZOSPPA1NameKind::NoEmit) - GenerateArg(Consumer, OPT_mno_zos_ppa1_name); - if (Opts.SignedOverflowBehavior == LangOptions::SOB_Trapping) { GenerateArg(Consumer, OPT_ftrapv); GenerateArg(Consumer, OPT_ftrapv_handler, Opts.OverflowHandler); @@ -4246,16 +4256,6 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility))) Opts.IgnoreXCOFFVisibility = 1; - if (T.isOSzOS()) { - if (const Arg *A = - Args.getLastArg(OPT_mzos_ppa1_name, OPT_mno_zos_ppa1_name)) { - if (A->getOption().matches(OPT_mzos_ppa1_name)) - Opts.setZOSPPA1Name(LangOptions::ZOSPPA1NameKind::Emit); - else - Opts.setZOSPPA1Name(LangOptions::ZOSPPA1NameKind::NoEmit); - } - } - if (Args.hasArg(OPT_ftrapv)) { Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping); // Set the handler, if one is specified.