lldb.cpp revision 015eb23136c5cfaf31574492dbd8e10fd3e9efd9
1//===-- lldb.cpp ------------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/lldb-private.h" 11#include "lldb/lldb-private-log.h" 12#include "lldb/Core/ArchSpec.h" 13#include "lldb/Core/Debugger.h" 14#include "lldb/Core/Log.h" 15#include "lldb/Core/PluginManager.h" 16#include "lldb/Core/RegularExpression.h" 17#include "lldb/Core/Timer.h" 18#include "lldb/Host/Host.h" 19#include "lldb/Host/Mutex.h" 20#include "lldb/Interpreter/ScriptInterpreter.h" 21#include "lldb/Target/Target.h" 22#include "lldb/Target/Thread.h" 23 24#include "llvm/ADT/StringRef.h" 25 26#include "Plugins/Disassembler/llvm/DisassemblerLLVM.h" 27#include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h" 28#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h" 29#include "Plugins/ObjectFile/ELF/ObjectFileELF.h" 30#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h" 31#include "Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h" 32#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" 33#include "Plugins/Process/Utility/UnwindAssemblyProfiler-x86.h" 34#include "Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h" 35#include "Plugins/Process/Utility/ArchVolatileRegs-x86.h" 36 37#if defined (__APPLE__) 38#include "Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h" 39#include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h" 40#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h" 41#include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h" 42#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h" 43#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h" 44#include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h" 45#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" 46#include "Plugins/Process/MacOSX-User/source/ProcessMacOSX.h" 47#include "Plugins/Process/gdb-remote/ProcessGDBRemote.h" 48#include "Plugins/Platform/MacOSX/PlatformMacOSX.h" 49#endif 50 51#if defined (__linux__) 52#include "Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.h" 53#include "Plugins/Platform/Linux/PlatformLinux.h" 54#include "Plugins/Process/Linux/ProcessLinux.h" 55#endif 56 57#include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h" 58 59using namespace lldb; 60using namespace lldb_private; 61 62 63void 64lldb_private::Initialize () 65{ 66 // Make sure we inialize only once 67 static Mutex g_inited_mutex(Mutex::eMutexTypeRecursive); 68 static bool g_inited = false; 69 70 Mutex::Locker locker(g_inited_mutex); 71 if (!g_inited) 72 { 73 g_inited = true; 74 Log::Initialize(); 75 Timer::Initialize (); 76 Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 77 78 DisassemblerLLVM::Initialize(); 79 ObjectContainerBSDArchive::Initialize(); 80 ObjectFileELF::Initialize(); 81 SymbolFileDWARF::Initialize(); 82 SymbolFileSymtab::Initialize(); 83 UnwindAssemblyProfiler_x86::Initialize(); 84 ArchDefaultUnwindPlan_x86_64::Initialize(); 85 ArchDefaultUnwindPlan_i386::Initialize(); 86 ArchVolatileRegs_x86::Initialize(); 87 ScriptInterpreter::Initialize (); 88 89#if defined (__APPLE__) 90 ABIMacOSX_i386::Initialize(); 91 ABISysV_x86_64::Initialize(); 92 DynamicLoaderMacOSXDYLD::Initialize(); 93 SymbolFileDWARFDebugMap::Initialize(); 94 ItaniumABILanguageRuntime::Initialize(); 95 AppleObjCRuntimeV2::Initialize(); 96 AppleObjCRuntimeV1::Initialize(); 97 ObjectContainerUniversalMachO::Initialize(); 98 ObjectFileMachO::Initialize(); 99 ProcessGDBRemote::Initialize(); 100 //ProcessMacOSX::Initialize(); 101 SymbolVendorMacOSX::Initialize(); 102 PlatformMacOSX::Initialize(); 103#endif 104#if defined (__linux__) 105 PlatformLinux::Initialize(); 106 ProcessLinux::Initialize(); 107 DynamicLoaderLinuxDYLD::Initialize(); 108#endif 109 DynamicLoaderStatic::Initialize(); 110 // Scan for any system or user LLDB plug-ins 111 PluginManager::Initialize(); 112 113 // The process settings need to know about installed plug-ins, so the Settings must be initialized 114 // AFTER PluginManager::Initialize is called. 115 116 Debugger::SettingsInitialize(); 117 } 118} 119 120void 121lldb_private::WillTerminate() 122{ 123 Host::WillTerminate(); 124} 125 126void 127lldb_private::Terminate () 128{ 129 Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 130 131 // Terminate and unload and loaded system or user LLDB plug-ins 132 PluginManager::Terminate(); 133 134 DisassemblerLLVM::Terminate(); 135 ObjectContainerBSDArchive::Terminate(); 136 ObjectFileELF::Terminate(); 137 SymbolFileDWARF::Terminate(); 138 SymbolFileSymtab::Terminate(); 139 UnwindAssemblyProfiler_x86::Terminate(); 140 ArchDefaultUnwindPlan_i386::Terminate(); 141 ArchDefaultUnwindPlan_x86_64::Terminate(); 142 ArchVolatileRegs_x86::Terminate(); 143 ScriptInterpreter::Terminate (); 144 145#if defined (__APPLE__) 146 DynamicLoaderMacOSXDYLD::Terminate(); 147 SymbolFileDWARFDebugMap::Terminate(); 148 ItaniumABILanguageRuntime::Terminate(); 149 AppleObjCRuntimeV2::Terminate(); 150 AppleObjCRuntimeV1::Terminate(); 151 ObjectContainerUniversalMachO::Terminate(); 152 ObjectFileMachO::Terminate(); 153 ProcessGDBRemote::Terminate(); 154 //ProcessMacOSX::Terminate(); 155 SymbolVendorMacOSX::Terminate(); 156 PlatformMacOSX::Terminate(); 157#endif 158 159 Debugger::SettingsTerminate (); 160 161#if defined (__linux__) 162 PlatformLinux::Terminate(); 163 ProcessLinux::Terminate(); 164 DynamicLoaderLinuxDYLD::Terminate(); 165#endif 166 167 DynamicLoaderStatic::Terminate(); 168 169 Log::Terminate(); 170} 171 172extern "C" const double LLDBVersionNumber; 173const char * 174lldb_private::GetVersion () 175{ 176 static char g_version_string[32]; 177 if (g_version_string[0] == '\0') 178 ::snprintf (g_version_string, sizeof(g_version_string), "LLDB-%g", LLDBVersionNumber); 179 180 return g_version_string; 181} 182 183const char * 184lldb_private::GetVoteAsCString (lldb::Vote vote) 185{ 186 switch (vote) 187 { 188 case eVoteNo: return "no"; 189 case eVoteNoOpinion: return "no opinion"; 190 case eVoteYes: return "yes"; 191 default: 192 break; 193 } 194 return "invalid"; 195} 196 197 198const char * 199lldb_private::GetSectionTypeAsCString (lldb::SectionType sect_type) 200{ 201 switch (sect_type) 202 { 203 case eSectionTypeInvalid: return "invalid"; 204 case eSectionTypeCode: return "code"; 205 case eSectionTypeContainer: return "container"; 206 case eSectionTypeData: return "data"; 207 case eSectionTypeDataCString: return "data-cstr"; 208 case eSectionTypeDataCStringPointers: return "data-cstr-ptr"; 209 case eSectionTypeDataSymbolAddress: return "data-symbol-addr"; 210 case eSectionTypeData4: return "data-4-byte"; 211 case eSectionTypeData8: return "data-8-byte"; 212 case eSectionTypeData16: return "data-16-byte"; 213 case eSectionTypeDataPointers: return "data-ptrs"; 214 case eSectionTypeDebug: return "debug"; 215 case eSectionTypeZeroFill: return "zero-fill"; 216 case eSectionTypeDataObjCMessageRefs: return "objc-message-refs"; 217 case eSectionTypeDataObjCCFStrings: return "objc-cfstrings"; 218 case eSectionTypeDWARFDebugAbbrev: return "dwarf-abbrev"; 219 case eSectionTypeDWARFDebugAranges: return "dwarf-aranges"; 220 case eSectionTypeDWARFDebugFrame: return "dwarf-frame"; 221 case eSectionTypeDWARFDebugInfo: return "dwarf-info"; 222 case eSectionTypeDWARFDebugLine: return "dwarf-line"; 223 case eSectionTypeDWARFDebugLoc: return "dwarf-loc"; 224 case eSectionTypeDWARFDebugMacInfo: return "dwarf-macinfo"; 225 case eSectionTypeDWARFDebugPubNames: return "dwarf-pubnames"; 226 case eSectionTypeDWARFDebugPubTypes: return "dwarf-pubtypes"; 227 case eSectionTypeDWARFDebugRanges: return "dwarf-ranges"; 228 case eSectionTypeDWARFDebugStr: return "dwarf-str"; 229 case eSectionTypeEHFrame: return "eh-frame"; 230 case eSectionTypeOther: return "regular"; 231 } 232 return "unknown"; 233 234} 235 236bool 237lldb_private::NameMatches (const char *name, 238 lldb::NameMatchType match_type, 239 const char *match) 240{ 241 if (match_type == eNameMatchIgnore) 242 return true; 243 244 if (name == match) 245 return true; 246 247 if (name && match) 248 { 249 llvm::StringRef name_sref(name); 250 llvm::StringRef match_sref(match); 251 switch (match_type) 252 { 253 case eNameMatchIgnore: 254 return true; 255 case eNameMatchEquals: return name_sref == match_sref; 256 case eNameMatchContains: return name_sref.find (match_sref) != llvm::StringRef::npos; 257 case eNameMatchStartsWith: return name_sref.startswith (match_sref); 258 case eNameMatchEndsWith: return name_sref.endswith (match_sref); 259 case eNameMatchRegularExpression: 260 { 261 RegularExpression regex (match); 262 return regex.Execute (name); 263 } 264 break; 265 default: 266 assert (!"unhandled NameMatchType in lldb_private::NameMatches()"); 267 break; 268 } 269 } 270 return false; 271} 272