From: Arthur Marble Date: Wed, 16 Jul 2014 21:16:16 +0000 (+0000) Subject: Typically linker options are protected with -Xlinker or -Wl, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8b35e1a75b0044239b1ac7b476d66352fafcb02;p=clang Typically linker options are protected with -Xlinker or -Wl, however certain sloppy Makefiles pass -z options directly to the compiler. This patch enables clang to recognize these options (because -z is not used by clang itself). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213198 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 3feee6ef18..5607626654 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -309,6 +309,8 @@ def Xassembler : Separate<["-"], "Xassembler">, def Xclang : Separate<["-"], "Xclang">, HelpText<"Pass to the clang compiler">, MetaVarName<"">, Flags<[DriverOption, CoreOption]>; +def z : Separate<["-"], "z">, Flags<[LinkerInput, RenderAsInput]>, + HelpText<"Pass -z to the linker">, MetaVarName<"">; def Xlinker : Separate<["-"], "Xlinker">, Flags<[LinkerInput, RenderAsInput]>, HelpText<"Pass to the linker">, MetaVarName<"">; def Xpreprocessor : Separate<["-"], "Xpreprocessor">, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 60b8933821..e47db33803 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -201,8 +201,13 @@ static void AddLinkerInputs(const ToolChain &TC, TC.AddCXXStdlibLibArgs(Args, CmdArgs); else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) TC.AddCCKextLibArgs(Args, CmdArgs); - else - A.renderAsInput(Args, CmdArgs); + else if (A.getOption().matches(options::OPT_z)) { + // Pass -z prefix for gcc linker compatibility. + A.claim(); + A.render(Args, CmdArgs); + } else { + A.renderAsInput(Args, CmdArgs); + } } // LIBRARY_PATH - included following the user specified library paths. diff --git a/test/Driver/Xlinker-args.c b/test/Driver/Xlinker-args.c index 4285af7944..87b238b3b9 100644 --- a/test/Driver/Xlinker-args.c +++ b/test/Driver/Xlinker-args.c @@ -3,17 +3,17 @@ // RUN: %clang -target i386-apple-darwin9 -### \ // RUN: -Xlinker one -Xlinker --no-demangle \ -// RUN: -Wl,two,--no-demangle,three -Xlinker four %s 2> %t +// RUN: -Wl,two,--no-demangle,three -Xlinker four -z five %s 2> %t // RUN: FileCheck -check-prefix=DARWIN < %t %s // // RUN: %clang -target x86_64-pc-linux-gnu -### \ // RUN: -Xlinker one -Xlinker --no-demangle \ -// RUN: -Wl,two,--no-demangle,three -Xlinker four %s 2> %t +// RUN: -Wl,two,--no-demangle,three -Xlinker four -z five %s 2> %t // RUN: FileCheck -check-prefix=LINUX < %t %s // // DARWIN-NOT: --no-demangle -// DARWIN: "one" "two" "three" "four" -// LINUX: "--no-demangle" "one" "two" "three" "four" +// DARWIN: "one" "two" "three" "four" "-z" "five" +// LINUX: "--no-demangle" "one" "two" "three" "four" "-z" "five" // Check that we forward '-Xlinker' and '-Wl,' on Windows. // RUN: %clang -target i686-pc-win32 -### \