[cfe-commits] [PATCH] [3/6] Hexagon TC: Reimplement Link::ConstructJob to call linker directly
Sebastian Pop
spop at codeaurora.org
Fri Sep 21 13:17:50 PDT 2012
Hi Matt,
this patch looks good.
Thanks,
Sebastian
Matthew Curtis wrote:
> New patch that applies cleanly based on new patches 1 and 2.
>
> Matthew C.
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
>
> From 13bd0950c922d70a29a25cf7229a3d239640f3bf Mon Sep 17 00:00:00 2001
> From: Matthew Curtis <mcurtis at codeaurora.org>
> Date: Fri, 14 Sep 2012 13:14:24 -0500
> Subject: [PATCH 3/6] Hexagon TC: Reimplement Link::ConstructJob to call
> linker directly
>
> Rather than calling gcc.
> ---
> include/clang/Driver/Options.td | 1 +
> lib/Driver/ToolChains.cpp | 82 +++++-
> lib/Driver/ToolChains.h | 1 +
> lib/Driver/Tools.cpp | 182 ++++++++---
> test/Driver/Inputs/hexagon_tree/gnu/bin/hexagon-ld | 1 +
> test/Driver/hexagon-toolchain.c | 334 +++++++++++++++++++-
> 6 files changed, 550 insertions(+), 51 deletions(-)
> create mode 100755 test/Driver/Inputs/hexagon_tree/gnu/bin/hexagon-ld
>
> diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
> index 6a5c42b..17ebbef 100644
> --- a/include/clang/Driver/Options.td
> +++ b/include/clang/Driver/Options.td
> @@ -831,6 +831,7 @@ def mno_warn_nonportable_cfstrings : Flag<"-mno-warn-nonportable-cfstrings">, Gr
> def mno_omit_leaf_frame_pointer : Flag<"-mno-omit-leaf-frame-pointer">, Group<f_Group>;
> def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">, Group<f_Group>,
> HelpText<"Omit frame pointer setup for leaf functions.">, Flags<[CC1Option]>;
> +def moslib_EQ : Joined<"-moslib=">, Group<m_Group>;
> def mpascal_strings : Flag<"-mpascal-strings">, Group<m_Group>;
> def mred_zone : Flag<"-mred-zone">, Group<m_Group>;
> def mregparm_EQ : Joined<"-mregparm=">, Group<m_Group>;
> diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
> index 29e44a6..a5f146e 100644
> --- a/lib/Driver/ToolChains.cpp
> +++ b/lib/Driver/ToolChains.cpp
> @@ -1445,6 +1445,57 @@ std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
> return InstallRelDir;
> }
>
> +static void GetHexagonLibraryPaths(
> + const ArgList &Args,
> + const std::string Ver,
> + const std::string MarchString,
> + const std::string &InstalledDir,
> + ToolChain::path_list *LibPaths)
> +{
> + bool buildingLib = Args.hasArg(options::OPT_shared);
> +
> + //----------------------------------------------------------------------------
> + // -L Args
> + //----------------------------------------------------------------------------
> + for (arg_iterator
> + it = Args.filtered_begin(options::OPT_L),
> + ie = Args.filtered_end();
> + it != ie;
> + ++it) {
> + for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
> + LibPaths->push_back((*it)->getValue(Args, i));
> + }
> +
> + //----------------------------------------------------------------------------
> + // Other standard paths
> + //----------------------------------------------------------------------------
> + const std::string MarchSuffix = "/" + MarchString;
> + const std::string G0Suffix = "/G0";
> + const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
> + const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
> +
> + // lib/gcc/hexagon/...
> + std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
> + if (buildingLib) {
> + LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
> + LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
> + }
> + LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
> + LibPaths->push_back(LibGCCHexagonDir + Ver);
> +
> + // lib/gcc/...
> + LibPaths->push_back(RootDir + "lib/gcc");
> +
> + // hexagon/lib/...
> + std::string HexagonLibDir = RootDir + "hexagon/lib";
> + if (buildingLib) {
> + LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
> + LibPaths->push_back(HexagonLibDir + G0Suffix);
> + }
> + LibPaths->push_back(HexagonLibDir + MarchSuffix);
> + LibPaths->push_back(HexagonLibDir);
> +}
> +
> Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
> const ArgList &Args)
> : Linux(D, Triple, Args) {
> @@ -1468,6 +1519,20 @@ Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
> MaxVersion = cv;
> }
> GCCLibAndIncVersion = MaxVersion;
> +
> + ToolChain::path_list *LibPaths= &getFilePaths();
> +
> + // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
> + // 'elf' OS type, so the Linux paths are not appropriate. When we actually
> + // support 'linux' we'll need to fix this up
> + LibPaths->clear();
> +
> + GetHexagonLibraryPaths(
> + Args,
> + GetGCCLibAndIncVersion(),
> + GetTargetCPU(Args),
> + InstalledDir,
> + LibPaths);
> }
>
> Hexagon_TC::~Hexagon_TC() {
> @@ -1561,7 +1626,22 @@ void Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
> addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
> }
>
> -static Arg *GetLastHexagonArchArg (const ArgList &Args)
> +ToolChain::CXXStdlibType
> +Hexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
> + Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
> + if (!A)
> + return ToolChain::CST_Libstdcxx;
> +
> + StringRef Value = A->getValue(Args);
> + if (Value != "libstdc++") {
> + getDriver().Diag(diag::err_drv_invalid_stdlib_name)
> + << A->getAsString(Args);
> + }
> +
> + return ToolChain::CST_Libstdcxx;
> +}
> +
> +static Arg *GetLastHexagonArchArg(const ArgList &Args)
> {
> Arg *A = NULL;
>
> diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
> index f4108b7..289786d 100644
> --- a/lib/Driver/ToolChains.h
> +++ b/lib/Driver/ToolChains.h
> @@ -534,6 +534,7 @@ public:
> ArgStringList &CC1Args) const;
> virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
> ArgStringList &CC1Args) const;
> + virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const;
>
> StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; }
>
> diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
> index 16cdc3b..6898242 100644
> --- a/lib/Driver/Tools.cpp
> +++ b/lib/Driver/Tools.cpp
> @@ -3309,68 +3309,158 @@ void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
> const ArgList &Args,
> const char *LinkingOutput) const {
>
> - const Driver &D = getToolChain().getDriver();
> + const toolchains::Hexagon_TC& ToolChain =
> + static_cast<const toolchains::Hexagon_TC&>(getToolChain());
> + const Driver &D = ToolChain.getDriver();
> +
> ArgStringList CmdArgs;
>
> - for (ArgList::const_iterator
> - it = Args.begin(), ie = Args.end(); it != ie; ++it) {
> - Arg *A = *it;
> - if (A->getOption().hasForwardToGCC()) {
> - // Don't forward any -g arguments to assembly steps.
> - if (isa<AssembleJobAction>(JA) &&
> - A->getOption().matches(options::OPT_g_Group))
> - continue;
> + //----------------------------------------------------------------------------
> + //
> + //----------------------------------------------------------------------------
> + bool hasStaticArg = Args.hasArg(options::OPT_static);
> + bool buildingLib = Args.hasArg(options::OPT_shared);
> + bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
> + bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
> + bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
> + bool useShared = buildingLib && !hasStaticArg;
> +
> + //----------------------------------------------------------------------------
> + // Silence warnings for various options
> + //----------------------------------------------------------------------------
>
> - // It is unfortunate that we have to claim here, as this means
> - // we will basically never report anything interesting for
> - // platforms using a generic gcc, even if we are just using gcc
> - // to get to the assembler.
> - A->claim();
> - A->render(Args, CmdArgs);
> - }
> - }
> + Args.ClaimAllArgs(options::OPT_g_Group);
> + Args.ClaimAllArgs(options::OPT_emit_llvm);
> + Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
> + // handled somewhere else.
> + Args.ClaimAllArgs(options::OPT_static_libgcc);
>
> - RenderExtraToolArgs(JA, CmdArgs);
> + //----------------------------------------------------------------------------
> + //
> + //----------------------------------------------------------------------------
> + for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
> + e = ToolChain.ExtraOpts.end();
> + i != e; ++i)
> + CmdArgs.push_back(i->c_str());
>
> std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
> CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
>
> - CmdArgs.push_back("-mqdsp6-compat");
> + if (buildingLib) {
> + CmdArgs.push_back("-shared");
> + CmdArgs.push_back("-call_shared"); // should be the default, but doing as
> + // hexagon-gcc does
> + }
>
> - const char *GCCName;
> - if (C.getDriver().CCCIsCXX)
> - GCCName = "hexagon-g++";
> - else
> - GCCName = "hexagon-gcc";
> - const char *Exec =
> - Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
> + if (hasStaticArg)
> + CmdArgs.push_back("-static");
>
> - if (Output.isFilename()) {
> - CmdArgs.push_back("-o");
> - CmdArgs.push_back(Output.getFilename());
> + //----------------------------------------------------------------------------
> + //
> + //----------------------------------------------------------------------------
> + CmdArgs.push_back("-o");
> + CmdArgs.push_back(Output.getFilename());
> +
> + const std::string MarchSuffix = "/" + MarchString;
> + const std::string G0Suffix = "/G0";
> + const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
> + const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
> + + "/";
> + const std::string StartFilesDir = RootDir
> + + "hexagon/lib"
> + + (buildingLib
> + ? MarchG0Suffix : MarchSuffix);
> +
> + //----------------------------------------------------------------------------
> + // moslib
> + //----------------------------------------------------------------------------
> + std::vector<std::string> oslibs;
> + bool hasStandalone= false;
> +
> + for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
> + ie = Args.filtered_end(); it != ie; ++it) {
> + (*it)->claim();
> + oslibs.push_back((*it)->getValue(Args));
> + hasStandalone = hasStandalone || (oslibs.back() == "standalone");
> + }
> + if (oslibs.empty()) {
> + oslibs.push_back("standalone");
> + hasStandalone = true;
> }
>
> - for (InputInfoList::const_iterator
> - it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
> - const InputInfo &II = *it;
> + //----------------------------------------------------------------------------
> + // Start Files
> + //----------------------------------------------------------------------------
> + if (incStdLib && incStartFiles) {
>
> - // Don't try to pass LLVM or AST inputs to a generic gcc.
> - if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
> - II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
> - D.Diag(clang::diag::err_drv_no_linker_llvm_support)
> - << getToolChain().getTripleString();
> - else if (II.getType() == types::TY_AST)
> - D.Diag(clang::diag::err_drv_no_ast_support)
> - << getToolChain().getTripleString();
> + if (!buildingLib) {
> + if (hasStandalone) {
> + CmdArgs.push_back(
> + Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
> + }
> + CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
> + }
> + std::string initObj = useShared ? "/initS.o" : "/init.o";
> + CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
> + }
> +
> + //----------------------------------------------------------------------------
> + // Library Search Paths
> + //----------------------------------------------------------------------------
> + const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
> + for (ToolChain::path_list::const_iterator
> + i = LibPaths.begin(),
> + e = LibPaths.end();
> + i != e;
> + ++i)
> + CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
>
> - if (II.isFilename())
> - CmdArgs.push_back(II.getFilename());
> - else
> - // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
> - II.getInputArg().render(Args, CmdArgs);
> + //----------------------------------------------------------------------------
> + //
> + //----------------------------------------------------------------------------
> + Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
> + Args.AddAllArgs(CmdArgs, options::OPT_e);
> + Args.AddAllArgs(CmdArgs, options::OPT_s);
> + Args.AddAllArgs(CmdArgs, options::OPT_t);
> + Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
> +
> + AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
> +
> + //----------------------------------------------------------------------------
> + // Libraries
> + //----------------------------------------------------------------------------
> + if (incStdLib && incDefLibs) {
> + if (D.CCCIsCXX) {
> + ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
> + CmdArgs.push_back("-lm");
> + }
> +
> + CmdArgs.push_back("--start-group");
> +
> + if (!buildingLib) {
> + for(std::vector<std::string>::iterator i = oslibs.begin(),
> + e = oslibs.end(); i != e; ++i)
> + CmdArgs.push_back(Args.MakeArgString("-l" + *i));
> + CmdArgs.push_back("-lc");
> + }
> + CmdArgs.push_back("-lgcc");
> +
> + CmdArgs.push_back("--end-group");
> + }
> +
> + //----------------------------------------------------------------------------
> + // End files
> + //----------------------------------------------------------------------------
> + if (incStdLib && incStartFiles) {
> + std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
> + CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
> }
> - C.addCommand(new Command(JA, *this, Exec, CmdArgs));
>
> + std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
> + C.addCommand(
> + new Command(
> + JA, *this,
> + Args.MakeArgString(Linker), CmdArgs));
> }
> // Hexagon tools end.
>
> diff --git a/test/Driver/Inputs/hexagon_tree/gnu/bin/hexagon-ld b/test/Driver/Inputs/hexagon_tree/gnu/bin/hexagon-ld
> new file mode 100755
> index 0000000..331ef4a
> --- /dev/null
> +++ b/test/Driver/Inputs/hexagon_tree/gnu/bin/hexagon-ld
> @@ -0,0 +1 @@
> +# placeholder for testing purposes
> \ No newline at end of file
> diff --git a/test/Driver/hexagon-toolchain.c b/test/Driver/hexagon-toolchain.c
> index e9438c8..e891607 100644
> --- a/test/Driver/hexagon-toolchain.c
> +++ b/test/Driver/hexagon-toolchain.c
> @@ -80,7 +80,7 @@
> // RUN: | FileCheck -check-prefix=CHECK007 %s
> // CHECK007: "-cc1" {{.*}} "-target-cpu" "hexagonv3"
> // CHECK007-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-as"{{.*}} "-march=v3"
> -// CHECK007-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-gcc"{{.*}} "-mv3"
> +// CHECK007-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-ld"{{.*}} "-mv3"
>
> // RUN: %clang -### -target hexagon-unknown-linux \
> // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> @@ -89,7 +89,7 @@
> // RUN: | FileCheck -check-prefix=CHECK008 %s
> // CHECK008: "-cc1" {{.*}} "-target-cpu" "hexagonv5"
> // CHECK008-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-as"{{.*}} "-march=v5"
> -// CHECK008-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-gcc"{{.*}} "-mv5"
> +// CHECK008-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-ld"{{.*}} "-mv5"
>
> // RUN: %clang -### -target hexagon-unknown-linux \
> // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> @@ -98,7 +98,7 @@
> // RUN: | FileCheck -check-prefix=CHECK009 %s
> // CHECK009: "-cc1" {{.*}} "-target-cpu" "hexagonv2"
> // CHECK009-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-as"{{.*}} "-march=v2"
> -// CHECK009-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-gcc"{{.*}} "-mv2"
> +// CHECK009-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-ld"{{.*}} "-mv2"
>
> // RUN: %clang -### -target hexagon-unknown-linux \
> // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> @@ -106,4 +106,330 @@
> // RUN: | FileCheck -check-prefix=CHECK010 %s
> // CHECK010: "-cc1" {{.*}} "-target-cpu" "hexagonv4"
> // CHECK010-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-as"{{.*}} "-march=v4"
> -// CHECK010-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-gcc"{{.*}} "-mv4"
> +// CHECK010-NEXT: "{{.*}}/Inputs/hexagon_tree/qc/bin/../../gnu/bin/hexagon-ld"{{.*}} "-mv4"
> +
> +// -----------------------------------------------------------------------------
> +// Test Linker related args
> +// -----------------------------------------------------------------------------
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// Defaults for C
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK011 %s
> +// CHECK011: "{{.*}}clang" "-cc1"
> +// CHECK011-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK011-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK011-NOT: "-static"
> +// CHECK011-NOT: "-shared"
> +// CHECK011: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK011: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK011: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK011: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK011: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK011: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK011: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK011: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK011: "{{[^"]+}}.o"
> +// CHECK011: "--start-group" "-lstandalone" "-lc" "-lgcc" "--end-group"
> +// CHECK011: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// Defaults for C++
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -ccc-cxx -x c++ -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK012 %s
> +// CHECK012: "{{.*}}clang" "-cc1"
> +// CHECK012-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK012-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK012-NOT: "-static"
> +// CHECK012-NOT: "-shared"
> +// CHECK012: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK012: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK012: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK012: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK012: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK012: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK012: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK012: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK012: "{{[^"]+}}.o"
> +// CHECK012: "-lstdc++" "-lm"
> +// CHECK012: "--start-group" "-lstandalone" "-lc" "-lgcc" "--end-group"
> +// CHECK012: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// Additional Libraries (-L)
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -Lone -L two -L three \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK013 %s
> +// CHECK013: "{{.*}}clang" "-cc1"
> +// CHECK013-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK013-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK013: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK013: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK013: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK013: "-Lone" "-Ltwo" "-Lthree"
> +// CHECK013: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK013: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK013: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK013: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK013: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK013: "{{[^"]+}}.o"
> +// CHECK013: "--start-group" "-lstandalone" "-lc" "-lgcc" "--end-group"
> +// CHECK013: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// -static, -shared
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -static \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK014 %s
> +// CHECK014: "{{.*}}clang" "-cc1"
> +// CHECK014-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK014-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK014: "-static"
> +// CHECK014: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK014: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK014: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK014: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK014: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK014: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK014: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK014: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK014: "{{[^"]+}}.o"
> +// CHECK014: "--start-group" "-lstandalone" "-lc" "-lgcc" "--end-group"
> +// CHECK014: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -shared \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK015 %s
> +// CHECK015: "{{.*}}clang" "-cc1"
> +// CHECK015-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK015-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK015: "-shared" "-call_shared"
> +// CHECK015-NOT: crt0_standalone.o
> +// CHECK015-NOT: crt0.o
> +// CHECK015: "[[GNU_DIR]]/hexagon/lib/v4/G0/initS.o"
> +// CHECK015: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4/G0"
> +// CHECK015: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/G0"
> +// CHECK015: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK015: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK015: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK015: "-L[[GNU_DIR]]/hexagon/lib/v4/G0"
> +// CHECK015: "-L[[GNU_DIR]]/hexagon/lib/G0"
> +// CHECK015: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK015: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK015: "{{[^"]+}}.o"
> +// CHECK015: "--start-group"
> +// CHECK015-NOT: "-lstandalone"
> +// CHECK015-NOT: "-lc"
> +// CHECK015: "-lgcc"
> +// CHECK015: "--end-group"
> +// CHECK015: "[[GNU_DIR]]/hexagon/lib/v4/G0/finiS.o"
> +
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -shared \
> +// RUN: -static \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK016 %s
> +// CHECK016: "{{.*}}clang" "-cc1"
> +// CHECK016-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK016-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK016: "-shared" "-call_shared" "-static"
> +// CHECK016-NOT: crt0_standalone.o
> +// CHECK016-NOT: crt0.o
> +// CHECK016: "[[GNU_DIR]]/hexagon/lib/v4/G0/init.o"
> +// CHECK016: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4/G0"
> +// CHECK016: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/G0"
> +// CHECK016: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK016: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK016: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK016: "-L[[GNU_DIR]]/hexagon/lib/v4/G0"
> +// CHECK016: "-L[[GNU_DIR]]/hexagon/lib/G0"
> +// CHECK016: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK016: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK016: "{{[^"]+}}.o"
> +// CHECK016: "--start-group"
> +// CHECK016-NOT: "-lstandalone"
> +// CHECK016-NOT: "-lc"
> +// CHECK016: "-lgcc"
> +// CHECK016: "--end-group"
> +// CHECK016: "[[GNU_DIR]]/hexagon/lib/v4/G0/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// -nostdlib, -nostartfiles, -nodefaultlibs
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -ccc-cxx -x c++ -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -nostdlib \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK017 %s
> +// CHECK017: "{{.*}}clang" "-cc1"
> +// CHECK017-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK017-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK017-NOT: crt0_standalone.o
> +// CHECK017-NOT: crt0.o
> +// CHECK017-NOT: init.o
> +// CHECK017: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK017: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK017: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK017: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK017: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK017: "{{[^"]+}}.o"
> +// CHECK017-NOT: "-lstdc++"
> +// CHECK017-NOT: "-lm"
> +// CHECK017-NOT: "--start-group"
> +// CHECK017-NOT: "-lstandalone"
> +// CHECK017-NOT: "-lc"
> +// CHECK017-NOT: "-lgcc"
> +// CHECK017-NOT: "--end-group"
> +// CHECK017-NOT: fini.o
> +
> +// RUN: %clang -ccc-cxx -x c++ -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -nostartfiles \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK018 %s
> +// CHECK018: "{{.*}}clang" "-cc1"
> +// CHECK018-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK018-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK018-NOT: crt0_standalone.o
> +// CHECK018-NOT: crt0.o
> +// CHECK018-NOT: init.o
> +// CHECK018: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK018: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK018: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK018: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK018: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK018: "{{[^"]+}}.o"
> +// CHECK018: "-lstdc++"
> +// CHECK018: "-lm"
> +// CHECK018: "--start-group"
> +// CHECK018: "-lstandalone"
> +// CHECK018: "-lc"
> +// CHECK018: "-lgcc"
> +// CHECK018: "--end-group"
> +// CHECK018-NOT: fini.o
> +
> +// RUN: %clang -ccc-cxx -x c++ -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -nodefaultlibs \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK019 %s
> +// CHECK019: "{{.*}}clang" "-cc1"
> +// CHECK019-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK019-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK019: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK019: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK019: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK019: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK019: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK019: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK019: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK019: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK019: "{{[^"]+}}.o"
> +// CHECK019-NOT: "-lstdc++"
> +// CHECK019-NOT: "-lm"
> +// CHECK019-NOT: "--start-group"
> +// CHECK019-NOT: "-lstandalone"
> +// CHECK019-NOT: "-lc"
> +// CHECK019-NOT: "-lgcc"
> +// CHECK019-NOT: "--end-group"
> +// CHECK019: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// -moslib
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -moslib=first -moslib=second \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK020 %s
> +// CHECK020: "{{.*}}clang" "-cc1"
> +// CHECK020-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK020-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK020-NOT: "-static"
> +// CHECK020-NOT: "-shared"
> +// CHECK020-NOT: crt0_standalone.o
> +// CHECK020: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK020: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK020: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK020: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK020: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK020: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK020: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK020: "{{[^"]+}}.o"
> +// CHECK020: "--start-group"
> +// CHECK020: "-lfirst" "-lsecond"
> +// CHECK020-NOT: "-lstandalone"
> +// CHECK020: "-lc" "-lgcc" "--end-group"
> +// CHECK020: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// RUN: %clang -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -moslib=first -moslib=second -moslib=standalone\
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK021 %s
> +// CHECK021: "{{.*}}clang" "-cc1"
> +// CHECK021-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK021-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK021-NOT: "-static"
> +// CHECK021-NOT: "-shared"
> +// CHECK021: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK021: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK021: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK021: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK021: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK021: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK021: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK021: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK021: "{{[^"]+}}.o"
> +// CHECK021: "--start-group"
> +// CHECK021: "-lfirst" "-lsecond"
> +// CHECK021: "-lstandalone"
> +// CHECK021: "-lc" "-lgcc" "--end-group"
> +// CHECK021: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> +
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// Other args to pass to linker
> +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +// RUN: %clang -ccc-cxx -x c++ -### -target hexagon-unknown-linux \
> +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \
> +// RUN: -s \
> +// RUN: -Tbss 0xdead -Tdata 0xbeef -Ttext 0xcafe \
> +// RUN: -t \
> +// RUN: -e start_here \
> +// RUN: -uFoo -undefined Bar \
> +// RUN: %s 2>&1 \
> +// RUN: | FileCheck -check-prefix=CHECK022 %s
> +// CHECK022: "{{.*}}clang" "-cc1"
> +// CHECK022-NEXT: "[[GNU_DIR:.*]]/bin/hexagon-as"{{.*}}
> +// CHECK022-NEXT: "[[GNU_DIR]]/bin/hexagon-ld"
> +// CHECK022: "[[GNU_DIR]]/hexagon/lib/v4/crt0_standalone.o"
> +// CHECK022: "[[GNU_DIR]]/hexagon/lib/v4/crt0.o"
> +// CHECK022: "[[GNU_DIR]]/hexagon/lib/v4/init.o"
> +// CHECK022: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0/v4"
> +// CHECK022: "-L[[GNU_DIR]]/lib/gcc/hexagon/4.4.0"
> +// CHECK022: "-L[[GNU_DIR]]/lib/gcc"
> +// CHECK022: "-L[[GNU_DIR]]/hexagon/lib/v4"
> +// CHECK022: "-L[[GNU_DIR]]/hexagon/lib"
> +// CHECK022: "-Tbss" "0xdead" "-Tdata" "0xbeef" "-Ttext" "0xcafe"
> +// CHECK022: "-s"
> +// CHECK022: "-t"
> +// CHECK022: "-u" "Foo" "-undefined" "Bar"
> +// CHECK022: "{{[^"]+}}.o"
> +// CHECK022: "-lstdc++" "-lm"
> +// CHECK022: "--start-group" "-lstandalone" "-lc" "-lgcc" "--end-group"
> +// CHECK022: "[[GNU_DIR]]/hexagon/lib/v4/fini.o"
> --
> 1.7.8.3
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
More information about the cfe-commits
mailing list