]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/source/lldb.cpp
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / source / lldb.cpp
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-python.h"
11
12 #include "lldb/lldb-private.h"
13 #include "lldb/lldb-private-log.h"
14 #include "lldb/Core/ArchSpec.h"
15 #include "lldb/Core/Debugger.h"
16 #include "lldb/Core/Log.h"
17 #include "lldb/Core/PluginManager.h"
18 #include "lldb/Core/RegularExpression.h"
19 #include "lldb/Core/Timer.h"
20 #include "lldb/Host/Host.h"
21 #include "lldb/Host/Mutex.h"
22 #include "lldb/Interpreter/ScriptInterpreterPython.h"
23 #include "lldb/Target/Target.h"
24 #include "lldb/Target/Thread.h"
25
26 #include "llvm/ADT/StringRef.h"
27
28 #include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h"
29 #include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h"
30 #include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
31 #include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h"
32 #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
33 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
34 #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
35 #include "Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h"
36 #include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h"
37 #include "Plugins/UnwindAssembly/x86/UnwindAssembly-x86.h"
38 #include "Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.h"
39 #include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h"
40 #include "Plugins/Platform/FreeBSD/PlatformFreeBSD.h"
41 #include "Plugins/Platform/POSIX/PlatformPOSIX.h"
42 #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"
43 #ifndef LLDB_DISABLE_PYTHON
44 #include "Plugins/OperatingSystem/Python/OperatingSystemPython.h"
45 #endif
46 #if defined (__APPLE__)
47 #include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
48 #include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
49 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h"
50 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h"
51 #include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h"
52 #include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
53 #include "Plugins/Process/MacOSX-Kernel/ProcessKDP.h"
54 #include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
55 #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
56 #include "Plugins/Platform/MacOSX/PlatformDarwinKernel.h"
57 #include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h"
58 #include "Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h"
59 #endif
60
61 #if defined(__linux__) || defined(__FreeBSD__)
62 #include "Plugins/Process/elf-core/ProcessElfCore.h"
63 #endif
64
65 #if defined (__linux__)
66 #include "Plugins/Process/Linux/ProcessLinux.h"
67 #endif
68
69 #if defined (__FreeBSD__)
70 #include "Plugins/Process/POSIX/ProcessPOSIX.h"
71 #include "Plugins/Process/FreeBSD/ProcessFreeBSD.h"
72 #endif
73
74 #include "Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h"
75 #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
76 #include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h"
77
78 using namespace lldb;
79 using namespace lldb_private;
80
81 void
82 lldb_private::Initialize ()
83 {
84     // Make sure we inialize only once
85     static Mutex g_inited_mutex(Mutex::eMutexTypeRecursive);
86     static bool g_inited = false;
87
88     Mutex::Locker locker(g_inited_mutex);
89     if (!g_inited)
90     {
91         g_inited = true;
92         Log::Initialize();
93         Timer::Initialize ();
94         Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
95         
96         ABISysV_x86_64::Initialize();
97         DisassemblerLLVMC::Initialize();
98         ObjectContainerBSDArchive::Initialize();
99         ObjectFileELF::Initialize();
100         SymbolVendorELF::Initialize();
101         SymbolFileDWARF::Initialize();
102         SymbolFileSymtab::Initialize();
103         UnwindAssemblyInstEmulation::Initialize();
104         UnwindAssembly_x86::Initialize();
105         EmulateInstructionARM::Initialize ();
106         DynamicLoaderPOSIXDYLD::Initialize ();
107         PlatformFreeBSD::Initialize();
108         SymbolFileDWARFDebugMap::Initialize();
109         ItaniumABILanguageRuntime::Initialize();
110 #ifndef LLDB_DISABLE_PYTHON
111         ScriptInterpreterPython::InitializePrivate();
112         OperatingSystemPython::Initialize();
113 #endif
114
115 #if defined (__APPLE__)
116         //----------------------------------------------------------------------
117         // Apple/Darwin hosted plugins
118         //----------------------------------------------------------------------
119         DynamicLoaderMacOSXDYLD::Initialize();
120         DynamicLoaderDarwinKernel::Initialize();
121         AppleObjCRuntimeV2::Initialize();
122         AppleObjCRuntimeV1::Initialize();
123         ObjectContainerUniversalMachO::Initialize();
124         ObjectFileMachO::Initialize();
125         ProcessKDP::Initialize();
126         PlatformDarwinKernel::Initialize();
127         PlatformRemoteiOS::Initialize();
128         PlatformMacOSX::Initialize();
129         PlatformiOSSimulator::Initialize();
130         SystemRuntimeMacOSX::Initialize();
131 #endif
132 #if defined (__linux__)
133         //----------------------------------------------------------------------
134         // Linux hosted plugins
135         //----------------------------------------------------------------------
136         ProcessLinux::Initialize();
137 #endif
138 #if defined (__FreeBSD__)
139         ProcessFreeBSD::Initialize();
140 #endif
141
142 #if defined(__linux__) || defined(__FreeBSD__)
143         ProcessElfCore::Initialize();
144 #endif
145         //----------------------------------------------------------------------
146         // Platform agnostic plugins
147         //----------------------------------------------------------------------
148         PlatformRemoteGDBServer::Initialize ();
149         ProcessGDBRemote::Initialize();
150         DynamicLoaderStatic::Initialize();
151
152         // Scan for any system or user LLDB plug-ins
153         PluginManager::Initialize();
154
155         // The process settings need to know about installed plug-ins, so the Settings must be initialized
156         // AFTER PluginManager::Initialize is called.
157         
158         Debugger::SettingsInitialize();
159     }
160 }
161
162 void
163 lldb_private::WillTerminate()
164 {
165     Host::WillTerminate();
166 }
167
168 void
169 lldb_private::Terminate ()
170 {
171     Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
172     
173     // Terminate and unload and loaded system or user LLDB plug-ins
174     PluginManager::Terminate();
175     ABISysV_x86_64::Terminate();
176     DisassemblerLLVMC::Terminate();
177     ObjectContainerBSDArchive::Terminate();
178     ObjectFileELF::Terminate();
179     SymbolVendorELF::Terminate();
180     SymbolFileDWARF::Terminate();
181     SymbolFileSymtab::Terminate();
182     UnwindAssembly_x86::Terminate();
183     UnwindAssemblyInstEmulation::Terminate();
184     EmulateInstructionARM::Terminate ();
185     DynamicLoaderPOSIXDYLD::Terminate ();
186     PlatformFreeBSD::Terminate();
187     SymbolFileDWARFDebugMap::Terminate();
188     ItaniumABILanguageRuntime::Terminate();
189 #ifndef LLDB_DISABLE_PYTHON
190     OperatingSystemPython::Terminate();
191 #endif
192
193 #if defined (__APPLE__)
194     DynamicLoaderMacOSXDYLD::Terminate();
195     DynamicLoaderDarwinKernel::Terminate();
196     AppleObjCRuntimeV2::Terminate();
197     AppleObjCRuntimeV1::Terminate();
198     ObjectContainerUniversalMachO::Terminate();
199     ObjectFileMachO::Terminate();
200     ProcessKDP::Terminate();
201     PlatformMacOSX::Terminate();
202     PlatformDarwinKernel::Terminate();
203     PlatformRemoteiOS::Terminate();
204     PlatformiOSSimulator::Terminate();
205     SystemRuntimeMacOSX::Terminate();
206 #endif
207
208     Debugger::SettingsTerminate ();
209
210 #if defined (__linux__)
211     ProcessLinux::Terminate();
212 #endif
213
214 #if defined (__FreeBSD__)
215     ProcessFreeBSD::Terminate();
216 #endif
217
218 #if defined(__linux__) || defined(__FreeBSD__)
219     ProcessElfCore::Terminate();
220 #endif
221     ProcessGDBRemote::Terminate();
222     DynamicLoaderStatic::Terminate();
223
224     Log::Terminate();
225 }
226
227 #if defined (__APPLE__)
228 extern "C" const unsigned char liblldb_coreVersionString[];
229 #else
230
231 #include "clang/Basic/Version.h"
232
233 static const char *
234 GetLLDBRevision()
235 {
236 #ifdef LLDB_REVISION
237     return LLDB_REVISION;
238 #else
239     return NULL;
240 #endif
241 }
242
243 static const char *
244 GetLLDBRepository()
245 {
246 #ifdef LLDB_REPOSITORY
247     return LLDB_REPOSITORY;
248 #else
249     return NULL;
250 #endif
251 }
252
253 #endif
254
255 const char *
256 lldb_private::GetVersion ()
257 {
258 #if defined (__APPLE__)
259     static char g_version_string[32];
260     if (g_version_string[0] == '\0')
261     {
262         const char *version_string = ::strstr ((const char *)liblldb_coreVersionString, "PROJECT:");
263         
264         if (version_string)
265             version_string += sizeof("PROJECT:") - 1;
266         else
267             version_string = "unknown";
268         
269         const char *newline_loc = strchr(version_string, '\n');
270         
271         size_t version_len = sizeof(g_version_string);
272         
273         if (newline_loc && (newline_loc - version_string < version_len))
274             version_len = newline_loc - version_string;
275         
276         ::strncpy(g_version_string, version_string, version_len);
277     }
278
279     return g_version_string;
280 #else
281     // On Linux/FreeBSD/Windows, report a version number in the same style as the clang tool.
282     static std::string g_version_str;
283     if (g_version_str.empty())
284     {
285         g_version_str += "lldb version ";
286         g_version_str += CLANG_VERSION_STRING;
287         const char * lldb_repo = GetLLDBRepository();
288         if (lldb_repo)
289         {
290             g_version_str += " (";
291             g_version_str += lldb_repo;
292         }
293
294         const char *lldb_rev = GetLLDBRevision();
295         if (lldb_rev)
296         {
297             g_version_str += " revision ";
298             g_version_str += lldb_rev;
299         }
300         std::string clang_rev (clang::getClangRevision());
301         if (clang_rev.length() > 0)
302         {
303             g_version_str += " clang revision ";
304             g_version_str += clang_rev;
305         }
306         std::string llvm_rev (clang::getLLVMRevision());
307         if (llvm_rev.length() > 0)
308         {
309             g_version_str += " llvm revision ";
310             g_version_str += llvm_rev;
311         }
312
313         if (lldb_repo)
314             g_version_str += ")";
315     }
316     return g_version_str.c_str();
317 #endif
318 }
319
320 const char *
321 lldb_private::GetVoteAsCString (Vote vote)
322 {
323     switch (vote)
324     {
325     case eVoteNo:           return "no";
326     case eVoteNoOpinion:    return "no opinion";
327     case eVoteYes:          return "yes";
328     }
329     return "invalid";
330 }
331
332
333 const char *
334 lldb_private::GetSectionTypeAsCString (SectionType sect_type)
335 {
336     switch (sect_type)
337     {
338     case eSectionTypeInvalid: return "invalid";
339     case eSectionTypeCode: return "code";
340     case eSectionTypeContainer: return "container";
341     case eSectionTypeData: return "data";
342     case eSectionTypeDataCString: return "data-cstr";
343     case eSectionTypeDataCStringPointers: return "data-cstr-ptr";
344     case eSectionTypeDataSymbolAddress: return "data-symbol-addr";
345     case eSectionTypeData4: return "data-4-byte";
346     case eSectionTypeData8: return "data-8-byte";
347     case eSectionTypeData16: return "data-16-byte";
348     case eSectionTypeDataPointers: return "data-ptrs";
349     case eSectionTypeDebug: return "debug";
350     case eSectionTypeZeroFill: return "zero-fill";
351     case eSectionTypeDataObjCMessageRefs: return "objc-message-refs";
352     case eSectionTypeDataObjCCFStrings: return "objc-cfstrings";
353     case eSectionTypeDWARFDebugAbbrev: return "dwarf-abbrev";
354     case eSectionTypeDWARFDebugAranges: return "dwarf-aranges";
355     case eSectionTypeDWARFDebugFrame: return "dwarf-frame";
356     case eSectionTypeDWARFDebugInfo: return "dwarf-info";
357     case eSectionTypeDWARFDebugLine: return "dwarf-line";
358     case eSectionTypeDWARFDebugLoc: return "dwarf-loc";
359     case eSectionTypeDWARFDebugMacInfo: return "dwarf-macinfo";
360     case eSectionTypeDWARFDebugPubNames: return "dwarf-pubnames";
361     case eSectionTypeDWARFDebugPubTypes: return "dwarf-pubtypes";
362     case eSectionTypeDWARFDebugRanges: return "dwarf-ranges";
363     case eSectionTypeDWARFDebugStr: return "dwarf-str";
364     case eSectionTypeELFSymbolTable: return "elf-symbol-table";
365     case eSectionTypeELFDynamicSymbols: return "elf-dynamic-symbols";
366     case eSectionTypeELFRelocationEntries: return "elf-relocation-entries";
367     case eSectionTypeELFDynamicLinkInfo: return "elf-dynamic-link-info";
368     case eSectionTypeDWARFAppleNames: return "apple-names";
369     case eSectionTypeDWARFAppleTypes: return "apple-types";
370     case eSectionTypeDWARFAppleNamespaces: return "apple-namespaces";
371     case eSectionTypeDWARFAppleObjC: return "apple-objc";
372     case eSectionTypeEHFrame: return "eh-frame";
373     case eSectionTypeOther: return "regular";
374     }
375     return "unknown";
376
377 }
378
379 bool
380 lldb_private::NameMatches (const char *name, 
381                            NameMatchType match_type, 
382                            const char *match)
383 {
384     if (match_type == eNameMatchIgnore)
385         return true;
386
387     if (name == match)
388         return true;
389
390     if (name && match)
391     {
392         llvm::StringRef name_sref(name);
393         llvm::StringRef match_sref(match);
394         switch (match_type)
395         {
396         case eNameMatchIgnore: // This case cannot occur: tested before
397             return true;
398         case eNameMatchEquals:      return name_sref == match_sref;
399         case eNameMatchContains:    return name_sref.find (match_sref) != llvm::StringRef::npos;
400         case eNameMatchStartsWith:  return name_sref.startswith (match_sref);
401         case eNameMatchEndsWith:    return name_sref.endswith (match_sref);
402         case eNameMatchRegularExpression:
403             {
404                 RegularExpression regex (match);
405                 return regex.Execute (name);
406             }
407             break;
408         }
409     }
410     return false;
411 }