Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/Haiku.cpp
35266 views
//===--- Haiku.cpp - Haiku 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 "Haiku.h"9#include "CommonArgs.h"10#include "clang/Config/config.h"11#include "clang/Driver/Compilation.h"12#include "llvm/Support/Path.h"1314using namespace clang::driver;15using namespace clang::driver::tools;16using namespace clang::driver::toolchains;17using namespace clang;18using namespace llvm::opt;1920void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA,21const InputInfo &Output,22const InputInfoList &Inputs,23const ArgList &Args,24const char *LinkingOutput) const {25const auto &ToolChain = static_cast<const Haiku &>(getToolChain());26const Driver &D = ToolChain.getDriver();27const llvm::Triple &Triple = ToolChain.getTriple();28const bool Static = Args.hasArg(options::OPT_static);29const bool Shared = Args.hasArg(options::OPT_shared);30ArgStringList CmdArgs;3132// Silence warning for "clang -g foo.o -o foo"33Args.ClaimAllArgs(options::OPT_g_Group);34// and "clang -emit-llvm foo.o -o foo"35Args.ClaimAllArgs(options::OPT_emit_llvm);36// and for "clang -w foo.o -o foo". Other warning options are already37// handled somewhere else.38Args.ClaimAllArgs(options::OPT_w);3940// Silence warning for "clang -pie foo.o -o foo"41Args.ClaimAllArgs(options::OPT_pie);4243// -rdynamic is a no-op with Haiku. Claim argument to avoid warning.44Args.ClaimAllArgs(options::OPT_rdynamic);4546if (!D.SysRoot.empty())47CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));4849CmdArgs.push_back("--eh-frame-hdr");50if (Static) {51CmdArgs.push_back("-Bstatic");52} else {53if (Shared)54CmdArgs.push_back("-shared");55CmdArgs.push_back("--enable-new-dtags");56}5758CmdArgs.push_back("-shared");5960if (!Shared)61CmdArgs.push_back("--no-undefined");6263if (Triple.isRISCV64()) {64CmdArgs.push_back("-X");65if (Args.hasArg(options::OPT_mno_relax))66CmdArgs.push_back("--no-relax");67}6869assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");70if (Output.isFilename()) {71CmdArgs.push_back("-o");72CmdArgs.push_back(Output.getFilename());73}7475if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,76options::OPT_r)) {77CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));78CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbeginS.o")));79if (!Shared)80CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("start_dyn.o")));81CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("init_term_dyn.o")));82}8384Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,85options::OPT_s, options::OPT_t});86ToolChain.AddFilePathLibArgs(Args, CmdArgs);8788if (D.isUsingLTO()) {89assert(!Inputs.empty() && "Must have at least one input.");90// Find the first filename InputInfo object.91auto Input = llvm::find_if(92Inputs, [](const InputInfo &II) -> bool { return II.isFilename(); });93if (Input == Inputs.end())94// For a very rare case, all of the inputs to the linker are95// InputArg. If that happens, just use the first InputInfo.96Input = Inputs.begin();9798addLTOOptions(ToolChain, Args, CmdArgs, Output, *Input,99D.getLTOMode() == LTOK_Thin);100}101102addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);103AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);104105if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,106options::OPT_r)) {107// Use the static OpenMP runtime with -static-openmp108bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static;109addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);110111if (D.CCCIsCXX() && ToolChain.ShouldLinkCXXStdlib(Args))112ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);113114// Silence warnings when linking C code with a C++ '-stdlib' argument.115Args.ClaimAllArgs(options::OPT_stdlib_EQ);116117// Additional linker set-up and flags for Fortran. This is required in order118// to generate executables. As Fortran runtime depends on the C runtime,119// these dependencies need to be listed before the C runtime below (i.e.120// AddRunTimeLibs).121if (D.IsFlangMode()) {122addFortranRuntimeLibraryPath(ToolChain, Args, CmdArgs);123addFortranRuntimeLibs(ToolChain, Args, CmdArgs);124}125126CmdArgs.push_back("-lgcc");127128CmdArgs.push_back("--push-state");129CmdArgs.push_back("--as-needed");130CmdArgs.push_back("-lgcc_s");131CmdArgs.push_back("--no-as-needed");132CmdArgs.push_back("--pop-state");133134CmdArgs.push_back("-lroot");135136CmdArgs.push_back("-lgcc");137138CmdArgs.push_back("--push-state");139CmdArgs.push_back("--as-needed");140CmdArgs.push_back("-lgcc_s");141CmdArgs.push_back("--no-as-needed");142CmdArgs.push_back("--pop-state");143}144145// No need to do anything for pthreads. Claim argument to avoid warning.146Args.claimAllArgs(options::OPT_pthread, options::OPT_pthreads);147148if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,149options::OPT_r)) {150CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));151CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));152}153154ToolChain.addProfileRTLibs(Args, CmdArgs);155156const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());157C.addCommand(std::make_unique<Command>(JA, *this,158ResponseFileSupport::AtFileCurCP(),159Exec, CmdArgs, Inputs, Output));160}161162/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.163164Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)165: Generic_ELF(D, Triple, Args) {166167GCCInstallation.init(Triple, Args);168169getFilePaths().push_back(concat(getDriver().SysRoot, "/boot/system/lib"));170getFilePaths().push_back(concat(getDriver().SysRoot, "/boot/system/develop/lib"));171172if (GCCInstallation.isValid())173getFilePaths().push_back(GCCInstallation.getInstallPath().str());174}175176void Haiku::AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,177llvm::opt::ArgStringList &CC1Args) const {178const Driver &D = getDriver();179180if (DriverArgs.hasArg(options::OPT_nostdinc))181return;182183if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {184SmallString<128> Dir(D.ResourceDir);185llvm::sys::path::append(Dir, "include");186addSystemInclude(DriverArgs, CC1Args, Dir.str());187}188189if (DriverArgs.hasArg(options::OPT_nostdlibinc))190return;191192// Add dirs specified via 'configure --with-c-include-dirs'.193StringRef CIncludeDirs(C_INCLUDE_DIRS);194if (!CIncludeDirs.empty()) {195SmallVector<StringRef, 5> dirs;196CIncludeDirs.split(dirs, ":");197for (StringRef dir : dirs) {198StringRef Prefix =199llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";200addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);201}202return;203}204205addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,206"/boot/system/non-packaged/develop/headers"));207addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,208"/boot/system/develop/headers/os"));209addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,210"/boot/system/develop/headers/os/app"));211addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,212"/boot/system/develop/headers/os/device"));213addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,214"/boot/system/develop/headers/os/drivers"));215addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,216"/boot/system/develop/headers/os/game"));217addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,218"/boot/system/develop/headers/os/interface"));219addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,220"/boot/system/develop/headers/os/kernel"));221addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,222"/boot/system/develop/headers/os/locale"));223addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,224"/boot/system/develop/headers/os/mail"));225addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,226"/boot/system/develop/headers/os/media"));227addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,228"/boot/system/develop/headers/os/midi"));229addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,230"/boot/system/develop/headers/os/midi2"));231addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,232"/boot/system/develop/headers/os/net"));233addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,234"/boot/system/develop/headers/os/opengl"));235addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,236"/boot/system/develop/headers/os/storage"));237addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,238"/boot/system/develop/headers/os/support"));239addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,240"/boot/system/develop/headers/os/translation"));241addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,242"/boot/system/develop/headers/os/add-ons/graphics"));243addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,244"/boot/system/develop/headers/os/add-ons/input_server"));245addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,246"/boot/system/develop/headers/os/add-ons/mail_daemon"));247addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,248"/boot/system/develop/headers/os/add-ons/registrar"));249addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,250"/boot/system/develop/headers/os/add-ons/screen_saver"));251addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,252"/boot/system/develop/headers/os/add-ons/tracker"));253addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,254"/boot/system/develop/headers/os/be_apps/Deskbar"));255addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,256"/boot/system/develop/headers/os/be_apps/NetPositive"));257addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,258"/boot/system/develop/headers/os/be_apps/Tracker"));259addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,260"/boot/system/develop/headers/3rdparty"));261addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,262"/boot/system/develop/headers/bsd"));263addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,264"/boot/system/develop/headers/glibc"));265addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,266"/boot/system/develop/headers/gnu"));267addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,268"/boot/system/develop/headers/posix"));269addSystemInclude(DriverArgs, CC1Args, concat(D.SysRoot,270"/boot/system/develop/headers"));271}272273void Haiku::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,274llvm::opt::ArgStringList &CC1Args) const {275addSystemInclude(DriverArgs, CC1Args,276concat(getDriver().SysRoot, "/boot/system/develop/headers/c++/v1"));277}278279Tool *Haiku::buildLinker() const { return new tools::haiku::Linker(*this); }280281bool Haiku::HasNativeLLVMSupport() const { return true; }282283284