[flang-commits] [flang] 8045b02 - [flang][AIX] Diagnose unsupported OBJECT_MODE setting and -maix32 option (#209919)
via flang-commits
flang-commits at lists.llvm.org
Mon Aug 10 15:04:38 PDT 2026
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"
More information about the flang-commits
mailing list