Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
35269 views
//===--- CSKYToolchain.cpp - CSKY ToolChain Implementations ---*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "CSKYToolChain.h"9#include "CommonArgs.h"10#include "clang/Driver/Compilation.h"11#include "clang/Driver/InputInfo.h"12#include "clang/Driver/Options.h"13#include "llvm/Option/ArgList.h"14#include "llvm/Support/FileSystem.h"15#include "llvm/Support/Path.h"16#include "llvm/Support/raw_ostream.h"1718using namespace clang::driver;19using namespace clang::driver::toolchains;20using namespace clang::driver::tools;21using namespace clang;22using namespace llvm::opt;2324static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,25const Multilib &Multilib,26StringRef InstallPath,27ToolChain::path_list &Paths) {28if (const auto &PathsCallback = Multilibs.filePathsCallback())29for (const auto &Path : PathsCallback(Multilib))30addPathIfExists(D, InstallPath + Path, Paths);31}3233/// CSKY Toolchain34CSKYToolChain::CSKYToolChain(const Driver &D, const llvm::Triple &Triple,35const ArgList &Args)36: Generic_ELF(D, Triple, Args) {37GCCInstallation.init(Triple, Args);38if (GCCInstallation.isValid()) {39Multilibs = GCCInstallation.getMultilibs();40SelectedMultilibs.assign({GCCInstallation.getMultilib()});41path_list &Paths = getFilePaths();42// Add toolchain/multilib specific file paths.43addMultilibsFilePaths(D, Multilibs, SelectedMultilibs.back(),44GCCInstallation.getInstallPath(), Paths);45getFilePaths().push_back(GCCInstallation.getInstallPath().str() +46SelectedMultilibs.back().osSuffix());47ToolChain::path_list &PPaths = getProgramPaths();48// Multilib cross-compiler GCC installations put ld in a triple-prefixed49// directory off of the parent of the GCC installation.50PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +51GCCInstallation.getTriple().str() + "/bin")52.str());53PPaths.push_back((GCCInstallation.getParentLibPath() + "/../bin").str());54getFilePaths().push_back(computeSysRoot() + "/lib" +55SelectedMultilibs.back().osSuffix());56} else {57getProgramPaths().push_back(D.Dir);58getFilePaths().push_back(computeSysRoot() + "/lib");59}60}6162Tool *CSKYToolChain::buildLinker() const {63return new tools::CSKY::Linker(*this);64}6566ToolChain::RuntimeLibType CSKYToolChain::GetDefaultRuntimeLibType() const {67return GCCInstallation.isValid() ? ToolChain::RLT_Libgcc68: ToolChain::RLT_CompilerRT;69}7071ToolChain::UnwindLibType72CSKYToolChain::GetUnwindLibType(const llvm::opt::ArgList &Args) const {73return ToolChain::UNW_None;74}7576void CSKYToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,77llvm::opt::ArgStringList &CC1Args,78Action::OffloadKind) const {79CC1Args.push_back("-nostdsysteminc");80}8182void CSKYToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,83ArgStringList &CC1Args) const {84if (DriverArgs.hasArg(options::OPT_nostdinc))85return;8687if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {88SmallString<128> Dir(computeSysRoot());89llvm::sys::path::append(Dir, "include");90addSystemInclude(DriverArgs, CC1Args, Dir.str());91SmallString<128> Dir2(computeSysRoot());92llvm::sys::path::append(Dir2, "sys-include");93addSystemInclude(DriverArgs, CC1Args, Dir2.str());94}95}9697void CSKYToolChain::addLibStdCxxIncludePaths(98const llvm::opt::ArgList &DriverArgs,99llvm::opt::ArgStringList &CC1Args) const {100const GCCVersion &Version = GCCInstallation.getVersion();101StringRef TripleStr = GCCInstallation.getTriple().str();102const Multilib &Multilib = GCCInstallation.getMultilib();103addLibStdCXXIncludePaths(computeSysRoot() + "/include/c++/" + Version.Text,104TripleStr, Multilib.includeSuffix(), DriverArgs,105CC1Args);106}107108std::string CSKYToolChain::computeSysRoot() const {109if (!getDriver().SysRoot.empty())110return getDriver().SysRoot;111112SmallString<128> SysRootDir;113if (GCCInstallation.isValid()) {114StringRef LibDir = GCCInstallation.getParentLibPath();115StringRef TripleStr = GCCInstallation.getTriple().str();116llvm::sys::path::append(SysRootDir, LibDir, "..", TripleStr);117} else {118// Use the triple as provided to the driver. Unlike the parsed triple119// this has not been normalized to always contain every field.120llvm::sys::path::append(SysRootDir, getDriver().Dir, "..",121getDriver().getTargetTriple());122}123124if (!llvm::sys::fs::exists(SysRootDir))125return std::string();126127return std::string(SysRootDir);128}129130void CSKY::Linker::ConstructJob(Compilation &C, const JobAction &JA,131const InputInfo &Output,132const InputInfoList &Inputs,133const ArgList &Args,134const char *LinkingOutput) const {135const ToolChain &ToolChain = getToolChain();136const Driver &D = ToolChain.getDriver();137ArgStringList CmdArgs;138139if (!D.SysRoot.empty())140CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));141142CmdArgs.push_back("-m");143CmdArgs.push_back("cskyelf");144145std::string Linker = getToolChain().GetLinkerPath();146147bool WantCRTs =148!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);149150const char *crtbegin, *crtend;151auto RuntimeLib = ToolChain.GetRuntimeLibType(Args);152if (RuntimeLib == ToolChain::RLT_Libgcc) {153crtbegin = "crtbegin.o";154crtend = "crtend.o";155} else {156assert(RuntimeLib == ToolChain::RLT_CompilerRT);157crtbegin = ToolChain.getCompilerRTArgString(Args, "crtbegin",158ToolChain::FT_Object);159crtend =160ToolChain.getCompilerRTArgString(Args, "crtend", ToolChain::FT_Object);161}162163if (WantCRTs) {164CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));165CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));166CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));167}168169Args.AddAllArgs(CmdArgs, options::OPT_L);170ToolChain.AddFilePathLibArgs(Args, CmdArgs);171Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,172options::OPT_t, options::OPT_r});173174AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);175176// TODO: add C++ includes and libs if compiling C++.177178if (!Args.hasArg(options::OPT_nostdlib) &&179!Args.hasArg(options::OPT_nodefaultlibs)) {180if (ToolChain.ShouldLinkCXXStdlib(Args))181ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);182CmdArgs.push_back("--start-group");183CmdArgs.push_back("-lc");184if (Args.hasArg(options::OPT_msim))185CmdArgs.push_back("-lsemi");186else187CmdArgs.push_back("-lnosys");188CmdArgs.push_back("--end-group");189AddRunTimeLibs(ToolChain, ToolChain.getDriver(), CmdArgs, Args);190}191192if (WantCRTs) {193CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));194CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));195}196197CmdArgs.push_back("-o");198CmdArgs.push_back(Output.getFilename());199C.addCommand(std::make_unique<Command>(200JA, *this, ResponseFileSupport::AtFileCurCP(), Args.MakeArgString(Linker),201CmdArgs, Inputs, Output));202}203// CSKY tools end.204205206