<div><div><div>Hi,</div><div><br></div><div>I'm testing how to free memory of a JIT'd function.</div><div>I thought ExecutionEngine::freeMachineCodeForFunction() and Function::eraseFromParent()</div><div>would work and did a test with the following sample code.</div>
<div>But I found that the memory usage of the process is constantly growing as the while loop goes.</div><div>Could someone shed light on this please?</div><div><br></div><div>Here is the code.</div><div><br></div><div>int main(int argc, char **argv) {</div>
<div>  InitializeNativeTarget();</div><div> </div><div>  LLVMContext Context;</div><div> </div><div>  Module *M = new Module("test", Context);</div><div>  ExecutionEngine* EE = llvm::EngineBuilder(M).setEngineKind(EngineKind::JIT).create();</div>
<div> </div><div>  while (true) {</div><div>    SMDiagnostic error;</div><div>    ParseAssemblyString("define i32 @factorial(i32 %X) nounwind uwtable {\n"</div><div>                        "  %1 = alloca i32, align 4\n"</div>
<div>                        "  %2 = alloca i32, align 4\n"</div><div>                        "  store i32 %X, i32* %2, align 4\n"</div><div>                        "  %3 = load i32* %2, align 4\n"</div>
<div>                        "  %4 = icmp eq i32 %3, 0\n"</div><div>                        "  br i1 %4, label %5, label %6\n"</div><div>                        "\n"</div><div>                        "; <label>:5                                       ; preds = %0\n"</div>
<div>                        "  store i32 1, i32* %1\n"</div><div>                        "  br label %12\n"</div><div>                        "\n"</div><div>                        "; <label>:6                                       ; preds = %0\n"</div>
<div>                        "  %7 = load i32* %2, align 4\n"</div><div>                        "  %8 = load i32* %2, align 4\n"</div><div>                        "  %9 = sub nsw i32 %8, 1\n"</div>
<div>                        "  %10 = call i32 @factorial(i32 %9)\n"</div><div>                        "  %11 = mul nsw i32 %7, %10\n"</div><div>                        "  store i32 %11, i32* %1\n"</div>
<div>                        "  br label %12\n"</div><div>                        "\n"</div><div>                        "; <label>:12                                      ; preds = %6, %5\n"</div>
<div>                        "  %13 = load i32* %1\n"</div><div>                        "  ret i32 %13\n"</div><div>                        "}\n",</div><div>                        M,</div><div>
                        error,</div><div>                        Context);</div><div> </div><div>    Function *func = M->getFunction("factorial");</div><div>    uintptr_t tmp = (uintptr_t)(EE->getPointerToFunction(func));</div>
<div> </div><div>    EE->freeMachineCodeForFunction(func);</div><div>    func->eraseFromParent();</div><div>  }</div><div> </div><div>  delete EE;</div><div> </div><div>  llvm_shutdown();</div><div>}</div><div><br></div>
<div><br></div><div>Thank you for any help.</div><div><br></div><div>Naosuke</div></div></div><div><br></div>