I should clarify: it’s expected that there is a FunctionVal there. This is much better when JITting later on, and the transform from FunctionVal to a function pointer was a hack in IRForTarget. The IRInterpreter just has to handle FunctionVals, as I just outlined.
Sean > On Feb 24, 2016, at 2:36 PM, Sean Callanan via lldb-dev > <lldb-dev@lists.llvm.org> wrote: > > 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 >> <mailto: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> >> [mailto: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
_______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev