summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2011-10-31 22:11:40 +0000
committerSean Callanan <scallanan@apple.com>2011-10-31 22:11:40 +0000
commitfc8feb8137872d70d87f566888a099185e1cb3df (patch)
tree438d6584d95014a00cfe393fdebfe9e731965a22
parent4c4f08d5553a442d21bee98903483b501d397a7a (diff)
downloadbcm5719-llvm-fc8feb8137872d70d87f566888a099185e1cb3df.tar.gz
bcm5719-llvm-fc8feb8137872d70d87f566888a099185e1cb3df.zip
The IRDynamicChecks subsystem was not properly
detecting Objective-C method calls because the "lldb.call.realName" metadata was no longer being correctly installed. I fixed this problem. llvm-svn: 143371
-rw-r--r--lldb/include/lldb/Expression/IRForTarget.h5
-rw-r--r--lldb/source/Expression/IRDynamicChecks.cpp2
-rw-r--r--lldb/source/Expression/IRForTarget.cpp32
3 files changed, 38 insertions, 1 deletions
diff --git a/lldb/include/lldb/Expression/IRForTarget.h b/lldb/include/lldb/Expression/IRForTarget.h
index a568acba615..9cec3599c23 100644
--- a/lldb/include/lldb/Expression/IRForTarget.h
+++ b/lldb/include/lldb/Expression/IRForTarget.h
@@ -233,6 +233,11 @@ private:
BuildFunctionPointer (llvm::Type *type,
uint64_t ptr);
+ void
+ RegisterFunctionMetadata (llvm::LLVMContext &context,
+ llvm::Value *function_ptr,
+ const char *name);
+
//------------------------------------------------------------------
/// The top-level pass implementation
///
diff --git a/lldb/source/Expression/IRDynamicChecks.cpp b/lldb/source/Expression/IRDynamicChecks.cpp
index 76b7ea30e26..17a91ee8897 100644
--- a/lldb/source/Expression/IRDynamicChecks.cpp
+++ b/lldb/source/Expression/IRDynamicChecks.cpp
@@ -435,7 +435,7 @@ private:
arg_array[0] = bit_cast;
arg_array[1] = selector;
- ArrayRef<llvm::Value*> args(arg_array, 1);
+ ArrayRef<llvm::Value*> args(arg_array, 2);
CallInst::Create(m_objc_object_check_func,
args,
diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp
index feac49284a7..029d4f52482 100644
--- a/lldb/source/Expression/IRForTarget.cpp
+++ b/lldb/source/Expression/IRForTarget.cpp
@@ -291,6 +291,36 @@ IRForTarget::BuildFunctionPointer (llvm::Type *type,
return ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
}
+void
+IRForTarget::RegisterFunctionMetadata(LLVMContext &context,
+ llvm::Value *function_ptr,
+ const char *name)
+{
+ lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+
+ for (Value::use_iterator i = function_ptr->use_begin(), e = function_ptr->use_end();
+ i != e;
+ ++i)
+ {
+ Value *user = *i;
+
+ if (Instruction *user_inst = dyn_cast<Instruction>(user))
+ {
+ Constant *name_array = ConstantArray::get(context, StringRef(name));
+
+ ArrayRef<Value *> md_values(name_array);
+
+ MDNode *metadata = MDNode::get(context, md_values);
+
+ user_inst->setMetadata("lldb.call.realName", metadata);
+ }
+ else
+ {
+ RegisterFunctionMetadata (context, user, name);
+ }
+ }
+}
+
bool
IRForTarget::ResolveFunctionPointers(llvm::Module &llvm_module,
llvm::Function &llvm_function)
@@ -326,6 +356,8 @@ IRForTarget::ResolveFunctionPointers(llvm::Module &llvm_module,
Constant *value = BuildFunctionPointer(fun->getFunctionType(), addr);
+ RegisterFunctionMetadata (llvm_module.getContext(), fun, name.AsCString());
+
if (value_ptr)
*value_ptr = value;
OpenPOWER on IntegriCloud