]> granicus.if.org Git - clang/commitdiff
Driver/Darwin: Support -Wl, with -Xarch_. This doesn't work naturally because of
authorDaniel Dunbar <daniel@zuster.org>
Sat, 19 Feb 2011 05:33:51 +0000 (05:33 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 19 Feb 2011 05:33:51 +0000 (05:33 +0000)
the special way we model "linker input" arguments.

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

include/clang/Driver/Options.td
lib/Driver/ToolChains.cpp
lib/Driver/Tools.cpp
test/Driver/darwin-xarch.c

index ffeb2c9bb5b3eceb3630e61b3e2293a9d54366ff..4c8546b5bebdd3efd55dca77388eebc8b5cc96ef 100644 (file)
@@ -778,7 +778,12 @@ def _write_user_dependencies : Flag<"--write-user-dependencies">, Alias<MMD>;
 def _ : Joined<"--">, Flags<[Unsupported]>;
 
 // Special internal option to handle -Xlinker --no-demangle.
-def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">, Flags<[Unsupported, NoArgumentUnused]>;
+def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">,
+    Flags<[Unsupported, NoArgumentUnused]>;
+
+// Special internal option to allow forwarding arbitrary arguments to linker.
+def Zlinker_input : Separate<"-Zlinker-input">,
+    Flags<[Unsupported, NoArgumentUnused]>;
 
 // Reserved library options.
 def Z_reserved_lib_stdcxx : Flag<"-Z-reserved-lib-stdc++">,
index 236a1549eb8c25bc78f2cea64a0e2f716712f48d..13b8b4609ec04c5dcb793d136fc6196ea17288af 100644 (file)
@@ -699,6 +699,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
       if (getArchName() != A->getValue(Args, 0))
         continue;
 
+      Arg *OriginalArg = A;
       unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
       unsigned Prev = Index;
       Arg *XarchArg = Opts.ParseOneArg(Args, Index);
@@ -722,6 +723,20 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
       A = XarchArg;
 
       DAL->AddSynthesizedArg(A);
+
+      // Linker input arguments require custom handling. The problem is that we
+      // have already constructed the phase actions, so we can not treat them as
+      // "input arguments".
+      if (A->getOption().isLinkerInput()) {
+        // Convert the argument into individual Zlinker_input_args.
+        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
+          DAL->AddSeparateArg(OriginalArg,
+                              Opts.getOption(options::OPT_Zlinker_input),
+                              A->getValue(Args, i));
+          
+        }
+        continue;
+      }
     }
 
     // Sob. These is strictly gcc compatible for the time being. Apple
index 5233e2bcf68aa498f8f7557591da8dcbb0101a0d..8328982ae92c347a61c7cfd5c69b0ddfe44b62b1 100644 (file)
@@ -91,6 +91,10 @@ static void AddLinkerInputs(const ToolChain &TC,
                             ArgStringList &CmdArgs) {
   const Driver &D = TC.getDriver();
 
+  // Add extra linker input arguments which are not treated as inputs
+  // (constructed via -Xarch_).
+  Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
+
   for (InputInfoList::const_iterator
          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
     const InputInfo &II = *it;
index cd7fa845d03ef9a5fac88ba4498d1bb8f5cdafa0..84201ceb835aa506dc3fc912d2b57342bd4283c7 100644 (file)
@@ -2,7 +2,13 @@
 // RUN:   -arch i386 -Xarch_i386 -mmacosx-version-min=10.4 \
 // RUN:   -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 \
 // RUN:   -c %s 2> %t
-// RUN: FileCheck < %t %s
+// RUN: FileCheck --check-prefix=CHECK-COMPILE < %t %s
 //
-// CHECK: clang{{.*}}" "-cc1" "-triple" "i386-apple-darwin8.0.0" 
-// CHECK: clang{{.*}}" "-cc1" "-triple" "x86_64-apple-darwin9.0.0" 
+// CHECK-COMPILE: clang{{.*}}" "-cc1" "-triple" "i386-apple-darwin8.0.0" 
+// CHECK-COMPILE: clang{{.*}}" "-cc1" "-triple" "x86_64-apple-darwin9.0.0"
+
+// RUN: %clang -ccc-host-triple x86_64-apple-darwin10 -### \
+// RUN:   -arch i386 -Xarch_i386 -Wl,-some-linker-arg -filelist X 2> %t
+// RUN: FileCheck --check-prefix=CHECK-LINK < %t %s
+//
+// CHECK-LINK: ld"{{.*}} "-some-linker-arg"