Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
This revision was automatically updated to reflect the committed changes. Closed by commit rL272883: Compilation for Intel MCU (Part 2/3) (authored by aturetsk). Changed prior to commit: http://reviews.llvm.org/D19274?vs=57017=60958#toc Repository: rL LLVM http://reviews.llvm.org/D19274 Files: cfe/trunk/include/clang/Driver/ToolChain.h cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/ToolChains.cpp cfe/trunk/lib/Driver/ToolChains.h cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/miamcu-opt.c cfe/trunk/test/Driver/miamcu-opt.cpp Index: cfe/trunk/include/clang/Driver/ToolChain.h === --- cfe/trunk/include/clang/Driver/ToolChain.h +++ cfe/trunk/include/clang/Driver/ToolChain.h @@ -418,6 +418,10 @@ virtual void AddCudaIncludeArgs(const llvm::opt::ArgList , llvm::opt::ArgStringList ) const; + /// \brief Add arguments to use MCU GCC toolchain includes. + virtual void AddIAMCUIncludeArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const; + /// \brief Return sanitizers which are available in this toolchain. virtual SanitizerMask getSupportedSanitizers() const; Index: cfe/trunk/test/Driver/miamcu-opt.c === --- cfe/trunk/test/Driver/miamcu-opt.c +++ cfe/trunk/test/Driver/miamcu-opt.c @@ -16,3 +16,6 @@ // CHECK: "-static-define" // CHECK: "-mfloat-abi" "soft" // CHECK: "-mstack-alignment=4" + +// CHECK: bin/ld +// CHECK: "-static" Index: cfe/trunk/test/Driver/miamcu-opt.cpp === --- cfe/trunk/test/Driver/miamcu-opt.cpp +++ cfe/trunk/test/Driver/miamcu-opt.cpp @@ -0,0 +1,3 @@ +// RUN: %clang -miamcu %s -### -o %t.o 2>&1 | FileCheck %s + +// CHECK: error: the clang compiler does not support 'C++ for IAMCU' Index: cfe/trunk/lib/Driver/Tools.cpp === --- cfe/trunk/lib/Driver/Tools.cpp +++ cfe/trunk/lib/Driver/Tools.cpp @@ -295,6 +295,7 @@ const InputInfoList , const ToolChain *AuxToolChain) const { Arg *A; + const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); CheckPreprocessingOptions(D, Args); @@ -562,10 +563,15 @@ AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); } - // Add system include arguments. - getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); - if (AuxToolChain) + // Add system include arguments for all targets but IAMCU. + if (!IsIAMCU) { +getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); +if (AuxToolChain) AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); + } else { +// For IAMCU add special include arguments. +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); + } // Add CUDA include arguments, if needed. if (types::isCuda(Inputs[0].getType())) @@ -3742,6 +3748,7 @@ getToolChain().getTriple().isWindowsCygwinEnvironment(); bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); + bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); // Check number of inputs for sanity. We need at least one input. assert(Inputs.size() >= 1 && "Must have at least one input."); @@ -3752,6 +3759,10 @@ bool IsCuda = types::isCuda(Input.getType()); assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); + // C++ is not supported for IAMCU. + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; + // Invoke ourselves in -cc1 mode. // // FIXME: Implement custom jobs for internal actions. Index: cfe/trunk/lib/Driver/Driver.cpp === --- cfe/trunk/lib/Driver/Driver.cpp +++ cfe/trunk/lib/Driver/Driver.cpp @@ -2482,6 +2482,7 @@ TC = new toolchains::Minix(*this, Target, Args); break; case llvm::Triple::Linux: +case llvm::Triple::ELFIAMCU: if (Target.getArch() == llvm::Triple::hexagon) TC = new toolchains::HexagonToolChain(*this, Target, Args); else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) && Index: cfe/trunk/lib/Driver/ToolChain.cpp === --- cfe/trunk/lib/Driver/ToolChain.cpp +++ cfe/trunk/lib/Driver/ToolChain.cpp @@ -696,3 +696,6 @@ void ToolChain::AddCudaIncludeArgs(const ArgList , ArgStringList ) const {} + +void ToolChain::AddIAMCUIncludeArgs(const ArgList , +ArgStringList ) const {} Index: cfe/trunk/lib/Driver/ToolChains.h === ---
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
bruno accepted this revision. bruno added a comment. This revision is now accepted and ready to land. Sure! LGTM http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk added inline comments. Comment at: lib/Driver/Tools.cpp:3657 @@ +3656,3 @@ + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + aturetsk wrote: > bruno wrote: > > aturetsk wrote: > > > bruno wrote: > > > > Taking a look at this again I don't think there's a real need for a new > > > > diagnostic here; instead of adding diag::err_drv_cxx_not_supported, you > > > > can do something similar to: > > > > > > > > D.Diag(diag::err_drv_clang_unsupported) << "C++ is not supported with > > > > -miamcu" > > > > > > > > Otherwise, LGTM! > > > The best thing I could come up with is this: > > > ``` > > > D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; > > > ``` > > > This code makes the error message look like this: > > > ``` > > > error: the clang compiler does not support 'C++ for IAMCU' > > > ``` > > > As you can see the message is a bit crooked. Do you thinks it's better to > > > keep it this way? > > Sorry, but I didn't mean you should change the message. My only point here > > is that I don't see the need for adding a new diagnostic, you can still > > keep something more similar with your old intent, example: > > > > D.Diag(diag::err_drv_clang_unsupported) << "C++ for target" << > > getToolChain().getTriple().str(); > My concern is not the change in the message :) My concern is redundant > quotation marks which look a bit ugly and out of place. > But if you're OK with them, so would I. Bruno, are you ok if the message will be: ``` error: the clang compiler does not support 'C++ for IAMCU' ``` If so I'll proceed with committing the changes. http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk added inline comments. Comment at: lib/Driver/Tools.cpp:3657 @@ +3656,3 @@ + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + bruno wrote: > aturetsk wrote: > > bruno wrote: > > > Taking a look at this again I don't think there's a real need for a new > > > diagnostic here; instead of adding diag::err_drv_cxx_not_supported, you > > > can do something similar to: > > > > > > D.Diag(diag::err_drv_clang_unsupported) << "C++ is not supported with > > > -miamcu" > > > > > > Otherwise, LGTM! > > The best thing I could come up with is this: > > ``` > > D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; > > ``` > > This code makes the error message look like this: > > ``` > > error: the clang compiler does not support 'C++ for IAMCU' > > ``` > > As you can see the message is a bit crooked. Do you thinks it's better to > > keep it this way? > Sorry, but I didn't mean you should change the message. My only point here is > that I don't see the need for adding a new diagnostic, you can still keep > something more similar with your old intent, example: > > D.Diag(diag::err_drv_clang_unsupported) << "C++ for target" << > getToolChain().getTriple().str(); My concern is not the change in the message :) My concern is redundant quotation marks which look a bit ugly and out of place. But if you're OK with them, so would I. http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
bruno added inline comments. Comment at: lib/Driver/Tools.cpp:3657 @@ +3656,3 @@ + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + aturetsk wrote: > bruno wrote: > > Taking a look at this again I don't think there's a real need for a new > > diagnostic here; instead of adding diag::err_drv_cxx_not_supported, you can > > do something similar to: > > > > D.Diag(diag::err_drv_clang_unsupported) << "C++ is not supported with > > -miamcu" > > > > Otherwise, LGTM! > The best thing I could come up with is this: > ``` > D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; > ``` > This code makes the error message look like this: > ``` > error: the clang compiler does not support 'C++ for IAMCU' > ``` > As you can see the message is a bit crooked. Do you thinks it's better to > keep it this way? Sorry, but I didn't mean you should change the message. My only point here is that I don't see the need for adding a new diagnostic, you can still keep something more similar with your old intent, example: D.Diag(diag::err_drv_clang_unsupported) << "C++ for target" << getToolChain().getTriple().str(); http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk added inline comments. Comment at: lib/Driver/Tools.cpp:3657 @@ +3656,3 @@ + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + bruno wrote: > Taking a look at this again I don't think there's a real need for a new > diagnostic here; instead of adding diag::err_drv_cxx_not_supported, you can > do something similar to: > > D.Diag(diag::err_drv_clang_unsupported) << "C++ is not supported with -miamcu" > > Otherwise, LGTM! The best thing I could come up with is this: ``` D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; ``` This code makes the error message look like this: ``` error: the clang compiler does not support 'C++ for IAMCU' ``` As you can see the message is a bit crooked. Do you thinks it's better to keep it this way? http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
bruno added a comment. Hi, Comment at: lib/Driver/Tools.cpp:3657 @@ +3656,3 @@ + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + Taking a look at this again I don't think there's a real need for a new diagnostic here; instead of adding diag::err_drv_cxx_not_supported, you can do something similar to: D.Diag(diag::err_drv_clang_unsupported) << "C++ is not supported with -miamcu" Otherwise, LGTM! http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk added a comment. Ping. http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk added a comment. Hi Bruno, Thanks for the review. Comment at: include/clang/Basic/DiagnosticDriverKinds.td:157 @@ -156,1 +156,3 @@ +def err_drv_cxx_not_supported : Error< + "C++ is not supported for target '%0'">; Yes. I've found nothing similar. Comment at: lib/Driver/Tools.cpp:301 @@ -299,3 +300,3 @@ CheckPreprocessingOptions(D, Args); Args.AddLastArg(CmdArgs, options::OPT_C); Done. Comment at: lib/Driver/Tools.cpp:574 @@ -569,1 +573,3 @@ +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); + } Done. http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk updated this revision to Diff 57017. aturetsk added a comment. Fix the remarks. http://reviews.llvm.org/D19274 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/ToolChain.h lib/Driver/Driver.cpp lib/Driver/ToolChain.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp test/Driver/miamcu-opt.c test/Driver/miamcu-opt.cpp Index: test/Driver/miamcu-opt.cpp === --- /dev/null +++ test/Driver/miamcu-opt.cpp @@ -0,0 +1,3 @@ +// RUN: %clang -miamcu %s -### -o %t.o 2>&1 | FileCheck %s + +// CHECK: error: C++ is not supported for target 'i586-intel-elfiamcu' Index: test/Driver/miamcu-opt.c === --- test/Driver/miamcu-opt.c +++ test/Driver/miamcu-opt.c @@ -16,3 +16,6 @@ // CHECK: "-static-define" // CHECK: "-mfloat-abi" "soft" // CHECK: "-mstack-alignment=4" + +// CHECK: bin/ld +// CHECK: "-static" Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -295,6 +295,7 @@ const InputInfoList , const ToolChain *AuxToolChain) const { Arg *A; + const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); CheckPreprocessingOptions(D, Args); @@ -562,10 +563,15 @@ AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); } - // Add system include arguments. - getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); - if (AuxToolChain) + // Add system include arguments for all targets but IAMCU. + if (!IsIAMCU) { +getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); +if (AuxToolChain) AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); + } else { +// For IAMCU add special include arguments. +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); + } // Add CUDA include arguments, if needed. if (types::isCuda(Inputs[0].getType())) @@ -3635,6 +3641,7 @@ getToolChain().getTriple().isWindowsCygwinEnvironment(); bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); + bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); // Check number of inputs for sanity. We need at least one input. assert(Inputs.size() >= 1 && "Must have at least one input."); @@ -3645,6 +3652,10 @@ bool IsCuda = types::isCuda(Input.getType()); assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); + // C++ is not supported for IAMCU. + if (IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + // Invoke ourselves in -cc1 mode. // // FIXME: Implement custom jobs for internal actions. Index: lib/Driver/ToolChains.h === --- lib/Driver/ToolChains.h +++ lib/Driver/ToolChains.h @@ -808,6 +808,8 @@ llvm::opt::ArgStringList ) const override; void AddCudaIncludeArgs(const llvm::opt::ArgList , llvm::opt::ArgStringList ) const override; + void AddIAMCUIncludeArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; bool isPIEDefault() const override; SanitizerMask getSupportedSanitizers() const override; void addProfileRTLibs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains.cpp === --- lib/Driver/ToolChains.cpp +++ lib/Driver/ToolChains.cpp @@ -1610,9 +1610,13 @@ break; case llvm::Triple::x86: LibDirs.append(begin(X86LibDirs), end(X86LibDirs)); -TripleAliases.append(begin(X86Triples), end(X86Triples)); -BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); -BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); +// MCU toolchain is 32 bit only and its triple alias is TargetTriple +// itself, which will be appended below. +if (!TargetTriple.isOSIAMCU()) { + TripleAliases.append(begin(X86Triples), end(X86Triples)); + BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); + BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); +} break; case llvm::Triple::mips: LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs)); @@ -1758,14 +1762,14 @@ namespace { // Filter to remove Multilibs that don't exist as a suffix to Path class FilterNonExistent { - StringRef Base; + StringRef Base, File; vfs::FileSystem public: - FilterNonExistent(StringRef Base, vfs::FileSystem ) - : Base(Base), VFS(VFS) {} + FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem ) + : Base(Base), File(File), VFS(VFS) {} bool operator()(const Multilib ) { -return !VFS.exists(Base +
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
bruno added a comment. Hi, Comment at: include/clang/Basic/DiagnosticDriverKinds.td:154 @@ -153,1 +153,3 @@ +def err_drv_cxx_not_supported : Error< + "C++ is not supported for target '%0'">; Are you sure there's no equivalente for this already? I'm surprised! Comment at: lib/Driver/Tools.cpp:300 @@ -299,1 +299,3 @@ + const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); + CheckPreprocessingOptions(D, Args); Tidy up this declaration with others, no need for two newlines here. Comment at: lib/Driver/Tools.cpp:575 @@ -569,1 +574,3 @@ + else +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); Use braces for the "else" and move the comment somewhere inside the braces http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)
mgrang added a subscriber: mgrang. Comment at: lib/Driver/Tools.cpp:580 @@ -573,1 +579,3 @@ + if (IsIAMCU) +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); } Is it better to move this above in the else part of the condition "if (!IsIAMCU)"? Comment at: lib/Driver/Tools.cpp:3625 @@ +3624,3 @@ + // C++ is not supported for IAMCU. + if(IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); nitpick: Missing space between if and ( http://reviews.llvm.org/D19274 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D19274: Compilation for Intel MCU (Part 2/3)
aturetsk created this revision. aturetsk added reviewers: rsmith, bruno, bkramer. aturetsk added subscribers: cfe-commits, DavidKreitzer, zinovy.nis. This is the second patch required to support compilation for Intel MCU target (e.g. Intel(R) Quark(TM) micro controller D 2000). When IAMCU triple is used: * Recognize and use IAMCU GCC toolchain * Set up include paths * Forbid C++ The linker-related changes will be in the last part. http://reviews.llvm.org/D19274 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/ToolChain.h lib/Driver/Driver.cpp lib/Driver/ToolChain.cpp lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp test/Driver/miamcu-opt.c test/Driver/miamcu-opt.cpp Index: test/Driver/miamcu-opt.cpp === --- /dev/null +++ test/Driver/miamcu-opt.cpp @@ -0,0 +1,3 @@ +// RUN: %clang -miamcu %s -### -o %t.o 2>&1 | FileCheck %s + +// CHECK: error: C++ is not supported for target 'i586-intel-elfiamcu' Index: test/Driver/miamcu-opt.c === --- test/Driver/miamcu-opt.c +++ test/Driver/miamcu-opt.c @@ -17,5 +17,5 @@ // CHECK: "-mfloat-abi" "soft" // CHECK: "-mstack-alignment=4" -// CHECK: bin/gcc +// CHECK: bin/ld // CHECK: "-static" Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -296,6 +296,8 @@ const ToolChain *AuxToolChain) const { Arg *A; + const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); + CheckPreprocessingOptions(D, Args); Args.AddLastArg(CmdArgs, options::OPT_C); @@ -562,14 +564,20 @@ AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); } - // Add system include arguments. - getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); - if (AuxToolChain) + // Add system include arguments for all targets but IAMCU. + if (!IsIAMCU) { +getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); +if (AuxToolChain) AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); + } // Add CUDA include arguments, if needed. if (types::isCuda(Inputs[0].getType())) getToolChain().AddCudaIncludeArgs(Args, CmdArgs); + + // Add IAMCU include arguments, if needed. + if (IsIAMCU) +getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); } // FIXME: Move to target hook. @@ -3602,6 +3610,7 @@ getToolChain().getTriple().isWindowsCygwinEnvironment(); bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); + bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); // Check number of inputs for sanity. We need at least one input. assert(Inputs.size() >= 1 && "Must have at least one input."); @@ -3612,6 +3621,10 @@ bool IsCuda = types::isCuda(Input.getType()); assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); + // C++ is not supported for IAMCU. + if(IsIAMCU && types::isCXX(Input.getType())) +D.Diag(diag::err_drv_cxx_not_supported) << getToolChain().getTriple().str(); + // Invoke ourselves in -cc1 mode. // // FIXME: Implement custom jobs for internal actions. Index: lib/Driver/ToolChains.h === --- lib/Driver/ToolChains.h +++ lib/Driver/ToolChains.h @@ -806,6 +806,8 @@ llvm::opt::ArgStringList ) const override; void AddCudaIncludeArgs(const llvm::opt::ArgList , llvm::opt::ArgStringList ) const override; + void AddIAMCUIncludeArgs(const llvm::opt::ArgList , + llvm::opt::ArgStringList ) const override; bool isPIEDefault() const override; SanitizerMask getSupportedSanitizers() const override; void addProfileRTLibs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains.cpp === --- lib/Driver/ToolChains.cpp +++ lib/Driver/ToolChains.cpp @@ -1570,9 +1570,13 @@ break; case llvm::Triple::x86: LibDirs.append(begin(X86LibDirs), end(X86LibDirs)); -TripleAliases.append(begin(X86Triples), end(X86Triples)); -BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); -BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); +// MCU toolchain is 32 bit only and its triple alias is TargetTriple +// itself, which will be appended below. +if (!TargetTriple.isOSIAMCU()) { + TripleAliases.append(begin(X86Triples), end(X86Triples)); + BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); + BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); +} break; case llvm::Triple::mips: LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs)); @@ -1718,14 +1722,14 @@ namespace { // Filter to