Author: Kelvin Li
Date: 2026-08-10T18:04:33-04:00
New Revision: 8045b0260b2def321ae98582177e185a2480ba85

URL: 
https://github.com/llvm/llvm-project/commit/8045b0260b2def321ae98582177e185a2480ba85
DIFF: 
https://github.com/llvm/llvm-project/commit/8045b0260b2def321ae98582177e185a2480ba85.diff

LOG: [flang][AIX] Diagnose unsupported OBJECT_MODE setting and -maix32 option 
(#209919)

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.

Added: 
    flang/test/Driver/aix-object-mode.f90

Modified: 
    clang/include/clang/Basic/DiagnosticDriverKinds.td
    clang/lib/Driver/Driver.cpp
    flang-rt/test/lit.cfg.py
    flang/test/Driver/m32-option.f90
    flang/test/lit.cfg.py

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index ae3eecc60fc78..91895d4957cf7 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_aix : Error<
+  "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 3b5d0c0aad981..d4719f37e5b4d 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -695,21 +695,40 @@ 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()) {
+        if (ObjectMode == "64") {
+          AT = Target.get64BitArchVariant().getArch();
+        } else if (ObjectMode == "32" || ObjectMode == "32_64" ||
+                   ObjectMode == "any") {
+          // OBJECT_MODE setting can be overridden by -maix64/-m64
+          if (Args.hasArg(options::OPT_maix64, options::OPT_m64))
+            AT = Target.get64BitArchVariant().getArch();
+          else
+            D.Diag(diag::err_drv_compile_mode_unsupported_aix);
+        } else {
+          D.Diag(diag::err_drv_invalid_object_mode) << ObjectMode;
+        }
+      } 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)) {
+      // For flang on AIX, if OBJECT_MODE is unset and neither
+      // -maix64 nor -m64 is specified, issue an error.
+      D.Diag(diag::err_drv_compile_mode_unsupported_aix);
     }
   }
 #endif
@@ -748,9 +767,13 @@ 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()) {
+        if (Target.isOSAIX()) {
+          D.Diag(diag::err_drv_compile_mode_unsupported_aix);
+        } else {
+          D.Diag(diag::err_drv_unsupported_opt_for_target)
+              << A->getAsString(Args) << Target.str();
+        }
       } 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..74958d8155ef6 100644
--- a/flang-rt/test/lit.cfg.py
+++ b/flang-rt/test/lit.cfg.py
@@ -108,7 +108,6 @@ def shjoin(args, sep=" "):
 if config.flang_rt_fortran_modules:
     config.available_features.add("fortran-modules")
 
-# Tools that support OBJECT_MODE default to 32-bit on AIX. Set
-# OBJECT_MODE=any to handle both 32-bit and 64-bit objects.
+# Set OBJECT_MODE=64 as tools on AIX default to 32-bit.
 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..773e5abf48c1e
--- /dev/null
+++ b/flang/test/Driver/aix-object-mode.f90
@@ -0,0 +1,28 @@
+! Check Flang on AIX OBJECT_MODE handling with -maix* setting.
+!REQUIRES: system-aix
+
+!RUN: env -u OBJECT_MODE not %flang %s 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 %s 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 %s 2>&1 | FileCheck 
-check-prefix=MODE-64BIT %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 %s 2>&1 | 
FileCheck -check-prefix=MODE-64BIT %s
+
+!RUN: env OBJECT_MODE=7 not %flang %s 2>&1 | FileCheck 
-check-prefix=OBJECT-MODE-INVALID-ERROR %s
+
+!RUN: env OBJECT_MODE='' not %flang %s 2>&1 | FileCheck 
-check-prefix=OBJECT-MODE-EMPTY-ERROR %s
+
+!OBJECT-MODE-INVALID-ERROR: error: OBJECT_MODE setting 7 is not recognized and 
is not a valid setting
+!OBJECT-MODE-EMPTY-ERROR: error: OBJECT_MODE setting is not recognized and is 
not a valid setting
+!MODE-64BIT: powerpc64-ibm-aix
+!MAIX32-ERROR: error: 32-bit compile mode is not supported. Use 
OBJECT_MODE=64, -maix64 or -m64
+
+program main
+end

diff  --git a/flang/test/Driver/m32-option.f90 
b/flang/test/Driver/m32-option.f90
index 722bddfa43739..3eb1081952331 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: 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 6159122fa6d0a..09f6f20ef30fc 100644
--- a/flang/test/lit.cfg.py
+++ b/flang/test/lit.cfg.py
@@ -276,3 +276,7 @@ def get_resource_module_intrinsic_dir(modfile):
     )
 else:
     config.substitutions.append(("%f128-lib", "NONE"))
+
+# Set OBJECT_MODE=64 as tools on AIX default to 32-bit.
+if "system-aix" in config.available_features:
+    config.environment["OBJECT_MODE"] = "64"


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

Reply via email to