Author: aidandodds Date: Thu Mar 10 11:27:41 2016 New Revision: 263130 URL: http://llvm.org/viewvc/llvm-project?rev=263130&view=rev Log: [Renderscript] Add stack argument reading code for Mipsel
This commit implements the reading of stack spilled function arguments for little endian MIPS targets. Committed on behalf of: Dean De Leo <d...@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=263130&r1=263129&r2=263130&view=diff ============================================================================== --- lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp (original) +++ lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp Thu Mar 10 11:27:41 2016 @@ -184,6 +184,8 @@ GetArgsX86_64(GetArgsCtx &ctx, ArgItem * 4, // eBool, }}; + Error error; + // get the current stack pointer uint64_t sp = ctx.reg_ctx->GetSP(); // step over the return address @@ -227,7 +229,6 @@ GetArgsX86_64(GetArgsCtx &ctx, ArgItem * // read the argument from memory arg.value = 0; // note: due to little endian layout reading 4 or 8 bytes will give the correct value. - Error error; size_t read = ctx.process->ReadMemory(sp, &arg.value, size, error); success = (error.Success() && read==size); // advance past this argument @@ -237,7 +238,8 @@ GetArgsX86_64(GetArgsCtx &ctx, ArgItem * if (!success) { if (log) - log->Printf("%s - error reading argument: %" PRIu64, __FUNCTION__, uint64_t(i)); + log->Printf("%s - error reading argument: %" PRIu64", reason: %s", + __FUNCTION__, uint64_t(i), error.AsCString("n/a")); return false; } } @@ -252,6 +254,8 @@ GetArgsArm(GetArgsCtx &ctx, ArgItem *arg Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE); + Error error; + // get the current stack pointer uint64_t sp = ctx.reg_ctx->GetSP(); @@ -275,7 +279,6 @@ GetArgsArm(GetArgsCtx &ctx, ArgItem *arg // clear all 64bits arg.value = 0; // read this argument from memory - Error error; size_t bytes_read = ctx.process->ReadMemory(sp, &arg.value, arg_size, error); success = (error.Success() && bytes_read == arg_size); // advance the stack pointer @@ -285,7 +288,8 @@ GetArgsArm(GetArgsCtx &ctx, ArgItem *arg if (!success) { if (log) - log->Printf("%s - error reading argument: %" PRIu64, __FUNCTION__, uint64_t(i)); + log->Printf("%s - error reading argument: %" PRIu64", reason: %s", + __FUNCTION__, uint64_t(i), error.AsCString("n/a")); return false; } } @@ -340,6 +344,11 @@ GetArgsMipsel(GetArgsCtx &ctx, ArgItem * Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE); + Error error; + + // find offset to arguments on the stack (+16 to skip over a0-a3 shadow space) + uint64_t sp = ctx.reg_ctx->GetSP() + 16; + for (size_t i = 0; i < num_args; ++i) { bool success = false; @@ -379,6 +388,8 @@ GetArgsMips64el(GetArgsCtx &ctx, ArgItem Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE); + Error error; + // get the current stack pointer uint64_t sp = ctx.reg_ctx->GetSP(); @@ -402,7 +413,6 @@ GetArgsMips64el(GetArgsCtx &ctx, ArgItem // clear all 64bits arg.value = 0; // read this argument from memory - Error error; size_t bytes_read = ctx.process->ReadMemory(sp, &arg.value, arg_size, error); success = (error.Success() && bytes_read == arg_size); // advance the stack pointer @@ -412,7 +422,8 @@ GetArgsMips64el(GetArgsCtx &ctx, ArgItem if (!success) { if (log) - log->Printf("%s - error reading argument: %" PRIu64, __FUNCTION__, uint64_t(i)); + log->Printf("%s - error reading argument: %" PRIu64", reason: %s", + __FUNCTION__, uint64_t(i), error.AsCString("n/a")); return false; } } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits