diff options
| author | Sean Callanan <scallanan@apple.com> | 2011-10-31 22:11:40 +0000 |
|---|---|---|
| committer | Sean Callanan <scallanan@apple.com> | 2011-10-31 22:11:40 +0000 |
| commit | fc8feb8137872d70d87f566888a099185e1cb3df (patch) | |
| tree | 438d6584d95014a00cfe393fdebfe9e731965a22 /lldb/source/Expression/IRForTarget.cpp | |
| parent | 4c4f08d5553a442d21bee98903483b501d397a7a (diff) | |
| download | bcm5719-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
Diffstat (limited to 'lldb/source/Expression/IRForTarget.cpp')
| -rw-r--r-- | lldb/source/Expression/IRForTarget.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
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; |

