llvm用另一个函数替换一个函数

维卡斯

我正在尝试将函数调用替换为另一个函数调用。例如,以下是具有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();
}
}"

我的目标是将print1(主要是)替换为print2。我将上面的代码编译成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一样。有人可以让我知道我是否按照正确的步骤替换了函数调用。如果还有其他方法,请告诉我。

谢谢维卡斯。

==========

cHao

如果编译器内联print1main,功能永远不会真正被称为; 相反,mainprint1粘贴自己的私有代码版本。由于实际上print1不再需要引用共享了,因此换入print2可能不会影响main的行为。

如果要验证这是问题所在(和/或避免它发生,请尝试告诉编译器不要内联)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Spring编译期间用另一个注释替换一个注释?

Android通知-用另一个通知替换一个通知

用另一个功能替换一个功能进行测试

用另一个 -Javascript 替换一个对象

用另一个向量的条件替换一个向量的多个值

jQuery用另一个替换一个类

用另一个Spark Java替换一个列值

在git仓库上用另一个项目替换一个项目

PHP - 用另一个替换一个数组的 li

用另一个数据框的值替换一个值

用R中的另一个矩阵替换一个矩阵

用另一个矩阵替换一个矩阵

用BeautifulSoup中的另一个标签替换一个标签

用另一个变量的值替换一个变量中的NA

用文件中的另一个单词替换一个特定的单词

Python 用另一个列表替换一个列表

如何切换一个调用另一个函数的类

是否存在R函数,以便仅当来自另一个公共变量的值相等时,才用另一个数据框中的值替换一个数据框中的值?

用Perl替换一个文本的句子,并用另一个文本的相应句子替换

使用JQ用同一词典中的另一个值替换一个值

用另一个数据框的值替换一个数据框的列值

当我用另一个列表替换一个列表时,出现问题

用另一个默认主题的元素替换一个ggplot默认主题元素

Gradle依赖性-用另一个模块替换一个模块

用另一个数组中的代码替换一个数组中的国家名称

用PHP中的另一个数组键替换一个数组键

在Android中动态地用另一个视图替换一个视图?

perl:用另一个列表替换一个子字符串列表

使用 dplyr 用另一个查找替换一个 tibble 的多列