@@ -118,11 +118,11 @@ void toolchains::PS5CPU::addSanitizerArgs(const ArgList &Args,
118
118
CmdArgs.push_back (arg (" SceThreadSanitizer_nosubmission_stub_weak" ));
119
119
}
120
120
121
- void tools::PScpu ::Linker::ConstructJob (Compilation &C, const JobAction &JA,
122
- const InputInfo &Output,
123
- const InputInfoList &Inputs,
124
- const ArgList &Args,
125
- const char *LinkingOutput) const {
121
+ void tools::PS4cpu ::Linker::ConstructJob (Compilation &C, const JobAction &JA,
122
+ const InputInfo &Output,
123
+ const InputInfoList &Inputs,
124
+ const ArgList &Args,
125
+ const char *LinkingOutput) const {
126
126
auto &TC = static_cast <const toolchains::PS4PS5Base &>(getToolChain ());
127
127
const Driver &D = TC.getDriver ();
128
128
ArgStringList CmdArgs;
@@ -155,14 +155,120 @@ void tools::PScpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
155
155
const bool UseLTO = D.isUsingLTO ();
156
156
const bool UseJMC =
157
157
Args.hasFlag (options::OPT_fjmc, options::OPT_fno_jmc, false );
158
- const bool IsPS4 = TC.getTriple ().isPS4 ();
159
158
160
- const char *PS4LTOArgs = " " ;
159
+ const char *LTOArgs = " " ;
161
160
auto AddCodeGenFlag = [&](Twine Flag) {
162
- if (IsPS4)
163
- PS4LTOArgs = Args.MakeArgString (Twine (PS4LTOArgs) + " " + Flag);
161
+ LTOArgs = Args.MakeArgString (Twine (LTOArgs) + " " + Flag);
162
+ };
163
+
164
+ if (UseLTO) {
165
+ // We default to creating the arange section, but LTO does not. Enable it
166
+ // here.
167
+ AddCodeGenFlag (" -generate-arange-section" );
168
+
169
+ // This tells LTO to perform JustMyCode instrumentation.
170
+ if (UseJMC)
171
+ AddCodeGenFlag (" -enable-jmc-instrument" );
172
+
173
+ if (Arg *A = Args.getLastArg (options::OPT_fcrash_diagnostics_dir))
174
+ AddCodeGenFlag (Twine (" -crash-diagnostics-dir=" ) + A->getValue ());
175
+
176
+ StringRef Parallelism = getLTOParallelism (Args, D);
177
+ if (!Parallelism.empty ())
178
+ AddCodeGenFlag (Twine (" -threads=" ) + Parallelism);
179
+
180
+ const char *Prefix = nullptr ;
181
+ if (D.getLTOMode () == LTOK_Thin)
182
+ Prefix = " -lto-thin-debug-options=" ;
183
+ else if (D.getLTOMode () == LTOK_Full)
184
+ Prefix = " -lto-debug-options=" ;
164
185
else
165
- CmdArgs.push_back (Args.MakeArgString (Twine (" -plugin-opt=" ) + Flag));
186
+ llvm_unreachable (" new LTO mode?" );
187
+
188
+ CmdArgs.push_back (Args.MakeArgString (Twine (Prefix) + LTOArgs));
189
+ }
190
+
191
+ if (!Args.hasArg (options::OPT_nostdlib, options::OPT_nodefaultlibs))
192
+ TC.addSanitizerArgs (Args, CmdArgs, " -l" , " " );
193
+
194
+ if (D.isUsingLTO () && Args.hasArg (options::OPT_funified_lto)) {
195
+ if (D.getLTOMode () == LTOK_Thin)
196
+ CmdArgs.push_back (" --lto=thin" );
197
+ else if (D.getLTOMode () == LTOK_Full)
198
+ CmdArgs.push_back (" --lto=full" );
199
+ }
200
+
201
+ Args.addAllArgs (CmdArgs, {options::OPT_L, options::OPT_T_Group,
202
+ options::OPT_s, options::OPT_t});
203
+
204
+ if (Args.hasArg (options::OPT_Z_Xlinker__no_demangle))
205
+ CmdArgs.push_back (" --no-demangle" );
206
+
207
+ AddLinkerInputs (TC, Inputs, Args, CmdArgs, JA);
208
+
209
+ if (Args.hasArg (options::OPT_pthread)) {
210
+ CmdArgs.push_back (" -lpthread" );
211
+ }
212
+
213
+ if (UseJMC) {
214
+ CmdArgs.push_back (" --whole-archive" );
215
+ CmdArgs.push_back (" -lSceDbgJmc" );
216
+ CmdArgs.push_back (" --no-whole-archive" );
217
+ }
218
+
219
+ if (Args.hasArg (options::OPT_fuse_ld_EQ)) {
220
+ D.Diag (diag::err_drv_unsupported_opt_for_target)
221
+ << " -fuse-ld" << TC.getTriple ().str ();
222
+ }
223
+
224
+ std::string LdName = TC.qualifyPSCmdName (TC.getLinkerBaseName ());
225
+ const char *Exec = Args.MakeArgString (TC.GetProgramPath (LdName.c_str ()));
226
+
227
+ C.addCommand (std::make_unique<Command>(JA, *this ,
228
+ ResponseFileSupport::AtFileUTF8 (),
229
+ Exec, CmdArgs, Inputs, Output));
230
+ }
231
+
232
+ void tools::PS5cpu::Linker::ConstructJob (Compilation &C, const JobAction &JA,
233
+ const InputInfo &Output,
234
+ const InputInfoList &Inputs,
235
+ const ArgList &Args,
236
+ const char *LinkingOutput) const {
237
+ auto &TC = static_cast <const toolchains::PS4PS5Base &>(getToolChain ());
238
+ const Driver &D = TC.getDriver ();
239
+ ArgStringList CmdArgs;
240
+
241
+ // Silence warning for "clang -g foo.o -o foo"
242
+ Args.ClaimAllArgs (options::OPT_g_Group);
243
+ // and "clang -emit-llvm foo.o -o foo"
244
+ Args.ClaimAllArgs (options::OPT_emit_llvm);
245
+ // and for "clang -w foo.o -o foo". Other warning options are already
246
+ // handled somewhere else.
247
+ Args.ClaimAllArgs (options::OPT_w);
248
+
249
+ if (!D.SysRoot .empty ())
250
+ CmdArgs.push_back (Args.MakeArgString (" --sysroot=" + D.SysRoot ));
251
+
252
+ if (Args.hasArg (options::OPT_pie))
253
+ CmdArgs.push_back (" -pie" );
254
+
255
+ if (Args.hasArg (options::OPT_rdynamic))
256
+ CmdArgs.push_back (" -export-dynamic" );
257
+ if (Args.hasArg (options::OPT_shared))
258
+ CmdArgs.push_back (" --shared" );
259
+
260
+ assert ((Output.isFilename () || Output.isNothing ()) && " Invalid output." );
261
+ if (Output.isFilename ()) {
262
+ CmdArgs.push_back (" -o" );
263
+ CmdArgs.push_back (Output.getFilename ());
264
+ }
265
+
266
+ const bool UseLTO = D.isUsingLTO ();
267
+ const bool UseJMC =
268
+ Args.hasFlag (options::OPT_fjmc, options::OPT_fno_jmc, false );
269
+
270
+ auto AddCodeGenFlag = [&](Twine Flag) {
271
+ CmdArgs.push_back (Args.MakeArgString (Twine (" -plugin-opt=" ) + Flag));
166
272
};
167
273
168
274
if (UseLTO) {
@@ -178,24 +284,8 @@ void tools::PScpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
178
284
AddCodeGenFlag (Twine (" -crash-diagnostics-dir=" ) + A->getValue ());
179
285
180
286
StringRef Parallelism = getLTOParallelism (Args, D);
181
- if (!Parallelism.empty ()) {
182
- if (IsPS4)
183
- AddCodeGenFlag (Twine (" -threads=" ) + Parallelism);
184
- else
185
- CmdArgs.push_back (Args.MakeArgString (Twine (" -plugin-opt=jobs=" ) + Parallelism));
186
- }
187
-
188
- if (IsPS4) {
189
- const char *Prefix = nullptr ;
190
- if (D.getLTOMode () == LTOK_Thin)
191
- Prefix = " -lto-thin-debug-options=" ;
192
- else if (D.getLTOMode () == LTOK_Full)
193
- Prefix = " -lto-debug-options=" ;
194
- else
195
- llvm_unreachable (" new LTO mode?" );
196
-
197
- CmdArgs.push_back (Args.MakeArgString (Twine (Prefix) + PS4LTOArgs));
198
- }
287
+ if (!Parallelism.empty ())
288
+ CmdArgs.push_back (Args.MakeArgString (Twine (" -plugin-opt=jobs=" ) + Parallelism));
199
289
}
200
290
201
291
if (!Args.hasArg (options::OPT_nostdlib, options::OPT_nodefaultlibs))
@@ -222,10 +312,7 @@ void tools::PScpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
222
312
223
313
if (UseJMC) {
224
314
CmdArgs.push_back (" --whole-archive" );
225
- if (IsPS4)
226
- CmdArgs.push_back (" -lSceDbgJmc" );
227
- else
228
- CmdArgs.push_back (" -lSceJmc_nosubmission" );
315
+ CmdArgs.push_back (" -lSceJmc_nosubmission" );
229
316
CmdArgs.push_back (" --no-whole-archive" );
230
317
}
231
318
@@ -321,14 +408,18 @@ Tool *toolchains::PS4CPU::buildAssembler() const {
321
408
return new tools::PScpu::Assembler (*this );
322
409
}
323
410
411
+ Tool *toolchains::PS4CPU::buildLinker () const {
412
+ return new tools::PS4cpu::Linker (*this );
413
+ }
414
+
324
415
Tool *toolchains::PS5CPU::buildAssembler () const {
325
416
// PS5 does not support an external assembler.
326
417
getDriver ().Diag (clang::diag::err_no_external_assembler);
327
418
return nullptr ;
328
419
}
329
420
330
- Tool *toolchains::PS4PS5Base ::buildLinker () const {
331
- return new tools::PScpu ::Linker (*this );
421
+ Tool *toolchains::PS5CPU ::buildLinker () const {
422
+ return new tools::PS5cpu ::Linker (*this );
332
423
}
333
424
334
425
SanitizerMask toolchains::PS4PS5Base::getSupportedSanitizers () const {
0 commit comments