Loading...
dyld/DebuggerSupport.cpp dyld-1340 /dev/null
--- dyld/dyld-1340/dyld/DebuggerSupport.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
- *
- * Copyright (c) 2004-2009 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 <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <mach-o/loader.h>
-#include <mach-o/dyld_images.h>
-#include <TargetConditionals.h>
-#if !TARGET_OS_EXCLAVEKIT
-  #include <mach-o/dyld_process_info.h>
-  #include <mach/mach_time.h>
-#endif
-
-#include "Vector.h"
-#include "Tracing.h"
-#include "Array.h"
-#include "DebuggerSupport.h"
-#include "MachOFile.h"
-#include "dyld_process_info.h"
-
-using lsl::Vector;
-using lsl::Allocator;
-
-extern struct mach_header __dso_handle;
-
-// lldb sets a break point on this function
-extern "C" 	void _dyld_debugger_notification(enum dyld_notify_mode mode, unsigned long count, uint64_t machHeaders[]);
-
-namespace dyld4 {
-
-static Vector<dyld_image_info>*     sImageInfos    = nullptr;
-static Vector<dyld_uuid_info>*      sImageUUIDs    = nullptr;
-#if SUPPORT_ROSETTA
-static Vector<dyld_aot_image_info>* sAotImageInfos = nullptr;
-#endif
-
-
-void addNonSharedCacheImageUUID(Allocator& allocator, const dyld_uuid_info& info)
-{
-	// set uuidArray to NULL to denote it is in-use
-	gProcessInfo->uuidArray = NULL;
-
-	// append all new images
-    if ( sImageUUIDs == nullptr )
-        sImageUUIDs = Vector<dyld_uuid_info>::make(allocator);
-	sImageUUIDs->push_back(info);
-	gProcessInfo->uuidArrayCount = sImageUUIDs->size();
-
-	// set uuidArray back to base address of vector (other process can now read)
-	gProcessInfo->uuidArray = sImageUUIDs->begin();
-}
-
-void addImagesToAllImages(Allocator& persistentAllocator, uint32_t infoCount, const dyld_image_info info[], uint32_t initialImageCount)
-{
-	// set infoArray to NULL to denote it is in-use
-	gProcessInfo->infoArray = NULL;
-	
-	// append all new images
-    if ( sImageInfos == nullptr ) {
-        sImageInfos = Vector<dyld_image_info>::make(persistentAllocator);
-        sImageInfos->reserve(initialImageCount);
-    }
-	for (uint32_t i=0; i < infoCount; ++i)
-		sImageInfos->push_back(info[i]);
-	gProcessInfo->infoArrayCount = (uint32_t)sImageInfos->size();
-#if !TARGET_OS_EXCLAVEKIT
-	gProcessInfo->infoArrayChangeTimestamp = mach_absolute_time();
-#endif
-
-	// set infoArray back to base address of vector (other process can now read)
-	gProcessInfo->infoArray = sImageInfos->begin();
-}
-
-#if SUPPORT_ROSETTA
-void addAotImagesToAllAotImages(Allocator& allocator, uint32_t aotInfoCount, const dyld_aot_image_info aotInfo[])
-{
-    // rdar://74693049 (handle if aot_get_runtime_info() returns aot_image_count==0)
-    if ( aotInfoCount == 0 )
-        return;
-
-    // set aotInfoArray to NULL to denote it is in-use
-    gProcessInfo->aotInfoArray = NULL;
-
-    if ( sAotImageInfos == nullptr ) {
-        sAotImageInfos = Vector<dyld_aot_image_info>::make(allocator);
-        sAotImageInfos->reserve(256);
-    }
-    for (uint32_t i = 0; i < aotInfoCount; ++i) {
-        sAotImageInfos->push_back(aotInfo[i]);
-    }
-    gProcessInfo->aotInfoCount = (uint32_t)sAotImageInfos->size();
-#if !TARGET_OS_EXCLAVEKIT
-    gProcessInfo->aotInfoArrayChangeTimestamp = mach_absolute_time();
-#endif
-    // set aotInfoArray back to base address of vector (other process can now read)
-    gProcessInfo->aotInfoArray = sAotImageInfos->begin();
-}
-#endif
-
-#if TARGET_OS_SIMULATOR
-// called once during dyld_sim start up, to copy image list from host dyld to sImageInfos
-void syncProcessInfo(Allocator& allocator)
-{
-	// may want to set version field of gProcessInfo if it might be different than host
-    if ( sImageInfos == nullptr ) {
-        sImageInfos = Vector<dyld_image_info>::make(allocator);
-        sImageInfos->reserve(256);
-    }
-
-    if ( gProcessInfo->infoArray != NULL ) {
-        for (uint32_t i=0; i < gProcessInfo->infoArrayCount; ++i) {
-            sImageInfos->push_back(gProcessInfo->infoArray[i]);
-        }
-        gProcessInfo->infoArray      = sImageInfos->begin();
-        gProcessInfo->infoArrayCount = (uint32_t)sImageInfos->size();
-    }
-
-	gProcessInfo->notification(dyld_image_info_change, 0, NULL);
-}
-#endif
-
-#if SUPPORT_ROSETTA
-void removeAotImageFromAllAotImages(const mach_header* loadAddress)
-{
-    if ( sAotImageInfos == nullptr ) {
-        return;
-    }
-
-    // set aotInfoArray to NULL to denote it is in-use
-    gProcessInfo->aotInfoArray = NULL;
-
-    // remove image from aotInfoArray
-    for (auto it=sAotImageInfos->begin(); it != sAotImageInfos->end(); ++it) {
-        if ( it->aotLoadAddress == loadAddress ) {
-            sAotImageInfos->erase(it);
-            break;
-        }
-    }
-    gProcessInfo->aotInfoCount = (uint32_t)sAotImageInfos->size();
-#if !TARGET_OS_EXCLAVEKIT
-    gProcessInfo->aotInfoArrayChangeTimestamp  = mach_absolute_time();
-#endif
-    // set aotInfoArray back to base address of vector
-    gProcessInfo->aotInfoArray = sAotImageInfos->begin();
-}
-#endif
-
-void removeImageFromAllImages(const mach_header* loadAddress)
-{
-	dyld_image_info goingAway;
-	
-	// set infoArray to NULL to denote it is in-use
-	gProcessInfo->infoArray = NULL;
-	
-	// remove image from infoArray
-    for (auto it=sImageInfos->begin(); it != sImageInfos->end(); ++it) {
-		if ( it->imageLoadAddress == loadAddress ) {
-			goingAway = *it;
-			sImageInfos->erase(it);
-			break;
-		}
-	}
-	gProcessInfo->infoArrayCount = (uint32_t)sImageInfos->size();
-	
-	// set infoArray back to base address of vector
-	gProcessInfo->infoArray = sImageInfos->begin();
-
-	// set uuidArray to NULL to denote it is in-use
-	gProcessInfo->uuidArray = NULL;
-	
-	// remove image from uuidArray
-    for (auto it=sImageUUIDs->begin(); it != sImageUUIDs->end(); ++it) {
-		if ( it->imageLoadAddress == loadAddress ) {
-			sImageUUIDs->erase(it);
-			break;
-		}
-	}
-	gProcessInfo->uuidArrayCount = sImageUUIDs->size();
-#if !TARGET_OS_EXCLAVEKIT
-	gProcessInfo->infoArrayChangeTimestamp = mach_absolute_time();
-#endif
-	// set infoArray back to base address of vector
-	gProcessInfo->uuidArray = sImageUUIDs->begin();
-
-	// tell gdb that about the new images
-	gProcessInfo->notification(dyld_image_removing, 1, &goingAway);
-}
-
-} // namespace dyld4
-
-#if TARGET_OS_SIMULATOR
-    struct dyld_all_image_infos* gProcessInfo = nullptr;
-#else
-
-	void lldb_image_notifier(enum dyld_image_mode mode, uint32_t infoCount, const dyld_image_info info[])
-	{
-#if BUILDING_DYLD
-  #if !TARGET_OS_EXCLAVEKIT
-        dyld3::ScopedTimer timer(DBG_DYLD_GDB_IMAGE_NOTIFIER, 0, 0, 0);
-  #endif
-        uint64_t machHeaders[infoCount];
-		for (uint32_t i=0; i < infoCount; ++i) {
-			machHeaders[i] = (uintptr_t)(info[i].imageLoadAddress);
-		}
-    #if BUILDING_DYLD
-		switch ( mode ) {
-			 case dyld_image_adding:
-				_dyld_debugger_notification(dyld_notify_adding, infoCount, machHeaders);
-				break;
-			 case dyld_image_removing:
-				_dyld_debugger_notification(dyld_notify_removing, infoCount, machHeaders);
-				break;
-			 case dyld_image_dyld_moved:
-				_dyld_debugger_notification(dyld_notify_dyld_moved, infoCount, machHeaders);
-				break;
-			default:
-				break;
-		}
-    #endif
-		// do nothing
-		// gdb sets a break point here to catch notifications
-		//dyld::log("dyld: lldb_image_notifier(%s, %d, ...)\n", mode ? "dyld_image_removing" : "dyld_image_adding", infoCount);
-		//for (uint32_t i=0; i < infoCount; ++i)
-		//	dyld::log("dyld: %d loading at %p %s\n", i, info[i].imageLoadAddress, info[i].imageFilePath);
-		//for (uint32_t i=0; i < gProcessInfo->infoArrayCount; ++i)
-		//	dyld::log("dyld: %d loading at %p %s\n", i, gProcessInfo->infoArray[i].imageLoadAddress, gProcessInfo->infoArray[i].imageFilePath);
-#endif
-	}
-
-#define STR(s) # s
-#define XSTR(s) STR(s)
-
-#if defined(__cplusplus) && (BUILDING_LIBDYLD || BUILDING_DYLD)
-    #define MAYBE_ATOMIC(x) {x}
-#else
-    #define MAYBE_ATOMIC(x)  x
-#endif
-
-
-struct dyld_all_image_infos  dyld_all_image_infos __attribute__ ((section ("__DATA,__all_image_info")))
-                            = {
-                                17, 0, MAYBE_ATOMIC(NULL), &lldb_image_notifier, false, false, (const mach_header*)&__dso_handle, NULL,
-                                XSTR(DYLD_VERSION), NULL, 0, NULL, 0, 0, NULL, &dyld_all_image_infos,
-                                0, 0, NULL, NULL, NULL, 0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
-                                0, MAYBE_ATOMIC(0), "/usr/lib/dyld", {0}, {0}, 0, 0, NULL, 0
-                                };
-
-struct dyld_shared_cache_ranges dyld_shared_cache_ranges;
-
-struct dyld_all_image_infos* gProcessInfo = &dyld_all_image_infos;
-
-#endif