Author: ewancrawford Date: Fri Dec 11 07:49:21 2015 New Revision: 255338 URL: http://llvm.org/viewvc/llvm-project?rev=255338&view=rev Log: [RenderScript] Support for amd64 RS hooks
Adds support for reading a maximum of six integer arguments from a renderscript hook on X86_64. Author: Luke Drummond <luke.drumm...@codeplay.com> Modified: lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp 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=255338&r1=255337&r2=255338&view=diff ============================================================================== --- lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp (original) +++ lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp Fri Dec 11 07:49:21 2015 @@ -612,6 +612,16 @@ RenderScriptRuntime::HookCallback(Runtim bool RenderScriptRuntime::GetArgSimple(ExecutionContext &context, uint32_t arg, uint64_t *data) { + // Get a positional integer argument. + // Given an ExecutionContext, ``context`` which should be a RenderScript + // frame, get the value of the positional argument ``arg`` and save its value + // to the address pointed to by ``data``. + // returns true on success, false otherwise. + // If unsuccessful, the value pointed to by ``data`` is undefined. Otherwise, + // ``data`` will be set to the value of the the given ``arg``. + // NOTE: only natural width integer arguments for the machine are supported. + // Behaviour with non primitive arguments is undefined. + if (!data) return false; @@ -640,7 +650,7 @@ RenderScriptRuntime::GetArgSimple(Execut if (error.Fail()) { if (log) - log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading X86 stack: %s.", error.AsCString()); + log->Printf("RenderScriptRuntime::GetArgSimple - error reading X86 stack: %s.", error.AsCString()); } else { @@ -650,6 +660,35 @@ RenderScriptRuntime::GetArgSimple(Execut break; } + case llvm::Triple::ArchType::x86_64: + { + // amd64 has 6 integer registers, and 8 XMM registers for parameter passing. + // Surplus args are spilled onto the stack. + // rdi, rsi, rdx, rcx, r8, r9, (zmm0 - 7 for vectors) + // ref: AMD64 ABI Draft 0.99.6 â October 7, 2013 â 10:35; Figure 3.4. Retrieved from + // http://www.x86-64.org/documentation/abi.pdf + if (arg > 5) + { + if (log) + log->Warning("X86_64 register spill is not supported."); + break; + } + const char * regnames[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9"}; + assert((sizeof(regnames) / sizeof(const char *)) > arg); + const RegisterInfo *rArg = reg_ctx->GetRegisterInfoByName(regnames[arg]); + RegisterValue rVal; + success = reg_ctx->ReadRegister(rArg, rVal); + if (success) + { + *data = rVal.GetAsUInt64(0u, &success); + } + else + { + if (log) + log->Printf("RenderScriptRuntime::GetArgSimple - error reading x86_64 register: %d.", arg); + } + break; + } case llvm::Triple::ArchType::arm: { // arm 32 bit @@ -660,12 +699,12 @@ RenderScriptRuntime::GetArgSimple(Execut success = reg_ctx->ReadRegister(rArg, rVal); if (success) { - (*data) = rVal.GetAsUInt32(); + (*data) = rVal.GetAsUInt32(0u, &success); } else { if (log) - log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM register: %d.", arg); + log->Printf("RenderScriptRuntime::GetArgSimple - error reading ARM register: %d.", arg); } } else @@ -676,7 +715,7 @@ RenderScriptRuntime::GetArgSimple(Execut if (error.Fail()) { if (log) - log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM stack: %s.", error.AsCString()); + log->Printf("RenderScriptRuntime::GetArgSimple - error reading ARM stack: %s.", error.AsCString()); } else { @@ -697,7 +736,7 @@ RenderScriptRuntime::GetArgSimple(Execut success = reg_ctx->ReadRegister(rArg, rVal); if (success) { - *data = rVal.GetAsUInt64(); + *data = rVal.GetAsUInt64(0u, &success); } else { @@ -723,7 +762,7 @@ RenderScriptRuntime::GetArgSimple(Execut success = reg_ctx->ReadRegister(rArg, rVal); if (success) { - *data = rVal.GetAsUInt64(); + *data = rVal.GetAsUInt64(0u, &success); } else { @@ -742,7 +781,7 @@ RenderScriptRuntime::GetArgSimple(Execut if (error.Fail()) { if (log) - log->Printf ("RenderScriptRuntime::GetArgSimple - error reading Mips stack: %s.", error.AsCString()); + log->Printf("RenderScriptRuntime::GetArgSimple - error reading Mips stack: %s.", error.AsCString()); } else { @@ -762,7 +801,7 @@ RenderScriptRuntime::GetArgSimple(Execut success = reg_ctx->ReadRegister(rArg, rVal); if (success) { - (*data) = rVal.GetAsUInt64(); + (*data) = rVal.GetAsUInt64(0u, &success); } else { @@ -780,7 +819,7 @@ RenderScriptRuntime::GetArgSimple(Execut if (error.Fail()) { if (log) - log->Printf ("RenderScriptRuntime::GetArgSimple - Mips64 - Error reading Mips64 stack: %s.", error.AsCString()); + log->Printf("RenderScriptRuntime::GetArgSimple - Mips64 - Error reading Mips64 stack: %s.", error.AsCString()); } else { @@ -799,6 +838,11 @@ RenderScriptRuntime::GetArgSimple(Execut } } + if (!success) + { + if (log) + log->Printf("RenderScriptRuntime::GetArgSimple - failed to get argument at index %" PRIu32, arg); + } return success; } @@ -1009,6 +1053,7 @@ RenderScriptRuntime::LoadRuntimeHooks(ll && targetArchType != llvm::Triple::ArchType::aarch64 && targetArchType != llvm::Triple::ArchType::mipsel && targetArchType != llvm::Triple::ArchType::mips64el + && targetArchType != llvm::Triple::ArchType::x86_64 ) { if (log) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits