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
