157 lines · cpp
1//===--- XCore.cpp - XCore ToolChain Implementations ------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "XCore.h"10#include "clang/Driver/CommonArgs.h"11#include "clang/Driver/Compilation.h"12#include "clang/Driver/Driver.h"13#include "clang/Options/Options.h"14#include "llvm/Option/ArgList.h"15#include <cstdlib> // ::getenv16 17using namespace clang::driver;18using namespace clang::driver::toolchains;19using namespace clang;20using namespace llvm::opt;21 22/// XCore Tools23// We pass assemble and link construction to the xcc tool.24 25void tools::XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,26 const InputInfo &Output,27 const InputInfoList &Inputs,28 const ArgList &Args,29 const char *LinkingOutput) const {30 claimNoWarnArgs(Args);31 ArgStringList CmdArgs;32 33 CmdArgs.push_back("-o");34 CmdArgs.push_back(Output.getFilename());35 36 CmdArgs.push_back("-c");37 38 if (Args.hasArg(options::OPT_v))39 CmdArgs.push_back("-v");40 41 if (Arg *A = Args.getLastArg(options::OPT_g_Group))42 if (!A->getOption().matches(options::OPT_g0))43 CmdArgs.push_back("-g");44 45 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,46 false))47 CmdArgs.push_back("-fverbose-asm");48 49 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);50 51 for (const auto &II : Inputs)52 CmdArgs.push_back(II.getFilename());53 54 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));55 C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),56 Exec, CmdArgs, Inputs, Output));57}58 59void tools::XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,60 const InputInfo &Output,61 const InputInfoList &Inputs,62 const ArgList &Args,63 const char *LinkingOutput) const {64 ArgStringList CmdArgs;65 66 assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");67 if (Output.isFilename()) {68 CmdArgs.push_back("-o");69 CmdArgs.push_back(Output.getFilename());70 }71 72 if (Args.hasArg(options::OPT_v))73 CmdArgs.push_back("-v");74 75 // Pass -fexceptions through to the linker if it was present.76 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,77 false))78 CmdArgs.push_back("-fexceptions");79 80 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);81 82 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));83 C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),84 Exec, CmdArgs, Inputs, Output));85}86 87/// XCore tool chain88XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,89 const ArgList &Args)90 : ToolChain(D, Triple, Args) {91 // ProgramPaths are found via 'PATH' environment variable.92}93 94Tool *XCoreToolChain::buildAssembler() const {95 return new tools::XCore::Assembler(*this);96}97 98Tool *XCoreToolChain::buildLinker() const {99 return new tools::XCore::Linker(*this);100}101 102bool XCoreToolChain::isPICDefault() const { return false; }103 104bool XCoreToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {105 return false;106}107 108bool XCoreToolChain::isPICDefaultForced() const { return false; }109 110bool XCoreToolChain::SupportsProfiling() const { return false; }111 112bool XCoreToolChain::hasBlocksRuntime() const { return false; }113 114void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,115 ArgStringList &CC1Args) const {116 if (DriverArgs.hasArg(options::OPT_nostdinc) ||117 DriverArgs.hasArg(options::OPT_nostdlibinc))118 return;119 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {120 SmallVector<StringRef, 4> Dirs;121 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};122 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));123 ArrayRef<StringRef> DirVec(Dirs);124 addSystemIncludes(DriverArgs, CC1Args, DirVec);125 }126}127 128void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,129 ArgStringList &CC1Args,130 Action::OffloadKind) const {131 CC1Args.push_back("-nostdsysteminc");132 // Set `-fno-use-cxa-atexit` to default.133 if (!DriverArgs.hasFlag(options::OPT_fuse_cxa_atexit,134 options::OPT_fno_use_cxa_atexit, false))135 CC1Args.push_back("-fno-use-cxa-atexit");136}137 138void XCoreToolChain::AddClangCXXStdlibIncludeArgs(139 const ArgList &DriverArgs, ArgStringList &CC1Args) const {140 if (DriverArgs.hasArg(options::OPT_nostdinc) ||141 DriverArgs.hasArg(options::OPT_nostdlibinc) ||142 DriverArgs.hasArg(options::OPT_nostdincxx))143 return;144 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {145 SmallVector<StringRef, 4> Dirs;146 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};147 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));148 ArrayRef<StringRef> DirVec(Dirs);149 addSystemIncludes(DriverArgs, CC1Args, DirVec);150 }151}152 153void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,154 ArgStringList &CmdArgs) const {155 // We don't output any lib args. This is handled by xcc.156}157