Loading...
--- dyld/dyld-1162/cache_builder/BuilderConfig.cpp
+++ dyld/dyld-1241.17/cache_builder/BuilderConfig.cpp
@@ -75,9 +75,15 @@
return archName == "arm64e";
}
+static uint32_t supportsTPROMapping(std::string_view archName)
+{
+ return (archName != "x86_64") && (archName != "x86_64h");
+}
+
cache_builder::Layout::Layout(const BuilderOptions& options)
: is64(options.archs.supports64())
, hasAuthRegion(::hasAuthRegion(options.archs.name()))
+ , tproIsInData(!::supportsTPROMapping(options.archs.name()))
, pageSize(defaultPageSize(options.archs.name()))
{
std::string_view archName = options.archs.name();
@@ -97,7 +103,14 @@
if ( (archName == "x86_64") || (archName == "x86_64h") ) {
this->subCacheTextLimit = CacheVMSize(512_MB);
} else {
- this->subCacheTextLimit = CacheVMSize(1.5_GB);
+ // Note the 64MB is to give us just a little more space before making another
+ // sub cache file. We want to make as few files as possible for things like page-tables
+ // The real constraint here is that TEXT+DATA must stay within 2GB for int32_t relative
+ // offsets in objc/swift metadata and in unwind info. But also the __objc_opt section
+ // in libobjc needs to reach the __OBJC_RO in the read-only subcache. That comes after
+ // data and as of writing leaves 150MB from its end until the 2GB mark. So take 64MB from
+ // that 150MB and hope its ok for now.
+ this->subCacheTextLimit = CacheVMSize(1.5_GB + 64_MB);
}
struct CacheLayout
@@ -116,11 +129,8 @@
if ( options.isSimulator() ) {
// Limit to 4GB to support back deployment to older hosts with 4GB shared regions
layout.cacheSize = 4_GB;
- } else if ( options.platform == dyld3::Platform::macOS ) {
+ } else {
layout.cacheSize = ARM64_SHARED_REGION_SIZE;
- } else {
- // Temporarily limit embedded/driverKit to 4GB
- layout.cacheSize = 4_GB;
}
// Limit the max slide for arm64 based caches to 512MB. Combined with large
@@ -129,14 +139,13 @@
cacheMaxSlide = 512_MB;
} else if ( archName == "arm64_32" ) {
layout.baseAddress = ARM64_32_SHARED_REGION_START;
- layout.cacheSize = ARM64_32_SHARED_REGION_SIZE;
+ layout.cacheSize = 2_GB;
} else {
assert("Unknown arch");
}
this->cacheBaseAddress = CacheVMAddress(layout.baseAddress);
this->cacheSize = CacheVMSize(layout.cacheSize);
- this->allLinkeditInLastSubCache = this->cacheSize <= CacheVMSize(4_GB);
}
//