Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 1 | //===-- RenderScriptRuntime.h -----------------------------------*- 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 | #ifndef liblldb_RenderScriptRuntime_h_ |
| 11 | #define liblldb_RenderScriptRuntime_h_ |
| 12 | |
| 13 | // C Includes |
| 14 | // C++ Includes |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 15 | #include <array> |
| 16 | #include <map> |
| 17 | #include <memory> |
| 18 | #include <string> |
| 19 | #include <vector> |
| 20 | |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 21 | // Other libraries and framework includes |
| 22 | // Project includes |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 23 | #include "lldb/Core/Module.h" |
Luke Drummond | 1945958 | 2016-07-28 14:21:07 +0000 | [diff] [blame] | 24 | #include "lldb/Expression/LLVMUserExpression.h" |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 25 | #include "lldb/Target/CPPLanguageRuntime.h" |
| 26 | #include "lldb/Target/LanguageRuntime.h" |
| 27 | #include "lldb/lldb-private.h" |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 28 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 29 | namespace lldb_private |
| 30 | { |
| 31 | namespace lldb_renderscript |
| 32 | { |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 33 | |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 34 | typedef uint32_t RSSlot; |
| 35 | class RSModuleDescriptor; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 36 | struct RSGlobalDescriptor; |
| 37 | struct RSKernelDescriptor; |
| 38 | |
| 39 | typedef std::shared_ptr<RSModuleDescriptor> RSModuleDescriptorSP; |
| 40 | typedef std::shared_ptr<RSGlobalDescriptor> RSGlobalDescriptorSP; |
| 41 | typedef std::shared_ptr<RSKernelDescriptor> RSKernelDescriptorSP; |
Ewan Crawford | 4f8817c | 2016-01-20 12:03:29 +0000 | [diff] [blame] | 42 | typedef std::array<uint32_t, 3> RSCoordinate; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 43 | |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 44 | // Breakpoint Resolvers decide where a breakpoint is placed, |
| 45 | // so having our own allows us to limit the search scope to RS kernel modules. |
| 46 | // As well as check for .expand kernels as a fallback. |
| 47 | class RSBreakpointResolver : public BreakpointResolver |
| 48 | { |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 49 | public: |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 50 | RSBreakpointResolver(Breakpoint *bkpt, ConstString name) |
| 51 | : BreakpointResolver(bkpt, BreakpointResolver::NameResolver), m_kernel_name(name) |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 52 | { |
| 53 | } |
| 54 | |
| 55 | void |
| 56 | GetDescription(Stream *strm) override |
| 57 | { |
| 58 | if (strm) |
| 59 | strm->Printf("RenderScript kernel breakpoint for '%s'", m_kernel_name.AsCString()); |
| 60 | } |
| 61 | |
| 62 | void |
| 63 | Dump(Stream *s) const override |
| 64 | { |
| 65 | } |
| 66 | |
| 67 | Searcher::CallbackReturn |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 68 | SearchCallback(SearchFilter &filter, SymbolContext &context, Address *addr, bool containing) override; |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 69 | |
| 70 | Searcher::Depth |
| 71 | GetDepth() override |
| 72 | { |
| 73 | return Searcher::eDepthModule; |
| 74 | } |
| 75 | |
| 76 | lldb::BreakpointResolverSP |
| 77 | CopyForBreakpoint(Breakpoint &breakpoint) override |
| 78 | { |
| 79 | lldb::BreakpointResolverSP ret_sp(new RSBreakpointResolver(&breakpoint, m_kernel_name)); |
| 80 | return ret_sp; |
| 81 | } |
| 82 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 83 | protected: |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 84 | ConstString m_kernel_name; |
| 85 | }; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 86 | |
| 87 | struct RSKernelDescriptor |
| 88 | { |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 89 | public: |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 90 | RSKernelDescriptor(const RSModuleDescriptor *module, const char *name, uint32_t slot) |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 91 | : m_module(module), m_name(name), m_slot(slot) |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 92 | { |
| 93 | } |
| 94 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 95 | void |
| 96 | Dump(Stream &strm) const; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 97 | |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 98 | const RSModuleDescriptor *m_module; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 99 | ConstString m_name; |
| 100 | RSSlot m_slot; |
| 101 | }; |
| 102 | |
| 103 | struct RSGlobalDescriptor |
| 104 | { |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 105 | public: |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 106 | RSGlobalDescriptor(const RSModuleDescriptor *module, const char *name) : m_module(module), m_name(name) {} |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 107 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 108 | void |
| 109 | Dump(Stream &strm) const; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 110 | |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 111 | const RSModuleDescriptor *m_module; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 112 | ConstString m_name; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 113 | }; |
| 114 | |
| 115 | class RSModuleDescriptor |
| 116 | { |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 117 | public: |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 118 | RSModuleDescriptor(const lldb::ModuleSP &module) : m_module(module) {} |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 119 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 120 | ~RSModuleDescriptor() = default; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 121 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 122 | bool |
| 123 | ParseRSInfo(); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 124 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 125 | void |
| 126 | Dump(Stream &strm) const; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 127 | |
| 128 | const lldb::ModuleSP m_module; |
| 129 | std::vector<RSKernelDescriptor> m_kernels; |
| 130 | std::vector<RSGlobalDescriptor> m_globals; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 131 | std::map<std::string, std::string> m_pragmas; |
| 132 | std::string m_resname; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 133 | }; |
| 134 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 135 | } // namespace lldb_renderscript |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 136 | |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 137 | class RenderScriptRuntime : public lldb_private::CPPLanguageRuntime |
| 138 | { |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 139 | public: |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 140 | enum ModuleKind |
| 141 | { |
| 142 | eModuleKindIgnored, |
| 143 | eModuleKindLibRS, |
| 144 | eModuleKindDriver, |
| 145 | eModuleKindImpl, |
| 146 | eModuleKindKernelObj |
| 147 | }; |
| 148 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 149 | ~RenderScriptRuntime() override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 150 | |
| 151 | //------------------------------------------------------------------ |
| 152 | // Static Functions |
| 153 | //------------------------------------------------------------------ |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 154 | static void |
| 155 | Initialize(); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 156 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 157 | static void |
| 158 | Terminate(); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 159 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 160 | static lldb_private::LanguageRuntime * |
| 161 | CreateInstance(Process *process, lldb::LanguageType language); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 162 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 163 | static lldb::CommandObjectSP |
| 164 | GetCommandObject(CommandInterpreter &interpreter); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 165 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 166 | static lldb_private::ConstString |
| 167 | GetPluginNameStatic(); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 168 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 169 | static bool |
| 170 | IsRenderScriptModule(const lldb::ModuleSP &module_sp); |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 171 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 172 | static ModuleKind |
| 173 | GetModuleKind(const lldb::ModuleSP &module_sp); |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 174 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 175 | static void |
| 176 | ModulesDidLoad(const lldb::ProcessSP &process_sp, const ModuleList &module_list); |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 177 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 178 | bool |
| 179 | IsVTableName(const char *name) override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 180 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 181 | bool |
Enrico Granata | 5f57b6e | 2016-05-05 21:10:28 +0000 | [diff] [blame] | 182 | GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, |
| 183 | TypeAndOrName &class_type_or_name, Address &address, |
| 184 | Value::ValueType &value_type) override; |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 185 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 186 | TypeAndOrName |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 187 | FixUpDynamicType(const TypeAndOrName &type_and_or_name, ValueObject &static_value) override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 188 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 189 | bool |
| 190 | CouldHaveDynamicValue(ValueObject &in_value) override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 191 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 192 | lldb::BreakpointResolverSP |
| 193 | CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp) override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 194 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 195 | bool |
| 196 | LoadModule(const lldb::ModuleSP &module_sp); |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 197 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 198 | void |
| 199 | DumpModules(Stream &strm) const; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 200 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 201 | void |
| 202 | DumpContexts(Stream &strm) const; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 203 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 204 | void |
| 205 | DumpKernels(Stream &strm) const; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 206 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 207 | bool |
| 208 | DumpAllocation(Stream &strm, StackFrame *frame_ptr, const uint32_t id); |
Ewan Crawford | a0f0867 | 2015-10-16 08:28:47 +0000 | [diff] [blame] | 209 | |
Ewan Crawford | b649b00 | 2016-01-26 10:41:08 +0000 | [diff] [blame] | 210 | void |
| 211 | ListAllocations(Stream &strm, StackFrame *frame_ptr, const uint32_t index); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 212 | |
Ewan Crawford | 0d2bfcf | 2016-02-04 09:44:23 +0000 | [diff] [blame] | 213 | bool |
| 214 | RecomputeAllAllocations(Stream &strm, StackFrame *frame_ptr); |
| 215 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 216 | void |
| 217 | PlaceBreakpointOnKernel(Stream &strm, const char *name, const std::array<int, 3> coords, Error &error, |
| 218 | lldb::TargetSP target); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 219 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 220 | void |
| 221 | SetBreakAllKernels(bool do_break, lldb::TargetSP target); |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 222 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 223 | void |
| 224 | Status(Stream &strm) const; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 225 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 226 | void |
| 227 | ModulesDidLoad(const ModuleList &module_list) override; |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 228 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 229 | bool |
| 230 | LoadAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); |
Ewan Crawford | 55232f0 | 2015-10-21 08:50:42 +0000 | [diff] [blame] | 231 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 232 | bool |
| 233 | SaveAllocation(Stream &strm, const uint32_t alloc_id, const char *filename, StackFrame *frame_ptr); |
Ewan Crawford | 55232f0 | 2015-10-21 08:50:42 +0000 | [diff] [blame] | 234 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 235 | void |
| 236 | Update(); |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 237 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 238 | void |
| 239 | Initiate(); |
Ewan Crawford | 018f5a7e | 2015-10-26 14:04:37 +0000 | [diff] [blame] | 240 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 241 | //------------------------------------------------------------------ |
| 242 | // PluginInterface protocol |
| 243 | //------------------------------------------------------------------ |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 244 | lldb_private::ConstString |
| 245 | GetPluginName() override; |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 246 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 247 | uint32_t |
| 248 | GetPluginVersion() override; |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 249 | |
Ewan Crawford | 4f8817c | 2016-01-20 12:03:29 +0000 | [diff] [blame] | 250 | static bool |
| 251 | GetKernelCoordinate(lldb_renderscript::RSCoordinate &coord, Thread *thread_ptr); |
| 252 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 253 | protected: |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 254 | struct ScriptDetails; |
| 255 | struct AllocationDetails; |
Ewan Crawford | 8b244e2 | 2015-11-30 10:29:49 +0000 | [diff] [blame] | 256 | struct Element; |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 257 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 258 | void |
| 259 | InitSearchFilter(lldb::TargetSP target) |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 260 | { |
| 261 | if (!m_filtersp) |
| 262 | m_filtersp.reset(new SearchFilterForUnconstrainedSearches(target)); |
| 263 | } |
Luke Drummond | 1945958 | 2016-07-28 14:21:07 +0000 | [diff] [blame] | 264 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 265 | void |
| 266 | FixupScriptDetails(lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 267 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 268 | void |
| 269 | LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind); |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 270 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 271 | bool |
| 272 | RefreshAllocation(AllocationDetails *allocation, StackFrame *frame_ptr); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 273 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 274 | bool |
| 275 | EvalRSExpression(const char *expression, StackFrame *frame_ptr, uint64_t *result); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 276 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 277 | lldb::BreakpointSP |
| 278 | CreateKernelBreakpoint(const ConstString &name); |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 279 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 280 | void |
| 281 | BreakOnModuleKernels(const lldb_renderscript::RSModuleDescriptorSP rsmodule_sp); |
| 282 | |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 283 | struct RuntimeHook; |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 284 | typedef void (RenderScriptRuntime::*CaptureStateFn)(RuntimeHook *hook_info, |
| 285 | ExecutionContext &context); // Please do this! |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 286 | |
| 287 | struct HookDefn |
| 288 | { |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 289 | const char *name; |
| 290 | const char *symbol_name_m32; // mangled name for the 32 bit architectures |
| 291 | const char *symbol_name_m64; // mangled name for the 64 bit archs |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 292 | uint32_t version; |
| 293 | ModuleKind kind; |
| 294 | CaptureStateFn grabber; |
| 295 | }; |
| 296 | |
| 297 | struct RuntimeHook |
| 298 | { |
| 299 | lldb::addr_t address; |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 300 | const HookDefn *defn; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 301 | lldb::BreakpointSP bp_sp; |
| 302 | }; |
Ewan Crawford | 55232f0 | 2015-10-21 08:50:42 +0000 | [diff] [blame] | 303 | |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 304 | typedef std::shared_ptr<RuntimeHook> RuntimeHookSP; |
| 305 | |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 306 | lldb::ModuleSP m_libRS; |
| 307 | lldb::ModuleSP m_libRSDriver; |
| 308 | lldb::ModuleSP m_libRSCpuRef; |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 309 | std::vector<lldb_renderscript::RSModuleDescriptorSP> m_rsmodules; |
Ewan Crawford | 78f339d | 2015-09-21 10:53:18 +0000 | [diff] [blame] | 310 | |
| 311 | std::vector<std::unique_ptr<ScriptDetails>> m_scripts; |
| 312 | std::vector<std::unique_ptr<AllocationDetails>> m_allocations; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 313 | |
Ewan Crawford | 9815658 | 2015-09-04 08:56:52 +0000 | [diff] [blame] | 314 | std::map<lldb::addr_t, lldb_renderscript::RSModuleDescriptorSP> m_scriptMappings; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 315 | std::map<lldb::addr_t, RuntimeHookSP> m_runtimeHooks; |
Ewan Crawford | 4f8817c | 2016-01-20 12:03:29 +0000 | [diff] [blame] | 316 | std::map<lldb::user_id_t, std::shared_ptr<uint32_t>> m_conditional_breaks; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 317 | |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 318 | lldb::SearchFilterSP m_filtersp; // Needed to create breakpoints through Target API |
| 319 | |
Colin Riley | ef20b08 | 2015-04-14 07:39:24 +0000 | [diff] [blame] | 320 | bool m_initiated; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 321 | bool m_debuggerPresentFlagged; |
Ewan Crawford | 7dc7771 | 2015-09-10 10:08:48 +0000 | [diff] [blame] | 322 | bool m_breakAllKernels; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 323 | static const HookDefn s_runtimeHookDefns[]; |
| 324 | static const size_t s_runtimeHookCount; |
Luke Drummond | 1945958 | 2016-07-28 14:21:07 +0000 | [diff] [blame] | 325 | LLVMUserExpression::IRPasses *m_ir_passes; |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 326 | |
Eugene Zelenko | 222b937 | 2015-10-27 00:45:06 +0000 | [diff] [blame] | 327 | private: |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 328 | RenderScriptRuntime(Process *process); // Call CreateInstance instead. |
Luke Drummond | 1945958 | 2016-07-28 14:21:07 +0000 | [diff] [blame] | 329 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 330 | static bool |
| 331 | HookCallback(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 332 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 333 | static bool |
| 334 | KernelBreakpointHit(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, |
| 335 | lldb::user_id_t break_loc_id); |
Ewan Crawford | 018f5a7e | 2015-10-26 14:04:37 +0000 | [diff] [blame] | 336 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 337 | void |
| 338 | HookCallback(RuntimeHook *hook_info, ExecutionContext &context); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 339 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 340 | void |
| 341 | CaptureScriptInit(RuntimeHook *hook_info, ExecutionContext &context); |
Colin Riley | 4640cde | 2015-06-01 18:23:41 +0000 | [diff] [blame] | 342 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 343 | void |
| 344 | CaptureAllocationInit(RuntimeHook *hook_info, ExecutionContext &context); |
Ewan Crawford | a0f0867 | 2015-10-16 08:28:47 +0000 | [diff] [blame] | 345 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 346 | void |
| 347 | CaptureAllocationDestroy(RuntimeHook *hook_info, ExecutionContext &context); |
| 348 | |
| 349 | void |
| 350 | CaptureSetGlobalVar(RuntimeHook *hook_info, ExecutionContext &context); |
| 351 | |
| 352 | void |
| 353 | CaptureScriptInvokeForEachMulti(RuntimeHook *hook_info, ExecutionContext &context); |
| 354 | |
| 355 | AllocationDetails * |
| 356 | FindAllocByID(Stream &strm, const uint32_t alloc_id); |
| 357 | |
| 358 | std::shared_ptr<uint8_t> |
| 359 | GetAllocationData(AllocationDetails *allocation, StackFrame *frame_ptr); |
| 360 | |
| 361 | void |
| 362 | SetElementSize(Element &elem); |
| 363 | |
| 364 | static bool |
| 365 | GetFrameVarAsUnsigned(const lldb::StackFrameSP, const char *var_name, uint64_t &val); |
| 366 | |
| 367 | void |
| 368 | FindStructTypeName(Element &elem, StackFrame *frame_ptr); |
| 369 | |
| 370 | size_t |
| 371 | PopulateElementHeaders(const std::shared_ptr<uint8_t> header_buffer, size_t offset, const Element &elem); |
| 372 | |
| 373 | size_t |
| 374 | CalculateElementHeaderSize(const Element &elem); |
Ewan Crawford | 26e52a7 | 2016-01-07 10:19:09 +0000 | [diff] [blame] | 375 | |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 376 | // |
| 377 | // Helper functions for jitting the runtime |
| 378 | // |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 379 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 380 | bool |
| 381 | JITDataPointer(AllocationDetails *allocation, StackFrame *frame_ptr, |
| 382 | uint32_t x = 0, uint32_t y = 0, uint32_t z = 0); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 383 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 384 | bool |
| 385 | JITTypePointer(AllocationDetails *allocation, StackFrame *frame_ptr); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 386 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 387 | bool |
| 388 | JITTypePacked(AllocationDetails *allocation, StackFrame *frame_ptr); |
Ewan Crawford | 15f2bd9 | 2015-10-06 08:42:32 +0000 | [diff] [blame] | 389 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 390 | bool |
| 391 | JITElementPacked(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); |
Ewan Crawford | 8b244e2 | 2015-11-30 10:29:49 +0000 | [diff] [blame] | 392 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 393 | bool |
| 394 | JITAllocationSize(AllocationDetails *allocation, StackFrame *frame_ptr); |
Ewan Crawford | a0f0867 | 2015-10-16 08:28:47 +0000 | [diff] [blame] | 395 | |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 396 | bool |
| 397 | JITSubelements(Element &elem, const lldb::addr_t context, StackFrame *frame_ptr); |
| 398 | |
| 399 | bool |
| 400 | JITAllocationStride(AllocationDetails *allocation, StackFrame *frame_ptr); |
Ewan Crawford | a0f0867 | 2015-10-16 08:28:47 +0000 | [diff] [blame] | 401 | |
Ewan Crawford | 78f339d | 2015-09-21 10:53:18 +0000 | [diff] [blame] | 402 | // Search for a script detail object using a target address. |
| 403 | // If a script does not currently exist this function will return nullptr. |
| 404 | // If 'create' is true and there is no previous script with this address, |
| 405 | // then a new Script detail object will be created for this address and returned. |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 406 | ScriptDetails * |
| 407 | LookUpScript(lldb::addr_t address, bool create); |
Ewan Crawford | 78f339d | 2015-09-21 10:53:18 +0000 | [diff] [blame] | 408 | |
| 409 | // Search for a previously saved allocation detail object using a target address. |
| 410 | // If an allocation does not exist for this address then nullptr will be returned. |
Aidan Dodds | b3f7f69 | 2016-01-28 16:39:44 +0000 | [diff] [blame] | 411 | AllocationDetails * |
Luke Drummond | 5d05763 | 2016-08-03 17:31:58 +0000 | [diff] [blame^] | 412 | LookUpAllocation(lldb::addr_t address); |
| 413 | |
| 414 | // Creates a new allocation with the specified address assigning a new ID and removes |
| 415 | // any previous stored allocation which has the same address. |
| 416 | AllocationDetails * |
| 417 | CreateAllocation(lldb::addr_t address); |
Luke Drummond | 1945958 | 2016-07-28 14:21:07 +0000 | [diff] [blame] | 418 | |
| 419 | bool |
| 420 | GetOverrideExprOptions(clang::TargetOptions &prototype) override; |
| 421 | |
| 422 | bool |
| 423 | GetIRPasses(LLVMUserExpression::IRPasses &passes) override; |
Colin Riley | 5ec532a | 2015-04-09 16:49:25 +0000 | [diff] [blame] | 424 | }; |
| 425 | |
| 426 | } // namespace lldb_private |
| 427 | |
| 428 | #endif // liblldb_RenderScriptRuntime_h_ |