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

2016-05-26 Thread Bruno Cardoso Lopes via cfe-commits
bruno accepted this revision.
bruno added a comment.
This revision is now accepted and ready to land.

LGTM


http://reviews.llvm.org/D20675



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D20675: Compilation for Intel MCU (Part 3/3)

2016-05-26 Thread Andrey Turetskiy via cfe-commits
aturetsk created this revision.
aturetsk added reviewers: rsmith, bruno.
aturetsk added subscribers: cfe-commits, zinovy.nis, DavidKreitzer.
Herald added subscribers: srhines, danalbert, tberghammer.

This is the last patch required to support compilation for Intel MCU target 
(e.g. Intel(R) Quark(TM) micro controller D 2000).

When IAMCU triple is used:
* Use IAMCU linker output format
* Link with IAMCU crt objects
* Link with IAMCU libraries

http://reviews.llvm.org/D20675

Files:
  lib/Driver/Tools.cpp
  test/Driver/miamcu-opt.c

Index: test/Driver/miamcu-opt.c
===
--- test/Driver/miamcu-opt.c
+++ test/Driver/miamcu-opt.c
@@ -18,4 +18,12 @@
 // CHECK: "-mstack-alignment=4"
 
 // CHECK: bin/ld
+// CHECK: "-m" "elf_iamcu"
 // CHECK: "-static"
+// CHECK-NOT: crt1
+// CHECK-NOT: crti
+// CHECK-NOT: ctrbegin
+// CHECK: crt0
+// CHECK: "--start-group" "-lgcc" "-lc" "-lgloss" "--end-group" "--as-needed" "-lsoftfp" "--no-as-needed"
+// CHECK-NOT: crtend
+// CHECK-NOT: ctrn
Index: lib/Driver/Tools.cpp
===
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -9011,6 +9011,7 @@
   ArgStringList , const ArgList ) {
   bool isAndroid = Triple.isAndroid();
   bool isCygMing = Triple.isOSCygMing();
+  bool IsIAMCU = Triple.isOSIAMCU();
   bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
   Args.hasArg(options::OPT_static);
   if (!D.CCCIsCXX())
@@ -9027,7 +9028,7 @@
   CmdArgs.push_back("--no-as-needed");
   }
 
-  if (StaticLibgcc && !isAndroid)
+  if (StaticLibgcc && !isAndroid && !IsIAMCU)
 CmdArgs.push_back("-lgcc_eh");
   else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
 CmdArgs.push_back("-lgcc");
@@ -9075,6 +9076,8 @@
 static const char *getLDMOption(const llvm::Triple , const ArgList ) {
   switch (T.getArch()) {
   case llvm::Triple::x86:
+if (T.isOSIAMCU())
+  return "elf_iamcu";
 return "elf_i386";
   case llvm::Triple::aarch64:
 return "aarch64linux";
@@ -9134,6 +9137,7 @@
 
   const llvm::Triple::ArchType Arch = ToolChain.getArch();
   const bool isAndroid = ToolChain.getTriple().isAndroid();
+  const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
   const bool IsPIE =
   !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
   (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
@@ -9210,7 +9214,7 @@
   CmdArgs.push_back(Output.getFilename());
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
-if (!isAndroid) {
+if (!isAndroid && !IsIAMCU) {
   const char *crt1 = nullptr;
   if (!Args.hasArg(options::OPT_shared)) {
 if (Args.hasArg(options::OPT_pg))
@@ -9226,18 +9230,22 @@
   CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
 }
 
-const char *crtbegin;
-if (Args.hasArg(options::OPT_static))
-  crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
-else if (Args.hasArg(options::OPT_shared))
-  crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
-else if (IsPIE)
-  crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
-else
-  crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
+if (IsIAMCU)
+  CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
+else {
+  const char *crtbegin;
+  if (Args.hasArg(options::OPT_static))
+crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
+  else if (Args.hasArg(options::OPT_shared))
+crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
+  else if (IsPIE)
+crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
+  else
+crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
 
-if (HasCRTBeginEndFiles)
-  CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
+  if (HasCRTBeginEndFiles)
+CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
+}
 
 // Add crtfastmath.o if available and fast math is enabled.
 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
@@ -9321,13 +9329,24 @@
 
   CmdArgs.push_back("-lc");
 
+  // Add IAMCU specific libs, if needed.
+  if (IsIAMCU)
+CmdArgs.push_back("-lgloss");
+
   if (Args.hasArg(options::OPT_static))
 CmdArgs.push_back("--end-group");
   else
 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
+
+  // Add IAMCU specific libs (outside the group), if needed.
+  if (IsIAMCU) {
+CmdArgs.push_back("--as-needed");
+CmdArgs.push_back("-lsoftfp");
+CmdArgs.push_back("--no-as-needed");
+  }
 }
 
-if (!Args.hasArg(options::OPT_nostartfiles)) {
+if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
   const char *crtend;
   if (Args.hasArg(options::OPT_shared))
 crtend =