[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