Loading...
--- dyld/dyld-1340/cache_builder/SubCache.h
+++ dyld/dyld-1162/cache_builder/SubCache.h
@@ -29,7 +29,6 @@
#include "Chunk.h"
#include "MachOFile.h"
#include "Optimizers.h"
-#include "Platform.h"
#include "Types.h"
#include <uuid/uuid.h>
@@ -37,8 +36,6 @@
namespace cache_builder
{
-
-struct BuilderOptions;
struct Region
{
@@ -51,21 +48,13 @@
// Rosetta expects __DATA_CONST after __TEXT, as we currently sort using this enum
dataConst,
- // Put TPRO const before data as we want it to be adjacent to the DATA_DIRTY which it at the start of data
- tproConst,
-
data,
-
- // Put TPRO auth const before auth as we want it to be adjacent to the DATA_DIRTY which it at the start of auth
- tproAuthConst,
-
auth,
// FIXME: Move this to be after DATA_CONST to reduce page tables
// Needs rdar://96315050
authConst,
- readOnly,
linkedit,
unmapped,
dynamicConfig,
@@ -84,18 +73,16 @@
bool needsRegionPadding(const Region& next) const;
- Kind kind;
+ Kind kind;
// The chunks from dylibs, optimzations, etc, which make up this Region
- std::vector<Chunk*> chunks;
-
- std::list<AlignChunk> alignmentChunks;
-
- CacheFileOffset subCacheFileOffset;
- CacheFileSize subCacheFileSize;
- CacheVMAddress subCacheVMAddress;
- CacheVMSize subCacheVMSize;
- uint8_t* subCacheBuffer = nullptr;
+ std::vector<Chunk*> chunks;
+
+ CacheFileOffset subCacheFileOffset;
+ CacheFileSize subCacheFileSize;
+ CacheVMAddress subCacheVMAddress;
+ CacheVMSize subCacheVMSize;
+ uint8_t* subCacheBuffer = nullptr;
};
struct SubCache
@@ -133,39 +120,35 @@
static SubCache makeSymbolsCache();
// These methods are called by computeSubCaches() to add Chunk's to the subCache
- void addDylib(const BuilderConfig& config, CacheDylib& cacheDylib);
+ void addDylib(CacheDylib& cacheDylib, bool addLinkedit);
void addLinkeditFromDylib(CacheDylib& cacheDylib);
- void addCacheHeaderChunk(const BuilderOptions& options, const BuilderConfig& config,
- const std::span<CacheDylib> cacheDylibs);
+ void addCacheHeaderChunk(const std::span<CacheDylib> cacheDylibs);
void addObjCHeaderInfoReadWriteChunk(const BuilderConfig& config, ObjCOptimizer& objcOptimizer);
void addCodeSignatureChunk();
- void addObjCOptsHeaderChunk(const BuilderConfig& config, ObjCOptimizer& objcOptimizer);
- void addObjCHeaderInfoReadOnlyChunk(const BuilderConfig& config, ObjCOptimizer& objcOptimizer);
- void addObjCImageInfoChunk(const BuilderConfig& config, ObjCOptimizer& objcOptimizer);
- void addObjCSelectorStringsChunk(const BuilderConfig& config, ObjCSelectorOptimizer& objCSelectorOptimizer);
- void addObjCSelectorHashTableChunk(const BuilderConfig& config, ObjCSelectorOptimizer& objCSelectorOptimizer);
- void addObjCClassNameStringsChunk(const BuilderConfig& config, ObjCClassOptimizer& objcClassOptimizer);
- void addObjCClassHashTableChunk(const BuilderConfig& config, ObjCClassOptimizer& objcClassOptimizer);
- void addObjCProtocolNameStringsChunk(const BuilderConfig& config, ObjCProtocolOptimizer& objcProtocolOptimizer);
- void addObjCProtocolHashTableChunk(const BuilderConfig& config, ObjCProtocolOptimizer& objcProtocolOptimizer);
- void addObjCProtocolSwiftDemangledNamesChunk(const BuilderConfig& config, ObjCProtocolOptimizer& objcProtocolOptimizer);
+ void addObjCOptsHeaderChunk(ObjCOptimizer& objcOptimizer);
+ void addObjCHeaderInfoReadOnlyChunk(ObjCOptimizer& objcOptimizer);
+ void addObjCImageInfoChunk(ObjCOptimizer& objcOptimizer);
+ void addObjCSelectorStringsChunk(ObjCSelectorOptimizer& objCSelectorOptimizer);
+ void addObjCSelectorHashTableChunk(ObjCSelectorOptimizer& objCSelectorOptimizer);
+ void addObjCClassNameStringsChunk(ObjCClassOptimizer& objcClassOptimizer);
+ void addObjCClassHashTableChunk(ObjCClassOptimizer& objcClassOptimizer);
+ void addObjCProtocolNameStringsChunk(ObjCProtocolOptimizer& objcProtocolOptimizer);
+ void addObjCProtocolHashTableChunk(ObjCProtocolOptimizer& objcProtocolOptimizer);
+ void addObjCProtocolSwiftDemangledNamesChunk(ObjCProtocolOptimizer& objcProtocolOptimizer);
void addObjCCanonicalProtocolsChunk(const BuilderConfig& config,
ObjCProtocolOptimizer& objcProtocolOptimizer);
void addObjCCategoriesChunk(const BuilderConfig& config,
ObjCCategoryOptimizer& objcCategoryOptimizer);
- void addObjCIMPCachesChunk(const BuilderConfig& config, ObjCIMPCachesOptimizer& objcIMPCachesOptimizer);
+ void addObjCIMPCachesChunk(ObjCIMPCachesOptimizer& objcIMPCachesOptimizer);
void addCacheTrieChunk(DylibTrieOptimizer& dylibTrieOptimizer);
void addPatchTableChunk(PatchTableOptimizer& patchTableOptimizer);
- void addFunctionVariantsChunk(FunctionVariantsOptimizer& optimizer);
void addCacheDylibsLoaderChunk(PrebuiltLoaderBuilder& builder);
void addExecutableLoaderChunk(PrebuiltLoaderBuilder& builder);
void addExecutablesTrieChunk(PrebuiltLoaderBuilder& builder);
- void addSwiftOptsHeaderChunk(const BuilderConfig& config, SwiftOptimizer& opt);
- void addSwiftTypeHashTableChunk(const BuilderConfig& config, SwiftOptimizer& opt);
- void addSwiftMetadataHashTableChunk(const BuilderConfig& config, SwiftOptimizer& opt);
- void addSwiftForeignHashTableChunk(const BuilderConfig& config, SwiftOptimizer& opt);
- void addSwiftPrespecializedMetadataPointerTableChunks(const BuilderConfig& config, SwiftOptimizer& opt);
- void addPrewarmingDataChunk(const BuilderConfig& config, PrewarmingOptimizer& opt);
+ void addSwiftOptsHeaderChunk(SwiftProtocolConformanceOptimizer& opt);
+ void addSwiftTypeHashTableChunk(SwiftProtocolConformanceOptimizer& opt);
+ void addSwiftMetadataHashTableChunk(SwiftProtocolConformanceOptimizer& opt);
+ void addSwiftForeignHashTableChunk(SwiftProtocolConformanceOptimizer& opt);
void addUnmappedSymbols(const BuilderConfig& config, UnmappedSymbolsOptimizer& opt);
void addDynamicConfigChunk();
void addSlideInfoChunks();
@@ -173,7 +156,7 @@
// When "kind == sub", sets the suffix on this subCache
// This has to be done after creating things like stubs sub caches, which might move the indices
- void setSuffix(mach_o::Platform platform, bool forceDevelopmentSubCacheSuffix,
+ void setSuffix(dyld3::Platform platform, bool forceDevelopmentSubCacheSuffix,
size_t subCacheIndex);
void setCodeSignatureSize(const BuilderOptions& options, const BuilderConfig& config,
@@ -183,22 +166,20 @@
// Emits a dyld_cache_header for this subCache
void writeCacheHeader(const BuilderOptions& options, const BuilderConfig& config,
- const std::span<CacheDylib> cacheDylibs,
- uint32_t osVersion, uint32_t altPlatform, uint32_t altOsVersion);
+ const std::span<CacheDylib> cacheDylibs);
// Adds any additional fields which are set only on the main subCache(s)
void addMainCacheHeaderInfo(const BuilderOptions& options, const BuilderConfig& config,
const std::span<CacheDylib> cacheDylibs,
CacheVMSize totalVMSize, uint64_t maxSlide,
+ uint32_t osVersion, uint32_t altPlatform, uint32_t altOsVersion,
CacheVMAddress dyldInCacheUnslidAddr,
CacheVMAddress dyldInCacheEntryUnslidAddr,
const DylibTrieOptimizer& dylibTrieOptimizer,
const ObjCOptimizer& objcOpt,
- const SwiftOptimizer& swiftOpt,
+ const SwiftProtocolConformanceOptimizer& swiftProtocolConformanceOpt,
const PatchTableOptimizer& patchTableOptimizer,
- const FunctionVariantsOptimizer& functionVariantOptimizer,
- const PrebuiltLoaderBuilder& prebuiltLoaderBuilder,
- const PrewarmingOptimizer& prewarmingOptimizer);
+ const PrebuiltLoaderBuilder& prebuiltLoaderBuilder);
// Adds any additional fields which are set only on the .symbols subCache
void addSymbolsCacheHeaderInfo(const UnmappedSymbolsOptimizer& unmappedSymbolsOptimizer);
@@ -218,23 +199,6 @@
bool shouldKeepCache(bool keepDevelopmentCaches, bool keepCustomerCaches) const;
- // Note this is for x86_64 only, and works out where the TPRO "regions" are inside the DATA region
- static void forEachTPRORegionInData(SubCache* mainSubCache, std::span<SubCache*> subCaches,
- void (^callback)(Region& region, const Chunk* firstChunk, const Chunk* lastChunk));
-
- // Adds the given chunk to the given region
- void addTextChunk(Chunk* chunk);
- void addDataChunk(Chunk* chunk);
- void addTPROConstChunk(const BuilderConfig& config, Chunk* chunk);
- void addDataConstChunk(Chunk* chunk);
- void addAuthChunk(Chunk* chunk);
- void addAuthConstChunk(Chunk* chunk);
- void addReadOnlyChunk(const BuilderConfig& config, Chunk* chunk);
- void addLinkeditChunk(Chunk* chunk);
- void addUnmappedChunk(Chunk* chunk);
- void addCodeSignatureChunk(Chunk* chunk);
- void addObjCReadWriteChunk(const BuilderConfig& config, Chunk* chunk);
-
#if BUILDING_CACHE_BUILDER_UNIT_TESTS
// We need everything public to write tests
public:
@@ -242,13 +206,25 @@
private:
#endif
+ // Adds the given chunk to the given region
+ void addTextChunk(Chunk* chunk);
+ void addDataChunk(Chunk* chunk);
+ void addDataConstChunk(Chunk* chunk);
+ void addAuthChunk(Chunk* chunk);
+ void addAuthConstChunk(Chunk* chunk);
+ void addLinkeditChunk(Chunk* chunk);
+ void addUnmappedChunk(Chunk* chunk);
+ void addCodeSignatureChunk(Chunk* chunk);
+ void addObjCTextChunk(Chunk* chunk);
+ void addObjCReadOnlyChunk(Chunk* chunk);
+ void addObjCReadWriteChunk(const BuilderConfig& config, Chunk* chunk);
+
// Returns true if the cache header on this subCache needs an image list
// The symbols cache and stubs caches, for example, don't need this
- bool needsCacheHeaderImageList(const BuilderOptions& options) const;
+ bool needsCacheHeaderImageList() const;
// Add image info to the subCache header, if it needs it
void addCacheHeaderImageInfo(const BuilderOptions& options,
- const BuilderConfig& config,
const std::span<CacheDylib> cacheDylibs);
static uint64_t getCacheType(const BuilderOptions& options);
@@ -282,17 +258,18 @@
uint8_t* buffer = nullptr;
uint64_t bufferSize = 0;
CacheVMAddress subCacheVMAddress;
+#if !SUPPORT_CACHE_BUILDER_MEMORY_BUFFERS
+ int fd = 0;
+ std::string tempPath;
+#endif
uint8_t cdHash[20];
- uint8_t agilecdHash[20]; // if using agile signatures, this is the sha256
uuid_string_t uuidString;
std::string fileSuffix;
// Some Chunk instances are owned by the SubCache. Eg, it owns its own header
std::unique_ptr<CacheHeaderChunk> cacheHeader;
- std::unique_ptr<SlideInfoChunk> tproConstSlideInfo;
std::unique_ptr<SlideInfoChunk> dataSlideInfo;
std::unique_ptr<SlideInfoChunk> dataConstSlideInfo;
- std::unique_ptr<SlideInfoChunk> tproAuthConstSlideInfo;
std::unique_ptr<SlideInfoChunk> authSlideInfo;
std::unique_ptr<SlideInfoChunk> authConstSlideInfo;
std::unique_ptr<CodeSignatureChunk> codeSignature;
@@ -316,14 +293,13 @@
std::unique_ptr<SwiftProtocolConformancesHashTableChunk> swiftForeignTypeHashTable;
std::unique_ptr<CacheTrieChunk> cacheDylibsTrie;
std::unique_ptr<PatchTableChunk> patchTable;
- std::unique_ptr<FunctionVariantsPatchTableChunk> functionVariants;
std::unique_ptr<DynamicConfigChunk> dynamicConfig;
std::unique_ptr<PrebuiltLoaderChunk> cacheDylibsLoaders;
std::unique_ptr<PrebuiltLoaderChunk> executableLoaders;
std::unique_ptr<CacheTrieChunk> executablesTrie;
std::unique_ptr<SymbolStringsChunk> optimizedSymbolStrings;
- std::vector<std::unique_ptr<PointerHashTableChunk>> pointerHashTables;
- std::unique_ptr<PrewarmingChunk> prewarmingChunk;
+ std::unique_ptr<UniquedGOTsChunk> uniquedGOTs;
+ std::unique_ptr<UniquedGOTsChunk> uniquedAuthGOTs;
// Each subCache has its own Linkedit so needs its own optimizer
SymbolStringsOptimizer symbolStringsOptimizer;