diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3416,10 +3416,12 @@ def EB : Flag<["-"], "EB">, Alias; def m16 : Flag<["-"], "m16">, Group, Flags<[NoXarchOption, CoreOption]>; def m32 : Flag<["-"], "m32">, Group, Flags<[NoXarchOption, CoreOption]>; +def maix32 : Flag<["-"], "maix32">, Group, Flags<[NoXarchOption]>; def mqdsp6_compat : Flag<["-"], "mqdsp6-compat">, Group, Flags<[NoXarchOption,CC1Option]>, HelpText<"Enable hexagon-qdsp6 backward compatibility">, MarshallingInfoFlag>; def m64 : Flag<["-"], "m64">, Group, Flags<[NoXarchOption, CoreOption]>; +def maix64 : Flag<["-"], "maix64">, Group, Flags<[NoXarchOption]>; def mx32 : Flag<["-"], "mx32">, Group, Flags<[NoXarchOption, CoreOption]>; def mabi_EQ : Joined<["-"], "mabi=">, Group; def miamcu : Flag<["-"], "miamcu">, Group, Flags<[NoXarchOption, CoreOption]>, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -594,13 +594,21 @@ } } + // The `-maix[32|64]` flags are only valid for AIX targets. + if (Arg *A = Args.getLastArgNoClaim(options::OPT_maix32, options::OPT_maix64); + A && !Target.isOSAIX()) + D.Diag(diag::err_drv_unsupported_opt_for_target) + << A->getAsString(Args) << Target.str(); + // Handle pseudo-target flags '-m64', '-mx32', '-m32' and '-m16'. Arg *A = Args.getLastArg(options::OPT_m64, options::OPT_mx32, - options::OPT_m32, options::OPT_m16); + options::OPT_m32, options::OPT_m16, + options::OPT_maix32, options::OPT_maix64); if (A) { llvm::Triple::ArchType AT = llvm::Triple::UnknownArch; - if (A->getOption().matches(options::OPT_m64)) { + if (A->getOption().matches(options::OPT_m64) || + A->getOption().matches(options::OPT_maix64)) { AT = Target.get64BitArchVariant().getArch(); if (Target.getEnvironment() == llvm::Triple::GNUX32) Target.setEnvironment(llvm::Triple::GNU); @@ -613,7 +621,8 @@ Target.setEnvironment(llvm::Triple::MuslX32); else Target.setEnvironment(llvm::Triple::GNUX32); - } else if (A->getOption().matches(options::OPT_m32)) { + } else if (A->getOption().matches(options::OPT_m32) || + A->getOption().matches(options::OPT_maix32)) { AT = Target.get32BitArchVariant().getArch(); if (Target.getEnvironment() == llvm::Triple::GNUX32) Target.setEnvironment(llvm::Triple::GNU); diff --git a/clang/test/Driver/aix-maix.c b/clang/test/Driver/aix-maix.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/aix-maix.c @@ -0,0 +1,17 @@ +// Check GCC AIX bitmode compat options. + +// RUN: %clang -target powerpc-ibm-aix -maix64 -### -c %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK64 %s + +// RUN: %clang -target powerpc64-ibm-aix -maix32 -### -c %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK32 %s + +// RUN: %clang -target powerpc-unknown-linux -maix64 -### -c %s 2>&1 | \ +// RUN: FileCheck --check-prefix=ERROR %s + +// RUN: %clang -target powerpc64-unknown-linux -maix32 -### -c %s 2>&1 | \ +// RUN: FileCheck --check-prefix=ERROR %s + +// CHECK32: Target: powerpc-ibm-aix +// CHECK64: Target: powerpc64-ibm-aix +// ERROR: error: unsupported option '-maix