[LLVMdev] Replacing C-style function

Vikas Bhargava vikasbhargava at gmail.com
Thu Nov 21 14:30:42 PST 2013


Hi,
I am trying to replace a c-style function with another function with same
signature. Consider the following code:

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

I compile this into an llvm::Module (say main) correctly and then create
and execution engine out of it:

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

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:

   //check the print1f is behaving properly
   llvm::Function *print1f = main->getFunction( "print1" );
   ASSERT_NE( print1f, nullptr );
   void *print1fPtr = ee->getPointerToFunction( print1f );
   int ret = ((int(*)(void))(print1fPtr))();
   EXPECT_EQ(0xdeadbeef, ret);

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:

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

   llvm::Function *mainf = main->getFunction( "mainOfLibrary" );
   ee->freeMachineCodeForFunction( mainf );
   ee->freeMachineCodeForFunction( print1f );

   print1f->replaceAllUsesWith( print2f );
   print1f->deleteBody();
   print1f->dropAllReferences();
   print1f->eraseFromParent();

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


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

thx
Vikas.
=======
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131121/ebeb3f56/attachment.html>


More information about the llvm-dev mailing list