Implement returning integer values in "thread return" for arm, x86_64 and i386. Also returns
floats & doubles on x86_64.
<rdar://problem/8356523>
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@164741 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index 5cffe2d..ee3a855 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -15,6 +15,7 @@
#include "lldb/Core/StreamString.h"
#include "lldb/Core/RegularExpression.h"
#include "lldb/Host/Host.h"
+#include "lldb/Symbol/Function.h"
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/ObjCLanguageRuntime.h"
@@ -1313,14 +1314,37 @@
StackFrameSP older_frame_sp = thread->GetStackFrameAtIndex(older_frame_idx);
if (return_value_sp)
- {
- // TODO: coerce the return_value_sp to the type of the function in frame_sp.
-
+ {
lldb::ABISP abi = thread->GetProcess()->GetABI();
if (!abi)
{
return_error.SetErrorString("Could not find ABI to set return value.");
}
+ SymbolContext sc = frame_sp->GetSymbolContext(eSymbolContextFunction);
+
+ // FIXME: ValueObject::Cast doesn't currently work correctly, at least not for scalars.
+ // Turn that back on when that works.
+ if (0 && sc.function != NULL)
+ {
+ Type *function_type = sc.function->GetType();
+ if (function_type)
+ {
+ clang_type_t return_type = sc.function->GetReturnClangType();
+ if (return_type)
+ {
+ ClangASTType ast_type (function_type->GetClangAST(), return_type);
+ StreamString s;
+ ast_type.DumpTypeDescription(&s);
+ ValueObjectSP cast_value_sp = return_value_sp->Cast(ast_type);
+ if (cast_value_sp)
+ {
+ cast_value_sp->SetFormat(eFormatHex);
+ return_value_sp = cast_value_sp;
+ }
+ }
+ }
+ }
+
return_error = abi->SetReturnValueObject(older_frame_sp, return_value_sp);
if (!return_error.Success())
return return_error;