<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>