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