1 //===-- MipsLinux.cpp - Mips ToolChain Implementations ----------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 #include "Arch/Mips.h"
11 #include "CommonArgs.h"
12 #include "clang/Driver/Driver.h"
13 #include "clang/Driver/DriverDiagnostic.h"
14 #include "clang/Driver/Options.h"
15 #include "llvm/Option/ArgList.h"
16 #include "llvm/Support/FileSystem.h"
17 #include "llvm/Support/Path.h"
19 using namespace clang::driver
;
20 using namespace clang::driver::toolchains
;
21 using namespace clang
;
22 using namespace llvm::opt
;
25 MipsLLVMToolChain::MipsLLVMToolChain(const Driver
&D
,
26 const llvm::Triple
&Triple
,
28 : Linux(D
, Triple
, Args
) {
29 // Select the correct multilib according to the given arguments.
30 DetectedMultilibs Result
;
31 findMIPSMultilibs(D
, Triple
, "", Args
, Result
);
32 Multilibs
= Result
.Multilibs
;
33 SelectedMultilibs
= Result
.SelectedMultilibs
;
35 // Find out the library suffix based on the ABI.
36 LibSuffix
= tools::mips::getMipsABILibSuffix(Args
, Triple
);
37 getFilePaths().clear();
38 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix
);
41 void MipsLLVMToolChain::AddClangSystemIncludeArgs(
42 const ArgList
&DriverArgs
, ArgStringList
&CC1Args
) const {
43 if (DriverArgs
.hasArg(clang::driver::options::OPT_nostdinc
))
46 const Driver
&D
= getDriver();
48 if (!DriverArgs
.hasArg(options::OPT_nobuiltininc
)) {
49 SmallString
<128> P(D
.ResourceDir
);
50 llvm::sys::path::append(P
, "include");
51 addSystemInclude(DriverArgs
, CC1Args
, P
);
54 if (DriverArgs
.hasArg(options::OPT_nostdlibinc
))
57 const auto &Callback
= Multilibs
.includeDirsCallback();
59 for (const auto &Path
: Callback(SelectedMultilibs
.back()))
60 addExternCSystemIncludeIfExists(DriverArgs
, CC1Args
, D
.Dir
+ Path
);
64 Tool
*MipsLLVMToolChain::buildLinker() const {
65 return new tools::gnutools::Linker(*this);
68 std::string
MipsLLVMToolChain::computeSysRoot() const {
69 if (!getDriver().SysRoot
.empty())
70 return getDriver().SysRoot
+ SelectedMultilibs
.back().osSuffix();
72 const std::string
InstalledDir(getDriver().Dir
);
73 std::string SysRootPath
=
74 InstalledDir
+ "/../sysroot" + SelectedMultilibs
.back().osSuffix();
75 if (llvm::sys::fs::exists(SysRootPath
))
81 ToolChain::CXXStdlibType
82 MipsLLVMToolChain::GetCXXStdlibType(const ArgList
&Args
) const {
83 Arg
*A
= Args
.getLastArg(options::OPT_stdlib_EQ
);
85 StringRef Value
= A
->getValue();
86 if (Value
!= "libc++")
87 getDriver().Diag(clang::diag::err_drv_invalid_stdlib_name
)
88 << A
->getAsString(Args
);
91 return ToolChain::CST_Libcxx
;
94 void MipsLLVMToolChain::addLibCxxIncludePaths(
95 const llvm::opt::ArgList
&DriverArgs
,
96 llvm::opt::ArgStringList
&CC1Args
) const {
97 if (const auto &Callback
= Multilibs
.includeDirsCallback()) {
98 for (std::string Path
: Callback(SelectedMultilibs
.back())) {
99 Path
= getDriver().Dir
+ Path
+ "/c++/v1";
100 if (llvm::sys::fs::exists(Path
)) {
101 addSystemInclude(DriverArgs
, CC1Args
, Path
);
108 void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList
&Args
,
109 ArgStringList
&CmdArgs
) const {
110 assert((GetCXXStdlibType(Args
) == ToolChain::CST_Libcxx
) &&
111 "Only -lc++ (aka libxx) is supported in this toolchain.");
113 CmdArgs
.push_back("-lc++");
114 if (Args
.hasArg(options::OPT_fexperimental_library
))
115 CmdArgs
.push_back("-lc++experimental");
116 CmdArgs
.push_back("-lc++abi");
117 CmdArgs
.push_back("-lunwind");
120 std::string
MipsLLVMToolChain::getCompilerRT(const ArgList
&Args
,
122 FileType Type
) const {
123 SmallString
<128> Path(getDriver().ResourceDir
);
124 llvm::sys::path::append(Path
, SelectedMultilibs
.back().osSuffix(), "lib" + LibSuffix
,
128 case ToolChain::FT_Object
:
131 case ToolChain::FT_Static
:
134 case ToolChain::FT_Shared
:
138 llvm::sys::path::append(
139 Path
, Twine("libclang_rt." + Component
+ "-" + "mips" + Suffix
));
140 return std::string(Path
);