diff options
| author | Johnny Chen <johnny.chen@apple.com> | 2011-08-02 20:52:42 +0000 |
|---|---|---|
| committer | Johnny Chen <johnny.chen@apple.com> | 2011-08-02 20:52:42 +0000 |
| commit | 8f3d8384bed762d95552010482e23ea13154dcd9 (patch) | |
| tree | 0e1fd20b5451e3163a3255cf3c33c012cec12d50 | |
| parent | 7b15b2e828bbaa2ec693341cff60a434a8546fe2 (diff) | |
| download | bcm5719-llvm-8f3d8384bed762d95552010482e23ea13154dcd9.tar.gz bcm5719-llvm-8f3d8384bed762d95552010482e23ea13154dcd9.zip | |
Patch by David Forsythe to build lldb on FreeBSD!
I did not take the patch for ClangExpressionParser.cpp since there was a
recent change by Peter for the same line. Feel free to disagree. :-)
Reference:
----------------------------------------------------------------------
r136580 | pcc | 2011-07-30 15:42:24 -0700 (Sat, 30 Jul 2011) | 3 lines
Add reloc arg to standard JIT createJIT()
Fixes non-__APPLE__ build. Patch by Matt Johnson!
----------------------------------------------------------------------
Also, I ignore the part of the patch to remove the RegisterContextDarwin*.h/.cpp.
llvm-svn: 136720
| -rw-r--r-- | lldb/Makefile | 1 | ||||
| -rw-r--r-- | lldb/include/lldb/Host/SocketAddress.h | 4 | ||||
| -rw-r--r-- | lldb/include/lldb/Host/freebsd/Config.h | 2 | ||||
| -rw-r--r-- | lldb/lib/Makefile | 20 | ||||
| -rw-r--r-- | lldb/source/Host/Makefile | 4 | ||||
| -rw-r--r-- | lldb/source/Host/common/Host.cpp | 26 | ||||
| -rw-r--r-- | lldb/source/Host/freebsd/Host.cpp | 277 | ||||
| -rw-r--r-- | lldb/source/Host/freebsd/Makefile | 16 | ||||
| -rw-r--r-- | lldb/source/Plugins/Makefile | 2 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/FreeBSD/Makefile | 14 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp | 262 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h | 109 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/Makefile | 6 | ||||
| -rw-r--r-- | lldb/source/lldb.cpp | 11 | ||||
| -rw-r--r-- | lldb/tools/driver/IOChannel.h | 4 | ||||
| -rw-r--r-- | lldb/tools/driver/Makefile | 6 |
16 files changed, 752 insertions, 12 deletions
diff --git a/lldb/Makefile b/lldb/Makefile index 07e97e61b9b..1bc42cb7f26 100644 --- a/lldb/Makefile +++ b/lldb/Makefile @@ -30,7 +30,6 @@ include $(LEVEL)/Makefile.common # Set Python include directory PYTHON_INC_DIR = $(shell python-config --includes) - # Set common LLDB build flags. CPP.Flags += -I$(PROJ_SRC_DIR)/$(LLDB_LEVEL)/include CPP.Flags += -I$(PROJ_OBJ_DIR)/$(LLDB_LEVEL)/include diff --git a/lldb/include/lldb/Host/SocketAddress.h b/lldb/include/lldb/Host/SocketAddress.h index 979f8fad474..e63b238c799 100644 --- a/lldb/include/lldb/Host/SocketAddress.h +++ b/lldb/include/lldb/Host/SocketAddress.h @@ -16,6 +16,10 @@ #include <netdb.h> #include <netinet/in.h> +#if defined(__FreeBSD__) +#include <sys/types.h> +#endif + // C++ Includes // Other libraries and framework includes // Project includes diff --git a/lldb/include/lldb/Host/freebsd/Config.h b/lldb/include/lldb/Host/freebsd/Config.h index 2d66b67741c..88fe670819c 100644 --- a/lldb/include/lldb/Host/freebsd/Config.h +++ b/lldb/include/lldb/Host/freebsd/Config.h @@ -27,4 +27,4 @@ //#define LLDB_CONFIG_FCNTL_GETPATH_SUPPORTED 1 -#endif // #ifndef liblldb_Platform_Config_h_
\ No newline at end of file +#endif // #ifndef liblldb_Platform_Config_h_ diff --git a/lldb/lib/Makefile b/lldb/lib/Makefile index a13114b20fe..98605407caf 100644 --- a/lldb/lib/Makefile +++ b/lldb/lib/Makefile @@ -73,7 +73,8 @@ ifeq ($(HOST_OS),Darwin) lldbPluginObjectContainerUniversalMachO.a \ lldbPluginObjectFileMachO.a \ lldbPluginSymbolVendorMacOSX.a \ - lldbPluginPlatformMacOSX.a + lldbPluginPlatformMacOSX.a \ + lldbPluginProcessDarwin endif ifeq ($(HOST_OS),Linux) @@ -83,6 +84,11 @@ ifeq ($(HOST_OS),Linux) lldbHostLinux.a endif +ifeq ($(HOST_OS),FreeBSD) + USEDLIBS += lldbHostFreeBSD.a \ + lldbPluginPlatformFreeBSD.a +endif + include $(LEVEL)/Makefile.common ifeq ($(HOST_OS),Darwin) @@ -108,7 +114,7 @@ ifeq ($(HOST_OS),Darwin) endif endif -ifeq ($(HOST_OS), Linux) +ifeq ($(HOST_OS),Linux) # Include everything from the .a's into the shared library. ProjLibsOptions := -Wl,--whole-archive $(ProjLibsOptions) \ -Wl,--no-whole-archive @@ -117,3 +123,13 @@ ifeq ($(HOST_OS), Linux) # Link in python LD.Flags += $(PYTHON_BUILD_FLAGS) -lrt endif + +ifeq ($(HOST_OS),FreeBSD) + # Include everything from the .a's into the shared library. + ProjLibsOptions := -Wl,--whole-archive $(ProjLibsOptions) \ + -Wl,--no-whole-archive + # Don't allow unresolved symbols. + LLVMLibsOptions += -Wl,--no-undefined + # Link in python + LD.Flags += $(PYTHON_BUILD_FLAGS) -lrt -L/usr/local/lib -lexecinfo +endif diff --git a/lldb/source/Host/Makefile b/lldb/source/Host/Makefile index b26528c2b69..44597f66784 100644 --- a/lldb/source/Host/Makefile +++ b/lldb/source/Host/Makefile @@ -21,4 +21,8 @@ ifeq ($(HOST_OS),Linux) DIRS += linux endif +ifeq ($(HOST_OS),FreeBSD) +DIRS += freebsd +endif + include $(LLDB_LEVEL)/Makefile diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index 6908eb1949a..f56c4b7dd74 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -43,6 +43,12 @@ #include <sys/wait.h> +#elif defined (__FreeBSD__) + +#include <sys/wait.h> +#include <sys/sysctl.h> +#include <pthread_np.h> + #endif using namespace lldb; @@ -357,6 +363,8 @@ Host::GetVendorString() g_vendor.SetCString("apple"); #elif defined (__linux__) g_vendor.SetCString("gnu"); +#elif defined (__FreeBSD__) + g_vendor.SetCString("freebsd"); #endif } return g_vendor; @@ -372,6 +380,8 @@ Host::GetOSString() g_os_string.SetCString("darwin"); #elif defined (__linux__) g_os_string.SetCString("linux"); +#elif defined (__FreeBSD__) + g_os_string.SetCString("freebsd"); #endif } return g_os_string; @@ -410,6 +420,8 @@ Host::GetCurrentThreadID() { #if defined (__APPLE__) return ::mach_thread_self(); +#elif defined(__FreeBSD__) + return lldb::tid_t(pthread_getthreadid_np()); #else return lldb::tid_t(pthread_self()); #endif @@ -470,19 +482,17 @@ Host::WillTerminate () { } -#if !defined (__APPLE__) // see macosx/Host.mm +#if !defined (__APPLE__) && !defined (__FreeBSD__) // see macosx/Host.mm void Host::ThreadCreated (const char *thread_name) { } -void Host::Backtrace (Stream &strm, uint32_t max_frames) { // TODO: Is there a way to backtrace the current process on linux? Other systems? } - size_t Host::GetEnvironment (StringList &env) { @@ -1120,9 +1130,7 @@ Host::GetGroupName (uint32_t gid, std::string &group_name) return NULL; } - -#if !defined (__APPLE__) // see macosx/Host.mm - +#if !defined (__APPLE__) && !defined (__FreeBSD__) // see macosx/Host.mm bool Host::GetOSBuildString (std::string &s) { @@ -1136,21 +1144,27 @@ Host::GetOSKernelDescription (std::string &s) s.clear(); return false; } +#endif +#if !defined(__APPLE__) uint32_t Host::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) { process_infos.Clear(); return process_infos.GetSize(); } +#endif +#if !defined (__APPLE__) && !defined (__FreeBSD__) bool Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) { process_info.Clear(); return false; } +#endif +#if !defined (__APPLE__) bool Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) { diff --git a/lldb/source/Host/freebsd/Host.cpp b/lldb/source/Host/freebsd/Host.cpp new file mode 100644 index 00000000000..3d6596c028f --- /dev/null +++ b/lldb/source/Host/freebsd/Host.cpp @@ -0,0 +1,277 @@ +//===-- source/Host/freebsd/Host.cpp ------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// C Includes +#include <stdio.h> +#include <execinfo.h> +#include <sys/types.h> +#include <sys/user.h> +#include <sys/utsname.h> +#include <sys/sysctl.h> + +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/Error.h" +#include "lldb/Host/Endian.h" +#include "lldb/Host/Host.h" +#include "lldb/Core/DataExtractor.h" +#include "lldb/Core/StreamFile.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Target/Process.h" + +#include "llvm/Support/Host.h" + +extern "C" { + char **environ; +} + +using namespace lldb; +using namespace lldb_private; + +class FreeBSDThread +{ +public: + FreeBSDThread(const char *thread_name) + { + Host::SetThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, thread_name); + } + static void PThreadDestructor (void *v) + { + delete (FreeBSDThread*)v; + } +}; + +static pthread_once_t g_thread_create_once = PTHREAD_ONCE_INIT; +static pthread_key_t g_thread_create_key = 0; + +static void +InitThreadCreated() +{ + ::pthread_key_create (&g_thread_create_key, FreeBSDThread::PThreadDestructor); +} + +void +Host::ThreadCreated (const char *thread_name) +{ + ::pthread_once (&g_thread_create_once, InitThreadCreated); + if (g_thread_create_key) + { + ::pthread_setspecific (g_thread_create_key, new FreeBSDThread(thread_name)); + } +} + +void +Host::Backtrace (Stream &strm, uint32_t max_frames) +{ + char backtrace_path[] = "/tmp/lldb-backtrace-tmp-XXXXXX"; + int backtrace_fd = ::mkstemp (backtrace_path); + if (backtrace_fd != -1) + { + std::vector<void *> frame_buffer (max_frames, NULL); + int count = ::backtrace (&frame_buffer[0], frame_buffer.size()); + ::backtrace_symbols_fd (&frame_buffer[0], count, backtrace_fd); + + const off_t buffer_size = ::lseek(backtrace_fd, 0, SEEK_CUR); + + if (::lseek(backtrace_fd, 0, SEEK_SET) == 0) + { + char *buffer = (char *)::malloc (buffer_size); + if (buffer) + { + ssize_t bytes_read = ::read (backtrace_fd, buffer, buffer_size); + if (bytes_read > 0) + strm.Write(buffer, bytes_read); + ::free (buffer); + } + } + ::close (backtrace_fd); + ::unlink (backtrace_path); + } +} + +size_t +Host::GetEnvironment (StringList &env) +{ + char *v; + char **var = environ; + for (var = environ; var != NULL; ++var) { + v = strchr(*var, (int)'-'); + if (v == NULL) + continue; + env.AppendString(v); + } + return env.GetSize(); +} + +bool +Host::GetOSVersion(uint32_t &major, + uint32_t &minor, + uint32_t &update) +{ + struct utsname un; + int status; + + if (uname(&un) < 0) + return false; + + status = sscanf(un.release, "%u.%u-%u", &major, &minor, &update); + return status == 3; +} + +Error +Host::LaunchProcess (ProcessLaunchInfo &launch_info) +{ + Error error; + assert(!"Not implemented yet!!!"); + return error; +} + +bool +Host::GetOSBuildString (std::string &s) +{ + int mib[2] = { CTL_KERN, KERN_OSREV }; + 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 +Host::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; +} + +static bool +GetFreeBSDProcessArgs (const ProcessInstanceInfoMatch *match_info_ptr, + ProcessInstanceInfo &process_info) +{ + if (process_info.ProcessIDIsValid()) { + int mib[3] = { CTL_KERN, KERN_PROC_ARGS, process_info.GetProcessID() }; + + char arg_data[8192]; + size_t arg_data_size = sizeof(arg_data); + if (::sysctl (mib, 3, arg_data, &arg_data_size , NULL, 0) == 0) + { + DataExtractor data (arg_data, arg_data_size, lldb::endian::InlHostByteOrder(), sizeof(void *)); + uint32_t offset = 0; + uint32_t start_offset; + uint32_t argc = data.GetU32 (&offset); + const char *cstr; + + 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<argc; ++i) + { + start_offset = offset; + cstr = data.GetCStr(&offset); + if (cstr) + proc_args.AppendArgument(cstr); + } + return true; + } + } + } + } + return false; +} + +static bool +GetFreeBSDProcessCPUType (ProcessInstanceInfo &process_info) +{ + if (process_info.ProcessIDIsValid()) { + // TODO: This + // return true; + } + process_info.GetArchitecture().Clear(); + return false; +} + +static bool +GetFreeBSDProcessUserAndGroup(ProcessInstanceInfo &process_info) +{ + struct kinfo_proc proc_kinfo; + size_t proc_kinfo_size; + + if (process_info.ProcessIDIsValid()) + { + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, + process_info.GetProcessID() }; + 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.ki_ppid); + process_info.SetUserID (proc_kinfo.ki_ruid); + process_info.SetGroupID (proc_kinfo.ki_rgid); + process_info.SetEffectiveUserID (proc_kinfo.ki_uid); + if (proc_kinfo.ki_ngroups > 0) + process_info.SetEffectiveGroupID (proc_kinfo.ki_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; +} + +bool +Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) +{ + process_info.SetProcessID(pid); + if (GetFreeBSDProcessArgs(NULL, process_info)) { + // should use libprocstat instead of going right into sysctl? + GetFreeBSDProcessCPUType(process_info); + GetFreeBSDProcessUserAndGroup(process_info); + return true; + } + process_info.Clear(); + return false; +} diff --git a/lldb/source/Host/freebsd/Makefile b/lldb/source/Host/freebsd/Makefile new file mode 100644 index 00000000000..4484ee2e48d --- /dev/null +++ b/lldb/source/Host/freebsd/Makefile @@ -0,0 +1,16 @@ +##===- source/Host/freebsd/Makefile --------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LLDB_LEVEL := ../../.. +LIBRARYNAME := lldbHostFreeBSD +BUILD_ARCHIVE = 1 + +CPPFLAGS += -I/usr/local/include + +include $(LLDB_LEVEL)/Makefile diff --git a/lldb/source/Plugins/Makefile b/lldb/source/Plugins/Makefile index c5b927977c6..8ab8771c543 100644 --- a/lldb/source/Plugins/Makefile +++ b/lldb/source/Plugins/Makefile @@ -21,7 +21,7 @@ DIRS := ABI/MacOSX-arm ABI/MacOSX-i386 ABI/SysV-x86_64 Disassembler/llvm \ LanguageRuntime/ObjC/AppleObjCRuntime ifeq ($(HOST_OS),Darwin) -DIRS += DynamicLoader/MacOSX-DYLD ObjectContainer/Universal-Mach-O \ +DIRS += Process/Darwin DynamicLoader/MacOSX-DYLD ObjectContainer/Universal-Mach-O \ ObjectFile/Mach-O SymbolVendor/MacOSX #DIRS += Process/MacOSX-User endif diff --git a/lldb/source/Plugins/Platform/FreeBSD/Makefile b/lldb/source/Plugins/Platform/FreeBSD/Makefile new file mode 100644 index 00000000000..e3962472af3 --- /dev/null +++ b/lldb/source/Plugins/Platform/FreeBSD/Makefile @@ -0,0 +1,14 @@ +##===- source/Plugins/Platform/Linux/Makefile --------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LLDB_LEVEL := ../../../.. +LIBRARYNAME := lldbPluginPlatformFreeBSD +BUILD_ARCHIVE = 1 + +include $(LLDB_LEVEL)/Makefile diff --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp new file mode 100644 index 00000000000..ea9cdeaf31e --- /dev/null +++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp @@ -0,0 +1,262 @@ +//===-- PlatformFreeBSD.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "PlatformFreeBSD.h" + +// C Includes +#include <stdio.h> +#include <sys/utsname.h> + +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/Error.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleList.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Host/FileSpec.h" +#include "lldb/Host/Host.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Process.h" + +using namespace lldb; +using namespace lldb_private; + +Platform * +PlatformFreeBSD::CreateInstance () +{ + return new PlatformFreeBSD(); +} + +const char * +PlatformFreeBSD::GetPluginNameStatic() +{ + return "plugin.platform.FreeBSD"; +} + +const char * +PlatformFreeBSD::GetPluginDescriptionStatic() +{ + return "Default platform plugin for FreeBSD"; +} + +void +PlatformFreeBSD::Initialize () +{ + static bool g_initialized = false; + + if (!g_initialized) + { + PlatformSP default_platform_sp (CreateInstance()); + Platform::SetDefaultPlatform (default_platform_sp); + PluginManager::RegisterPlugin(GetPluginNameStatic(), + GetPluginDescriptionStatic(), + CreateInstance); + g_initialized = true; + } +} + +void +PlatformFreeBSD::Terminate () +{ + PluginManager::UnregisterPlugin (PlatformFreeBSD::CreateInstance); +} + + +Error +PlatformFreeBSD::ResolveExecutable (const FileSpec &exe_file, + const ArchSpec &exe_arch, + lldb::ModuleSP &exe_module_sp) +{ + Error error; + // Nothing special to do here, just use the actual file and architecture + + FileSpec resolved_exe_file (exe_file); + + // If we have "ls" as the exe_file, resolve the executable loation based on + // the current path variables + if (!resolved_exe_file.Exists()) + resolved_exe_file.ResolveExecutableLocation (); + + // Resolve any executable within a bundle on MacOSX + Host::ResolveExecutableInBundle (resolved_exe_file); + + if (resolved_exe_file.Exists()) + { + if (exe_arch.IsValid()) + { + error = ModuleList::GetSharedModule (resolved_exe_file, + exe_arch, + NULL, + NULL, + 0, + exe_module_sp, + NULL, + NULL); + + if (exe_module_sp->GetObjectFile() == NULL) + { + exe_module_sp.reset(); + error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain the architecture %s", + exe_file.GetDirectory().AsCString(""), + exe_file.GetDirectory() ? "/" : "", + exe_file.GetFilename().AsCString(""), + exe_arch.GetArchitectureName()); + } + } + else + { + // No valid architecture was specified, ask the platform for + // the architectures that we should be using (in the correct order) + // and see if we can find a match that way + StreamString arch_names; + ArchSpec platform_arch; + for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx) + { + error = ModuleList::GetSharedModule (resolved_exe_file, + platform_arch, + NULL, + NULL, + 0, + exe_module_sp, + NULL, + NULL); + // Did we find an executable using one of the + if (error.Success()) + { + if (exe_module_sp && exe_module_sp->GetObjectFile()) + break; + else + error.SetErrorToGenericError(); + } + + if (idx > 0) + arch_names.PutCString (", "); + arch_names.PutCString (platform_arch.GetArchitectureName()); + } + + if (error.Fail() || !exe_module_sp) + { + error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s", + exe_file.GetDirectory().AsCString(""), + exe_file.GetDirectory() ? "/" : "", + exe_file.GetFilename().AsCString(""), + GetShortPluginName(), + arch_names.GetString().c_str()); + } + } + } + else + { + error.SetErrorStringWithFormat ("'%s%s%s' does not exist", + exe_file.GetDirectory().AsCString(""), + exe_file.GetDirectory() ? "/" : "", + exe_file.GetFilename().AsCString("")); + } + + return error; +} + +Error +PlatformFreeBSD::GetFile (const FileSpec &platform_file, + const UUID *uuid, FileSpec &local_file) +{ + // Default to the local case + local_file = platform_file; + return Error(); +} + + +//------------------------------------------------------------------ +/// Default Constructor +//------------------------------------------------------------------ +PlatformFreeBSD::PlatformFreeBSD () : + Platform(true) +{ +} + +//------------------------------------------------------------------ +/// Destructor. +/// +/// The destructor is virtual since this class is designed to be +/// inherited from by the plug-in instance. +//------------------------------------------------------------------ +PlatformFreeBSD::~PlatformFreeBSD() +{ +} + +bool +PlatformFreeBSD::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) +{ + return Host::GetProcessInfo (pid, process_info); +} + +bool +PlatformFreeBSD::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) +{ + if (idx == 0) + { + arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); + return arch.IsValid(); + } + return false; +} + +void +PlatformFreeBSD::GetStatus (Stream &strm) +{ + struct utsname un; + + if (uname(&un)) { + strm << "FreeBSD"; + return; + } + + strm << un.sysname << ' ' << un.release << ' ' << un.version << '\n'; +} + +size_t +PlatformFreeBSD::GetSoftwareBreakpointTrapOpcode (Target &target, + BreakpointSite *bp_site) +{ + static const uint8_t g_i386_opcode[] = { 0xCC }; + + ArchSpec arch = target.GetArchitecture(); + const uint8_t *opcode = NULL; + size_t opcode_size = 0; + + switch (arch.GetCore()) + { + default: + assert(false && "CPU type not supported!"); + break; + + case ArchSpec::eCore_x86_32_i386: + case ArchSpec::eCore_x86_64_x86_64: + opcode = g_i386_opcode; + opcode_size = sizeof(g_i386_opcode); + break; + } + + bp_site->SetTrapOpcode(opcode, opcode_size); + return opcode_size; +} + +lldb::ProcessSP +PlatformFreeBSD::Attach(lldb::pid_t pid, + Debugger &debugger, + Target *target, + Listener &listener, + Error &error) +{ + ProcessSP processSP; + assert(!"Not implemented yet!"); + return processSP; +} diff --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h new file mode 100644 index 00000000000..be895d4f2c0 --- /dev/null +++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h @@ -0,0 +1,109 @@ +//===-- PlatformFreeBSD.h -----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_PlatformFreeBSD_h_ +#define liblldb_PlatformFreeBSD_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Target/Platform.h" + +namespace lldb_private { + + class PlatformFreeBSD : public Platform + { + public: + + static void + Initialize (); + + static void + Terminate (); + + PlatformFreeBSD (); + + virtual + ~PlatformFreeBSD(); + + //------------------------------------------------------------ + // lldb_private::PluginInterface functions + //------------------------------------------------------------ + static Platform * + CreateInstance (); + + static const char * + GetPluginNameStatic(); + + static const char * + GetPluginDescriptionStatic(); + + virtual const char * + GetPluginName() + { + return GetPluginNameStatic(); + } + + virtual const char * + GetShortPluginName() + { + return "PlatformFreeBSD"; + } + + virtual uint32_t + GetPluginVersion() + { + return 1; + } + + //------------------------------------------------------------ + // lldb_private::Platform functions + //------------------------------------------------------------ + virtual Error + ResolveExecutable (const FileSpec &exe_file, + const ArchSpec &arch, + lldb::ModuleSP &module_sp); + + virtual const char * + GetDescription () + { + return GetPluginDescriptionStatic(); + } + + virtual void + GetStatus (Stream &strm); + + virtual Error + GetFile (const FileSpec &platform_file, + const UUID* uuid, FileSpec &local_file); + + virtual bool + GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info); + + virtual bool + GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch); + + virtual size_t + GetSoftwareBreakpointTrapOpcode (Target &target, + BreakpointSite *bp_site); + + virtual lldb::ProcessSP + Attach(lldb::pid_t pid, Debugger &debugger, Target *target, + Listener &listener, Error &error); + + protected: + + + private: + DISALLOW_COPY_AND_ASSIGN (PlatformFreeBSD); + }; +} // namespace lldb_private + +#endif // liblldb_PlatformFreeBSD_h_ diff --git a/lldb/source/Plugins/Platform/Makefile b/lldb/source/Plugins/Platform/Makefile index 38dc2de40de..cf4f4bfade9 100644 --- a/lldb/source/Plugins/Platform/Makefile +++ b/lldb/source/Plugins/Platform/Makefile @@ -19,6 +19,10 @@ endif ifeq ($(HOST_OS),Linux) DIRS += Linux -endif +endif + +ifeq ($(HOST_OS),FreeBSD) + DIRS += FreeBSD +endif include $(LLDB_LEVEL)/Makefile diff --git a/lldb/source/lldb.cpp b/lldb/source/lldb.cpp index ec3495a20d9..b6610b70174 100644 --- a/lldb/source/lldb.cpp +++ b/lldb/source/lldb.cpp @@ -56,6 +56,10 @@ #include "Plugins/Process/Linux/ProcessLinux.h" #endif +#if defined (__FreeBSD__) +#include "Plugins/Platform/FreeBSD/PlatformFreeBSD.h" +#endif + #include "Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h" #include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h" @@ -116,6 +120,9 @@ lldb_private::Initialize () ProcessLinux::Initialize(); DynamicLoaderLinuxDYLD::Initialize(); #endif +#if defined (__FreeBSD__) + PlatformFreeBSD::Initialize(); +#endif //---------------------------------------------------------------------- // Platform agnostic plugins //---------------------------------------------------------------------- @@ -181,6 +188,10 @@ lldb_private::Terminate () ProcessLinux::Terminate(); DynamicLoaderLinuxDYLD::Terminate(); #endif + +#if defined (__FreeBSD__) + PlatformFreeBSD::Terminate(); +#endif DynamicLoaderStatic::Terminate(); diff --git a/lldb/tools/driver/IOChannel.h b/lldb/tools/driver/IOChannel.h index 9e3f7387437..5d35d60f932 100644 --- a/lldb/tools/driver/IOChannel.h +++ b/lldb/tools/driver/IOChannel.h @@ -13,7 +13,11 @@ #include <string> #include <queue> +#if defined(__FreeBSD__) +#include <readline/readline.h> +#else #include <editline/readline.h> +#endif #include <histedit.h> #include <pthread.h> #include <sys/time.h> diff --git a/lldb/tools/driver/Makefile b/lldb/tools/driver/Makefile index 63276a0d9da..34b215db384 100644 --- a/lldb/tools/driver/Makefile +++ b/lldb/tools/driver/Makefile @@ -23,3 +23,9 @@ ifeq ($(HOST_OS),Linux) LD.Flags += -Wl,-rpath,$(LibDir) endif +ifeq ($(HOST_OS),FreeBSD) + CPP.Flags += -I/usr/include/edit #-v + LD.Flags += -lEnhancedDisassembly + LD.Flags += -Wl,-rpath,$(LibDir) +endif + |

