Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1226,6 +1226,8 @@ def m64 : Flag<["-"], "m64">, Group, Flags<[DriverOption, CoreOption]>; def mx32 : Flag<["-"], "mx32">, Group, Flags<[DriverOption, CoreOption]>; def mabi_EQ : Joined<["-"], "mabi=">, Group; +def miamcu : Flag<["-"], "miamcu">, Group, Flags<[DriverOption, CoreOption]>, + HelpText<"Use Intel MCU ABI.">; def malign_functions_EQ : Joined<["-"], "malign-functions=">, Group; def malign_loops_EQ : Joined<["-"], "malign-loops=">, Group; def malign_jumps_EQ : Joined<["-"], "malign-jumps=">, Group; Index: lib/Driver/Tools.h =================================================================== --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -122,6 +122,8 @@ : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {} void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + void AddX86TargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; bool hasGoodDiagnostics() const override { return true; } bool hasIntegratedAssembler() const override { return false; } bool hasIntegratedCPP() const override { return false; } Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1994,6 +1994,18 @@ << A->getOption().getName() << Value; } } + + // If -miamcu is set then set flags to support MCU ABI and use MCU triple. + if (Args.getLastArg(options::OPT_miamcu)) { + if (getToolChain().getArch() != llvm::Triple::x86) + getToolChain().getDriver().Diag(diag::err_drv_unsupported_opt) + << "-miamcu"; + CmdArgs.push_back("-triple"); + CmdArgs.push_back("i586-intel-elfiamcu"); + CmdArgs.push_back("-mfloat-abi"); + CmdArgs.push_back("soft"); + CmdArgs.push_back("-mstack-alignment=4"); + } } void Clang::AddHexagonTargetArgs(const ArgList &Args, @@ -5707,6 +5719,18 @@ CmdArgs.push_back(ABIName.data()); } +void ClangAs::AddX86TargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + // If -miamcu is set then use MCU triple. + if (Args.getLastArg(options::OPT_miamcu)) { + if (getToolChain().getArch() != llvm::Triple::x86) + getToolChain().getDriver().Diag(diag::err_drv_unsupported_opt) + << "-miamcu"; + CmdArgs.push_back("-triple"); + CmdArgs.push_back("i586-intel-elfiamcu"); + } +} + void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, @@ -5847,6 +5871,11 @@ case llvm::Triple::mips64el: AddMIPSTargetArgs(Args, CmdArgs); break; + + case llvm::Triple::x86: + case llvm::Triple::x86_64: + AddX86TargetArgs(Args, CmdArgs); + break; } // Consume all the warning flags. Usually this would be handled more Index: test/Driver/miamcu-opt.c =================================================================== --- /dev/null +++ test/Driver/miamcu-opt.c @@ -0,0 +1,11 @@ +// RUN: %clang -m32 -miamcu %s -### -o %t.o 2>&1 | FileCheck %s -check-prefix=M32 +// RUN: %clang -m64 -miamcu %s -### -o %t.o 2>&1 | FileCheck %s -check-prefix=M64 + +// M32-NOT: error: unsupported option '-miamcu' +// M32: "-cc1" +// M32: "-triple" "i586-intel-elfiamcu" +// M32: "-mfloat-abi" "soft" +// M32: "-mstack-alignment=4" + +// M64: error: unsupported option '-miamcu' +// M64: "-cc1" Index: test/Driver/miamcu-opt.s =================================================================== --- /dev/null +++ test/Driver/miamcu-opt.s @@ -0,0 +1,9 @@ +// RUN: %clang -m32 -miamcu %s -### -o %t.o 2>&1 | FileCheck %s -check-prefix=M32 +// RUN: %clang -m64 -miamcu %s -### -o %t.o 2>&1 | FileCheck %s -check-prefix=M64 + +// M32-NOT: error: unsupported option '-miamcu' +// M32: "-cc1as" +// M32: "-triple" "i586-intel-elfiamcu" + +// M64: error: unsupported option '-miamcu' +// M64: "-cc1as"