<div dir="ltr">Hi all,<div><br></div><div>This is Michael and very happy to share my question here! </div><div><br></div><div>My question is, is there a way to "extract" a function from Module A and write it into another Module B, and generate two new IR files? IRBuilder seems like a workable way but I have to create instructions one by one. I am new to LLVM so don't know whether it is doable, here is my experimental code:</div><div><br></div><div>runOnModule(Module &M){</div><div>  ...</div><div><br></div><div><div>  LLVMContext& context = getGlobalContext();</div><div><br></div><div>  llvm::raw_fd_ostream osA("A.bc", "", llvm::sys::fs::F_None);</div><div>  llvm::raw_fd_ostream osB("B.bc", "", llvm::sys::fs::F_None);</div><div><br></div><div>  llvm::Module *ModuleA = new llvm::Module("A", context);</div><div>  llvm::Module *ModuleB = new llvm::Module("B", context);</div><div><br></div><div>  ModuleA->setDataLayout(M.getDataLayout());</div><div>  <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ModuleA-</span>->setTargetTriple(M.getTargetTriple());</div><div>  <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ModuleA-</span>->setModuleInlineAsm(M.getModuleInlineAsm());</div><div>   </div><div>  <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ModuleB-</span>->setDataLayout(M.getDataLayout());</div><div>  <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ModuleB-</span>->setTargetTriple(M.getTargetTriple());</div><div>  <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ModuleB-</span>->setModuleInlineAsm(M.getModuleInlineAsm());</div><div><br></div><div>  for (Function &F : M) {</div><div>      if (F.getName() == "My Criterion")</div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">          ModuleA->getFunctionList().push_back(F);</span><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">      else</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">          ModuleB->getFunctionList().push_back(F);</span></div><div>  }</div><div><br></div><div><div>  WriteBitcodeToFile(ModuleA, osA);</div><div>  WriteBitcodeToFile(ModuleB, osB);</div></div><div><br>}</div></div><div><br></div><div><br></div><div>By doing this I can get two .bc files, but when I open it, for each function I can only get the declaration, but not the definition(function body). </div><div><br></div><div>Could you give me some comments on how to generate the function definitions? Or any other better ways for generating the IRs? Thanks very much!</div><div><br></div><div>Best regards,</div><div><br></div><div>Michael</div></div>