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