From: Ikhlas Ajbar Date: Thu, 14 May 2015 13:52:08 +0000 (+0000) Subject: Factor out SmallDataThreshold X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=24f86098928f6f166d11fee6c13085575f29a8f0;p=clang Factor out SmallDataThreshold This patch factors out SmallDataThreshold code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237364 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 5428a55c43..6d52ab9d71 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2128,6 +2128,30 @@ std::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir, return InstallRelDir; } +const char *Hexagon_TC::GetSmallDataThreshold(const ArgList &Args) +{ + Arg *A; + + A = Args.getLastArg(options::OPT_G, + options::OPT_G_EQ, + options::OPT_msmall_data_threshold_EQ); + if (A) + return A->getValue(); + + A = Args.getLastArg(options::OPT_shared, + options::OPT_fpic, + options::OPT_fPIC); + if (A) + return "0"; + + return 0; +} + +bool Hexagon_TC::UsesG0(const char* smallDataThreshold) +{ + return smallDataThreshold && smallDataThreshold[0] == '0'; +} + static void GetHexagonLibraryPaths( const ArgList &Args, const std::string &Ver, diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 388dff37b5..8906e2101e 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -724,6 +724,10 @@ public: const llvm::opt::ArgList &Args); static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); + + static const char *GetSmallDataThreshold(const llvm::opt::ArgList &Args); + + static bool UsesG0(const char* smallDataThreshold); }; class LLVM_LIBRARY_VISIBILITY NaCl_TC : public Generic_ELF { diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index ee9b495edb..ec00ff1d91 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1734,34 +1734,17 @@ static inline bool HasPICArg(const ArgList &Args) { || Args.hasArg(options::OPT_fpic); } -static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) { - return Args.getLastArg(options::OPT_G, - options::OPT_G_EQ, - options::OPT_msmall_data_threshold_EQ); -} - -static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) { - std::string value; - if (HasPICArg(Args)) - value = "0"; - else if (Arg *A = GetLastSmallDataThresholdArg(Args)) { - value = A->getValue(); - A->claim(); - } - return value; -} - void Clang::AddHexagonTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { CmdArgs.push_back("-fno-signed-char"); CmdArgs.push_back("-mqdsp6-compat"); CmdArgs.push_back("-Wreturn-type"); - std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); - if (!SmallDataThreshold.empty()) { + if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) { + std::string SmallDataThreshold="-hexagon-small-data-threshold="; + SmallDataThreshold += v; CmdArgs.push_back ("-mllvm"); - CmdArgs.push_back(Args.MakeArgString( - "-hexagon-small-data-threshold=" + SmallDataThreshold)); + CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold)); } if (!Args.hasArg(options::OPT_fno_short_enums)) @@ -5408,10 +5391,8 @@ void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fsyntax-only"); } - std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); - if (!SmallDataThreshold.empty()) - CmdArgs.push_back( - Args.MakeArgString(std::string("-G") + SmallDataThreshold)); + if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) + CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v)); Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); @@ -5474,6 +5455,7 @@ static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA, bool incStdLib = !Args.hasArg(options::OPT_nostdlib); bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles); bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs); + bool useG0 = false; bool useShared = buildingLib && !hasStaticArg; //---------------------------------------------------------------------------- @@ -5507,10 +5489,9 @@ static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA, if (buildPIE && !buildingLib) CmdArgs.push_back("-pie"); - std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); - if (!SmallDataThreshold.empty()) { - CmdArgs.push_back( - Args.MakeArgString(std::string("-G") + SmallDataThreshold)); + if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) { + CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v)); + useG0 = toolchains::Hexagon_TC::UsesG0(v); } //---------------------------------------------------------------------------- @@ -5526,8 +5507,7 @@ static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA, toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/"; const std::string StartFilesDir = RootDir + "hexagon/lib" - + (buildingLib - ? MarchG0Suffix : MarchSuffix); + + (useG0 ? MarchG0Suffix : MarchSuffix); //---------------------------------------------------------------------------- // moslib diff --git a/test/Driver/hexagon-toolchain-elf.c b/test/Driver/hexagon-toolchain-elf.c index 984dc0439d..b9e53abe9b 100644 --- a/test/Driver/hexagon-toolchain-elf.c +++ b/test/Driver/hexagon-toolchain-elf.c @@ -497,13 +497,6 @@ // RUN: -fPIC \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK024 %s -// RUN: %clang -### -target hexagon-unknown-elf \ -// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \ -// RUN: --gcc-toolchain="" \ -// RUN: -fPIC \ -// RUN: -msmall-data-threshold=8 \ -// RUN: %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECK024 %s // CHECK024: "-cc1" // CHECK024-NOT: "-mrelocation-model" "static" // CHECK024: "-pic-level" "{{[12]}}" diff --git a/test/Driver/hexagon-toolchain.c b/test/Driver/hexagon-toolchain.c index 391b78a13e..5d9553ef08 100644 --- a/test/Driver/hexagon-toolchain.c +++ b/test/Driver/hexagon-toolchain.c @@ -490,18 +490,11 @@ // RUN: --gcc-toolchain="" \ // RUN: -fpic \ // RUN: %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECK024 %s -// RUN: %clang -### -target hexagon-unknown-linux \ -// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \ -// RUN: --gcc-toolchain="" \ -// RUN: -fPIC \ -// RUN: %s 2>&1 \ -// RUN: | FileCheck -check-prefix=CHECK024 %s +// RUN: | sed -e "s/\.exe//" -e "s/\.EXE//" | FileCheck -check-prefix=CHECK024 %s // RUN: %clang -### -target hexagon-unknown-linux \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/qc/bin \ // RUN: --gcc-toolchain="" \ // RUN: -fPIC \ -// RUN: -msmall-data-threshold=8 \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK024 %s // CHECK024: "-cc1"