1 //===-- InstrumentationRuntime.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 // C Includes 11 // C++ Includes 12 // Other libraries and framework includes 13 // Project includes 14 #include "lldb/Target/InstrumentationRuntime.h" 15 #include "lldb/Core/Module.h" 16 #include "lldb/Core/ModuleList.h" 17 #include "lldb/Core/PluginManager.h" 18 #include "lldb/Core/RegularExpression.h" 19 #include "lldb/Target/Process.h" 20 #include "lldb/lldb-private.h" 21 22 using namespace lldb; 23 using namespace lldb_private; 24 25 void InstrumentationRuntime::ModulesDidLoad( 26 lldb_private::ModuleList &module_list, lldb_private::Process *process, 27 InstrumentationRuntimeCollection &runtimes) { 28 InstrumentationRuntimeCreateInstance create_callback = nullptr; 29 InstrumentationRuntimeGetType get_type_callback; 30 for (uint32_t idx = 0;; ++idx) { 31 create_callback = 32 PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx); 33 if (create_callback == nullptr) 34 break; 35 get_type_callback = 36 PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx); 37 InstrumentationRuntimeType type = get_type_callback(); 38 39 InstrumentationRuntimeCollection::iterator pos; 40 pos = runtimes.find(type); 41 if (pos == runtimes.end()) { 42 runtimes[type] = create_callback(process->shared_from_this()); 43 } 44 } 45 } 46 47 void InstrumentationRuntime::ModulesDidLoad( 48 lldb_private::ModuleList &module_list) { 49 if (IsActive()) 50 return; 51 52 if (GetRuntimeModuleSP()) { 53 Activate(); 54 return; 55 } 56 57 module_list.ForEach([this](const lldb::ModuleSP module_sp) -> bool { 58 const FileSpec &file_spec = module_sp->GetFileSpec(); 59 if (!file_spec) 60 return true; // Keep iterating. 61 62 const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary(); 63 if (runtime_regex.Execute(file_spec.GetFilename().GetCString()) || 64 module_sp->IsExecutable()) { 65 if (CheckIfRuntimeIsValid(module_sp)) { 66 SetRuntimeModuleSP(module_sp); 67 Activate(); 68 return false; // Stop iterating, we're done. 69 } 70 } 71 72 return true; 73 }); 74 } 75 76 lldb::ThreadCollectionSP 77 InstrumentationRuntime::GetBacktracesFromExtendedStopInfo( 78 StructuredData::ObjectSP info) { 79 return ThreadCollectionSP(new ThreadCollection()); 80 } 81