This revision was automatically updated to reflect the committed changes. JDevlieghere marked an inline comment as done. Closed by commit rGecda408178fc: [lldb] Read from the Rosetta shared cache with Xcode 14 (authored by JDevlieghere). Herald added a project: LLDB.
Changed prior to commit: https://reviews.llvm.org/D130540?vs=447537&id=448186#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130540/new/ https://reviews.llvm.org/D130540 Files: lldb/packages/Python/lldbsuite/test/decorators.py lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp lldb/test/API/macosx/rosetta/Makefile lldb/test/API/macosx/rosetta/TestRosetta.py lldb/test/API/macosx/rosetta/main.c
Index: lldb/test/API/macosx/rosetta/main.c =================================================================== --- /dev/null +++ lldb/test/API/macosx/rosetta/main.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main() { + int i = 0; // Set a breakpoint here + return i; +} Index: lldb/test/API/macosx/rosetta/TestRosetta.py =================================================================== --- /dev/null +++ lldb/test/API/macosx/rosetta/TestRosetta.py @@ -0,0 +1,55 @@ +import re +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * + + +def get_os_version(): + try: + os_version_str = subprocess.check_output(["sysctl", "kern.osversion" + ]).decode('utf-8') + except subprocess.CalledProcessError: + return None + m = re.match(r'kern\.osversion: (\w+)', os_version_str) + if m: + return m.group(1) + return None + + +def has_rosetta_shared_cache(os_version): + if not os_version: + return False + macos_device_support = os.path.join(os.path.expanduser("~"), 'Library', + 'Developer', 'Xcode', + 'macOS DeviceSupport') + for _, subdirs, _ in os.walk(macos_device_support): + for subdir in subdirs: + if os_version in subdir: + return True + return False + + +class TestRosetta(TestBase): + + NO_DEBUG_INFO_TESTCASE = True + + @skipUnlessAppleSilicon + def test_rosetta(self): + """There can be many tests in a test case - describe this test here.""" + self.build() + self.main_source_file = lldb.SBFileSpec("main.c") + + broadcaster = self.dbg.GetBroadcaster() + listener = lldbutil.start_listening_from( + broadcaster, lldb.SBDebugger.eBroadcastBitWarning) + + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, "Set a breakpoint here", self.main_source_file) + + event = lldb.SBEvent() + os_version = get_os_version() + if not has_rosetta_shared_cache(os_version): + self.assertTrue(listener.GetNextEvent(event)) + else: + self.assertFalse(listener.GetNextEvent(event)) Index: lldb/test/API/macosx/rosetta/Makefile =================================================================== --- /dev/null +++ lldb/test/API/macosx/rosetta/Makefile @@ -0,0 +1,4 @@ +C_SOURCES := main.c +override ARCH = x86_64 + +include Makefile.rules Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp @@ -148,11 +148,20 @@ uint32_t i; if (UpdateSDKDirectoryInfosIfNeeded()) { const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); - - // Check to see if the user specified a build string. If they did, then be - // sure to match it. std::vector<bool> check_sdk_info(num_sdk_infos, true); - ConstString build(m_sdk_build); + + // Prefer the user SDK build string. + ConstString build = GetSDKBuild(); + + // Fall back to the platform's build string. + if (!build) { + if (llvm::Optional<std::string> os_build_str = GetOSBuildString()) { + build = ConstString(*os_build_str); + } + } + + // If we have a build string, only check platforms for which the build + // string matches. if (build) { for (i = 0; i < num_sdk_infos; ++i) check_sdk_info[i] = m_sdk_directory_infos[i].build == build; @@ -163,14 +172,14 @@ llvm::VersionTuple version = GetOSVersion(); if (!version.empty()) { if (UpdateSDKDirectoryInfosIfNeeded()) { - // First try for an exact match of major, minor and update + // First try for an exact match of major, minor and update. for (i = 0; i < num_sdk_infos; ++i) { if (check_sdk_info[i]) { if (m_sdk_directory_infos[i].version == version) return &m_sdk_directory_infos[i]; } } - // First try for an exact match of major and minor + // Try for an exact match of major and minor. for (i = 0; i < num_sdk_infos; ++i) { if (check_sdk_info[i]) { if (m_sdk_directory_infos[i].version.getMajor() == @@ -181,7 +190,7 @@ } } } - // Lastly try to match of major version only.. + // Lastly try to match of major version only. for (i = 0; i < num_sdk_infos; ++i) { if (check_sdk_info[i]) { if (m_sdk_directory_infos[i].version.getMajor() == @@ -192,7 +201,7 @@ } } } else if (build) { - // No version, just a build number, search for the first one that matches + // No version, just a build number, return the first one that matches. for (i = 0; i < num_sdk_infos; ++i) if (check_sdk_info[i]) return &m_sdk_directory_infos[i]; Index: lldb/packages/Python/lldbsuite/test/decorators.py =================================================================== --- lldb/packages/Python/lldbsuite/test/decorators.py +++ lldb/packages/Python/lldbsuite/test/decorators.py @@ -698,6 +698,17 @@ archs), bugnumber) +def skipUnlessAppleSilicon(func): + """Decorate the item to skip tests unless running on Apple Silicon.""" + def not_apple_silicon(test): + if platform.system() != 'Darwin' or test.getArchitecture() not in [ + 'arm64', 'arm64e' + ]: + return "Test only runs on Apple Silicon" + return None + + return skipTestIfFn(not_apple_silicon)(func) + def skipUnlessSupportedTypeAttribute(attr): """Decorate the item to skip test unless Clang supports type __attribute__(attr).""" def compiler_doesnt_support_struct_attribute(self):
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits