aboutsummaryrefslogtreecommitdiff
path: root/source/lldb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/lldb.cpp')
-rw-r--r--source/lldb.cpp425
1 files changed, 425 insertions, 0 deletions
diff --git a/source/lldb.cpp b/source/lldb.cpp
new file mode 100644
index 000000000000..1ac03f4f190c
--- /dev/null
+++ b/source/lldb.cpp
@@ -0,0 +1,425 @@
+//===-- lldb.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/lldb-python.h"
+
+#include "lldb/lldb-private.h"
+#include "lldb/lldb-private-log.h"
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/Debugger.h"
+#include "lldb/Core/Log.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/RegularExpression.h"
+#include "lldb/Core/Timer.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Host/Mutex.h"
+#include "lldb/Target/Target.h"
+#include "lldb/Target/Thread.h"
+
+#include "llvm/ADT/StringRef.h"
+
+#include "Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h"
+#include "Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h"
+#include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h"
+#include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h"
+#include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
+#include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h"
+#include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h"
+#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
+#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
+#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
+#include "Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h"
+#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h"
+#include "Plugins/UnwindAssembly/x86/UnwindAssembly-x86.h"
+#include "Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.h"
+#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
+#include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h"
+#include "Plugins/Platform/FreeBSD/PlatformFreeBSD.h"
+#include "Plugins/Platform/Linux/PlatformLinux.h"
+#include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"
+#ifndef LLDB_DISABLE_PYTHON
+#include "Plugins/OperatingSystem/Python/OperatingSystemPython.h"
+#endif
+#if defined (__APPLE__)
+#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
+#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
+#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h"
+#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h"
+#include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h"
+#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
+#include "Plugins/Process/MacOSX-Kernel/ProcessKDP.h"
+#include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
+#include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
+#include "Plugins/Platform/MacOSX/PlatformDarwinKernel.h"
+#include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h"
+#endif
+
+#include "Plugins/Process/mach-core/ProcessMachCore.h"
+
+#if defined(__linux__) or defined(__FreeBSD__)
+#include "Plugins/Process/elf-core/ProcessElfCore.h"
+#endif
+
+#if defined (__linux__)
+#include "Plugins/Process/Linux/ProcessLinux.h"
+#endif
+
+#if defined (__FreeBSD__)
+#include "Plugins/Process/POSIX/ProcessPOSIX.h"
+#include "Plugins/Process/FreeBSD/ProcessFreeBSD.h"
+#endif
+
+#include "Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h"
+#include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
+#include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+void
+lldb_private::Initialize ()
+{
+ // Make sure we inialize only once
+ static Mutex g_inited_mutex(Mutex::eMutexTypeRecursive);
+ static bool g_inited = false;
+
+ Mutex::Locker locker(g_inited_mutex);
+ if (!g_inited)
+ {
+ g_inited = true;
+ Log::Initialize();
+ Timer::Initialize ();
+ Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
+
+ ABIMacOSX_i386::Initialize();
+ ABIMacOSX_arm::Initialize();
+ ABISysV_x86_64::Initialize();
+ DisassemblerLLVMC::Initialize();
+ ObjectContainerBSDArchive::Initialize();
+ ObjectFileELF::Initialize();
+ SymbolVendorELF::Initialize();
+ SymbolFileDWARF::Initialize();
+ SymbolFileSymtab::Initialize();
+ UnwindAssemblyInstEmulation::Initialize();
+ UnwindAssembly_x86::Initialize();
+ EmulateInstructionARM::Initialize ();
+ ObjectFilePECOFF::Initialize ();
+ DynamicLoaderPOSIXDYLD::Initialize ();
+ PlatformFreeBSD::Initialize();
+ PlatformLinux::Initialize();
+ SymbolFileDWARFDebugMap::Initialize();
+ ItaniumABILanguageRuntime::Initialize();
+#ifndef LLDB_DISABLE_PYTHON
+ OperatingSystemPython::Initialize();
+#endif
+
+#if defined (__APPLE__)
+ //----------------------------------------------------------------------
+ // Apple/Darwin hosted plugins
+ //----------------------------------------------------------------------
+ DynamicLoaderMacOSXDYLD::Initialize();
+ DynamicLoaderDarwinKernel::Initialize();
+ AppleObjCRuntimeV2::Initialize();
+ AppleObjCRuntimeV1::Initialize();
+ ObjectContainerUniversalMachO::Initialize();
+ ObjectFileMachO::Initialize();
+ ProcessKDP::Initialize();
+ ProcessMachCore::Initialize();
+ SymbolVendorMacOSX::Initialize();
+ PlatformDarwinKernel::Initialize();
+ PlatformRemoteiOS::Initialize();
+ PlatformMacOSX::Initialize();
+ PlatformiOSSimulator::Initialize();
+#endif
+#if defined (__linux__)
+ //----------------------------------------------------------------------
+ // Linux hosted plugins
+ //----------------------------------------------------------------------
+ ProcessLinux::Initialize();
+#endif
+#if defined (__FreeBSD__)
+ ProcessFreeBSD::Initialize();
+#endif
+
+#if defined(__linux__) or defined(__FreeBSD__)
+ ProcessElfCore::Initialize();
+#endif
+ //----------------------------------------------------------------------
+ // Platform agnostic plugins
+ //----------------------------------------------------------------------
+ PlatformRemoteGDBServer::Initialize ();
+ ProcessGDBRemote::Initialize();
+ DynamicLoaderStatic::Initialize();
+
+ // Scan for any system or user LLDB plug-ins
+ PluginManager::Initialize();
+
+ // The process settings need to know about installed plug-ins, so the Settings must be initialized
+ // AFTER PluginManager::Initialize is called.
+
+ Debugger::SettingsInitialize();
+ }
+}
+
+void
+lldb_private::WillTerminate()
+{
+ Host::WillTerminate();
+}
+
+void
+lldb_private::Terminate ()
+{
+ Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
+
+ // Terminate and unload and loaded system or user LLDB plug-ins
+ PluginManager::Terminate();
+
+ ABIMacOSX_i386::Terminate();
+ ABIMacOSX_arm::Terminate();
+ ABISysV_x86_64::Terminate();
+ DisassemblerLLVMC::Terminate();
+ ObjectContainerBSDArchive::Terminate();
+ ObjectFileELF::Terminate();
+ SymbolVendorELF::Terminate();
+ SymbolFileDWARF::Terminate();
+ SymbolFileSymtab::Terminate();
+ UnwindAssembly_x86::Terminate();
+ UnwindAssemblyInstEmulation::Terminate();
+ EmulateInstructionARM::Terminate ();
+ ObjectFilePECOFF::Terminate ();
+ DynamicLoaderPOSIXDYLD::Terminate ();
+ PlatformFreeBSD::Terminate();
+ PlatformLinux::Terminate();
+ SymbolFileDWARFDebugMap::Terminate();
+ ItaniumABILanguageRuntime::Terminate();
+#ifndef LLDB_DISABLE_PYTHON
+ OperatingSystemPython::Terminate();
+#endif
+
+#if defined (__APPLE__)
+ DynamicLoaderMacOSXDYLD::Terminate();
+ DynamicLoaderDarwinKernel::Terminate();
+ AppleObjCRuntimeV2::Terminate();
+ AppleObjCRuntimeV1::Terminate();
+ ObjectContainerUniversalMachO::Terminate();
+ ObjectFileMachO::Terminate();
+ ProcessMachCore::Terminate();
+ ProcessKDP::Terminate();
+ SymbolVendorMacOSX::Terminate();
+ PlatformMacOSX::Terminate();
+ PlatformDarwinKernel::Terminate();
+ PlatformRemoteiOS::Terminate();
+ PlatformiOSSimulator::Terminate();
+#endif
+
+ Debugger::SettingsTerminate ();
+
+#if defined (__linux__)
+ ProcessLinux::Terminate();
+#endif
+
+#if defined (__FreeBSD__)
+ ProcessFreeBSD::Terminate();
+#endif
+
+#if defined(__linux__) or defined(__FreeBSD__)
+ ProcessElfCore::Terminate();
+#endif
+ ProcessGDBRemote::Terminate();
+ DynamicLoaderStatic::Terminate();
+
+ Log::Terminate();
+}
+
+#if defined (__APPLE__)
+extern "C" const unsigned char liblldb_coreVersionString[];
+#else
+
+#include "clang/Basic/Version.h"
+
+static const char *
+GetLLDBRevision()
+{
+#ifdef LLDB_REVISION
+ return LLDB_REVISION;
+#else
+ return NULL;
+#endif
+}
+
+static const char *
+GetLLDBRepository()
+{
+#ifdef LLDB_REPOSITORY
+ return LLDB_REPOSITORY;
+#else
+ return NULL;
+#endif
+}
+
+#endif
+
+const char *
+lldb_private::GetVersion ()
+{
+#if defined (__APPLE__)
+ static char g_version_string[32];
+ if (g_version_string[0] == '\0')
+ {
+ const char *version_string = ::strstr ((const char *)liblldb_coreVersionString, "PROJECT:");
+
+ if (version_string)
+ version_string += sizeof("PROJECT:") - 1;
+ else
+ version_string = "unknown";
+
+ const char *newline_loc = strchr(version_string, '\n');
+
+ size_t version_len = sizeof(g_version_string);
+
+ if (newline_loc && (newline_loc - version_string < version_len))
+ version_len = newline_loc - version_string;
+
+ ::strncpy(g_version_string, version_string, version_len);
+ }
+
+ return g_version_string;
+#else
+ // On Linux/FreeBSD/Windows, report a version number in the same style as the clang tool.
+ static std::string g_version_str;
+ if (g_version_str.empty())
+ {
+ g_version_str += "lldb version ";
+ g_version_str += CLANG_VERSION_STRING;
+ const char * lldb_repo = GetLLDBRepository();
+ if (lldb_repo)
+ {
+ g_version_str += " (";
+ g_version_str += lldb_repo;
+ }
+
+ const char *lldb_rev = GetLLDBRevision();
+ if (lldb_rev)
+ {
+ g_version_str += " revision ";
+ g_version_str += lldb_rev;
+ }
+ std::string clang_rev (clang::getClangRevision());
+ if (clang_rev.length() > 0)
+ {
+ g_version_str += " clang revision ";
+ g_version_str += clang_rev;
+ }
+ std::string llvm_rev (clang::getLLVMRevision());
+ if (llvm_rev.length() > 0)
+ {
+ g_version_str += " llvm revision ";
+ g_version_str += llvm_rev;
+ }
+
+ if (lldb_repo)
+ g_version_str += ")";
+ }
+ return g_version_str.c_str();
+#endif
+}
+
+const char *
+lldb_private::GetVoteAsCString (Vote vote)
+{
+ switch (vote)
+ {
+ case eVoteNo: return "no";
+ case eVoteNoOpinion: return "no opinion";
+ case eVoteYes: return "yes";
+ }
+ return "invalid";
+}
+
+
+const char *
+lldb_private::GetSectionTypeAsCString (SectionType sect_type)
+{
+ switch (sect_type)
+ {
+ case eSectionTypeInvalid: return "invalid";
+ case eSectionTypeCode: return "code";
+ case eSectionTypeContainer: return "container";
+ case eSectionTypeData: return "data";
+ case eSectionTypeDataCString: return "data-cstr";
+ case eSectionTypeDataCStringPointers: return "data-cstr-ptr";
+ case eSectionTypeDataSymbolAddress: return "data-symbol-addr";
+ case eSectionTypeData4: return "data-4-byte";
+ case eSectionTypeData8: return "data-8-byte";
+ case eSectionTypeData16: return "data-16-byte";
+ case eSectionTypeDataPointers: return "data-ptrs";
+ case eSectionTypeDebug: return "debug";
+ case eSectionTypeZeroFill: return "zero-fill";
+ case eSectionTypeDataObjCMessageRefs: return "objc-message-refs";
+ case eSectionTypeDataObjCCFStrings: return "objc-cfstrings";
+ case eSectionTypeDWARFDebugAbbrev: return "dwarf-abbrev";
+ case eSectionTypeDWARFDebugAranges: return "dwarf-aranges";
+ case eSectionTypeDWARFDebugFrame: return "dwarf-frame";
+ case eSectionTypeDWARFDebugInfo: return "dwarf-info";
+ case eSectionTypeDWARFDebugLine: return "dwarf-line";
+ case eSectionTypeDWARFDebugLoc: return "dwarf-loc";
+ case eSectionTypeDWARFDebugMacInfo: return "dwarf-macinfo";
+ case eSectionTypeDWARFDebugPubNames: return "dwarf-pubnames";
+ case eSectionTypeDWARFDebugPubTypes: return "dwarf-pubtypes";
+ case eSectionTypeDWARFDebugRanges: return "dwarf-ranges";
+ case eSectionTypeDWARFDebugStr: return "dwarf-str";
+ case eSectionTypeELFSymbolTable: return "elf-symbol-table";
+ case eSectionTypeELFDynamicSymbols: return "elf-dynamic-symbols";
+ case eSectionTypeELFRelocationEntries: return "elf-relocation-entries";
+ case eSectionTypeELFDynamicLinkInfo: return "elf-dynamic-link-info";
+ case eSectionTypeDWARFAppleNames: return "apple-names";
+ case eSectionTypeDWARFAppleTypes: return "apple-types";
+ case eSectionTypeDWARFAppleNamespaces: return "apple-namespaces";
+ case eSectionTypeDWARFAppleObjC: return "apple-objc";
+ case eSectionTypeEHFrame: return "eh-frame";
+ case eSectionTypeOther: return "regular";
+ }
+ return "unknown";
+
+}
+
+bool
+lldb_private::NameMatches (const char *name,
+ NameMatchType match_type,
+ const char *match)
+{
+ if (match_type == eNameMatchIgnore)
+ return true;
+
+ if (name == match)
+ return true;
+
+ if (name && match)
+ {
+ llvm::StringRef name_sref(name);
+ llvm::StringRef match_sref(match);
+ switch (match_type)
+ {
+ case eNameMatchIgnore:
+ return true;
+ case eNameMatchEquals: return name_sref == match_sref;
+ case eNameMatchContains: return name_sref.find (match_sref) != llvm::StringRef::npos;
+ case eNameMatchStartsWith: return name_sref.startswith (match_sref);
+ case eNameMatchEndsWith: return name_sref.endswith (match_sref);
+ case eNameMatchRegularExpression:
+ {
+ RegularExpression regex (match);
+ return regex.Execute (name);
+ }
+ break;
+ }
+ }
+ return false;
+}