https://github.com/kkwli updated 
https://github.com/llvm/llvm-project/pull/209919

>From a66afcbe5a0fe4cd8fbfd22cce9f7f0f49077548 Mon Sep 17 00:00:00 2001
From: Kelvin Li <[email protected]>
Date: Fri, 10 Jul 2026 14:31:07 -0400
Subject: [PATCH 1/2] [flang][AIX] Diagnose unsupported OBJECT_MODE setting and
 -maix32 option

This patch is to align flang's default behavior to the other tools in
toolchain on AIX. Flang assumes 32-bit compile by default. The compile
mode can be overridden by setting environment variable OBJECT_MODE=64
or specifying the -maix64 option.
---
 .../clang/Basic/DiagnosticDriverKinds.td      |  3 ++
 clang/lib/Driver/Driver.cpp                   | 45 ++++++++++++++-----
 flang-rt/test/lit.cfg.py                      |  2 +-
 flang/test/Driver/aix-object-mode.f90         | 21 +++++++++
 flang/test/Driver/m32-option.f90              | 10 ++---
 flang/test/lit.cfg.py                         |  5 +++
 6 files changed, 68 insertions(+), 18 deletions(-)
 create mode 100644 flang/test/Driver/aix-object-mode.f90

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index ae3eecc60fc78..63ac028e3f87d 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -826,6 +826,9 @@ def err_drv_cannot_mix_options : Error<"cannot specify '%1' 
along with '%0'">;
 def err_drv_invalid_object_mode : Error<
   "OBJECT_MODE setting %0 is not recognized and is not a valid setting">;
 
+def err_drv_compile_mode_unsupported : Error<
+  "the 32-bit compile mode is not supported. Use OBJECT_MODE=64, -maix64 or 
-m64">;
+
 def err_roptr_requires_data_sections: Error<"-mxcoff-roptr is supported only 
with -fdata-sections">;
 def err_roptr_cannot_build_shared: Error<"-mxcoff-roptr is not supported with 
-shared">;
 
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index e606cdc4c1cf8..4f63c2bd44ba8 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -675,21 +675,37 @@ static llvm::Triple computeTargetTriple(const Driver &D, 
StringRef TargetTriple,
       StringRef ObjectMode = *ObjectModeValue;
       llvm::Triple::ArchType AT = llvm::Triple::UnknownArch;
 
-      // Silently accept '32_64' and 'any'
-      const bool OtherAllowedMode =
-          ObjectMode == "32_64" || ObjectMode == "any";
-      if (ObjectMode == "64") {
-        AT = Target.get64BitArchVariant().getArch();
-      } else if (ObjectMode == "32") {
-        AT = Target.get32BitArchVariant().getArch();
-      } else if (!OtherAllowedMode) {
-        D.Diag(diag::err_drv_invalid_object_mode) << ObjectMode;
+      if (D.IsFlangMode()) {
+        bool HasMaix = Args.hasArg(options::OPT_maix32, options::OPT_maix64,
+                                   options::OPT_m32, options::OPT_m64);
+        if (!HasMaix) {
+          if (ObjectMode == "64") {
+            AT = Target.get64BitArchVariant().getArch();
+          } else {
+            D.Diag(diag::err_drv_compile_mode_unsupported);
+            AT = Target.get32BitArchVariant().getArch();
+          }
+        }
+      } else {
+        // Silently accept '32_64' and 'any'
+        const bool OtherAllowedMode =
+            ObjectMode == "32_64" || ObjectMode == "any";
+        if (ObjectMode == "64") {
+          AT = Target.get64BitArchVariant().getArch();
+        } else if (ObjectMode == "32") {
+          AT = Target.get32BitArchVariant().getArch();
+        } else if (!OtherAllowedMode) {
+          D.Diag(diag::err_drv_invalid_object_mode) << ObjectMode;
+        }
       }
 
       if (AT != llvm::Triple::UnknownArch && AT != Target.getArch()) {
         Target.setArch(AT);
         Target = llvm::Triple(Target.normalize());
       }
+    } else if (D.IsFlangMode() &&
+               !Args.hasArg(options::OPT_maix64, options::OPT_m64)) {
+      D.Diag(diag::err_drv_compile_mode_unsupported);
     }
   }
 #endif
@@ -728,9 +744,14 @@ static llvm::Triple computeTargetTriple(const Driver &D, 
StringRef TargetTriple,
         Target.setEnvironment(llvm::Triple::GNUX32);
     } else if (A->getOption().matches(options::OPT_m32) ||
                A->getOption().matches(options::OPT_maix32)) {
-      if (D.IsFlangMode() && !Target.isOSAIX()) {
-        D.Diag(diag::err_drv_unsupported_opt_for_target)
-            << A->getAsString(Args) << Target.str();
+      if (D.IsFlangMode()) {
+        // On AIX, flang assumes 32-bit mode compile by default
+        if (!Target.isOSAIX()) {
+          D.Diag(diag::err_drv_unsupported_opt_for_target)
+              << A->getAsString(Args) << Target.str();
+        } else if (llvm::sys::Process::GetEnv("OBJECT_MODE")) {
+          D.Diag(diag::err_drv_compile_mode_unsupported);
+        }
       } else {
         AT = Target.get32BitArchVariant().getArch();
         if (Target.getEnvironment() == llvm::Triple::GNUX32)
diff --git a/flang-rt/test/lit.cfg.py b/flang-rt/test/lit.cfg.py
index 9780a0e77ed7a..9b81d9494e598 100644
--- a/flang-rt/test/lit.cfg.py
+++ b/flang-rt/test/lit.cfg.py
@@ -111,4 +111,4 @@ def shjoin(args, sep=" "):
 # Tools that support OBJECT_MODE default to 32-bit on AIX. Set
 # OBJECT_MODE=any to handle both 32-bit and 64-bit objects.
 if "system-aix" in config.available_features:
-    config.environment["OBJECT_MODE"] = "any"
+    config.environment["OBJECT_MODE"] = "64"
diff --git a/flang/test/Driver/aix-object-mode.f90 
b/flang/test/Driver/aix-object-mode.f90
new file mode 100644
index 0000000000000..30d5c51e4251e
--- /dev/null
+++ b/flang/test/Driver/aix-object-mode.f90
@@ -0,0 +1,21 @@
+! Check Flang on AIX OBJECT_MODE handling and -maix* flag behavior.
+!REQUIRES: system-aix
+
+!RUN: env -u OBJECT_MODE not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=32 not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=32_64 not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=any not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=64 %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %s
+
+!RUN: not %flang -maix32 -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=64 not %flang -maix32 -print-target-triple 2>&1 | 
FileCheck -check-prefix=MAIX32-ERROR %s
+
+!RUN: env OBJECT_MODE=32 %flang -maix64 -print-target-triple 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %s
+
+!MODE-64BIT: powerpc64-ibm-aix
+!MAIX32-ERROR: error: the 32-bit compile mode is not supported. Use 
OBJECT_MODE=64, -maix64 or -m64
diff --git a/flang/test/Driver/m32-option.f90 b/flang/test/Driver/m32-option.f90
index 722bddfa43739..88cad46e209b4 100644
--- a/flang/test/Driver/m32-option.f90
+++ b/flang/test/Driver/m32-option.f90
@@ -1,14 +1,14 @@
 ! Check support of -m32.
-! RUN: %flang -target powerpc-ibm-aix -m32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32 %s
-! RUN: %flang -target powerpc64-ibm-aix -m32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32 %s
-! RUN: %flang -target powerpc-ibm-aix -maix32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32 %s
-! RUN: %flang -target powerpc64-ibm-aix -maix32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32 %s
+! RUN: not %flang -target powerpc-ibm-aix -m32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32-AIX-ERROR %s
+! RUN: not %flang -target powerpc64-ibm-aix -m32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32-AIX-ERROR %s
+! RUN: not %flang -target powerpc-ibm-aix -maix32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32-AIX-ERROR %s
+! RUN: not %flang -target powerpc64-ibm-aix -maix32 -### - %s 2>&1 | FileCheck 
-check-prefix=M32-AIX-ERROR %s
 ! RUN: %flang -target powerpc-ibm-aix -maix64 -### - %s 2>&1 | FileCheck 
-check-prefix=M64 %s
 ! RUN: %flang -target powerpc64-ibm-aix -maix64 -### - %s 2>&1 | FileCheck 
-check-prefix=M64 %s
 ! RUN: not %flang -target powerpc64le-unknown-linux-gnu -m32 -### - %s 2>&1 | 
FileCheck -check-prefix=M32-ERROR %s
 ! RUN: not %flang -target powerpc64le-unknown-linux-gnu -maix32 -### - %s 2>&1 
| FileCheck -check-prefix=MAIX32-ERROR %s
 
-! M32: "-triple" "powerpc-ibm-aix{{.*}}"
+! M32-AIX-ERROR: error: the 32-bit compile mode is not supported. Use 
OBJECT_MODE=64, -maix64 or -m64
 ! M64: "-triple" "powerpc64-ibm-aix{{.*}}"
 ! M32-ERROR: error: unsupported option '-m32' for target 
'powerpc64le-unknown-linux-gnu'
 ! MAIX32-ERROR: error: unsupported option '-maix32' for target 
'powerpc64le-unknown-linux-gnu'
diff --git a/flang/test/lit.cfg.py b/flang/test/lit.cfg.py
index 121854efe1f61..c9a860a8af111 100644
--- a/flang/test/lit.cfg.py
+++ b/flang/test/lit.cfg.py
@@ -271,3 +271,8 @@ def get_resource_module_intrinsic_dir(modfile):
     )
 else:
     config.substitutions.append(("%f128-lib", "NONE"))
+
+# Tools that support OBJECT_MODE default to 32-bit on AIX. Set
+# OBJECT_MODE=any to handle both 32-bit and 64-bit objects.
+if "system-aix" in config.available_features:
+    config.environment["OBJECT_MODE"] = "64"

>From ae02211657ddcc71f64db742a5bf0f5efe20788c Mon Sep 17 00:00:00 2001
From: Kelvin Li <[email protected]>
Date: Thu, 16 Jul 2026 13:12:33 -0400
Subject: [PATCH 2/2] update the logic to handle cases that targetting AIX
 platform

---
 clang/lib/Driver/Driver.cpp           | 15 ++++++++++-----
 flang/test/Driver/aix-object-mode.f90 | 19 +++++++++++--------
 2 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 4f63c2bd44ba8..018ab5569c659 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -745,12 +745,17 @@ static llvm::Triple computeTargetTriple(const Driver &D, 
StringRef TargetTriple,
     } else if (A->getOption().matches(options::OPT_m32) ||
                A->getOption().matches(options::OPT_maix32)) {
       if (D.IsFlangMode()) {
-        // On AIX, flang assumes 32-bit mode compile by default
-        if (!Target.isOSAIX()) {
-          D.Diag(diag::err_drv_unsupported_opt_for_target)
-              << A->getAsString(Args) << Target.str();
-        } else if (llvm::sys::Process::GetEnv("OBJECT_MODE")) {
+        // Flang does not support 32-bit compilation.
+        // On an AIX host, -m32/-maix32 is always an error.
+        // On a non-AIX host, it is an error only when targeting AIX.
+        llvm::Triple HostTriple(D.getTargetTriple());
+        if (HostTriple.isOSAIX() || Target.isOSAIX()) {
           D.Diag(diag::err_drv_compile_mode_unsupported);
+        } else {
+          AT = Target.get32BitArchVariant().getArch();
+          if (AT == llvm::Triple::ppcle)
+            D.Diag(diag::err_drv_unsupported_opt_for_target)
+                << A->getAsString(Args) << Target.str();
         }
       } else {
         AT = Target.get32BitArchVariant().getArch();
diff --git a/flang/test/Driver/aix-object-mode.f90 
b/flang/test/Driver/aix-object-mode.f90
index 30d5c51e4251e..47a4489cd0ee7 100644
--- a/flang/test/Driver/aix-object-mode.f90
+++ b/flang/test/Driver/aix-object-mode.f90
@@ -1,21 +1,24 @@
 ! Check Flang on AIX OBJECT_MODE handling and -maix* flag behavior.
 !REQUIRES: system-aix
 
-!RUN: env -u OBJECT_MODE not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+!RUN: env -u OBJECT_MODE not %flang %s 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=32 not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+!RUN: env OBJECT_MODE=32 not %flang %s 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=32_64 not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+!RUN: env OBJECT_MODE=32_64 not %flang %s 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=any not %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+!RUN: env OBJECT_MODE=any not %flang %s 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=64 %flang -print-target-triple 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %s
+!RUN: env OBJECT_MODE=64 %flang -print-target-triple %s 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %s
 
-!RUN: not %flang -maix32 -print-target-triple 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
+!RUN: not %flang -maix32 %s 2>&1 | FileCheck -check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=64 not %flang -maix32 -print-target-triple 2>&1 | 
FileCheck -check-prefix=MAIX32-ERROR %s
+!RUN: env OBJECT_MODE=64 not %flang -maix32 %s 2>&1 | FileCheck 
-check-prefix=MAIX32-ERROR %s
 
-!RUN: env OBJECT_MODE=32 %flang -maix64 -print-target-triple 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %s
+!RUN: env OBJECT_MODE=32 %flang -maix64 -print-target-triple %s 2>&1 | 
FileCheck -check-prefix=MODE-64BIT %s
 
 !MODE-64BIT: powerpc64-ibm-aix
 !MAIX32-ERROR: error: the 32-bit compile mode is not supported. Use 
OBJECT_MODE=64, -maix64 or -m64
+
+program main
+end

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

Reply via email to