diff options
| author | Sean Callanan <scallanan@apple.com> | 2011-11-16 00:20:50 +0000 |
|---|---|---|
| committer | Sean Callanan <scallanan@apple.com> | 2011-11-16 00:20:50 +0000 |
| commit | a6cbf06d0a7068f307b77313a4a6cb73b3956984 (patch) | |
| tree | 42f081efc13f0b23b535cbb6c5c34c217734d07d /lldb/source/Expression | |
| parent | 2c523a6ff00c45ce907bc07e156470ddefaebb06 (diff) | |
| download | bcm5719-llvm-a6cbf06d0a7068f307b77313a4a6cb73b3956984.tar.gz bcm5719-llvm-a6cbf06d0a7068f307b77313a4a6cb73b3956984.zip | |
Two fixes for Objetive-C methods that return struct
types. First, I added handling for the memset intrinsic
in the IR, which is used to zero out the returned struct.
Second, I fixed the object-checking instrumentation
to objc_msgSend_stret, and generally tightened up how
the object-checking functions get inserted.
llvm-svn: 144741
Diffstat (limited to 'lldb/source/Expression')
| -rw-r--r-- | lldb/source/Expression/IRDynamicChecks.cpp | 75 | ||||
| -rw-r--r-- | lldb/source/Expression/IRForTarget.cpp | 6 |
2 files changed, 78 insertions, 3 deletions
diff --git a/lldb/source/Expression/IRDynamicChecks.cpp b/lldb/source/Expression/IRDynamicChecks.cpp index 1d6637dd033..0cf812fbc13 100644 --- a/lldb/source/Expression/IRDynamicChecks.cpp +++ b/lldb/source/Expression/IRDynamicChecks.cpp @@ -423,6 +423,17 @@ public: ~ObjcObjectChecker () { } + + enum msgSend_type + { + eMsgSend = 0, + eMsgSendSuper, + eMsgSendSuper_stret, + eMsgSend_fpret, + eMsgSend_stret + }; + + std::map <llvm::Instruction *, msgSend_type> msgSend_types; private: bool InstrumentInstruction(llvm::Instruction *inst) @@ -437,8 +448,23 @@ private: // id objc_msgSend(id theReceiver, SEL theSelector, ...) - llvm::Value *target_object = call_inst->getArgOperand(0);; - llvm::Value *selector = call_inst->getArgOperand(1); + llvm::Value *target_object; + llvm::Value *selector; + + switch (msgSend_types[inst]) + { + case eMsgSend: + case eMsgSend_fpret: + target_object = call_inst->getArgOperand(0); + selector = call_inst->getArgOperand(1); + break; + case eMsgSend_stret: + target_object = call_inst->getArgOperand(1); + selector = call_inst->getArgOperand(2); + case eMsgSendSuper: + case eMsgSendSuper_stret: + return true; + } // Insert an instruction to cast the receiver id to int8_t* @@ -505,8 +531,51 @@ private: if (log) log->Printf("Found call to %s: %s\n", real_name->getAsString().c_str(), PrintValue(call_inst).c_str()); - if (real_name->getAsString().find("objc_msgSend") != std::string::npos) + std::string name_str = real_name->getAsString(); + const char* name_cstr = name_str.c_str(); + + if (name_str.find("objc_msgSend") == std::string::npos) + return true; + + if (!strcmp(name_cstr, "objc_msgSend")) + { RegisterInstruction(i); + msgSend_types[&i] = eMsgSend; + return true; + } + + if (!strcmp(name_cstr, "objc_msgSend_stret")) + { + RegisterInstruction(i); + msgSend_types[&i] = eMsgSend_stret; + return true; + } + + if (!strcmp(name_cstr, "objc_msgSend_fpret")) + { + RegisterInstruction(i); + msgSend_types[&i] = eMsgSend_fpret; + return true; + } + + if (!strcmp(name_cstr, "objc_msgSendSuper")) + { + RegisterInstruction(i); + msgSend_types[&i] = eMsgSendSuper; + return true; + } + + if (!strcmp(name_cstr, "objc_msgSendSuper_stret")) + { + RegisterInstruction(i); + msgSend_types[&i] = eMsgSendSuper_stret; + return true; + } + + if (log) + log->Printf("Function name '%s' contains 'objc_msgSend' but is not handled", name_str.c_str()); + + return true; } return true; diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp index c6d7f2dea2e..ba8df143246 100644 --- a/lldb/source/Expression/IRForTarget.cpp +++ b/lldb/source/Expression/IRForTarget.cpp @@ -205,6 +205,12 @@ IRForTarget::GetFunctionAddress (llvm::Function *fun, name = g_memcpy_str; } break; + case Intrinsic::memset: + { + static lldb_private::ConstString g_memset_str ("memset"); + name = g_memset_str; + } + break; } if (log && name) |

