<div dir="ltr"><div>LLVMMCLinkInMCJIT() is not enough?<br></div>The current code is:<br><br>void llvm_load_IR_library(char *path)<br>{<br> char *error;<br> LLVMExecutionEngineRef engine;<br> object0_t* (*func)(void), *output;<br> LLVMContextRef global_context;<br> LLVMMemoryBufferRef module;<br> LLVMModuleRef ir_lib_module;<br> bool flag;<br><br> printf("loading IR library from path: %s\n", path);<br><br> LLVMCreateMemoryBufferWithContentsOfFile(path, &module, &error);<br><br> global_context = LLVMGetGlobalContext();<br><br> flag = LLVMGetBitcodeModuleInContext2(global_context, module, &ir_lib_module);<br><br> printf("LLVMGetBitcodeModuleInContext2() returned %d\n", flag);<br><br> LLVMVerifyModule(ir_lib_module, LLVMAbortProcessAction, &error);<br> LLVMDumpModule(ir_lib_module);<br><br> LLVMLinkInMCJIT();<br> LLVMInitializeNativeTarget();<br> LLVMInitializeNativeAsmPrinter();<br> LLVMInitializeNativeAsmParser();<br><br> if (LLVMCreateExecutionEngineForModule(&engine, ir_lib_module, &error) != 0) {<br> fprintf(stderr, "failed to create execution engine\n");<br> abort();<br> }<br><br> // Call the function<br> func = (object0_t * (*)(void))LLVMGetFunctionAddress(engine, "test");<br> output = (*func)();<br>}<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 8, 2017 at 5:45 PM, Friedman, Eli <span dir="ltr"><<a href="mailto:efriedma@codeaurora.org" target="_blank">efriedma@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div class="m_9094380844652857820moz-cite-prefix">You're going to have to read the C++
headers for a lot of things to make sense; the C headers don't
really have much documentation.<br>
<br>
In this case:<br>
<br>
/// getFunctionAddress - Return the address of the specified
function.<br>
/// This may involve code generation.<br>
virtual uint64_t getFunctionAddress(const std::string &Name)
{<br>
// Default implementation for the interpreter. MCJIT will
override this.<br>
// Interpreter clients should use getPointerToFunction
instead.<br>
return 0;<br>
}<br>
<br>
I would suggest using MCJIT (<wbr>LLVMCreateMCJITCompilerForModu<wbr>le).<span class="HOEnZb"><font color="#888888"><br>
<br>
-Eli</font></span><div><div class="h5"><br>
<br>
On 3/8/2017 5:25 PM, Toshiyasu Morita wrote:<br>
</div></div></div><div><div class="h5">
<blockquote type="cite">
<div dir="ltr">
<div>
<div>Oops, missed initializing some stuff. Added:<br>
<br>
LLVMLinkInMCJIT();<br>
LLVMInitializeNativeTarget();<br>
LLVMInitializeNativeAsmPrinter<wbr>();<br>
LLVMInitializeNativeAsmParser(<wbr>);<br>
<br>
</div>
Now it crashes in LLVMGetFunctionAddress().<br>
<br>
</div>
Hmm.<br>
<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Mar 8, 2017 at 5:14 PM,
Toshiyasu Morita <span dir="ltr"><<a href="mailto:toshi@tensyr.com" target="_blank">toshi@tensyr.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div>
<div>
<div>
<div>Made it a bit further. Here's the current code:<br>
<br>
void llvm_load_IR_library(char *path)<br>
{<br>
char *error;<br>
LLVMExecutionEngineRef engine;<br>
object0_t* (*func)(void), *output;<br>
LLVMContextRef global_context;<br>
LLVMMemoryBufferRef module;<br>
LLVMModuleRef ir_lib_module;<br>
bool flag;<br>
<br>
printf("loading IR library from path:
%s\n", path);<br>
<br>
LLVMCreateMemoryBufferWithCont<wbr>entsOfFile(path,
&module, &error);<br>
<br>
global_context = LLVMGetGlobalContext();<br>
<br>
flag = LLVMGetBitcodeModuleInContext2<wbr>(global_context,
module, &ir_lib_module);<br>
<br>
printf("LLVMGetBitcodeModuleIn<wbr>Context2()
returned %d\n", flag);<br>
<br>
LLVMVerifyModule(ir_lib_module<wbr>,
LLVMAbortProcessAction, &error);<br>
LLVMDumpModule(ir_lib_module);<br>
<br>
if (LLVMCreateExecutionEngineForM<wbr>odule(&engine,
ir_lib_module, &error) != 0) {<br>
fprintf(stderr, "failed to create
execution engine\n");<br>
abort();<br>
}<br>
<br>
// Call the function<br>
func = (object0_t * (*)(void))LLVMGetFunctionAddre<wbr>ss(engine,
"test");<br>
output = (*func)();<br>
}<br>
<br>
</div>
when this code is executed, i see:<br>
<br>
...<br>
LLVMGetBitcodeModuleInContext2<wbr>() returned 0<br>
; ModuleID = '/home/toshi/tensyr/debug_buil<wbr>d/test.bc'<br>
source_filename = "test.c"<br>
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32<wbr>:64-S128"<br>
target triple = "x86_64-unknown-linux-gnu"<br>
<br>
@str = private unnamed_addr constant [16 x i8]
c"test successful\00"<br>
<br>
; Materializable<br>
; Function Attrs: nounwind uwtable<br>
define void @test() local_unnamed_addr #0 {}<br>
<br>
; Function Attrs: nounwind<br>
declare i32 @puts(i8* nocapture readonly) #1<br>
<br>
attributes #0 = { nounwind uwtable
"disable-tail-calls"="false"
"less-precise-fpmad"="false"
"no-frame-pointer-elim"="false<wbr>"
"no-infs-fp-math"="false" "no-jump-tables"="false"
"no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="fal<wbr>se"
"stack-protector-buffer-size"=<wbr>"8"
"target-cpu"="x86-64" "target-features"="+fxsr,+mmx,<wbr>+sse,+sse2,+x87"
"unsafe-fp-math"="false" "use-soft-float"="false" }<br>
attributes #1 = { nounwind }<br>
<br>
!llvm.ident = !{!0}<br>
<br>
!0 = !{!"clang version 3.9.1
(tags/RELEASE_391/final)"}<br>
failed to create execution engine<br>
Aborted (core dumped)<br>
<br>
</div>
Not sure why LLVMCreateExecutionEngineForMo<wbr>dule
is failing.<br>
</div>
Any help appreciated.<br>
<br>
</div>
Toshi<br>
<br>
</div>
<div class="m_9094380844652857820HOEnZb">
<div class="m_9094380844652857820h5">
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Mar 8, 2017 at 3:56
PM, Toshiyasu Morita <span dir="ltr"><<a href="mailto:toshi@tensyr.com" target="_blank">toshi@tensyr.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><span><span class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-im">
<blockquote type="cite">
<div dir="ltr">
<div>Or do you mean I need to load the
module into memory before calling
LLVMGetBitcodeModuleInContext2<wbr>?<br>
</div>
</div>
</blockquote>
<br>
</span> > Yes, you need to load the module
into memory first.<br>
> LLVMCreateMemoryBufferWithCont<wbr>entsOfFile
will do that for you.</span>
<div class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-yj6qo
m_4582426381616258799m_-9171418793383708215gmail-ajU">
<div id="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-:z5" class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-ajR"><img class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-ajT" src="https://ssl.gstatic.com/ui/v1/icons/mail/images/cleardot.gif"><br>
</div>
<div id="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-:z5" class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215gmail-ajR">Thanks!<br>
<br>
</div>
</div>
</div>
<div class="m_9094380844652857820m_4582426381616258799HOEnZb">
<div class="m_9094380844652857820m_4582426381616258799h5">
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Mar 8, 2017
at 3:48 PM, Friedman, Eli <span dir="ltr"><<a href="mailto:efriedma@codeaurora.org" target="_blank">efriedma@codeaurora.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span>
<div class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215m_3832703634050351426moz-cite-prefix">On
3/8/2017 3:44 PM, Toshiyasu Morita
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>
<div>
<div>
<div><span class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215m_3832703634050351426gmail-im">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
module_path
=
LLVMCreateMemoryBufferWithMemo<wbr>ryRange(path,
strlen(path),
"path", 1);<br>
</blockquote>
<br>
</span>
LLVMCreateMemoryBufferWithCont<wbr>entsOfFile
takes a path.<br>
</div>
<br>
</div>
Erm...no...the code is
calling
LLVMCreateMemoryBufferWithMemo<wbr>ryRange,
not
LLVMCreateMemoryBufferWithCont<wbr>entsOfFile...<br>
<br>
</div>
Or do you mean I need to load
the module into memory before
calling
LLVMGetBitcodeModuleInContext2<wbr>?<br>
</div>
</div>
</blockquote>
<br>
</span> Yes, you need to load the
module into memory first.
LLVMCreateMemoryBufferWithCont<wbr>entsOfFile
will do that for you.<span><br>
<br>
-Eli<br>
<pre class="m_9094380844652857820m_4582426381616258799m_-9171418793383708215m_3832703634050351426moz-signature" cols="72">--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
</span></div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
<p><br>
</p>
<pre class="m_9094380844652857820moz-signature" cols="72">--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
</div></div></div>
</blockquote></div><br></div>