r250262 - I took care of the build problem in the commit 250252.
Sean Silva via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 13 19:07:18 PDT 2015
This is breaking llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast:
http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/1358/steps/test/logs/stdio
On Tue, Oct 13, 2015 at 6:09 PM, Ekaterina Romanova via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: kromanova
> Date: Tue Oct 13 20:09:02 2015
> New Revision: 250262
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250262&view=rev
> Log:
> I took care of the build problem in the commit 250252.
> Resubmitting the patch.
>
> This patch adds missing pieces to clang, including the PS4 toolchain
> definition, added warnings, PS4 defaults, and Driver changes needed for
> our compiler.
>
> A patch by Filipe Cabecinhas, Pierre Gousseau and Katya Romanova!
>
> Differential Revision: http://reviews.llvm.org/D13482
>
>
> Added:
> cfe/trunk/test/Driver/Inputs/scei-ps4_tree/target/include/.keep
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/Inputs/scei-ps4_tree/target/include/.keep
> cfe/trunk/test/Driver/Inputs/scei-ps4_tree/target/include_common/.keep
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/Inputs/scei-ps4_tree/target/include_common/.keep
> cfe/trunk/test/Driver/no-integrated-as.s
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/no-integrated-as.s
> cfe/trunk/test/Driver/ps4-header-search.c
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/ps4-header-search.c
> cfe/trunk/test/Driver/ps4-linker-non-win.c
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/ps4-linker-non-win.c
> cfe/trunk/test/Driver/ps4-linker-win.c
> - copied unchanged from r250256,
> cfe/trunk/test/Driver/ps4-linker-win.c
> cfe/trunk/test/Driver/ps4-pic.c
> - copied unchanged from r250256, cfe/trunk/test/Driver/ps4-pic.c
> cfe/trunk/test/Driver/ps4-sdk-root.c
> - copied unchanged from r250256, cfe/trunk/test/Driver/ps4-sdk-root.c
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
> cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> cfe/trunk/lib/Driver/Driver.cpp
> cfe/trunk/lib/Driver/ToolChains.cpp
> cfe/trunk/lib/Driver/ToolChains.h
> cfe/trunk/lib/Driver/Tools.cpp
> cfe/trunk/lib/Driver/Tools.h
> cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
> cfe/trunk/test/Driver/debug-options.c
> cfe/trunk/test/Driver/stack-protector.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue Oct 13
> 20:09:02 2015
> @@ -196,4 +196,18 @@ def warn_target_unsupported_nan2008 : Wa
> def warn_target_unsupported_nanlegacy : Warning<
> "ignoring '-mnan=legacy' option because the '%0' architecture does not
> support it">,
> InGroup<UnsupportedNan>;
> +
> +def warn_drv_unable_to_find_directory_expected : Warning<
> + "unable to find %0 directory, expected to be in '%1'">,
> + InGroup<InvalidOrNonExistentDirectory>, DefaultIgnore;
> +
> +def warn_drv_ps4_force_pic : Warning<
> + "option '%0' was ignored by the PS4 toolchain, using '-fPIC'">,
> + InGroup<OptionIgnored>;
> +
> +def warn_drv_ps4_sdk_dir : Warning<
> + "environment variable SCE_PS4_SDK_DIR is set, but points to invalid or
> nonexistent directory '%0'">,
> + InGroup<InvalidOrNonExistentDirectory>;
> +
> +def err_drv_unsupported_linker : Error<"unsupported value '%0' for
> -linker option">;
> }
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Oct 13 20:09:02
> 2015
> @@ -823,3 +823,7 @@ def CudaCompat : DiagGroup<"cuda-compat"
>
> // A warning group for things that will change semantics in the future.
> def FutureCompat : DiagGroup<"future-compat">;
> +
> +def InvalidOrNonExistentDirectory :
> DiagGroup<"invalid-or-nonexistent-directory">;
> +
> +def OptionIgnored : DiagGroup<"option-ignored">;
>
> Modified: cfe/trunk/lib/Driver/Driver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Driver.cpp (original)
> +++ cfe/trunk/lib/Driver/Driver.cpp Tue Oct 13 20:09:02 2015
> @@ -2261,6 +2261,9 @@ const ToolChain &Driver::getToolChain(co
> case llvm::Triple::CUDA:
> TC = new toolchains::CudaToolChain(*this, Target, Args);
> break;
> + case llvm::Triple::PS4:
> + TC = new toolchains::PS4CPU(*this, Target, Args);
> + break;
> default:
> // Of these targets, Hexagon is the only one that might have
> // an OS of Linux, in which case it got handled above already.
>
> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Oct 13 20:09:02 2015
> @@ -4066,3 +4066,77 @@ void WebAssembly::addClangTargetOptions(
> options::OPT_fno_use_init_array, true))
> CC1Args.push_back("-fuse-init-array");
> }
> +
> +PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList
> &Args)
> + : Generic_ELF(D, Triple, Args) {
> + if (Args.hasArg(options::OPT_static))
> + D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" <<
> "PS4";
> +
> + // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
> + // if it exists; otherwise use the driver's installation path, which
> + // should be <SDK_DIR>/host_tools/bin.
> +
> + SmallString<512> PS4SDKDir;
> + if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
> + if (!llvm::sys::fs::exists(EnvValue))
> + getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
> + PS4SDKDir = EnvValue;
> + } else {
> + PS4SDKDir = getDriver().Dir;
> + llvm::sys::path::append(PS4SDKDir, "/../../");
> + }
> +
> + // By default, the driver won't report a warning if it can't find
> + // PS4's include or lib directories. This behavior could be changed if
> + // -Weverything or -Winvalid-or-nonexistent-directory options are
> passed.
> + // If -isysroot was passed, use that as the SDK base path.
> + std::string PrefixDir;
> + if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
> + PrefixDir = A->getValue();
> + if (!llvm::sys::fs::exists(PrefixDir))
> + getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
> + } else
> + PrefixDir = PS4SDKDir.str();
> +
> + SmallString<512> PS4SDKIncludeDir(PrefixDir);
> + llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
> + if (!Args.hasArg(options::OPT_nostdinc) &&
> + !Args.hasArg(options::OPT_nostdlibinc) &&
> + !Args.hasArg(options::OPT_isysroot) &&
> + !Args.hasArg(options::OPT__sysroot_EQ) &&
> + !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
> +
> getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
> + << "PS4 system headers" << PS4SDKIncludeDir;
> + }
> +
> + SmallString<512> PS4SDKLibDir(PS4SDKDir);
> + llvm::sys::path::append(PS4SDKLibDir, "target/lib");
> + if (!Args.hasArg(options::OPT_nostdlib) &&
> + !Args.hasArg(options::OPT_nodefaultlibs) &&
> + !Args.hasArg(options::OPT__sysroot_EQ) &&
> !Args.hasArg(options::OPT_E) &&
> + !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
> + !Args.hasArg(options::OPT_emit_ast) &&
> + !llvm::sys::fs::exists(PS4SDKLibDir)) {
> +
> getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
> + << "PS4 system libraries" << PS4SDKLibDir;
> + return;
> + }
> + getFilePaths().push_back(PS4SDKLibDir.str());
> +}
> +
> +Tool *PS4CPU::buildAssembler() const {
> + return new tools::PS4cpu::Assemble(*this);
> +}
> +
> +Tool *PS4CPU::buildLinker() const { return new
> tools::PS4cpu::Link(*this); }
> +
> +bool PS4CPU::isPICDefault() const { return true; }
> +
> +bool PS4CPU::HasNativeLLVMSupport() const { return true; }
> +
> +SanitizerMask PS4CPU::getSupportedSanitizers() const {
> + SanitizerMask Res = ToolChain::getSupportedSanitizers();
> + Res |= SanitizerKind::Address;
> + Res |= SanitizerKind::Vptr;
> + return Res;
> +}
>
> Modified: cfe/trunk/lib/Driver/ToolChains.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.h (original)
> +++ cfe/trunk/lib/Driver/ToolChains.h Tue Oct 13 20:09:02 2015
> @@ -1015,6 +1015,27 @@ private:
> llvm::opt::ArgStringList &CC1Args) const
> override;
> };
>
> +class LLVM_LIBRARY_VISIBILITY PS4CPU : public Generic_ELF {
> +public:
> + PS4CPU(const Driver &D, const llvm::Triple &Triple,
> + const llvm::opt::ArgList &Args);
> +
> + bool IsMathErrnoDefault() const override { return false; }
> + bool IsObjCNonFragileABIDefault() const override { return true; }
> + bool HasNativeLLVMSupport() const override;
> + bool isPICDefault() const override;
> +
> + unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const
> override {
> + return 2; // SSPStrong
> + }
> +
> + SanitizerMask getSupportedSanitizers() const override;
> +
> +protected:
> + Tool *buildAssembler() const override;
> + Tool *buildLinker() const override;
> +};
> +
> } // end namespace toolchains
> } // end namespace driver
> } // end namespace clang
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Tue Oct 13 20:09:02 2015
> @@ -3110,15 +3110,23 @@ ParsePICArgs(const ToolChain &ToolChain,
> O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
> } else {
> PIE = PIC = false;
> + if (Triple.isPS4CPU()) {
> + Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
> + StringRef Model = ModelArg ? ModelArg->getValue() : "";
> + if (Model != "kernel") {
> + PIC = true;
> + ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
> + << LastPICArg->getSpelling();
> + }
> + }
> }
> }
> }
>
> - // Introduce a Darwin-specific hack. If the default is PIC, but the
> - // PIC level would've been set to level 1, force it back to level 2
> - // PIC instead. This matches the behavior of Darwin GCC (based on
> - // chandlerc's informal testing in 2012).
> - if (PIC && ToolChain.getTriple().isOSDarwin())
> + // Introduce a Darwin and PS4-specific hack. If the default is PIC, but
> the
> + // PIC level would've been set to level 1, force it back to level 2 PIC
> + // instead.
> + if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
> IsPICLevelTwo |= ToolChain.isPICDefault();
>
> // This kernel flags are a trump-card: they will disable PIC/PIE
> @@ -3190,6 +3198,7 @@ void Clang::ConstructJob(Compilation &C,
> bool IsWindowsCygnus =
> getToolChain().getTriple().isWindowsCygwinEnvironment();
> bool IsWindowsMSVC =
> getToolChain().getTriple().isWindowsMSVCEnvironment();
> + bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
>
> // Check number of inputs for sanity. We need at least one input.
> assert(Inputs.size() >= 1 && "Must have at least one input.");
> @@ -3843,8 +3852,10 @@ void Clang::ConstructJob(Compilation &C,
>
> // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
> Args.ClaimAllArgs(options::OPT_g_flags_Group);
> +
> + // PS4 defaults to no column info
> if (Args.hasFlag(options::OPT_gcolumn_info,
> options::OPT_gno_column_info,
> - /*Default*/ true))
> + /*Default=*/ !IsPS4CPU))
> CmdArgs.push_back("-dwarf-column-info");
>
> // FIXME: Move backend command line options to the module.
> @@ -3883,7 +3894,8 @@ void Clang::ConstructJob(Compilation &C,
>
> // -gdwarf-aranges turns on the emission of the aranges section in the
> // backend.
> - if (Args.hasArg(options::OPT_gdwarf_aranges)) {
> + // Always enabled on the PS4.
> + if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
> CmdArgs.push_back("-backend-option");
> CmdArgs.push_back("-generate-arange-section");
> }
> @@ -9919,3 +9931,325 @@ void tools::Myriad::Linker::ConstructJob
> C.addCommand(llvm::make_unique<Command>(JA, *this,
> Args.MakeArgString(Exec),
> CmdArgs, Inputs));
> }
> +
> +void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
> + const InputInfo &Output,
> + const InputInfoList &Inputs,
> + const ArgList &Args,
> + const char *LinkingOutput) const {
> + claimNoWarnArgs(Args);
> + ArgStringList CmdArgs;
> +
> + Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
> options::OPT_Xassembler);
> +
> + CmdArgs.push_back("-o");
> + CmdArgs.push_back(Output.getFilename());
> +
> + assert(Inputs.size() == 1 && "Unexpected number of inputs.");
> + const InputInfo &Input = Inputs[0];
> + assert(Input.isFilename() && "Invalid input.");
> + CmdArgs.push_back(Input.getFilename());
> +
> + const char *Exec =
> + Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
> + C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs,
> Inputs));
> +}
> +
> +static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
> + ArgStringList &CmdArgs) {
> + if (!(Args.hasFlag(options::OPT_fprofile_arcs,
> options::OPT_fno_profile_arcs,
> + false) ||
> + Args.hasArg(options::OPT_fprofile_generate) ||
> + Args.hasArg(options::OPT_fprofile_instr_generate) ||
> + Args.hasArg(options::OPT_fcreate_profile) ||
> + Args.hasArg(options::OPT_coverage)))
> + return;
> +
> + assert(TC.getTriple().isPS4CPU() &&
> + "Profiling libraries are only implemented for the PS4 CPU");
> + CmdArgs.push_back("-lclang_rt.profile-x86_64");
> +}
> +
> +static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList
> &CmdArgs) {
> + const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
> + if (SanArgs.needsUbsanRt()) {
> + CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
> + }
> + if (SanArgs.needsAsanRt()) {
> + CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
> + }
> +}
> +
> +static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
> + const JobAction &JA, const InputInfo
> &Output,
> + const InputInfoList &Inputs,
> + const ArgList &Args,
> + const char *LinkingOutput) {
> + const toolchains::FreeBSD &ToolChain =
> + static_cast<const toolchains::FreeBSD &>(T.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);
> +
> + if (!D.SysRoot.empty())
> + CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
> +
> + if (Args.hasArg(options::OPT_pie))
> + CmdArgs.push_back("-pie");
> +
> + if (Args.hasArg(options::OPT_rdynamic))
> + CmdArgs.push_back("-export-dynamic");
> + if (Args.hasArg(options::OPT_shared))
> + CmdArgs.push_back("--oformat=so");
> +
> + if (Output.isFilename()) {
> + CmdArgs.push_back("-o");
> + CmdArgs.push_back(Output.getFilename());
> + } else {
> + assert(Output.isNothing() && "Invalid output.");
> + }
> +
> + Args.AddAllArgs(CmdArgs, options::OPT_L);
> + 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_r);
> +
> + if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
> + CmdArgs.push_back("--no-demangle");
> +
> + AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
> +
> + if (Args.hasArg(options::OPT_pthread)) {
> + CmdArgs.push_back("-lpthread");
> + }
> +
> + AddPS4ProfileRT(ToolChain, Args, CmdArgs);
> + AddPS4SanitizerArgs(ToolChain, CmdArgs);
> +
> + const char *Exec =
> Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
> +
> + C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
> +}
> +
> +static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
> + const JobAction &JA, const InputInfo
> &Output,
> + const InputInfoList &Inputs,
> + const ArgList &Args,
> + const char *LinkingOutput) {
> + const toolchains::FreeBSD &ToolChain =
> + static_cast<const toolchains::FreeBSD &>(T.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);
> +
> + if (!D.SysRoot.empty())
> + CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
> +
> + if (Args.hasArg(options::OPT_pie))
> + CmdArgs.push_back("-pie");
> +
> + if (Args.hasArg(options::OPT_static)) {
> + CmdArgs.push_back("-Bstatic");
> + } else {
> + if (Args.hasArg(options::OPT_rdynamic))
> + CmdArgs.push_back("-export-dynamic");
> + CmdArgs.push_back("--eh-frame-hdr");
> + if (Args.hasArg(options::OPT_shared)) {
> + CmdArgs.push_back("-Bshareable");
> + } else {
> + CmdArgs.push_back("-dynamic-linker");
> + CmdArgs.push_back("/libexec/ld-elf.so.1");
> + }
> + CmdArgs.push_back("--enable-new-dtags");
> + }
> +
> + if (Output.isFilename()) {
> + CmdArgs.push_back("-o");
> + CmdArgs.push_back(Output.getFilename());
> + } else {
> + assert(Output.isNothing() && "Invalid output.");
> + }
> +
> + if (!Args.hasArg(options::OPT_nostdlib) &&
> + !Args.hasArg(options::OPT_nostartfiles)) {
> + const char *crt1 = NULL;
> + if (!Args.hasArg(options::OPT_shared)) {
> + if (Args.hasArg(options::OPT_pg))
> + crt1 = "gcrt1.o";
> + else if (Args.hasArg(options::OPT_pie))
> + crt1 = "Scrt1.o";
> + else
> + crt1 = "crt1.o";
> + }
> + if (crt1)
> + CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
> +
> +
> CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
> +
> + const char *crtbegin = NULL;
> + if (Args.hasArg(options::OPT_static))
> + crtbegin = "crtbeginT.o";
> + else if (Args.hasArg(options::OPT_shared) ||
> Args.hasArg(options::OPT_pie))
> + crtbegin = "crtbeginS.o";
> + else
> + crtbegin = "crtbegin.o";
> +
> +
> CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
> + }
> +
> + Args.AddAllArgs(CmdArgs, options::OPT_L);
> +
> + const ToolChain::path_list Paths = ToolChain.getFilePaths();
> + for (ToolChain::path_list::const_iterator i = Paths.begin(), e =
> Paths.end();
> + i != e; ++i)
> + CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
> +
> + 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_r);
> +
> + if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
> + CmdArgs.push_back("--no-demangle");
> +
> + AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
> +
> + if (!Args.hasArg(options::OPT_nostdlib) &&
> + !Args.hasArg(options::OPT_nodefaultlibs)) {
> + // For PS4, we always want to pass libm, libstdc++ and libkernel
> + // libraries for both C and C++ compilations.
> + CmdArgs.push_back("-lkernel");
> + if (D.CCCIsCXX()) {
> + ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
> + if (Args.hasArg(options::OPT_pg))
> + CmdArgs.push_back("-lm_p");
> + else
> + CmdArgs.push_back("-lm");
> + }
> + // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
> + // the default system libraries. Just mimic this for now.
> + if (Args.hasArg(options::OPT_pg))
> + CmdArgs.push_back("-lgcc_p");
> + else
> + CmdArgs.push_back("-lcompiler_rt");
> + if (Args.hasArg(options::OPT_static)) {
> + CmdArgs.push_back("-lstdc++");
> + } else if (Args.hasArg(options::OPT_pg)) {
> + CmdArgs.push_back("-lgcc_eh_p");
> + } else {
> + CmdArgs.push_back("--as-needed");
> + CmdArgs.push_back("-lstdc++");
> + CmdArgs.push_back("--no-as-needed");
> + }
> +
> + if (Args.hasArg(options::OPT_pthread)) {
> + if (Args.hasArg(options::OPT_pg))
> + CmdArgs.push_back("-lpthread_p");
> + else
> + CmdArgs.push_back("-lpthread");
> + }
> +
> + if (Args.hasArg(options::OPT_pg)) {
> + if (Args.hasArg(options::OPT_shared))
> + CmdArgs.push_back("-lc");
> + else {
> + if (Args.hasArg(options::OPT_static)) {
> + CmdArgs.push_back("--start-group");
> + CmdArgs.push_back("-lc_p");
> + CmdArgs.push_back("-lpthread_p");
> + CmdArgs.push_back("--end-group");
> + } else {
> + CmdArgs.push_back("-lc_p");
> + }
> + }
> + CmdArgs.push_back("-lgcc_p");
> + } else {
> + if (Args.hasArg(options::OPT_static)) {
> + CmdArgs.push_back("--start-group");
> + CmdArgs.push_back("-lc");
> + CmdArgs.push_back("-lpthread");
> + CmdArgs.push_back("--end-group");
> + } else {
> + CmdArgs.push_back("-lc");
> + }
> + CmdArgs.push_back("-lcompiler_rt");
> + }
> +
> + if (Args.hasArg(options::OPT_static)) {
> + CmdArgs.push_back("-lstdc++");
> + } else if (Args.hasArg(options::OPT_pg)) {
> + CmdArgs.push_back("-lgcc_eh_p");
> + } else {
> + CmdArgs.push_back("--as-needed");
> + CmdArgs.push_back("-lstdc++");
> + CmdArgs.push_back("--no-as-needed");
> + }
> + }
> +
> + if (!Args.hasArg(options::OPT_nostdlib) &&
> + !Args.hasArg(options::OPT_nostartfiles)) {
> + if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
> +
> CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
> + else
> +
> CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
> +
> CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
> + }
> +
> + AddPS4ProfileRT(ToolChain, Args, CmdArgs);
> + AddPS4SanitizerArgs(ToolChain, CmdArgs);
> +
> + const char *Exec =
> +#ifdef LLVM_ON_WIN32
> + Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
> +#else
> + Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
> +#endif
> +
> + C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
> +}
> +
> +void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
> + const InputInfo &Output,
> + const InputInfoList &Inputs,
> + const ArgList &Args,
> + const char *LinkingOutput) const {
> + const toolchains::FreeBSD &ToolChain =
> + static_cast<const toolchains::FreeBSD &>(getToolChain());
> + const Driver &D = ToolChain.getDriver();
> + bool PS4Linker;
> + StringRef LinkerOptName;
> + if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
> + LinkerOptName = A->getValue();
> + if (LinkerOptName != "ps4" && LinkerOptName != "gold")
> + D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
> + }
> +
> + if (LinkerOptName == "gold")
> + PS4Linker = false;
> + else if (LinkerOptName == "ps4")
> + PS4Linker = true;
> + else
> + PS4Linker = !Args.hasArg(options::OPT_shared);
> +
> + if (PS4Linker)
> + ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args,
> LinkingOutput);
> + else
> + ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args,
> LinkingOutput);
> +}
>
> Modified: cfe/trunk/lib/Driver/Tools.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.h (original)
> +++ cfe/trunk/lib/Driver/Tools.h Tue Oct 13 20:09:02 2015
> @@ -831,6 +831,36 @@ public:
> };
> } // end namespace Myriad
>
> +namespace PS4cpu {
> +class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
> +public:
> + Assemble(const ToolChain &TC)
> + : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
> +
> + virtual bool hasIntegratedCPP() const { return false; }
> +
> + virtual void ConstructJob(Compilation &C, const JobAction &JA,
> + const InputInfo &Output,
> + const InputInfoList &Inputs,
> + const llvm::opt::ArgList &TCArgs,
> + const char *LinkingOutput) const;
> +};
> +
> +class LLVM_LIBRARY_VISIBILITY Link : public Tool {
> +public:
> + Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full)
> {}
> +
> + virtual bool hasIntegratedCPP() const { return false; }
> + virtual bool isLinkJob() const { return true; }
> +
> + virtual void ConstructJob(Compilation &C, const JobAction &JA,
> + const InputInfo &Output,
> + const InputInfoList &Inputs,
> + const llvm::opt::ArgList &TCArgs,
> + const char *LinkingOutput) const;
> +};
> +} // end namespace PS4cpu
> +
> } // end namespace tools
> } // end namespace driver
> } // end namespace clang
>
> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Tue Oct 13 20:09:02 2015
> @@ -215,6 +215,7 @@ void InitHeaderSearch::AddDefaultCInclud
> case llvm::Triple::OpenBSD:
> case llvm::Triple::Bitrig:
> case llvm::Triple::NaCl:
> + case llvm::Triple::PS4:
> break;
> case llvm::Triple::Win32:
> if (triple.getEnvironment() != llvm::Triple::Cygnus)
> @@ -318,6 +319,28 @@ void InitHeaderSearch::AddDefaultCInclud
> case llvm::Triple::RTEMS:
> case llvm::Triple::NaCl:
> break;
> + case llvm::Triple::PS4: {
> + // <isysroot> gets prepended later in AddPath().
> + std::string BaseSDKPath = "";
> + if (!HasSysroot) {
> + const char *envValue = getenv("SCE_PS4_SDK_DIR");
> + if (envValue)
> + BaseSDKPath = envValue;
> + else {
> + // HSOpts.ResourceDir variable contains the location of Clang's
> + // resource files.
> + // Assuming that Clang is configured for PS4 without
> + // --with-clang-resource-dir option, the location of Clang's
> resource
> + // files is <SDK_DIR>/host_tools/lib/clang
> + SmallString<128> P = StringRef(HSOpts.ResourceDir);
> + llvm::sys::path::append(P, "../../..");
> + BaseSDKPath = P.str();
> + }
> + }
> + AddPath(BaseSDKPath + "/target/include", System, false);
> + if (triple.isPS4CPU())
> + AddPath(BaseSDKPath + "/target/include_common", System, false);
> + }
> default:
> AddPath("/usr/include", ExternCSystem, false);
> break;
>
> Modified: cfe/trunk/test/Driver/debug-options.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/debug-options.c?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/debug-options.c (original)
> +++ cfe/trunk/test/Driver/debug-options.c Tue Oct 13 20:09:02 2015
> @@ -27,6 +27,17 @@
> // RUN: %clang -### -c -ggdb3 %s -target x86_64-apple-darwin 2>&1 \
> // RUN: | FileCheck -check-prefix=G_DARWIN %s
>
> +// On the PS4, -g defaults to -gno-column-info, and we always generate the
> +// arange section.
> +// RUN: %clang -### -c %s -target x86_64-scei-ps4 2>&1 \
> +// RUN: | FileCheck -check-prefix=G_PS4 %s
> +// RUN: %clang -### -c %s -g -target x86_64-scei-ps4 2>&1 \
> +// RUN: | FileCheck -check-prefix=G_PS4 %s
> +// RUN: %clang -### -c %s -g -target x86_64-scei-ps4 2>&1 \
> +// RUN: | FileCheck -check-prefix=NOCI %s
> +// RUN: %clang -### -c %s -g -gcolumn-info -target x86_64-scei-ps4 2>&1 \
> +// RUN: | FileCheck -check-prefix=CI %s
> +
> // RUN: %clang -### -c -gdwarf-2 %s 2>&1 | FileCheck -check-prefix=G_D2 %s
> //
> // RUN: %clang -### -c -gfoo %s 2>&1 | FileCheck -check-prefix=G_NO %s
> @@ -86,6 +97,9 @@
> // G_DARWIN: "-cc1"
> // G_DARWIN: "-dwarf-version=2"
> //
> +// G_PS4: "-cc1"
> +// G_PS4: "-generate-arange-section"
> +//
> // G_D2: "-cc1"
> // G_D2: "-dwarf-version=2"
> //
>
> Modified: cfe/trunk/test/Driver/stack-protector.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/stack-protector.c?rev=250262&r1=250261&r2=250262&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/stack-protector.c (original)
> +++ cfe/trunk/test/Driver/stack-protector.c Tue Oct 13 20:09:02 2015
> @@ -23,3 +23,12 @@
> // RUN: %clang -fstack-protector-all -### %s 2>&1 | FileCheck %s
> -check-prefix=SSP-ALL
> // SSP-ALL: "-stack-protector" "3"
> // SSP-ALL-NOT: "-stack-protector-buffer-size"
> +
> +// RUN: %clang -target x86_64-scei-ps4 -### %s 2>&1 | FileCheck %s
> -check-prefix=SSP-PS4
> +// RUN: %clang -target x86_64-scei-ps4 -fstack-protector -### %s 2>&1 |
> FileCheck %s -check-prefix=SSP-PS4
> +// SSP-PS4: "-stack-protector" "2"
> +// SSP-PS4-NOT: "-stack-protector-buffer-size"
> +
> +// RUN: %clang -target x86_64-scei-ps4 -fstack-protector --param
> ssp-buffer-size=16 -### %s 2>&1 | FileCheck %s -check-prefix=SSP-PS4-BUF
> +// SSP-PS4-BUF: "-stack-protector" "2"
> +// SSP-PS4-BUF: "-stack-protector-buffer-size" "16"
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151013/4ea690ea/attachment-0001.html>
More information about the cfe-commits
mailing list