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 15222b937cSEugene Zelenko #include <array> 16222b937cSEugene Zelenko #include <map> 17222b937cSEugene Zelenko #include <memory> 18222b937cSEugene Zelenko #include <string> 19222b937cSEugene Zelenko #include <vector> 20222b937cSEugene Zelenko 215ec532a9SColin Riley // Other libraries and framework includes 225ec532a9SColin Riley // Project includes 235ec532a9SColin Riley #include "lldb/Core/Module.h" 24b3f7f69dSAidan Dodds #include "lldb/Target/CPPLanguageRuntime.h" 25b3f7f69dSAidan Dodds #include "lldb/Target/LanguageRuntime.h" 26b3f7f69dSAidan Dodds #include "lldb/lldb-private.h" 275ec532a9SColin Riley 28b3f7f69dSAidan Dodds namespace lldb_private 29b3f7f69dSAidan Dodds { 30b3f7f69dSAidan Dodds namespace lldb_renderscript 31b3f7f69dSAidan Dodds { 3298156583SEwan Crawford 335ec532a9SColin Riley typedef uint32_t RSSlot; 345ec532a9SColin Riley class RSModuleDescriptor; 354640cde1SColin Riley struct RSGlobalDescriptor; 364640cde1SColin Riley struct RSKernelDescriptor; 374640cde1SColin Riley 384640cde1SColin Riley typedef std::shared_ptr<RSModuleDescriptor> RSModuleDescriptorSP; 394640cde1SColin Riley typedef std::shared_ptr<RSGlobalDescriptor> RSGlobalDescriptorSP; 404640cde1SColin Riley typedef std::shared_ptr<RSKernelDescriptor> RSKernelDescriptorSP; 414f8817c2SEwan Crawford typedef std::array<uint32_t, 3> RSCoordinate; 424640cde1SColin Riley 4398156583SEwan Crawford // Breakpoint Resolvers decide where a breakpoint is placed, 4498156583SEwan Crawford // so having our own allows us to limit the search scope to RS kernel modules. 4598156583SEwan Crawford // As well as check for .expand kernels as a fallback. 4698156583SEwan Crawford class RSBreakpointResolver : public BreakpointResolver 4798156583SEwan Crawford { 4898156583SEwan Crawford public: 49b3f7f69dSAidan Dodds RSBreakpointResolver(Breakpoint *bkpt, ConstString name) 50b3f7f69dSAidan Dodds : BreakpointResolver(bkpt, BreakpointResolver::NameResolver), m_kernel_name(name) 5198156583SEwan Crawford { 5298156583SEwan Crawford } 5398156583SEwan Crawford 5498156583SEwan Crawford void 5598156583SEwan Crawford GetDescription(Stream *strm) override 5698156583SEwan Crawford { 5798156583SEwan Crawford if (strm) 5898156583SEwan Crawford strm->Printf("RenderScript kernel breakpoint for '%s'", m_kernel_name.AsCString()); 5998156583SEwan Crawford } 6098156583SEwan Crawford 6198156583SEwan Crawford void 6298156583SEwan Crawford Dump(Stream *s) const override 6398156583SEwan Crawford { 6498156583SEwan Crawford } 6598156583SEwan Crawford 6698156583SEwan Crawford Searcher::CallbackReturn 67b3f7f69dSAidan Dodds SearchCallback(SearchFilter &filter, SymbolContext &context, Address *addr, bool containing) override; 6898156583SEwan Crawford 6998156583SEwan Crawford Searcher::Depth 7098156583SEwan Crawford GetDepth() override 7198156583SEwan Crawford { 7298156583SEwan Crawford return Searcher::eDepthModule; 7398156583SEwan Crawford } 7498156583SEwan Crawford 7598156583SEwan Crawford lldb::BreakpointResolverSP 7698156583SEwan Crawford CopyForBreakpoint(Breakpoint &breakpoint) override 7798156583SEwan Crawford { 7898156583SEwan Crawford lldb::BreakpointResolverSP ret_sp(new RSBreakpointResolver(&breakpoint, m_kernel_name)); 7998156583SEwan Crawford return ret_sp; 8098156583SEwan Crawford } 8198156583SEwan Crawford 8298156583SEwan Crawford protected: 8398156583SEwan Crawford ConstString m_kernel_name; 8498156583SEwan Crawford }; 855ec532a9SColin Riley 865ec532a9SColin Riley struct RSKernelDescriptor 875ec532a9SColin Riley { 885ec532a9SColin Riley public: 894640cde1SColin Riley RSKernelDescriptor(const RSModuleDescriptor *module, const char *name, uint32_t slot) 90b3f7f69dSAidan Dodds : m_module(module), m_name(name), m_slot(slot) 915ec532a9SColin Riley { 925ec532a9SColin Riley } 935ec532a9SColin Riley 94b3f7f69dSAidan Dodds void 95b3f7f69dSAidan Dodds Dump(Stream &strm) const; 965ec532a9SColin Riley 974640cde1SColin Riley const RSModuleDescriptor *m_module; 985ec532a9SColin Riley ConstString m_name; 995ec532a9SColin Riley RSSlot m_slot; 1005ec532a9SColin Riley }; 1015ec532a9SColin Riley 1025ec532a9SColin Riley struct RSGlobalDescriptor 1035ec532a9SColin Riley { 1045ec532a9SColin Riley public: 105b3f7f69dSAidan Dodds RSGlobalDescriptor(const RSModuleDescriptor *module, const char *name) : m_module(module), m_name(name) {} 1065ec532a9SColin Riley 107b3f7f69dSAidan Dodds void 108b3f7f69dSAidan Dodds Dump(Stream &strm) const; 1095ec532a9SColin Riley 1104640cde1SColin Riley const RSModuleDescriptor *m_module; 1115ec532a9SColin Riley ConstString m_name; 1125ec532a9SColin Riley }; 1135ec532a9SColin Riley 1145ec532a9SColin Riley class RSModuleDescriptor 1155ec532a9SColin Riley { 1165ec532a9SColin Riley public: 117b3f7f69dSAidan Dodds RSModuleDescriptor(const lldb::ModuleSP &module) : m_module(module) {} 1185ec532a9SColin Riley 119222b937cSEugene Zelenko ~RSModuleDescriptor() = default; 1205ec532a9SColin Riley 121b3f7f69dSAidan Dodds bool 122b3f7f69dSAidan Dodds ParseRSInfo(); 1235ec532a9SColin Riley 124b3f7f69dSAidan Dodds void 125b3f7f69dSAidan Dodds Dump(Stream &strm) const; 1265ec532a9SColin Riley 1275ec532a9SColin Riley const lldb::ModuleSP m_module; 1285ec532a9SColin Riley std::vector<RSKernelDescriptor> m_kernels; 1295ec532a9SColin Riley std::vector<RSGlobalDescriptor> m_globals; 1304640cde1SColin Riley std::map<std::string, std::string> m_pragmas; 1314640cde1SColin Riley std::string m_resname; 1325ec532a9SColin Riley }; 1335ec532a9SColin Riley 134222b937cSEugene Zelenko } // namespace lldb_renderscript 13598156583SEwan Crawford 1365ec532a9SColin Riley class RenderScriptRuntime : public lldb_private::CPPLanguageRuntime 1375ec532a9SColin Riley { 1385ec532a9SColin Riley public: 139ef20b08fSColin Riley enum ModuleKind 140ef20b08fSColin Riley { 141ef20b08fSColin Riley eModuleKindIgnored, 142ef20b08fSColin Riley eModuleKindLibRS, 143ef20b08fSColin Riley eModuleKindDriver, 144ef20b08fSColin Riley eModuleKindImpl, 145ef20b08fSColin Riley eModuleKindKernelObj 146ef20b08fSColin Riley }; 147ef20b08fSColin Riley 148222b937cSEugene Zelenko ~RenderScriptRuntime() override; 1495ec532a9SColin Riley 1505ec532a9SColin Riley //------------------------------------------------------------------ 1515ec532a9SColin Riley // Static Functions 1525ec532a9SColin Riley //------------------------------------------------------------------ 153b3f7f69dSAidan Dodds static void 154b3f7f69dSAidan Dodds Initialize(); 1555ec532a9SColin Riley 156b3f7f69dSAidan Dodds static void 157b3f7f69dSAidan Dodds Terminate(); 1585ec532a9SColin Riley 159b3f7f69dSAidan Dodds static lldb_private::LanguageRuntime * 160b3f7f69dSAidan Dodds CreateInstance(Process *process, lldb::LanguageType language); 1615ec532a9SColin Riley 162b3f7f69dSAidan Dodds static lldb::CommandObjectSP 163b3f7f69dSAidan Dodds GetCommandObject(CommandInterpreter &interpreter); 1644640cde1SColin Riley 165b3f7f69dSAidan Dodds static lldb_private::ConstString 166b3f7f69dSAidan Dodds GetPluginNameStatic(); 1675ec532a9SColin Riley 168b3f7f69dSAidan Dodds static bool 169b3f7f69dSAidan Dodds IsRenderScriptModule(const lldb::ModuleSP &module_sp); 170ef20b08fSColin Riley 171b3f7f69dSAidan Dodds static ModuleKind 172b3f7f69dSAidan Dodds GetModuleKind(const lldb::ModuleSP &module_sp); 173ef20b08fSColin Riley 174b3f7f69dSAidan Dodds static void 175b3f7f69dSAidan Dodds ModulesDidLoad(const lldb::ProcessSP &process_sp, const ModuleList &module_list); 176ef20b08fSColin Riley 177b3f7f69dSAidan Dodds bool 178b3f7f69dSAidan Dodds IsVTableName(const char *name) override; 1795ec532a9SColin Riley 180b3f7f69dSAidan Dodds bool 181b3f7f69dSAidan Dodds GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, 1820b6003f3SEnrico Granata TypeAndOrName &class_type_or_name, Address &address, 183222b937cSEugene Zelenko Value::ValueType &value_type) override; 184c74275bcSEnrico Granata 185222b937cSEugene Zelenko TypeAndOrName 186b3f7f69dSAidan Dodds FixUpDynamicType(const TypeAndOrName &type_and_or_name, ValueObject &static_value) override; 1875ec532a9SColin Riley 188b3f7f69dSAidan Dodds bool 189b3f7f69dSAidan Dodds CouldHaveDynamicValue(ValueObject &in_value) override; 1905ec532a9SColin Riley 191b3f7f69dSAidan Dodds lldb::BreakpointResolverSP 192b3f7f69dSAidan Dodds CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp) override; 1935ec532a9SColin Riley 194b3f7f69dSAidan Dodds bool 195b3f7f69dSAidan Dodds LoadModule(const lldb::ModuleSP &module_sp); 1965ec532a9SColin Riley 197b3f7f69dSAidan Dodds void 198b3f7f69dSAidan Dodds DumpModules(Stream &strm) const; 1995ec532a9SColin Riley 200b3f7f69dSAidan Dodds void 201b3f7f69dSAidan Dodds DumpContexts(Stream &strm) const; 2024640cde1SColin Riley 203b3f7f69dSAidan Dodds void 204b3f7f69dSAidan Dodds DumpKernels(Stream &strm) const; 2054640cde1SColin Riley 206b3f7f69dSAidan Dodds bool 207b3f7f69dSAidan Dodds DumpAllocation(Stream &strm, StackFrame *frame_ptr, const uint32_t id); 208a0f08674SEwan Crawford 209b649b005SEwan Crawford void 210b649b005SEwan Crawford ListAllocations(Stream &strm, StackFrame *frame_ptr, const uint32_t index); 21115f2bd95SEwan Crawford 212*0d2bfcfbSEwan Crawford bool 213*0d2bfcfbSEwan Crawford RecomputeAllAllocations(Stream &strm, StackFrame *frame_ptr); 214*0d2bfcfbSEwan Crawford 215b3f7f69dSAidan Dodds void 216b3f7f69dSAidan Dodds PlaceBreakpointOnKernel(Stream &strm, const char *name, const std::array<int, 3> coords, Error &error, 217b3f7f69dSAidan Dodds lldb::TargetSP target); 2184640cde1SColin Riley 219b3f7f69dSAidan Dodds void 220b3f7f69dSAidan Dodds SetBreakAllKernels(bool do_break, lldb::TargetSP target); 2217dc7771cSEwan Crawford 222b3f7f69dSAidan Dodds void 223b3f7f69dSAidan Dodds Status(Stream &strm) const; 2244640cde1SColin Riley 225b3f7f69dSAidan Dodds void 226b3f7f69dSAidan Dodds ModulesDidLoad(const ModuleList &module_list) override; 227ef20b08fSColin Riley 228b3f7f69dSAidan Dodds bool 229b3f7f69dSAidan Dodds LoadAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); 23055232f09SEwan Crawford 231b3f7f69dSAidan Dodds bool 232b3f7f69dSAidan Dodds SaveAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); 23355232f09SEwan Crawford 234b3f7f69dSAidan Dodds void 235b3f7f69dSAidan Dodds Update(); 236ef20b08fSColin Riley 237b3f7f69dSAidan Dodds void 238b3f7f69dSAidan Dodds Initiate(); 239ef20b08fSColin Riley 240222b937cSEugene Zelenko //------------------------------------------------------------------ 241222b937cSEugene Zelenko // PluginInterface protocol 242222b937cSEugene Zelenko //------------------------------------------------------------------ 243b3f7f69dSAidan Dodds lldb_private::ConstString 244b3f7f69dSAidan Dodds GetPluginName() override; 2454640cde1SColin Riley 246b3f7f69dSAidan Dodds uint32_t 247b3f7f69dSAidan Dodds GetPluginVersion() override; 248222b937cSEugene Zelenko 2494f8817c2SEwan Crawford static bool 2504f8817c2SEwan Crawford GetKernelCoordinate(lldb_renderscript::RSCoordinate &coord, Thread *thread_ptr); 2514f8817c2SEwan Crawford 252222b937cSEugene Zelenko protected: 25315f2bd95SEwan Crawford struct ScriptDetails; 25415f2bd95SEwan Crawford struct AllocationDetails; 2558b244e21SEwan Crawford struct Element; 25615f2bd95SEwan Crawford 257b3f7f69dSAidan Dodds void 258b3f7f69dSAidan Dodds InitSearchFilter(lldb::TargetSP target) 2597dc7771cSEwan Crawford { 2607dc7771cSEwan Crawford if (!m_filtersp) 2617dc7771cSEwan Crawford m_filtersp.reset(new SearchFilterForUnconstrainedSearches(target)); 2627dc7771cSEwan Crawford } 2637dc7771cSEwan Crawford 264b3f7f69dSAidan Dodds void 265b3f7f69dSAidan Dodds FixupScriptDetails(lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); 2664640cde1SColin Riley 267b3f7f69dSAidan Dodds void 268b3f7f69dSAidan Dodds LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind); 2694640cde1SColin Riley 270b3f7f69dSAidan Dodds bool 271b3f7f69dSAidan Dodds RefreshAllocation(AllocationDetails *allocation, StackFrame *frame_ptr); 27215f2bd95SEwan Crawford 273b3f7f69dSAidan Dodds bool 274b3f7f69dSAidan Dodds EvalRSExpression(const char *expression, StackFrame *frame_ptr, uint64_t *result); 27515f2bd95SEwan Crawford 276b3f7f69dSAidan Dodds lldb::BreakpointSP 277b3f7f69dSAidan Dodds CreateKernelBreakpoint(const ConstString &name); 2787dc7771cSEwan Crawford 279b3f7f69dSAidan Dodds void 280b3f7f69dSAidan Dodds BreakOnModuleKernels(const lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); 2817dc7771cSEwan Crawford 2824640cde1SColin Riley struct RuntimeHook; 283b3f7f69dSAidan Dodds typedef void (RenderScriptRuntime::*CaptureStateFn)(RuntimeHook *hook_info, 284b3f7f69dSAidan Dodds ExecutionContext &context); // Please do this! 2854640cde1SColin Riley 2864640cde1SColin Riley struct HookDefn 2874640cde1SColin Riley { 2884640cde1SColin Riley const char *name; 28982780287SAidan Dodds const char *symbol_name_m32; // mangled name for the 32 bit architectures 29082780287SAidan Dodds const char *symbol_name_m64; // mangled name for the 64 bit archs 2914640cde1SColin Riley uint32_t version; 2924640cde1SColin Riley ModuleKind kind; 2934640cde1SColin Riley CaptureStateFn grabber; 2944640cde1SColin Riley }; 2954640cde1SColin Riley 2964640cde1SColin Riley struct RuntimeHook 2974640cde1SColin Riley { 2984640cde1SColin Riley lldb::addr_t address; 2994640cde1SColin Riley const HookDefn *defn; 3004640cde1SColin Riley lldb::BreakpointSP bp_sp; 3014640cde1SColin Riley }; 3024640cde1SColin Riley 3034640cde1SColin Riley typedef std::shared_ptr<RuntimeHook> RuntimeHookSP; 3044640cde1SColin Riley 3054640cde1SColin Riley lldb::ModuleSP m_libRS; 3064640cde1SColin Riley lldb::ModuleSP m_libRSDriver; 3074640cde1SColin Riley lldb::ModuleSP m_libRSCpuRef; 30898156583SEwan Crawford std::vector<lldb_renderscript::RSModuleDescriptorSP> m_rsmodules; 30978f339d1SEwan Crawford 31078f339d1SEwan Crawford std::vector<std::unique_ptr<ScriptDetails>> m_scripts; 31178f339d1SEwan Crawford std::vector<std::unique_ptr<AllocationDetails>> m_allocations; 3124640cde1SColin Riley 31398156583SEwan Crawford std::map<lldb::addr_t, lldb_renderscript::RSModuleDescriptorSP> m_scriptMappings; 3144640cde1SColin Riley std::map<lldb::addr_t, RuntimeHookSP> m_runtimeHooks; 3154f8817c2SEwan Crawford std::map<lldb::user_id_t, std::shared_ptr<uint32_t>> m_conditional_breaks; 3164640cde1SColin Riley 3177dc7771cSEwan Crawford lldb::SearchFilterSP m_filtersp; // Needed to create breakpoints through Target API 3187dc7771cSEwan Crawford 319ef20b08fSColin Riley bool m_initiated; 3204640cde1SColin Riley bool m_debuggerPresentFlagged; 3217dc7771cSEwan Crawford bool m_breakAllKernels; 3224640cde1SColin Riley static const HookDefn s_runtimeHookDefns[]; 3234640cde1SColin Riley static const size_t s_runtimeHookCount; 3244f8817c2SEwan Crawford static const std::string s_runtimeExpandSuffix; 3254f8817c2SEwan Crawford static const std::array<const char *, 3> s_runtimeCoordVars; 3264640cde1SColin Riley 3275ec532a9SColin Riley private: 3285ec532a9SColin Riley RenderScriptRuntime(Process *process); // Call CreateInstance instead. 3294640cde1SColin Riley 330b3f7f69dSAidan Dodds static bool 331b3f7f69dSAidan Dodds HookCallback(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); 332b3f7f69dSAidan Dodds 333b3f7f69dSAidan Dodds static bool 334b3f7f69dSAidan Dodds KernelBreakpointHit(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, 3354640cde1SColin Riley lldb::user_id_t break_loc_id); 3364640cde1SColin Riley 337b3f7f69dSAidan Dodds void 338b3f7f69dSAidan Dodds HookCallback(RuntimeHook *hook_info, ExecutionContext &context); 339018f5a7eSEwan Crawford 340b3f7f69dSAidan Dodds bool 341b3f7f69dSAidan Dodds GetArgSimple(ExecutionContext &context, uint32_t arg, uint64_t *data); 3424640cde1SColin Riley 343b3f7f69dSAidan Dodds void 344b3f7f69dSAidan Dodds CaptureScriptInit(RuntimeHook *hook_info, ExecutionContext &context); 3454640cde1SColin Riley 346b3f7f69dSAidan Dodds void 347b3f7f69dSAidan Dodds CaptureAllocationInit(RuntimeHook *hook_info, ExecutionContext &context); 3484640cde1SColin Riley 349b3f7f69dSAidan Dodds void 350b3f7f69dSAidan Dodds CaptureAllocationDestroy(RuntimeHook *hook_info, ExecutionContext &context); 351a0f08674SEwan Crawford 352b3f7f69dSAidan Dodds void 353b3f7f69dSAidan Dodds CaptureSetGlobalVar(RuntimeHook *hook_info, ExecutionContext &context); 354b3f7f69dSAidan Dodds 355b3f7f69dSAidan Dodds void 356b3f7f69dSAidan Dodds CaptureScriptInvokeForEachMulti(RuntimeHook *hook_info, ExecutionContext &context); 357b3f7f69dSAidan Dodds 358b3f7f69dSAidan Dodds AllocationDetails * 359b3f7f69dSAidan Dodds FindAllocByID(Stream &strm, const uint32_t alloc_id); 360b3f7f69dSAidan Dodds 361b3f7f69dSAidan Dodds std::shared_ptr<uint8_t> 362b3f7f69dSAidan Dodds GetAllocationData(AllocationDetails *allocation, StackFrame *frame_ptr); 363b3f7f69dSAidan Dodds 364b3f7f69dSAidan Dodds void 365b3f7f69dSAidan Dodds SetElementSize(Element &elem); 366b3f7f69dSAidan Dodds 367b3f7f69dSAidan Dodds static bool 368b3f7f69dSAidan Dodds GetFrameVarAsUnsigned(const lldb::StackFrameSP, const char *var_name, uint64_t &val); 369b3f7f69dSAidan Dodds 370b3f7f69dSAidan Dodds void 371b3f7f69dSAidan Dodds FindStructTypeName(Element &elem, StackFrame *frame_ptr); 372b3f7f69dSAidan Dodds 373b3f7f69dSAidan Dodds size_t 374b3f7f69dSAidan Dodds PopulateElementHeaders(const std::shared_ptr<uint8_t> header_buffer, size_t offset, const Element &elem); 375b3f7f69dSAidan Dodds 376b3f7f69dSAidan Dodds size_t 377b3f7f69dSAidan Dodds CalculateElementHeaderSize(const Element &elem); 37826e52a70SEwan Crawford 37915f2bd95SEwan Crawford // 38015f2bd95SEwan Crawford // Helper functions for jitting the runtime 38115f2bd95SEwan Crawford // 38215f2bd95SEwan Crawford 383b3f7f69dSAidan Dodds bool 384b3f7f69dSAidan Dodds JITDataPointer(AllocationDetails *allocation, StackFrame *frame_ptr, 385b3f7f69dSAidan Dodds uint32_t x = 0, uint32_t y = 0, uint32_t z = 0); 38615f2bd95SEwan Crawford 387b3f7f69dSAidan Dodds bool 388b3f7f69dSAidan Dodds JITTypePointer(AllocationDetails *allocation, StackFrame *frame_ptr); 38915f2bd95SEwan Crawford 390b3f7f69dSAidan Dodds bool 391b3f7f69dSAidan Dodds JITTypePacked(AllocationDetails *allocation, StackFrame *frame_ptr); 39215f2bd95SEwan Crawford 393b3f7f69dSAidan Dodds bool 394b3f7f69dSAidan Dodds JITElementPacked(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); 3958b244e21SEwan Crawford 396b3f7f69dSAidan Dodds bool 397b3f7f69dSAidan Dodds JITAllocationSize(AllocationDetails *allocation, StackFrame *frame_ptr); 398a0f08674SEwan Crawford 399b3f7f69dSAidan Dodds bool 400b3f7f69dSAidan Dodds JITSubelements(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); 401b3f7f69dSAidan Dodds 402b3f7f69dSAidan Dodds bool 403b3f7f69dSAidan Dodds JITAllocationStride(AllocationDetails *allocation, StackFrame *frame_ptr); 404a0f08674SEwan Crawford 40578f339d1SEwan Crawford // Search for a script detail object using a target address. 40678f339d1SEwan Crawford // If a script does not currently exist this function will return nullptr. 40778f339d1SEwan Crawford // If 'create' is true and there is no previous script with this address, 40878f339d1SEwan Crawford // then a new Script detail object will be created for this address and returned. 409b3f7f69dSAidan Dodds ScriptDetails * 410b3f7f69dSAidan Dodds LookUpScript(lldb::addr_t address, bool create); 41178f339d1SEwan Crawford 41278f339d1SEwan Crawford // Search for a previously saved allocation detail object using a target address. 41378f339d1SEwan Crawford // If an allocation does not exist for this address then nullptr will be returned. 41478f339d1SEwan Crawford // If 'create' is true and there is no previous allocation then a new allocation 41578f339d1SEwan Crawford // detail object will be created for this address and returned. 416b3f7f69dSAidan Dodds AllocationDetails * 417b3f7f69dSAidan Dodds LookUpAllocation(lldb::addr_t address, bool create); 4185ec532a9SColin Riley }; 4195ec532a9SColin Riley 4205ec532a9SColin Riley } // namespace lldb_private 4215ec532a9SColin Riley 4225ec532a9SColin Riley #endif // liblldb_RenderScriptRuntime_h_ 423