[Lldb-commits] [lldb] r332111 - HostInfoMacOSX: Share the clang resource directory with Swift.
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Wed May 23 02:46:25 PDT 2018
Btw, r333032 gave me an idea. We already have unittests/Host/linux/*** to
contain linux-specific host tests (although one of them maybe shouldn't be
there). What would you say to moving this test to unittests/Host/macosx so
we can avoid the #ifdefs?
On Fri, 11 May 2018 at 18:57, Adrian Prantl via lldb-commits <
lldb-commits at lists.llvm.org> wrote:
> Author: adrian
> Date: Fri May 11 10:54:09 2018
> New Revision: 332111
> URL: http://llvm.org/viewvc/llvm-project?rev=332111&view=rev
> Log:
> HostInfoMacOSX: Share the clang resource directory with Swift.
> Inside Xcode and in Xcode toolchains LLDB is always in lockstep
> with the Swift compiler, so it can reuse its Clang resource
> directory. This allows LLDB and the Swift compiler to share the
> same Clang module cache.
> rdar://problem/40039633
> Differential Revision: https://reviews.llvm.org/D46736
> Modified:
> lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h
> lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm
> lldb/trunk/unittests/Host/CMakeLists.txt
> lldb/trunk/unittests/Host/HostInfoTest.cpp
> Modified: lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h
> URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h?rev=332111&r1=332110&r2=332111&view=diff
==============================================================================
> --- lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h (original)
> +++ lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h Fri May 11
10:54:09 2018
> @@ -38,6 +38,8 @@ protected:
> static bool ComputeHeaderDirectory(FileSpec &file_spec);
> static bool ComputePythonDirectory(FileSpec &file_spec);
> static bool ComputeClangDirectory(FileSpec &file_spec);
> + static bool ComputeClangDirectory(FileSpec &lldb_shlib_spec,
> + FileSpec &file_spec, bool verify);
> static bool ComputeSystemPluginsDirectory(FileSpec &file_spec);
> static bool ComputeUserPluginsDirectory(FileSpec &file_spec);
> };
> Modified: lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm
> URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm?rev=332111&r1=332110&r2=332111&view=diff
==============================================================================
> --- lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm (original)
> +++ lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm Fri May 11 10:54:09
2018
> @@ -19,6 +19,7 @@
> #include "llvm/ADT/SmallString.h"
> #include "llvm/Support/FileSystem.h"
> +#include "llvm/Support/Path.h"
> #include "llvm/Support/raw_ostream.h"
> // C++ Includes
> @@ -226,21 +227,67 @@ bool HostInfoMacOSX::ComputePythonDirect
> #endif
> }
> +static bool VerifyClangPath(const llvm::Twine &clang_path) {
> + if (llvm::sys::fs::is_directory(clang_path))
> + return true;
> + Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
> + if (log)
> + log->Printf("HostInfoMacOSX::ComputeClangDirectory(): "
> + "failed to stat clang resource directory at \"%s\"",
> + clang_path.str().c_str());
> + return false;
> +}
> +
> bool HostInfoMacOSX::ComputeClangDirectory(FileSpec &file_spec) {
> FileSpec lldb_file_spec;
> if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
> return false;
> + return ComputeClangDirectory(lldb_file_spec, file_spec, true);
> +}
> - std::string raw_path = lldb_file_spec.GetPath();
> +bool HostInfoMacOSX::ComputeClangDirectory(FileSpec &lldb_shlib_spec,
> + FileSpec &file_spec, bool
verify) {
> + std::string raw_path = lldb_shlib_spec.GetPath();
> - size_t framework_pos = raw_path.find("LLDB.framework");
> - if (framework_pos == std::string::npos)
> + auto rev_it = llvm::sys::path::rbegin(raw_path);
> + auto r_end = llvm::sys::path::rend(raw_path);
> +
> + // Check for a Posix-style build of LLDB.
> + if (rev_it == r_end || *rev_it != "LLDB.framework")
> return HostInfoPosix::ComputeClangDirectory(file_spec);
> -
> - framework_pos += strlen("LLDB.framework");
> - raw_path.resize(framework_pos);
> +
> + // Inside Xcode and in Xcode toolchains LLDB is always in lockstep
> + // with the Swift compiler, so it can reuse its Clang resource
> + // directory. This allows LLDB and the Swift compiler to share the
> + // same Clang module cache.
> + llvm::SmallString<256> clang_path;
> + const char *swift_clang_resource_dir = "usr/lib/swift/clang";
> + ++rev_it;
> + if (rev_it != r_end && *rev_it == "SharedFrameworks") {
> + // This is the top-level LLDB in the Xcode.app bundle.
> + raw_path.resize(rev_it - r_end);
> + llvm::sys::path::append(clang_path, raw_path,
> +
"Developer/Toolchains/XcodeDefault.xctoolchain",
> + swift_clang_resource_dir);
> + if (!verify || VerifyClangPath(clang_path)) {
> + file_spec.SetFile(clang_path.c_str(), true);
> + return true;
> + }
> + } else if (rev_it != r_end && *rev_it == "PrivateFrameworks" &&
> + ++rev_it != r_end && ++rev_it != r_end) {
> + // This is LLDB inside an Xcode toolchain.
> + raw_path.resize(rev_it - r_end);
> + llvm::sys::path::append(clang_path, raw_path,
swift_clang_resource_dir);
> + if (!verify || VerifyClangPath(clang_path)) {
> + file_spec.SetFile(clang_path.c_str(), true);
> + return true;
> + }
> + } else {
> + raw_path.resize(rev_it - r_end);
> + }
> +
> + // Fall back to the Clang resource directory inside the framework.
> raw_path.append("/Resources/Clang");
> -
> file_spec.SetFile(raw_path.c_str(), true);
> return true;
> }
> Modified: lldb/trunk/unittests/Host/CMakeLists.txt
> URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Host/CMakeLists.txt?rev=332111&r1=332110&r2=332111&view=diff
==============================================================================
> --- lldb/trunk/unittests/Host/CMakeLists.txt (original)
> +++ lldb/trunk/unittests/Host/CMakeLists.txt Fri May 11 10:54:09 2018
> @@ -22,4 +22,5 @@ add_lldb_unittest(HostTests
> LINK_LIBS
> lldbCore
> lldbHost
> + lldbUtilityHelpers
> )
> Modified: lldb/trunk/unittests/Host/HostInfoTest.cpp
> URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Host/HostInfoTest.cpp?rev=332111&r1=332110&r2=332111&view=diff
==============================================================================
> --- lldb/trunk/unittests/Host/HostInfoTest.cpp (original)
> +++ lldb/trunk/unittests/Host/HostInfoTest.cpp Fri May 11 10:54:09 2018
> @@ -8,7 +8,9 @@
//===----------------------------------------------------------------------===//
> #include "lldb/Host/HostInfo.h"
> +#include "lldb/Host/macosx/HostInfoMacOSX.h"
> #include "lldb/lldb-defines.h"
> +#include "TestingSupport/TestUtilities.h"
> #include "gtest/gtest.h"
> using namespace lldb_private;
> @@ -43,3 +45,41 @@ TEST_F(HostInfoTest, GetAugmentedArchSpe
EXPECT_EQ(HostInfo::GetAugmentedArchSpec(LLDB_ARCH_DEFAULT).GetTriple(),
HostInfo::GetArchitecture(HostInfo::eArchKindDefault).GetTriple());
> }
> +
> +
> +struct HostInfoMacOSXTest : public HostInfoMacOSX {
> + static std::string ComputeClangDir(std::string lldb_shlib_path,
> + bool verify = false) {
> + FileSpec clang_dir;
> + FileSpec lldb_shlib_spec(lldb_shlib_path, false);
> + ComputeClangDirectory(lldb_shlib_spec, clang_dir, verify);
> + return clang_dir.GetPath();
> + }
> +};
> +
> +
> +TEST_F(HostInfoTest, MacOSX) {
> + // This returns whatever the POSIX fallback returns.
> + std::string posix = "/usr/lib/liblldb.dylib";
> + EXPECT_FALSE(HostInfoMacOSXTest::ComputeClangDir(posix).empty());
> +
> + std::string xcode =
> + "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework";
> + std::string xcode_clang =
> + "/Applications/Xcode.app/Contents/Developer/Toolchains/"
> + "XcodeDefault.xctoolchain/usr/lib/swift/clang";
> + EXPECT_EQ(HostInfoMacOSXTest::ComputeClangDir(xcode), xcode_clang);
> +
> + std::string toolchain =
> + "/Applications/Xcode.app/Contents/Developer/Toolchains/"
> + "Swift-4.1-development-snapshot.xctoolchain/System/Library/"
> + "PrivateFrameworks/LLDB.framework";
> + std::string toolchain_clang =
> + "/Applications/Xcode.app/Contents/Developer/Toolchains/"
> + "Swift-4.1-development-snapshot.xctoolchain/usr/lib/swift/clang";
> + EXPECT_EQ(HostInfoMacOSXTest::ComputeClangDir(toolchain),
toolchain_clang);
> +
> + // Test that a bogus path is detected.
> + EXPECT_NE(HostInfoMacOSXTest::ComputeClangDir(GetInputFilePath(xcode),
true),
> +
HostInfoMacOSXTest::ComputeClangDir(GetInputFilePath(xcode)));
> +}
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list