[cfe-commits] [PATCH] [3/6] Hexagon TC: Reimplement Link::ConstructJob to call linker directly
Matthew Curtis
mcurtis at codeaurora.org
Mon Sep 24 07:42:44 PDT 2012
Removed trailing whitespace on several lines.
Matthew C.
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
-------------- next part --------------
>From f325ea48a52b2a540f7c84fea1010cbd1f1d7893 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 8a7d113..34fbf64 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -833,6 +833,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 489ce90..43d6292 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() {
@@ -1555,7 +1620,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 23d5ed9..d83e7eb 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -533,6 +533,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 c7dbfea..ffa4bb9 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -3328,68 +3328,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..cd9a78b 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
More information about the cfe-commits
mailing list