<div dir="ltr">figured that print1 was inlined in main and therefore could not be "replaced" by print2. Added attributes to print1 to disable its inlining and now the code works.</div><div class="gmail_extra"><br>
<br><div class="gmail_quote">On Thu, Nov 21, 2013 at 2:30 PM, Vikas Bhargava <span dir="ltr"><<a href="mailto:vikasbhargava@gmail.com" target="_blank">vikasbhargava@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 am trying to replace a c-style function with another function with same signature. Consider the following code:</div><div><br></div><div><div> <font face="courier new, monospace"> std::stringstream main_c;</font></div>
<div><font face="courier new, monospace"> main_c</font></div><div><font face="courier new, monospace"> <<"#include <stdio.h>\n"</font></div><div><font face="courier new, monospace"> <<"extern \"C\" { \n"</font></div>
<div><font face="courier new, monospace"> <<"int print1()\n"</font></div><div><font face="courier new, monospace"> <<"{\n"</font></div><div><font face="courier new, monospace"> <<" printf(\"Inside print1\\n\");\n"</font></div>
<div><font face="courier new, monospace"> <<" return 0xdeadbeef;\n"</font></div><div><font face="courier new, monospace"> <<"}\n"</font></div><div><font face="courier new, monospace"> <<"int print2()\n"</font></div>
<div><font face="courier new, monospace"> <<"{\n"</font></div><div><font face="courier new, monospace"> <<" printf(\"Inside print2\\n\");\n"</font></div><div><font face="courier new, monospace"> <<" return 0xbeefdead;\n"</font></div>
<div><font face="courier new, monospace"> <<"}\n"</font></div><div><font face="courier new, monospace"> <<"int mainOfLibrary(void)\n"</font></div><div><font face="courier new, monospace"> <<"{\n"</font></div>
<div><font face="courier new, monospace"> <<" return print1();\n"</font></div><div><font face="courier new, monospace"> <<"}\n"</font></div><div><font face="courier new, monospace"> <<"}\n"</font></div>
<div><font face="courier new, monospace"> ;</font></div></div><div><br></div><div>I compile this into an llvm::Module (say main) correctly and then create and execution engine out of it:</div><div><br></div><div><div>
<font face="courier new, monospace">std::string errMsg;</font></div><div><font face="courier new, monospace"> llvm::ExecutionEngine *ee =</font></div><div><font face="courier new, monospace"> llvm::EngineBuilder( main.get() ).setErrorStr( &errMsg ).create();</font></div>
<div><font face="courier new, monospace"> ASSERT_NE( ee, nullptr )<<"Execution engine is nullptr:"<<errMsg;</font><br></div></div><div><br></div><div>At this point, I am able to retrieve pointers to all the 3 functions (print1, print2 and mainOfLibrary) correctly and execute them as well, e.g:</div>
<div><br></div><div><div><font face="courier new, monospace"> //check the print1f is behaving properly</font></div><div><font face="courier new, monospace"> llvm::Function *print1f = main->getFunction( "print1" );</font></div>
<div><font face="courier new, monospace"> ASSERT_NE( print1f, nullptr );</font></div><div><font face="courier new, monospace"> void *print1fPtr = ee->getPointerToFunction( print1f );</font></div><div><font face="courier new, monospace"> int ret = ((int(*)(void))(print1fPtr))();</font></div>
<div><font face="courier new, monospace"> EXPECT_EQ(0xdeadbeef, ret);</font></div></div><div><br></div><div>However, when i try to replace the use of print1 with print2, it doesn't seem to work correctly. This is the sequence of steps that I am following:<br>
</div><div><br></div><div> <font face="courier new, monospace">llvm::Function *print2f = main->getFunction( "print2" );<br></font></div><div><font face="courier new, monospace"> print2f->takeName( print1f );<br>
</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"> llvm::Function *mainf = main->getFunction( "mainOfLibrary" );<br></font></div><div><div><font face="courier new, monospace"> ee->freeMachineCodeForFunction( mainf );</font></div>
<div><font face="courier new, monospace"> ee->freeMachineCodeForFunction( print1f );</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"> print1f->replaceAllUsesWith( print2f );</font></div>
<div><font face="courier new, monospace"> print1f->deleteBody();</font></div><div><font face="courier new, monospace"> print1f->dropAllReferences();</font></div><div><font face="courier new, monospace"> print1f->eraseFromParent();</font></div>
</div><div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace"> mainfPtr = ee->recompileAndRelinkFunction( mainf );</font></div><div><font face="courier new, monospace"> ASSERT_NE( mainfPtr, nullptr );</font></div>
<div><font face="courier new, monospace"> ret = ((int(*)(void))(mainfPtr))();</font></div><div><font face="courier new, monospace"> <span style="background-color:rgb(255,0,0)">EXPECT_EQ(0xbeefdead, ret);</span></font></div>
</div><div><font face="courier new, monospace"><span style="background-color:rgb(255,0,0)"><br></span></font></div><div><br></div><div>Can you please let me know if I am missing something in the steps above. Does the "extern C" in the code snippet make any difference? I am doing that to avoid name mangling of the 3 functions..</div>
<div><br></div><div>thx</div><div>Vikas.</div><div>=======</div><div><br></div><div><br></div><div><br></div></div>
</blockquote></div><br></div>