From: Daniel Dunbar Date: Sat, 19 Feb 2011 05:33:51 +0000 (+0000) Subject: Driver/Darwin: Support -Wl, with -Xarch_. This doesn't work naturally because of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8ac38d7b5d88d12f454a7cda1275bf429813151d;p=clang Driver/Darwin: Support -Wl, with -Xarch_. This doesn't work naturally because of 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 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index ffeb2c9bb5..4c8546b5be 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -778,7 +778,12 @@ def _write_user_dependencies : Flag<"--write-user-dependencies">, Alias; 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++">, diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 236a1549eb..13b8b4609e 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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 diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 5233e2bcf6..8328982ae9 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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; diff --git a/test/Driver/darwin-xarch.c b/test/Driver/darwin-xarch.c index cd7fa845d0..84201ceb83 100644 --- a/test/Driver/darwin-xarch.c +++ b/test/Driver/darwin-xarch.c @@ -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"