[Lldb-commits] [lldb] r131392 - in /lldb/trunk: source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp tools/darwin-debug/darwin-debug.cpp
Greg Clayton
gclayton at apple.com
Sun May 15 15:49:24 PDT 2011
Author: gclayton
Date: Sun May 15 17:49:24 2011
New Revision: 131392
URL: http://llvm.org/viewvc/llvm-project?rev=131392&view=rev
Log:
Added the ability to get a 32 or 64 bit simple return value from the
ABIMacOSX_arm plugin.
Modified darwin-debug to print out the exectuable, working directory and
arguments a bit differently.
Modified:
lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
lldb/trunk/tools/darwin-debug/darwin-debug.cpp
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp?rev=131392&r1=131391&r2=131392&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp Sun May 15 17:49:24 2011
@@ -108,14 +108,12 @@
if (arg5_ptr)
{
reg_value.SetUInt32(*arg5_ptr);
- sp -= 4;
if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp, reg_info->byte_size, reg_value).Fail())
return false;
if (arg6_ptr)
{
reg_value.SetUInt32(*arg6_ptr);
- sp -= 4;
- if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp, reg_info->byte_size, reg_value).Fail())
+ if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp + 4, reg_info->byte_size, reg_value).Fail())
return false;
}
}
@@ -300,84 +298,81 @@
ABIMacOSX_arm::GetReturnValue (Thread &thread,
Value &value) const
{
-// switch (value.GetContextType())
-// {
-// default:
-// return false;
-// case Value::eContextTypeClangType:
-// {
-// // Extract the Clang AST context from the PC so that we can figure out type
-// // sizes
-//
-// clang::ASTContext *ast_context = thread.CalculateTarget()->GetScratchClangASTContext()->getASTContext();
-//
-// // Get the pointer to the first stack argument so we have a place to start
-// // when reading data
-//
-// RegisterContext *reg_ctx = thread.GetRegisterContext().get();
-//
-// void *value_type = value.GetClangType();
-// bool is_signed;
-//
-// if (ClangASTContext::IsIntegerType (value_type, is_signed))
-// {
-// size_t bit_width = ClangASTType::GetClangTypeBitWidth(ast_context, value_type);
-//
-// unsigned eax_id = reg_ctx->GetRegisterInfoByName("eax", 0)->kinds[eRegisterKindLLDB];
-// unsigned edx_id = reg_ctx->GetRegisterInfoByName("edx", 0)->kinds[eRegisterKindLLDB];
-//
-// switch (bit_width)
-// {
-// default:
-// case 128:
-// // Scalar can't hold 128-bit literals, so we don't handle this
-// return false;
-// case 64:
-// uint64_t raw_value;
-// raw_value = thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffffffff;
-// raw_value |= (thread.GetRegisterContext()->ReadRegisterAsUnsigned(edx_id, 0) & 0xffffffff) << 32;
-// if (is_signed)
-// value.GetScalar() = (int64_t)raw_value;
-// else
-// value.GetScalar() = (uint64_t)raw_value;
-// break;
-// case 32:
-// if (is_signed)
-// value.GetScalar() = (int32_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffffffff);
-// else
-// value.GetScalar() = (uint32_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffffffff);
-// break;
-// case 16:
-// if (is_signed)
-// value.GetScalar() = (int16_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffff);
-// else
-// value.GetScalar() = (uint16_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffff);
-// break;
-// case 8:
-// if (is_signed)
-// value.GetScalar() = (int8_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xff);
-// else
-// value.GetScalar() = (uint8_t)(thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xff);
-// break;
-// }
-// }
-// else if (ClangASTContext::IsPointerType (value_type))
-// {
-// unsigned eax_id = reg_ctx->GetRegisterInfoByName("eax", 0)->kinds[eRegisterKindLLDB];
-// uint32_t ptr = thread.GetRegisterContext()->ReadRegisterAsUnsigned(eax_id, 0) & 0xffffffff;
-// value.GetScalar() = ptr;
-// }
-// else
-// {
-// // not handled yet
-// return false;
-// }
-// }
-// break;
-// }
-//
-// return true;
- return false;
+ switch (value.GetContextType())
+ {
+ default:
+ return false;
+ case Value::eContextTypeClangType:
+ {
+ // Extract the Clang AST context from the PC so that we can figure out type
+ // sizes
+
+ clang::ASTContext *ast_context = thread.CalculateTarget()->GetScratchClangASTContext()->getASTContext();
+
+ // Get the pointer to the first stack argument so we have a place to start
+ // when reading data
+
+ RegisterContext *reg_ctx = thread.GetRegisterContext().get();
+
+ void *value_type = value.GetClangType();
+ bool is_signed;
+
+ const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfoByName("r0", 0);
+ if (ClangASTContext::IsIntegerType (value_type, is_signed))
+ {
+ size_t bit_width = ClangASTType::GetClangTypeBitWidth(ast_context, value_type);
+
+ switch (bit_width)
+ {
+ default:
+ return false;
+ case 64:
+ {
+ const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfoByName("r1", 0);
+ uint64_t raw_value;
+ raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
+ raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) & UINT32_MAX)) << 32;
+ if (is_signed)
+ value.GetScalar() = (int64_t)raw_value;
+ else
+ value.GetScalar() = (uint64_t)raw_value;
+ }
+ break;
+ case 32:
+ if (is_signed)
+ value.GetScalar() = (int32_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);
+ else
+ value.GetScalar() = (uint32_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);
+ break;
+ case 16:
+ if (is_signed)
+ value.GetScalar() = (int16_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);
+ else
+ value.GetScalar() = (uint16_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);
+ break;
+ case 8:
+ if (is_signed)
+ value.GetScalar() = (int8_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);
+ else
+ value.GetScalar() = (uint8_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);
+ break;
+ }
+ }
+ else if (ClangASTContext::IsPointerType (value_type))
+ {
+ uint32_t ptr = thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
+ value.GetScalar() = ptr;
+ }
+ else
+ {
+ // not handled yet
+ return false;
+ }
+ }
+ break;
+ }
+
+ return true;
}
bool
Modified: lldb/trunk/tools/darwin-debug/darwin-debug.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/darwin-debug/darwin-debug.cpp?rev=131392&r1=131391&r2=131392&view=diff
==============================================================================
--- lldb/trunk/tools/darwin-debug/darwin-debug.cpp (original)
+++ lldb/trunk/tools/darwin-debug/darwin-debug.cpp Sun May 15 17:49:24 2011
@@ -282,14 +282,18 @@
close (s);
system("clear");
+ printf ("Launching: '%s'\n", argv[0]);
if (working_dir.empty())
{
char cwd[PATH_MAX];
const char *cwd_ptr = getcwd(cwd, sizeof(cwd));
- printf ("Launching '%s' in '%s' for debug with %u arguments:\n", argv[0], cwd_ptr, argc);
+ printf ("Working directory: '%s'\n", cwd_ptr);
}
else
- printf ("Launching '%s' in '%s' for debug with %u arguments:\n", argv[0], working_dir.c_str(), argc);
+ {
+ printf ("Working directory: '%s'\n", working_dir.c_str());
+ }
+ printf ("%i arguments:\n", argc);
for (int i=0; i<argc; ++i)
printf ("argv[%u] = '%s'\n", i, argv[i]);
More information about the lldb-commits
mailing list