Author: Edd Dawson Date: 2024-09-17T12:09:38+01:00 New Revision: 1e23a6142a827cda89fa4d8335afebd89701991d
URL: https://github.com/llvm/llvm-project/commit/1e23a6142a827cda89fa4d8335afebd89701991d DIFF: https://github.com/llvm/llvm-project/commit/1e23a6142a827cda89fa4d8335afebd89701991d.diff LOG: [PS4,PS5][Driver] Detangle --sysroot and -isysroot (#107410) The following discrepancies concerning `-isysroot` and `--sysroot` motivated this change: - The SDK directory can be specified via `-isysroot`, but `--sysroot` has no influence over this. Yet, we check for the presence of either switch to determine whether we ought to warn about a missing SDK *headers*. - The presence of `-isysroot` is ignored when deciding whether to warn about missing SDK *libraries*, depsite it being the only switch capable of specifying a non-default SDK location. - The `--sysroot`s passed to the PlayStation linkers by the driver are unrelated to the SDK directory resolved in the PS4PS5Base constructor. Following this change, we attempt to derive an SDK root from a platform- specific environment variable. Failing that, we derive it from the location of the driver. This then becomes the default root directory for both header and library search. `--sysroot` overrides both search roots. `-isysroot` overrides only the header search root. If both are specified, `--sysroot` specifies the library search root and `-isysroot` specifies the header search root. For each search root that was not overridden, a warning is emitted if expected header/library search paths are missing inside that root. The test updates to ps{4,5}-sdk-root.c were of the scale of a rewrite so I also took the opportunity to clarify the purpose of each part, eliminate some redundancy and add some missing coverage. SIE tracker: TOOLCHAIN-16704 Added: Modified: clang/lib/Driver/ToolChains/PS4CPU.cpp clang/lib/Driver/ToolChains/PS4CPU.h clang/test/Driver/ps4-linker.c clang/test/Driver/ps4-ps5-header-search.c clang/test/Driver/ps4-sdk-root.c clang/test/Driver/ps5-linker.c clang/test/Driver/ps5-sdk-root.c Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/PS4CPU.cpp b/clang/lib/Driver/ToolChains/PS4CPU.cpp index 48d824171303cc..647580e4e235dc 100644 --- a/clang/lib/Driver/ToolChains/PS4CPU.cpp +++ b/clang/lib/Driver/ToolChains/PS4CPU.cpp @@ -135,8 +135,8 @@ void tools::PS4cpu::Linker::ConstructJob(Compilation &C, const JobAction &JA, // handled somewhere else. Args.ClaimAllArgs(options::OPT_w); - if (!D.SysRoot.empty()) - CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); + CmdArgs.push_back( + Args.MakeArgString("--sysroot=" + TC.getSDKLibraryRootDir())); if (Args.hasArg(options::OPT_pie)) CmdArgs.push_back("-pie"); @@ -234,8 +234,8 @@ void tools::PS5cpu::Linker::ConstructJob(Compilation &C, const JobAction &JA, // handled somewhere else. Args.ClaimAllArgs(options::OPT_w); - if (!D.SysRoot.empty()) - CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); + CmdArgs.push_back( + Args.MakeArgString("--sysroot=" + TC.getSDKLibraryRootDir())); // Default to PIE for non-static executables. const bool PIE = @@ -325,46 +325,63 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, StringRef Platform, const char *EnvVar) : Generic_ELF(D, Triple, Args) { - // Determine where to find the PS4/PS5 libraries. - // If -isysroot was passed, use that as the SDK base path. - // If not, we use the EnvVar if it exists; otherwise use the driver's - // installation path, which should be <SDK_DIR>/host_tools/bin. + // Determine the baseline SDK directory from the environment, else + // the driver's location, which should be <SDK_DIR>/host_tools/bin. + SmallString<128> SDKRootDir; SmallString<80> Whence; - if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { - SDKRootDir = A->getValue(); - if (!llvm::sys::fs::exists(SDKRootDir)) - D.Diag(clang::diag::warn_missing_sysroot) << SDKRootDir; - Whence = A->getSpelling(); - } else if (const char *EnvValue = getenv(EnvVar)) { + if (const char *EnvValue = getenv(EnvVar)) { SDKRootDir = EnvValue; - Whence = { "environment variable '", EnvVar, "'" }; + Whence = {"environment variable '", EnvVar, "'"}; } else { SDKRootDir = D.Dir + "/../../"; Whence = "compiler's location"; } - SmallString<512> SDKIncludeDir(SDKRootDir); - llvm::sys::path::append(SDKIncludeDir, "target/include"); - if (!Args.hasArg(options::OPT_nostdinc) && - !Args.hasArg(options::OPT_nostdlibinc) && - !Args.hasArg(options::OPT_isysroot) && - !Args.hasArg(options::OPT__sysroot_EQ) && - !llvm::sys::fs::exists(SDKIncludeDir)) { - D.Diag(clang::diag::warn_drv_unable_to_find_directory_expected) - << Twine(Platform, " system headers").str() << SDKIncludeDir << Whence; - } + // Allow --sysroot= to override the root directory for header and library + // search, and -sysroot to override header search. If both are specified, + // -isysroot overrides --sysroot for header search. + auto OverrideRoot = [&](const options::ID &Opt, std::string &Root, + StringRef Default) { + if (const Arg *A = Args.getLastArg(Opt)) { + Root = A->getValue(); + if (!llvm::sys::fs::exists(Root)) + D.Diag(clang::diag::warn_missing_sysroot) << Root; + return true; + } + Root = Default.str(); + return false; + }; - SmallString<512> SDKLibDir(SDKRootDir); - llvm::sys::path::append(SDKLibDir, "target/lib"); - if (!Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) && - !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) && - !Args.hasArg(options::OPT_emit_ast) && - !llvm::sys::fs::exists(SDKLibDir)) { + bool CustomSysroot = + OverrideRoot(options::OPT__sysroot_EQ, SDKLibraryRootDir, SDKRootDir); + bool CustomISysroot = + OverrideRoot(options::OPT_isysroot, SDKHeaderRootDir, SDKLibraryRootDir); + + // Emit warnings if parts of the SDK are missing, unless the user has taken + // control of header or library search. If we're not linking, don't check + // for missing libraries. + auto CheckSDKPartExists = [&](StringRef Dir, StringRef Desc) { + if (llvm::sys::fs::exists(Dir)) + return true; D.Diag(clang::diag::warn_drv_unable_to_find_directory_expected) - << Twine(Platform, " system libraries").str() << SDKLibDir << Whence; - return; + << (Twine(Platform) + " " + Desc).str() << Dir << Whence; + return false; + }; + + bool Linking = !Args.hasArg(options::OPT_E, options::OPT_c, options::OPT_S, + options::OPT_emit_ast); + if (!CustomSysroot && Linking) { + SmallString<128> Dir(SDKLibraryRootDir); + llvm::sys::path::append(Dir, "target/lib"); + if (CheckSDKPartExists(Dir, "system libraries")) + getFilePaths().push_back(std::string(Dir)); + } + if (!CustomSysroot && !CustomISysroot && + !Args.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc)) { + SmallString<128> Dir(SDKHeaderRootDir); + llvm::sys::path::append(Dir, "target/include"); + CheckSDKPartExists(Dir, "system headers"); } - getFilePaths().push_back(std::string(SDKLibDir)); } void toolchains::PS4PS5Base::AddClangSystemIncludeArgs( @@ -385,9 +402,9 @@ void toolchains::PS4PS5Base::AddClangSystemIncludeArgs( return; addExternCSystemInclude(DriverArgs, CC1Args, - SDKRootDir + "/target/include"); + SDKHeaderRootDir + "/target/include"); addExternCSystemInclude(DriverArgs, CC1Args, - SDKRootDir + "/target/include_common"); + SDKHeaderRootDir + "/target/include_common"); } Tool *toolchains::PS4CPU::buildAssembler() const { diff --git a/clang/lib/Driver/ToolChains/PS4CPU.h b/clang/lib/Driver/ToolChains/PS4CPU.h index a33728bce5186a..456e966c2d400a 100644 --- a/clang/lib/Driver/ToolChains/PS4CPU.h +++ b/clang/lib/Driver/ToolChains/PS4CPU.h @@ -128,9 +128,12 @@ class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF { const char *Suffix) const = 0; virtual const char *getProfileRTLibName() const = 0; + StringRef getSDKLibraryRootDir() const { return SDKLibraryRootDir; } + private: - // We compute the SDK root dir in the ctor, and use it later. - std::string SDKRootDir; + // We compute the SDK locations in the ctor, and use them later. + std::string SDKHeaderRootDir; + std::string SDKLibraryRootDir; }; // PS4-specific Toolchain class. diff --git a/clang/test/Driver/ps4-linker.c b/clang/test/Driver/ps4-linker.c index a1bc8f92537545..f3a304a956fd8a 100644 --- a/clang/test/Driver/ps4-linker.c +++ b/clang/test/Driver/ps4-linker.c @@ -28,3 +28,12 @@ // RUN: %clang --target=x86_64-scei-ps4 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-NO-LTO %s // CHECK-NO-LTO-NOT: -lto-debug-options + +// Test the driver passes a sysroot to the linker. Without --sysroot, its value +// is sourced from the SDK environment variable. + +// RUN: env SCE_ORBIS_SDK_DIR=mysdk %clang --target=x64_64-scei-ps4 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-SYSROOT %s +// RUN: env SCE_ORBIS_SDK_DIR=other %clang --target=x64_64-scei-ps4 %s -### --sysroot=mysdk 2>&1 | FileCheck --check-prefixes=CHECK-SYSROOT %s + +// CHECK-SYSROOT: {{ld(\.exe)?}}" +// CHECK-SYSROOT-SAME: "--sysroot=mysdk" diff --git a/clang/test/Driver/ps4-ps5-header-search.c b/clang/test/Driver/ps4-ps5-header-search.c index 066d284d08065e..7c24523df7a039 100644 --- a/clang/test/Driver/ps4-ps5-header-search.c +++ b/clang/test/Driver/ps4-ps5-header-search.c @@ -1,6 +1,6 @@ /// PS4 and PS5 use the same SDK layout, so use the same tree for both. -// 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 -// 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 +// RUN: env SCE_ORBIS_SDK_DIR=%S/Inputs/scei-ps4_tree %clang -target x86_64-scei-ps4 -E -v %s 2>&1 | FileCheck %s --check-prefix=ENVPS4 +// RUN: env SCE_PROSPERO_SDK_DIR=%S/Inputs/scei-ps4_tree %clang -target x86_64-sie-ps5 -E -v %s 2>&1 | FileCheck %s --check-prefix=ENVPS4 // ENVPS4: Inputs/scei-ps4_tree/target/include // ENVPS4: Inputs/scei-ps4_tree/target/include_common // ENVPS4-NOT: /usr/include diff --git a/clang/test/Driver/ps4-sdk-root.c b/clang/test/Driver/ps4-sdk-root.c index 3e02fa9fc3bc29..78eb1ce2ba6302 100644 --- a/clang/test/Driver/ps4-sdk-root.c +++ b/clang/test/Driver/ps4-sdk-root.c @@ -1,42 +1,67 @@ -// Check that PS4 clang doesn't report a warning message when locating -// system header files (either by looking at the value of SCE_ORBIS_SDK_DIR -// or relative to the location of the compiler driver), if "-nostdinc", -// "--sysroot" or "-isysroot" option is specified on the command line. -// Otherwise, check that PS4 clang reports a warning. - -// Check that PS4 clang doesn't report a warning message when locating -// system libraries (either by looking at the value of SCE_ORBIS_SDK_DIR -// or relative to the location of the compiler driver), if "-c", "-S", "-E" -// or "--sysroot" option is specified on the command line. -// Otherwise, check that PS4 clang reports a warning. - -// Setting up SCE_ORBIS_SDK_DIR to existing location, which is not a PS4 SDK. -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=WARN-SYS-LIBS -check-prefix=NO-WARN %s - -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=WARN-SYS-LIBS -check-prefix=NO-WARN %s - -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -nostdinc -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -nostdinc -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -nostdinc -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -nostdinc -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s - -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c --sysroot=foo/ -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S --sysroot=foo/ -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E --sysroot=foo/ -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast --sysroot=foo/ -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s - -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_ORBIS_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### --sysroot=foo/ -isysroot foo -target x86_64-scei-ps4 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s +/// PS4 clang emits warnings when SDK headers (<SDKROOT>/target/include/) or +/// libraries (<SDKROOT>/target/lib/) are missing, unless the user takes control +/// of search paths, when corresponding existence checks are skipped. +/// +/// User control of header search is assumed if `--sysroot`, `-isysroot`, +/// `-nostdinc` or `-nostdlibinc` is supplied. User control of library search +/// is assumed if `--sysroot` is supplied. +/// +/// Warnings are emitted if a specified `-isysroot` or `--sysroot` does not +/// exist. +/// +/// The default <SDKROOT> for both headers and libraries is taken from the +/// SCE_ORBIS_SDK_DIR environment variable. + +// RUN: echo "-### -Winvalid-or-nonexistent-directory -target x86_64-scei-ps4" > %t.rsp + +/// If SDK headers and/or libraries are found, associated warnings are absent. +// RUN: rm -rf %t.inconly && mkdir -p %t.inconly/target/include +// RUN: env SCE_ORBIS_SDK_DIR=%t.inconly %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-LIBS,NO-WARN %s + +// RUN: rm -rf %t.libonly && mkdir -p %t.libonly/target/lib +// RUN: env SCE_ORBIS_SDK_DIR=%t.libonly %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s + +// RUN: rm -rf %t.both && mkdir -p %t.both/target/lib && mkdir %t.both/target/include +// RUN: env SCE_ORBIS_SDK_DIR=%t.both %clang @%t.rsp %s 2>&1 | FileCheck -check-prefix=NO-WARN %s + +/// In the following invocations, SCE_ORBIS_SDK_DIR is set to an existing +/// location where SDK headers and libraries are absent. + +/// When compiling and linking, we should see a warnings about both missing +/// headers and libraries. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,WARN-SYS-LIBS,NO-WARN %s + +/// If `-c`, `-S`, `-E` or `-emit-ast` is supplied, the existence check for SDK +/// libraries is skipped because no linking will be performed. We only expect +/// warnings about missing headers. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -c 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -S 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -E 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -emit-ast 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s + +/// If the user takes control of include paths, the existence check for headers +/// is not performed. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -c -nostdinc 2>&1 | FileCheck -check-prefix=NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -c -nostdlibinc 2>&1 | FileCheck -check-prefix=NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -c -isysroot . 2>&1 | FileCheck -check-prefixes=NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -c --sysroot=. 2>&1 | FileCheck -check-prefixes=NO-WARN %s + +/// --sysroot disables the existence check for libraries and headers. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s --sysroot=. 2>&1 | FileCheck -check-prefix=NO-WARN %s + +/// -isysroot overrides --sysroot for header search, but not library search. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -isysroot . --sysroot=.. 2>&1 | FileCheck -check-prefixes=ISYSTEM,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s --sysroot=.. -isysroot . 2>&1 | FileCheck -check-prefixes=ISYSTEM,NO-WARN %s + +/// Warnings are emitted if non-existent --sysroot/-isysroot are supplied. +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s --sysroot=foo -isysroot . 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s -isysroot foo --sysroot=. 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,NO-WARN %s +// RUN: env SCE_ORBIS_SDK_DIR=.. %clang @%t.rsp %s --sysroot=foo -isysroot bar 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,WARN-SYSROOT2,NO-WARN %s // NO-WARN-NOT: {{warning:|error:}} -// WARN-SYS-HEADERS: warning: unable to find PS4 system headers directory -// WARN-ISYSROOT: warning: no such sysroot directory: 'foo' // WARN-SYS-LIBS: warning: unable to find PS4 system libraries directory +// WARN-SYS-HEADERS: warning: unable to find PS4 system headers directory +// WARN-SYSROOT: warning: no such sysroot directory: 'foo' +// WARN-SYSROOT2: warning: no such sysroot directory: 'bar' // NO-WARN-NOT: {{warning:|error:}} +// ISYSTEM: "-cc1"{{.*}}"-internal-externc-isystem" "./target/include" diff --git a/clang/test/Driver/ps5-linker.c b/clang/test/Driver/ps5-linker.c index 84363deb0337f7..c0cf0b864028c8 100644 --- a/clang/test/Driver/ps5-linker.c +++ b/clang/test/Driver/ps5-linker.c @@ -37,3 +37,12 @@ // RUN: %clang --target=x86_64-sie-ps5 -flto -fcrash-diagnostics-dir=mydumps %s -### 2>&1 | FileCheck --check-prefixes=CHECK-DIAG %s // CHECK-DIAG: -plugin-opt=-crash-diagnostics-dir=mydumps + +// Test the driver passes a sysroot to the linker. Without --sysroot, its value +// is sourced from the SDK environment variable. + +// RUN: env SCE_PROSPERO_SDK_DIR=mysdk %clang --target=x64_64-sie-ps5 %s -### 2>&1 | FileCheck --check-prefixes=CHECK-SYSROOT %s +// RUN: env SCE_PROSPERO_SDK_DIR=other %clang --target=x64_64-sie-ps5 %s -### --sysroot=mysdk 2>&1 | FileCheck --check-prefixes=CHECK-SYSROOT %s + +// CHECK-SYSROOT: {{ld(\.exe)?}}" +// CHECK-SYSROOT-SAME: "--sysroot=mysdk" diff --git a/clang/test/Driver/ps5-sdk-root.c b/clang/test/Driver/ps5-sdk-root.c index 2a82d8e72283b7..a12e0dfffeb584 100644 --- a/clang/test/Driver/ps5-sdk-root.c +++ b/clang/test/Driver/ps5-sdk-root.c @@ -1,44 +1,69 @@ /// (Essentially identical to ps4-sdk-root.c except for the target.) -/// Check that PS5 clang doesn't report a warning message when locating -/// system header files (either by looking at the value of SCE_PROSPERO_SDK_DIR -/// or relative to the location of the compiler driver), if "-nostdinc", -/// "--sysroot" or "-isysroot" option is specified on the command line. -/// Otherwise, check that PS5 clang reports a warning. - -// Check that PS5 clang doesn't report a warning message when locating -// system libraries (either by looking at the value of SCE_PROSPERO_SDK_DIR -// or relative to the location of the compiler driver), if "-c", "-S", "-E" -// or "--sysroot" option is specified on the command line. -// Otherwise, check that PS5 clang reports a warning. - -// Setting up SCE_PROSPERO_SDK_DIR to existing location, which is not a PS5 SDK. -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=WARN-SYS-LIBS -check-prefix=NO-WARN %s - -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-SYS-HEADERS -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=WARN-SYS-LIBS -check-prefix=NO-WARN %s - -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -nostdinc -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -nostdinc -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -nostdinc -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -nostdinc -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s - -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c --sysroot=foo/ -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S --sysroot=foo/ -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E --sysroot=foo/ -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast --sysroot=foo/ -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=NO-WARN %s - -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -c -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -S -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -E -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### -emit-ast -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s -// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang -Winvalid-or-nonexistent-directory -### --sysroot=foo/ -isysroot foo -target x86_64-sie-ps5 %s 2>&1 | FileCheck -check-prefix=WARN-ISYSROOT -check-prefix=NO-WARN %s +/// PS5 clang emits warnings when SDK headers (<SDKROOT>/target/include/) or +/// libraries (<SDKROOT>/target/lib/) are missing, unless the user takes control +/// of search paths, when corresponding existence checks are skipped. +/// +/// User control of header search is assumed if `--sysroot`, `-isysroot`, +/// `-nostdinc` or `-nostdlibinc` is supplied. User control of library search +/// is assumed if `--sysroot` is supplied. +/// +/// Warnings are emitted if a specified `-isysroot` or `--sysroot` does not +/// exist. +/// +/// The default <SDKROOT> for both headers and libraries is taken from the +/// SCE_PROSPERO_SDK_DIR environment variable. + +// RUN: echo "-### -Winvalid-or-nonexistent-directory -target x86_64-sie-ps5" > %t.rsp + +/// If SDK headers and/or libraries are found, associated warnings are absent. +// RUN: rm -rf %t.inconly && mkdir -p %t.inconly/target/include +// RUN: env SCE_PROSPERO_SDK_DIR=%t.inconly %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-LIBS,NO-WARN %s + +// RUN: rm -rf %t.libonly && mkdir -p %t.libonly/target/lib +// RUN: env SCE_PROSPERO_SDK_DIR=%t.libonly %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s + +// RUN: rm -rf %t.both && mkdir -p %t.both/target/lib && mkdir %t.both/target/include +// RUN: env SCE_PROSPERO_SDK_DIR=%t.both %clang @%t.rsp %s 2>&1 | FileCheck -check-prefix=NO-WARN %s + +/// In the following invocations, SCE_PROSPERO_SDK_DIR is set to an existing +/// location where SDK headers and libraries are absent. + +/// When compiling and linking, we should see a warnings about both missing +/// headers and libraries. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,WARN-SYS-LIBS,NO-WARN %s + +/// If `-c`, `-S`, `-E` or `-emit-ast` is supplied, the existence check for SDK +/// libraries is skipped because no linking will be performed. We only expect +/// warnings about missing headers. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -c 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -S 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -E 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -emit-ast 2>&1 | FileCheck -check-prefixes=WARN-SYS-HEADERS,NO-WARN %s + +/// If the user takes control of include paths, the existence check for headers +/// is not performed. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -c -nostdinc 2>&1 | FileCheck -check-prefix=NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -c -nostdlibinc 2>&1 | FileCheck -check-prefix=NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -c -isysroot . 2>&1 | FileCheck -check-prefixes=NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -c --sysroot=. 2>&1 | FileCheck -check-prefixes=NO-WARN %s + +/// --sysroot disables the existence check for libraries and headers. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s --sysroot=. 2>&1 | FileCheck -check-prefix=NO-WARN %s + +/// -isysroot overrides --sysroot for header search, but not library search. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -isysroot . --sysroot=.. 2>&1 | FileCheck -check-prefixes=ISYSTEM,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s --sysroot=.. -isysroot . 2>&1 | FileCheck -check-prefixes=ISYSTEM,NO-WARN %s + +/// Warnings are emitted if non-existent --sysroot/-isysroot are supplied. +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s --sysroot=foo -isysroot . 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s -isysroot foo --sysroot=. 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,NO-WARN %s +// RUN: env SCE_PROSPERO_SDK_DIR=.. %clang @%t.rsp %s --sysroot=foo -isysroot bar 2>&1 | FileCheck -check-prefixes=WARN-SYSROOT,WARN-SYSROOT2,NO-WARN %s // NO-WARN-NOT: {{warning:|error:}} -// WARN-SYS-HEADERS: warning: unable to find PS5 system headers directory -// WARN-ISYSROOT: warning: no such sysroot directory: 'foo' // WARN-SYS-LIBS: warning: unable to find PS5 system libraries directory +// WARN-SYS-HEADERS: warning: unable to find PS5 system headers directory +// WARN-SYSROOT: warning: no such sysroot directory: 'foo' +// WARN-SYSROOT2: warning: no such sysroot directory: 'bar' // NO-WARN-NOT: {{warning:|error:}} +// ISYSTEM: "-cc1"{{.*}}"-internal-externc-isystem" "./target/include" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits