annotate clang/lib/Driver/ToolChains/Fuchsia.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- Fuchsia.cpp - Fuchsia ToolChain Implementations --------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "Fuchsia.h"
anatofuz
parents:
diff changeset
10 #include "CommonArgs.h"
anatofuz
parents:
diff changeset
11 #include "clang/Config/config.h"
anatofuz
parents:
diff changeset
12 #include "clang/Driver/Compilation.h"
anatofuz
parents:
diff changeset
13 #include "clang/Driver/Driver.h"
anatofuz
parents:
diff changeset
14 #include "clang/Driver/DriverDiagnostic.h"
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
15 #include "clang/Driver/MultilibBuilder.h"
150
anatofuz
parents:
diff changeset
16 #include "clang/Driver/Options.h"
anatofuz
parents:
diff changeset
17 #include "clang/Driver/SanitizerArgs.h"
anatofuz
parents:
diff changeset
18 #include "llvm/Option/ArgList.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
19 #include "llvm/ProfileData/InstrProf.h"
150
anatofuz
parents:
diff changeset
20 #include "llvm/Support/FileSystem.h"
anatofuz
parents:
diff changeset
21 #include "llvm/Support/Path.h"
anatofuz
parents:
diff changeset
22 #include "llvm/Support/VirtualFileSystem.h"
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 using namespace clang::driver;
anatofuz
parents:
diff changeset
25 using namespace clang::driver::toolchains;
anatofuz
parents:
diff changeset
26 using namespace clang::driver::tools;
anatofuz
parents:
diff changeset
27 using namespace clang;
anatofuz
parents:
diff changeset
28 using namespace llvm::opt;
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 using tools::addMultilibFlag;
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA,
anatofuz
parents:
diff changeset
33 const InputInfo &Output,
anatofuz
parents:
diff changeset
34 const InputInfoList &Inputs,
anatofuz
parents:
diff changeset
35 const ArgList &Args,
anatofuz
parents:
diff changeset
36 const char *LinkingOutput) const {
anatofuz
parents:
diff changeset
37 const toolchains::Fuchsia &ToolChain =
anatofuz
parents:
diff changeset
38 static_cast<const toolchains::Fuchsia &>(getToolChain());
anatofuz
parents:
diff changeset
39 const Driver &D = ToolChain.getDriver();
anatofuz
parents:
diff changeset
40
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
41 const llvm::Triple &Triple = ToolChain.getEffectiveTriple();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
42
150
anatofuz
parents:
diff changeset
43 ArgStringList CmdArgs;
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 // Silence warning for "clang -g foo.o -o foo"
anatofuz
parents:
diff changeset
46 Args.ClaimAllArgs(options::OPT_g_Group);
anatofuz
parents:
diff changeset
47 // and "clang -emit-llvm foo.o -o foo"
anatofuz
parents:
diff changeset
48 Args.ClaimAllArgs(options::OPT_emit_llvm);
anatofuz
parents:
diff changeset
49 // and for "clang -w foo.o -o foo". Other warning options are already
anatofuz
parents:
diff changeset
50 // handled somewhere else.
anatofuz
parents:
diff changeset
51 Args.ClaimAllArgs(options::OPT_w);
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 CmdArgs.push_back("-z");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
54 CmdArgs.push_back("max-page-size=4096");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
55
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
56 CmdArgs.push_back("-z");
150
anatofuz
parents:
diff changeset
57 CmdArgs.push_back("now");
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
60 if (llvm::sys::path::filename(Exec).equals_insensitive("ld.lld") ||
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
61 llvm::sys::path::stem(Exec).equals_insensitive("ld.lld")) {
150
anatofuz
parents:
diff changeset
62 CmdArgs.push_back("-z");
anatofuz
parents:
diff changeset
63 CmdArgs.push_back("rodynamic");
anatofuz
parents:
diff changeset
64 CmdArgs.push_back("-z");
anatofuz
parents:
diff changeset
65 CmdArgs.push_back("separate-loadable-segments");
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
66 CmdArgs.push_back("-z");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
67 CmdArgs.push_back("rel");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
68 CmdArgs.push_back("--pack-dyn-relocs=relr");
150
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 if (!D.SysRoot.empty())
anatofuz
parents:
diff changeset
72 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_r))
anatofuz
parents:
diff changeset
75 CmdArgs.push_back("-pie");
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 if (Args.hasArg(options::OPT_rdynamic))
anatofuz
parents:
diff changeset
78 CmdArgs.push_back("-export-dynamic");
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 if (Args.hasArg(options::OPT_s))
anatofuz
parents:
diff changeset
81 CmdArgs.push_back("-s");
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 if (Args.hasArg(options::OPT_r)) {
anatofuz
parents:
diff changeset
84 CmdArgs.push_back("-r");
anatofuz
parents:
diff changeset
85 } else {
anatofuz
parents:
diff changeset
86 CmdArgs.push_back("--build-id");
anatofuz
parents:
diff changeset
87 CmdArgs.push_back("--hash-style=gnu");
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
90 if (ToolChain.getArch() == llvm::Triple::aarch64) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
91 CmdArgs.push_back("--execute-only");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
92
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
93 std::string CPU = getCPUName(D, Args, Triple);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
94 if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
95 CmdArgs.push_back("--fix-cortex-a53-843419");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
96 }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
97
150
anatofuz
parents:
diff changeset
98 CmdArgs.push_back("--eh-frame-hdr");
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 if (Args.hasArg(options::OPT_static))
anatofuz
parents:
diff changeset
101 CmdArgs.push_back("-Bstatic");
anatofuz
parents:
diff changeset
102 else if (Args.hasArg(options::OPT_shared))
anatofuz
parents:
diff changeset
103 CmdArgs.push_back("-shared");
anatofuz
parents:
diff changeset
104
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
105 const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
150
anatofuz
parents:
diff changeset
106
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
107 if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_r)) {
150
anatofuz
parents:
diff changeset
108 std::string Dyld = D.DyldPrefix;
anatofuz
parents:
diff changeset
109 if (SanArgs.needsAsanRt() && SanArgs.needsSharedRt())
anatofuz
parents:
diff changeset
110 Dyld += "asan/";
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
111 if (SanArgs.needsHwasanRt() && SanArgs.needsSharedRt())
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
112 Dyld += "hwasan/";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
113 if (SanArgs.needsTsanRt() && SanArgs.needsSharedRt())
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
114 Dyld += "tsan/";
150
anatofuz
parents:
diff changeset
115 Dyld += "ld.so.1";
anatofuz
parents:
diff changeset
116 CmdArgs.push_back("-dynamic-linker");
anatofuz
parents:
diff changeset
117 CmdArgs.push_back(Args.MakeArgString(Dyld));
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
120 if (ToolChain.getArch() == llvm::Triple::riscv64)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
121 CmdArgs.push_back("-X");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
122
150
anatofuz
parents:
diff changeset
123 CmdArgs.push_back("-o");
anatofuz
parents:
diff changeset
124 CmdArgs.push_back(Output.getFilename());
anatofuz
parents:
diff changeset
125
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
126 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
127 options::OPT_r)) {
150
anatofuz
parents:
diff changeset
128 if (!Args.hasArg(options::OPT_shared)) {
anatofuz
parents:
diff changeset
129 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131 }
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 Args.AddAllArgs(CmdArgs, options::OPT_L);
anatofuz
parents:
diff changeset
134 Args.AddAllArgs(CmdArgs, options::OPT_u);
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 if (D.isUsingLTO()) {
anatofuz
parents:
diff changeset
139 assert(!Inputs.empty() && "Must have at least one input.");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140 addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs[0],
150
anatofuz
parents:
diff changeset
141 D.getLTOMode() == LTOK_Thin);
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
144 addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
150
anatofuz
parents:
diff changeset
145 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
anatofuz
parents:
diff changeset
146
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
147 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
148 options::OPT_r)) {
150
anatofuz
parents:
diff changeset
149 if (Args.hasArg(options::OPT_static))
anatofuz
parents:
diff changeset
150 CmdArgs.push_back("-Bdynamic");
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 if (D.CCCIsCXX()) {
anatofuz
parents:
diff changeset
153 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
anatofuz
parents:
diff changeset
154 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
anatofuz
parents:
diff changeset
155 !Args.hasArg(options::OPT_static);
anatofuz
parents:
diff changeset
156 CmdArgs.push_back("--push-state");
anatofuz
parents:
diff changeset
157 CmdArgs.push_back("--as-needed");
anatofuz
parents:
diff changeset
158 if (OnlyLibstdcxxStatic)
anatofuz
parents:
diff changeset
159 CmdArgs.push_back("-Bstatic");
anatofuz
parents:
diff changeset
160 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
anatofuz
parents:
diff changeset
161 if (OnlyLibstdcxxStatic)
anatofuz
parents:
diff changeset
162 CmdArgs.push_back("-Bdynamic");
anatofuz
parents:
diff changeset
163 CmdArgs.push_back("-lm");
anatofuz
parents:
diff changeset
164 CmdArgs.push_back("--pop-state");
anatofuz
parents:
diff changeset
165 }
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
168 // Note that Fuchsia never needs to link in sanitizer runtime deps. Any
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
169 // sanitizer runtimes with system dependencies use the `.deplibs` feature
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
170 // instead.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
171 addSanitizerRuntimes(ToolChain, Args, CmdArgs);
150
anatofuz
parents:
diff changeset
172
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
173 addXRayRuntime(ToolChain, Args, CmdArgs);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
174
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
175 ToolChain.addProfileRTLibs(Args, CmdArgs);
150
anatofuz
parents:
diff changeset
176
anatofuz
parents:
diff changeset
177 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 if (Args.hasArg(options::OPT_pthread) ||
anatofuz
parents:
diff changeset
180 Args.hasArg(options::OPT_pthreads))
anatofuz
parents:
diff changeset
181 CmdArgs.push_back("-lpthread");
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 if (Args.hasArg(options::OPT_fsplit_stack))
anatofuz
parents:
diff changeset
184 CmdArgs.push_back("--wrap=pthread_create");
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 if (!Args.hasArg(options::OPT_nolibc))
anatofuz
parents:
diff changeset
187 CmdArgs.push_back("-lc");
anatofuz
parents:
diff changeset
188 }
anatofuz
parents:
diff changeset
189
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
190 C.addCommand(std::make_unique<Command>(JA, *this,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
191 ResponseFileSupport::AtFileCurCP(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
192 Exec, CmdArgs, Inputs, Output));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
193 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
194
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
195 void fuchsia::StaticLibTool::ConstructJob(Compilation &C, const JobAction &JA,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
196 const InputInfo &Output,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
197 const InputInfoList &Inputs,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
198 const ArgList &Args,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
199 const char *LinkingOutput) const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
200 const Driver &D = getToolChain().getDriver();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
201
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
202 // Silence warning for "clang -g foo.o -o foo"
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
203 Args.ClaimAllArgs(options::OPT_g_Group);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
204 // and "clang -emit-llvm foo.o -o foo"
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
205 Args.ClaimAllArgs(options::OPT_emit_llvm);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
206 // and for "clang -w foo.o -o foo". Other warning options are already
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
207 // handled somewhere else.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
208 Args.ClaimAllArgs(options::OPT_w);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
209 // Silence warnings when linking C code with a C++ '-stdlib' argument.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
210 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
211
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
212 // ar tool command "llvm-ar <options> <output_file> <input_files>".
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
213 ArgStringList CmdArgs;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
214 // Create and insert file members with a deterministic index.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
215 CmdArgs.push_back("rcsD");
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
216 CmdArgs.push_back(Output.getFilename());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
217
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
218 for (const auto &II : Inputs) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
219 if (II.isFilename()) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
220 CmdArgs.push_back(II.getFilename());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
221 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
222 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
223
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
224 // Delete old output archive file if it already exists before generating a new
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
225 // archive file.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
226 const char *OutputFileName = Output.getFilename();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
227 if (Output.isFilename() && llvm::sys::fs::exists(OutputFileName)) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
228 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
229 D.Diag(diag::err_drv_unable_to_remove_file) << EC.message();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
230 return;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
231 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
232 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
233
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
234 const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
235 C.addCommand(std::make_unique<Command>(JA, *this,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
236 ResponseFileSupport::AtFileCurCP(),
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
237 Exec, CmdArgs, Inputs, Output));
150
anatofuz
parents:
diff changeset
238 }
anatofuz
parents:
diff changeset
239
anatofuz
parents:
diff changeset
240 /// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly.
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
243 const ArgList &Args)
anatofuz
parents:
diff changeset
244 : ToolChain(D, Triple, Args) {
anatofuz
parents:
diff changeset
245 getProgramPaths().push_back(getDriver().getInstalledDir());
anatofuz
parents:
diff changeset
246 if (getDriver().getInstalledDir() != D.Dir)
anatofuz
parents:
diff changeset
247 getProgramPaths().push_back(D.Dir);
anatofuz
parents:
diff changeset
248
anatofuz
parents:
diff changeset
249 if (!D.SysRoot.empty()) {
anatofuz
parents:
diff changeset
250 SmallString<128> P(D.SysRoot);
anatofuz
parents:
diff changeset
251 llvm::sys::path::append(P, "lib");
anatofuz
parents:
diff changeset
252 getFilePaths().push_back(std::string(P.str()));
anatofuz
parents:
diff changeset
253 }
anatofuz
parents:
diff changeset
254
anatofuz
parents:
diff changeset
255 auto FilePaths = [&](const Multilib &M) -> std::vector<std::string> {
anatofuz
parents:
diff changeset
256 std::vector<std::string> FP;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
257 for (const std::string &Path : getStdlibPaths()) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
258 SmallString<128> P(Path);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
259 llvm::sys::path::append(P, M.gccSuffix());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
260 FP.push_back(std::string(P.str()));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
261 }
150
anatofuz
parents:
diff changeset
262 return FP;
anatofuz
parents:
diff changeset
263 };
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 Multilibs.push_back(Multilib());
anatofuz
parents:
diff changeset
266 // Use the noexcept variant with -fno-exceptions to avoid the extra overhead.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
267 Multilibs.push_back(MultilibBuilder("noexcept", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
268 .flag("-fexceptions", /*Disallow=*/true)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
269 .flag("-fno-exceptions")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
270 .makeMultilib());
150
anatofuz
parents:
diff changeset
271 // ASan has higher priority because we always want the instrumentated version.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
272 Multilibs.push_back(MultilibBuilder("asan", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
273 .flag("-fsanitize=address")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
274 .makeMultilib());
150
anatofuz
parents:
diff changeset
275 // Use the asan+noexcept variant with ASan and -fno-exceptions.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
276 Multilibs.push_back(MultilibBuilder("asan+noexcept", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
277 .flag("-fsanitize=address")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
278 .flag("-fexceptions", /*Disallow=*/true)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
279 .flag("-fno-exceptions")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
280 .makeMultilib());
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
281 // HWASan has higher priority because we always want the instrumentated
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
282 // version.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
283 Multilibs.push_back(MultilibBuilder("hwasan", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
284 .flag("-fsanitize=hwaddress")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
285 .makeMultilib());
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
286 // Use the hwasan+noexcept variant with HWASan and -fno-exceptions.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
287 Multilibs.push_back(MultilibBuilder("hwasan+noexcept", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
288 .flag("-fsanitize=hwaddress")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
289 .flag("-fexceptions", /*Disallow=*/true)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
290 .flag("-fno-exceptions")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
291 .makeMultilib());
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
292 // Use Itanium C++ ABI for the compat multilib.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
293 Multilibs.push_back(MultilibBuilder("compat", {}, {})
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
294 .flag("-fc++-abi=itanium")
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
295 .makeMultilib());
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
296
150
anatofuz
parents:
diff changeset
297 Multilibs.FilterOut([&](const Multilib &M) {
anatofuz
parents:
diff changeset
298 std::vector<std::string> RD = FilePaths(M);
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
299 return llvm::all_of(RD, [&](std::string P) { return !getVFS().exists(P); });
150
anatofuz
parents:
diff changeset
300 });
anatofuz
parents:
diff changeset
301
anatofuz
parents:
diff changeset
302 Multilib::flags_list Flags;
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
303 bool Exceptions =
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
304 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
305 addMultilibFlag(Exceptions, "-fexceptions", Flags);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
306 addMultilibFlag(!Exceptions, "-fno-exceptions", Flags);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
307 addMultilibFlag(getSanitizerArgs(Args).needsAsanRt(), "-fsanitize=address",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
308 Flags);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
309 addMultilibFlag(getSanitizerArgs(Args).needsHwasanRt(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
310 "-fsanitize=hwaddress", Flags);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
311
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
312 addMultilibFlag(Args.getLastArgValue(options::OPT_fcxx_abi_EQ) == "itanium",
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
313 "-fc++-abi=itanium", Flags);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
314
150
anatofuz
parents:
diff changeset
315 Multilibs.setFilePathsCallback(FilePaths);
anatofuz
parents:
diff changeset
316
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
317 if (Multilibs.select(Flags, SelectedMultilibs)) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
318 // Ensure that -print-multi-directory only outputs one multilib directory.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
319 Multilib LastSelected = SelectedMultilibs.back();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
320 SelectedMultilibs = {LastSelected};
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
321
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
322 if (!SelectedMultilibs.back().isDefault())
150
anatofuz
parents:
diff changeset
323 if (const auto &PathsCallback = Multilibs.filePathsCallback())
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
324 for (const auto &Path : PathsCallback(SelectedMultilibs.back()))
150
anatofuz
parents:
diff changeset
325 // Prepend the multilib path to ensure it takes the precedence.
anatofuz
parents:
diff changeset
326 getFilePaths().insert(getFilePaths().begin(), Path);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
327 }
150
anatofuz
parents:
diff changeset
328 }
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args,
anatofuz
parents:
diff changeset
331 types::ID InputType) const {
anatofuz
parents:
diff changeset
332 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
anatofuz
parents:
diff changeset
333 return Triple.str();
anatofuz
parents:
diff changeset
334 }
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 Tool *Fuchsia::buildLinker() const {
anatofuz
parents:
diff changeset
337 return new tools::fuchsia::Linker(*this);
anatofuz
parents:
diff changeset
338 }
anatofuz
parents:
diff changeset
339
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
340 Tool *Fuchsia::buildStaticLibTool() const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
341 return new tools::fuchsia::StaticLibTool(*this);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
342 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
343
150
anatofuz
parents:
diff changeset
344 ToolChain::RuntimeLibType Fuchsia::GetRuntimeLibType(
anatofuz
parents:
diff changeset
345 const ArgList &Args) const {
anatofuz
parents:
diff changeset
346 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_rtlib_EQ)) {
anatofuz
parents:
diff changeset
347 StringRef Value = A->getValue();
anatofuz
parents:
diff changeset
348 if (Value != "compiler-rt")
anatofuz
parents:
diff changeset
349 getDriver().Diag(clang::diag::err_drv_invalid_rtlib_name)
anatofuz
parents:
diff changeset
350 << A->getAsString(Args);
anatofuz
parents:
diff changeset
351 }
anatofuz
parents:
diff changeset
352
anatofuz
parents:
diff changeset
353 return ToolChain::RLT_CompilerRT;
anatofuz
parents:
diff changeset
354 }
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 ToolChain::CXXStdlibType
anatofuz
parents:
diff changeset
357 Fuchsia::GetCXXStdlibType(const ArgList &Args) const {
anatofuz
parents:
diff changeset
358 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
anatofuz
parents:
diff changeset
359 StringRef Value = A->getValue();
anatofuz
parents:
diff changeset
360 if (Value != "libc++")
anatofuz
parents:
diff changeset
361 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
anatofuz
parents:
diff changeset
362 << A->getAsString(Args);
anatofuz
parents:
diff changeset
363 }
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 return ToolChain::CST_Libcxx;
anatofuz
parents:
diff changeset
366 }
anatofuz
parents:
diff changeset
367
anatofuz
parents:
diff changeset
368 void Fuchsia::addClangTargetOptions(const ArgList &DriverArgs,
anatofuz
parents:
diff changeset
369 ArgStringList &CC1Args,
anatofuz
parents:
diff changeset
370 Action::OffloadKind) const {
anatofuz
parents:
diff changeset
371 if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
anatofuz
parents:
diff changeset
372 options::OPT_fno_use_init_array, true))
anatofuz
parents:
diff changeset
373 CC1Args.push_back("-fno-use-init-array");
anatofuz
parents:
diff changeset
374 }
anatofuz
parents:
diff changeset
375
anatofuz
parents:
diff changeset
376 void Fuchsia::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
anatofuz
parents:
diff changeset
377 ArgStringList &CC1Args) const {
anatofuz
parents:
diff changeset
378 const Driver &D = getDriver();
anatofuz
parents:
diff changeset
379
anatofuz
parents:
diff changeset
380 if (DriverArgs.hasArg(options::OPT_nostdinc))
anatofuz
parents:
diff changeset
381 return;
anatofuz
parents:
diff changeset
382
anatofuz
parents:
diff changeset
383 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
anatofuz
parents:
diff changeset
384 SmallString<128> P(D.ResourceDir);
anatofuz
parents:
diff changeset
385 llvm::sys::path::append(P, "include");
anatofuz
parents:
diff changeset
386 addSystemInclude(DriverArgs, CC1Args, P);
anatofuz
parents:
diff changeset
387 }
anatofuz
parents:
diff changeset
388
anatofuz
parents:
diff changeset
389 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
anatofuz
parents:
diff changeset
390 return;
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 // Check for configure-time C include directories.
anatofuz
parents:
diff changeset
393 StringRef CIncludeDirs(C_INCLUDE_DIRS);
anatofuz
parents:
diff changeset
394 if (CIncludeDirs != "") {
anatofuz
parents:
diff changeset
395 SmallVector<StringRef, 5> dirs;
anatofuz
parents:
diff changeset
396 CIncludeDirs.split(dirs, ":");
anatofuz
parents:
diff changeset
397 for (StringRef dir : dirs) {
anatofuz
parents:
diff changeset
398 StringRef Prefix =
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
399 llvm::sys::path::is_absolute(dir) ? "" : StringRef(D.SysRoot);
150
anatofuz
parents:
diff changeset
400 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
anatofuz
parents:
diff changeset
401 }
anatofuz
parents:
diff changeset
402 return;
anatofuz
parents:
diff changeset
403 }
anatofuz
parents:
diff changeset
404
anatofuz
parents:
diff changeset
405 if (!D.SysRoot.empty()) {
anatofuz
parents:
diff changeset
406 SmallString<128> P(D.SysRoot);
anatofuz
parents:
diff changeset
407 llvm::sys::path::append(P, "include");
anatofuz
parents:
diff changeset
408 addExternCSystemInclude(DriverArgs, CC1Args, P.str());
anatofuz
parents:
diff changeset
409 }
anatofuz
parents:
diff changeset
410 }
anatofuz
parents:
diff changeset
411
anatofuz
parents:
diff changeset
412 void Fuchsia::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
anatofuz
parents:
diff changeset
413 ArgStringList &CC1Args) const {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
414 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
415 options::OPT_nostdincxx))
150
anatofuz
parents:
diff changeset
416 return;
anatofuz
parents:
diff changeset
417
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
418 const Driver &D = getDriver();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
419 std::string Target = getTripleString();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
420
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
421 auto AddCXXIncludePath = [&](StringRef Path) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
422 std::string Version = detectLibcxxVersion(Path);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
423 if (Version.empty())
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
424 return;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
425
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
426 // First add the per-target include path.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
427 SmallString<128> TargetDir(Path);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
428 llvm::sys::path::append(TargetDir, Target, "c++", Version);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
429 if (getVFS().exists(TargetDir))
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
430 addSystemInclude(DriverArgs, CC1Args, TargetDir);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
431
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
432 // Second add the generic one.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
433 SmallString<128> Dir(Path);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
434 llvm::sys::path::append(Dir, "c++", Version);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
435 addSystemInclude(DriverArgs, CC1Args, Dir);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
436 };
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
437
150
anatofuz
parents:
diff changeset
438 switch (GetCXXStdlibType(DriverArgs)) {
anatofuz
parents:
diff changeset
439 case ToolChain::CST_Libcxx: {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
440 SmallString<128> P(D.Dir);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
441 llvm::sys::path::append(P, "..", "include");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
442 AddCXXIncludePath(P);
150
anatofuz
parents:
diff changeset
443 break;
anatofuz
parents:
diff changeset
444 }
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 default:
anatofuz
parents:
diff changeset
447 llvm_unreachable("invalid stdlib name");
anatofuz
parents:
diff changeset
448 }
anatofuz
parents:
diff changeset
449 }
anatofuz
parents:
diff changeset
450
anatofuz
parents:
diff changeset
451 void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
anatofuz
parents:
diff changeset
452 ArgStringList &CmdArgs) const {
anatofuz
parents:
diff changeset
453 switch (GetCXXStdlibType(Args)) {
anatofuz
parents:
diff changeset
454 case ToolChain::CST_Libcxx:
anatofuz
parents:
diff changeset
455 CmdArgs.push_back("-lc++");
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
456 if (Args.hasArg(options::OPT_fexperimental_library))
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
457 CmdArgs.push_back("-lc++experimental");
150
anatofuz
parents:
diff changeset
458 break;
anatofuz
parents:
diff changeset
459
anatofuz
parents:
diff changeset
460 case ToolChain::CST_Libstdcxx:
anatofuz
parents:
diff changeset
461 llvm_unreachable("invalid stdlib name");
anatofuz
parents:
diff changeset
462 }
anatofuz
parents:
diff changeset
463 }
anatofuz
parents:
diff changeset
464
anatofuz
parents:
diff changeset
465 SanitizerMask Fuchsia::getSupportedSanitizers() const {
anatofuz
parents:
diff changeset
466 SanitizerMask Res = ToolChain::getSupportedSanitizers();
anatofuz
parents:
diff changeset
467 Res |= SanitizerKind::Address;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
468 Res |= SanitizerKind::HWAddress;
150
anatofuz
parents:
diff changeset
469 Res |= SanitizerKind::PointerCompare;
anatofuz
parents:
diff changeset
470 Res |= SanitizerKind::PointerSubtract;
anatofuz
parents:
diff changeset
471 Res |= SanitizerKind::Fuzzer;
anatofuz
parents:
diff changeset
472 Res |= SanitizerKind::FuzzerNoLink;
anatofuz
parents:
diff changeset
473 Res |= SanitizerKind::Leak;
anatofuz
parents:
diff changeset
474 Res |= SanitizerKind::SafeStack;
anatofuz
parents:
diff changeset
475 Res |= SanitizerKind::Scudo;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
476 Res |= SanitizerKind::Thread;
150
anatofuz
parents:
diff changeset
477 return Res;
anatofuz
parents:
diff changeset
478 }
anatofuz
parents:
diff changeset
479
anatofuz
parents:
diff changeset
480 SanitizerMask Fuchsia::getDefaultSanitizers() const {
anatofuz
parents:
diff changeset
481 SanitizerMask Res;
anatofuz
parents:
diff changeset
482 switch (getTriple().getArch()) {
anatofuz
parents:
diff changeset
483 case llvm::Triple::aarch64:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
484 case llvm::Triple::riscv64:
150
anatofuz
parents:
diff changeset
485 Res |= SanitizerKind::ShadowCallStack;
anatofuz
parents:
diff changeset
486 break;
anatofuz
parents:
diff changeset
487 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
488 Res |= SanitizerKind::SafeStack;
anatofuz
parents:
diff changeset
489 break;
anatofuz
parents:
diff changeset
490 default:
anatofuz
parents:
diff changeset
491 break;
anatofuz
parents:
diff changeset
492 }
anatofuz
parents:
diff changeset
493 return Res;
anatofuz
parents:
diff changeset
494 }