| 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,
|
|
|