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