[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