Re: [PATCH] D19274: Compilation for Intel MCU (Part 2/3)

2016-06-16 Thread Andrey Turetskiy via cfe-commits
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)

2016-06-15 Thread Bruno Cardoso Lopes via cfe-commits
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)

2016-06-15 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-26 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-26 Thread Bruno Cardoso Lopes via cfe-commits
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)

2016-05-26 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-25 Thread Bruno Cardoso Lopes via cfe-commits
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)

2016-05-25 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-12 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-12 Thread Andrey Turetskiy via cfe-commits
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)

2016-05-11 Thread Bruno Cardoso Lopes via cfe-commits
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)

2016-04-19 Thread Mandeep Singh Grang via cfe-commits
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)

2016-04-19 Thread Andrey Turetskiy via cfe-commits
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