diff options
author | Ewan Crawford <ewan@codeplay.com> | 2015-10-22 09:01:05 +0000 |
---|---|---|
committer | Ewan Crawford <ewan@codeplay.com> | 2015-10-22 09:01:05 +0000 |
commit | 02f1c5d132c6a169dffe2a2b8cd8f937838e0b7a (patch) | |
tree | 1f124702fb08db5aa39c5368ffe41a84169ba546 /lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime | |
parent | 0cb1561e425a190cb7a08027623441d901d78563 (diff) | |
download | bcm5719-llvm-02f1c5d132c6a169dffe2a2b8cd8f937838e0b7a.tar.gz bcm5719-llvm-02f1c5d132c6a169dffe2a2b8cd8f937838e0b7a.zip |
[RenderScript] Support for mips64 runtime hook
Previously we could not hook the RS runtime on mips64 architectures.
Patch implements ABI specific code for inspecting function arguments.
Author: Dean De Leo, dean@codeplay.com
llvm-svn: 251003
Diffstat (limited to 'lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime')
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp index 0a28eb654af..3e18a40dbe5 100644 --- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp @@ -609,25 +609,30 @@ RenderScriptRuntime::GetArgSimple(ExecutionContext &context, uint32_t arg, uint6 { const RegisterInfo* rArg = reg_ctx->GetRegisterInfoAtIndex(arg); RegisterValue rVal; - reg_ctx->ReadRegister(rArg, rVal); - (*data) = rVal.GetAsUInt32(); - success = true; + success = reg_ctx->ReadRegister(rArg, rVal); + if (success) + { + (*data) = rVal.GetAsUInt32(); + } + else + { + if (log) + log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM register: %d.", arg); + } } else { uint64_t sp = reg_ctx->GetSP(); + uint32_t offset = (arg-4) * sizeof(uint32_t); + process->ReadMemory(sp + offset, &data, sizeof(uint32_t), error); + if (error.Fail()) { - uint32_t offset = (arg-4) * sizeof(uint32_t); - process->ReadMemory(sp + offset, &data, sizeof(uint32_t), error); - if (error.Fail()) - { - if (log) - log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM stack: %s.", error.AsCString()); - } - else - { - success = true; - } + if (log) + log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM stack: %s.", error.AsCString()); + } + else + { + success = true; } } @@ -660,6 +665,44 @@ RenderScriptRuntime::GetArgSimple(ExecutionContext &context, uint32_t arg, uint6 } break; } + case llvm::Triple::ArchType::mips64el: + { + // read from the registers + if (arg < 8) + { + const RegisterInfo* rArg = reg_ctx->GetRegisterInfoAtIndex(arg + 4); + RegisterValue rVal; + success = reg_ctx->ReadRegister(rArg, rVal); + if (success) + { + (*data) = rVal.GetAsUInt64(); + } + else + { + if (log) + log->Printf("RenderScriptRuntime::GetArgSimple - Mips64 - Error reading the argument #%d", arg); + } + } + + // read from the stack + else + { + uint64_t sp = reg_ctx->GetSP(); + uint32_t offset = (arg - 8) * sizeof(uint64_t); + process->ReadMemory(sp + offset, &data, sizeof(uint64_t), error); + if (error.Fail()) + { + if (log) + log->Printf ("RenderScriptRuntime::GetArgSimple - Mips64 - Error reading Mips64 stack: %s.", error.AsCString()); + } + else + { + success = true; + } + } + + break; + } default: { // invalid architecture @@ -841,10 +884,12 @@ RenderScriptRuntime::LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind) if (targetArchType != llvm::Triple::ArchType::x86 && targetArchType != llvm::Triple::ArchType::arm - && targetArchType != llvm::Triple::ArchType::aarch64) + && targetArchType != llvm::Triple::ArchType::aarch64 + && targetArchType != llvm::Triple::ArchType::mips64el + ) { if (log) - log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to hook runtime. Only X86, ARM supported currently."); + log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to hook runtime. Only X86, ARM, Mips64 supported currently."); return; } |