| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,233 @@ | ||
| //===--- MSP430.cpp - MSP430 Helpers for Tools ------------------*- C++ -*-===// | ||
| // | ||
| // The LLVM Compiler Infrastructure | ||
| // | ||
| // This file is distributed under the University of Illinois Open Source | ||
| // License. See LICENSE.TXT for details. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #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 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(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), | ||
| CmdArgs, Inputs)); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,71 @@ | ||
| //===--- MSP430.h - MSP430-specific Tool Helpers ----------------*- C++ -*-===// | ||
| // | ||
| // The LLVM Compiler Infrastructure | ||
| // | ||
| // This file is distributed under the University of Illinois Open Source | ||
| // License. See LICENSE.TXT for details. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSP430_H | ||
| #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSP430_H | ||
|
|
||
| #include "Gnu.h" | ||
| #include "InputInfo.h" | ||
| #include "clang/Driver/Driver.h" | ||
| #include "clang/Driver/DriverDiagnostic.h" | ||
| #include "clang/Driver/Tool.h" | ||
| #include "clang/Driver/ToolChain.h" | ||
| #include "llvm/ADT/StringRef.h" | ||
| #include "llvm/Option/Option.h" | ||
|
|
||
| #include <string> | ||
| #include <vector> | ||
|
|
||
| namespace clang { | ||
| namespace driver { | ||
| namespace toolchains { | ||
|
|
||
| class LLVM_LIBRARY_VISIBILITY MSP430ToolChain : public Generic_ELF { | ||
| public: | ||
| MSP430ToolChain(const Driver &D, const llvm::Triple &Triple, | ||
| const llvm::opt::ArgList &Args); | ||
| void | ||
| AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| llvm::opt::ArgStringList &CC1Args) const override; | ||
| void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, | ||
| llvm::opt::ArgStringList &CC1Args, | ||
| Action::OffloadKind) const override; | ||
|
|
||
| protected: | ||
| Tool *buildLinker() const override; | ||
|
|
||
| private: | ||
| std::string computeSysRoot() const; | ||
| }; | ||
|
|
||
| } // end namespace toolchains | ||
|
|
||
| namespace tools { | ||
| namespace msp430 { | ||
|
|
||
| class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { | ||
| public: | ||
| Linker(const ToolChain &TC) | ||
| : GnuTool("MSP430::Linker", "msp430-elf-ld", TC) {} | ||
| bool hasIntegratedCPP() const override { return false; } | ||
| bool isLinkJob() const override { return true; } | ||
| void ConstructJob(Compilation &C, const JobAction &JA, | ||
| const InputInfo &Output, const InputInfoList &Inputs, | ||
| const llvm::opt::ArgList &TCArgs, | ||
| const char *LinkingOutput) const override; | ||
| }; | ||
|
|
||
| void getMSP430TargetFeatures(const Driver &D, const llvm::opt::ArgList &Args, | ||
| std::vector<llvm::StringRef> &Features); | ||
| } // end namespace msp430 | ||
| } // end namespace tools | ||
| } // end namespace driver | ||
| } // end namespace clang | ||
|
|
||
| #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MSP430_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| // Test that different values of -mhwmult pick correct | ||
| // MSP430 hwmult target-feature(s). | ||
|
|
||
| // RUN: %clang -### -target msp430 %s 2>&1 | FileCheck %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=auto 2>&1 | FileCheck %s | ||
| // CHECK-NOT: "-target-feature" "+hwmult16" | ||
| // CHECK-NOT: "-target-feature" "+hwmult32" | ||
| // CHECK-NOT: "-target-feature" "+hwmultf5" | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=none 2>&1 | FileCheck --check-prefix=CHECK-NONE %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=none -mmcu=msp430f147 2>&1 | FileCheck --check-prefix=CHECK-NONE %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=none -mmcu=msp430f4783 2>&1 | FileCheck --check-prefix=CHECK-NONE %s | ||
| // CHECK-NONE: "-target-feature" "-hwmult16" | ||
| // CHECK-NONE: "-target-feature" "-hwmult32" | ||
| // CHECK-NONE: "-target-feature" "-hwmultf5" | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=16bit 2>&1 | FileCheck --check-prefix=CHECK-16 %s | ||
| // CHECK-16: "-target-feature" "+hwmult16" | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=32bit 2>&1 | FileCheck --check-prefix=CHECK-32 %s | ||
| // CHECK-32: "-target-feature" "+hwmult32" | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=f5series 2>&1 | FileCheck --check-prefix=CHECK-F5 %s | ||
| // CHECK-F5: "-target-feature" "+hwmultf5" | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=rrr 2>&1 | FileCheck --check-prefix=INVL-ARG %s | ||
| // INVL-ARG: error: unsupported argument 'rrr' to option '-mhwmult=rrr' | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=auto 2>&1 | FileCheck --check-prefix=WRN-NODEV %s | ||
| // WRN-NODEV: warning: no MCU device specified, but '-mhwmult' is set to 'auto', | ||
| // assuming no hardware multiply. Use -mmcu to specify a MSP430 device, | ||
| // or -mhwmult to set hardware multiply type explicitly. | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=16bit -mmcu=msp430c111 2>&1 | FileCheck --check-prefix=WRN-UNSUP %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=32bit -mmcu=msp430c111 2>&1 | FileCheck --check-prefix=WRN-UNSUP %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=f5series -mmcu=msp430c111 2>&1 | FileCheck --check-prefix=WRN-UNSUP %s | ||
| // WRN-UNSUP: warning: the given MCU does not support hardware multiply, but -mhwmult is set to | ||
|
|
||
| // RUN: %clang -### -target msp430 %s -mhwmult=16bit -mmcu=msp430f4783 2>&1 | FileCheck --check-prefix=WRN-MISMCH %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=32bit -mmcu=msp430f147 2>&1 | FileCheck --check-prefix=WRN-MISMCH %s | ||
| // RUN: %clang -### -target msp430 %s -mhwmult=f5series -mmcu=msp430f4783 2>&1 | FileCheck --check-prefix=WRN-MISMCH %s | ||
| // WRN-MISMCH: warning: the given MCU supports {{.*}} hardware multiply, but -mhwmult is set to {{.*}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430c111 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-C111 %s | ||
|
|
||
| // MSP430-C111: clang{{.*}} "-cc1" {{.*}} "-D__MSP430C111__" | ||
| // MSP430-C111: msp430-elf-ld{{.*}} "-Tmsp430c111.ld" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430i2020 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-I2020 %s | ||
|
|
||
| // MSP430-I2020: clang{{.*}} "-cc1" {{.*}} "-D__MSP430i2020__" | ||
| // MSP430-I2020: msp430-elf-ld{{.*}} "-Tmsp430i2020.ld" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=not-a-mcu 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-UNSUP %s | ||
|
|
||
| // MSP430-UNSUP: error: the clang compiler does not support 'not-a-mcu' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| // A basic clang -cc1 command-line, and simple environment check. | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=CC1 %s | ||
| // CC1: clang{{.*}} "-cc1" "-triple" "msp430" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 \ | ||
| // RUN: --gcc-toolchain=%S/Inputs/basic_msp430_tree 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430 %s | ||
|
|
||
| // MSP430: "{{.*}}Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../bin/msp430-elf-ld" | ||
| // MSP430: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430" | ||
| // MSP430: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430" | ||
| // MSP430: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430/crt0.o" | ||
| // MSP430: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430/crtbegin.o" | ||
| // MSP430: "--start-group" "-lmul_none" "-lgcc" "-lc" "-lcrt" "-lnosys" "--end-group" | ||
| // MSP430: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430/crtend.o" | ||
| // MSP430: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430/crtn.o" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -nodefaultlibs \ | ||
| // RUN: --gcc-toolchain=%S/Inputs/basic_msp430_tree 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-NO-DFT-LIB %s | ||
|
|
||
| // MSP430-NO-DFT-LIB: "{{.*}}Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../bin/msp430-elf-ld" | ||
| // MSP430-NO-DFT-LIB: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430" | ||
| // MSP430-NO-DFT-LIB: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430" | ||
| // MSP430-NO-DFT-LIB: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430/crt0.o" | ||
| // MSP430-NO-DFT-LIB: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430/crtbegin.o" | ||
| // MSP430-NO-DFT-LIB: "--start-group" "-lmul_none" "-lgcc" "--end-group" | ||
| // MSP430-NO-DFT-LIB: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430/crtend.o" | ||
| // MSP430-NO-DFT-LIB: "{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430/crtn.o" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -nostartfiles \ | ||
| // RUN: --gcc-toolchain=%S/Inputs/basic_msp430_tree 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-NO-START %s | ||
|
|
||
| // MSP430-NO-START: "{{.*}}Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../bin/msp430-elf-ld" | ||
| // MSP430-NO-START: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430" | ||
| // MSP430-NO-START: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430" | ||
| // MSP430-NO-START: "--start-group" "-lmul_none" "-lgcc" "-lc" "-lcrt" "-lnosys" "--end-group" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -nostdlib \ | ||
| // RUN: --gcc-toolchain=%S/Inputs/basic_msp430_tree 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-NO-STD-LIB %s | ||
|
|
||
| // MSP430-NO-STD-LIB: "{{.*}}Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../bin/msp430-elf-ld" | ||
| // MSP430-NO-STD-LIB: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/430" | ||
| // MSP430-NO-STD-LIB: "-L{{.*}}/Inputs/basic_msp430_tree/lib/gcc/msp430-elf/7.3.1/../../../../msp430-elf/lib/430" | ||
| // MSP430-NO-STD-LIB: "--start-group" "-lmul_none" "-lgcc" "--end-group" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430f147 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-16BIT %s | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430f147 -mhwmult=auto 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-16BIT %s | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mhwmult=16bit 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-16BIT %s | ||
|
|
||
| // MSP430-HWMult-16BIT: "--start-group" "-lmul_16" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430f4783 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-32BIT %s | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mmcu=msp430f4783 -mhwmult=auto 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-32BIT %s | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mhwmult=32bit 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-32BIT %s | ||
|
|
||
| // MSP430-HWMult-32BIT: "--start-group" "-lmul_32" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mhwmult=f5series 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-F5 %s | ||
| // MSP430-HWMult-F5: "--start-group" "-lmul_f5" | ||
|
|
||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mhwmult=none 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-NONE %s | ||
| // RUN: %clang %s -### -no-canonical-prefixes -target msp430 -mhwmult=none -mmcu=msp430f4783 2>&1 \ | ||
| // RUN: | FileCheck -check-prefix=MSP430-HWMult-NONE %s | ||
|
|
||
| // MSP430-HWMult-NONE: "--start-group" "-lmul_none" |