在IR级别将函数指针调用转换为函数调用

时间:2018-08-17 11:10:58

标签: compiler-optimization llvm-ir static-code-analysis

我想将MPlayer的IR中的函数指针调用转换为函数调用。例如,我有以下行:

...
%10 = tail call i32 %7(%struct.demuxer* nonnull %0, i32 %1, i8* %2) #7,!dbg !863222
...

我想将存储在%7中的目标设置为具有以下定义的名为demux_lavf_control()的实函数:

...
define internal i32 
@demux_lavf_control(%struct.demuxer.2657* nocapture readonly, i32, i8* nocapture) #0 !dbg !963916 {
...

我编写了一个函数遍历,找到了提到的函数指针调用(在这里存储在CallInstr中),并将调用目标设置如下:

...
Module *theModule = F.getParent();
Function *targetFunc = theModule->getFunction("demux_lavf_control");
CallInstr->setCalledFunction(targetFunc);
...

F是包含调用的函数。通过导致以下错误:

...
Call parameter type does not match function signature!
%struct.demuxer* %0
 %struct.demuxer.2657*  %10 = tail call i32 @demux_lavf_control(%struct.demuxer*
 nonnull %0, i32 %1, i8* %2) #7, !dbg !863222
LLVM ERROR: Broken function found, compilation aborted!
...

更改前的呼叫操作数[names:types]为:

...
[:%struct.demuxer*]
[:i32]
[:i8*]
[:i32 (%struct.demuxer*, i32, i8*)*]
...

更改之后是:

...
[:%struct.demuxer*]
[:i32]
[:i8*]
[demux_lavf_control:i32 (%struct.demuxer.2657*, i32, i8*)*]
...

我该如何解决问题?看来struct.demuxer.2657*struct.demuxer*不同。我应该在通话前添加类似bitcast的内容吗?

0 个答案:

没有答案