forked from OSchip/llvm-project
[Apple Silicon] Initial support for Rosetta
Translated processes talk with a different debugserver, shipped with macOS 11. This patch detects whether a process is translated and attaches to the correct debugserver implementation. It's the first patch of a series. Tested on the lldb test suite. Differential Revision: https://reviews.llvm.org/D82491
This commit is contained in:
parent
35bb9bfbb0
commit
fd19ddb8f2
|
@ -17,6 +17,7 @@
|
|||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
|
@ -3432,6 +3433,23 @@ Status ProcessGDBRemote::LaunchAndConnectToDebugserver(
|
|||
std::bind(MonitorDebugserverProcess, this_wp, _1, _2, _3, _4), false);
|
||||
debugserver_launch_info.SetUserID(process_info.GetUserID());
|
||||
|
||||
#if defined(__APPLE__)
|
||||
// On macOS 11, we need to support x86_64 applications translated to
|
||||
// arm64. We check whether a binary is translated and spawn the correct
|
||||
// debugserver accordingly.
|
||||
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID,
|
||||
static_cast<int>(process_info.GetProcessID()) };
|
||||
struct kinfo_proc processInfo;
|
||||
size_t bufsize = sizeof(processInfo);
|
||||
if (sysctl(mib, (unsigned)(sizeof(mib)/sizeof(int)), &processInfo,
|
||||
&bufsize, NULL, 0) == 0 && bufsize > 0) {
|
||||
if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
|
||||
FileSpec rosetta_debugserver("/Library/Apple/usr/libexec/oah/debugserver");
|
||||
debugserver_launch_info.SetExecutableFile(rosetta_debugserver, false);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int communication_fd = -1;
|
||||
#ifdef USE_SOCKETPAIR_FOR_LOCAL_CONNECTION
|
||||
// Use a socketpair on non-Windows systems for security and performance
|
||||
|
|
Loading…
Reference in New Issue