15ec532a9SColin Riley //===-- RenderScriptRuntime.h -----------------------------------*- C++ -*-===// 25ec532a9SColin Riley // 35ec532a9SColin Riley // The LLVM Compiler Infrastructure 45ec532a9SColin Riley // 55ec532a9SColin Riley // This file is distributed under the University of Illinois Open Source 65ec532a9SColin Riley // License. See LICENSE.TXT for details. 75ec532a9SColin Riley // 85ec532a9SColin Riley //===----------------------------------------------------------------------===// 95ec532a9SColin Riley 105ec532a9SColin Riley #ifndef liblldb_RenderScriptRuntime_h_ 115ec532a9SColin Riley #define liblldb_RenderScriptRuntime_h_ 125ec532a9SColin Riley 135ec532a9SColin Riley // C Includes 145ec532a9SColin Riley // C++ Includes 155ec532a9SColin Riley // Other libraries and framework includes 165ec532a9SColin Riley // Project includes 175ec532a9SColin Riley #include "lldb/lldb-private.h" 185ec532a9SColin Riley #include "lldb/Target/LanguageRuntime.h" 195ec532a9SColin Riley #include "lldb/Target/CPPLanguageRuntime.h" 205ec532a9SColin Riley #include "lldb/Core/Module.h" 215ec532a9SColin Riley 225ec532a9SColin Riley namespace lldb_private 235ec532a9SColin Riley { 245ec532a9SColin Riley 255ec532a9SColin Riley typedef uint32_t RSSlot; 265ec532a9SColin Riley class RSModuleDescriptor; 27*4640cde1SColin Riley struct RSGlobalDescriptor; 28*4640cde1SColin Riley struct RSKernelDescriptor; 29*4640cde1SColin Riley 30*4640cde1SColin Riley typedef std::shared_ptr<RSModuleDescriptor> RSModuleDescriptorSP; 31*4640cde1SColin Riley typedef std::shared_ptr<RSGlobalDescriptor> RSGlobalDescriptorSP; 32*4640cde1SColin Riley typedef std::shared_ptr<RSKernelDescriptor> RSKernelDescriptorSP; 33*4640cde1SColin Riley 34*4640cde1SColin Riley 355ec532a9SColin Riley 365ec532a9SColin Riley struct RSKernelDescriptor 375ec532a9SColin Riley { 385ec532a9SColin Riley public: 39*4640cde1SColin Riley RSKernelDescriptor(const RSModuleDescriptor *module, const char *name, uint32_t slot) 405ec532a9SColin Riley : m_module(module) 415ec532a9SColin Riley , m_name(name) 425ec532a9SColin Riley , m_slot(slot) 435ec532a9SColin Riley { 445ec532a9SColin Riley } 455ec532a9SColin Riley 465ec532a9SColin Riley void Dump(Stream &strm) const; 475ec532a9SColin Riley 48*4640cde1SColin Riley const RSModuleDescriptor *m_module; 495ec532a9SColin Riley ConstString m_name; 505ec532a9SColin Riley RSSlot m_slot; 515ec532a9SColin Riley }; 525ec532a9SColin Riley 535ec532a9SColin Riley struct RSGlobalDescriptor 545ec532a9SColin Riley { 555ec532a9SColin Riley public: 56*4640cde1SColin Riley RSGlobalDescriptor(const RSModuleDescriptor *module, const char *name ) 575ec532a9SColin Riley : m_module(module) 585ec532a9SColin Riley , m_name(name) 595ec532a9SColin Riley { 605ec532a9SColin Riley } 615ec532a9SColin Riley 625ec532a9SColin Riley void Dump(Stream &strm) const; 635ec532a9SColin Riley 64*4640cde1SColin Riley const RSModuleDescriptor *m_module; 655ec532a9SColin Riley ConstString m_name; 665ec532a9SColin Riley }; 675ec532a9SColin Riley 685ec532a9SColin Riley class RSModuleDescriptor 695ec532a9SColin Riley { 705ec532a9SColin Riley public: 715ec532a9SColin Riley RSModuleDescriptor(const lldb::ModuleSP &module) 725ec532a9SColin Riley : m_module(module) 735ec532a9SColin Riley { 745ec532a9SColin Riley } 755ec532a9SColin Riley 765ec532a9SColin Riley ~RSModuleDescriptor() {} 775ec532a9SColin Riley 785ec532a9SColin Riley bool ParseRSInfo(); 795ec532a9SColin Riley 805ec532a9SColin Riley void Dump(Stream &strm) const; 815ec532a9SColin Riley 825ec532a9SColin Riley const lldb::ModuleSP m_module; 835ec532a9SColin Riley std::vector<RSKernelDescriptor> m_kernels; 845ec532a9SColin Riley std::vector<RSGlobalDescriptor> m_globals; 85*4640cde1SColin Riley std::map<std::string, std::string> m_pragmas; 86*4640cde1SColin Riley std::string m_resname; 875ec532a9SColin Riley }; 885ec532a9SColin Riley 895ec532a9SColin Riley class RenderScriptRuntime : public lldb_private::CPPLanguageRuntime 905ec532a9SColin Riley { 915ec532a9SColin Riley public: 92ef20b08fSColin Riley 93ef20b08fSColin Riley enum ModuleKind 94ef20b08fSColin Riley { 95ef20b08fSColin Riley eModuleKindIgnored, 96ef20b08fSColin Riley eModuleKindLibRS, 97ef20b08fSColin Riley eModuleKindDriver, 98ef20b08fSColin Riley eModuleKindImpl, 99ef20b08fSColin Riley eModuleKindKernelObj 100ef20b08fSColin Riley }; 101ef20b08fSColin Riley 102*4640cde1SColin Riley 1035ec532a9SColin Riley ~RenderScriptRuntime() {} 1045ec532a9SColin Riley 1055ec532a9SColin Riley //------------------------------------------------------------------ 1065ec532a9SColin Riley // Static Functions 1075ec532a9SColin Riley //------------------------------------------------------------------ 1085ec532a9SColin Riley static void Initialize(); 1095ec532a9SColin Riley 1105ec532a9SColin Riley static void Terminate(); 1115ec532a9SColin Riley 1125ec532a9SColin Riley static lldb_private::LanguageRuntime *CreateInstance(Process *process, lldb::LanguageType language); 1135ec532a9SColin Riley 114*4640cde1SColin Riley static lldb::CommandObjectSP GetCommandObject(CommandInterpreter& interpreter); 115*4640cde1SColin Riley 1165ec532a9SColin Riley static lldb_private::ConstString GetPluginNameStatic(); 1175ec532a9SColin Riley 118ef20b08fSColin Riley static bool IsRenderScriptModule(const lldb::ModuleSP &module_sp); 119ef20b08fSColin Riley 120ef20b08fSColin Riley static ModuleKind GetModuleKind(const lldb::ModuleSP &module_sp); 121ef20b08fSColin Riley 122ef20b08fSColin Riley static void ModulesDidLoad(const lldb::ProcessSP& process_sp, const ModuleList &module_list ); 123ef20b08fSColin Riley 1245ec532a9SColin Riley //------------------------------------------------------------------ 1255ec532a9SColin Riley // PluginInterface protocol 1265ec532a9SColin Riley //------------------------------------------------------------------ 1275ec532a9SColin Riley virtual lldb_private::ConstString GetPluginName(); 1285ec532a9SColin Riley 1295ec532a9SColin Riley virtual uint32_t GetPluginVersion(); 1305ec532a9SColin Riley 1315ec532a9SColin Riley virtual bool IsVTableName(const char *name); 1325ec532a9SColin Riley 1335ec532a9SColin Riley virtual bool GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, 1345ec532a9SColin Riley TypeAndOrName &class_type_or_name, Address &address); 1355ec532a9SColin Riley 1365ec532a9SColin Riley virtual bool CouldHaveDynamicValue(ValueObject &in_value); 1375ec532a9SColin Riley 1385ec532a9SColin Riley virtual lldb::BreakpointResolverSP CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp); 1395ec532a9SColin Riley 1405ec532a9SColin Riley bool LoadModule(const lldb::ModuleSP &module_sp); 1415ec532a9SColin Riley 1425ec532a9SColin Riley bool ProbeModules(const ModuleList module_list); 1435ec532a9SColin Riley 1445ec532a9SColin Riley void DumpModules(Stream &strm) const; 1455ec532a9SColin Riley 146*4640cde1SColin Riley void DumpContexts(Stream &strm) const; 147*4640cde1SColin Riley 148*4640cde1SColin Riley void DumpKernels(Stream &strm) const; 149*4640cde1SColin Riley 150*4640cde1SColin Riley void AttemptBreakpointAtKernelName(Stream &strm, const char *name, Error &error); 151*4640cde1SColin Riley 152*4640cde1SColin Riley void Status(Stream &strm) const; 153*4640cde1SColin Riley 15492935952SSiva Chandra virtual size_t GetAlternateManglings(const ConstString &mangled, std::vector<ConstString> &alternates) { 15592935952SSiva Chandra return static_cast<size_t>(0); 15692935952SSiva Chandra } 15792935952SSiva Chandra 158ef20b08fSColin Riley virtual void ModulesDidLoad(const ModuleList &module_list ); 159ef20b08fSColin Riley 160ef20b08fSColin Riley void Update(); 161ef20b08fSColin Riley 162ef20b08fSColin Riley void Initiate(); 163ef20b08fSColin Riley 1645ec532a9SColin Riley protected: 165*4640cde1SColin Riley 166*4640cde1SColin Riley void FixupScriptDetails(RSModuleDescriptorSP rsmodule_sp); 167*4640cde1SColin Riley 168*4640cde1SColin Riley void LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind); 169*4640cde1SColin Riley 170*4640cde1SColin Riley struct RuntimeHook; 171*4640cde1SColin Riley typedef void (RenderScriptRuntime::*CaptureStateFn)(RuntimeHook* hook_info, ExecutionContext &context); // Please do this! 172*4640cde1SColin Riley 173*4640cde1SColin Riley struct HookDefn 174*4640cde1SColin Riley { 175*4640cde1SColin Riley const char * name; 176*4640cde1SColin Riley const char * symbol_name; 177*4640cde1SColin Riley uint32_t version; 178*4640cde1SColin Riley ModuleKind kind; 179*4640cde1SColin Riley CaptureStateFn grabber; 180*4640cde1SColin Riley }; 181*4640cde1SColin Riley 182*4640cde1SColin Riley struct RuntimeHook 183*4640cde1SColin Riley { 184*4640cde1SColin Riley lldb::addr_t address; 185*4640cde1SColin Riley const HookDefn *defn; 186*4640cde1SColin Riley lldb::BreakpointSP bp_sp; 187*4640cde1SColin Riley }; 188*4640cde1SColin Riley 189*4640cde1SColin Riley typedef std::shared_ptr<RuntimeHook> RuntimeHookSP; 190*4640cde1SColin Riley 191*4640cde1SColin Riley struct ScriptDetails 192*4640cde1SColin Riley { 193*4640cde1SColin Riley std::string resname; 194*4640cde1SColin Riley std::string scriptDyLib; 195*4640cde1SColin Riley std::string cachedir; 196*4640cde1SColin Riley lldb::addr_t context; 197*4640cde1SColin Riley lldb::addr_t script; 198*4640cde1SColin Riley }; 199*4640cde1SColin Riley 200*4640cde1SColin Riley lldb::ModuleSP m_libRS; 201*4640cde1SColin Riley lldb::ModuleSP m_libRSDriver; 202*4640cde1SColin Riley lldb::ModuleSP m_libRSCpuRef; 203*4640cde1SColin Riley std::vector<RSModuleDescriptorSP> m_rsmodules; 204*4640cde1SColin Riley std::vector<ScriptDetails> m_scripts; 205*4640cde1SColin Riley 206*4640cde1SColin Riley std::map<lldb::addr_t, RSModuleDescriptorSP> m_scriptMappings; 207*4640cde1SColin Riley std::map<lldb::addr_t, RuntimeHookSP> m_runtimeHooks; 208*4640cde1SColin Riley 209ef20b08fSColin Riley bool m_initiated; 210*4640cde1SColin Riley bool m_debuggerPresentFlagged; 211*4640cde1SColin Riley static const HookDefn s_runtimeHookDefns[]; 212*4640cde1SColin Riley static const size_t s_runtimeHookCount; 213*4640cde1SColin Riley 2145ec532a9SColin Riley private: 2155ec532a9SColin Riley RenderScriptRuntime(Process *process); // Call CreateInstance instead. 216*4640cde1SColin Riley 217*4640cde1SColin Riley static bool HookCallback(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, 218*4640cde1SColin Riley lldb::user_id_t break_loc_id); 219*4640cde1SColin Riley 220*4640cde1SColin Riley void HookCallback(RuntimeHook* hook_info, ExecutionContext& context); 221*4640cde1SColin Riley 222*4640cde1SColin Riley bool GetArg32Simple(ExecutionContext& context, uint32_t arg, uint32_t *data); 223*4640cde1SColin Riley 224*4640cde1SColin Riley void CaptureScriptInit1(RuntimeHook* hook_info, ExecutionContext& context); 225*4640cde1SColin Riley void CaptureAllocationInit1(RuntimeHook* hook_info, ExecutionContext& context); 226*4640cde1SColin Riley void CaptureSetGlobalVar1(RuntimeHook* hook_info, ExecutionContext& context); 227*4640cde1SColin Riley 2285ec532a9SColin Riley }; 2295ec532a9SColin Riley 2305ec532a9SColin Riley } // namespace lldb_private 2315ec532a9SColin Riley 2325ec532a9SColin Riley #endif // liblldb_RenderScriptRuntime_h_ 233