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" 24*19459580SLuke Drummond #include "lldb/Expression/LLVMUserExpression.h" 25b3f7f69dSAidan Dodds #include "lldb/Target/CPPLanguageRuntime.h" 26b3f7f69dSAidan Dodds #include "lldb/Target/LanguageRuntime.h" 27b3f7f69dSAidan Dodds #include "lldb/lldb-private.h" 285ec532a9SColin Riley 29b3f7f69dSAidan Dodds namespace lldb_private 30b3f7f69dSAidan Dodds { 31b3f7f69dSAidan Dodds namespace lldb_renderscript 32b3f7f69dSAidan Dodds { 3398156583SEwan Crawford 345ec532a9SColin Riley typedef uint32_t RSSlot; 355ec532a9SColin Riley class RSModuleDescriptor; 364640cde1SColin Riley struct RSGlobalDescriptor; 374640cde1SColin Riley struct RSKernelDescriptor; 384640cde1SColin Riley 394640cde1SColin Riley typedef std::shared_ptr<RSModuleDescriptor> RSModuleDescriptorSP; 404640cde1SColin Riley typedef std::shared_ptr<RSGlobalDescriptor> RSGlobalDescriptorSP; 414640cde1SColin Riley typedef std::shared_ptr<RSKernelDescriptor> RSKernelDescriptorSP; 424f8817c2SEwan Crawford typedef std::array<uint32_t, 3> RSCoordinate; 434640cde1SColin Riley 4498156583SEwan Crawford // Breakpoint Resolvers decide where a breakpoint is placed, 4598156583SEwan Crawford // so having our own allows us to limit the search scope to RS kernel modules. 4698156583SEwan Crawford // As well as check for .expand kernels as a fallback. 4798156583SEwan Crawford class RSBreakpointResolver : public BreakpointResolver 4898156583SEwan Crawford { 4998156583SEwan Crawford public: 50b3f7f69dSAidan Dodds RSBreakpointResolver(Breakpoint *bkpt, ConstString name) 51b3f7f69dSAidan Dodds : BreakpointResolver(bkpt, BreakpointResolver::NameResolver), m_kernel_name(name) 5298156583SEwan Crawford { 5398156583SEwan Crawford } 5498156583SEwan Crawford 5598156583SEwan Crawford void 5698156583SEwan Crawford GetDescription(Stream *strm) override 5798156583SEwan Crawford { 5898156583SEwan Crawford if (strm) 5998156583SEwan Crawford strm->Printf("RenderScript kernel breakpoint for '%s'", m_kernel_name.AsCString()); 6098156583SEwan Crawford } 6198156583SEwan Crawford 6298156583SEwan Crawford void 6398156583SEwan Crawford Dump(Stream *s) const override 6498156583SEwan Crawford { 6598156583SEwan Crawford } 6698156583SEwan Crawford 6798156583SEwan Crawford Searcher::CallbackReturn 68b3f7f69dSAidan Dodds SearchCallback(SearchFilter &filter, SymbolContext &context, Address *addr, bool containing) override; 6998156583SEwan Crawford 7098156583SEwan Crawford Searcher::Depth 7198156583SEwan Crawford GetDepth() override 7298156583SEwan Crawford { 7398156583SEwan Crawford return Searcher::eDepthModule; 7498156583SEwan Crawford } 7598156583SEwan Crawford 7698156583SEwan Crawford lldb::BreakpointResolverSP 7798156583SEwan Crawford CopyForBreakpoint(Breakpoint &breakpoint) override 7898156583SEwan Crawford { 7998156583SEwan Crawford lldb::BreakpointResolverSP ret_sp(new RSBreakpointResolver(&breakpoint, m_kernel_name)); 8098156583SEwan Crawford return ret_sp; 8198156583SEwan Crawford } 8298156583SEwan Crawford 8398156583SEwan Crawford protected: 8498156583SEwan Crawford ConstString m_kernel_name; 8598156583SEwan Crawford }; 865ec532a9SColin Riley 875ec532a9SColin Riley struct RSKernelDescriptor 885ec532a9SColin Riley { 895ec532a9SColin Riley public: 904640cde1SColin Riley RSKernelDescriptor(const RSModuleDescriptor *module, const char *name, uint32_t slot) 91b3f7f69dSAidan Dodds : m_module(module), m_name(name), m_slot(slot) 925ec532a9SColin Riley { 935ec532a9SColin Riley } 945ec532a9SColin Riley 95b3f7f69dSAidan Dodds void 96b3f7f69dSAidan Dodds Dump(Stream &strm) const; 975ec532a9SColin Riley 984640cde1SColin Riley const RSModuleDescriptor *m_module; 995ec532a9SColin Riley ConstString m_name; 1005ec532a9SColin Riley RSSlot m_slot; 1015ec532a9SColin Riley }; 1025ec532a9SColin Riley 1035ec532a9SColin Riley struct RSGlobalDescriptor 1045ec532a9SColin Riley { 1055ec532a9SColin Riley public: 106b3f7f69dSAidan Dodds RSGlobalDescriptor(const RSModuleDescriptor *module, const char *name) : m_module(module), m_name(name) {} 1075ec532a9SColin Riley 108b3f7f69dSAidan Dodds void 109b3f7f69dSAidan Dodds Dump(Stream &strm) const; 1105ec532a9SColin Riley 1114640cde1SColin Riley const RSModuleDescriptor *m_module; 1125ec532a9SColin Riley ConstString m_name; 1135ec532a9SColin Riley }; 1145ec532a9SColin Riley 1155ec532a9SColin Riley class RSModuleDescriptor 1165ec532a9SColin Riley { 1175ec532a9SColin Riley public: 118b3f7f69dSAidan Dodds RSModuleDescriptor(const lldb::ModuleSP &module) : m_module(module) {} 1195ec532a9SColin Riley 120222b937cSEugene Zelenko ~RSModuleDescriptor() = default; 1215ec532a9SColin Riley 122b3f7f69dSAidan Dodds bool 123b3f7f69dSAidan Dodds ParseRSInfo(); 1245ec532a9SColin Riley 125b3f7f69dSAidan Dodds void 126b3f7f69dSAidan Dodds Dump(Stream &strm) const; 1275ec532a9SColin Riley 1285ec532a9SColin Riley const lldb::ModuleSP m_module; 1295ec532a9SColin Riley std::vector<RSKernelDescriptor> m_kernels; 1305ec532a9SColin Riley std::vector<RSGlobalDescriptor> m_globals; 1314640cde1SColin Riley std::map<std::string, std::string> m_pragmas; 1324640cde1SColin Riley std::string m_resname; 1335ec532a9SColin Riley }; 1345ec532a9SColin Riley 135222b937cSEugene Zelenko } // namespace lldb_renderscript 13698156583SEwan Crawford 1375ec532a9SColin Riley class RenderScriptRuntime : public lldb_private::CPPLanguageRuntime 1385ec532a9SColin Riley { 1395ec532a9SColin Riley public: 140ef20b08fSColin Riley enum ModuleKind 141ef20b08fSColin Riley { 142ef20b08fSColin Riley eModuleKindIgnored, 143ef20b08fSColin Riley eModuleKindLibRS, 144ef20b08fSColin Riley eModuleKindDriver, 145ef20b08fSColin Riley eModuleKindImpl, 146ef20b08fSColin Riley eModuleKindKernelObj 147ef20b08fSColin Riley }; 148ef20b08fSColin Riley 149222b937cSEugene Zelenko ~RenderScriptRuntime() override; 1505ec532a9SColin Riley 1515ec532a9SColin Riley //------------------------------------------------------------------ 1525ec532a9SColin Riley // Static Functions 1535ec532a9SColin Riley //------------------------------------------------------------------ 154b3f7f69dSAidan Dodds static void 155b3f7f69dSAidan Dodds Initialize(); 1565ec532a9SColin Riley 157b3f7f69dSAidan Dodds static void 158b3f7f69dSAidan Dodds Terminate(); 1595ec532a9SColin Riley 160b3f7f69dSAidan Dodds static lldb_private::LanguageRuntime * 161b3f7f69dSAidan Dodds CreateInstance(Process *process, lldb::LanguageType language); 1625ec532a9SColin Riley 163b3f7f69dSAidan Dodds static lldb::CommandObjectSP 164b3f7f69dSAidan Dodds GetCommandObject(CommandInterpreter &interpreter); 1654640cde1SColin Riley 166b3f7f69dSAidan Dodds static lldb_private::ConstString 167b3f7f69dSAidan Dodds GetPluginNameStatic(); 1685ec532a9SColin Riley 169b3f7f69dSAidan Dodds static bool 170b3f7f69dSAidan Dodds IsRenderScriptModule(const lldb::ModuleSP &module_sp); 171ef20b08fSColin Riley 172b3f7f69dSAidan Dodds static ModuleKind 173b3f7f69dSAidan Dodds GetModuleKind(const lldb::ModuleSP &module_sp); 174ef20b08fSColin Riley 175b3f7f69dSAidan Dodds static void 176b3f7f69dSAidan Dodds ModulesDidLoad(const lldb::ProcessSP &process_sp, const ModuleList &module_list); 177ef20b08fSColin Riley 178b3f7f69dSAidan Dodds bool 179b3f7f69dSAidan Dodds IsVTableName(const char *name) override; 1805ec532a9SColin Riley 181b3f7f69dSAidan Dodds bool 1825f57b6eeSEnrico Granata GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, 1835f57b6eeSEnrico Granata TypeAndOrName &class_type_or_name, Address &address, 1845f57b6eeSEnrico Granata Value::ValueType &value_type) override; 185c74275bcSEnrico Granata 186222b937cSEugene Zelenko TypeAndOrName 187b3f7f69dSAidan Dodds FixUpDynamicType(const TypeAndOrName &type_and_or_name, ValueObject &static_value) override; 1885ec532a9SColin Riley 189b3f7f69dSAidan Dodds bool 190b3f7f69dSAidan Dodds CouldHaveDynamicValue(ValueObject &in_value) override; 1915ec532a9SColin Riley 192b3f7f69dSAidan Dodds lldb::BreakpointResolverSP 193b3f7f69dSAidan Dodds CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp) override; 1945ec532a9SColin Riley 195b3f7f69dSAidan Dodds bool 196b3f7f69dSAidan Dodds LoadModule(const lldb::ModuleSP &module_sp); 1975ec532a9SColin Riley 198b3f7f69dSAidan Dodds void 199b3f7f69dSAidan Dodds DumpModules(Stream &strm) const; 2005ec532a9SColin Riley 201b3f7f69dSAidan Dodds void 202b3f7f69dSAidan Dodds DumpContexts(Stream &strm) const; 2034640cde1SColin Riley 204b3f7f69dSAidan Dodds void 205b3f7f69dSAidan Dodds DumpKernels(Stream &strm) const; 2064640cde1SColin Riley 207b3f7f69dSAidan Dodds bool 208b3f7f69dSAidan Dodds DumpAllocation(Stream &strm, StackFrame *frame_ptr, const uint32_t id); 209a0f08674SEwan Crawford 210b649b005SEwan Crawford void 211b649b005SEwan Crawford ListAllocations(Stream &strm, StackFrame *frame_ptr, const uint32_t index); 21215f2bd95SEwan Crawford 2130d2bfcfbSEwan Crawford bool 2140d2bfcfbSEwan Crawford RecomputeAllAllocations(Stream &strm, StackFrame *frame_ptr); 2150d2bfcfbSEwan Crawford 216b3f7f69dSAidan Dodds void 217b3f7f69dSAidan Dodds PlaceBreakpointOnKernel(Stream &strm, const char *name, const std::array<int, 3> coords, Error &error, 218b3f7f69dSAidan Dodds lldb::TargetSP target); 2194640cde1SColin Riley 220b3f7f69dSAidan Dodds void 221b3f7f69dSAidan Dodds SetBreakAllKernels(bool do_break, lldb::TargetSP target); 2227dc7771cSEwan Crawford 223b3f7f69dSAidan Dodds void 224b3f7f69dSAidan Dodds Status(Stream &strm) const; 2254640cde1SColin Riley 226b3f7f69dSAidan Dodds void 227b3f7f69dSAidan Dodds ModulesDidLoad(const ModuleList &module_list) override; 228ef20b08fSColin Riley 229b3f7f69dSAidan Dodds bool 230b3f7f69dSAidan Dodds LoadAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); 23155232f09SEwan Crawford 232b3f7f69dSAidan Dodds bool 233b3f7f69dSAidan Dodds SaveAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); 23455232f09SEwan Crawford 235b3f7f69dSAidan Dodds void 236b3f7f69dSAidan Dodds Update(); 237ef20b08fSColin Riley 238b3f7f69dSAidan Dodds void 239b3f7f69dSAidan Dodds Initiate(); 240ef20b08fSColin Riley 241222b937cSEugene Zelenko //------------------------------------------------------------------ 242222b937cSEugene Zelenko // PluginInterface protocol 243222b937cSEugene Zelenko //------------------------------------------------------------------ 244b3f7f69dSAidan Dodds lldb_private::ConstString 245b3f7f69dSAidan Dodds GetPluginName() override; 2464640cde1SColin Riley 247b3f7f69dSAidan Dodds uint32_t 248b3f7f69dSAidan Dodds GetPluginVersion() override; 249222b937cSEugene Zelenko 2504f8817c2SEwan Crawford static bool 2514f8817c2SEwan Crawford GetKernelCoordinate(lldb_renderscript::RSCoordinate &coord, Thread *thread_ptr); 2524f8817c2SEwan Crawford 253222b937cSEugene Zelenko protected: 25415f2bd95SEwan Crawford struct ScriptDetails; 25515f2bd95SEwan Crawford struct AllocationDetails; 2568b244e21SEwan Crawford struct Element; 25715f2bd95SEwan Crawford 258b3f7f69dSAidan Dodds void 259b3f7f69dSAidan Dodds InitSearchFilter(lldb::TargetSP target) 2607dc7771cSEwan Crawford { 2617dc7771cSEwan Crawford if (!m_filtersp) 2627dc7771cSEwan Crawford m_filtersp.reset(new SearchFilterForUnconstrainedSearches(target)); 2637dc7771cSEwan Crawford } 2647dc7771cSEwan Crawford 265b3f7f69dSAidan Dodds void 266b3f7f69dSAidan Dodds FixupScriptDetails(lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); 2674640cde1SColin Riley 268b3f7f69dSAidan Dodds void 269b3f7f69dSAidan Dodds LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind); 2704640cde1SColin Riley 271b3f7f69dSAidan Dodds bool 272b3f7f69dSAidan Dodds RefreshAllocation(AllocationDetails *allocation, StackFrame *frame_ptr); 27315f2bd95SEwan Crawford 274b3f7f69dSAidan Dodds bool 275b3f7f69dSAidan Dodds EvalRSExpression(const char *expression, StackFrame *frame_ptr, uint64_t *result); 27615f2bd95SEwan Crawford 277b3f7f69dSAidan Dodds lldb::BreakpointSP 278b3f7f69dSAidan Dodds CreateKernelBreakpoint(const ConstString &name); 2797dc7771cSEwan Crawford 280b3f7f69dSAidan Dodds void 281b3f7f69dSAidan Dodds BreakOnModuleKernels(const lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); 2827dc7771cSEwan Crawford 2834640cde1SColin Riley struct RuntimeHook; 284b3f7f69dSAidan Dodds typedef void (RenderScriptRuntime::*CaptureStateFn)(RuntimeHook *hook_info, 285b3f7f69dSAidan Dodds ExecutionContext &context); // Please do this! 2864640cde1SColin Riley 2874640cde1SColin Riley struct HookDefn 2884640cde1SColin Riley { 2894640cde1SColin Riley const char *name; 29082780287SAidan Dodds const char *symbol_name_m32; // mangled name for the 32 bit architectures 29182780287SAidan Dodds const char *symbol_name_m64; // mangled name for the 64 bit archs 2924640cde1SColin Riley uint32_t version; 2934640cde1SColin Riley ModuleKind kind; 2944640cde1SColin Riley CaptureStateFn grabber; 2954640cde1SColin Riley }; 2964640cde1SColin Riley 2974640cde1SColin Riley struct RuntimeHook 2984640cde1SColin Riley { 2994640cde1SColin Riley lldb::addr_t address; 3004640cde1SColin Riley const HookDefn *defn; 3014640cde1SColin Riley lldb::BreakpointSP bp_sp; 3024640cde1SColin Riley }; 3034640cde1SColin Riley 3044640cde1SColin Riley typedef std::shared_ptr<RuntimeHook> RuntimeHookSP; 3054640cde1SColin Riley 3064640cde1SColin Riley lldb::ModuleSP m_libRS; 3074640cde1SColin Riley lldb::ModuleSP m_libRSDriver; 3084640cde1SColin Riley lldb::ModuleSP m_libRSCpuRef; 30998156583SEwan Crawford std::vector<lldb_renderscript::RSModuleDescriptorSP> m_rsmodules; 31078f339d1SEwan Crawford 31178f339d1SEwan Crawford std::vector<std::unique_ptr<ScriptDetails>> m_scripts; 31278f339d1SEwan Crawford std::vector<std::unique_ptr<AllocationDetails>> m_allocations; 3134640cde1SColin Riley 31498156583SEwan Crawford std::map<lldb::addr_t, lldb_renderscript::RSModuleDescriptorSP> m_scriptMappings; 3154640cde1SColin Riley std::map<lldb::addr_t, RuntimeHookSP> m_runtimeHooks; 3164f8817c2SEwan Crawford std::map<lldb::user_id_t, std::shared_ptr<uint32_t>> m_conditional_breaks; 3174640cde1SColin Riley 3187dc7771cSEwan Crawford lldb::SearchFilterSP m_filtersp; // Needed to create breakpoints through Target API 3197dc7771cSEwan Crawford 320ef20b08fSColin Riley bool m_initiated; 3214640cde1SColin Riley bool m_debuggerPresentFlagged; 3227dc7771cSEwan Crawford bool m_breakAllKernels; 3234640cde1SColin Riley static const HookDefn s_runtimeHookDefns[]; 3244640cde1SColin Riley static const size_t s_runtimeHookCount; 325*19459580SLuke Drummond LLVMUserExpression::IRPasses *m_ir_passes; 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 void 341b3f7f69dSAidan Dodds CaptureScriptInit(RuntimeHook *hook_info, ExecutionContext &context); 3424640cde1SColin Riley 343b3f7f69dSAidan Dodds void 344b3f7f69dSAidan Dodds CaptureAllocationInit(RuntimeHook *hook_info, ExecutionContext &context); 3454640cde1SColin Riley 346b3f7f69dSAidan Dodds void 347b3f7f69dSAidan Dodds CaptureAllocationDestroy(RuntimeHook *hook_info, ExecutionContext &context); 348a0f08674SEwan Crawford 349b3f7f69dSAidan Dodds void 350b3f7f69dSAidan Dodds CaptureSetGlobalVar(RuntimeHook *hook_info, ExecutionContext &context); 351b3f7f69dSAidan Dodds 352b3f7f69dSAidan Dodds void 353b3f7f69dSAidan Dodds CaptureScriptInvokeForEachMulti(RuntimeHook *hook_info, ExecutionContext &context); 354b3f7f69dSAidan Dodds 355b3f7f69dSAidan Dodds AllocationDetails * 356b3f7f69dSAidan Dodds FindAllocByID(Stream &strm, const uint32_t alloc_id); 357b3f7f69dSAidan Dodds 358b3f7f69dSAidan Dodds std::shared_ptr<uint8_t> 359b3f7f69dSAidan Dodds GetAllocationData(AllocationDetails *allocation, StackFrame *frame_ptr); 360b3f7f69dSAidan Dodds 361b3f7f69dSAidan Dodds void 362b3f7f69dSAidan Dodds SetElementSize(Element &elem); 363b3f7f69dSAidan Dodds 364b3f7f69dSAidan Dodds static bool 365b3f7f69dSAidan Dodds GetFrameVarAsUnsigned(const lldb::StackFrameSP, const char *var_name, uint64_t &val); 366b3f7f69dSAidan Dodds 367b3f7f69dSAidan Dodds void 368b3f7f69dSAidan Dodds FindStructTypeName(Element &elem, StackFrame *frame_ptr); 369b3f7f69dSAidan Dodds 370b3f7f69dSAidan Dodds size_t 371b3f7f69dSAidan Dodds PopulateElementHeaders(const std::shared_ptr<uint8_t> header_buffer, size_t offset, const Element &elem); 372b3f7f69dSAidan Dodds 373b3f7f69dSAidan Dodds size_t 374b3f7f69dSAidan Dodds CalculateElementHeaderSize(const Element &elem); 37526e52a70SEwan Crawford 37615f2bd95SEwan Crawford // 37715f2bd95SEwan Crawford // Helper functions for jitting the runtime 37815f2bd95SEwan Crawford // 37915f2bd95SEwan Crawford 380b3f7f69dSAidan Dodds bool 381b3f7f69dSAidan Dodds JITDataPointer(AllocationDetails *allocation, StackFrame *frame_ptr, 382b3f7f69dSAidan Dodds uint32_t x = 0, uint32_t y = 0, uint32_t z = 0); 38315f2bd95SEwan Crawford 384b3f7f69dSAidan Dodds bool 385b3f7f69dSAidan Dodds JITTypePointer(AllocationDetails *allocation, StackFrame *frame_ptr); 38615f2bd95SEwan Crawford 387b3f7f69dSAidan Dodds bool 388b3f7f69dSAidan Dodds JITTypePacked(AllocationDetails *allocation, StackFrame *frame_ptr); 38915f2bd95SEwan Crawford 390b3f7f69dSAidan Dodds bool 391b3f7f69dSAidan Dodds JITElementPacked(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); 3928b244e21SEwan Crawford 393b3f7f69dSAidan Dodds bool 394b3f7f69dSAidan Dodds JITAllocationSize(AllocationDetails *allocation, StackFrame *frame_ptr); 395a0f08674SEwan Crawford 396b3f7f69dSAidan Dodds bool 397b3f7f69dSAidan Dodds JITSubelements(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); 398b3f7f69dSAidan Dodds 399b3f7f69dSAidan Dodds bool 400b3f7f69dSAidan Dodds JITAllocationStride(AllocationDetails *allocation, StackFrame *frame_ptr); 401a0f08674SEwan Crawford 40278f339d1SEwan Crawford // Search for a script detail object using a target address. 40378f339d1SEwan Crawford // If a script does not currently exist this function will return nullptr. 40478f339d1SEwan Crawford // If 'create' is true and there is no previous script with this address, 40578f339d1SEwan Crawford // then a new Script detail object will be created for this address and returned. 406b3f7f69dSAidan Dodds ScriptDetails * 407b3f7f69dSAidan Dodds LookUpScript(lldb::addr_t address, bool create); 40878f339d1SEwan Crawford 40978f339d1SEwan Crawford // Search for a previously saved allocation detail object using a target address. 41078f339d1SEwan Crawford // If an allocation does not exist for this address then nullptr will be returned. 41178f339d1SEwan Crawford // If 'create' is true and there is no previous allocation then a new allocation 41278f339d1SEwan Crawford // detail object will be created for this address and returned. 413b3f7f69dSAidan Dodds AllocationDetails * 414b3f7f69dSAidan Dodds LookUpAllocation(lldb::addr_t address, bool create); 415*19459580SLuke Drummond 416*19459580SLuke Drummond bool 417*19459580SLuke Drummond GetOverrideExprOptions(clang::TargetOptions &prototype) override; 418*19459580SLuke Drummond 419*19459580SLuke Drummond bool 420*19459580SLuke Drummond GetIRPasses(LLVMUserExpression::IRPasses &passes) override; 4215ec532a9SColin Riley }; 4225ec532a9SColin Riley 4235ec532a9SColin Riley } // namespace lldb_private 4245ec532a9SColin Riley 4255ec532a9SColin Riley #endif // liblldb_RenderScriptRuntime_h_ 426