llvm用另一个替换一个函数

时间:2013-11-22 18:49:15

标签: llvm jit

我正在尝试用另一个函数调用替换函数调用。例如这是具有3个函数的代码 - print1,print2和main:

#include <stdio.h>
extern "C" { 
int print1()
{
   printf("Inside print1\n");
   return 0xdeadbeef;
}
int print2()
{
   printf("Inside print2\n");
   return 0xbeefdead;
}
int main(void)
{
   return print1();
}
}"

我的目标是用print2替换print1(在main中)的使用。我将上面的代码编译成llvm :: Module *(在下面的代码中称为main),然后用它创建一个执行引擎。

std::string errMsg;
llvm::ExecutionEngine *ee =
   llvm::EngineBuilder( main ).setErrorStr( &errMsg ).create();    
ASSERT_NE( ee, nullptr )<<"Execution engine is nullptr:"<<errMsg;

此时,我能够从执行引擎中获取所有3个函数(print1,print2和main),并且能够很好地执行它们。但是,当我尝试将函数“print1”替换为“print2”时出现问题,如下所示:

llvm::Function *print1f = main->getFunction( "print1" );
llvm::Function *print2f = main->getFunction( "print2" );
llvm::Function *mainf = main->getFunction( "main" );

//carry out the replacement
print2f->takeName( print1f );
ee->freeMachineCodeForFunction( mainf );
ee->freeMachineCodeForFunction( print1f );
print1f->replaceAllUsesWith( print2f );
print1f->deleteBody();
print1f->dropAllReferences();
print1f->eraseFromParent();

//run main
void *mainfPtr = ee->getPointerToFunction( mainf );
mainfPtr = ee->recompileAndRelinkFunction( mainf );
ASSERT_NE( mainfPtr, nullptr );
ret = ((int(*)(void))(mainfPtr))();
*EXPECT_EQ(0xbeefdead, ret);*

但是,ret返回为0xdeadbeef,就像调用print1而不是print2一样。如果我按照正确的步骤更换功能调用,有人可以告诉我。如果还有其他方法,请告诉我。

THX 维卡斯。

==========

1 个答案:

答案 0 :(得分:3)

如果编译器要在print1中内联main,则该函数实际上永远不会被调用;相反,main会粘贴自己的私有版print1代码。因为它实际上不再需要引用共享的print1,所以交换print2 }可能不会影响main的行为。

如果你想验证这是问题(和/或防止它发生,如果是),请尝试告诉编译器不要内联。