2010-11-05 02:30:59 +08:00
|
|
|
//===-- AppleObjCRuntimeV1.cpp --------------------------------------*- C++ -*-===//
|
2010-09-23 10:01:19 +08:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2010-11-05 02:30:59 +08:00
|
|
|
#include "AppleObjCRuntimeV1.h"
|
2010-09-28 09:25:32 +08:00
|
|
|
#include "AppleObjCTrampolineHandler.h"
|
2010-09-23 10:01:19 +08:00
|
|
|
|
2010-11-04 06:19:38 +08:00
|
|
|
#include "llvm/Support/MachO.h"
|
2010-09-30 08:54:27 +08:00
|
|
|
#include "clang/AST/Type.h"
|
|
|
|
|
2010-11-04 06:19:38 +08:00
|
|
|
#include "lldb/Breakpoint/BreakpointLocation.h"
|
2010-09-23 10:01:19 +08:00
|
|
|
#include "lldb/Core/ConstString.h"
|
|
|
|
#include "lldb/Core/Error.h"
|
2010-09-28 09:25:32 +08:00
|
|
|
#include "lldb/Core/Log.h"
|
2010-09-23 10:01:19 +08:00
|
|
|
#include "lldb/Core/Module.h"
|
|
|
|
#include "lldb/Core/PluginManager.h"
|
|
|
|
#include "lldb/Core/Scalar.h"
|
2010-09-28 09:25:32 +08:00
|
|
|
#include "lldb/Core/StreamString.h"
|
|
|
|
#include "lldb/Expression/ClangFunction.h"
|
2010-11-05 02:30:59 +08:00
|
|
|
#include "lldb/Expression/ClangUtilityFunction.h"
|
2010-09-23 10:01:19 +08:00
|
|
|
#include "lldb/Symbol/ClangASTContext.h"
|
2010-09-28 09:25:32 +08:00
|
|
|
#include "lldb/Target/ExecutionContext.h"
|
2010-09-23 10:01:19 +08:00
|
|
|
#include "lldb/Target/Process.h"
|
|
|
|
#include "lldb/Target/RegisterContext.h"
|
|
|
|
#include "lldb/Target/Target.h"
|
|
|
|
#include "lldb/Target/Thread.h"
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
2010-11-05 02:30:59 +08:00
|
|
|
static const char *pluginName = "AppleObjCRuntimeV1";
|
|
|
|
static const char *pluginDesc = "Apple Objective C Language Runtime - Version 1";
|
|
|
|
static const char *pluginShort = "language.apple.objc.v1";
|
2010-09-23 10:01:19 +08:00
|
|
|
|
2011-04-16 08:01:13 +08:00
|
|
|
bool
|
2011-05-04 11:43:18 +08:00
|
|
|
AppleObjCRuntimeV1::GetDynamicTypeAndAddress (ValueObject &in_value,
|
|
|
|
lldb::DynamicValueType use_dynamic,
|
|
|
|
TypeAndOrName &class_type_or_name,
|
|
|
|
Address &address)
|
2010-09-28 09:25:32 +08:00
|
|
|
{
|
2011-04-16 08:01:13 +08:00
|
|
|
return false;
|
2010-09-28 09:25:32 +08:00
|
|
|
}
|
|
|
|
|
2010-09-23 10:01:19 +08:00
|
|
|
//------------------------------------------------------------------
|
|
|
|
// Static Functions
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
lldb_private::LanguageRuntime *
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::CreateInstance (Process *process, lldb::LanguageType language)
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
// FIXME: This should be a MacOS or iOS process, and we need to look for the OBJC section to make
|
|
|
|
// sure we aren't using the V1 runtime.
|
|
|
|
if (language == eLanguageTypeObjC)
|
2010-11-05 02:30:59 +08:00
|
|
|
{
|
2010-11-05 08:57:06 +08:00
|
|
|
ModuleSP objc_module_sp;
|
|
|
|
|
2011-03-25 05:19:54 +08:00
|
|
|
if (AppleObjCRuntime::GetObjCVersion (process, objc_module_sp) == eAppleObjC_V1)
|
2010-11-05 02:30:59 +08:00
|
|
|
return new AppleObjCRuntimeV1 (process);
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
2010-09-23 10:01:19 +08:00
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::Initialize()
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
PluginManager::RegisterPlugin (pluginName,
|
|
|
|
pluginDesc,
|
|
|
|
CreateInstance);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::Terminate()
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
PluginManager::UnregisterPlugin (CreateInstance);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
// PluginInterface protocol
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
const char *
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::GetPluginName()
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
return pluginName;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::GetShortPluginName()
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
return pluginShort;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::GetPluginVersion()
|
2010-09-23 10:01:19 +08:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2010-11-05 02:30:59 +08:00
|
|
|
AppleObjCRuntimeV1::SetExceptionBreakpoints ()
|
2010-11-04 06:19:38 +08:00
|
|
|
{
|
|
|
|
if (!m_process)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!m_objc_exception_bp_sp)
|
|
|
|
{
|
2010-11-05 02:30:59 +08:00
|
|
|
m_objc_exception_bp_sp = m_process->GetTarget().CreateBreakpoint (NULL,
|
2011-09-23 08:54:11 +08:00
|
|
|
NULL,
|
2010-11-05 02:30:59 +08:00
|
|
|
"objc_exception_throw",
|
|
|
|
eFunctionNameTypeBase,
|
|
|
|
true);
|
2010-11-04 06:19:38 +08:00
|
|
|
}
|
2011-07-23 08:12:05 +08:00
|
|
|
else
|
|
|
|
m_objc_exception_bp_sp->SetEnabled (true);
|
2010-11-04 06:19:38 +08:00
|
|
|
}
|
|
|
|
|
2010-11-05 08:57:06 +08:00
|
|
|
struct BufStruct {
|
|
|
|
char contents[2048];
|
|
|
|
};
|
|
|
|
|
2010-11-05 02:30:59 +08:00
|
|
|
ClangUtilityFunction *
|
|
|
|
AppleObjCRuntimeV1::CreateObjectChecker(const char *name)
|
|
|
|
{
|
2010-11-05 08:57:06 +08:00
|
|
|
std::auto_ptr<BufStruct> buf(new BufStruct);
|
|
|
|
|
|
|
|
assert(snprintf(&buf->contents[0], sizeof(buf->contents),
|
|
|
|
"struct __objc_class \n"
|
|
|
|
"{ \n"
|
|
|
|
" struct __objc_class *isa; \n"
|
|
|
|
" struct __objc_class *super_class; \n"
|
|
|
|
" const char *name; \n"
|
|
|
|
" // rest of struct elided because unused \n"
|
|
|
|
"}; \n"
|
|
|
|
" \n"
|
|
|
|
"struct __objc_object \n"
|
|
|
|
"{ \n"
|
|
|
|
" struct __objc_class *isa; \n"
|
|
|
|
"}; \n"
|
|
|
|
" \n"
|
|
|
|
"extern \"C\" void \n"
|
2011-10-27 08:02:05 +08:00
|
|
|
"%s(void *$__lldb_arg_obj, void *$__lldb_arg_selector) \n"
|
2010-11-05 08:57:06 +08:00
|
|
|
"{ \n"
|
|
|
|
" struct __objc_object *obj = (struct __objc_object*)$__lldb_arg_obj; \n"
|
2011-05-20 11:15:54 +08:00
|
|
|
" (int)strlen(obj->isa->name); \n"
|
2010-11-05 08:57:06 +08:00
|
|
|
"} \n",
|
|
|
|
name) < sizeof(buf->contents));
|
|
|
|
|
|
|
|
return new ClangUtilityFunction(buf->contents, name);
|
2010-11-04 06:19:38 +08:00
|
|
|
}
|