https://github.com/sujianIBM updated 
https://github.com/llvm/llvm-project/pull/207416

>From 3189e003a6181f95eecb1d43c3600cc699b32465 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Fri, 3 Jul 2026 11:25:51 -0400
Subject: [PATCH 1/8] Add options -m[no-]zos-ppa1-name to remove the function
 name in PPA1 on z/OS.

This PR adds options -m[no-]zos-ppa1-name to remove the function name in PPA1 
on z/OS.
---
 clang/include/clang/Basic/LangOptions.def     |  2 +
 clang/include/clang/Basic/LangOptions.h       | 10 ++++
 clang/include/clang/Options/Options.td        |  7 +++
 clang/lib/CodeGen/Targets/SystemZ.cpp         | 13 +++++
 clang/lib/Driver/ToolChains/ZOS.cpp           |  2 +
 clang/lib/Frontend/CompilerInvocation.cpp     | 15 ++++++
 clang/test/CodeGen/SystemZ/zos-ppa1-name.c    | 19 +++++++
 clang/test/Driver/zos-ppa1-name.c             | 15 ++++++
 llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 12 ++++-
 llvm/test/CodeGen/SystemZ/zos-ppa1.ll         | 54 +++++++++++++++++++
 10 files changed, 148 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGen/SystemZ/zos-ppa1-name.c
 create mode 100644 clang/test/Driver/zos-ppa1-name.c

diff --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 1fb491a54a278..ce6be39843f09 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -296,6 +296,8 @@ 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 f21131622d03d..1e8ba38df3c53 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -451,6 +451,16 @@ 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/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index f86323ad2d6bd..cdbcfb30ba772 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -6093,6 +6093,13 @@ defm backchain : BoolMOption<"backchain",
   PosFlag<SetTrue, [], [ClangOption], "Link stack frames through backchain on 
System Z">,
   NegFlag<SetFalse>, BothFlags<[], [ClangOption, CC1Option]>>;
 
+def mzos_ppa1_name : Flag<["-"], "mzos-ppa1-name">, Group<m_Group>,
+  Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Emit the function name in PPA1 on z/OS">;
+def mno_zos_ppa1_name : Flag<["-"], "mno-zos-ppa1-name">, Group<m_Group>,
+  Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Do not emit the function name in PPA1 on z/OS">;
+
 def mno_warn_nonportable_cfstrings : Flag<["-"], 
"mno-warn-nonportable-cfstrings">, Group<m_Group>;
 def mno_omit_leaf_frame_pointer : Flag<["-"], "mno-omit-leaf-frame-pointer">, 
Group<m_Group>;
 def momit_leaf_frame_pointer : Flag<["-"], "momit-leaf-frame-pointer">, 
Group<m_Group>,
diff --git a/clang/lib/CodeGen/Targets/SystemZ.cpp 
b/clang/lib/CodeGen/Targets/SystemZ.cpp
index a27fee633ead2..bcee3078fe06f 100644
--- a/clang/lib/CodeGen/Targets/SystemZ.cpp
+++ b/clang/lib/CodeGen/Targets/SystemZ.cpp
@@ -598,6 +598,19 @@ class ZOSXPLinkTargetCodeGenInfo : public 
TargetCodeGenInfo {
     SwiftInfo =
         std::make_unique<SwiftABIInfo>(CGT, /*SwiftErrorInRegister=*/false);
   }
+
+  void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
+                           CodeGen::CodeGenModule &M) const override {
+    if (dyn_cast_or_null<FunctionDecl>(D)) {
+      if (auto *Fn = dyn_cast<llvm::Function>(GV)) {
+        auto ZOSPPA1Name = M.getLangOpts().getZOSPPA1Name();
+        if (ZOSPPA1Name == clang::LangOptions::ZOSPPA1NameKind::Emit)
+          Fn->addFnAttr("zos-ppa1-name", "all");
+        else if (ZOSPPA1Name == clang::LangOptions::ZOSPPA1NameKind::NoEmit)
+          Fn->addFnAttr("zos-ppa1-name", "none");
+      }
+    }
+  }
 };
 
 } // namespace
diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp 
b/clang/lib/Driver/ToolChains/ZOS.cpp
index da4aaa28cd1da..bc4ff08e6e2c6 100644
--- a/clang/lib/Driver/ToolChains/ZOS.cpp
+++ b/clang/lib/Driver/ToolChains/ZOS.cpp
@@ -49,6 +49,8 @@ void ZOS::addClangTargetOptions(const ArgList &DriverArgs,
   if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
                                 options::OPT_fno_sized_deallocation))
     CC1Args.push_back("-fno-sized-deallocation");
+
+  DriverArgs.AddLastArg(CC1Args, options::OPT_mzos_ppa1_name, 
options::OPT_mno_zos_ppa1_name);
 }
 
 void zos::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 6545307a8c8a7..75f0be4fd12f7 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3822,6 +3822,11 @@ 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);
@@ -4241,6 +4246,16 @@ 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.
diff --git a/clang/test/CodeGen/SystemZ/zos-ppa1-name.c 
b/clang/test/CodeGen/SystemZ/zos-ppa1-name.c
new file mode 100644
index 0000000000000..e49c6ae7a20ca
--- /dev/null
+++ b/clang/test/CodeGen/SystemZ/zos-ppa1-name.c
@@ -0,0 +1,19 @@
+// REQUIRES: systemz-registered-target
+
+// test default
+// RUN: %clang_cc1 -triple s390x-ibm-zos -emit-llvm %s -o -\
+// RUN:   | FileCheck %s -check-prefix=DEFAULT
+
+// test the positive and negative options
+// RUN: %clang_cc1 -triple s390x-ibm-zos -mzos-ppa1-name -emit-llvm %s -o -\
+// RUN:   | FileCheck %s -check-prefix=EMIT-NAME
+// RUN: %clang_cc1 -triple s390x-ibm-zos -mno-zos-ppa1-name -emit-llvm %s -o -\
+// RUN:   | FileCheck %s -check-prefix=NOT-EMIT-NAME
+
+// DEFAULT-NOT: attributes #0 = {{{.*}}"zos-ppa1-name"{{.*}}}
+// EMIT-NAME: attributes #0 = {{{.*}}"zos-ppa1-name"="all"{{.*}}}
+// NOT-EMIT-NAME: attributes #0 = {{{.*}}"zos-ppa1-name"="none"{{.*}}}
+
+int main() {
+  return 0;
+}
diff --git a/clang/test/Driver/zos-ppa1-name.c 
b/clang/test/Driver/zos-ppa1-name.c
new file mode 100644
index 0000000000000..a5a1f9ca2486e
--- /dev/null
+++ b/clang/test/Driver/zos-ppa1-name.c
@@ -0,0 +1,15 @@
+// REQUIRES: systemz-registered-target
+
+// RUN: %clang -### -target s390x-ibm-zos -mzos-ppa1-name -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=EMIT-NAME %s
+// EMIT-NAME: "-mzos-ppa1-name"
+
+// RUN: %clang -### -target s390x-ibm-zos -mno-zos-ppa1-name -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=NOT-EMIT-NAME %s
+// NOT-EMIT-NAME: "-mno-zos-ppa1-name"
+
+// RUN: not %clang -target systemz-unknown-elf -mzos-ppa1-name -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=ERR %s
+// RUN: not %clang -target systemz-unknown-elf -mno-zos-ppa1-name -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=ERR %s
+// ERR: error: unsupported option '-m{{.*}}zos-ppa1-name' for target 
'systemz-unknown-elf'
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp 
b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index a90df8e1e0568..bcabec73f0eb5 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1866,7 +1866,17 @@ void SystemZAsmPrinter::calculatePPA1() {
   determinePrologueStackUpdateSym(MF, EndOfPrologSym, StackUpdateSym);
 
   // Save the calculated values.
-  if (MF->getFunction().hasName())
+  // Whether to emit the function name is decided by optimization level,
+  // unless it is explicitly required via -m[no-]zos-ppa1-name options.
+  bool IncludeFunctionName = !MF->getFunction().hasMinSize();
+  if (MF->getFunction().hasFnAttribute("zos-ppa1-name")) {
+    auto ZOSPPA1Name =
+        MF->getFunction().getFnAttribute("zos-ppa1-name").getValueAsString();
+    assert((ZOSPPA1Name == "all" || ZOSPPA1Name == "none") &&
+           "Invalid value for attribute zos-ppa1-name.");
+    IncludeFunctionName = ZOSPPA1Name == "all";
+  }
+  if (MF->getFunction().hasName() && IncludeFunctionName)
     Info.Name = MF->getFunction().getName();
   Info.PPA1 = OutContext.createTempSymbol(Twine("PPA1_").concat(N), true);
   Info.EPMarker = OutContext.createTempSymbol(Twine("EPM_").concat(N), true);
diff --git a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll 
b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
index 570159feb9045..49fe981f65980 100644
--- a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
+++ b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
@@ -206,3 +206,57 @@ declare i32 @other(ptr, i32)
 ; CHECK-NEXT: * Name of Function
 ; CHECK-NEXT:  DC XL10'A689A388819393968381'
 ; CHECK-NEXT:  DC AD(L#EPM_withalloca_0-L#PPA1_withalloca_0)
+
+; Attribute "zos-ppa1-name"="none" removes the function name from PPA1.
+; CHECK: * PPA1
+; CHECK-NEXT: L#PPA1_void_test_no_name_0 DS 0H
+; CHECK:      * PPA1 Flags 4
+; CHECK-NEXT:  DC XL1'80'
+; CHECK-NEXT: * Length/4 of Parms
+; CHECK-NEXT:  DC XL2'0000'
+; CHECK-NEXT: * Length of Code
+; CHECK-NEXT:  DC AD(L#void_test_no_name_end_0-L#EPM_void_test_no_name_0)
+; CHECK-NEXT:  DC AD(L#EPM_void_test_no_name_0-L#PPA1_void_test_no_name_0)
+define void @void_test_no_name() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "zos-ppa1-name"="none" }
+
+; Attribute minsize removes the function name from PPA1.
+; CHECK: * PPA1
+; CHECK-NEXT: L#PPA1_void_test_minsize_0 DS 0H
+; CHECK:      * PPA1 Flags 4
+; CHECK-NEXT:  DC XL1'80'
+; CHECK-NEXT: * Length/4 of Parms
+; CHECK-NEXT:  DC XL2'0000'
+; CHECK-NEXT: * Length of Code
+; CHECK-NEXT:  DC AD(L#void_test_minsize_end_0-L#EPM_void_test_minsize_0)
+; CHECK-NEXT:  DC AD(L#EPM_void_test_minsize_0-L#PPA1_void_test_minsize_0)
+define void @void_test_minsize() #1 {
+entry:
+  ret void
+}
+attributes #1 = { minsize }
+
+; Attribute "zos-ppa1-name"="all" takes precedence over minsize,
+; and thus emits the function name in PPA1.
+; CHECK: * PPA1
+; CHECK-NEXT: L#PPA1_void_test_name_0 DS 0H
+; CHECK: * PPA1 Flags 4
+; CHECK-NEXT: *   Bit 7: 1 = Name Length and Name
+; CHECK-NEXT:  DC XL1'81'
+; CHECK-NEXT: * Length/4 of Parms
+; CHECK-NEXT:  DC XL2'0000'
+; CHECK-NEXT: * Length of Code
+; CHECK-NEXT:  DC AD(L#void_test_name_end_0-L#EPM_void_test_name_0)
+; CHECK-NEXT: * Length of Name
+; CHECK-NEXT:  DC XL2'000E'
+; CHECK-NEXT: * Name of Function
+; CHECK-NEXT:  DC XL14'A59689846DA385A2A36D95819485'
+; CHECK-NEXT: DC AD(L#EPM_void_test_name_0-L#PPA1_void_test_name_0)
+define void @void_test_name() #2 {
+entry:
+  ret void
+}
+attributes #2 = { "zos-ppa1-name"="all" minsize }

>From f836019be85c5ce8723a6a8810daad7605fd8c56 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Fri, 3 Jul 2026 15:39:02 +0000
Subject: [PATCH 2/8] Fix format

---
 clang/lib/Driver/ToolChains/ZOS.cpp       | 3 ++-
 clang/lib/Frontend/CompilerInvocation.cpp | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp 
b/clang/lib/Driver/ToolChains/ZOS.cpp
index bc4ff08e6e2c6..107f150fa8274 100644
--- a/clang/lib/Driver/ToolChains/ZOS.cpp
+++ b/clang/lib/Driver/ToolChains/ZOS.cpp
@@ -50,7 +50,8 @@ void ZOS::addClangTargetOptions(const ArgList &DriverArgs,
                                 options::OPT_fno_sized_deallocation))
     CC1Args.push_back("-fno-sized-deallocation");
 
-  DriverArgs.AddLastArg(CC1Args, options::OPT_mzos_ppa1_name, 
options::OPT_mno_zos_ppa1_name);
+  DriverArgs.AddLastArg(CC1Args, options::OPT_mzos_ppa1_name,
+                        options::OPT_mno_zos_ppa1_name);
 }
 
 void zos::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 75f0be4fd12f7..73d1ec9b9a7d8 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4247,8 +4247,8 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, 
ArgList &Args,
     Opts.IgnoreXCOFFVisibility = 1;
 
   if (T.isOSzOS()) {
-    if (const Arg *A = Args.getLastArg(OPT_mzos_ppa1_name,
-                                       OPT_mno_zos_ppa1_name)) {
+    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

>From 05b4741e5d151034c7f6e12d764d98bef5d47d72 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Mon, 6 Jul 2026 16:11:19 -0400
Subject: [PATCH 3/8] Move ZOSPPA1Name from LangOptions to CodeGenOptions.

---
 clang/include/clang/Basic/CodeGenOptions.def |  4 +++
 clang/include/clang/Basic/CodeGenOptions.h   |  7 +++++
 clang/include/clang/Basic/LangOptions.def    |  2 --
 clang/include/clang/Basic/LangOptions.h      | 10 -------
 clang/lib/CodeGen/Targets/SystemZ.cpp        |  6 ++--
 clang/lib/Frontend/CompilerInvocation.cpp    | 30 ++++++++++----------
 6 files changed, 29 insertions(+), 30 deletions(-)

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index bcb47169403d8..3b68d4fc00266 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 c12434135a198..569ae9f74950c 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -240,6 +240,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 ce6be39843f09..1fb491a54a278 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -296,8 +296,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 1e8ba38df3c53..f21131622d03d 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 bcee3078fe06f..d64a42077a39a 100644
--- a/clang/lib/CodeGen/Targets/SystemZ.cpp
+++ b/clang/lib/CodeGen/Targets/SystemZ.cpp
@@ -603,10 +603,10 @@ class ZOSXPLinkTargetCodeGenInfo : public 
TargetCodeGenInfo {
                            CodeGen::CodeGenModule &M) const override {
     if (dyn_cast_or_null<FunctionDecl>(D)) {
       if (auto *Fn = dyn_cast<llvm::Function>(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 73d1ec9b9a7d8..b3f3f174c0250 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.

>From 23f853f41b6762b114153c51bff4b55fd8a7aebf Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Thu, 9 Jul 2026 17:42:02 +0000
Subject: [PATCH 4/8] Use marshalling in option handling and some other small
 changes.

---
 clang/include/clang/Basic/CodeGenOptions.def  |  3 +-
 clang/include/clang/Basic/CodeGenOptions.h    |  7 ----
 clang/include/clang/Options/Options.td        | 11 +++---
 clang/lib/CodeGen/CodeGenFunction.cpp         |  3 ++
 clang/lib/CodeGen/Targets/SystemZ.cpp         | 13 -------
 clang/lib/Driver/ToolChains/Clang.cpp         |  9 +++++
 clang/lib/Driver/ToolChains/ZOS.cpp           |  3 --
 clang/lib/Frontend/CompilerInvocation.cpp     | 16 +-------
 clang/test/CodeGen/SystemZ/zos-ppa1-name.c    | 11 +++---
 llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 14 ++-----
 llvm/test/CodeGen/SystemZ/zos-ppa1.ll         | 38 -------------------
 11 files changed, 28 insertions(+), 100 deletions(-)

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index 3b68d4fc00266..7e54e75752f39 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -537,8 +537,7 @@ ENUM_CODEGENOPT(WinControlFlowGuardMechanism, 
ControlFlowGuardMechanism,
 CODEGENOPT(DisableOutlining, 1, 0, Benign)
 
 /// Controlls the emission of function name in PPA1 on z/OS.
-ENUM_CODEGENOPT(ZOSPPA1Name, ZOSPPA1NameKind,
-                2, ZOSPPA1NameKind::Default, Benign)
+CODEGENOPT(ZOSPPA1Name, 1, 1, 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 569ae9f74950c..c12434135a198 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -240,13 +240,6 @@ 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/Options/Options.td 
b/clang/include/clang/Options/Options.td
index cdbcfb30ba772..341909e756cf8 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -6093,12 +6093,11 @@ defm backchain : BoolMOption<"backchain",
   PosFlag<SetTrue, [], [ClangOption], "Link stack frames through backchain on 
System Z">,
   NegFlag<SetFalse>, BothFlags<[], [ClangOption, CC1Option]>>;
 
-def mzos_ppa1_name : Flag<["-"], "mzos-ppa1-name">, Group<m_Group>,
-  Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option]>,
-  HelpText<"Emit the function name in PPA1 on z/OS">;
-def mno_zos_ppa1_name : Flag<["-"], "mno-zos-ppa1-name">, Group<m_Group>,
-  Flags<[TargetSpecific]>, Visibility<[ClangOption, CC1Option]>,
-  HelpText<"Do not emit the function name in PPA1 on z/OS">;
+defm zos_ppa1_name : BoolMOption<"zos-ppa1-name",
+  CodeGenOpts<"ZOSPPA1Name">, DefaultTrue,
+  PosFlag<SetTrue, [], [], "Emit the function name in PPA1 on z/OS">,
+  NegFlag<SetFalse, [], [], "Do not emit the function name in PPA1 on z/OS">,
+  BothFlags<[], [ClangOption, CC1Option]>>;
 
 def mno_warn_nonportable_cfstrings : Flag<["-"], 
"mno-warn-nonportable-cfstrings">, Group<m_Group>;
 def mno_omit_leaf_frame_pointer : Flag<["-"], "mno-omit-leaf-frame-pointer">, 
Group<m_Group>;
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp 
b/clang/lib/CodeGen/CodeGenFunction.cpp
index 80c5268495fe6..4f93e6c3d0ea1 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1203,6 +1203,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, 
QualType RetTy,
     Fn->addFnAttr("packed-stack");
   }
 
+  if (!CGM.getCodeGenOpts().ZOSPPA1Name)
+    Fn->addFnAttr("zos-ppa1-name", "none");
+
   if (CGM.getCodeGenOpts().WarnStackSize != UINT_MAX &&
       !CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
     Fn->addFnAttr("warn-stack-size",
diff --git a/clang/lib/CodeGen/Targets/SystemZ.cpp 
b/clang/lib/CodeGen/Targets/SystemZ.cpp
index d64a42077a39a..a27fee633ead2 100644
--- a/clang/lib/CodeGen/Targets/SystemZ.cpp
+++ b/clang/lib/CodeGen/Targets/SystemZ.cpp
@@ -598,19 +598,6 @@ class ZOSXPLinkTargetCodeGenInfo : public 
TargetCodeGenInfo {
     SwiftInfo =
         std::make_unique<SwiftABIInfo>(CGT, /*SwiftErrorInRegister=*/false);
   }
-
-  void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
-                           CodeGen::CodeGenModule &M) const override {
-    if (dyn_cast_or_null<FunctionDecl>(D)) {
-      if (auto *Fn = dyn_cast<llvm::Function>(GV)) {
-        auto ZOSPPA1Name = M.getCodeGenOpts().getZOSPPA1Name();
-        if (ZOSPPA1Name == clang::CodeGenOptions::ZOSPPA1NameKind::Emit)
-          Fn->addFnAttr("zos-ppa1-name", "all");
-        else if (ZOSPPA1Name == clang::CodeGenOptions::ZOSPPA1NameKind::NoEmit)
-          Fn->addFnAttr("zos-ppa1-name", "none");
-      }
-    }
-  }
 };
 
 } // namespace
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 39eca94556049..08b72254dd939 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2168,6 +2168,15 @@ void Clang::AddSystemZTargetArgs(const ArgList &Args,
     CmdArgs.push_back("-mfloat-abi");
     CmdArgs.push_back("soft");
   }
+
+  if (Arg *A = Args.getLastArg(options::OPT_mzos_ppa1_name,
+                               options::OPT_mno_zos_ppa1_name)) {
+    if(!Triple.isOSzOS())
+      D.Diag(diag::err_drv_unsupported_opt_for_target)
+          << A->getSpelling() << Triple.str();
+    else
+      CmdArgs.push_back(A->getValue());
+  }
 }
 
 void Clang::AddX86TargetArgs(const ArgList &Args,
diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp 
b/clang/lib/Driver/ToolChains/ZOS.cpp
index 107f150fa8274..da4aaa28cd1da 100644
--- a/clang/lib/Driver/ToolChains/ZOS.cpp
+++ b/clang/lib/Driver/ToolChains/ZOS.cpp
@@ -49,9 +49,6 @@ void ZOS::addClangTargetOptions(const ArgList &DriverArgs,
   if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
                                 options::OPT_fno_sized_deallocation))
     CC1Args.push_back("-fno-sized-deallocation");
-
-  DriverArgs.AddLastArg(CC1Args, options::OPT_mzos_ppa1_name,
-                        options::OPT_mno_zos_ppa1_name);
 }
 
 void zos::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index b3f3f174c0250..8fd28f5129d22 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1766,11 +1766,6 @@ 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);
 
@@ -2198,15 +2193,8 @@ 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);
-    }
-  }
+  if (!T.isOSzOS() && Args.hasArg(OPT_mzos_ppa1_name, OPT_mno_zos_ppa1_name))
+    Opts.ZOSPPA1Name = true;
 
   bool NeedLocTracking = false;
 
diff --git a/clang/test/CodeGen/SystemZ/zos-ppa1-name.c 
b/clang/test/CodeGen/SystemZ/zos-ppa1-name.c
index e49c6ae7a20ca..1f5db9b13307d 100644
--- a/clang/test/CodeGen/SystemZ/zos-ppa1-name.c
+++ b/clang/test/CodeGen/SystemZ/zos-ppa1-name.c
@@ -2,17 +2,16 @@
 
 // test default
 // RUN: %clang_cc1 -triple s390x-ibm-zos -emit-llvm %s -o -\
-// RUN:   | FileCheck %s -check-prefix=DEFAULT
+// RUN:   | FileCheck %s -check-prefix=EMIT
 
 // test the positive and negative options
 // RUN: %clang_cc1 -triple s390x-ibm-zos -mzos-ppa1-name -emit-llvm %s -o -\
-// RUN:   | FileCheck %s -check-prefix=EMIT-NAME
+// RUN:   | FileCheck %s -check-prefix=EMIT
 // RUN: %clang_cc1 -triple s390x-ibm-zos -mno-zos-ppa1-name -emit-llvm %s -o -\
-// RUN:   | FileCheck %s -check-prefix=NOT-EMIT-NAME
+// RUN:   | FileCheck %s -check-prefix=NOEMIT
 
-// DEFAULT-NOT: attributes #0 = {{{.*}}"zos-ppa1-name"{{.*}}}
-// EMIT-NAME: attributes #0 = {{{.*}}"zos-ppa1-name"="all"{{.*}}}
-// NOT-EMIT-NAME: attributes #0 = {{{.*}}"zos-ppa1-name"="none"{{.*}}}
+// EMIT-NOT: attributes #0 = {{{.*}}"zos-ppa1-name"="none"{{.*}}}
+// NOEMIT: attributes #0 = {{{.*}}"zos-ppa1-name"="none"{{.*}}}
 
 int main() {
   return 0;
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp 
b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index bcabec73f0eb5..5debc44d96a05 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1866,17 +1866,9 @@ void SystemZAsmPrinter::calculatePPA1() {
   determinePrologueStackUpdateSym(MF, EndOfPrologSym, StackUpdateSym);
 
   // Save the calculated values.
-  // Whether to emit the function name is decided by optimization level,
-  // unless it is explicitly required via -m[no-]zos-ppa1-name options.
-  bool IncludeFunctionName = !MF->getFunction().hasMinSize();
-  if (MF->getFunction().hasFnAttribute("zos-ppa1-name")) {
-    auto ZOSPPA1Name =
-        MF->getFunction().getFnAttribute("zos-ppa1-name").getValueAsString();
-    assert((ZOSPPA1Name == "all" || ZOSPPA1Name == "none") &&
-           "Invalid value for attribute zos-ppa1-name.");
-    IncludeFunctionName = ZOSPPA1Name == "all";
-  }
-  if (MF->getFunction().hasName() && IncludeFunctionName)
+  if (MF->getFunction().hasName() &&
+      MF->getFunction().getFnAttribute("zos-ppa1-name").getValueAsString()
+          != "none")
     Info.Name = MF->getFunction().getName();
   Info.PPA1 = OutContext.createTempSymbol(Twine("PPA1_").concat(N), true);
   Info.EPMarker = OutContext.createTempSymbol(Twine("EPM_").concat(N), true);
diff --git a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll 
b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
index 49fe981f65980..17e36db6b7847 100644
--- a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
+++ b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
@@ -222,41 +222,3 @@ entry:
   ret void
 }
 attributes #0 = { "zos-ppa1-name"="none" }
-
-; Attribute minsize removes the function name from PPA1.
-; CHECK: * PPA1
-; CHECK-NEXT: L#PPA1_void_test_minsize_0 DS 0H
-; CHECK:      * PPA1 Flags 4
-; CHECK-NEXT:  DC XL1'80'
-; CHECK-NEXT: * Length/4 of Parms
-; CHECK-NEXT:  DC XL2'0000'
-; CHECK-NEXT: * Length of Code
-; CHECK-NEXT:  DC AD(L#void_test_minsize_end_0-L#EPM_void_test_minsize_0)
-; CHECK-NEXT:  DC AD(L#EPM_void_test_minsize_0-L#PPA1_void_test_minsize_0)
-define void @void_test_minsize() #1 {
-entry:
-  ret void
-}
-attributes #1 = { minsize }
-
-; Attribute "zos-ppa1-name"="all" takes precedence over minsize,
-; and thus emits the function name in PPA1.
-; CHECK: * PPA1
-; CHECK-NEXT: L#PPA1_void_test_name_0 DS 0H
-; CHECK: * PPA1 Flags 4
-; CHECK-NEXT: *   Bit 7: 1 = Name Length and Name
-; CHECK-NEXT:  DC XL1'81'
-; CHECK-NEXT: * Length/4 of Parms
-; CHECK-NEXT:  DC XL2'0000'
-; CHECK-NEXT: * Length of Code
-; CHECK-NEXT:  DC AD(L#void_test_name_end_0-L#EPM_void_test_name_0)
-; CHECK-NEXT: * Length of Name
-; CHECK-NEXT:  DC XL2'000E'
-; CHECK-NEXT: * Name of Function
-; CHECK-NEXT:  DC XL14'A59689846DA385A2A36D95819485'
-; CHECK-NEXT: DC AD(L#EPM_void_test_name_0-L#PPA1_void_test_name_0)
-define void @void_test_name() #2 {
-entry:
-  ret void
-}
-attributes #2 = { "zos-ppa1-name"="all" minsize }

>From 95fa462ca468d7de06d251c971df4578170610e7 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Thu, 9 Jul 2026 19:49:25 +0000
Subject: [PATCH 5/8] Use TargetSpecific instead of manually emitting error.

---
 clang/include/clang/Options/Options.td |  2 +-
 clang/lib/Driver/ToolChains/Clang.cpp  | 11 +++--------
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 341909e756cf8..77c93db0079d5 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -6097,7 +6097,7 @@ defm zos_ppa1_name : BoolMOption<"zos-ppa1-name",
   CodeGenOpts<"ZOSPPA1Name">, DefaultTrue,
   PosFlag<SetTrue, [], [], "Emit the function name in PPA1 on z/OS">,
   NegFlag<SetFalse, [], [], "Do not emit the function name in PPA1 on z/OS">,
-  BothFlags<[], [ClangOption, CC1Option]>>;
+  BothFlags<[TargetSpecific], [ClangOption, CC1Option]>>;
 
 def mno_warn_nonportable_cfstrings : Flag<["-"], 
"mno-warn-nonportable-cfstrings">, Group<m_Group>;
 def mno_omit_leaf_frame_pointer : Flag<["-"], "mno-omit-leaf-frame-pointer">, 
Group<m_Group>;
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 08b72254dd939..daebc4040a09a 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2169,14 +2169,9 @@ void Clang::AddSystemZTargetArgs(const ArgList &Args,
     CmdArgs.push_back("soft");
   }
 
-  if (Arg *A = Args.getLastArg(options::OPT_mzos_ppa1_name,
-                               options::OPT_mno_zos_ppa1_name)) {
-    if(!Triple.isOSzOS())
-      D.Diag(diag::err_drv_unsupported_opt_for_target)
-          << A->getSpelling() << Triple.str();
-    else
-      CmdArgs.push_back(A->getValue());
-  }
+  if(Triple.isOSzOS())
+    Args.AddLastArg(CmdArgs, options::OPT_mzos_ppa1_name,
+                    options::OPT_mno_zos_ppa1_name);
 }
 
 void Clang::AddX86TargetArgs(const ArgList &Args,

>From 00198baa7ebc62909e122a422fd6be5fa34dbf0e Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Fri, 10 Jul 2026 12:29:37 +0000
Subject: [PATCH 6/8] Remove check of systems for option validation at cc1.

---
 clang/lib/Frontend/CompilerInvocation.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 8fd28f5129d22..6545307a8c8a7 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2193,9 +2193,6 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions 
&Opts, ArgList &Args,
         << A->getSpelling() << T.str();
   }
 
-  if (!T.isOSzOS() && Args.hasArg(OPT_mzos_ppa1_name, OPT_mno_zos_ppa1_name))
-    Opts.ZOSPPA1Name = true;
-
   bool NeedLocTracking = false;
 
   if (!Opts.OptRecordFile.empty())

>From bc6986286915b1b9768f226766d6b7d1773b2781 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Fri, 10 Jul 2026 18:00:46 +0000
Subject: [PATCH 7/8] Fix format.

---
 clang/lib/Driver/ToolChains/Clang.cpp |  2 +-
 llvm/test/CodeGen/SystemZ/zos-ppa1.ll | 14 ++++++++++----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index daebc4040a09a..961906e02639a 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2169,7 +2169,7 @@ void Clang::AddSystemZTargetArgs(const ArgList &Args,
     CmdArgs.push_back("soft");
   }
 
-  if(Triple.isOSzOS())
+  if (Triple.isOSzOS())
     Args.AddLastArg(CmdArgs, options::OPT_mzos_ppa1_name,
                     options::OPT_mno_zos_ppa1_name);
 }
diff --git a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll 
b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
index 17e36db6b7847..ef37cf2ed19b5 100644
--- a/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
+++ b/llvm/test/CodeGen/SystemZ/zos-ppa1.ll
@@ -209,15 +209,21 @@ declare i32 @other(ptr, i32)
 
 ; Attribute "zos-ppa1-name"="none" removes the function name from PPA1.
 ; CHECK: * PPA1
-; CHECK-NEXT: L#PPA1_void_test_no_name_0 DS 0H
+; CHECK-NEXT: L#PPA1_no_name_0 DS 0H
 ; CHECK:      * PPA1 Flags 4
 ; CHECK-NEXT:  DC XL1'80'
 ; CHECK-NEXT: * Length/4 of Parms
 ; CHECK-NEXT:  DC XL2'0000'
+; CHECK-NEXT: * Length/2 of Prolog
+; CHECK-NEXT:  DC XL1'00'
+; CHECK-NEXT: * Alloca Reg + Offset/2 to SP Update
+; CHECK-NEXT: *   Bit 0-3: Register R0
+; CHECK-NEXT: *   Bit 4-8: Offset
+; CHECK-NEXT:  DC XL1'0'
 ; CHECK-NEXT: * Length of Code
-; CHECK-NEXT:  DC AD(L#void_test_no_name_end_0-L#EPM_void_test_no_name_0)
-; CHECK-NEXT:  DC AD(L#EPM_void_test_no_name_0-L#PPA1_void_test_no_name_0)
-define void @void_test_no_name() #0 {
+; CHECK-NEXT:  DC AD(L#no_name_end_0-L#EPM_no_name_0)
+; CHECK-NEXT:  DC AD(L#EPM_no_name_0-L#PPA1_no_name_0)
+define void @no_name() #0 {
 entry:
   ret void
 }

>From 74053b2fc9b16cff2cfc541cc491b732772685f8 Mon Sep 17 00:00:00 2001
From: sujianIBM <[email protected]>
Date: Fri, 10 Jul 2026 18:47:40 +0000
Subject: [PATCH 8/8] Fix format.

---
 llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp 
b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index 5debc44d96a05..d1f19c27ca4d9 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1867,8 +1867,8 @@ void SystemZAsmPrinter::calculatePPA1() {
 
   // Save the calculated values.
   if (MF->getFunction().hasName() &&
-      MF->getFunction().getFnAttribute("zos-ppa1-name").getValueAsString()
-          != "none")
+      MF->getFunction().getFnAttribute("zos-ppa1-name").getValueAsString() !=
+          "none")
     Info.Name = MF->getFunction().getName();
   Info.PPA1 = OutContext.createTempSymbol(Twine("PPA1_").concat(N), true);
   Info.EPMarker = OutContext.createTempSymbol(Twine("EPM_").concat(N), true);

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to