<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">Yep. We encountered similar issue a while ago due to IR linking. A bitcasted function argument would do<div><br><div id="AppleMailSignature">Zhang</div><div><br>在 2018年8月17日,19:30,Ahmad Nouralizadeh Khorrami via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> 写道:<br><br></div><blockquote type="cite"><div><div dir="ltr">Hi.<div>It seems that `struct.demuxer.2657*` is different from `struct.demuxer*`. Should I add something like a `bitcast` before the call?<br></div><div>Thanks!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 16 August 2018 at 15:45, Ahmad Nouralizadeh Khorrami <span dir="ltr"><<a href="mailto:ahmad.llvm@gmail.com" target="_blank">ahmad.llvm@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div>I want to convert a function pointer call in the IR of MPlayer to a function call. For example, I have the following line:</div><div><div>...</div><div>%10 = tail call i32 %7(%struct.demuxer* nonnull %0, i32 %1, i8* %2) #7, !dbg !863222</div></div><div>...</div><div>I want to set the target which is stored in %7 to a real function called "demux_lavf_control()" with the following definition:</div><div>...</div><div><div>define internal i32 @demux_lavf_control(%<a href="http://struct.de">struct.de</a><wbr>muxer.2657* nocapture readonly, i32, i8* nocapture) #0 !dbg !963916 {</div></div><div>...</div><div>I wrote a function pass and found the mentioned function pointer call (here, stored in "CallInstr") and set the call target as follows:</div><div>...</div><div><div>Module *theModule = F.getParent();</div><div>Function *targetFunc = theModule->getFunction("demux_<wbr>lavf_control");</div><div>CalIInstr->setCalledFunction(t<wbr>argetFunc);</div></div><div>...</div><div>"F" is the function containing the call. But it leads to the following error:</div><div><div>...</div><div>Call parameter type does not match function signature!</div><div>%struct.demuxer* %0</div><div> %struct.demuxer.2657*  %10 = tail call i32 @demux_lavf_control(%<a href="http://struct.de">struct.de</a><wbr>muxer* nonnull %0, i32 %1, i8* %2) #7, !dbg !863222</div><div>LLVM ERROR: Broken function found, compilation aborted!</div></div><div>...</div><div>The [names:types] of call operands before the change is:</div><div>...</div><div><div>[:%struct.demuxer*] </div><div>[:i32] </div><div>[:i8*] </div><div>[:i32 (%struct.demuxer*, i32, i8*)*] </div></div><div>...</div><div>And after the change is:</div><div>...</div><div><div>[:%struct.demuxer*] </div><div>[:i32] </div><div>[:i8*] </div><div>[demux_lavf_control:i32 (%struct.demuxer.2657*, i32, i8*)*] </div></div><div>...</div><div>How can I solve the problem?</div><div>Thanks in advance!</div></div>
</blockquote></div><br></div>

</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>LLVM Developers mailing list</span><br><span><a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a></span><br><span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a></span><br></div></blockquote></div></body></html>