I think I understand what’s going on.  The IR interpreter does this 
[IRInterpreter.cpp:1573]:
–
                // Find the address of the callee function
                lldb_private::Scalar I;
                const llvm::Value *val = call_inst->getCalledValue();

                if (!frame.EvaluateValue(I, val, module))
                {
                    error.SetErrorToGenericError();
                    error.SetErrorString("unable to get address of function");
                    return false;
                }
–
It assumes that getCalledValue returns something we can evaluate – which used 
to be a function pointer so everything was fine.
We have to modify EvaluateValue to, when it encounters a FunctionVal, look up 
the corresponding symbol (using IRExecutionUnit::FindSymbol(), ideally) and 
return a Scalar containing the function pointer.
As a first step, I’d suggest trying to make EvaluateValue return true but just 
put nullptr into the Scalar when it gets a FunctionVal – does that result (as 
I’d expect) in a bad function call, or do we still get some kind of “doesn’t 
handle” error?

Sean

> On Feb 24, 2016, at 2:17 PM, Ted Woodward <ted.woodw...@codeaurora.org> wrote:
> 
> I did some digging and found where the ID is being changed from 0x5 to 0xa in 
> the original code.
>  
> IRForTarget::runOnModule() calls ResolveFunctionPointers(), which gets a 
> Constant * from BuildFunctionPointer(). This Value has an ID of 0xa, and 
> runOnModule() then calls the original Function’s replaceAllUsesWith(), 
> passing in the new Value, changing ID from 0x5 to 0xa.
>  
> If I comment out the call to ResolveFunctionPointer() in the original code, I 
> get the same error as the current code: “error: Can't run the expression 
> locally: Interpreter doesn't handle one of the expression's operands”
>  
> So I went to r260768 and added back in the call to ResolveFunctionPointer(), 
> as well as functions that it depended on:
> ClangExpressionDeclMap::FindCodeSymbolInContext()
> ClangExpressionDeclMap::FindBestAlternateMangledName()
> ClangExpressionDeclMap::GetFunctionAddress()
> IRForTarget::GetFunctionAddress()
> IRForTarget::BuildFunctionPointer()
> I commented out the call to RegisterFunctionMetadata() since it didn’t seem 
> to matter.
>  
> After those changes, I was able to print out main’s info and call functions 
> with the expression parser.
>  
> Is there anything in these functions that I can get rid of, or is handled by 
> newer code?
>  
> --
> Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
> Linux Foundation Collaborative Project
>  
> From: scalla...@apple.com [mailto:scalla...@apple.com] 
> Sent: Tuesday, February 23, 2016 6:38 PM
> To: Ted Woodward
> Cc: LLDB
> Subject: Re: r260768 (Removed many JIT workarounds from IRForTarget) broke 
> expression parser with function on Hexagon
>  
> At that point, I’d set a watchpoint and see what is setting it. I would 
> expect that
>  
>   %call = call i32 @factorial(i32 5)
> 
> would put a normal value in call, which would then be the value stored by the 
> store instruction
>  
>   store i32 %call, i32* @"_ZZ12$__lldb_exprPvE19$__lldb_expr_result", align 4
>  
> The store instruction should not have an operand of function type… right?
>  
> Sean
>  
>> On Feb 23, 2016, at 4:21 PM, Ted Woodward <ted.woodw...@codeaurora.org 
>> <mailto:ted.woodw...@codeaurora.org>> wrote:
>>  
>> Unfortunately, that leads to another error, in the Instruction::Store case. 
>> IRInterpreter::ResolveConstantValue() returns an error because it doesn’t 
>> like the value id of FunctionVal. “Interpreter couldn't resolve a value 
>> during execution”.
>>  
>> If I go back 1 commit from r260768 (r260767), it works. The value id is 0xa, 
>> ConstantIntVal. So something in r260768 is either setting the value id to 
>> 0x5, or keeping the value id from being set to 0xa.
>>  
>> Ted
>> --
>> Qualcomm Innovation Center, Inc.
>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
>> Linux Foundation Collaborative Project
>>  
>> From: scalla...@apple.com <mailto:scalla...@apple.com> 
>> [mailto:scalla...@apple.com <mailto:scalla...@apple.com>] 
>> Sent: Tuesday, February 23, 2016 5:41 PM
>> To: Ted Woodward
>> Cc: LLDB
>> Subject: Re: r260768 (Removed many JIT workarounds from IRForTarget) broke 
>> expression parser with function on Hexagon
>>  
>> Ted,
>>  
>> I’m not sure who inside Clang actually sets the value ID – it’s the code 
>> generator’s job to make IR, we don’t construct it.
>> I would be fine with adding FunctionVal to the switch in CanResolveConstant, 
>> returning true.
>>  
>> Sean
>>  
>>> On Feb 23, 2016, at 3:28 PM, Ted Woodward <ted.woodw...@codeaurora.org 
>>> <mailto:ted.woodw...@codeaurora.org>> wrote:
>>>  
>>> Background: Hexagon clang doesn’t have JIT support, so lldb for Hexagon 
>>> only uses the IR Interpreter (Codeplay wrote it for us).
>>>  
>>> Sean, r260768 broke the expression parser with functions.
>>>  
>>> Without connecting to a target, I can’t get the info for main:
>>> (lldb) e main
>>> error: Can't run the expression locally: Interpreter doesn't handle one of 
>>> the expression's operands
>>>  
>>> Connected to a target, I can’t run a function:
>>> (lldb) e factorial(5)
>>> error: Can't run the expression locally: Interpreter doesn't handle one of 
>>> the expression's operands
>>>  
>>>  
>>> I’ve traced the failure to the call to CanResolveConstant() in 
>>> IRInterpreter::CanIntepret(). The failure happens on the 2nd operand. In 
>>> the working case, the Value ID is 0xa – Value::ConstantExprVal. In the 
>>> failing case, it is 0x5. Since it’s defined in a .def file, I can’t be 
>>> sure, but my guess is its Value::FunctionVal.
>>>  
>>>  
>>> Where is the Value ID set?
>>>  
>>>  
>>>  
>>> Some info from the expr log:
>>>  
>>> ; Function Attrs: nounwind
>>> define void @"_Z12$__lldb_exprPv"(i8* %"$__lldb_arg") #0 {
>>> entry:
>>>   %"$__lldb_arg.addr" = alloca i8*, align 4, !clang.decl.ptr !4
>>>   store i8* %"$__lldb_arg", i8** %"$__lldb_arg.addr", align 4
>>>   %0 = load i8, i8* @"_ZGVZ12$__lldb_exprPvE19$__lldb_expr_result", align 1
>>>   %guard.uninitialized = icmp eq i8 %0, 0
>>>   br i1 %guard.uninitialized, label %init.check, label %init.end
>>>  
>>> init.check:                                       ; preds = %entry
>>>   %call = call i32 @factorial(i32 5)
>>>   store i32 %call, i32* @"_ZZ12$__lldb_exprPvE19$__lldb_expr_result", align 
>>> 4
>>>   store i8 1, i8* @"_ZGVZ12$__lldb_exprPvE19$__lldb_expr_result", align 1
>>>   br label %init.end
>>>  
>>> init.end:                                         ; preds = %init.check, 
>>> %entry
>>>   ret void
>>> }
>>>  
>>>  
>>> Unsupported constant: declare i32 @factorial(i32) #1
>>>  
>>>  
>>> Ted
>>>  
>>> --
>>> Qualcomm Innovation Center, Inc.
>>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
>>> Linux Foundation Collaborative Project

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to