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

1

2

3

4

5

6

7

8

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

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

16

20using namespace clang;

22

26 const ArgList &Args,

27 const char *LinkingOutput) const {

29 ArgStringList CmdArgs;

30

32

33

34

36 CmdArgs.push_back("--32");

37

38 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);

39

40 CmdArgs.push_back("-o");

42

43 for (const auto &II : Inputs)

44 CmdArgs.push_back(II.getFilename());

45

47 C.addCommand(std::make_unique(JA, *this,

49 Exec, CmdArgs, Inputs, Output));

50}

51

55 const ArgList &Args,

56 const char *LinkingOutput) const {

57 const auto &ToolChain = static_cast<const DragonFly &>(getToolChain());

60 const bool Static = Args.hasArg(options::OPT_static);

61 const bool Shared = Args.hasArg(options::OPT_shared);

62 const bool Profiling = Args.hasArg(options::OPT_pg);

63 const bool Pie = Args.hasArg(options::OPT_pie);

64 ArgStringList CmdArgs;

65

66 if (D.SysRoot.empty())

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

68

69 CmdArgs.push_back("--eh-frame-hdr");

71 CmdArgs.push_back("-Bstatic");

72 } else {

73 if (Args.hasArg(options::OPT_rdynamic))

74 CmdArgs.push_back("-export-dynamic");

75 if (Shared)

76 CmdArgs.push_back("-shared");

77 else if (!Args.hasArg(options::OPT_r)) {

78 CmdArgs.push_back("-dynamic-linker");

79 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");

80 }

81 CmdArgs.push_back("--hash-style=gnu");

82 CmdArgs.push_back("--enable-new-dtags");

83 }

84

85

86

87 if (Arch == llvm::Triple::x86) {

88 CmdArgs.push_back("-m");

89 CmdArgs.push_back("elf_i386");

90 }

91

94 CmdArgs.push_back("-o");

96 }

97

98 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,

99 options::OPT_r)) {

100 const char *crt1 = nullptr;

101 const char *crtbegin = nullptr;

102 if (!Shared) {

103 if (Profiling)

104 crt1 = "gcrt1.o";

105 else {

106 if (Pie)

107 crt1 = "Scrt1.o";

108 else

109 crt1 = "crt1.o";

110 }

111 }

112

113 if (Shared || Pie)

114 crtbegin = "crtbeginS.o";

115 else

116 crtbegin = "crtbegin.o";

117

118 if (crt1)

122 }

123

124 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,

125 options::OPT_s, options::OPT_t});

127

129

130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,

131 options::OPT_r)) {

133 CmdArgs.push_back("-rpath");

134 CmdArgs.push_back("/usr/lib/gcc80");

135 }

136

137

138 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && Static;

140

141 if (D.CCCIsCXX()) {

144 CmdArgs.push_back("-lm");

145 }

146

147

148 Args.ClaimAllArgs(options::OPT_stdlib_EQ);

149

150

151

152

153

154 if (D.IsFlangMode() &&

155 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {

158 CmdArgs.push_back("-lm");

159 }

160

161 if (Args.hasArg(options::OPT_pthread))

162 CmdArgs.push_back("-lpthread");

163

164 if (!Args.hasArg(options::OPT_nolibc))

165 CmdArgs.push_back("-lc");

166

167 if (Static || Args.hasArg(options::OPT_static_libgcc)) {

168 CmdArgs.push_back("-lgcc");

169 CmdArgs.push_back("-lgcc_eh");

170 } else {

171 if (Args.hasArg(options::OPT_shared_libgcc)) {

172 CmdArgs.push_back("-lgcc_pic");

173 if (!Shared)

174 CmdArgs.push_back("-lgcc");

175 } else {

176 CmdArgs.push_back("-lgcc");

177 CmdArgs.push_back("--as-needed");

178 CmdArgs.push_back("-lgcc_pic");

179 CmdArgs.push_back("--no-as-needed");

180 }

181 }

182 }

183

184 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,

185 options::OPT_r)) {

186 const char *crtend = nullptr;

187 if (Shared || Pie)

188 crtend ="crtendS.o";

189 else

190 crtend = "crtend.o";

191

194 }

195

197

199 C.addCommand(std::make_unique(JA, *this,

201 Exec, CmdArgs, Inputs, Output));

202}

203

204

205

207 const ArgList &Args)

209

211

215}

216

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

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

221

222 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))

223 return;

224

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

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

229 }

230

231 if (DriverArgs.hasArg(options::OPT_nostdlibinc))

232 return;

233

235 concat(D.SysRoot, "/usr/include"));

236}

237

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

241 DriverArgs, CC1Args);

242}

243

246}

247

250}

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...

InputInfo - Wrapper for information about an input source.

const char * getFilename() const

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

static constexpr ResponseFileSupport AtFileCurCP()