Author: aidandodds Date: Thu Jan 14 09:39:28 2016 New Revision: 257772 URL: http://llvm.org/viewvc/llvm-project?rev=257772&view=rev Log: [RenderScript] Hook kernel invocation.
This patch adds a hook to track kernel invocations and to track all script and allocation objects used. Modified: lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h Modified: lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp?rev=257772&r1=257771&r2=257772&view=diff ============================================================================== --- lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp (original) +++ lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp Thu Jan 14 09:39:28 2016 @@ -581,28 +581,12 @@ const RenderScriptRuntime::HookDefn Rend &lldb_private::RenderScriptRuntime::CaptureScriptInit1 // handler }, { - "rsdScriptInvokeForEach", // name - "_Z22rsdScriptInvokeForEachPKN7android12renderscript7ContextEPNS0_6ScriptEjPKNS0_10AllocationEPS6_PKvjPK12RsScriptCall", // symbol name 32bit - "_Z22rsdScriptInvokeForEachPKN7android12renderscript7ContextEPNS0_6ScriptEjPKNS0_10AllocationEPS6_PKvmPK12RsScriptCall", // symbol name 64bit - 0, // version - RenderScriptRuntime::eModuleKindDriver, // type - nullptr // handler - }, - { "rsdScriptInvokeForEachMulti", // name "_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEjPS6_PKvjPK12RsScriptCall", // symbol name 32bit "_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEmPS6_PKvmPK12RsScriptCall", // symbol name 64bit 0, // version RenderScriptRuntime::eModuleKindDriver, // type - nullptr // handler - }, - { - "rsdScriptInvokeFunction", // name - "_Z23rsdScriptInvokeFunctionPKN7android12renderscript7ContextEPNS0_6ScriptEjPKvj", // symbol name 32bit - "_Z23rsdScriptInvokeFunctionPKN7android12renderscript7ContextEPNS0_6ScriptEjPKvm", // symbol name 64bit - 0, // version - RenderScriptRuntime::eModuleKindDriver, // type - nullptr // handler + &lldb_private::RenderScriptRuntime::CaptureScriptInvokeForEachMulti // handler }, { "rsdScriptSetGlobalVar", // name @@ -906,6 +890,119 @@ RenderScriptRuntime::GetArgSimple(Execut } void +RenderScriptRuntime::CaptureScriptInvokeForEachMulti(RuntimeHook* hook_info, + ExecutionContext& context) +{ + Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE)); + + struct args_t + { + uint64_t context; // const Context *rsc + uint64_t script; // Script *s + uint64_t slot; // uint32_t slot + uint64_t aIns; // const Allocation **aIns + uint64_t inLen; // size_t inLen + uint64_t aOut; // Allocation *aout + uint64_t usr; // const void *usr + uint64_t usrLen; // size_t usrLen + uint64_t sc; // const RsScriptCall *sc + } + args; + + bool success = + GetArgSimple(context, 0, &args.context) && + GetArgSimple(context, 1, &args.script) && + GetArgSimple(context, 2, &args.slot) && + GetArgSimple(context, 3, &args.aIns) && + GetArgSimple(context, 4, &args.inLen) && + GetArgSimple(context, 5, &args.aOut) && + GetArgSimple(context, 6, &args.usr) && + GetArgSimple(context, 7, &args.usrLen) && + GetArgSimple(context, 8, &args.sc); + + if (!success) + { + if (log) + log->Printf("RenderScriptRuntime::CaptureScriptInvokeForEachMulti()" + " - Error while reading the function parameters"); + return; + } + + const uint32_t target_ptr_size = m_process->GetAddressByteSize(); + Error error; + std::vector<uint64_t> allocs; + + // traverse allocation list + for (uint64_t i = 0; i < args.inLen; ++i) + { + // calculate offest to allocation pointer + const lldb::addr_t addr = args.aIns + i * target_ptr_size; + + // Note: due to little endian layout, reading 32bits or 64bits into res64 will + // give the correct results. + + uint64_t res64 = 0; + size_t read = m_process->ReadMemory(addr, &res64, target_ptr_size, error); + if (read != target_ptr_size || !error.Success()) + { + if (log) + log->Printf("RenderScriptRuntime::CaptureScriptInvokeForEachMulti()" + " - Error while reading allocation list argument %" PRId64, i); + } + else + { + allocs.push_back(res64); + } + } + + // if there is an output allocation track it + if (args.aOut) + { + allocs.push_back(args.aOut); + } + + // for all allocations we have found + for (const uint64_t alloc_addr : allocs) + { + AllocationDetails* alloc = LookUpAllocation(alloc_addr, true); + if (alloc) + { + // save the allocation address + if (alloc->address.isValid()) + { + // check the allocation address we already have matches + assert(*alloc->address.get() == alloc_addr); + } + else + { + alloc->address = alloc_addr; + } + + // save the context + if (log) + { + if (alloc->context.isValid() && *alloc->context.get() != args.context) + log->Printf("RenderScriptRuntime::CaptureScriptInvokeForEachMulti" + " - Allocation used by multiple contexts"); + } + alloc->context = args.context; + } + } + + // make sure we track this script object + if (lldb_private::RenderScriptRuntime::ScriptDetails * script = LookUpScript(args.script, true)) + { + if (log) + { + if (script->context.isValid() && *script->context.get() != args.context) + log->Printf("RenderScriptRuntime::CaptureScriptInvokeForEachMulti" + " - Script used by multiple contexts"); + } + script->context = args.context; + } +} + +void RenderScriptRuntime::CaptureSetGlobalVar1(RuntimeHook* hook_info, ExecutionContext& context) { Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE)); Modified: lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h?rev=257772&r1=257771&r2=257772&view=diff ============================================================================== --- lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h (original) +++ lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h Thu Jan 14 09:39:28 2016 @@ -324,6 +324,7 @@ private: void CaptureAllocationInit1(RuntimeHook* hook_info, ExecutionContext& context); void CaptureAllocationDestroy(RuntimeHook* hook_info, ExecutionContext& context); void CaptureSetGlobalVar1(RuntimeHook* hook_info, ExecutionContext& context); + void CaptureScriptInvokeForEachMulti(RuntimeHook* hook_info, ExecutionContext& context); AllocationDetails* FindAllocByID(Stream &strm, const uint32_t alloc_id); std::shared_ptr<uint8_t> GetAllocationData(AllocationDetails* allocation, StackFrame* frame_ptr); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits