[Lldb-commits] [lldb] r114990 - /lldb/trunk/source/Expression/IRForTarget.cpp
Sean Callanan
scallanan at apple.com
Tue Sep 28 16:56:46 PDT 2010
Thanks. This would have failed in many cases in odd ways, and is now fixed.
Sean
On Sep 28, 2010, at 4:38 PM, Chris Lattner wrote:
>
> On Sep 28, 2010, at 2:13 PM, Sean Callanan wrote:
>
>> Author: spyffe
>> Date: Tue Sep 28 16:13:03 2010
>> New Revision: 114990
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=114990&view=rev
>> Log:
>> Fixed two bugs in the expression parser:
>>
>> - the guard variable for the static result
>> variable was being mistaken for the actual
>> result value, causing IRForTarget to fail
>>
>> - LLVM builtins like memcpy were not being
>> properly resolved; now they are resolved
>> to the corresponding function in the target
>
> Hi Sean,
>
> What problem are you trying to solve here? If you're trying to figure out what intrinsic something is, you can use Function::getIntrinsicID(). You shouldn't have to parse out the string like this.
>
> -Chris
>
>>
>> Modified:
>> lldb/trunk/source/Expression/IRForTarget.cpp
>>
>> Modified: lldb/trunk/source/Expression/IRForTarget.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRForTarget.cpp?rev=114990&r1=114989&r2=114990&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Expression/IRForTarget.cpp (original)
>> +++ lldb/trunk/source/Expression/IRForTarget.cpp Tue Sep 28 16:13:03 2010
>> @@ -80,8 +80,12 @@
>> vi != ve;
>> ++vi)
>> {
>> - if (strstr(vi->first(), "___clang_expr_result"))
>> + if (strstr(vi->first(), "___clang_expr_result") &&
>> + !strstr(vi->first(), "GV"))
>> + {
>> result_name = vi->first();
>> + break;
>> + }
>> }
>>
>> if (!result_name)
>> @@ -92,6 +96,9 @@
>> return true;
>> }
>>
>> + if (log)
>> + log->Printf("Result name: %s", result_name);
>> +
>> Value *result_value = M.getNamedValue(result_name);
>>
>> if (!result_value)
>> @@ -626,6 +633,36 @@
>> }
>> }
>>
>> + std::string str = fun->getName().str();
>> +
>> + if (str.find("llvm.") == 0)
>> + {
>> + // Probably a LLVM built-in. Let's try again, but looking up the original.
>> + //
>> + // +- builtin_name_offset [in this case, 5]
>> + // |
>> + // |====| builtin_name_length [in this case, 6]
>> + // 0 |
>> + // | | +- builtin_name_end [in this case, 11]
>> + // V V V
>> + // llvm.______.i32.u8
>> + // 012345678901234567
>> + // 0 1
>> +
>> + size_t builtin_name_offset = sizeof("llvm.") - 1;
>> + size_t builtin_name_end = str.find('.', builtin_name_offset);
>> +
>> + if (builtin_name_end == str.npos)
>> + builtin_name_end = str.size() + 1;
>> +
>> + size_t builtin_name_length = builtin_name_end - builtin_name_offset;
>> +
>> + str = str.substr(builtin_name_offset, builtin_name_length);
>> +
>> + if (log)
>> + log->Printf("Extracted builtin function name %s", str.c_str());
>> + }
>> +
>> clang::NamedDecl *fun_decl = DeclForGlobalValue(M, fun);
>> uint64_t fun_addr;
>> Value **fun_value_ptr = NULL;
>> @@ -636,10 +673,10 @@
>> {
>> fun_value_ptr = NULL;
>>
>> - if (!m_decl_map->GetFunctionAddress(fun->getName().str().c_str(), fun_addr))
>> + if (!m_decl_map->GetFunctionAddress(str.c_str(), fun_addr))
>> {
>> if (log)
>> - log->Printf("Function %s had no address", fun->getName().str().c_str());
>> + log->Printf("Function %s had no address", str.c_str());
>>
>> return false;
>> }
>> @@ -647,16 +684,15 @@
>> }
>> else
>> {
>> - if (!m_decl_map->GetFunctionAddress(fun->getName().str().c_str(), fun_addr))
>> + if (!m_decl_map->GetFunctionAddress(str.c_str(), fun_addr))
>> {
>> if (log)
>> - log->Printf("Metadataless function %s had no address", fun->getName().str().c_str());
>> - return false;
>> + log->Printf("Metadataless function %s had no address", str.c_str());
>> }
>> }
>>
>> if (log)
>> - log->Printf("Found %s at %llx", fun->getName().str().c_str(), fun_addr);
>> + log->Printf("Found %s at %llx", str.c_str(), fun_addr);
>>
>> Value *fun_addr_ptr;
>>
>> @@ -678,7 +714,7 @@
>>
>> C->setCalledFunction(fun_addr_ptr);
>>
>> - ConstantArray *func_name = (ConstantArray*)ConstantArray::get(M.getContext(), fun->getName());
>> + ConstantArray *func_name = (ConstantArray*)ConstantArray::get(M.getContext(), str);
>>
>> Value *values[1];
>> values[0] = func_name;
>>
>>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
More information about the lldb-commits
mailing list