diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -509,4 +509,6 @@ InGroup>; 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.">; } 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 @@ -475,6 +475,26 @@ Target.getOS() == llvm::Triple::Minix) return Target; + // On AIX, the env OBJECT_MODE may affect the resulting arch variant. + if (Target.isOSAIX()) { + if (Optional ObjectModeValue = + llvm::sys::Process::GetEnv("OBJECT_MODE")) { + StringRef ObjectMode = *ObjectModeValue; + llvm::Triple::ArchType AT = llvm::Triple::UnknownArch; + + if (ObjectMode.equals("64")) { + AT = Target.get64BitArchVariant().getArch(); + } else if (ObjectMode.equals("32")) { + AT = Target.get32BitArchVariant().getArch(); + } else { + D.Diag(diag::err_drv_invalid_object_mode) << ObjectMode; + } + + if (AT != llvm::Triple::UnknownArch && AT != Target.getArch()) + Target.setArch(AT); + } + } + // 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); diff --git a/clang/test/Driver/aix-object-mode.c b/clang/test/Driver/aix-object-mode.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/aix-object-mode.c @@ -0,0 +1,22 @@ +// Check that setting an OBJECT_MODE converts the AIX triple to the right variant. +// RUN: env OBJECT_MODE=64 \ +// RUN: %clang -target powerpc-ibm-aix -print-target-triple | FileCheck -check-prefix=CHECK64 %s + +// RUN: env OBJECT_MODE=32 \ +// RUN: %clang -target powerpc64-ibm-aix -print-target-triple | FileCheck -check-prefix=CHECK32 %s + +// Command-line options win. +// RUN: env OBJECT_MODE=64 \ +// RUN: %clang -target powerpc64-ibm-aix -print-target-triple -m32 | FileCheck -check-prefix=CHECK32 %s + +// RUN: env OBJECT_MODE=32 \ +// RUN: %clang -target powerpc-ibm-aix -print-target-triple -m64 | FileCheck -check-prefix=CHECK64 %s + +// CHECK32: powerpc-ibm-aix +// CHECK64: powerpc64-ibm-aix + +// Emit a diagnostic if there is an invalid mode. +// RUN: env OBJECT_MODE=31 \ +// RUN: not %clang -target powerpc-ibm-aix 2>&1 | FileCheck -check-prefix=DIAG %s + +// DIAG: error: OBJECT_MODE setting 31 is not recognized and is not a valid setting.