[lldb] Add a new way of loading files from a shared cache (#179881) Taking advantage of a few new SPI in macOS 26.4 libdyld, it is possible for lldb to load binaries out of a shared cache binary blob, instead of needing discrete files on disk. lldb has had one special case where it has done this for years -- if the debugee process and lldb itself are using the same shared cache, it could create ObjectFiles based on its own memory contents. This new method requires only the shared cache on disk, not depending on it being mapped into lldb's address space already. In HostInfoMacOSX.mm, we create an array of binaries in lldb's shared cache, by one of two methods depending on the availability of SPI/SDKs. This PR adds a new third method for loading lldb's shared cache off disk as a proof of concept. It will prefer this new method when the needed SPI are available at runtime. There is also a user setting to disable this new method in case we uncover a problem as it is deployed. I did change the internal store of the shared cache files from a single array, to being organized by shared cache UUIDs, so we can have multiple shared caches indexed in the future. In HostInfoBase.h's SharedCacheImageInfo class, you can now create an ImageInfo with a DataExtractorSP or a void* baton. I added GetUUID and GetExtractor methods, and the latter will use the libdyld SPI to map the segments for a specific binary into lldb's memory and return a DataExtractorSP. The setting is currently called symbols.shared-cache-binary-loading. In DynamicLoaderDarwin::FindTargetModuleForImageInfo there was an ordering mistake where we would always consult the HostInfoMacOSX.mm shared cache provider, instead of checking lldb's own global module cache first when looking for a binary, resulting in creating a new Module repeatedly for shared cache binaries with the new method, parsing the symbol table repeatedly. I fixed the ordering so we look at existing Modules before we check the shared cache for one. In ObjectFileMachOTest, it tests a TEXT and a DATA symbol, checking that the contents of the function/data object match the bytes we got from the shared cache. The test was using a DATA_DIRTY symbol, which was fine when using lldb's own shared cache memory, but when we worked on the shared cache binary on-disk directly, we were seeing different values for the bytes because of relocations in there. I changed this to a constant DATA symbol. rdar://148939795 --------- Co-authored-by: Jonas Devlieghere <jonas@devlieghere.com> Co-authored-by: Alex Langford <nirvashtzero@gmail.com>
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.