]> granicus.if.org Git - clang/commitdiff
clang-cl: Support /link option and set target to win32
authorHans Wennborg <hans@hanshq.net>
Tue, 13 Aug 2013 23:38:57 +0000 (23:38 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 13 Aug 2013 23:38:57 +0000 (23:38 +0000)
This adds support for the /link option, which forwards
subsequent arguments to the linker.

The test for this will only work when targetting win32.
Since that's the only target where clang-cl makes sense,
use that target by default.

Differential Revision: http://llvm-reviews.chandlerc.com/D1388

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188331 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/CLCompatOptions.td
lib/Driver/Driver.cpp
lib/Driver/Tools.cpp
test/Driver/cl-link.c [new file with mode: 0644]

index a4b8b61e2b4d7a7e24cd35cc01e53324b0a79321..083686d0e84c2300553353928a7e201370048c1f 100644 (file)
@@ -32,6 +32,9 @@ class CLIgnoredJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
 class CLJoinedOrSeparate<string name> : Option<["/", "-"], name,
   KIND_JOINED_OR_SEPARATE>, Group<cl_Group>, Flags<[CLOption, DriverOption]>;
 
+class CLRemainingArgs<string name> : Option<["/", "-"], name,
+  KIND_REMAINING_ARGS>, Group<cl_Group>, Flags<[CLOption, DriverOption]>;
+
 // Aliases:
 
 def _SLASH_c : CLFlag<"c">, HelpText<"Compile only">, Alias<c>;
@@ -96,6 +99,8 @@ def _SLASH_Fe : CLJoined<"Fe">,
 def _SLASH_Fo : CLJoined<"Fo">,
   HelpText<"Set output object file, or directory (ends in / or \\)">,
   MetaVarName<"<file or directory>">;
+def _SLASH_link : CLRemainingArgs<"link">,
+  HelpText<"Forward options to the linker">, MetaVarName<"<options>">;
 def _SLASH_MD : CLFlag<"MD">,
   HelpText<"Use DLL run-time">;
 def _SLASH_MDd : CLFlag<"MDd">,
index 68958047ba739aa9f73fab8bb247858435ab90c3..32a7d1aafd3f873d0e04acdbc7da745c7d81fb10 100644 (file)
@@ -351,6 +351,12 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
                             options::OPT_ccc_pch_is_pth);
   // FIXME: DefaultTargetTriple is used by the target-prefixed calls to as/ld
   // and getToolChain is const.
+  if (IsCLMode()) {
+    // clang-cl targets Win32.
+    llvm::Triple T(DefaultTargetTriple);
+    T.setOSName(llvm::Triple::getOSTypeName(llvm::Triple::Win32));
+    DefaultTargetTriple = T.str();
+  }
   if (const Arg *A = Args->getLastArg(options::OPT_target))
     DefaultTargetTriple = A->getValue();
   if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir))
index 2ae23aec8e159c721557769483b884e6d71c8816..5dd6fa1eacca8ee86f172f985ce797c99bcd68f8 100644 (file)
@@ -6590,12 +6590,14 @@ void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
   CmdArgs.push_back("-nologo");
 
   Args.AddAllArgValues(CmdArgs, options::OPT_l);
+  Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
 
   // Add filenames immediately.
   for (InputInfoList::const_iterator
        it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
     if (it->isFilename())
       CmdArgs.push_back(it->getFilename());
+    // FIXME: Forward -Wl, etc.
   }
 
   const char *Exec =
diff --git a/test/Driver/cl-link.c b/test/Driver/cl-link.c
new file mode 100644 (file)
index 0000000..6de089b
--- /dev/null
@@ -0,0 +1,12 @@
+// Don't attempt slash switches on msys bash.
+// REQUIRES: shell-preserves-root
+
+// Note: %s must be preceded by -- or bound to another option, otherwise it may
+// be interpreted as a command-line option, e.g. on Mac where %s is commonly
+// under /Users.
+
+// RUN: %clang_cl /Tc%s -### /link foo bar baz 2>&1 | FileCheck %s
+// CHECK: link.exe
+// CHECK: "foo"
+// CHECK: "bar"
+// CHECK: "baz"