[Lldb-commits] [lldb] r114990 - /lldb/trunk/source/Expression/IRForTarget.cpp
Chris Lattner
clattner at apple.com
Tue Sep 28 16:38:54 PDT 2010
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