Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(379)

Unified Diff: lib/Driver/Tools.cpp

Issue 1547623002: Clang toolchain driver for PNaCl (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-clang.git@master
Patch Set: Review feedback addressed Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/Driver/Tools.h ('k') | test/CodeGen/pr18235.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/Driver/Tools.cpp
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 05e81f55fff0020b42eb4d89bbe9b17e3e7c6567..dedeb687ce739fdfb4323160a6dca94a31f40ee5 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1766,6 +1766,13 @@ void Clang::AddHexagonTargetArgs(const ArgList &Args,
CmdArgs.push_back ("-machine-sink-split=0");
}
+void Clang::AddLe32TargetArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const {
+ Args.ClaimAllArgs(options::OPT_emit_obj);
+
+ CmdArgs.push_back("-fno-gnu-inline-asm");
+}
+
// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
static bool DecodeAArch64Features(const Driver &D, StringRef text,
std::vector<const char *> &Features) {
@@ -2050,7 +2057,8 @@ static void addExceptionArgs(const ArgList &Args, types::ID InputType,
if (types::isCXX(InputType)) {
bool CXXExceptionsEnabled =
- Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
+ Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU() &&
+ Triple.getArch() != llvm::Triple::le32;
Arg *ExceptionArg = Args.getLastArg(
options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
options::OPT_fexceptions, options::OPT_fno_exceptions);
@@ -3270,6 +3278,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
case llvm::Triple::hexagon:
AddHexagonTargetArgs(Args, CmdArgs);
break;
+
+ case llvm::Triple::le32:
+ AddLe32TargetArgs(Args, CmdArgs);
}
// Add clang-cl arguments.
@@ -4525,7 +4536,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// Enable vectorization per default according to the optimization level
// selected. For optimization levels that want vectorization we use the alias
// option to simplify the hasFlag logic.
- bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
+ bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false) &&
+ getToolChain().getArch() != llvm::Triple::le32;
OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
options::OPT_fvectorize;
if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
@@ -4533,7 +4545,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-vectorize-loops");
// -fslp-vectorize is enabled based on the optimization level selected.
- bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
+ bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true) &&
+ getToolChain().getArch() != llvm::Triple::le32;
OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
options::OPT_fslp_vectorize;
if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
@@ -8181,6 +8194,186 @@ void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
ToolChain.Linker.c_str(), CmdArgs));
}
+void pnacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const ArgList &Args,
+ const char *LinkingOutput) const {
+ const toolchains::PNaClToolChain& ToolChain =
+ static_cast<const toolchains::PNaClToolChain&>(getToolChain());
+ const Driver &D = ToolChain.getDriver();
+
+ ArgStringList CmdArgs;
+
+ // Silence warning for "clang -g foo.o -o foo"
+ Args.ClaimAllArgs(options::OPT_g_Group);
+ // and "clang -emit-llvm foo.o -o foo"
+ Args.ClaimAllArgs(options::OPT_emit_llvm);
+ // and for "clang -w foo.o -o foo". Other warning options are already
+ // handled somewhere else.
+ Args.ClaimAllArgs(options::OPT_w);
+ // Silence warning for libgcc since we only support compiler-rt.
+ Args.ClaimAllArgs(options::OPT_shared_libgcc);
+ Args.ClaimAllArgs(options::OPT_static_libgcc);
+
+ if (!D.SysRoot.empty())
+ CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
+
+ if (Arg *A = Args.getLastArg(options::OPT_shared,
+ options::OPT_dynamic,
+ options::OPT_rdynamic))
+ D.Diag(diag::err_drv_unsupported_opt) << A->getOption().getName();
+
+ std::string TripleStr = ToolChain.ComputeEffectiveClangTriple(Args);
+ if (ToolChain.getArch() != llvm::Triple::le32)
+ D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
+ << TripleStr;
+
+ Args.AddAllArgs(CmdArgs, options::OPT_static);
+ if (!Args.hasArg(options::OPT_static))
+ CmdArgs.push_back("-static");
+
+ bool EH = exceptionSettings(Args, ToolChain.getTriple());
+
+ bool IsRelocatable = false;
+ if (Args.hasArg(options::OPT_Wl_COMMA)) {
+ for (arg_iterator
+ it = Args.filtered_begin(options::OPT_Wl_COMMA),
+ ie = Args.filtered_end();
+ it != ie;
+ ++it) {
+ for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i) {
+ if (StringRef((*it)->getValue(i)) == "-r")
+ IsRelocatable = true;
+ }
+ }
+ }
+
+ if (!IsRelocatable) {
+ // The following functions are implemented in the native support library.
+ // Before a .pexe is produced, they get rewritten to intrinsic calls.
+ // However, this rewriting happens after bitcode linking - so gold has to
+ // be told that these are allowed to remain unresolved.
+ const StringRef AllowUnresolvedSymbols[] = {
+ "memcpy",
+ "memset",
+ "memmove",
+ "setjmp",
+ "longjmp"
+ };
+ CmdArgs.push_back("--undef-sym-check");
+ for (StringRef Symbol : AllowUnresolvedSymbols)
+ CmdArgs.push_back(Args.MakeArgString(Twine("--allow-unresolved=") + Symbol));
+
+ // These TLS layout functions are either defined by the ExpandTls pass or
+ // (for non-ABI-stable code only) by PNaCl's native support code.
+ const StringRef AllowUnresolvedSymbols1[] = {
+ "__nacl_tp_tls_offset",
+ "__nacl_tp_tdb_offset",
+ "__nacl_get_arch",
+ };
+ for (StringRef Symbol : AllowUnresolvedSymbols1)
+ CmdArgs.push_back(Args.MakeArgString(Twine("--allow-unresolved=") + Symbol));
+
+ if (EH) {
+ // These symbols are defined by libsupc++ and the PNaClSjLjEH pass
+ // generates references to them.
+ const StringRef UndefinedSymbols[] = {
+ "__pnacl_eh_stack",
+ "__pnacl_eh_resume",
+ };
+ for (StringRef Symbol : UndefinedSymbols)
+ CmdArgs.push_back(Args.MakeArgString(Twine("--undefined=") + Symbol));
+ // These symbols are defined by the PNaClSjLjEH pass and libsupc++ refers
+ // to them.
+ const StringRef AllowUnresolvedSymbols[] = {
+ "__pnacl_eh_type_table",
+ "__pnacl_eh_action_table",
+ "__pnacl_eh_filter_table",
+ };
+ for (StringRef Symbol : AllowUnresolvedSymbols)
+ CmdArgs.push_back(Args.MakeArgString(Twine("--allow-unresolved=") + Symbol));
+ }
+ }
+
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+
+ if (!Args.hasArg(options::OPT_nostdlib) &&
+ !Args.hasArg(options::OPT_nostartfiles)) {
+ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.x")));
+ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.bc")));
+ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.bc")));
+
+ const char *unwind = nullptr;
+ if (EH)
+ unwind = "sjlj_eh_redirect.bc";
+ else
+ unwind = "unwind_stubs.bc";
+ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(unwind)));
+ }
+
+ Args.AddAllArgs(CmdArgs, options::OPT_L);
+ Args.AddAllArgs(CmdArgs, options::OPT_u);
+
+ const ToolChain::path_list &Paths = ToolChain.getFilePaths();
+
+ for (const auto &Path : Paths)
+ CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
+
+ // Tell the linker to load the plugin. This has to come before AddLinkerInputs
+ // as gold requires -plugin to come before any -plugin-opt that -Wl might
+ // forward.
+ CmdArgs.push_back("-plugin");
+ std::string Plugin = ToolChain.getDriver().Dir +
+ "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold" LTDL_SHLIB_EXT;
+
+ CmdArgs.push_back(Args.MakeArgString(Plugin));
+
+ CmdArgs.push_back("-plugin-opt=emit-llvm");
+ if (!IsRelocatable)
+ CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mtriple=") +
+ ToolChain.getTriple().str()));
+
+ if (EH)
+ CmdArgs.push_back("-plugin-opt=-enable-pnacl-sjlj-eh");
+
+ if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
+ CmdArgs.push_back("--no-demangle");
+
+ AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
+
+ if (D.CCCIsCXX() &&
+ !Args.hasArg(options::OPT_nostdlib) &&
+ !Args.hasArg(options::OPT_nodefaultlibs)) {
+ ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
+ CmdArgs.push_back("-lpthread");
+ CmdArgs.push_back("-lm");
+ }
+ // Silence warnings when linking C code with a C++ '-stdlib' argument.
+ Args.ClaimAllArgs(options::OPT_stdlib_EQ);
+
+ if (!Args.hasArg(options::OPT_nostdlib)) {
+ if (!Args.hasArg(options::OPT_nodefaultlibs)) {
+ CmdArgs.push_back("--start-group");
+
+ if ((Args.hasArg(options::OPT_pthread) ||
+ Args.hasArg(options::OPT_pthreads)))
+ CmdArgs.push_back("-lpthread");
+
+ CmdArgs.push_back("-lc");
+ CmdArgs.push_back("-lgcc");
+ CmdArgs.push_back("-lm");
+ ToolChain.AddLinkRuntimeLibArgs(Args, CmdArgs);
+
+ CmdArgs.push_back("--end-group");
+ }
+ }
+
+ std::string Linker = ToolChain.GetProgramPath("le32-nacl-ld.gold");
+ C.addCommand(
+ llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), CmdArgs));
+}
void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
« no previous file with comments | « lib/Driver/Tools.h ('k') | test/CodeGen/pr18235.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698