Skip to content

Commit ecb3cd0

Browse files
committed
[Driver] Move PS4/PS5 header search path management to the driver
This follows how OpenBSD, FreeBSD, and NetBSD now work. (See D138183 and D140817 for those cases.) It also tidies up some code duplication that wasn't exactly right.
1 parent 97d51e3 commit ecb3cd0

File tree

4 files changed

+56
-38
lines changed

4 files changed

+56
-38
lines changed

clang/lib/Driver/ToolChains/PS4CPU.cpp

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "PS4CPU.h"
1010
#include "CommonArgs.h"
11+
#include "clang/Config/config.h"
1112
#include "clang/Driver/Compilation.h"
1213
#include "clang/Driver/Driver.h"
1314
#include "clang/Driver/DriverDiagnostic.h"
@@ -253,15 +254,14 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
253254
// SDK include or lib directories. This behavior could be changed if
254255
// -Weverything or -Winvalid-or-nonexistent-directory options are passed.
255256
// If -isysroot was passed, use that as the SDK base path.
256-
std::string PrefixDir;
257257
if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
258-
PrefixDir = A->getValue();
259-
if (!llvm::sys::fs::exists(PrefixDir))
260-
D.Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
258+
SDKRootDir = A->getValue();
259+
if (!llvm::sys::fs::exists(SDKRootDir))
260+
D.Diag(clang::diag::warn_missing_sysroot) << SDKRootDir;
261261
} else
262-
PrefixDir = std::string(SDKDir.str());
262+
SDKRootDir = std::string(SDKDir.str());
263263

264-
SmallString<512> SDKIncludeDir(PrefixDir);
264+
SmallString<512> SDKIncludeDir(SDKRootDir);
265265
llvm::sys::path::append(SDKIncludeDir, "target/include");
266266
if (!Args.hasArg(options::OPT_nostdinc) &&
267267
!Args.hasArg(options::OPT_nostdlibinc) &&
@@ -272,7 +272,7 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
272272
<< Twine(Platform, " system headers").str() << SDKIncludeDir;
273273
}
274274

275-
SmallString<512> SDKLibDir(SDKDir);
275+
SmallString<512> SDKLibDir(SDKRootDir);
276276
llvm::sys::path::append(SDKLibDir, "target/lib");
277277
if (!Args.hasArg(options::OPT_nostdlib) &&
278278
!Args.hasArg(options::OPT_nodefaultlibs) &&
@@ -287,6 +287,42 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
287287
getFilePaths().push_back(std::string(SDKLibDir.str()));
288288
}
289289

290+
void toolchains::PS4PS5Base::AddClangSystemIncludeArgs(
291+
const ArgList &DriverArgs,
292+
ArgStringList &CC1Args) const {
293+
const Driver &D = getDriver();
294+
295+
if (DriverArgs.hasArg(options::OPT_nostdinc))
296+
return;
297+
298+
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
299+
SmallString<128> Dir(D.ResourceDir);
300+
llvm::sys::path::append(Dir, "include");
301+
addSystemInclude(DriverArgs, CC1Args, Dir.str());
302+
}
303+
304+
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
305+
return;
306+
307+
// Add dirs specified via 'configure --with-c-include-dirs'.
308+
StringRef CIncludeDirs(C_INCLUDE_DIRS);
309+
if (!CIncludeDirs.empty()) {
310+
SmallVector<StringRef, 5> dirs;
311+
CIncludeDirs.split(dirs, ":");
312+
for (StringRef dir : dirs) {
313+
StringRef Prefix =
314+
llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";
315+
addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
316+
}
317+
return;
318+
}
319+
320+
addExternCSystemInclude(DriverArgs, CC1Args,
321+
SDKRootDir + "/target/include");
322+
addExternCSystemInclude(DriverArgs, CC1Args,
323+
SDKRootDir + "/target/include_common");
324+
}
325+
290326
Tool *toolchains::PS4CPU::buildAssembler() const {
291327
return new tools::PScpu::Assembler(*this);
292328
}

clang/lib/Driver/ToolChains/PS4CPU.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF {
6363
const llvm::opt::ArgList &Args, StringRef Platform,
6464
const char *EnvVar);
6565

