Loading...
--- dyld/dyld-1340/cache_builder/Chunk.cpp
+++ /dev/null
@@ -1,1004 +0,0 @@
-/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
-*
-* Copyright (c) 2017 Apple Inc. All rights reserved.
-*
-* @APPLE_LICENSE_HEADER_START@
-*
-* This file contains Original Code and/or Modifications of Original Code
-* as defined in and that are subject to the Apple Public Source License
-* Version 2.0 (the 'License'). You may not use this file except in
-* compliance with the License. Please obtain a copy of the License at
-* http://www.opensource.apple.com/apsl/ and read it before using this
-* file.
-*
-* The Original Code and all software distributed under the License are
-* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-* Please see the License for the specific language governing rights and
-* limitations under the License.
-*
-* @APPLE_LICENSE_HEADER_END@
-*/
-
-#include "Chunk.h"
-#include "CodeSigningTypes.h"
-
-#include "BuilderConfig.h"
-
-#include <CommonCrypto/CommonHMAC.h>
-#include <CommonCrypto/CommonDigest.h>
-#include <CommonCrypto/CommonDigestSPI.h>
-
-using namespace cache_builder;
-
-//
-// MARK: --- Alignment ---
-//
-
-namespace cache_builder
-{
- namespace impl
- {
- // Many chunks are aligned for a variety of reasons. This tracks what alignments and why
- enum class Alignment
- {
- // The atom doesn't need any special alignment, or is guaranteed to be aligned for other reasons
- // eg, the cache header is always page aligned because its at the start of the buffer
- none = 1,
-
- // const char* only needs 1-byte alignment
- string = 1,
-
- // uleb's only need 1-byte alignment
- uleb = 1,
-
- // This chunk points to data which contains a uint64_t or similar, so needs 64-bit alignment
- struct64 = 8,
-
- // The objc runtime needs these to be 8-byte aligned for now. If we ever supported arm64_32,
- // those would need 16-byte alignment
- impCaches = 8,
-
- // Keep stubs 16-byte aligned to improve cache performance as then the whole stub will hopefully
- // be on the same cache line
- stubs = 16,
-
- // FIXME: Not sure why this is 16. Seems like 8 would be sufficient.
- nlist = 16,
-
- // This chunk points to data which contains a uint128_t or similar, so needs 128-bit alignment
- struct128 = 16,
-
- // Inside the cache there is minimal overhead for 16K alignment even on 4K hardware
- page = 16*1024,
- };
- } // namespace impl
-} // namespace cache_builder;
-
-using namespace cache_builder::impl;
-
-//
-// MARK: --- Chunk methods ---
-//
-
-Chunk::Chunk(Kind kind, uint64_t minAlignment)
- : kind(kind), minAlignment(minAlignment)
-{
-
-}
-
-Chunk::Chunk(Kind kind, Alignment minAlignment)
- : Chunk(kind, (uint64_t)minAlignment)
-{
-
-}
-
-Chunk::~Chunk()
-{
-
-}
-
-void Chunk::dump() const
-{
- printf("Chunk\n");
-}
-
-bool Chunk::isZeroFill() const
-{
- return false;
-}
-
-SlidChunk* Chunk::isSlidChunk()
-{
- return nullptr;
-}
-
-const AlignChunk* Chunk::isAlignChunk() const
-{
- return nullptr;
-}
-
-const DylibSegmentChunk* Chunk::isDylibSegmentChunk() const
-{
- return nullptr;
-}
-
-const LinkeditDataChunk* Chunk::isLinkeditDataChunk() const
-{
- return nullptr;
-}
-
-StubsChunk* Chunk::isStubsChunk()
-{
- return nullptr;
-}
-
-const DylibSegmentChunk* Chunk::isTPROChunk() const
-{
- return nullptr;
-}
-
-uint32_t Chunk::sortOrder() const
-{
- return (uint32_t)kind;
-}
-
-uint64_t Chunk::alignment() const
-{
- return this->minAlignment;
-}
-
-//
-// MARK: --- HeaderChunk methods ---
-//
-
-CacheHeaderChunk::CacheHeaderChunk()
- : Chunk(Kind::cacheHeader, Alignment::none)
-{
-}
-
-CacheHeaderChunk::~CacheHeaderChunk()
-{
-
-}
-
-void CacheHeaderChunk::dump() const
-{
- printf("HeaderChunk\n");
-}
-
-const char* CacheHeaderChunk::name() const
-{
- return "cache header";
-}
-
-//
-// MARK: --- SlideInfoChunk methods ---
-//
-
-SlideInfoChunk::SlideInfoChunk()
- : Chunk(Kind::slideInfo, Alignment::none)
-{
-}
-
-SlideInfoChunk::~SlideInfoChunk()
-{
-
-}
-
-void SlideInfoChunk::dump() const
-{
- printf("SlideInfoChunk\n");
-}
-
-const char* SlideInfoChunk::name() const
-{
- return "slide info";
-}
-
-//
-// MARK: --- CodeSignatureChunk methods ---
-//
-
-CodeSignatureChunk::CodeSignatureChunk()
- : Chunk(Kind::codeSignature, Alignment::none)
-{
-}
-
-CodeSignatureChunk::~CodeSignatureChunk()
-{
-
-}
-
-void CodeSignatureChunk::dump() const
-{
- printf("CodeSignatureChunk\n");
-}
-
-const char* CodeSignatureChunk::name() const
-{
- return "code signature";
-}
-
-//
-// MARK: --- SlidChunk methods ---
-//
-
-SlidChunk::SlidChunk(Kind kind, uint64_t minAlignment)
- : Chunk(kind, minAlignment)
-{
-}
-
-SlidChunk::~SlidChunk()
-{
-
-}
-
-void SlidChunk::dump() const
-{
- printf("SlidChunk\n");
-}
-
-SlidChunk* SlidChunk::isSlidChunk()
-{
- return this;
-}
-
-//
-// MARK: --- ObjCOptsHeaderChunk methods ---
-//
-
-ObjCOptsHeaderChunk::ObjCOptsHeaderChunk()
- : Chunk(Kind::objcOptsHeader, Alignment::struct64)
-{
-}
-
-ObjCOptsHeaderChunk::~ObjCOptsHeaderChunk()
-{
-
-}
-
-void ObjCOptsHeaderChunk::dump() const
-{
- printf("ObjCOptsHeaderChunk\n");
-}
-
-const char* ObjCOptsHeaderChunk::name() const
-{
- return "objc opts header";
-}
-
-//
-// MARK: --- ObjCImageInfoChunk methods ---
-//
-
-ObjCImageInfoChunk::ObjCImageInfoChunk()
- : Chunk(Kind::objcHeaderInfoRO, Alignment::struct64)
-{
-}
-
-ObjCImageInfoChunk::~ObjCImageInfoChunk()
-{
-
-}
-
-void ObjCImageInfoChunk::dump() const
-{
- printf("ObjCImageInfoChunk\n");
-}
-
-const char* ObjCImageInfoChunk::name() const
-{
- return "objc image info";
-}
-
-//
-// MARK: --- ObjCHeaderInfoReadOnlyChunk methods ---
-//
-
-ObjCHeaderInfoReadOnlyChunk::ObjCHeaderInfoReadOnlyChunk()
- : Chunk(Kind::objcHeaderInfoRO, Alignment::struct64)
-{
-}
-
-ObjCHeaderInfoReadOnlyChunk::~ObjCHeaderInfoReadOnlyChunk()
-{
-
-}
-
-void ObjCHeaderInfoReadOnlyChunk::dump() const
-{
- printf("ObjCHeaderInfoReadOnlyChunk\n");
-}
-
-const char* ObjCHeaderInfoReadOnlyChunk::name() const
-{
- return "objc headerinfo RO";
-}
-
-//
-// MARK: --- ObjCHeaderInfoReadWriteChunk methods ---
-//
-
-ObjCHeaderInfoReadWriteChunk::ObjCHeaderInfoReadWriteChunk()
- : SlidChunk(Kind::objcHeaderInfoRW, (uint64_t)Alignment::struct64)
-{
-}
-
-ObjCHeaderInfoReadWriteChunk::~ObjCHeaderInfoReadWriteChunk()
-{
-
-}
-
-void ObjCHeaderInfoReadWriteChunk::dump() const
-{
- printf("ObjCHeaderInfoReadWriteChunk\n");
-}
-
-const char* ObjCHeaderInfoReadWriteChunk::name() const
-{
- return "objc headerinfo RW";
-}
-
-//
-// MARK: --- ObjCStringsChunk methods ---
-//
-
-ObjCStringsChunk::ObjCStringsChunk()
- : Chunk(Kind::objcStrings, Alignment::string)
-{
-}
-
-ObjCStringsChunk::~ObjCStringsChunk()
-{
-
-}
-
-void ObjCStringsChunk::dump() const
-{
- printf("ObjCStringsChunk\n");
-}
-
-const char* ObjCStringsChunk::name() const
-{
- return "objc strings";
-}
-
-//
-// MARK: --- ObjCSelectorHashTableChunk methods ---
-//
-
-ObjCSelectorHashTableChunk::ObjCSelectorHashTableChunk()
- : Chunk(Kind::objcSelectorsHashTable, Alignment::struct64)
-{
-}
-
-ObjCSelectorHashTableChunk::~ObjCSelectorHashTableChunk()
-{
-
-}
-
-void ObjCSelectorHashTableChunk::dump() const
-{
- printf("ObjCSelectorHashTableChunk\n");
-}
-
-const char* ObjCSelectorHashTableChunk::name() const
-{
- return "objc selector hash table";
-}
-
-//
-// MARK: --- ObjCClassHashTableChunk methods ---
-//
-
-ObjCClassHashTableChunk::ObjCClassHashTableChunk()
- : Chunk(Kind::objcClassesHashTable, Alignment::struct64)
-{
-}
-
-ObjCClassHashTableChunk::~ObjCClassHashTableChunk()
-{
-
-}
-
-void ObjCClassHashTableChunk::dump() const
-{
- printf("ObjCClassHashTableChunk\n");
-}
-
-const char* ObjCClassHashTableChunk::name() const
-{
- return "objc class hash table";
-}
-
-//
-// MARK: --- SwiftOptsHeaderChunk methods ---
-//
-
-SwiftOptsHeaderChunk::SwiftOptsHeaderChunk()
- : Chunk(Kind::swiftOptsHeader, Alignment::struct64)
-{
-}
-
-SwiftOptsHeaderChunk::~SwiftOptsHeaderChunk()
-{
-
-}
-
-void SwiftOptsHeaderChunk::dump() const
-{
- printf("SwiftOptsHeaderChunk\n");
-}
-
-const char* SwiftOptsHeaderChunk::name() const
-{
- return "swift opts header";
-}
-
-//
-// MARK: --- SwiftProtocolConformancesHashTableChunk methods ---
-//
-
-SwiftProtocolConformancesHashTableChunk::SwiftProtocolConformancesHashTableChunk()
- : Chunk(Kind::swiftConformanceHashTable, Alignment::struct64)
-{
-}
-
-SwiftProtocolConformancesHashTableChunk::~SwiftProtocolConformancesHashTableChunk()
-{
-
-}
-
-void SwiftProtocolConformancesHashTableChunk::dump() const
-{
- printf("SwiftProtocolConformancesHashTableChunk\n");
-}
-
-const char* SwiftProtocolConformancesHashTableChunk::name() const
-{
- return "swift conformance hash table";
-}
-
-//
-// MARK: --- PointerHashTableChunk methods ---
-//
-
-PointerHashTableChunk::PointerHashTableChunk()
- : Chunk(Kind::pointerHashTable, Alignment::struct64)
-{
-}
-
-PointerHashTableChunk::~PointerHashTableChunk()
-{
-
-}
-
-void PointerHashTableChunk::dump() const
-{
- printf("PointerHashTableChunk\n");
-}
-
-const char* PointerHashTableChunk::name() const
-{
- return "pointer hash table";
-}
-
-//
-// MARK: --- ObjCProtocolHashTableChunk methods ---
-//
-
-ObjCProtocolHashTableChunk::ObjCProtocolHashTableChunk()
- : Chunk(Kind::objcProtocolsHashTable, Alignment::struct64)
-{
-}
-
-ObjCProtocolHashTableChunk::~ObjCProtocolHashTableChunk()
-{
-
-}
-
-void ObjCProtocolHashTableChunk::dump() const
-{
- printf("ObjCProtocolHashTableChunk\n");
-}
-
-const char* ObjCProtocolHashTableChunk::name() const
-{
- return "objc protocol hash table";
-}
-
-//
-// MARK: --- ObjCCanonicalProtocolsChunk methods ---
-//
-
-ObjCCanonicalProtocolsChunk::ObjCCanonicalProtocolsChunk()
- : SlidChunk(Kind::objcCanonicalProtocols, (uint64_t)Alignment::struct64)
-{
-}
-
-ObjCCanonicalProtocolsChunk::~ObjCCanonicalProtocolsChunk()
-{
-
-}
-
-void ObjCCanonicalProtocolsChunk::dump() const
-{
- printf("ObjCCanonicalProtocolsChunk\n");
-}
-
-const char* ObjCCanonicalProtocolsChunk::name() const
-{
- return "objc canonical protocols";
-}
-//
-// MARK: --- ObjCCategoriesChunk methods ---
-//
-
-ObjCPreAttachedCategoriesChunk::ObjCPreAttachedCategoriesChunk()
- : SlidChunk(Kind::objcPreAttachedCategories, (uint64_t)Alignment::struct64)
-{
-}
-
-ObjCPreAttachedCategoriesChunk::~ObjCPreAttachedCategoriesChunk()
-{
-
-}
-
-void ObjCPreAttachedCategoriesChunk::dump() const
-{
- printf("ObjCPreAttachedCategoriesChunk\n");
-}
-
-const char* ObjCPreAttachedCategoriesChunk::name() const
-{
- return "objc pre-attached categories";
-}
-
-
-//
-// MARK: --- ObjCIMPCachesChunk methods ---
-//
-
-ObjCIMPCachesChunk::ObjCIMPCachesChunk()
- : Chunk(Kind::objcIMPCaches, Alignment::impCaches)
-{
-}
-
-ObjCIMPCachesChunk::~ObjCIMPCachesChunk()
-{
-
-}
-
-void ObjCIMPCachesChunk::dump() const
-{
- printf("ObjCIMPCachesChunk\n");
-}
-
-const char* ObjCIMPCachesChunk::name() const
-{
- return "objc IMP caches";
-}
-
-//
-// MARK: --- CacheTrieChunk methods ---
-//
-
-CacheTrieChunk::CacheTrieChunk(Kind kind)
- : Chunk(kind, Alignment::uleb)
-{
-}
-
-CacheTrieChunk::~CacheTrieChunk()
-{
-
-}
-
-void CacheTrieChunk::dump() const
-{
- printf("CacheTrieChunk\n");
-}
-
-const char* CacheTrieChunk::name() const
-{
- return "cache dylibs trie";
-}
-
-//
-// MARK: --- PatchTableChunk methods ---
-//
-
-PatchTableChunk::PatchTableChunk()
- : Chunk(Kind::cachePatchTable, Alignment::struct64)
-{
-}
-
-PatchTableChunk::~PatchTableChunk()
-{
-
-}
-
-void PatchTableChunk::dump() const
-{
- printf("PatchTableChunk\n");
-}
-
-const char* PatchTableChunk::name() const
-{
- return "cache patch table";
-}
-
-
-//
-// MARK: --- FunctionVariantsPatchTableChunk methods ---
-//
-
-FunctionVariantsPatchTableChunk::FunctionVariantsPatchTableChunk()
-: Chunk(Kind::cacheFunctionVariantsPatchTable, Alignment::struct64)
-{
-}
-
-FunctionVariantsPatchTableChunk::~FunctionVariantsPatchTableChunk()
-{
-}
-
-void FunctionVariantsPatchTableChunk::dump() const
-{
- printf("FunctionVariantsPatchTableChunk\n");
-}
-
-const char* FunctionVariantsPatchTableChunk::name() const
-{
- return "function variants table";
-}
-
-
-//
-// MARK: --- PrebuiltLoaderChunk methods ---
-//
-
-PrebuiltLoaderChunk::PrebuiltLoaderChunk(Kind kind)
- : Chunk(kind, Alignment::struct128)
-{
-}
-
-PrebuiltLoaderChunk::~PrebuiltLoaderChunk()
-{
-
-}
-
-void PrebuiltLoaderChunk::dump() const
-{
- printf("PrebuiltLoaderChunk\n");
-}
-
-const char* PrebuiltLoaderChunk::name() const
-{
- return "cache dylib Loaders";
-}
-
-//
-// MARK: --- UnmappedSymbolsChunk methods ---
-//
-
-UnmappedSymbolsChunk::UnmappedSymbolsChunk()
- : Chunk(Kind::unmappedSymbols, Alignment::struct64)
-{
-}
-
-UnmappedSymbolsChunk::~UnmappedSymbolsChunk()
-{
-
-}
-
-void UnmappedSymbolsChunk::dump() const
-{
- printf("UnmappedSymbolsChunk\n");
-}
-
-const char* UnmappedSymbolsChunk::name() const
-{
- return "unmapped symbols";
-}
-
-//
-// MARK: --- SegmentInfo methods ---
-//
-
-DylibSegmentChunk::DylibSegmentChunk(Kind kind, uint64_t minAlignment)
- : SlidChunk(kind, minAlignment)
-{
-}
-
-DylibSegmentChunk::~DylibSegmentChunk()
-{
-
-}
-
-void DylibSegmentChunk::dump() const
-{
- printf("SegmentInfo\n");
-}
-
-const char* DylibSegmentChunk::name() const
-{
- return this->segmentName.data();
-}
-
-const DylibSegmentChunk* DylibSegmentChunk::isDylibSegmentChunk() const
-{
- return this;
-}
-
-const DylibSegmentChunk* DylibSegmentChunk::isTPROChunk() const
-{
- if ( this->kind == Kind::tproDataConst )
- return this;
- return nullptr;
-}
-
-//
-// MARK: --- LinkeditDataChunk methods ---
-//
-
-LinkeditDataChunk::LinkeditDataChunk(Kind kind, uint64_t minAlignment)
- : Chunk(kind, minAlignment)
-{
-}
-
-LinkeditDataChunk::~LinkeditDataChunk()
-{
-
-}
-
-void LinkeditDataChunk::dump() const
-{
- printf("LinkeditDataChunk\n");
-}
-
-const char* LinkeditDataChunk::name() const
-{
- const char* chunkName = nullptr;
- switch ( this->kind ) {
- case Chunk::Kind::linkeditSymbolNList:
- chunkName = "linkedit nlist";
- break;
- case Chunk::Kind::linkeditSymbolStrings:
- chunkName = "linkedit symbol strings";
- break;
- case Chunk::Kind::linkeditIndirectSymbols:
- chunkName = "linkedit indirect symbols";
- break;
- case Chunk::Kind::linkeditFunctionStarts:
- chunkName = "linkedit function starts";
- break;
- case Chunk::Kind::linkeditDataInCode:
- chunkName = "linkedit data-in-code";
- break;
- case Chunk::Kind::linkeditFunctionVariants :
- chunkName = "linkedit function-variants-table";
- break;
- case Chunk::Kind::linkeditExportTrie:
- chunkName = "linkedit export trie";
- break;
- default:
- assert("unknown linkedit chunk");
- break;
- }
- return chunkName;
-}
-
-const LinkeditDataChunk* LinkeditDataChunk::isLinkeditDataChunk() const
-{
- return this;
-}
-
-bool LinkeditDataChunk::isIndirectSymbols() const
-{
- return this->kind == Chunk::Kind::linkeditIndirectSymbols;
-}
-
-bool LinkeditDataChunk::isNList() const
-{
- return this->kind == Chunk::Kind::linkeditSymbolNList;
-}
-
-bool LinkeditDataChunk::isNSymbolStrings() const
-{
- return this->kind == Chunk::Kind::linkeditSymbolStrings;
-}
-
-bool LinkeditDataChunk::isFunctionVariantsTable() const
-{
- return this->kind == Chunk::Kind::linkeditFunctionVariants;
-}
-
-
-//
-// MARK: --- NListChunk methods ---
-//
-
-NListChunk::NListChunk()
- : Chunk(Kind::optimizedSymbolNList, Alignment::nlist)
-{
-}
-
-NListChunk::~NListChunk()
-{
-
-}
-
-void NListChunk::dump() const
-{
- printf("NListChunk\n");
-}
-
-const char* NListChunk::name() const
-{
- return "optimized nlist";
-}
-
-//
-// MARK: --- SymbolStringsChunk methods ---
-//
-
-SymbolStringsChunk::SymbolStringsChunk()
- : Chunk(Kind::optimizedSymbolStrings, Alignment::uleb)
-{
-}
-
-SymbolStringsChunk::~SymbolStringsChunk()
-{
-
-}
-
-void SymbolStringsChunk::dump() const
-{
- printf("SymbolStringsChunk\n");
-}
-
-const char* SymbolStringsChunk::name() const
-{
- return "optimize symbol strings";
-}
-
-//
-// MARK: --- UniquedGOTsChunk methods ---
-//
-
-UniquedGOTsChunk::UniquedGOTsChunk()
- : SlidChunk(Kind::uniquedGOTs, (uint64_t)Alignment::struct64)
-{
-}
-
-UniquedGOTsChunk::~UniquedGOTsChunk()
-{
-
-}
-
-void UniquedGOTsChunk::dump() const
-{
- printf("UniquedGOTsChunk\n");
-}
-
-const char* UniquedGOTsChunk::name() const
-{
- return "uniqued GOTs";
-}
-
-//
-// MARK: --- StubsChunk methods ---
-//
-
-StubsChunk::StubsChunk()
- : Chunk(Kind::stubs, Alignment::stubs)
-{
-}
-
-StubsChunk::~StubsChunk()
-{
-
-}
-
-void StubsChunk::dump() const
-{
- printf("StubsChunk\n");
-}
-
-const char* StubsChunk::name() const
-{
- return "stubs";
-}
-
-StubsChunk* StubsChunk::isStubsChunk()
-{
- return this;
-}
-
-//
-// MARK: --- StubsChunk methods ---
-//
-
-DynamicConfigChunk::DynamicConfigChunk()
- : Chunk(Kind::dynamicConfig, Alignment::page)
-{
-}
-
-DynamicConfigChunk::~DynamicConfigChunk()
-{
-
-}
-
-void DynamicConfigChunk::dump() const
-{
- printf("DynamicConfigChunk\n");
-}
-
-const char* DynamicConfigChunk::name() const
-{
- return "dynamic configuration content";
-}
-
-// DynamicConfigChunk takes up no space in the file, but does take up VM space
-// It will be checked to ensure that its always at the end of its Region
-bool DynamicConfigChunk::isZeroFill() const
-{
- return true;
-}
-
-//
-// MARK: --- AlignChunk methods ---
-//
-
-AlignChunk::AlignChunk()
- : Chunk(Kind::align, Alignment::page)
-{
- // This never has a size so just set it now
- this->cacheVMSize = CacheVMSize(0ULL);
- this->subCacheFileSize = CacheFileSize(0ULL);
-}
-
-AlignChunk::~AlignChunk()
-{
-
-}
-
-void AlignChunk::dump() const
-{
- printf("AlignChunk\n");
-}
-
-const char* AlignChunk::name() const
-{
- return "align";
-}
-
-const AlignChunk* AlignChunk::isAlignChunk() const {
- return this;
-}
-
-//
-// MARK: --- PrewarmingChunk methods ---
-//
-
-PrewarmingChunk::PrewarmingChunk(Kind kind)
- : Chunk(kind, Alignment::uleb)
-{
-}
-
-PrewarmingChunk::~PrewarmingChunk()
-{
-
-}
-
-void PrewarmingChunk::dump() const
-{
- printf("PrewarmingChunk\n");
-}
-
-const char* PrewarmingChunk::name() const
-{
- return "prewarming data";
-}