Skip to content

Commit 660ddb3

Browse files
[PS4,PS5][Driver] Pass -L<sdk>/target/lib -L. to linker (#109796)
The proprietary PS4 linker implicitly adds `=/target/lib` and `.` as library search paths. This behaviour was added to the PS5 linker via a downstream patch in LLD. This really belongs in the driver, instead. This change adds the driver behaviour to allow removal of the downstream patch in LLD. There are no plans to update the PS4 linker behaviour in the analogous way, so do not pass the same search paths to the PS4 linker. SIE tracker: TOOLCHAIN-16704
1 parent 1c1bb77 commit 660ddb3

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

clang/lib/Driver/ToolChains/PS4CPU.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ void tools::PS4cpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
186186
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
187187
TC.addSanitizerArgs(Args, CmdArgs, "-l", "");
188188

189+
// Other drivers typically add library search paths (`-L`) here via
190+
// TC.AddFilePathLibArgs(). We don't do that on PS4 as the PS4 linker
191+
// searches those locations by default.
189192
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
190193
options::OPT_s, options::OPT_t});
191194

@@ -290,6 +293,7 @@ void tools::PS5cpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
290293
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
291294
TC.addSanitizerArgs(Args, CmdArgs, "-l", "");
292295

296+
TC.AddFilePathLibArgs(Args, CmdArgs);
293297
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
294298
options::OPT_s, options::OPT_t});
295299

@@ -382,6 +386,8 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
382386
llvm::sys::path::append(Dir, "target/include");
383387
CheckSDKPartExists(Dir, "system headers");
384388
}
389+
390+
getFilePaths().push_back(".");
385391
}
386392

387393
void toolchains::PS4PS5Base::AddClangSystemIncludeArgs(

clang/test/Driver/ps5-linker.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,27 @@
4646

4747
// CHECK-SYSROOT: {{ld(\.exe)?}}"
4848
// CHECK-SYSROOT-SAME: "--sysroot=mysdk"
49+
50+
// Test that "." is always added to library search paths. This is long-standing
51+
// behavior, unique to PlayStation toolchains.
52+
53+
// RUN: %clang --target=x64_64-sie-ps5 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-LDOT %s
54+
55+
// CHECK-LDOT: {{ld(\.exe)?}}"
56+
// CHECK-LDOT-SAME: "-L."
57+
58+
// Test that <sdk-root>/target/lib is added to library search paths, if it
59+
// exists and no --sysroot is specified.
60+
61+
// RUN: rm -rf %t.dir && mkdir %t.dir
62+
// RUN: env SCE_PROSPERO_SDK_DIR=%t.dir %clang --target=x64_64-sie-ps5 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-NO-TARGETLIB %s
63+
// RUN: env SCE_PROSPERO_SDK_DIR=%t.dir %clang --target=x64_64-sie-ps5 %s -### --sysroot=%t.dir 2>&1 | FileCheck --check-prefixes=CHECK-NO-TARGETLIB %s
64+
65+
// CHECK-NO-TARGETLIB: {{ld(\.exe)?}}"
66+
// CHECK-NO-TARGETLIB-NOT: "-L{{.*[/\\]}}target/lib"
67+
68+
// RUN: mkdir -p %t.dir/target/lib
69+
// RUN: env SCE_PROSPERO_SDK_DIR=%t.dir %clang --target=x64_64-sie-ps5 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-TARGETLIB %s
70+
71+
// CHECK-TARGETLIB: {{ld(\.exe)?}}"
72+
// CHECK-TARGETLIB-SAME: "-L{{.*[/\\]}}target/lib"

0 commit comments

Comments
 (0)