llvm::opt::ArgList;
22usingllvm::opt::ArgStringList;
27 const char*LinkingOutput)
const{
31ArgStringList CmdArgs;
34 switch(TC.getArch()) {
36llvm_unreachable(
"unsupported architecture");
37 casellvm::Triple::arm:
38 casellvm::Triple::thumb:
39 casellvm::Triple::aarch64:
41 casellvm::Triple::x86:
42CmdArgs.push_back(
"--32");
44 casellvm::Triple::x86_64:
45CmdArgs.push_back(
"--64");
49Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
51CmdArgs.push_back(
"-o");
54 for(
const auto&Input : Inputs)
55CmdArgs.push_back(Input.getFilename());
57 conststd::string
Assembler= TC.GetProgramPath(
"as");
61Exec, CmdArgs, Inputs, Output));
67 const char*LinkingOutput)
const{
70 constllvm::Triple &
T= TC.getTriple();
71 const Driver&
D= TC.getDriver();
73ArgStringList CmdArgs;
77Args.ClaimAllArgs(options::OPT_g_Group);
79Args.ClaimAllArgs(options::OPT_emit_llvm);
81Args.ClaimAllArgs(options::OPT_w);
84 if(!
D.SysRoot.empty())
85CmdArgs.push_back(Args.MakeArgString(
"--sysroot="+
D.SysRoot));
87 if(Args.hasArg(options::OPT_pie))
88CmdArgs.push_back(
"-pie");
89 if(Args.hasArg(options::OPT_rdynamic))
90CmdArgs.push_back(
"-export-dynamic");
91 if(Args.hasArg(options::OPT_s))
92CmdArgs.push_back(
"--strip-all");
94CmdArgs.push_back(
"-m");
95 switch(TC.getArch()) {
97 D.Diag(diag::err_target_unknown_triple) << TC.getEffectiveTriple().str();
99 casellvm::Triple::arm:
100 casellvm::Triple::thumb:
102CmdArgs.push_back(
"thumb2pe");
104 casellvm::Triple::aarch64:
105CmdArgs.push_back(
"arm64pe");
107 casellvm::Triple::x86:
108CmdArgs.push_back(
"i386pe");
109EntryPoint.append(
"_");
111 casellvm::Triple::x86_64:
112CmdArgs.push_back(
"i386pep");
116 if(Args.hasArg(options::OPT_shared)) {
117 switch(
T.getArch()) {
119llvm_unreachable(
"unsupported architecture");
120 casellvm::Triple::aarch64:
121 casellvm::Triple::arm:
122 casellvm::Triple::thumb:
123 casellvm::Triple::x86_64:
124EntryPoint.append(
"_DllMainCRTStartup");
126 casellvm::Triple::x86:
127EntryPoint.append(
"_DllMainCRTStartup@12");
131CmdArgs.push_back(
"-shared");
132CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic" 135CmdArgs.push_back(
"--enable-auto-image-base");
137CmdArgs.push_back(
"--entry");
138CmdArgs.push_back(Args.MakeArgString(EntryPoint));
140EntryPoint.append(
"mainCRTStartup");
142CmdArgs.push_back(Args.hasArg(options::OPT_static) ?
"-Bstatic" 145 if(!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
146CmdArgs.push_back(
"--entry");
147CmdArgs.push_back(Args.MakeArgString(EntryPoint));
154CmdArgs.push_back(
"--allow-multiple-definition");
156CmdArgs.push_back(
"-o");
159 if(Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
161llvm::sys::path::replace_extension(ImpLib,
".lib");
163CmdArgs.push_back(
"--out-implib");
164CmdArgs.push_back(Args.MakeArgString(ImpLib));
167Args.AddAllArgs(CmdArgs, options::OPT_L);
168TC.AddFilePathLibArgs(Args, CmdArgs);
171 if(TC.ShouldLinkCXXStdlib(Args)) {
172 boolStaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
173!Args.hasArg(options::OPT_static);
175CmdArgs.push_back(
"-Bstatic");
176TC.AddCXXStdlibLibArgs(Args, CmdArgs);
178CmdArgs.push_back(
"-Bdynamic");
181 if(!Args.hasArg(options::OPT_nostdlib)) {
182 if(!Args.hasArg(options::OPT_nodefaultlibs)) {
184CmdArgs.push_back(
"-lmsvcrt");
189 if(TC.getSanitizerArgs(Args).needsAsanRt()) {
191 if(Args.hasArg(options::OPT_shared)) {
192CmdArgs.push_back(TC.getCompilerRTArgString(Args,
"asan_dll_thunk"));
194 for(
const auto&Lib : {
"asan_dynamic",
"asan_dynamic_runtime_thunk"})
195CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
198CmdArgs.push_back(Args.MakeArgString(
"--undefined"));
199CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
200?
"___asan_seh_interceptor" 201:
"__asan_seh_interceptor"));
205Exec = Args.MakeArgString(TC.GetLinkerPath());
207 C.addCommand(std::make_unique<Command>(JA, *
this,
209Exec, CmdArgs, Inputs, Output));
213 constllvm::Triple &
T,
214 constllvm::opt::ArgList &Args)
225 return getArch() == llvm::Triple::x86_64;
229 return getArch() == llvm::Triple::x86_64;
233 return getArch() == llvm::Triple::x86_64;
238llvm::opt::ArgStringList &CC1Args)
const{
240 conststd::string &SysRoot =
D.SysRoot;
242 autoAddSystemAfterIncludes = [&]() {
243 for(
const auto&
P: DriverArgs.getAllArgValues(options::OPT_isystem_after))
247 if(DriverArgs.hasArg(options::OPT_nostdinc)) {
248AddSystemAfterIncludes();
253 if(!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
255llvm::sys::path::append(ResourceDir,
"include");
258AddSystemAfterIncludes();
264llvm::opt::ArgStringList &CC1Args)
const{
267 if(DriverArgs.hasArg(options::OPT_nostdinc) ||
268DriverArgs.hasArg(options::OPT_nostdincxx))
277llvm::opt::ArgStringList &CmdArgs)
const{
279CmdArgs.push_back(
"-lc++");
280 if(Args.hasArg(options::OPT_fexperimental_library))
281CmdArgs.push_back(
"-lc++experimental");
287Res |= SanitizerKind::Address;
288Res |= SanitizerKind::PointerCompare;
289Res |= SanitizerKind::PointerSubtract;
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
const FunctionProtoType * T
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4