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
