[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