aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2022-09-04 20:22:21 +0100
committerIain Sandoe <iain@sandoe.co.uk>2022-09-04 20:49:01 +0100
commitaf9587ff0f261b8810a179a1369ae5a51dae99da (patch)
tree882b2111622c7b37d6e4c2922d2b3faf177a1a91
parent8293a9632c46c8f3f9d531c09194aa8738944927 (diff)
downloadgcc-af9587ff0f261b8810a179a1369ae5a51dae99da.zip
gcc-af9587ff0f261b8810a179a1369ae5a51dae99da.tar.gz
gcc-af9587ff0f261b8810a179a1369ae5a51dae99da.tar.bz2
[libsanitizer, Darwin] Fix bootstrap after recent merge.
The latest merge to libsanitizer includes changes to handle macOS 13+. However, these changes are incompatible with GCC and so we need to find an alternate solution. To restore bootstrap back this change out until the alternate can be found.
-rw-r--r--libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp62
1 files changed, 10 insertions, 52 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp b/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp
index 4b0e678..ba4259a 100644
--- a/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_procmaps_mac.cpp
@@ -146,8 +146,13 @@ static bool IsDyldHdr(const mach_header *hdr) {
// until we hit a Mach header matching dyld instead. These recurse
// calls are expensive, but the first memory map generation occurs
// early in the process, when dyld is one of the only images loaded,
-// so it will be hit after only a few iterations. These assumptions don't hold
-// on macOS 13+ anymore (dyld itself has moved into the shared cache).
+// so it will be hit after only a few iterations. These assumptions don't
+// hold on macOS 13+ anymore (dyld itself has moved into the shared cache).
+
+// FIXME: Unfortunately, the upstream revised version to deal with macOS 13+
+// is incompatible with GCC and also uses APIs not available on earlier
+// systems which we support; backed out for now.
+
static mach_header *GetDyldImageHeaderViaVMRegion() {
vm_address_t address = 0;
@@ -171,64 +176,17 @@ static mach_header *GetDyldImageHeaderViaVMRegion() {
}
}
-extern "C" {
-struct dyld_shared_cache_dylib_text_info {
- uint64_t version; // current version 2
- // following fields all exist in version 1
- uint64_t loadAddressUnslid;
- uint64_t textSegmentSize;
- uuid_t dylibUuid;
- const char *path; // pointer invalid at end of iterations
- // following fields all exist in version 2
- uint64_t textSegmentOffset; // offset from start of cache
-};
-typedef struct dyld_shared_cache_dylib_text_info
- dyld_shared_cache_dylib_text_info;
-
-extern bool _dyld_get_shared_cache_uuid(uuid_t uuid);
-extern const void *_dyld_get_shared_cache_range(size_t *length);
-extern int dyld_shared_cache_iterate_text(
- const uuid_t cacheUuid,
- void (^callback)(const dyld_shared_cache_dylib_text_info *info));
-} // extern "C"
-
-static mach_header *GetDyldImageHeaderViaSharedCache() {
- uuid_t uuid;
- bool hasCache = _dyld_get_shared_cache_uuid(uuid);
- if (!hasCache)
- return nullptr;
-
- size_t cacheLength;
- __block uptr cacheStart = (uptr)_dyld_get_shared_cache_range(&cacheLength);
- CHECK(cacheStart && cacheLength);
-
- __block mach_header *dyldHdr = nullptr;
- int res = dyld_shared_cache_iterate_text(
- uuid, ^(const dyld_shared_cache_dylib_text_info *info) {
- CHECK_GE(info->version, 2);
- mach_header *hdr =
- (mach_header *)(cacheStart + info->textSegmentOffset);
- if (IsDyldHdr(hdr))
- dyldHdr = hdr;
- });
- CHECK_EQ(res, 0);
-
- return dyldHdr;
-}
-
const mach_header *get_dyld_hdr() {
if (!dyld_hdr) {
// On macOS 13+, dyld itself has moved into the shared cache. Looking it up
// via vm_region_recurse_64() causes spins/hangs/crashes.
+ // FIXME: find a way to do this compatible with GCC.
if (GetMacosAlignedVersion() >= MacosVersion(13, 0)) {
- dyld_hdr = GetDyldImageHeaderViaSharedCache();
- if (!dyld_hdr) {
VReport(1,
- "Failed to lookup the dyld image header in the shared cache on "
- "macOS 13+ (or no shared cache in use). Falling back to "
+ "looking up the dyld image header in the shared cache on "
+ "macOS 13+ is not yet supported. Falling back to "
"lookup via vm_region_recurse_64().\n");
dyld_hdr = GetDyldImageHeaderViaVMRegion();
- }
} else {
dyld_hdr = GetDyldImageHeaderViaVMRegion();
}