clang: lib/Driver/ToolChains/RISCVToolchain.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

14#include "llvm/Option/ArgList.h"

15#include "llvm/Support/FileSystem.h"

16#include "llvm/Support/Path.h"

17#include "llvm/Support/raw_ostream.h"

18

22using namespace clang;

24

27 StringRef InstallPath,

30 for (const auto &Path : PathsCallback(Multilib))

32}

33

34

35

36

37

39 const llvm::opt::ArgList &Args) {

40 if (Args.getLastArg(options::OPT_gcc_toolchain))

41 return true;

42

44 llvm::sys::path::append(GCCDir, D.Dir, "..", D.getTargetTriple(),

45 "lib/crt0.o");

46 return llvm::sys::fs::exists(GCCDir);

47}

48

49

51 const ArgList &Args)

58

63

64

67 .str());

69 } else {

71 }

72 getFilePaths().push_back(computeSysRoot() + "/lib");

73}

74

77}

78

82}

83

87}

88

90 const llvm::opt::ArgList &Args) const {

92}

93

95 const llvm::opt::ArgList &DriverArgs,

96 llvm::opt::ArgStringList &CC1Args,

98 CC1Args.push_back("-nostdsysteminc");

99}

100

102 ArgStringList &CC1Args) const {

103 if (DriverArgs.hasArg(options::OPT_nostdinc))

104 return;

105

106 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {

108 llvm::sys::path::append(Dir, "include");

110 }

111

112 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {

114 llvm::sys::path::append(Dir, "include");

116 }

117}

118

120 const llvm::opt::ArgList &DriverArgs,

121 llvm::opt::ArgStringList &CC1Args) const {

127 CC1Args);

128}

129

130std::string RISCVToolChain::computeSysRoot() const {

131 if (getDriver().SysRoot.empty())

133

138 llvm::sys::path::append(SysRootDir, LibDir, "..", TripleStr);

139 } else {

140

141

142 llvm::sys::path::append(SysRootDir, getDriver().Dir, "..",

144 }

145

146 if (!llvm::sys::fs::exists(SysRootDir))

147 return std::string();

148

149 return std::string(SysRootDir);

150}

151

155 const ArgList &Args,

156 const char *LinkingOutput) const {

159 ArgStringList CmdArgs;

160

161 if (D.SysRoot.empty())

162 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));

163

164 if (Args.hasArg(options::OPT_mno_relax))

165 CmdArgs.push_back("--no-relax");

166

168 CmdArgs.push_back("-m");

169 if (IsRV64) {

170 CmdArgs.push_back("elf64lriscv");

171 } else {

172 CmdArgs.push_back("elf32lriscv");

173 }

174 CmdArgs.push_back("-X");

175

176 std::string Linker = getToolChain().GetLinkerPath();

177

178 bool WantCRTs =

179 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);

180

181 const char *crtbegin, *crtend;

184 crtbegin = "crtbegin.o";

185 crtend = "crtend.o";

186 } else {

192 }

193

194 if (WantCRTs) {

197 }

198

200

201 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});

202

204 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,

205 options::OPT_t, options::OPT_r});

206

207

208

209 if (!Args.hasArg(options::OPT_nostdlib) &&

210 !Args.hasArg(options::OPT_nodefaultlibs)) {

211 if (D.CCCIsCXX()) {

214 CmdArgs.push_back("-lm");

215 }

216 CmdArgs.push_back("--start-group");

217 CmdArgs.push_back("-lc");

218 CmdArgs.push_back("-lgloss");

219 CmdArgs.push_back("--end-group");

221 }

222

223 if (WantCRTs)

225

226 CmdArgs.push_back("-o");

228 C.addCommand(std::make_unique(

230 CmdArgs, Inputs, Output));

231}

232

Compilation - A set of tasks to perform for a single driver invocation.

Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...

std::string SysRoot

sysroot, if present

InputInfo - Wrapper for information about an input source.

const char * getFilename() const

See also MultilibSetBuilder for combining multilibs into a set.

const IncludeDirsFunc & filePathsCallback() const

This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.

const std::string & includeSuffix() const

Get the include directory suffix.

The JSON file list parser is used to communicate input to InstallAPI.

static constexpr ResponseFileSupport AtFileCurCP()