[Lldb-commits] [lldb] r334611 - Add modules support for lldb headers in include/
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Wed Jun 13 08:50:45 PDT 2018
Author: teemperor
Date: Wed Jun 13 08:50:45 2018
New Revision: 334611
URL: http://llvm.org/viewvc/llvm-project?rev=334611&view=rev
Log:
Add modules support for lldb headers in include/
Summary:
This patch adds a modulemap which allows compiling the lldb headers into C++ modules
(for example in builds with LLVM_ENABLE_MODULES=On).
Even though most of the affected code has been cleaned up to work with the more strict
C++ module semantics, there are still some workarounds left in the current modulemap
(the most obvious one is the big `lldb` wrapper module).
It also moves the Obj-C++ files in lldb to their own subdirectories. This was necessary
because we need to filter out the modules flags for this code.
Note: With the latest clang and libstdc++ it seems necessary to have a STL C++ module
to get a working LLVM_ENABLE_MODULES build for lldb. Otherwise clang will falsely
detect ODR violations in the textually included STL code inside the lldb modules.
Reviewers: aprantl, bruno
Reviewed By: aprantl, bruno
Subscribers: mgorny, yamaguchi, v.g.vassilev, lldb-commits
Differential Revision: https://reviews.llvm.org/D47929
Added:
lldb/trunk/include/lldb/module.modulemap
lldb/trunk/source/Host/macosx/objcxx/
lldb/trunk/source/Host/macosx/objcxx/CMakeLists.txt
lldb/trunk/source/Host/macosx/objcxx/Host.mm
- copied, changed from r334557, lldb/trunk/source/Host/macosx/Host.mm
lldb/trunk/source/Host/macosx/objcxx/HostInfoMacOSX.mm
- copied, changed from r334557, lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm
lldb/trunk/source/Host/macosx/objcxx/HostThreadMacOSX.mm
- copied, changed from r334557, lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm
lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/
lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/CMakeLists.txt
lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm
- copied, changed from r334557, lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm
Removed:
lldb/trunk/source/Host/macosx/Host.mm
lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm
lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm
lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm
Modified:
lldb/trunk/source/Host/CMakeLists.txt
lldb/trunk/source/Host/common/Terminal.cpp
lldb/trunk/source/Plugins/Platform/MacOSX/CMakeLists.txt
Added: lldb/trunk/include/lldb/module.modulemap
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/module.modulemap?rev=334611&view=auto
==============================================================================
--- lldb/trunk/include/lldb/module.modulemap (added)
+++ lldb/trunk/include/lldb/module.modulemap Wed Jun 13 08:50:45 2018
@@ -0,0 +1,139 @@
+
+module lldb_API {
+ requires cplusplus
+
+ umbrella "API"
+ module * { export * }
+}
+
+module lldb_Host {
+ requires cplusplus
+
+ // Because we have OS-specific headers in Host, we just list
+ // all OS-independent headers here that will include the correct
+ // OS-specific header for us.
+ module ConnectionFileDescriptor { header "Host/ConnectionFileDescriptor.h" export * }
+ module Debug { header "Host/Debug.h" export * }
+ module Editline { header "Host/Editline.h" export * }
+ module FileCache { header "Host/FileCache.h" export * }
+ module File { header "Host/File.h" export * }
+ module FileSystem { header "Host/FileSystem.h" export * }
+ module HostGetOpt { header "Host/HostGetOpt.h" export * }
+ module Host { header "Host/Host.h" export * }
+ module HostInfoBase { header "Host/HostInfoBase.h" export * }
+ module HostInfo { header "Host/HostInfo.h" export * }
+ module HostNativeProcessBase { header "Host/HostNativeProcessBase.h" export * }
+ module HostNativeProcess { header "Host/HostNativeProcess.h" export * }
+ module HostNativeThreadBase { header "Host/HostNativeThreadBase.h" export * }
+ module HostNativeThreadForward { header "Host/HostNativeThreadForward.h" export * }
+ module HostNativeThread { header "Host/HostNativeThread.h" export * }
+ module HostProcess { header "Host/HostProcess.h" export * }
+ module HostThread { header "Host/HostThread.h" export * }
+ module LockFileBase { header "Host/LockFileBase.h" export * }
+ module LockFile { header "Host/LockFile.h" export * }
+ module MainLoopBase { header "Host/MainLoopBase.h" export * }
+ module MainLoop { header "Host/MainLoop.h" export * }
+ module MonitoringProcessLauncher { header "Host/MonitoringProcessLauncher.h" export * }
+ module OptionParser { header "Host/OptionParser.h" export * }
+ module PipeBase { header "Host/PipeBase.h" export * }
+ module Pipe { header "Host/Pipe.h" export * }
+ module PosixApi { header "Host/PosixApi.h" export * }
+ module Predicate { header "Host/Predicate.h" export * }
+ module ProcessLauncher { header "Host/ProcessLauncher.h" export * }
+ module ProcessRunLock { header "Host/ProcessRunLock.h" export * }
+ module PseudoTerminal { header "Host/PseudoTerminal.h" export * }
+ module SocketAddress { header "Host/SocketAddress.h" export * }
+ module Socket { header "Host/Socket.h" export * }
+ module StringConvert { header "Host/StringConvert.h" export * }
+ module Symbols { header "Host/Symbols.h" export * }
+ module TaskPool { header "Host/TaskPool.h" export * }
+ module Terminal { header "Host/Terminal.h" export * }
+ module ThreadLauncher { header "Host/ThreadLauncher.h" export * }
+ module Time { header "Host/Time.h" export * }
+ module XML { header "Host/XML.h" export * }
+
+ export *
+}
+
+module lldb_Initialization {
+ requires cplusplus
+
+ umbrella "Initialization"
+ module * { export * }
+}
+
+
+module lldb_Wrapper {
+
+ module lldb_Breakpoint {
+ requires cplusplus
+
+ umbrella "Breakpoint"
+ module * { export * }
+ }
+
+ module lldb_Core {
+ requires cplusplus
+
+ umbrella "Core"
+ module * { export * }
+ }
+
+ module lldb_DataFormatters {
+ requires cplusplus
+
+ umbrella "DataFormatters"
+ module * { export * }
+ }
+
+ module lldb_Expression {
+ requires cplusplus
+
+ umbrella "Expression"
+ module * { export * }
+ // TODO: This file includes a non-public header.
+ exclude header "Expression/REPL.h"
+ }
+
+ module lldb_Interpreter {
+ requires cplusplus
+
+ umbrella "Interpreter"
+ module * { export * }
+ }
+
+ module lldb_Symbol {
+ requires cplusplus
+
+ umbrella "Symbol"
+ module * { export * }
+ }
+ module lldb_Target {
+ requires cplusplus
+
+ umbrella "Target"
+ module * { export * }
+ }
+}
+
+
+module lldb_Utility {
+ requires cplusplus
+
+ umbrella "Utility"
+ module * { export * }
+
+ module lldb_defines { header "lldb-defines.h" export * }
+ module lldb_enumerations { header "lldb-enumerations.h" export * }
+ module lldb_forward { header "lldb-forward.h" export * }
+ module lldb_private_enumerations { header "lldb-private-enumerations.h" export * }
+ module lldb_private_defines { header "lldb-private-defines.h" export * }
+ module lldb_private_forward { header "lldb-private-forward.h" export * }
+ module lldb_private { header "lldb-private.h" export * }
+ module lldb_private_interfaces { header "lldb-private-interfaces.h" export * }
+ module lldb_private_types { header "lldb-private-types.h" export * }
+ module lldb_public { header "lldb-public.h" export * }
+ module lldb_types { header "lldb-types.h" export * }
+ module lldb_versioning { header "lldb-versioning.h" export * }
+
+}
Modified: lldb/trunk/source/Host/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/CMakeLists.txt?rev=334611&r1=334610&r2=334611&view=diff
==============================================================================
--- lldb/trunk/source/Host/CMakeLists.txt (original)
+++ lldb/trunk/source/Host/CMakeLists.txt Wed Jun 13 08:50:45 2018
@@ -3,6 +3,18 @@ macro(add_host_subdirectory group)
source_group(${group} FILES ${ARGN})
endmacro()
+# Removes all module flags from the current CMAKE_CXX_FLAGS. Used for
+# the Objective-C++ code in lldb which we don't want to build with modules.
+# Reasons for this are that modules with Objective-C++ would require that
+# all LLVM/Clang modules are Objective-C++ compatible (which they are likely
+# not) and we would have rebuild a second set of modules just for the few
+# Objective-C++ files in lldb (which slows down the build process).
+macro(remove_module_flags)
+ string(REGEX REPLACE "-fmodules-cache-path=[^ ]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ string(REGEX REPLACE "-fmodules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ string(REGEX REPLACE "-fcxx-modules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+endmacro()
+
add_host_subdirectory(common
common/File.cpp
common/FileCache.cpp
@@ -92,10 +104,9 @@ else()
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
include_directories(SYSTEM ${LIBXML2_INCLUDE_DIR})
- add_host_subdirectory(macosx
- macosx/Host.mm
- macosx/HostInfoMacOSX.mm
- macosx/HostThreadMacOSX.mm
+ add_subdirectory(macosx/objcxx)
+ set(LLDBObjCLibs lldbHostMacOSXObjCXX)
+ add_host_subdirectory(maqcosx
macosx/Symbols.cpp
macosx/cfcpp/CFCBundle.cpp
macosx/cfcpp/CFCData.cpp
@@ -177,7 +188,7 @@ endif()
add_lldb_library(lldbHost
${HOST_SOURCES}
-
+
LINK_LIBS
lldbCore
lldbSymbol
@@ -185,7 +196,8 @@ add_lldb_library(lldbHost
lldbUtility
${LLDB_PLUGINS}
${EXTRA_LIBS}
-
+ ${LLDBObjCLibs}
+
LINK_COMPONENTS
Object
Support
Modified: lldb/trunk/source/Host/common/Terminal.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Terminal.cpp?rev=334611&r1=334610&r2=334611&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Terminal.cpp (original)
+++ lldb/trunk/source/Host/common/Terminal.cpp Wed Jun 13 08:50:45 2018
@@ -9,6 +9,7 @@
#include "lldb/Host/Terminal.h"
+#include "lldb/Host/Config.h"
#include "lldb/Host/PosixApi.h"
#include "llvm/ADT/STLExtras.h"
Removed: lldb/trunk/source/Host/macosx/Host.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Host.mm?rev=334610&view=auto
==============================================================================
--- lldb/trunk/source/Host/macosx/Host.mm (original)
+++ lldb/trunk/source/Host/macosx/Host.mm (removed)
@@ -1,1530 +0,0 @@
-//===-- Host.mm -------------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Host/Host.h"
-
-#include <AvailabilityMacros.h>
-
-#if !defined(MAC_OS_X_VERSION_10_7) || \
- MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
-#define NO_XPC_SERVICES 1
-#endif
-
-#if !defined(NO_XPC_SERVICES)
-#define __XPC_PRIVATE_H__
-#include <xpc/xpc.h>
-
-#define LaunchUsingXPCRightName "com.apple.lldb.RootDebuggingXPCService"
-
-// These XPC messaging keys are used for communication between Host.mm and the
-// XPC service.
-#define LauncherXPCServiceAuthKey "auth-key"
-#define LauncherXPCServiceArgPrefxKey "arg"
-#define LauncherXPCServiceEnvPrefxKey "env"
-#define LauncherXPCServiceCPUTypeKey "cpuType"
-#define LauncherXPCServicePosixspawnFlagsKey "posixspawnFlags"
-#define LauncherXPCServiceStdInPathKeyKey "stdInPath"
-#define LauncherXPCServiceStdOutPathKeyKey "stdOutPath"
-#define LauncherXPCServiceStdErrPathKeyKey "stdErrPath"
-#define LauncherXPCServiceChildPIDKey "childPID"
-#define LauncherXPCServiceErrorTypeKey "errorType"
-#define LauncherXPCServiceCodeTypeKey "errorCode"
-
-#endif
-
-#include "llvm/Support/Host.h"
-
-#include <asl.h>
-#include <crt_externs.h>
-#include <grp.h>
-#include <libproc.h>
-#include <pwd.h>
-#include <spawn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/proc.h>
-#include <sys/stat.h>
-#include <sys/sysctl.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "lldb/Host/ConnectionFileDescriptor.h"
-#include "lldb/Host/HostInfo.h"
-#include "lldb/Host/ThreadLauncher.h"
-#include "lldb/Target/ProcessLaunchInfo.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Utility/ArchSpec.h"
-#include "lldb/Utility/CleanUp.h"
-#include "lldb/Utility/DataBufferHeap.h"
-#include "lldb/Utility/DataExtractor.h"
-#include "lldb/Utility/Endian.h"
-#include "lldb/Utility/FileSpec.h"
-#include "lldb/Utility/Log.h"
-#include "lldb/Utility/NameMatches.h"
-#include "lldb/Utility/StreamString.h"
-#include "lldb/Utility/StructuredData.h"
-#include "lldb/lldb-defines.h"
-
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Errno.h"
-
-#include "cfcpp/CFCBundle.h"
-#include "cfcpp/CFCMutableArray.h"
-#include "cfcpp/CFCMutableDictionary.h"
-#include "cfcpp/CFCReleaser.h"
-#include "cfcpp/CFCString.h"
-
-#include <objc/objc-auto.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <Foundation/Foundation.h>
-
-#ifndef _POSIX_SPAWN_DISABLE_ASLR
-#define _POSIX_SPAWN_DISABLE_ASLR 0x0100
-#endif
-
-extern "C" {
-int __pthread_chdir(const char *path);
-int __pthread_fchdir(int fildes);
-}
-
-using namespace lldb;
-using namespace lldb_private;
-
-bool Host::GetBundleDirectory(const FileSpec &file,
- FileSpec &bundle_directory) {
-#if defined(__APPLE__)
- if (llvm::sys::fs::is_directory(file.GetPath())) {
- char path[PATH_MAX];
- if (file.GetPath(path, sizeof(path))) {
- CFCBundle bundle(path);
- if (bundle.GetPath(path, sizeof(path))) {
- bundle_directory.SetFile(path, false);
- return true;
- }
- }
- }
-#endif
- bundle_directory.Clear();
- return false;
-}
-
-bool Host::ResolveExecutableInBundle(FileSpec &file) {
-#if defined(__APPLE__)
- if (llvm::sys::fs::is_directory(file.GetPath())) {
- char path[PATH_MAX];
- if (file.GetPath(path, sizeof(path))) {
- CFCBundle bundle(path);
- CFCReleaser<CFURLRef> url(bundle.CopyExecutableURL());
- if (url.get()) {
- if (::CFURLGetFileSystemRepresentation(url.get(), YES, (UInt8 *)path,
- sizeof(path))) {
- file.SetFile(path, false);
- return true;
- }
- }
- }
- }
-#endif
- return false;
-}
-
-static void *AcceptPIDFromInferior(void *arg) {
- const char *connect_url = (const char *)arg;
- ConnectionFileDescriptor file_conn;
- Status error;
- if (file_conn.Connect(connect_url, &error) == eConnectionStatusSuccess) {
- char pid_str[256];
- ::memset(pid_str, 0, sizeof(pid_str));
- ConnectionStatus status;
- const size_t pid_str_len = file_conn.Read(
- pid_str, sizeof(pid_str), std::chrono::seconds(0), status, NULL);
- if (pid_str_len > 0) {
- int pid = atoi(pid_str);
- return (void *)(intptr_t)pid;
- }
- }
- return NULL;
-}
-
-static bool WaitForProcessToSIGSTOP(const lldb::pid_t pid,
- const int timeout_in_seconds) {
- const int time_delta_usecs = 100000;
- const int num_retries = timeout_in_seconds / time_delta_usecs;
- for (int i = 0; i < num_retries; i++) {
- struct proc_bsdinfo bsd_info;
- int error = ::proc_pidinfo(pid, PROC_PIDTBSDINFO, (uint64_t)0, &bsd_info,
- PROC_PIDTBSDINFO_SIZE);
-
- switch (error) {
- case EINVAL:
- case ENOTSUP:
- case ESRCH:
- case EPERM:
- return false;
-
- default:
- break;
-
- case 0:
- if (bsd_info.pbi_status == SSTOP)
- return true;
- }
- ::usleep(time_delta_usecs);
- }
- return false;
-}
-#if !defined(__arm__) && !defined(__arm64__) && !defined(__aarch64__)
-
-const char *applscript_in_new_tty = "tell application \"Terminal\"\n"
- " activate\n"
- " do script \"/bin/bash -c '%s';exit\"\n"
- "end tell\n";
-
-const char *applscript_in_existing_tty = "\
-set the_shell_script to \"/bin/bash -c '%s';exit\"\n\
-tell application \"Terminal\"\n\
- repeat with the_window in (get windows)\n\
- repeat with the_tab in tabs of the_window\n\
- set the_tty to tty in the_tab\n\
- if the_tty contains \"%s\" then\n\
- if the_tab is not busy then\n\
- set selected of the_tab to true\n\
- set frontmost of the_window to true\n\
- do script the_shell_script in the_tab\n\
- return\n\
- end if\n\
- end if\n\
- end repeat\n\
- end repeat\n\
- do script the_shell_script\n\
-end tell\n";
-
-static Status
-LaunchInNewTerminalWithAppleScript(const char *exe_path,
- ProcessLaunchInfo &launch_info) {
- Status error;
- char unix_socket_name[PATH_MAX] = "/tmp/XXXXXX";
- if (::mktemp(unix_socket_name) == NULL) {
- error.SetErrorString("failed to make temporary path for a unix socket");
- return error;
- }
-
- StreamString command;
- FileSpec darwin_debug_file_spec;
- if (!HostInfo::GetLLDBPath(ePathTypeSupportExecutableDir,
- darwin_debug_file_spec)) {
- error.SetErrorString("can't locate the 'darwin-debug' executable");
- return error;
- }
-
- darwin_debug_file_spec.GetFilename().SetCString("darwin-debug");
-
- if (!darwin_debug_file_spec.Exists()) {
- error.SetErrorStringWithFormat(
- "the 'darwin-debug' executable doesn't exists at '%s'",
- darwin_debug_file_spec.GetPath().c_str());
- return error;
- }
-
- char launcher_path[PATH_MAX];
- darwin_debug_file_spec.GetPath(launcher_path, sizeof(launcher_path));
-
- const ArchSpec &arch_spec = launch_info.GetArchitecture();
- // Only set the architecture if it is valid and if it isn't Haswell (x86_64h).
- if (arch_spec.IsValid() &&
- arch_spec.GetCore() != ArchSpec::eCore_x86_64_x86_64h)
- command.Printf("arch -arch %s ", arch_spec.GetArchitectureName());
-
- command.Printf("'%s' --unix-socket=%s", launcher_path, unix_socket_name);
-
- if (arch_spec.IsValid())
- command.Printf(" --arch=%s", arch_spec.GetArchitectureName());
-
- FileSpec working_dir{launch_info.GetWorkingDirectory()};
- if (working_dir)
- command.Printf(" --working-dir '%s'", working_dir.GetCString());
- else {
- char cwd[PATH_MAX];
- if (getcwd(cwd, PATH_MAX))
- command.Printf(" --working-dir '%s'", cwd);
- }
-
- if (launch_info.GetFlags().Test(eLaunchFlagDisableASLR))
- command.PutCString(" --disable-aslr");
-
- // We are launching on this host in a terminal. So compare the environment on
- // the host to what is supplied in the launch_info. Any items that aren't in
- // the host environment need to be sent to darwin-debug. If we send all
- // environment entries, we might blow the max command line length, so we only
- // send user modified entries.
- Environment host_env = Host::GetEnvironment();
-
- for (const auto &KV : launch_info.GetEnvironment()) {
- auto host_entry = host_env.find(KV.first());
- if (host_entry == host_env.end() || host_entry->second != KV.second)
- command.Format(" --env='{0}'", Environment::compose(KV));
- }
-
- command.PutCString(" -- ");
-
- const char **argv = launch_info.GetArguments().GetConstArgumentVector();
- if (argv) {
- for (size_t i = 0; argv[i] != NULL; ++i) {
- if (i == 0)
- command.Printf(" '%s'", exe_path);
- else
- command.Printf(" '%s'", argv[i]);
- }
- } else {
- command.Printf(" '%s'", exe_path);
- }
- command.PutCString(" ; echo Process exited with status $?");
- if (launch_info.GetFlags().Test(lldb::eLaunchFlagCloseTTYOnExit))
- command.PutCString(" ; exit");
-
- StreamString applescript_source;
-
- applescript_source.Printf(applscript_in_new_tty,
- command.GetString().str().c_str());
- NSAppleScript *applescript = [[NSAppleScript alloc]
- initWithSource:[NSString stringWithCString:applescript_source.GetString()
- .str()
- .c_str()
- encoding:NSUTF8StringEncoding]];
-
- lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
-
- Status lldb_error;
- // Sleep and wait a bit for debugserver to start to listen...
- ConnectionFileDescriptor file_conn;
- char connect_url[128];
- ::snprintf(connect_url, sizeof(connect_url), "unix-accept://%s",
- unix_socket_name);
-
- // Spawn a new thread to accept incoming connection on the connect_url
- // so we can grab the pid from the inferior. We have to do this because we
- // are sending an AppleScript that will launch a process in Terminal.app,
- // in a shell and the shell will fork/exec a couple of times before we get
- // to the process that we wanted to launch. So when our process actually
- // gets launched, we will handshake with it and get the process ID for it.
- HostThread accept_thread = ThreadLauncher::LaunchThread(
- unix_socket_name, AcceptPIDFromInferior, connect_url, &lldb_error);
-
- [applescript executeAndReturnError:nil];
-
- thread_result_t accept_thread_result = NULL;
- lldb_error = accept_thread.Join(&accept_thread_result);
- if (lldb_error.Success() && accept_thread_result) {
- pid = (intptr_t)accept_thread_result;
-
- // Wait for process to be stopped at the entry point by watching
- // for the process status to be set to SSTOP which indicates it it
- // SIGSTOP'ed at the entry point
- WaitForProcessToSIGSTOP(pid, 5);
- }
-
- llvm::sys::fs::remove(unix_socket_name);
- [applescript release];
- if (pid != LLDB_INVALID_PROCESS_ID)
- launch_info.SetProcessID(pid);
- return error;
-}
-
-#endif // #if !defined(__arm__) && !defined(__arm64__) && !defined(__aarch64__)
-
-bool Host::OpenFileInExternalEditor(const FileSpec &file_spec,
- uint32_t line_no) {
-#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
- return false;
-#else
- // We attach this to an 'odoc' event to specify a particular selection
- typedef struct {
- int16_t reserved0; // must be zero
- int16_t fLineNumber;
- int32_t fSelStart;
- int32_t fSelEnd;
- uint32_t reserved1; // must be zero
- uint32_t reserved2; // must be zero
- } BabelAESelInfo;
-
- Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_HOST));
- char file_path[PATH_MAX];
- file_spec.GetPath(file_path, PATH_MAX);
- CFCString file_cfstr(file_path, kCFStringEncodingUTF8);
- CFCReleaser<CFURLRef> file_URL(::CFURLCreateWithFileSystemPath(
- NULL, file_cfstr.get(), kCFURLPOSIXPathStyle, false));
-
- if (log)
- log->Printf(
- "Sending source file: \"%s\" and line: %d to external editor.\n",
- file_path, line_no);
-
- long error;
- BabelAESelInfo file_and_line_info = {
- 0, // reserved0
- (int16_t)(line_no - 1), // fLineNumber (zero based line number)
- 1, // fSelStart
- 1024, // fSelEnd
- 0, // reserved1
- 0 // reserved2
- };
-
- AEKeyDesc file_and_line_desc;
-
- error = ::AECreateDesc(typeUTF8Text, &file_and_line_info,
- sizeof(file_and_line_info),
- &(file_and_line_desc.descContent));
-
- if (error != noErr) {
- if (log)
- log->Printf("Error creating AEDesc: %ld.\n", error);
- return false;
- }
-
- file_and_line_desc.descKey = keyAEPosition;
-
- static std::string g_app_name;
- static FSRef g_app_fsref;
-
- LSApplicationParameters app_params;
- ::memset(&app_params, 0, sizeof(app_params));
- app_params.flags =
- kLSLaunchDefaults | kLSLaunchDontAddToRecents | kLSLaunchDontSwitch;
-
- char *external_editor = ::getenv("LLDB_EXTERNAL_EDITOR");
-
- if (external_editor) {
- if (log)
- log->Printf("Looking for external editor \"%s\".\n", external_editor);
-
- if (g_app_name.empty() ||
- strcmp(g_app_name.c_str(), external_editor) != 0) {
- CFCString editor_name(external_editor, kCFStringEncodingUTF8);
- error = ::LSFindApplicationForInfo(kLSUnknownCreator, NULL,
- editor_name.get(), &g_app_fsref, NULL);
-
- // If we found the app, then store away the name so we don't have to
- // re-look it up.
- if (error != noErr) {
- if (log)
- log->Printf(
- "Could not find External Editor application, error: %ld.\n",
- error);
- return false;
- }
- }
- app_params.application = &g_app_fsref;
- }
-
- ProcessSerialNumber psn;
- CFCReleaser<CFArrayRef> file_array(
- CFArrayCreate(NULL, (const void **)file_URL.ptr_address(false), 1, NULL));
- error = ::LSOpenURLsWithRole(file_array.get(), kLSRolesAll,
- &file_and_line_desc, &app_params, &psn, 1);
-
- AEDisposeDesc(&(file_and_line_desc.descContent));
-
- if (error != noErr) {
- if (log)
- log->Printf("LSOpenURLsWithRole failed, error: %ld.\n", error);
-
- return false;
- }
-
- return true;
-#endif // #if !defined(__arm__) && !defined(__arm64__) && !defined(__aarch64__)
-}
-
-Environment Host::GetEnvironment() { return Environment(*_NSGetEnviron()); }
-
-static bool GetMacOSXProcessCPUType(ProcessInstanceInfo &process_info) {
- if (process_info.ProcessIDIsValid()) {
- // Make a new mib to stay thread safe
- int mib[CTL_MAXNAME] = {
- 0,
- };
- size_t mib_len = CTL_MAXNAME;
- if (::sysctlnametomib("sysctl.proc_cputype", mib, &mib_len))
- return false;
-
- mib[mib_len] = process_info.GetProcessID();
- mib_len++;
-
- cpu_type_t cpu, sub = 0;
- size_t len = sizeof(cpu);
- if (::sysctl(mib, mib_len, &cpu, &len, 0, 0) == 0) {
- switch (cpu) {
- case CPU_TYPE_I386:
- sub = CPU_SUBTYPE_I386_ALL;
- break;
- case CPU_TYPE_X86_64:
- sub = CPU_SUBTYPE_X86_64_ALL;
- break;
-
-#if defined(CPU_TYPE_ARM64) && defined(CPU_SUBTYPE_ARM64_ALL)
- case CPU_TYPE_ARM64:
- sub = CPU_SUBTYPE_ARM64_ALL;
- break;
-#endif
-
- case CPU_TYPE_ARM: {
- // Note that we fetched the cpu type from the PROCESS but we can't get a
- // cpusubtype of the
- // process -- we can only get the host's cpu subtype.
- uint32_t cpusubtype = 0;
- len = sizeof(cpusubtype);
- if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0) == 0)
- sub = cpusubtype;
-
- bool host_cpu_is_64bit;
- uint32_t is64bit_capable;
- size_t is64bit_capable_len = sizeof(is64bit_capable);
- if (sysctlbyname("hw.cpu64bit_capable", &is64bit_capable,
- &is64bit_capable_len, NULL, 0) == 0)
- host_cpu_is_64bit = true;
- else
- host_cpu_is_64bit = false;
-
- // if the host is an armv8 device, its cpusubtype will be in
- // CPU_SUBTYPE_ARM64 numbering
- // and we need to rewrite it to a reasonable CPU_SUBTYPE_ARM value
- // instead.
-
- if (host_cpu_is_64bit) {
- sub = CPU_SUBTYPE_ARM_V7;
- }
- } break;
-
- default:
- break;
- }
- process_info.GetArchitecture().SetArchitecture(eArchTypeMachO, cpu, sub);
- return true;
- }
- }
- process_info.GetArchitecture().Clear();
- return false;
-}
-
-static bool GetMacOSXProcessArgs(const ProcessInstanceInfoMatch *match_info_ptr,
- ProcessInstanceInfo &process_info) {
- if (process_info.ProcessIDIsValid()) {
- int proc_args_mib[3] = {CTL_KERN, KERN_PROCARGS2,
- (int)process_info.GetProcessID()};
-
- size_t arg_data_size = 0;
- if (::sysctl(proc_args_mib, 3, nullptr, &arg_data_size, NULL, 0) ||
- arg_data_size == 0)
- arg_data_size = 8192;
-
- // Add a few bytes to the calculated length, I know we need to add at least
- // one byte
- // to this number otherwise we get junk back, so add 128 just in case...
- DataBufferHeap arg_data(arg_data_size + 128, 0);
- arg_data_size = arg_data.GetByteSize();
- if (::sysctl(proc_args_mib, 3, arg_data.GetBytes(), &arg_data_size, NULL,
- 0) == 0) {
- DataExtractor data(arg_data.GetBytes(), arg_data_size,
- endian::InlHostByteOrder(), sizeof(void *));
- lldb::offset_t offset = 0;
- uint32_t argc = data.GetU32(&offset);
- llvm::Triple &triple = process_info.GetArchitecture().GetTriple();
- const llvm::Triple::ArchType triple_arch = triple.getArch();
- const bool check_for_ios_simulator =
- (triple_arch == llvm::Triple::x86 ||
- triple_arch == llvm::Triple::x86_64);
- const char *cstr = data.GetCStr(&offset);
- if (cstr) {
- process_info.GetExecutableFile().SetFile(cstr, false);
-
- if (match_info_ptr == NULL ||
- NameMatches(
- process_info.GetExecutableFile().GetFilename().GetCString(),
- match_info_ptr->GetNameMatchType(),
- match_info_ptr->GetProcessInfo().GetName())) {
- // Skip NULLs
- while (1) {
- const uint8_t *p = data.PeekData(offset, 1);
- if ((p == NULL) || (*p != '\0'))
- break;
- ++offset;
- }
- // Now extract all arguments
- Args &proc_args = process_info.GetArguments();
- for (int i = 0; i < static_cast<int>(argc); ++i) {
- cstr = data.GetCStr(&offset);
- if (cstr)
- proc_args.AppendArgument(llvm::StringRef(cstr));
- }
-
- Environment &proc_env = process_info.GetEnvironment();
- while ((cstr = data.GetCStr(&offset))) {
- if (cstr[0] == '\0')
- break;
-
- if (check_for_ios_simulator) {
- if (strncmp(cstr, "SIMULATOR_UDID=", strlen("SIMULATOR_UDID=")) ==
- 0)
- process_info.GetArchitecture().GetTriple().setOS(
- llvm::Triple::IOS);
- else
- process_info.GetArchitecture().GetTriple().setOS(
- llvm::Triple::MacOSX);
- }
-
- proc_env.insert(cstr);
- }
- return true;
- }
- }
- }
- }
- return false;
-}
-
-static bool GetMacOSXProcessUserAndGroup(ProcessInstanceInfo &process_info) {
- if (process_info.ProcessIDIsValid()) {
- int mib[4];
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = process_info.GetProcessID();
- struct kinfo_proc proc_kinfo;
- size_t proc_kinfo_size = sizeof(struct kinfo_proc);
-
- if (::sysctl(mib, 4, &proc_kinfo, &proc_kinfo_size, NULL, 0) == 0) {
- if (proc_kinfo_size > 0) {
- process_info.SetParentProcessID(proc_kinfo.kp_eproc.e_ppid);
- process_info.SetUserID(proc_kinfo.kp_eproc.e_pcred.p_ruid);
- process_info.SetGroupID(proc_kinfo.kp_eproc.e_pcred.p_rgid);
- process_info.SetEffectiveUserID(proc_kinfo.kp_eproc.e_ucred.cr_uid);
- if (proc_kinfo.kp_eproc.e_ucred.cr_ngroups > 0)
- process_info.SetEffectiveGroupID(
- proc_kinfo.kp_eproc.e_ucred.cr_groups[0]);
- else
- process_info.SetEffectiveGroupID(UINT32_MAX);
- return true;
- }
- }
- }
- process_info.SetParentProcessID(LLDB_INVALID_PROCESS_ID);
- process_info.SetUserID(UINT32_MAX);
- process_info.SetGroupID(UINT32_MAX);
- process_info.SetEffectiveUserID(UINT32_MAX);
- process_info.SetEffectiveGroupID(UINT32_MAX);
- return false;
-}
-
-uint32_t Host::FindProcesses(const ProcessInstanceInfoMatch &match_info,
- ProcessInstanceInfoList &process_infos) {
- std::vector<struct kinfo_proc> kinfos;
-
- int mib[3] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL};
-
- size_t pid_data_size = 0;
- if (::sysctl(mib, 4, NULL, &pid_data_size, NULL, 0) != 0)
- return 0;
-
- // Add a few extra in case a few more show up
- const size_t estimated_pid_count =
- (pid_data_size / sizeof(struct kinfo_proc)) + 10;
-
- kinfos.resize(estimated_pid_count);
- pid_data_size = kinfos.size() * sizeof(struct kinfo_proc);
-
- if (::sysctl(mib, 4, &kinfos[0], &pid_data_size, NULL, 0) != 0)
- return 0;
-
- const size_t actual_pid_count = (pid_data_size / sizeof(struct kinfo_proc));
-
- bool all_users = match_info.GetMatchAllUsers();
- const lldb::pid_t our_pid = getpid();
- const uid_t our_uid = getuid();
- for (size_t i = 0; i < actual_pid_count; i++) {
- const struct kinfo_proc &kinfo = kinfos[i];
-
- bool kinfo_user_matches = false;
- if (all_users)
- kinfo_user_matches = true;
- else
- kinfo_user_matches = kinfo.kp_eproc.e_pcred.p_ruid == our_uid;
-
- // Special case, if lldb is being run as root we can attach to anything.
- if (our_uid == 0)
- kinfo_user_matches = true;
-
- if (kinfo_user_matches == false || // Make sure the user is acceptable
- static_cast<lldb::pid_t>(kinfo.kp_proc.p_pid) ==
- our_pid || // Skip this process
- kinfo.kp_proc.p_pid == 0 || // Skip kernel (kernel pid is zero)
- kinfo.kp_proc.p_stat == SZOMB || // Zombies are bad, they like brains...
- kinfo.kp_proc.p_flag & P_TRACED || // Being debugged?
- kinfo.kp_proc.p_flag & P_WEXIT || // Working on exiting?
- kinfo.kp_proc.p_flag & P_TRANSLATED) // Skip translated ppc (Rosetta)
- continue;
-
- ProcessInstanceInfo process_info;
- process_info.SetProcessID(kinfo.kp_proc.p_pid);
- process_info.SetParentProcessID(kinfo.kp_eproc.e_ppid);
- process_info.SetUserID(kinfo.kp_eproc.e_pcred.p_ruid);
- process_info.SetGroupID(kinfo.kp_eproc.e_pcred.p_rgid);
- process_info.SetEffectiveUserID(kinfo.kp_eproc.e_ucred.cr_uid);
- if (kinfo.kp_eproc.e_ucred.cr_ngroups > 0)
- process_info.SetEffectiveGroupID(kinfo.kp_eproc.e_ucred.cr_groups[0]);
- else
- process_info.SetEffectiveGroupID(UINT32_MAX);
-
- // Make sure our info matches before we go fetch the name and cpu type
- if (match_info.Matches(process_info)) {
- // Get CPU type first so we can know to look for iOS simulator is we have
- // x86 or x86_64
- if (GetMacOSXProcessCPUType(process_info)) {
- if (GetMacOSXProcessArgs(&match_info, process_info)) {
- if (match_info.Matches(process_info))
- process_infos.Append(process_info);
- }
- }
- }
- }
- return process_infos.GetSize();
-}
-
-bool Host::GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &process_info) {
- process_info.SetProcessID(pid);
- bool success = false;
-
- // Get CPU type first so we can know to look for iOS simulator is we have x86
- // or x86_64
- if (GetMacOSXProcessCPUType(process_info))
- success = true;
-
- if (GetMacOSXProcessArgs(NULL, process_info))
- success = true;
-
- if (GetMacOSXProcessUserAndGroup(process_info))
- success = true;
-
- if (success)
- return true;
-
- process_info.Clear();
- return false;
-}
-
-#if !NO_XPC_SERVICES
-static void PackageXPCArguments(xpc_object_t message, const char *prefix,
- const Args &args) {
- size_t count = args.GetArgumentCount();
- char buf[50]; // long enough for 'argXXX'
- memset(buf, 0, 50);
- sprintf(buf, "%sCount", prefix);
- xpc_dictionary_set_int64(message, buf, count);
- for (size_t i = 0; i < count; i++) {
- memset(buf, 0, 50);
- sprintf(buf, "%s%zi", prefix, i);
- xpc_dictionary_set_string(message, buf, args.GetArgumentAtIndex(i));
- }
-}
-
-static void PackageXPCEnvironment(xpc_object_t message, llvm::StringRef prefix,
- const Environment &env) {
- xpc_dictionary_set_int64(message, (prefix + "Count").str().c_str(),
- env.size());
- size_t i = 0;
- for (const auto &KV : env) {
- xpc_dictionary_set_string(message, (prefix + llvm::Twine(i)).str().c_str(),
- Environment::compose(KV).c_str());
- }
-}
-
-/*
- A valid authorizationRef means that
- - there is the LaunchUsingXPCRightName rights in the /etc/authorization
- - we have successfully copied the rights to be send over the XPC wire
- Once obtained, it will be valid for as long as the process lives.
- */
-static AuthorizationRef authorizationRef = NULL;
-static Status getXPCAuthorization(ProcessLaunchInfo &launch_info) {
- Status error;
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST |
- LIBLLDB_LOG_PROCESS));
-
- if ((launch_info.GetUserID() == 0) && !authorizationRef) {
- OSStatus createStatus =
- AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
- kAuthorizationFlagDefaults, &authorizationRef);
- if (createStatus != errAuthorizationSuccess) {
- error.SetError(1, eErrorTypeGeneric);
- error.SetErrorString("Can't create authorizationRef.");
- LLDB_LOG(log, "error: {0}", error);
- return error;
- }
-
- OSStatus rightsStatus =
- AuthorizationRightGet(LaunchUsingXPCRightName, NULL);
- if (rightsStatus != errAuthorizationSuccess) {
- // No rights in the security database, Create it with the right prompt.
- CFStringRef prompt =
- CFSTR("Xcode is trying to take control of a root process.");
- CFStringRef keys[] = {CFSTR("en")};
- CFTypeRef values[] = {prompt};
- CFDictionaryRef promptDict = CFDictionaryCreate(
- kCFAllocatorDefault, (const void **)keys, (const void **)values, 1,
- &kCFCopyStringDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
-
- CFStringRef keys1[] = {CFSTR("class"), CFSTR("group"), CFSTR("comment"),
- CFSTR("default-prompt"), CFSTR("shared")};
- CFTypeRef values1[] = {CFSTR("user"), CFSTR("admin"),
- CFSTR(LaunchUsingXPCRightName), promptDict,
- kCFBooleanFalse};
- CFDictionaryRef dict = CFDictionaryCreate(
- kCFAllocatorDefault, (const void **)keys1, (const void **)values1, 5,
- &kCFCopyStringDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
- rightsStatus = AuthorizationRightSet(
- authorizationRef, LaunchUsingXPCRightName, dict, NULL, NULL, NULL);
- CFRelease(promptDict);
- CFRelease(dict);
- }
-
- OSStatus copyRightStatus = errAuthorizationDenied;
- if (rightsStatus == errAuthorizationSuccess) {
- AuthorizationItem item1 = {LaunchUsingXPCRightName, 0, NULL, 0};
- AuthorizationItem items[] = {item1};
- AuthorizationRights requestedRights = {1, items};
- AuthorizationFlags authorizationFlags =
- kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
- copyRightStatus = AuthorizationCopyRights(
- authorizationRef, &requestedRights, kAuthorizationEmptyEnvironment,
- authorizationFlags, NULL);
- }
-
- if (copyRightStatus != errAuthorizationSuccess) {
- // Eventually when the commandline supports running as root and the user
- // is not
- // logged in in the current audit session, we will need the trick in gdb
- // where
- // we ask the user to type in the root passwd in the terminal.
- error.SetError(2, eErrorTypeGeneric);
- error.SetErrorStringWithFormat(
- "Launching as root needs root authorization.");
- LLDB_LOG(log, "error: {0}", error);
-
- if (authorizationRef) {
- AuthorizationFree(authorizationRef, kAuthorizationFlagDefaults);
- authorizationRef = NULL;
- }
- }
- }
-
- return error;
-}
-#endif
-
-static short GetPosixspawnFlags(const ProcessLaunchInfo &launch_info) {
- short flags = POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK;
-
- if (launch_info.GetFlags().Test(eLaunchFlagExec))
- flags |= POSIX_SPAWN_SETEXEC; // Darwin specific posix_spawn flag
-
- if (launch_info.GetFlags().Test(eLaunchFlagDebug))
- flags |= POSIX_SPAWN_START_SUSPENDED; // Darwin specific posix_spawn flag
-
- if (launch_info.GetFlags().Test(eLaunchFlagDisableASLR))
- flags |= _POSIX_SPAWN_DISABLE_ASLR; // Darwin specific posix_spawn flag
-
- if (launch_info.GetLaunchInSeparateProcessGroup())
- flags |= POSIX_SPAWN_SETPGROUP;
-
-#ifdef POSIX_SPAWN_CLOEXEC_DEFAULT
-#if defined(__x86_64__) || defined(__i386__)
- static LazyBool g_use_close_on_exec_flag = eLazyBoolCalculate;
- if (g_use_close_on_exec_flag == eLazyBoolCalculate) {
- g_use_close_on_exec_flag = eLazyBoolNo;
-
- uint32_t major, minor, update;
- if (HostInfo::GetOSVersion(major, minor, update)) {
- // Kernel panic if we use the POSIX_SPAWN_CLOEXEC_DEFAULT on 10.7 or
- // earlier
- if (major > 10 || (major == 10 && minor > 7)) {
- // Only enable for 10.8 and later OS versions
- g_use_close_on_exec_flag = eLazyBoolYes;
- }
- }
- }
-#else
- static LazyBool g_use_close_on_exec_flag = eLazyBoolYes;
-#endif // defined(__x86_64__) || defined(__i386__)
- // Close all files exception those with file actions if this is supported.
- if (g_use_close_on_exec_flag == eLazyBoolYes)
- flags |= POSIX_SPAWN_CLOEXEC_DEFAULT;
-#endif // ifdef POSIX_SPAWN_CLOEXEC_DEFAULT
- return flags;
-}
-
-static Status LaunchProcessXPC(const char *exe_path,
- ProcessLaunchInfo &launch_info,
- lldb::pid_t &pid) {
-#if !NO_XPC_SERVICES
- Status error = getXPCAuthorization(launch_info);
- if (error.Fail())
- return error;
-
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST |
- LIBLLDB_LOG_PROCESS));
-
- uid_t requested_uid = launch_info.GetUserID();
- const char *xpc_service = nil;
- bool send_auth = false;
- AuthorizationExternalForm extForm;
- if (requested_uid == 0) {
- if (AuthorizationMakeExternalForm(authorizationRef, &extForm) ==
- errAuthorizationSuccess) {
- send_auth = true;
- } else {
- error.SetError(3, eErrorTypeGeneric);
- error.SetErrorStringWithFormat("Launching root via XPC needs to "
- "externalize authorization reference.");
- LLDB_LOG(log, "error: {0}", error);
- return error;
- }
- xpc_service = LaunchUsingXPCRightName;
- } else {
- error.SetError(4, eErrorTypeGeneric);
- error.SetErrorStringWithFormat(
- "Launching via XPC is only currently available for root.");
- LLDB_LOG(log, "error: {0}", error);
- return error;
- }
-
- xpc_connection_t conn = xpc_connection_create(xpc_service, NULL);
-
- xpc_connection_set_event_handler(conn, ^(xpc_object_t event) {
- xpc_type_t type = xpc_get_type(event);
-
- if (type == XPC_TYPE_ERROR) {
- if (event == XPC_ERROR_CONNECTION_INTERRUPTED) {
- // The service has either canceled itself, crashed, or been terminated.
- // The XPC connection is still valid and sending a message to it will
- // re-launch the service.
- // If the service is state-full, this is the time to initialize the new
- // service.
- return;
- } else if (event == XPC_ERROR_CONNECTION_INVALID) {
- // The service is invalid. Either the service name supplied to
- // xpc_connection_create() is incorrect
- // or we (this process) have canceled the service; we can do any cleanup
- // of application state at this point.
- // printf("Service disconnected");
- return;
- } else {
- // printf("Unexpected error from service: %s",
- // xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
- }
-
- } else {
- // printf("Received unexpected event in handler");
- }
- });
-
- xpc_connection_set_finalizer_f(conn, xpc_finalizer_t(xpc_release));
- xpc_connection_resume(conn);
- xpc_object_t message = xpc_dictionary_create(nil, nil, 0);
-
- if (send_auth) {
- xpc_dictionary_set_data(message, LauncherXPCServiceAuthKey, extForm.bytes,
- sizeof(AuthorizationExternalForm));
- }
-
- PackageXPCArguments(message, LauncherXPCServiceArgPrefxKey,
- launch_info.GetArguments());
- PackageXPCEnvironment(message, LauncherXPCServiceEnvPrefxKey,
- launch_info.GetEnvironment());
-
- // Posix spawn stuff.
- xpc_dictionary_set_int64(message, LauncherXPCServiceCPUTypeKey,
- launch_info.GetArchitecture().GetMachOCPUType());
- xpc_dictionary_set_int64(message, LauncherXPCServicePosixspawnFlagsKey,
- GetPosixspawnFlags(launch_info));
- const FileAction *file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
- if (file_action && !file_action->GetPath().empty()) {
- xpc_dictionary_set_string(message, LauncherXPCServiceStdInPathKeyKey,
- file_action->GetPath().str().c_str());
- }
- file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
- if (file_action && !file_action->GetPath().empty()) {
- xpc_dictionary_set_string(message, LauncherXPCServiceStdOutPathKeyKey,
- file_action->GetPath().str().c_str());
- }
- file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
- if (file_action && !file_action->GetPath().empty()) {
- xpc_dictionary_set_string(message, LauncherXPCServiceStdErrPathKeyKey,
- file_action->GetPath().str().c_str());
- }
-
- xpc_object_t reply =
- xpc_connection_send_message_with_reply_sync(conn, message);
- xpc_type_t returnType = xpc_get_type(reply);
- if (returnType == XPC_TYPE_DICTIONARY) {
- pid = xpc_dictionary_get_int64(reply, LauncherXPCServiceChildPIDKey);
- if (pid == 0) {
- int errorType =
- xpc_dictionary_get_int64(reply, LauncherXPCServiceErrorTypeKey);
- int errorCode =
- xpc_dictionary_get_int64(reply, LauncherXPCServiceCodeTypeKey);
-
- error.SetError(errorCode, eErrorTypeGeneric);
- error.SetErrorStringWithFormat(
- "Problems with launching via XPC. Error type : %i, code : %i",
- errorType, errorCode);
- LLDB_LOG(log, "error: {0}", error);
-
- if (authorizationRef) {
- AuthorizationFree(authorizationRef, kAuthorizationFlagDefaults);
- authorizationRef = NULL;
- }
- }
- } else if (returnType == XPC_TYPE_ERROR) {
- error.SetError(5, eErrorTypeGeneric);
- error.SetErrorStringWithFormat(
- "Problems with launching via XPC. XPC error : %s",
- xpc_dictionary_get_string(reply, XPC_ERROR_KEY_DESCRIPTION));
- LLDB_LOG(log, "error: {0}", error);
- }
-
- return error;
-#else
- Status error;
- return error;
-#endif
-}
-
-static bool AddPosixSpawnFileAction(void *_file_actions, const FileAction *info,
- Log *log, Status &error) {
- if (info == NULL)
- return false;
-
- posix_spawn_file_actions_t *file_actions =
- reinterpret_cast<posix_spawn_file_actions_t *>(_file_actions);
-
- switch (info->GetAction()) {
- case FileAction::eFileActionNone:
- error.Clear();
- break;
-
- case FileAction::eFileActionClose:
- if (info->GetFD() == -1)
- error.SetErrorString(
- "invalid fd for posix_spawn_file_actions_addclose(...)");
- else {
- error.SetError(
- ::posix_spawn_file_actions_addclose(file_actions, info->GetFD()),
- eErrorTypePOSIX);
- if (error.Fail())
- LLDB_LOG(log,
- "error: {0}, posix_spawn_file_actions_addclose "
- "(action={1}, fd={2})",
- error, file_actions, info->GetFD());
- }
- break;
-
- case FileAction::eFileActionDuplicate:
- if (info->GetFD() == -1)
- error.SetErrorString(
- "invalid fd for posix_spawn_file_actions_adddup2(...)");
- else if (info->GetActionArgument() == -1)
- error.SetErrorString(
- "invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
- else {
- error.SetError(
- ::posix_spawn_file_actions_adddup2(file_actions, info->GetFD(),
- info->GetActionArgument()),
- eErrorTypePOSIX);
- if (error.Fail())
- LLDB_LOG(log,
- "error: {0}, posix_spawn_file_actions_adddup2 "
- "(action={1}, fd={2}, dup_fd={3})",
- error, file_actions, info->GetFD(), info->GetActionArgument());
- }
- break;
-
- case FileAction::eFileActionOpen:
- if (info->GetFD() == -1)
- error.SetErrorString(
- "invalid fd in posix_spawn_file_actions_addopen(...)");
- else {
- int oflag = info->GetActionArgument();
-
- mode_t mode = 0;
-
- if (oflag & O_CREAT)
- mode = 0640;
-
- error.SetError(::posix_spawn_file_actions_addopen(
- file_actions, info->GetFD(),
- info->GetPath().str().c_str(), oflag, mode),
- eErrorTypePOSIX);
- if (error.Fail())
- LLDB_LOG(log,
- "error: {0}, posix_spawn_file_actions_addopen (action={1}, "
- "fd={2}, path='{3}', oflag={4}, mode={5})",
- error, file_actions, info->GetFD(), info->GetPath(), oflag,
- mode);
- }
- break;
- }
- return error.Success();
-}
-
-static Status LaunchProcessPosixSpawn(const char *exe_path,
- const ProcessLaunchInfo &launch_info,
- lldb::pid_t &pid) {
- Status error;
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST |
- LIBLLDB_LOG_PROCESS));
-
- posix_spawnattr_t attr;
- error.SetError(::posix_spawnattr_init(&attr), eErrorTypePOSIX);
-
- if (error.Fail()) {
- LLDB_LOG(log, "error: {0}, ::posix_spawnattr_init ( &attr )", error);
- return error;
- }
-
- // Make sure we clean up the posix spawn attributes before exiting this scope.
- CleanUp cleanup_attr(posix_spawnattr_destroy, &attr);
-
- sigset_t no_signals;
- sigset_t all_signals;
- sigemptyset(&no_signals);
- sigfillset(&all_signals);
- ::posix_spawnattr_setsigmask(&attr, &no_signals);
- ::posix_spawnattr_setsigdefault(&attr, &all_signals);
-
- short flags = GetPosixspawnFlags(launch_info);
-
- error.SetError(::posix_spawnattr_setflags(&attr, flags), eErrorTypePOSIX);
- if (error.Fail()) {
- LLDB_LOG(log,
- "error: {0}, ::posix_spawnattr_setflags ( &attr, flags={1:x} )",
- error, flags);
- return error;
- }
-
-// posix_spawnattr_setbinpref_np appears to be an Apple extension per:
-// http://www.unix.com/man-page/OSX/3/posix_spawnattr_setbinpref_np/
-#if !defined(__arm__)
-
- // Don't set the binpref if a shell was provided. After all, that's only
- // going to affect what version of the shell
- // is launched, not what fork of the binary is launched. We insert "arch
- // --arch <ARCH> as part of the shell invocation
- // to do that job on OSX.
-
- if (launch_info.GetShell() == nullptr) {
- // We don't need to do this for ARM, and we really shouldn't now that we
- // have multiple CPU subtypes and no posix_spawnattr call that allows us
- // to set which CPU subtype to launch...
- const ArchSpec &arch_spec = launch_info.GetArchitecture();
- cpu_type_t cpu = arch_spec.GetMachOCPUType();
- cpu_type_t sub = arch_spec.GetMachOCPUSubType();
- if (cpu != 0 && cpu != static_cast<cpu_type_t>(UINT32_MAX) &&
- cpu != static_cast<cpu_type_t>(LLDB_INVALID_CPUTYPE) &&
- !(cpu == 0x01000007 && sub == 8)) // If haswell is specified, don't try
- // to set the CPU type or we will fail
- {
- size_t ocount = 0;
- error.SetError(::posix_spawnattr_setbinpref_np(&attr, 1, &cpu, &ocount),
- eErrorTypePOSIX);
- if (error.Fail())
- LLDB_LOG(log,
- "error: {0}, ::posix_spawnattr_setbinpref_np ( &attr, 1, "
- "cpu_type = {1:x}, count => {2} )",
- error, cpu, ocount);
-
- if (error.Fail() || ocount != 1)
- return error;
- }
- }
-#endif // !defined(__arm__)
-
- const char *tmp_argv[2];
- char *const *argv = const_cast<char *const *>(
- launch_info.GetArguments().GetConstArgumentVector());
- Environment::Envp envp = launch_info.GetEnvironment().getEnvp();
- if (argv == NULL) {
- // posix_spawn gets very unhappy if it doesn't have at least the program
- // name in argv[0]. One of the side affects I have noticed is the
- // environment
- // variables don't make it into the child process if "argv == NULL"!!!
- tmp_argv[0] = exe_path;
- tmp_argv[1] = NULL;
- argv = const_cast<char *const *>(tmp_argv);
- }
-
- FileSpec working_dir{launch_info.GetWorkingDirectory()};
- if (working_dir) {
- // Set the working directory on this thread only
- if (__pthread_chdir(working_dir.GetCString()) < 0) {
- if (errno == ENOENT) {
- error.SetErrorStringWithFormat("No such file or directory: %s",
- working_dir.GetCString());
- } else if (errno == ENOTDIR) {
- error.SetErrorStringWithFormat("Path doesn't name a directory: %s",
- working_dir.GetCString());
- } else {
- error.SetErrorStringWithFormat("An unknown error occurred when "
- "changing directory for process "
- "execution.");
- }
- return error;
- }
- }
-
- ::pid_t result_pid = LLDB_INVALID_PROCESS_ID;
- const size_t num_file_actions = launch_info.GetNumFileActions();
- if (num_file_actions > 0) {
- posix_spawn_file_actions_t file_actions;
- error.SetError(::posix_spawn_file_actions_init(&file_actions),
- eErrorTypePOSIX);
- if (error.Fail()) {
- LLDB_LOG(log,
- "error: {0}, ::posix_spawn_file_actions_init ( &file_actions )",
- error);
- return error;
- }
-
- // Make sure we clean up the posix file actions before exiting this scope.
- CleanUp cleanup_fileact(posix_spawn_file_actions_destroy, &file_actions);
-
- for (size_t i = 0; i < num_file_actions; ++i) {
- const FileAction *launch_file_action =
- launch_info.GetFileActionAtIndex(i);
- if (launch_file_action) {
- if (!AddPosixSpawnFileAction(&file_actions, launch_file_action, log,
- error))
- return error;
- }
- }
-
- error.SetError(
- ::posix_spawnp(&result_pid, exe_path, &file_actions, &attr, argv, envp),
- eErrorTypePOSIX);
-
- if (error.Fail()) {
- LLDB_LOG(log,
- "error: {0}, ::posix_spawnp(pid => {1}, path = '{2}', "
- "file_actions = {3}, "
- "attr = {4}, argv = {5}, envp = {6} )",
- error, result_pid, exe_path, &file_actions, &attr, argv,
- envp.get());
- if (log) {
- for (int ii = 0; argv[ii]; ++ii)
- LLDB_LOG(log, "argv[{0}] = '{1}'", ii, argv[ii]);
- }
- }
-
- } else {
- error.SetError(
- ::posix_spawnp(&result_pid, exe_path, NULL, &attr, argv, envp),
- eErrorTypePOSIX);
-
- if (error.Fail()) {
- LLDB_LOG(log,
- "error: {0}, ::posix_spawnp ( pid => {1}, path = '{2}', "
- "file_actions = NULL, attr = {3}, argv = {4}, envp = {5} )",
- error, result_pid, exe_path, &attr, argv, envp.get());
- if (log) {
- for (int ii = 0; argv[ii]; ++ii)
- LLDB_LOG(log, "argv[{0}] = '{1}'", ii, argv[ii]);
- }
- }
- }
- pid = result_pid;
-
- if (working_dir) {
- // No more thread specific current working directory
- __pthread_fchdir(-1);
- }
-
- return error;
-}
-
-static bool ShouldLaunchUsingXPC(ProcessLaunchInfo &launch_info) {
- bool result = false;
-
-#if !NO_XPC_SERVICES
- bool launchingAsRoot = launch_info.GetUserID() == 0;
- bool currentUserIsRoot = HostInfo::GetEffectiveUserID() == 0;
-
- if (launchingAsRoot && !currentUserIsRoot) {
- // If current user is already root, we don't need XPC's help.
- result = true;
- }
-#endif
-
- return result;
-}
-
-Status Host::LaunchProcess(ProcessLaunchInfo &launch_info) {
- Status error;
- FileSpec exe_spec(launch_info.GetExecutableFile());
-
- llvm::sys::fs::file_status stats;
- status(exe_spec.GetPath(), stats);
- if (!exists(stats)) {
- exe_spec.ResolvePath();
- status(exe_spec.GetPath(), stats);
- }
- if (!exists(stats)) {
- exe_spec.ResolveExecutableLocation();
- status(exe_spec.GetPath(), stats);
- }
- if (!exists(stats)) {
- error.SetErrorStringWithFormatv("executable doesn't exist: '{0}'",
- launch_info.GetExecutableFile());
- return error;
- }
-
- if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
-#if !defined(__arm__) && !defined(__arm64__) && !defined(__aarch64__)
- return LaunchInNewTerminalWithAppleScript(exe_spec.GetPath().c_str(),
- launch_info);
-#else
- error.SetErrorString("launching a process in a new terminal is not "
- "supported on iOS devices");
- return error;
-#endif
- }
-
- lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
-
- if (ShouldLaunchUsingXPC(launch_info)) {
- error = LaunchProcessXPC(exe_spec.GetPath().c_str(), launch_info, pid);
- } else {
- error =
- LaunchProcessPosixSpawn(exe_spec.GetPath().c_str(), launch_info, pid);
- }
-
- if (pid != LLDB_INVALID_PROCESS_ID) {
- // If all went well, then set the process ID into the launch info
- launch_info.SetProcessID(pid);
-
- // Make sure we reap any processes we spawn or we will have zombies.
- bool monitoring = launch_info.MonitorProcess();
- UNUSED_IF_ASSERT_DISABLED(monitoring);
- assert(monitoring);
- } else {
- // Invalid process ID, something didn't go well
- if (error.Success())
- error.SetErrorString("process launch failed for unknown reasons");
- }
- return error;
-}
-
-Status Host::ShellExpandArguments(ProcessLaunchInfo &launch_info) {
- Status error;
- if (launch_info.GetFlags().Test(eLaunchFlagShellExpandArguments)) {
- FileSpec expand_tool_spec;
- if (!HostInfo::GetLLDBPath(lldb::ePathTypeSupportExecutableDir,
- expand_tool_spec)) {
- error.SetErrorString(
- "could not get support executable directory for lldb-argdumper tool");
- return error;
- }
- expand_tool_spec.AppendPathComponent("lldb-argdumper");
- if (!expand_tool_spec.Exists()) {
- error.SetErrorStringWithFormat(
- "could not find the lldb-argdumper tool: %s",
- expand_tool_spec.GetPath().c_str());
- return error;
- }
-
- StreamString expand_tool_spec_stream;
- expand_tool_spec_stream.Printf("\"%s\"",
- expand_tool_spec.GetPath().c_str());
-
- Args expand_command(expand_tool_spec_stream.GetData());
- expand_command.AppendArguments(launch_info.GetArguments());
-
- int status;
- std::string output;
- FileSpec cwd(launch_info.GetWorkingDirectory());
- if (!cwd.Exists()) {
- char *wd = getcwd(nullptr, 0);
- if (wd == nullptr) {
- error.SetErrorStringWithFormat(
- "cwd does not exist; cannot launch with shell argument expansion");
- return error;
- } else {
- FileSpec working_dir(wd, false);
- free(wd);
- launch_info.SetWorkingDirectory(working_dir);
- }
- }
- RunShellCommand(expand_command, cwd, &status, nullptr, &output,
- std::chrono::seconds(10));
-
- if (status != 0) {
- error.SetErrorStringWithFormat("lldb-argdumper exited with error %d",
- status);
- return error;
- }
-
- auto data_sp = StructuredData::ParseJSON(output);
- if (!data_sp) {
- error.SetErrorString("invalid JSON");
- return error;
- }
-
- auto dict_sp = data_sp->GetAsDictionary();
- if (!data_sp) {
- error.SetErrorString("invalid JSON");
- return error;
- }
-
- auto args_sp = dict_sp->GetObjectForDotSeparatedPath("arguments");
- if (!args_sp) {
- error.SetErrorString("invalid JSON");
- return error;
- }
-
- auto args_array_sp = args_sp->GetAsArray();
- if (!args_array_sp) {
- error.SetErrorString("invalid JSON");
- return error;
- }
-
- launch_info.GetArguments().Clear();
-
- for (size_t i = 0; i < args_array_sp->GetSize(); i++) {
- auto item_sp = args_array_sp->GetItemAtIndex(i);
- if (!item_sp)
- continue;
- auto str_sp = item_sp->GetAsString();
- if (!str_sp)
- continue;
-
- launch_info.GetArguments().AppendArgument(str_sp->GetValue());
- }
- }
-
- return error;
-}
-
-HostThread Host::StartMonitoringChildProcess(
- const Host::MonitorChildProcessCallback &callback, lldb::pid_t pid,
- bool monitor_signals) {
- unsigned long mask = DISPATCH_PROC_EXIT;
- if (monitor_signals)
- mask |= DISPATCH_PROC_SIGNAL;
-
- Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_HOST |
- LIBLLDB_LOG_PROCESS));
-
- dispatch_source_t source = ::dispatch_source_create(
- DISPATCH_SOURCE_TYPE_PROC, pid, mask,
- ::dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
-
- if (log)
- log->Printf("Host::StartMonitoringChildProcess "
- "(callback, pid=%i, monitor_signals=%i) "
- "source = %p\n",
- static_cast<int>(pid), monitor_signals,
- reinterpret_cast<void *>(source));
-
- if (source) {
- Host::MonitorChildProcessCallback callback_copy = callback;
- ::dispatch_source_set_cancel_handler(source, ^{
- dispatch_release(source);
- });
- ::dispatch_source_set_event_handler(source, ^{
-
- int status = 0;
- int wait_pid = 0;
- bool cancel = false;
- bool exited = false;
- wait_pid = llvm::sys::RetryAfterSignal(-1, ::waitpid, pid, &status, 0);
- if (wait_pid >= 0) {
- int signal = 0;
- int exit_status = 0;
- const char *status_cstr = NULL;
- if (WIFSTOPPED(status)) {
- signal = WSTOPSIG(status);
- status_cstr = "STOPPED";
- } else if (WIFEXITED(status)) {
- exit_status = WEXITSTATUS(status);
- status_cstr = "EXITED";
- exited = true;
- } else if (WIFSIGNALED(status)) {
- signal = WTERMSIG(status);
- status_cstr = "SIGNALED";
- exited = true;
- exit_status = -1;
- } else {
- status_cstr = "???";
- }
-
- if (log)
- log->Printf("::waitpid (pid = %llu, &status, 0) => pid = %i, status "
- "= 0x%8.8x (%s), signal = %i, exit_status = %i",
- pid, wait_pid, status, status_cstr, signal, exit_status);
-
- if (callback_copy)
- cancel = callback_copy(pid, exited, signal, exit_status);
-
- if (exited || cancel) {
- ::dispatch_source_cancel(source);
- }
- }
- });
-
- ::dispatch_resume(source);
- }
- return HostThread();
-}
-
-//----------------------------------------------------------------------
-// Log to both stderr and to ASL Logging when running on MacOSX.
-//----------------------------------------------------------------------
-void Host::SystemLog(SystemLogType type, const char *format, va_list args) {
- if (format && format[0]) {
- static aslmsg g_aslmsg = NULL;
- if (g_aslmsg == NULL) {
- g_aslmsg = ::asl_new(ASL_TYPE_MSG);
- char asl_key_sender[PATH_MAX];
- snprintf(asl_key_sender, sizeof(asl_key_sender),
- "com.apple.LLDB.framework");
- ::asl_set(g_aslmsg, ASL_KEY_SENDER, asl_key_sender);
- }
-
- // Copy the va_list so we can log this message twice
- va_list copy_args;
- va_copy(copy_args, args);
- // Log to stderr
- ::vfprintf(stderr, format, copy_args);
- va_end(copy_args);
-
- int asl_level;
- switch (type) {
- case eSystemLogError:
- asl_level = ASL_LEVEL_ERR;
- break;
-
- case eSystemLogWarning:
- asl_level = ASL_LEVEL_WARNING;
- break;
- }
-
- // Log to ASL
- ::asl_vlog(NULL, g_aslmsg, asl_level, format, args);
- }
-}
Removed: lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm?rev=334610&view=auto
==============================================================================
--- lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm (original)
+++ lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm (removed)
@@ -1,319 +0,0 @@
-//===-- HostInfoMacOSX.mm ---------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#if !defined(LLDB_DISABLE_PYTHON)
-#include "Plugins/ScriptInterpreter/Python/lldb-python.h"
-#endif
-
-#include "lldb/Host/HostInfo.h"
-#include "lldb/Host/macosx/HostInfoMacOSX.h"
-#include "lldb/Utility/Args.h"
-#include "lldb/Utility/Log.h"
-#include "lldb/Utility/SafeMachO.h"
-
-#include "llvm/ADT/SmallString.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
-
-// C++ Includes
-#include <string>
-
-// C inclues
-#include <stdlib.h>
-#include <sys/sysctl.h>
-#include <sys/syslimits.h>
-#include <sys/types.h>
-
-// Objective C/C++ includes
-#include <CoreFoundation/CoreFoundation.h>
-#include <Foundation/Foundation.h>
-#include <mach-o/dyld.h>
-#include <objc/objc-auto.h>
-
-// These are needed when compiling on systems
-// that do not yet have these definitions
-#include <AvailabilityMacros.h>
-#ifndef CPU_SUBTYPE_X86_64_H
-#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8)
-#endif
-#ifndef CPU_TYPE_ARM64
-#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
-#endif
-
-#include <TargetConditionals.h> // for TARGET_OS_TV, TARGET_OS_WATCH
-
-using namespace lldb_private;
-
-bool HostInfoMacOSX::GetOSBuildString(std::string &s) {
- int mib[2] = {CTL_KERN, KERN_OSVERSION};
- char cstr[PATH_MAX];
- size_t cstr_len = sizeof(cstr);
- if (::sysctl(mib, 2, cstr, &cstr_len, NULL, 0) == 0) {
- s.assign(cstr, cstr_len);
- return true;
- }
-
- s.clear();
- return false;
-}
-
-bool HostInfoMacOSX::GetOSKernelDescription(std::string &s) {
- int mib[2] = {CTL_KERN, KERN_VERSION};
- char cstr[PATH_MAX];
- size_t cstr_len = sizeof(cstr);
- if (::sysctl(mib, 2, cstr, &cstr_len, NULL, 0) == 0) {
- s.assign(cstr, cstr_len);
- return true;
- }
- s.clear();
- return false;
-}
-
-bool HostInfoMacOSX::GetOSVersion(uint32_t &major, uint32_t &minor,
- uint32_t &update) {
- static uint32_t g_major = 0;
- static uint32_t g_minor = 0;
- static uint32_t g_update = 0;
-
- if (g_major == 0) {
- @autoreleasepool {
- NSDictionary *version_info = [NSDictionary
- dictionaryWithContentsOfFile:
- @"/System/Library/CoreServices/SystemVersion.plist"];
- NSString *version_value = [version_info objectForKey:@"ProductVersion"];
- const char *version_str = [version_value UTF8String];
- if (version_str)
- Args::StringToVersion(llvm::StringRef(version_str), g_major, g_minor,
- g_update);
- }
- }
-
- if (g_major != 0) {
- major = g_major;
- minor = g_minor;
- update = g_update;
- return true;
- }
- return false;
-}
-
-FileSpec HostInfoMacOSX::GetProgramFileSpec() {
- static FileSpec g_program_filespec;
- if (!g_program_filespec) {
- char program_fullpath[PATH_MAX];
- // If DST is NULL, then return the number of bytes needed.
- uint32_t len = sizeof(program_fullpath);
- int err = _NSGetExecutablePath(program_fullpath, &len);
- if (err == 0)
- g_program_filespec.SetFile(program_fullpath, false);
- else if (err == -1) {
- char *large_program_fullpath = (char *)::malloc(len + 1);
-
- err = _NSGetExecutablePath(large_program_fullpath, &len);
- if (err == 0)
- g_program_filespec.SetFile(large_program_fullpath, false);
-
- ::free(large_program_fullpath);
- }
- }
- return g_program_filespec;
-}
-
-bool HostInfoMacOSX::ComputeSupportExeDirectory(FileSpec &file_spec) {
- FileSpec lldb_file_spec;
- if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
- return false;
-
- std::string raw_path = lldb_file_spec.GetPath();
-
- size_t framework_pos = raw_path.find("LLDB.framework");
- if (framework_pos != std::string::npos) {
- framework_pos += strlen("LLDB.framework");
-#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
- // Shallow bundle
- raw_path.resize(framework_pos);
-#else
- // Normal bundle
- raw_path.resize(framework_pos);
- raw_path.append("/Resources");
-#endif
- } else {
- // Find the bin path relative to the lib path where the cmake-based
- // OS X .dylib lives. This is not going to work if the bin and lib
- // dir are not both in the same dir.
- //
- // It is not going to work to do it by the executable path either,
- // as in the case of a python script, the executable is python, not
- // the lldb driver.
- raw_path.append("/../bin");
- FileSpec support_dir_spec(raw_path, true);
- if (!llvm::sys::fs::is_directory(support_dir_spec.GetPath())) {
- Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
- if (log)
- log->Printf("HostInfoMacOSX::%s(): failed to find support directory",
- __FUNCTION__);
- return false;
- }
-
- // Get normalization from support_dir_spec. Note the FileSpec resolve
- // does not remove '..' in the path.
- char *const dir_realpath =
- realpath(support_dir_spec.GetPath().c_str(), NULL);
- if (dir_realpath) {
- raw_path = dir_realpath;
- free(dir_realpath);
- } else {
- raw_path = support_dir_spec.GetPath();
- }
- }
-
- file_spec.GetDirectory().SetString(
- llvm::StringRef(raw_path.c_str(), raw_path.size()));
- return (bool)file_spec.GetDirectory();
-}
-
-bool HostInfoMacOSX::ComputeHeaderDirectory(FileSpec &file_spec) {
- FileSpec lldb_file_spec;
- if (!HostInfo::GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
- return false;
-
- std::string raw_path = lldb_file_spec.GetPath();
-
- size_t framework_pos = raw_path.find("LLDB.framework");
- if (framework_pos != std::string::npos) {
- framework_pos += strlen("LLDB.framework");
- raw_path.resize(framework_pos);
- raw_path.append("/Headers");
- }
- file_spec.GetDirectory().SetString(
- llvm::StringRef(raw_path.c_str(), raw_path.size()));
- return true;
-}
-
-bool HostInfoMacOSX::ComputePythonDirectory(FileSpec &file_spec) {
-#ifndef LLDB_DISABLE_PYTHON
- FileSpec lldb_file_spec;
- if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
- return false;
-
- std::string raw_path = lldb_file_spec.GetPath();
-
- size_t framework_pos = raw_path.find("LLDB.framework");
- if (framework_pos != std::string::npos) {
- framework_pos += strlen("LLDB.framework");
- raw_path.resize(framework_pos);
- raw_path.append("/Resources/Python");
- } else {
- llvm::SmallString<256> python_version_dir;
- llvm::raw_svector_ostream os(python_version_dir);
- os << "/python" << PY_MAJOR_VERSION << '.' << PY_MINOR_VERSION
- << "/site-packages";
-
- // We may get our string truncated. Should we protect this with an assert?
- raw_path.append(python_version_dir.c_str());
- }
- file_spec.GetDirectory().SetString(
- llvm::StringRef(raw_path.c_str(), raw_path.size()));
- return true;
-#else
- return false;
-#endif
-}
-
-bool HostInfoMacOSX::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
- FileSpec lldb_file_spec;
- if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
- return false;
-
- std::string raw_path = lldb_file_spec.GetPath();
-
- size_t framework_pos = raw_path.find("LLDB.framework");
- if (framework_pos == std::string::npos)
- return false;
-
- framework_pos += strlen("LLDB.framework");
- raw_path.resize(framework_pos);
- raw_path.append("/Resources/PlugIns");
- file_spec.GetDirectory().SetString(
- llvm::StringRef(raw_path.c_str(), raw_path.size()));
- return true;
-}
-
-bool HostInfoMacOSX::ComputeUserPluginsDirectory(FileSpec &file_spec) {
- FileSpec temp_file("~/Library/Application Support/LLDB/PlugIns", true);
- file_spec.GetDirectory().SetCString(temp_file.GetPath().c_str());
- return true;
-}
-
-void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32,
- ArchSpec &arch_64) {
- // All apple systems support 32 bit execution.
- uint32_t cputype, cpusubtype;
- uint32_t is_64_bit_capable = false;
- size_t len = sizeof(cputype);
- ArchSpec host_arch;
- // These will tell us about the kernel architecture, which even on a 64
- // bit machine can be 32 bit...
- if (::sysctlbyname("hw.cputype", &cputype, &len, NULL, 0) == 0) {
- len = sizeof(cpusubtype);
- if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0) != 0)
- cpusubtype = CPU_TYPE_ANY;
-
- len = sizeof(is_64_bit_capable);
- ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0);
-
- if (is_64_bit_capable) {
- if (cputype & CPU_ARCH_ABI64) {
- // We have a 64 bit kernel on a 64 bit system
- arch_64.SetArchitecture(eArchTypeMachO, cputype, cpusubtype);
- } else {
- // We have a 64 bit kernel that is returning a 32 bit cputype, the
- // cpusubtype will be correct as if it were for a 64 bit architecture
- arch_64.SetArchitecture(eArchTypeMachO, cputype | CPU_ARCH_ABI64,
- cpusubtype);
- }
-
- // Now we need modify the cpusubtype for the 32 bit slices.
- uint32_t cpusubtype32 = cpusubtype;
-#if defined(__i386__) || defined(__x86_64__)
- if (cpusubtype == CPU_SUBTYPE_486 || cpusubtype == CPU_SUBTYPE_X86_64_H)
- cpusubtype32 = CPU_SUBTYPE_I386_ALL;
-#elif defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
- if (cputype == CPU_TYPE_ARM || cputype == CPU_TYPE_ARM64)
- cpusubtype32 = CPU_SUBTYPE_ARM_V7S;
-#endif
- arch_32.SetArchitecture(eArchTypeMachO, cputype & ~(CPU_ARCH_MASK),
- cpusubtype32);
-
- if (cputype == CPU_TYPE_ARM || cputype == CPU_TYPE_ARM64) {
-// When running on a watch or tv, report the host os correctly
-#if defined(TARGET_OS_TV) && TARGET_OS_TV == 1
- arch_32.GetTriple().setOS(llvm::Triple::TvOS);
- arch_64.GetTriple().setOS(llvm::Triple::TvOS);
-#else
- arch_32.GetTriple().setOS(llvm::Triple::IOS);
- arch_64.GetTriple().setOS(llvm::Triple::IOS);
-#endif
- } else {
- arch_32.GetTriple().setOS(llvm::Triple::MacOSX);
- arch_64.GetTriple().setOS(llvm::Triple::MacOSX);
- }
- } else {
- // We have a 32 bit kernel on a 32 bit system
- arch_32.SetArchitecture(eArchTypeMachO, cputype, cpusubtype);
-#if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1
- arch_32.GetTriple().setOS(llvm::Triple::WatchOS);
-#else
- arch_32.GetTriple().setOS(llvm::Triple::IOS);
-#endif
- arch_64.Clear();
- }
- }
-}
Removed: lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm?rev=334610&view=auto
==============================================================================
--- lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm (original)
+++ lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm (removed)
@@ -1,70 +0,0 @@
-//===-- HostThreadMacOSX.cpp ------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Host/macosx/HostThreadMacOSX.h"
-#include "lldb/Host/Host.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <Foundation/Foundation.h>
-
-#include <pthread.h>
-
-using namespace lldb_private;
-
-namespace {
-
-pthread_once_t g_thread_create_once = PTHREAD_ONCE_INIT;
-pthread_key_t g_thread_create_key = 0;
-
-class MacOSXDarwinThread {
-public:
- MacOSXDarwinThread() : m_pool(nil) {
- m_pool = [[NSAutoreleasePool alloc] init];
- }
-
- ~MacOSXDarwinThread() {
- if (m_pool) {
- [m_pool drain];
- m_pool = nil;
- }
- }
-
- static void PThreadDestructor(void *v) {
- if (v)
- delete static_cast<MacOSXDarwinThread *>(v);
- ::pthread_setspecific(g_thread_create_key, NULL);
- }
-
-protected:
- NSAutoreleasePool *m_pool;
-
-private:
- DISALLOW_COPY_AND_ASSIGN(MacOSXDarwinThread);
-};
-
-void InitThreadCreated() {
- ::pthread_key_create(&g_thread_create_key,
- MacOSXDarwinThread::PThreadDestructor);
-}
-} // namespace
-
-HostThreadMacOSX::HostThreadMacOSX() : HostThreadPosix() {}
-
-HostThreadMacOSX::HostThreadMacOSX(lldb::thread_t thread)
- : HostThreadPosix(thread) {}
-
-lldb::thread_result_t
-HostThreadMacOSX::ThreadCreateTrampoline(lldb::thread_arg_t arg) {
- ::pthread_once(&g_thread_create_once, InitThreadCreated);
- if (g_thread_create_key) {
- ::pthread_setspecific(g_thread_create_key, new MacOSXDarwinThread());
- }
-
- return HostThreadPosix::ThreadCreateTrampoline(arg);
-}
Added: lldb/trunk/source/Host/macosx/objcxx/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/objcxx/CMakeLists.txt?rev=334611&view=auto
==============================================================================
--- lldb/trunk/source/Host/macosx/objcxx/CMakeLists.txt (added)
+++ lldb/trunk/source/Host/macosx/objcxx/CMakeLists.txt Wed Jun 13 08:50:45 2018
@@ -0,0 +1,21 @@
+
+remove_module_flags()
+include_directories(..)
+
+add_lldb_library(lldbHostMacOSXObjCXX
+ Host.mm
+ HostInfoMacOSX.mm
+ HostThreadMacOSX.mm
+
+ LINK_LIBS
+ lldbCore
+ lldbSymbol
+ lldbTarget
+ lldbUtility
+ ${LLDB_PLUGINS}
+ ${EXTRA_LIBS}
+
+ LINK_COMPONENTS
+ Object
+ Support
+ )
Copied: lldb/trunk/source/Host/macosx/objcxx/Host.mm (from r334557, lldb/trunk/source/Host/macosx/Host.mm)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/objcxx/Host.mm?p2=lldb/trunk/source/Host/macosx/objcxx/Host.mm&p1=lldb/trunk/source/Host/macosx/Host.mm&r1=334557&r2=334611&rev=334611&view=diff
==============================================================================
(empty)
Copied: lldb/trunk/source/Host/macosx/objcxx/HostInfoMacOSX.mm (from r334557, lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/objcxx/HostInfoMacOSX.mm?p2=lldb/trunk/source/Host/macosx/objcxx/HostInfoMacOSX.mm&p1=lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm&r1=334557&r2=334611&rev=334611&view=diff
==============================================================================
(empty)
Copied: lldb/trunk/source/Host/macosx/objcxx/HostThreadMacOSX.mm (from r334557, lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/objcxx/HostThreadMacOSX.mm?p2=lldb/trunk/source/Host/macosx/objcxx/HostThreadMacOSX.mm&p1=lldb/trunk/source/Host/macosx/HostThreadMacOSX.mm&r1=334557&r2=334611&rev=334611&view=diff
==============================================================================
(empty)
Modified: lldb/trunk/source/Plugins/Platform/MacOSX/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/CMakeLists.txt?rev=334611&r1=334610&r2=334611&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/CMakeLists.txt Wed Jun 13 08:50:45 2018
@@ -11,13 +11,14 @@ list(APPEND PLUGIN_PLATFORM_MACOSX_SOURC
list(APPEND PLUGIN_PLATFORM_MACOSX_DARWIN_ONLY_SOURCES
PlatformAppleSimulator.cpp
PlatformiOSSimulator.cpp
- PlatformiOSSimulatorCoreSimulatorSupport.mm
PlatformAppleTVSimulator.cpp
PlatformAppleWatchSimulator.cpp
)
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
include_directories(${LIBXML2_INCLUDE_DIR})
+ add_subdirectory(objcxx)
+ set(OBJC_LIBS "lldbPluginPlatformMacOSXObjCXX")
list(APPEND PLUGIN_PLATFORM_MACOSX_SOURCES
${PLUGIN_PLATFORM_MACOSX_DARWIN_ONLY_SOURCES})
else()
@@ -38,6 +39,7 @@ add_lldb_library(lldbPluginPlatformMacOS
lldbTarget
lldbUtility
lldbPluginPlatformPOSIX
+ ${OBJC_LIBS}
LINK_COMPONENTS
Support
)
Removed: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm?rev=334610&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm (removed)
@@ -1,634 +0,0 @@
-//===-- PlatformiOSSimulatorCoreSimulatorSupport.cpp ---------------*- C++
-//-*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PlatformiOSSimulatorCoreSimulatorSupport.h"
-
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-#include <CoreFoundation/CoreFoundation.h>
-#include <Foundation/Foundation.h>
-// Project includes
-#include "lldb/Host/PseudoTerminal.h"
-#include "lldb/Target/FileAction.h"
-
-#include "llvm/ADT/StringRef.h"
-
-using namespace lldb_private;
-// CoreSimulator lives as part of Xcode, which means we can't really link
-// against it, so we dlopen()
-// it at runtime, and error out nicely if that fails
- at interface SimServiceContext {
-}
-+ (id)sharedServiceContextForDeveloperDir:(NSString *)dir
- error:(NSError **)error;
- at end
-// However, the drawback is that the compiler will not know about the selectors
-// we're trying to use
-// until runtime; to appease clang in this regard, define a fake protocol on
-// NSObject that exposes
-// the needed interface names for us
- at protocol LLDBCoreSimulatorSupport <NSObject>
-- (id)defaultDeviceSetWithError:(NSError **)error;
-- (NSArray *)devices;
-- (id)deviceType;
-- (NSString *)name;
-- (NSString *)identifier;
-- (NSString *)modelIdentifier;
-- (NSString *)productFamily;
-- (int32_t)productFamilyID;
-- (id)runtime;
-- (BOOL)available;
-- (NSString *)versionString;
-- (NSString *)buildVersionString;
-- (BOOL)bootWithOptions:(NSDictionary *)options error:(NSError **)error;
-- (NSUInteger)state;
-- (BOOL)shutdownWithError:(NSError **)error;
-- (NSUUID *)UDID;
-- (pid_t)spawnWithPath:(NSString *)path
- options:(NSDictionary *)options
- terminationHandler:(void (^)(int status))terminationHandler
- error:(NSError **)error;
- at end
-
-CoreSimulatorSupport::Process::Process(lldb::pid_t p) : m_pid(p), m_error() {}
-
-CoreSimulatorSupport::Process::Process(Status error)
- : m_pid(LLDB_INVALID_PROCESS_ID), m_error(error) {}
-
-CoreSimulatorSupport::Process::Process(lldb::pid_t p, Status error)
- : m_pid(p), m_error(error) {}
-
-CoreSimulatorSupport::DeviceType::DeviceType()
- : m_dev(nil), m_model_identifier() {}
-
-CoreSimulatorSupport::DeviceType::DeviceType(id d)
- : m_dev(d), m_model_identifier() {}
-
-CoreSimulatorSupport::DeviceType::operator bool() { return m_dev != nil; }
-
-ConstString CoreSimulatorSupport::DeviceType::GetIdentifier() {
- return ConstString([[m_dev identifier] UTF8String]);
-}
-
-ConstString CoreSimulatorSupport::DeviceType::GetProductFamily() {
- return ConstString([[m_dev productFamily] UTF8String]);
-}
-
-CoreSimulatorSupport::DeviceType::ProductFamilyID
-CoreSimulatorSupport::DeviceType::GetProductFamilyID() {
- return ProductFamilyID([m_dev productFamilyID]);
-}
-
-CoreSimulatorSupport::DeviceRuntime::DeviceRuntime()
- : m_dev(nil), m_os_version() {}
-
-CoreSimulatorSupport::DeviceRuntime::DeviceRuntime(id d)
- : m_dev(d), m_os_version() {}
-
-CoreSimulatorSupport::DeviceRuntime::operator bool() { return m_dev != nil; }
-
-bool CoreSimulatorSupport::DeviceRuntime::IsAvailable() {
- return [m_dev available];
-}
-
-CoreSimulatorSupport::Device::Device()
- : m_dev(nil), m_dev_type(), m_dev_runtime() {}
-
-CoreSimulatorSupport::Device::Device(id d)
- : m_dev(d), m_dev_type(), m_dev_runtime() {}
-
-CoreSimulatorSupport::Device::operator bool() { return m_dev != nil; }
-
-CoreSimulatorSupport::Device::State CoreSimulatorSupport::Device::GetState() {
- return (State)([m_dev state]);
-}
-
-CoreSimulatorSupport::ModelIdentifier::ModelIdentifier(const std::string &mi)
- : m_family(), m_versions() {
- bool any = false;
- bool first_digit = false;
- unsigned int val = 0;
-
- for (char c : mi) {
- any = true;
- if (::isdigit(c)) {
- if (!first_digit)
- first_digit = true;
- val = 10 * val + (c - '0');
- } else if (c == ',') {
- if (first_digit) {
- m_versions.push_back(val);
- val = 0;
- } else
- m_family.push_back(c);
- } else {
- if (first_digit) {
- m_family.clear();
- m_versions.clear();
- return;
- } else {
- m_family.push_back(c);
- }
- }
- }
-
- if (first_digit)
- m_versions.push_back(val);
-}
-
-CoreSimulatorSupport::ModelIdentifier::ModelIdentifier()
- : ModelIdentifier("") {}
-
-CoreSimulatorSupport::OSVersion::OSVersion(const std::string &ver,
- const std::string &build)
- : m_versions(), m_build(build) {
- bool any = false;
- unsigned int val = 0;
- for (char c : ver) {
- if (c == '.') {
- m_versions.push_back(val);
- val = 0;
- } else if (::isdigit(c)) {
- val = 10 * val + (c - '0');
- any = true;
- } else {
- m_versions.clear();
- return;
- }
- }
- if (any)
- m_versions.push_back(val);
-}
-
-CoreSimulatorSupport::OSVersion::OSVersion() : OSVersion("", "") {}
-
-CoreSimulatorSupport::ModelIdentifier
-CoreSimulatorSupport::DeviceType::GetModelIdentifier() {
- if (!m_model_identifier.hasValue()) {
- auto utf8_model_id = [[m_dev modelIdentifier] UTF8String];
- if (utf8_model_id && *utf8_model_id)
- m_model_identifier = ModelIdentifier(utf8_model_id);
- }
-
- if (m_model_identifier.hasValue())
- return m_model_identifier.getValue();
- else
- return ModelIdentifier();
-}
-
-CoreSimulatorSupport::OSVersion
-CoreSimulatorSupport::DeviceRuntime::GetVersion() {
- if (!m_os_version.hasValue()) {
- auto utf8_ver_string = [[m_dev versionString] UTF8String];
- auto utf8_build_ver = [[m_dev buildVersionString] UTF8String];
- if (utf8_ver_string && *utf8_ver_string && utf8_build_ver &&
- *utf8_build_ver) {
- m_os_version = OSVersion(utf8_ver_string, utf8_build_ver);
- }
- }
-
- if (m_os_version.hasValue())
- return m_os_version.getValue();
- return OSVersion();
-}
-
-std::string CoreSimulatorSupport::DeviceType::GetName() {
- auto utf8_name = [[m_dev name] UTF8String];
- if (utf8_name)
- return std::string(utf8_name);
- return "";
-}
-
-std::string CoreSimulatorSupport::Device::GetName() const {
- auto utf8_name = [[m_dev name] UTF8String];
- if (utf8_name)
- return std::string(utf8_name);
- return "";
-}
-
-std::string CoreSimulatorSupport::Device::GetUDID() const {
- auto utf8_udid = [[[m_dev UDID] UUIDString] UTF8String];
- if (utf8_udid)
- return std::string(utf8_udid);
- else
- return std::string();
-}
-
-CoreSimulatorSupport::DeviceType CoreSimulatorSupport::Device::GetDeviceType() {
- if (!m_dev_type.hasValue())
- m_dev_type = DeviceType([m_dev deviceType]);
-
- return m_dev_type.getValue();
-}
-
-CoreSimulatorSupport::DeviceRuntime
-CoreSimulatorSupport::Device::GetDeviceRuntime() {
- if (!m_dev_runtime.hasValue())
- m_dev_runtime = DeviceRuntime([m_dev runtime]);
-
- return m_dev_runtime.getValue();
-}
-
-bool CoreSimulatorSupport::
-operator>(const CoreSimulatorSupport::OSVersion &lhs,
- const CoreSimulatorSupport::OSVersion &rhs) {
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l > r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::
-operator>(const CoreSimulatorSupport::ModelIdentifier &lhs,
- const CoreSimulatorSupport::ModelIdentifier &rhs) {
- if (lhs.GetFamily() != rhs.GetFamily())
- return false;
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l > r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::
-operator<(const CoreSimulatorSupport::OSVersion &lhs,
- const CoreSimulatorSupport::OSVersion &rhs) {
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l < r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::
-operator<(const CoreSimulatorSupport::ModelIdentifier &lhs,
- const CoreSimulatorSupport::ModelIdentifier &rhs) {
- if (lhs.GetFamily() != rhs.GetFamily())
- return false;
-
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l < r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::
-operator==(const CoreSimulatorSupport::OSVersion &lhs,
- const CoreSimulatorSupport::OSVersion &rhs) {
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l != r)
- return false;
- }
- return true;
-}
-
-bool CoreSimulatorSupport::
-operator==(const CoreSimulatorSupport::ModelIdentifier &lhs,
- const CoreSimulatorSupport::ModelIdentifier &rhs) {
- if (lhs.GetFamily() != rhs.GetFamily())
- return false;
-
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l != r)
- return false;
- }
- return true;
-}
-
-bool CoreSimulatorSupport::
-operator!=(const CoreSimulatorSupport::OSVersion &lhs,
- const CoreSimulatorSupport::OSVersion &rhs) {
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l != r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::
-operator!=(const CoreSimulatorSupport::ModelIdentifier &lhs,
- const CoreSimulatorSupport::ModelIdentifier &rhs) {
- if (lhs.GetFamily() != rhs.GetFamily())
- return false;
-
- for (size_t i = 0; i < rhs.GetNumVersions(); i++) {
- unsigned int l = lhs.GetVersionAtIndex(i);
- unsigned int r = rhs.GetVersionAtIndex(i);
- if (l != r)
- return true;
- }
- return false;
-}
-
-bool CoreSimulatorSupport::Device::Boot(Status &err) {
- if (m_dev == nil) {
- err.SetErrorString("no valid simulator instance");
- return false;
- }
-
-#define kSimDeviceBootPersist \
- @"persist" /* An NSNumber (boolean) indicating whether or not the session \
- should outlive the calling process (default false) */
-
- NSDictionary *options = @{
- kSimDeviceBootPersist : @NO,
- };
-
-#undef kSimDeviceBootPersist
-
- NSError *nserror;
- if ([m_dev bootWithOptions:options error:&nserror]) {
- err.Clear();
- return true;
- } else {
- err.SetErrorString([[nserror description] UTF8String]);
- return false;
- }
-}
-
-bool CoreSimulatorSupport::Device::Shutdown(Status &err) {
- NSError *nserror;
- if ([m_dev shutdownWithError:&nserror]) {
- err.Clear();
- return true;
- } else {
- err.SetErrorString([[nserror description] UTF8String]);
- return false;
- }
-}
-
-static Status HandleFileAction(ProcessLaunchInfo &launch_info,
- NSMutableDictionary *options, NSString *key,
- const int fd, File &file) {
- Status error;
- const FileAction *file_action = launch_info.GetFileActionForFD(fd);
- if (file_action) {
- switch (file_action->GetAction()) {
- case FileAction::eFileActionNone:
- break;
-
- case FileAction::eFileActionClose:
- error.SetErrorStringWithFormat("close file action for %i not supported",
- fd);
- break;
-
- case FileAction::eFileActionDuplicate:
- error.SetErrorStringWithFormat(
- "duplication file action for %i not supported", fd);
- break;
-
- case FileAction::eFileActionOpen: {
- FileSpec file_spec = file_action->GetFileSpec();
- if (file_spec) {
- const int master_fd = launch_info.GetPTY().GetMasterFileDescriptor();
- if (master_fd != PseudoTerminal::invalid_fd) {
- // Check in case our file action open wants to open the slave
- const char *slave_path = launch_info.GetPTY().GetSlaveName(NULL, 0);
- if (slave_path) {
- FileSpec slave_spec(slave_path, false);
- if (file_spec == slave_spec) {
- int slave_fd = launch_info.GetPTY().GetSlaveFileDescriptor();
- if (slave_fd == PseudoTerminal::invalid_fd)
- slave_fd = launch_info.GetPTY().OpenSlave(O_RDWR, nullptr, 0);
- if (slave_fd == PseudoTerminal::invalid_fd) {
- error.SetErrorStringWithFormat("unable to open slave pty '%s'",
- slave_path);
- return error; // Failure
- }
- [options setValue:[NSNumber numberWithInteger:slave_fd]
- forKey:key];
- return error; // Success
- }
- }
- }
- Status posix_error;
- int created_fd =
- open(file_spec.GetPath().c_str(), file_action->GetActionArgument(),
- S_IRUSR | S_IWUSR);
- if (created_fd >= 0) {
- file.SetDescriptor(created_fd, true);
- [options setValue:[NSNumber numberWithInteger:created_fd] forKey:key];
- return error; // Success
- } else {
- posix_error.SetErrorToErrno();
- error.SetErrorStringWithFormat("unable to open file '%s': %s",
- file_spec.GetPath().c_str(),
- posix_error.AsCString());
- }
- }
- } break;
- }
- }
- return error; // Success, no file action, nothing to do
-}
-
-CoreSimulatorSupport::Process
-CoreSimulatorSupport::Device::Spawn(ProcessLaunchInfo &launch_info) {
-#define kSimDeviceSpawnEnvironment \
- @"environment" /* An NSDictionary (NSStrings -> NSStrings) of environment \
- key/values */
-#define kSimDeviceSpawnStdin @"stdin" /* An NSNumber corresponding to a fd */
-#define kSimDeviceSpawnStdout @"stdout" /* An NSNumber corresponding to a fd \
- */
-#define kSimDeviceSpawnStderr @"stderr" /* An NSNumber corresponding to a fd \
- */
-#define kSimDeviceSpawnArguments \
- @"arguments" /* An NSArray of strings to use as the argv array. If not \
- provided, path will be argv[0] */
-#define kSimDeviceSpawnWaitForDebugger \
- @"wait_for_debugger" /* An NSNumber (bool) */
-
- NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
-
- if (launch_info.GetFlags().Test(lldb::eLaunchFlagDebug))
- [options setObject:@YES forKey:kSimDeviceSpawnWaitForDebugger];
-
- if (launch_info.GetArguments().GetArgumentCount()) {
- const Args &args(launch_info.GetArguments());
- NSMutableArray *args_array = [[NSMutableArray alloc] init];
- for (size_t idx = 0; idx < args.GetArgumentCount(); idx++)
- [args_array
- addObject:[NSString
- stringWithUTF8String:args.GetArgumentAtIndex(idx)]];
-
- [options setObject:args_array forKey:kSimDeviceSpawnArguments];
- }
-
- NSMutableDictionary *env_dict = [[NSMutableDictionary alloc] init];
-
- for (const auto &KV : launch_info.GetEnvironment()) {
- NSString *key_ns = [NSString stringWithUTF8String:KV.first().str().c_str()];
- NSString *value_ns = [NSString stringWithUTF8String:KV.second.c_str()];
-
- [env_dict setValue:value_ns forKey:key_ns];
- }
-
- [options setObject:env_dict forKey:kSimDeviceSpawnEnvironment];
-
- Status error;
- File stdin_file;
- File stdout_file;
- File stderr_file;
- error = HandleFileAction(launch_info, options, kSimDeviceSpawnStdin,
- STDIN_FILENO, stdin_file);
-
- if (error.Fail())
- return CoreSimulatorSupport::Process(error);
-
- error = HandleFileAction(launch_info, options, kSimDeviceSpawnStdout,
- STDOUT_FILENO, stdout_file);
-
- if (error.Fail())
- return CoreSimulatorSupport::Process(error);
-
- error = HandleFileAction(launch_info, options, kSimDeviceSpawnStderr,
- STDERR_FILENO, stderr_file);
-
- if (error.Fail())
- return CoreSimulatorSupport::Process(error);
-
-#undef kSimDeviceSpawnEnvironment
-#undef kSimDeviceSpawnStdin
-#undef kSimDeviceSpawnStdout
-#undef kSimDeviceSpawnStderr
-#undef kSimDeviceSpawnWaitForDebugger
-#undef kSimDeviceSpawnArguments
-
- NSError *nserror;
-
- pid_t pid = [m_dev
- spawnWithPath:[NSString stringWithUTF8String:launch_info
- .GetExecutableFile()
- .GetPath()
- .c_str()]
- options:options
- terminationHandler:nil
- error:&nserror];
-
- if (pid < 0) {
- const char *nserror_string = [[nserror description] UTF8String];
- error.SetErrorString(nserror_string ? nserror_string : "unable to launch");
- }
-
- return CoreSimulatorSupport::Process(pid, error);
-}
-
-CoreSimulatorSupport::DeviceSet
-CoreSimulatorSupport::DeviceSet::GetAllDevices(const char *developer_dir) {
- if (!developer_dir || !developer_dir[0])
- return DeviceSet([NSArray new]);
-
- Class SimServiceContextClass = NSClassFromString(@"SimServiceContext");
- NSString *dev_dir = @(developer_dir);
- NSError *error = nil;
-
- id serviceContext =
- [SimServiceContextClass sharedServiceContextForDeveloperDir:dev_dir
- error:&error];
- if (!serviceContext)
- return DeviceSet([NSArray new]);
-
- return DeviceSet([[serviceContext defaultDeviceSetWithError:&error] devices]);
-}
-
-CoreSimulatorSupport::DeviceSet
-CoreSimulatorSupport::DeviceSet::GetAvailableDevices(
- const char *developer_dir) {
- return GetAllDevices(developer_dir).GetDevicesIf([](Device d) -> bool {
- return (d && d.GetDeviceType() && d.GetDeviceRuntime() &&
- d.GetDeviceRuntime().IsAvailable());
- });
-}
-
-size_t CoreSimulatorSupport::DeviceSet::GetNumDevices() {
- return [m_dev count];
-}
-
-CoreSimulatorSupport::Device
-CoreSimulatorSupport::DeviceSet::GetDeviceAtIndex(size_t idx) {
- if (idx < GetNumDevices())
- return Device([m_dev objectAtIndex:idx]);
- return Device();
-}
-
-CoreSimulatorSupport::DeviceSet CoreSimulatorSupport::DeviceSet::GetDevicesIf(
- std::function<bool(CoreSimulatorSupport::Device)> f) {
- NSMutableArray *array = [[NSMutableArray alloc] init];
- for (NSUInteger i = 0; i < GetNumDevices(); i++) {
- Device d(GetDeviceAtIndex(i));
- if (f(d))
- [array addObject:(id)d.m_dev];
- }
-
- return DeviceSet(array);
-}
-
-void CoreSimulatorSupport::DeviceSet::ForEach(
- std::function<bool(const Device &)> f) {
- const size_t n = GetNumDevices();
- for (NSUInteger i = 0; i < n; ++i) {
- if (f(GetDeviceAtIndex(i)) == false)
- break;
- }
-}
-
-CoreSimulatorSupport::DeviceSet CoreSimulatorSupport::DeviceSet::GetDevices(
- CoreSimulatorSupport::DeviceType::ProductFamilyID dev_id) {
- NSMutableArray *array = [[NSMutableArray alloc] init];
- const size_t n = GetNumDevices();
- for (NSUInteger i = 0; i < n; ++i) {
- Device d(GetDeviceAtIndex(i));
- if (d && d.GetDeviceType() &&
- d.GetDeviceType().GetProductFamilyID() == dev_id)
- [array addObject:(id)d.m_dev];
- }
-
- return DeviceSet(array);
-}
-
-CoreSimulatorSupport::Device CoreSimulatorSupport::DeviceSet::GetFanciest(
- CoreSimulatorSupport::DeviceType::ProductFamilyID dev_id) {
- Device dev;
-
- for (NSUInteger i = 0; i < GetNumDevices(); i++) {
- Device d(GetDeviceAtIndex(i));
- if (d && d.GetDeviceType() &&
- d.GetDeviceType().GetProductFamilyID() == dev_id) {
- if (!dev)
- dev = d;
- else {
- if ((d.GetDeviceType().GetModelIdentifier() >
- dev.GetDeviceType().GetModelIdentifier()) ||
- d.GetDeviceRuntime().GetVersion() >
- dev.GetDeviceRuntime().GetVersion())
- dev = d;
- }
- }
- }
-
- return dev;
-}
Added: lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/CMakeLists.txt?rev=334611&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/CMakeLists.txt (added)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/CMakeLists.txt Wed Jun 13 08:50:45 2018
@@ -0,0 +1,18 @@
+remove_module_flags()
+include_directories(..)
+
+add_lldb_library(lldbPluginPlatformMacOSXObjCXX
+ PlatformiOSSimulatorCoreSimulatorSupport.mm
+
+ LINK_LIBS
+ lldbCore
+ lldbSymbol
+ lldbTarget
+ lldbUtility
+ ${LLDB_PLUGINS}
+ ${EXTRA_LIBS}
+
+ LINK_COMPONENTS
+ Object
+ Support
+ )
Copied: lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm (from r334557, lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm?p2=lldb/trunk/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm&p1=lldb/trunk/source/Plugins/Platform/MacOSX/PlatformiOSSimulatorCoreSimulatorSupport.mm&r1=334557&r2=334611&rev=334611&view=diff
==============================================================================
(empty)
More information about the lldb-commits
mailing list