66+
void
67+
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
68+
llvm::opt::ArgStringList &CC1Args) const override;
6669
// No support for finding a C++ standard library yet.
6770
void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
6871
llvm::opt::ArgStringList &CC1Args) const override {
@@ -111,6 +114,10 @@ class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF {
111114

112115
protected:
113116
Tool *buildLinker() const override;
117+
118+
private:
119+
// We compute the SDK root dir in the ctor, and use it later.
120+
std::string SDKRootDir;
114121
};
115122

116123
// PS4-specific Toolchain class.

clang/lib/Lex/InitHeaderSearch.cpp

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
233233
switch (os) {
234234
case llvm::Triple::CloudABI:
235235
case llvm::Triple::NaCl:
236-
case llvm::Triple::PS4:
237-
case llvm::Triple::PS5:
238236
case llvm::Triple::ELFIAMCU:
239237
break;
240238
case llvm::Triple::Win32:
@@ -339,31 +337,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
339337
case llvm::Triple::NaCl:
340338
case llvm::Triple::ELFIAMCU:
341339
break;
342-
case llvm::Triple::PS4:
343-
case llvm::Triple::PS5: {
344-
// <isysroot> gets prepended later in AddPath().
345-
std::string BaseSDKPath;
346-
if (!HasSysroot) {
347-
const char *EnvVar = (os == llvm::Triple::PS4) ? "SCE_ORBIS_SDK_DIR"
348-
: "SCE_PROSPERO_SDK_DIR";
349-
const char *envValue = getenv(EnvVar);
350-
if (envValue)
351-
BaseSDKPath = envValue;
352-
else {
353-
// HSOpts.ResourceDir variable contains the location of Clang's
354-
// resource files.
355-
// Assuming that Clang is configured for PS4 without
356-
// --with-clang-resource-dir option, the location of Clang's resource
357-
// files is <SDK_DIR>/host_tools/lib/clang
358-
SmallString<128> P = StringRef(HSOpts.ResourceDir);
359-
llvm::sys::path::append(P, "../../..");
360-
BaseSDKPath = std::string(P.str());
361-
}
362-
}
363-
AddPath(BaseSDKPath + "/target/include", System, false);
364-
AddPath(BaseSDKPath + "/target/include_common", System, false);
365-
break;
366-
}
367340
default:
368341
AddPath("/usr/include", ExternCSystem, false);
369342
break;
@@ -412,6 +385,8 @@ bool InitHeaderSearch::ShouldAddDefaultIncludePaths(
412385
case llvm::Triple::FreeBSD:
413386
case llvm::Triple::NetBSD:
414387
case llvm::Triple::OpenBSD:
388+
case llvm::Triple::PS4:
389+
case llvm::Triple::PS5:
415390
case llvm::Triple::Fuchsia:
416391
case llvm::Triple::Hurd:
417392
case llvm::Triple::Linux:
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/// PS4 and PS5 use the same SDK layout, so use the same tree for both.
22
// RUN: env SCE_ORBIS_SDK_DIR=%S/Inputs/scei-ps4_tree %clang -target x86_64-scei-ps4 --sysroot="" -E -v %s 2>&1 | FileCheck %s --check-prefix=ENVPS4
33
// RUN: env SCE_PROSPERO_SDK_DIR=%S/Inputs/scei-ps4_tree %clang -target x86_64-sie-ps5 --sysroot="" -E -v %s 2>&1 | FileCheck %s --check-prefix=ENVPS4
4-
// ENVPS4: Inputs/scei-ps4_tree/target/include{{$}}
5-
// ENVPS4: Inputs/scei-ps4_tree/target/include_common{{$}}
4+
// ENVPS4: Inputs/scei-ps4_tree/target/include
5+
// ENVPS4: Inputs/scei-ps4_tree/target/include_common
66
// ENVPS4-NOT: /usr/include
77

88
// RUN: %clang -isysroot %S/Inputs/scei-ps4_tree -target x86_64-scei-ps4 -E -v %s 2>&1 | FileCheck %s --check-prefix=SYSROOTPS4
99
// RUN: %clang -isysroot %S/Inputs/scei-ps4_tree -target x86_64-sie-ps5 -E -v %s 2>&1 | FileCheck %s --check-prefix=SYSROOTPS4
1010
// SYSROOTPS4: "{{[^"]*}}clang{{[^"]*}}"
11-
// SYSROOTPS4: Inputs/scei-ps4_tree/target/include{{$}}
12-
// SYSROOTPS4: Inputs/scei-ps4_tree/target/include_common{{$}}
11+
// SYSROOTPS4: Inputs/scei-ps4_tree/target/include
12+
// SYSROOTPS4: Inputs/scei-ps4_tree/target/include_common
1313
// SYSROOTPS4-NOT: /usr/include

0 commit comments

Comments
 (0)