XCore.cpp revision 360784
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-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include "XCore.h" 10#include "CommonArgs.h" 11#include "clang/Driver/Compilation.h" 12#include "clang/Driver/Driver.h" 13#include "clang/Driver/Options.h" 14#include "llvm/Option/ArgList.h" 15#include <cstdlib> // ::getenv 16 17using namespace clang::driver; 18using namespace clang::driver::toolchains; 19using namespace clang; 20using namespace llvm::opt; 21 22/// XCore Tools 23// 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, Exec, CmdArgs, Inputs)); 56} 57 58void tools::XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA, 59 const InputInfo &Output, 60 const InputInfoList &Inputs, 61 const ArgList &Args, 62 const char *LinkingOutput) const { 63 ArgStringList CmdArgs; 64 65 if (Output.isFilename()) { 66 CmdArgs.push_back("-o"); 67 CmdArgs.push_back(Output.getFilename()); 68 } else { 69 assert(Output.isNothing() && "Invalid output."); 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, Exec, CmdArgs, Inputs)); 84} 85 86/// XCore tool chain 87XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple, 88 const ArgList &Args) 89 : ToolChain(D, Triple, Args) { 90 // ProgramPaths are found via 'PATH' environment variable. 91} 92 93Tool *XCoreToolChain::buildAssembler() const { 94 return new tools::XCore::Assembler(*this); 95} 96 97Tool *XCoreToolChain::buildLinker() const { 98 return new tools::XCore::Linker(*this); 99} 100 101bool XCoreToolChain::isPICDefault() const { return false; } 102 103bool XCoreToolChain::isPIEDefault() const { return false; } 104 105bool XCoreToolChain::isPICDefaultForced() const { return false; } 106 107bool XCoreToolChain::SupportsProfiling() const { return false; } 108 109bool XCoreToolChain::hasBlocksRuntime() const { return false; } 110 111void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 112 ArgStringList &CC1Args) const { 113 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) || 114 DriverArgs.hasArg(options::OPT_nostdlibinc)) 115 return; 116 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) { 117 SmallVector<StringRef, 4> Dirs; 118 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'}; 119 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 120 ArrayRef<StringRef> DirVec(Dirs); 121 addSystemIncludes(DriverArgs, CC1Args, DirVec); 122 } 123} 124 125void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs, 126 ArgStringList &CC1Args, 127 Action::OffloadKind) const { 128 CC1Args.push_back("-nostdsysteminc"); 129} 130 131void XCoreToolChain::AddClangCXXStdlibIncludeArgs( 132 const ArgList &DriverArgs, ArgStringList &CC1Args) const { 133 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) || 134 DriverArgs.hasArg(options::OPT_nostdlibinc) || 135 DriverArgs.hasArg(options::OPT_nostdincxx)) 136 return; 137 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) { 138 SmallVector<StringRef, 4> Dirs; 139 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'}; 140 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 141 ArrayRef<StringRef> DirVec(Dirs); 142 addSystemIncludes(DriverArgs, CC1Args, DirVec); 143 } 144} 145 146void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args, 147 ArgStringList &CmdArgs) const { 148 // We don't output any lib args. This is handled by xcc. 149} 150