003 File Manager
Current Path:
/usr/src/contrib/llvm-project/clang/lib/Driver/ToolChains
usr
/
src
/
contrib
/
llvm-project
/
clang
/
lib
/
Driver
/
ToolChains
/
📁
..
📄
AIX.cpp
(7.69 KB)
📄
AIX.h
(2.51 KB)
📄
AMDGPU.cpp
(21.42 KB)
📄
AMDGPU.h
(3.72 KB)
📄
AVR.cpp
(5.72 KB)
📄
AVR.h
(1.94 KB)
📄
Ananas.cpp
(5.21 KB)
📄
Ananas.h
(2.06 KB)
📁
Arch
📄
BareMetal.cpp
(6.4 KB)
📄
BareMetal.h
(2.96 KB)
📄
Clang.cpp
(270.02 KB)
📄
Clang.h
(7.82 KB)
📄
CloudABI.cpp
(5.05 KB)
📄
CloudABI.h
(2.3 KB)
📄
CommonArgs.cpp
(49.63 KB)
📄
CommonArgs.h
(5.95 KB)
📄
Contiki.cpp
(926 B)
📄
Contiki.h
(1.25 KB)
📄
CrossWindows.cpp
(9.44 KB)
📄
CrossWindows.h
(2.93 KB)
📄
Cuda.cpp
(36.52 KB)
📄
Cuda.h
(7.5 KB)
📄
Darwin.cpp
(103.49 KB)
📄
Darwin.h
(20.22 KB)
📄
DragonFly.cpp
(6.83 KB)
📄
DragonFly.h
(2.16 KB)
📄
Flang.cpp
(2.57 KB)
📄
Flang.h
(1.45 KB)
📄
FreeBSD.cpp
(15.99 KB)
📄
FreeBSD.h
(3.72 KB)
📄
Fuchsia.cpp
(12.4 KB)
📄
Fuchsia.h
(3.72 KB)
📄
Gnu.cpp
(118.91 KB)
📄
Gnu.h
(14.8 KB)
📄
HIP.cpp
(15.47 KB)
📄
HIP.h
(4.4 KB)
📄
Haiku.cpp
(1.28 KB)
📄
Haiku.h
(1.25 KB)
📄
Hexagon.cpp
(23.79 KB)
📄
Hexagon.h
(4.34 KB)
📄
Hurd.cpp
(7.1 KB)
📄
Hurd.h
(1.5 KB)
📄
InterfaceStubs.cpp
(2.63 KB)
📄
InterfaceStubs.h
(1.23 KB)
📄
Lanai.h
(1.31 KB)
📄
Linux.cpp
(32.88 KB)
📄
Linux.h
(2.69 KB)
📄
MSP430.cpp
(7.95 KB)
📄
MSP430.h
(2.45 KB)
📄
MSVC.cpp
(57.11 KB)
📄
MSVC.h
(6.12 KB)
📄
MSVCSetupApi.h
(19.2 KB)
📄
MinGW.cpp
(21.52 KB)
📄
MinGW.h
(3.8 KB)
📄
Minix.cpp
(3.98 KB)
📄
Minix.h
(2.05 KB)
📄
MipsLinux.cpp
(4.48 KB)
📄
MipsLinux.h
(1.98 KB)
📄
Myriad.cpp
(11.75 KB)
📄
Myriad.h
(3.73 KB)
📄
NaCl.cpp
(13.25 KB)
📄
NaCl.h
(3.01 KB)
📄
NetBSD.cpp
(16.56 KB)
📄
NetBSD.h
(2.97 KB)
📄
OpenBSD.cpp
(10.17 KB)
📄
OpenBSD.h
(3.31 KB)
📄
PPCLinux.cpp
(1.06 KB)
📄
PPCLinux.h
(1.05 KB)
📄
PS4CPU.cpp
(9.53 KB)
📄
PS4CPU.h
(3.68 KB)
📄
RISCVToolchain.cpp
(7.25 KB)
📄
RISCVToolchain.h
(2.28 KB)
📄
ROCm.h
(6.94 KB)
📄
Solaris.cpp
(10.41 KB)
📄
Solaris.h
(2.5 KB)
📄
TCE.cpp
(1.49 KB)
📄
TCE.h
(1.49 KB)
📄
VEToolchain.cpp
(4.09 KB)
📄
VEToolchain.h
(2.16 KB)
📄
WebAssembly.cpp
(13.53 KB)
📄
WebAssembly.h
(2.94 KB)
📄
XCore.cpp
(5.48 KB)
📄
XCore.h
(2.98 KB)
Editing: MSP430.cpp
//===--- MSP430.cpp - MSP430 Helpers for Tools ------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "MSP430.h" #include "CommonArgs.h" #include "Gnu.h" #include "InputInfo.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Multilib.h" #include "clang/Driver/Options.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" using namespace clang::driver; using namespace clang::driver::toolchains; using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; static bool isSupportedMCU(const StringRef MCU) { return llvm::StringSwitch<bool>(MCU) #define MSP430_MCU(NAME) .Case(NAME, true) #include "clang/Basic/MSP430Target.def" .Default(false); } static StringRef getSupportedHWMult(const Arg *MCU) { if (!MCU) return "none"; return llvm::StringSwitch<StringRef>(MCU->getValue()) #define MSP430_MCU_FEAT(NAME, HWMULT) .Case(NAME, HWMULT) #include "clang/Basic/MSP430Target.def" .Default("none"); } static StringRef getHWMultLib(const ArgList &Args) { StringRef HWMult = Args.getLastArgValue(options::OPT_mhwmult_EQ, "auto"); if (HWMult == "auto") { HWMult = getSupportedHWMult(Args.getLastArg(options::OPT_mmcu_EQ)); } return llvm::StringSwitch<StringRef>(HWMult) .Case("16bit", "-lmul_16") .Case("32bit", "-lmul_32") .Case("f5series", "-lmul_f5") .Default("-lmul_none"); } void msp430::getMSP430TargetFeatures(const Driver &D, const ArgList &Args, std::vector<StringRef> &Features) { const Arg *MCU = Args.getLastArg(options::OPT_mmcu_EQ); if (MCU && !isSupportedMCU(MCU->getValue())) { D.Diag(diag::err_drv_clang_unsupported) << MCU->getValue(); return; } const Arg *HWMultArg = Args.getLastArg(options::OPT_mhwmult_EQ); if (!MCU && !HWMultArg) return; StringRef HWMult = HWMultArg ? HWMultArg->getValue() : "auto"; StringRef SupportedHWMult = getSupportedHWMult(MCU); if (HWMult == "auto") { // 'auto' - deduce hw multiplier support based on mcu name provided. // If no mcu name is provided, assume no hw multiplier is supported. if (!MCU) D.Diag(clang::diag::warn_drv_msp430_hwmult_no_device); HWMult = SupportedHWMult; } if (HWMult == "none") { // 'none' - disable hw multiplier. Features.push_back("-hwmult16"); Features.push_back("-hwmult32"); Features.push_back("-hwmultf5"); return; } if (MCU && SupportedHWMult == "none") D.Diag(clang::diag::warn_drv_msp430_hwmult_unsupported) << HWMult; if (MCU && HWMult != SupportedHWMult) D.Diag(clang::diag::warn_drv_msp430_hwmult_mismatch) << SupportedHWMult << HWMult; if (HWMult == "16bit") { // '16bit' - for 16-bit only hw multiplier. Features.push_back("+hwmult16"); } else if (HWMult == "32bit") { // '32bit' - for 16/32-bit hw multiplier. Features.push_back("+hwmult32"); } else if (HWMult == "f5series") { // 'f5series' - for 16/32-bit hw multiplier supported by F5 series mcus. Features.push_back("+hwmultf5"); } else { D.Diag(clang::diag::err_drv_unsupported_option_argument) << HWMultArg->getAsString(Args) << HWMult; } } /// MSP430 Toolchain MSP430ToolChain::MSP430ToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : Generic_ELF(D, Triple, Args) { StringRef MultilibSuf = ""; GCCInstallation.init(Triple, Args); if (GCCInstallation.isValid()) { MultilibSuf = GCCInstallation.getMultilib().gccSuffix(); SmallString<128> GCCBinPath; llvm::sys::path::append(GCCBinPath, GCCInstallation.getParentLibPath(), "..", "bin"); addPathIfExists(D, GCCBinPath, getProgramPaths()); SmallString<128> GCCRtPath; llvm::sys::path::append(GCCRtPath, GCCInstallation.getInstallPath(), MultilibSuf); addPathIfExists(D, GCCRtPath, getFilePaths()); } SmallString<128> SysRootDir(computeSysRoot()); llvm::sys::path::append(SysRootDir, "lib", MultilibSuf); addPathIfExists(D, SysRootDir, getFilePaths()); } std::string MSP430ToolChain::computeSysRoot() const { if (!getDriver().SysRoot.empty()) return getDriver().SysRoot; SmallString<128> Dir; if (GCCInstallation.isValid()) llvm::sys::path::append(Dir, GCCInstallation.getParentLibPath(), "..", GCCInstallation.getTriple().str()); else llvm::sys::path::append(Dir, getDriver().Dir, "..", getTriple().str()); return std::string(Dir.str()); } void MSP430ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (DriverArgs.hasArg(options::OPT_nostdinc) || DriverArgs.hasArg(options::OPT_nostdlibinc)) return; SmallString<128> Dir(computeSysRoot()); llvm::sys::path::append(Dir, "include"); addSystemInclude(DriverArgs, CC1Args, Dir.str()); } void MSP430ToolChain::addClangTargetOptions(const ArgList &DriverArgs, ArgStringList &CC1Args, Action::OffloadKind) const { CC1Args.push_back("-nostdsysteminc"); const auto *MCUArg = DriverArgs.getLastArg(options::OPT_mmcu_EQ); if (!MCUArg) return; const StringRef MCU = MCUArg->getValue(); if (MCU.startswith("msp430i")) { // 'i' should be in lower case as it's defined in TI MSP430-GCC headers CC1Args.push_back(DriverArgs.MakeArgString( "-D__MSP430i" + MCU.drop_front(7).upper() + "__")); } else { CC1Args.push_back(DriverArgs.MakeArgString("-D__" + MCU.upper() + "__")); } } Tool *MSP430ToolChain::buildLinker() const { return new tools::msp430::Linker(*this); } void msp430::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { const ToolChain &ToolChain = getToolChain(); const Driver &D = ToolChain.getDriver(); std::string Linker = ToolChain.GetProgramPath(getShortName()); ArgStringList CmdArgs; if (!D.SysRoot.empty()) CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); Args.AddAllArgs(CmdArgs, options::OPT_L); ToolChain.AddFilePathLibArgs(Args, CmdArgs); if (!Args.hasArg(options::OPT_T)) { if (const Arg *MCUArg = Args.getLastArg(options::OPT_mmcu_EQ)) CmdArgs.push_back( Args.MakeArgString("-T" + StringRef(MCUArg->getValue()) + ".ld")); } else { Args.AddAllArgs(CmdArgs, options::OPT_T); } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); } AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); CmdArgs.push_back("--start-group"); CmdArgs.push_back(Args.MakeArgString(getHWMultLib(Args))); CmdArgs.push_back("-lgcc"); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { CmdArgs.push_back("-lc"); CmdArgs.push_back("-lcrt"); CmdArgs.push_back("-lnosys"); } CmdArgs.push_back("--end-group"); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); } CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); C.addCommand( std::make_unique<Command>(JA, *this, ResponseFileSupport::AtFileCurCP(), Args.MakeArgString(Linker), CmdArgs, Inputs)); }
Upload File
Create Folder