clang: lib/Driver/ToolChains/Solaris.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
12#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/Support/FileSystem.h"
22#include "llvm/Support/Path.h"
23
27using namespace clang;
29
33 const ArgList &Args,
34 const char *LinkingOutput) const {
35
37}
38
40
41 const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ);
43 return UseLinker == "bfd" || UseLinker == "gld";
44}
45
47 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static) ||
48 Args.hasArg(options::OPT_r))
49 return false;
50
51 return Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
53}
54
55
58 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
59 StringRef UseLinker = A->getValue();
60 if (!UseLinker.empty()) {
61 if (llvm::sys::path::is_absolute(UseLinker) &&
62 llvm::sys::fs::can_execute(UseLinker))
63 return std::string(UseLinker);
64
65
66 if (UseLinker == "bfd" || UseLinker == "gld")
67
68 return "/usr/gnu/bin/ld";
69
70
71 if (UseLinker != "ld")
73 << A->getAsString(Args);
74 }
75 }
76
77
79}
80
84 const ArgList &Args,
85 const char *LinkingOutput) const {
91 ArgStringList CmdArgs;
92
93
94 if (!LinkerIsGnuLd)
95 CmdArgs.push_back("-C");
96
97 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared,
98 options::OPT_r)) {
99 CmdArgs.push_back("-e");
100 CmdArgs.push_back("_start");
101 }
102
103 if (IsPIE) {
104 if (LinkerIsGnuLd) {
105 CmdArgs.push_back("-pie");
106 } else {
107 CmdArgs.push_back("-z");
108 CmdArgs.push_back("type=pie");
109 }
110 }
111
112 if (Args.hasArg(options::OPT_static)) {
113 CmdArgs.push_back("-Bstatic");
114 CmdArgs.push_back("-dn");
115 } else {
116 if (!Args.hasArg(options::OPT_r) && Args.hasArg(options::OPT_shared))
117 CmdArgs.push_back("-shared");
118
119
120
121 Args.ClaimAllArgs(options::OPT_pthread);
122 Args.ClaimAllArgs(options::OPT_pthreads);
123 }
124
125 if (LinkerIsGnuLd) {
126
127 switch (Arch) {
128 case llvm::Triple::x86:
129 CmdArgs.push_back("-m");
130 CmdArgs.push_back("elf_i386_sol2");
131 break;
132 case llvm::Triple::x86_64:
133 CmdArgs.push_back("-m");
134 CmdArgs.push_back("elf_x86_64_sol2");
135 break;
136 case llvm::Triple::sparc:
137 CmdArgs.push_back("-m");
138 CmdArgs.push_back("elf32_sparc_sol2");
139 break;
140 case llvm::Triple::sparcv9:
141 CmdArgs.push_back("-m");
142 CmdArgs.push_back("elf64_sparc_sol2");
143 break;
144 default:
145 break;
146 }
147
148 if (Args.hasArg(options::OPT_rdynamic))
149 CmdArgs.push_back("-export-dynamic");
150
151 CmdArgs.push_back("--eh-frame-hdr");
152 } else {
153
154 Args.ClaimAllArgs(options::OPT_rdynamic);
155 }
156
157 assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
159 CmdArgs.push_back("-o");
161 }
162
163 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
164 options::OPT_r)) {
165 if (!Args.hasArg(options::OPT_shared))
167
169
170 const Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi);
171 bool HaveAnsi = false;
173 if (Std) {
174 HaveAnsi = Std->getOption().matches(options::OPT_ansi);
175 if (!HaveAnsi)
177 }
178
179 const char *values_X = "values-Xa.o";
180
181 if (HaveAnsi || (LangStd && !LangStd->isGNUMode()))
182 values_X = "values-Xc.o";
184
185 const char *values_xpg = "values-xpg6.o";
186
188 values_xpg = "values-xpg4.o";
190
191 const char *crtbegin = nullptr;
192 if (Args.hasArg(options::OPT_shared) || IsPIE)
193 crtbegin = "crtbeginS.o";
194 else
195 crtbegin = "crtbegin.o";
197
199 }
200
202
203 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group});
204
207
208 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
209 options::OPT_r)) {
210
211 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
212 !Args.hasArg(options::OPT_static);
214
218 CmdArgs.push_back("-lm");
219 }
220
221 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
222
223
224
226 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
229 CmdArgs.push_back("-lm");
230 }
231 if (Args.hasArg(options::OPT_fstack_protector) ||
232 Args.hasArg(options::OPT_fstack_protector_strong) ||
233 Args.hasArg(options::OPT_fstack_protector_all)) {
234
235 CmdArgs.push_back("-lssp_nonshared");
236 CmdArgs.push_back("-lssp");
237 }
238
239
240 if (Arch == llvm::Triple::sparc) {
242 CmdArgs.push_back("-latomic");
244 }
245
247 CmdArgs.push_back("-lc");
248
250 if (NeedsSanitizerDeps) {
252
253
254
255
256 if (Arch == llvm::Triple::x86_64 &&
259 !LinkerIsGnuLd) {
260 CmdArgs.push_back("-z");
261 CmdArgs.push_back("relax=transtls");
262 }
263 }
264
266 CmdArgs.push_back("-z");
267 CmdArgs.push_back("now");
268 }
269 }
270
271 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
272 options::OPT_r)) {
273 const char *crtend = nullptr;
274 if (Args.hasArg(options::OPT_shared) || IsPIE)
275 crtend = "crtendS.o";
276 else
277 crtend = "crtend.o";
280 }
281
283
284 const char *Exec = Args.MakeArgString(getLinkerPath(Args));
286 Exec, CmdArgs, Inputs, Output));
287}
288
290 switch (Triple.getArch()) {
291 case llvm::Triple::x86:
292 case llvm::Triple::sparc:
293 default:
294 break;
295 case llvm::Triple::x86_64:
296 return "/amd64";
297 case llvm::Triple::sparcv9:
298 return "/sparcv9";
299 }
300 return "";
301}
302
303
304
306 const ArgList &Args)
308
310
314
315
319 Paths);
321 }
322
323
324
325 if (StringRef(D.Dir).starts_with(D.SysRoot))
327
328 addPathIfExists(D, D.SysRoot + "/usr/lib" + LibSuffix, Paths);
329}
330
332 const bool IsSparc = getTriple().getArch() == llvm::Triple::sparc;
333 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
335
336 if (IsSparc || IsX86) {
337 Res |= SanitizerKind::Address;
338 Res |= SanitizerKind::PointerCompare;
339 Res |= SanitizerKind::PointerSubtract;
340 }
341 Res |= SanitizerKind::SafeStack;
342 Res |= SanitizerKind::Vptr;
343 return Res;
344}
345
347
348 return llvm::StringSwitch<const char *>(getDriver().getPreferredLinker())
349 .Cases({"bfd", "gld"}, "/usr/gnu/bin/ld")
351}
352
356
358
360 ArgStringList &CC1Args) const {
362
363 if (DriverArgs.hasArg(options::OPT_nostdinc))
364 return;
365
366 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
367 addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
368
369 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
371 llvm::sys::path::append(P, "include");
373 }
374
375 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
376 return;
377
378
379 StringRef CIncludeDirs(C_INCLUDE_DIRS);
380 if (CIncludeDirs != "") {
382 CIncludeDirs.split(dirs, ":");
383 for (StringRef dir : dirs) {
384 StringRef Prefix =
385 llvm::sys::path::is_absolute(dir) ? "" : StringRef(D.SysRoot);
387 }
388 return;
389 }
390
391
395 if (Callback) {
396 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
398 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
399 }
400 }
401
403}
404
406 const llvm::opt::ArgList &DriverArgs,
407 llvm::opt::ArgStringList &CC1Args) const {
408
409
411 return;
412
413
414
415
420
421
424 CC1Args);
425}
static StringRef getSolarisLibSuffix(const llvm::Triple &Triple)
Definition Solaris.cpp:289
static bool getPIE(const ArgList &Args, const ToolChain &TC)
Definition Solaris.cpp:46
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...
DiagnosticBuilder Diag(unsigned DiagID) const
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
StringRef getPreferredLinker() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
std::function< std::vector< std::string >(const Multilib &M)> IncludeDirsFunc
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.
bool needsStatsRt() const
bool needsUbsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
SmallVector< InputInfo, 4 > InputInfoList
The JSON file list parser is used to communicate input to InstallAPI.
@ C
Languages that the frontend can parse and compile.
LangStandard - Information about the properties of a particular language standard.
static const LangStandard * getLangStandardForName(StringRef Name)
clang::Language getLanguage() const
Get the language that this standard describes.
bool isGNUMode() const
isGNUMode - Language includes GNU extensions.
bool isC99() const
isC99 - Language is a superset of C99.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.