Toshiyasu Morita via llvm-dev
2017-Mar-09 01:25 UTC
[llvm-dev] LLVMGetBitcodeModuleInContext2 problem
Oops, missed initializing some stuff. Added:
LLVMLinkInMCJIT();
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
LLVMInitializeNativeAsmParser();
Now it crashes in LLVMGetFunctionAddress().
Hmm.
On Wed, Mar 8, 2017 at 5:14 PM, Toshiyasu Morita <toshi at tensyr.com>
wrote:
> Made it a bit further. Here's the current code:
>
> void llvm_load_IR_library(char *path)
> {
> char *error;
> LLVMExecutionEngineRef engine;
> object0_t* (*func)(void), *output;
> LLVMContextRef global_context;
> LLVMMemoryBufferRef module;
> LLVMModuleRef ir_lib_module;
> bool flag;
>
> printf("loading IR library from path: %s\n", path);
>
> LLVMCreateMemoryBufferWithContentsOfFile(path, &module,
&error);
>
> global_context = LLVMGetGlobalContext();
>
> flag = LLVMGetBitcodeModuleInContext2(global_context, module,
> &ir_lib_module);
>
> printf("LLVMGetBitcodeModuleInContext2() returned %d\n",
flag);
>
> LLVMVerifyModule(ir_lib_module, LLVMAbortProcessAction,
&error);
> LLVMDumpModule(ir_lib_module);
>
> if (LLVMCreateExecutionEngineForModule(&engine, ir_lib_module,
> &error) != 0) {
> fprintf(stderr, "failed to create execution
engine\n");
> abort();
> }
>
> // Call the function
> func = (object0_t * (*)(void))LLVMGetFunctionAddress(engine,
> "test");
> output = (*func)();
> }
>
> when this code is executed, i see:
>
> ...
> LLVMGetBitcodeModuleInContext2() returned 0
> ; ModuleID = '/home/toshi/tensyr/debug_build/test.bc'
> source_filename = "test.c"
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> @str = private unnamed_addr constant [16 x i8] c"test
successful\00"
>
> ; Materializable
> ; Function Attrs: nounwind uwtable
> define void @test() local_unnamed_addr #0 {}
>
> ; Function Attrs: nounwind
> declare i32 @puts(i8* nocapture readonly) #1
>
> attributes #0 = { nounwind uwtable
"disable-tail-calls"="false"
> "less-precise-fpmad"="false"
"no-frame-pointer-elim"="false"
> "no-infs-fp-math"="false"
"no-jump-tables"="false"
> "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false"
> "stack-protector-buffer-size"="8"
"target-cpu"="x86-64"
> "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
"unsafe-fp-math"="false"
> "use-soft-float"="false" }
> attributes #1 = { nounwind }
>
> !llvm.ident = !{!0}
>
> !0 = !{!"clang version 3.9.1 (tags/RELEASE_391/final)"}
> failed to create execution engine
> Aborted (core dumped)
>
> Not sure why LLVMCreateExecutionEngineForModule is failing.
> Any help appreciated.
>
> Toshi
>
>
> On Wed, Mar 8, 2017 at 3:56 PM, Toshiyasu Morita <toshi at
tensyr.com> wrote:
>
>> Or do you mean I need to load the module into memory before calling
>> LLVMGetBitcodeModuleInContext2?
>>
>>
>> > Yes, you need to load the module into memory first.
>> > LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>>
>> Thanks!
>>
>>
>> On Wed, Mar 8, 2017 at 3:48 PM, Friedman, Eli <efriedma at
codeaurora.org>
>> wrote:
>>
>>> On 3/8/2017 3:44 PM, Toshiyasu Morita wrote:
>>>
>>>
>>>> module_path =
LLVMCreateMemoryBufferWithMemoryRange(path,
>>>> strlen(path), "path", 1);
>>>>
>>>
>>> LLVMCreateMemoryBufferWithContentsOfFile takes a path.
>>>
>>> Erm...no...the code is calling
LLVMCreateMemoryBufferWithMemoryRange,
>>> not LLVMCreateMemoryBufferWithContentsOfFile...
>>>
>>> Or do you mean I need to load the module into memory before calling
>>> LLVMGetBitcodeModuleInContext2?
>>>
>>>
>>> Yes, you need to load the module into memory first.
>>> LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>>>
>>> -Eli
>>>
>>> --
>>> Employee of Qualcomm Innovation Center, Inc.
>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170308/8bc2afad/attachment.html>
Friedman, Eli via llvm-dev
2017-Mar-09 01:45 UTC
[llvm-dev] LLVMGetBitcodeModuleInContext2 problem
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.
In this case:
/// getFunctionAddress - Return the address of the specified function.
/// This may involve code generation.
virtual uint64_t getFunctionAddress(const std::string &Name) {
// Default implementation for the interpreter. MCJIT will override
this.
// Interpreter clients should use getPointerToFunction instead.
return 0;
}
I would suggest using MCJIT (LLVMCreateMCJITCompilerForModule).
-Eli
On 3/8/2017 5:25 PM, Toshiyasu Morita wrote:> Oops, missed initializing some stuff. Added:
>
> LLVMLinkInMCJIT();
> LLVMInitializeNativeTarget();
> LLVMInitializeNativeAsmPrinter();
> LLVMInitializeNativeAsmParser();
>
> Now it crashes in LLVMGetFunctionAddress().
>
> Hmm.
>
>
> On Wed, Mar 8, 2017 at 5:14 PM, Toshiyasu Morita <toshi at tensyr.com
> <mailto:toshi at tensyr.com>> wrote:
>
> Made it a bit further. Here's the current code:
>
> void llvm_load_IR_library(char *path)
> {
> char *error;
> LLVMExecutionEngineRef engine;
> object0_t* (*func)(void), *output;
> LLVMContextRef global_context;
> LLVMMemoryBufferRef module;
> LLVMModuleRef ir_lib_module;
> bool flag;
>
> printf("loading IR library from path: %s\n", path);
>
> LLVMCreateMemoryBufferWithContentsOfFile(path, &module,
> &error);
>
> global_context = LLVMGetGlobalContext();
>
> flag = LLVMGetBitcodeModuleInContext2(global_context,
> module, &ir_lib_module);
>
> printf("LLVMGetBitcodeModuleInContext2() returned
%d\n",
> flag);
>
> LLVMVerifyModule(ir_lib_module, LLVMAbortProcessAction,
> &error);
> LLVMDumpModule(ir_lib_module);
>
> if (LLVMCreateExecutionEngineForModule(&engine,
> ir_lib_module, &error) != 0) {
> fprintf(stderr, "failed to create execution
> engine\n");
> abort();
> }
>
> // Call the function
> func = (object0_t *
> (*)(void))LLVMGetFunctionAddress(engine, "test");
> output = (*func)();
> }
>
> when this code is executed, i see:
>
> ...
> LLVMGetBitcodeModuleInContext2() returned 0
> ; ModuleID = '/home/toshi/tensyr/debug_build/test.bc'
> source_filename = "test.c"
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> @str = private unnamed_addr constant [16 x i8] c"test
successful\00"
>
> ; Materializable
> ; Function Attrs: nounwind uwtable
> define void @test() local_unnamed_addr #0 {}
>
> ; Function Attrs: nounwind
> declare i32 @puts(i8* nocapture readonly) #1
>
> attributes #0 = { nounwind uwtable
"disable-tail-calls"="false"
> "less-precise-fpmad"="false"
"no-frame-pointer-elim"="false"
> "no-infs-fp-math"="false"
"no-jump-tables"="false"
> "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false"
> "stack-protector-buffer-size"="8"
"target-cpu"="x86-64"
> "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
> "unsafe-fp-math"="false"
"use-soft-float"="false" }
> attributes #1 = { nounwind }
>
> !llvm.ident = !{!0}
>
> !0 = !{!"clang version 3.9.1 (tags/RELEASE_391/final)"}
> failed to create execution engine
> Aborted (core dumped)
>
> Not sure why LLVMCreateExecutionEngineForModule is failing.
> Any help appreciated.
>
> Toshi
>
>
> On Wed, Mar 8, 2017 at 3:56 PM, Toshiyasu Morita <toshi at
tensyr.com
> <mailto:toshi at tensyr.com>> wrote:
>
>> Or do you mean I need to load the module into memory before
>> calling LLVMGetBitcodeModuleInContext2?
>
> > Yes, you need to load the module into memory first.
> > LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>
> Thanks!
>
>
> On Wed, Mar 8, 2017 at 3:48 PM, Friedman, Eli
> <efriedma at codeaurora.org <mailto:efriedma at
codeaurora.org>> wrote:
>
> On 3/8/2017 3:44 PM, Toshiyasu Morita wrote:
>>
>>
>> module_path >>
LLVMCreateMemoryBufferWithMemoryRange(path,
>> strlen(path), "path", 1);
>>
>>
>> LLVMCreateMemoryBufferWithContentsOfFile takes a path.
>>
>> Erm...no...the code is calling
>> LLVMCreateMemoryBufferWithMemoryRange, not
>> LLVMCreateMemoryBufferWithContentsOfFile...
>>
>> Or do you mean I need to load the module into memory
>> before calling LLVMGetBitcodeModuleInContext2?
>
> Yes, you need to load the module into memory first.
> LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>
> -Eli
>
> --
> Employee of Qualcomm Innovation Center, Inc.
> Qualcomm Innovation Center, Inc. is a member of Code Aurora
Forum, a Linux Foundation Collaborative Project
>
>
>
>
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux
Foundation Collaborative Project
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170308/67c64fcb/attachment.html>
Toshiyasu Morita via llvm-dev
2017-Mar-09 01:51 UTC
[llvm-dev] LLVMGetBitcodeModuleInContext2 problem
LLVMMCLinkInMCJIT() is not enough?
The current code is:
void llvm_load_IR_library(char *path)
{
char *error;
LLVMExecutionEngineRef engine;
object0_t* (*func)(void), *output;
LLVMContextRef global_context;
LLVMMemoryBufferRef module;
LLVMModuleRef ir_lib_module;
bool flag;
printf("loading IR library from path: %s\n", path);
LLVMCreateMemoryBufferWithContentsOfFile(path, &module, &error);
global_context = LLVMGetGlobalContext();
flag = LLVMGetBitcodeModuleInContext2(global_context, module,
&ir_lib_module);
printf("LLVMGetBitcodeModuleInContext2() returned %d\n",
flag);
LLVMVerifyModule(ir_lib_module, LLVMAbortProcessAction, &error);
LLVMDumpModule(ir_lib_module);
LLVMLinkInMCJIT();
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
LLVMInitializeNativeAsmParser();
if (LLVMCreateExecutionEngineForModule(&engine, ir_lib_module,
&error) != 0) {
fprintf(stderr, "failed to create execution
engine\n");
abort();
}
// Call the function
func = (object0_t * (*)(void))LLVMGetFunctionAddress(engine,
"test");
output = (*func)();
}
On Wed, Mar 8, 2017 at 5:45 PM, Friedman, Eli <efriedma at codeaurora.org>
wrote:
> 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.
>
> In this case:
>
> /// getFunctionAddress - Return the address of the specified function.
> /// This may involve code generation.
> virtual uint64_t getFunctionAddress(const std::string &Name) {
> // Default implementation for the interpreter. MCJIT will override
> this.
> // Interpreter clients should use getPointerToFunction instead.
> return 0;
> }
>
> I would suggest using MCJIT (LLVMCreateMCJITCompilerForModule).
>
> -Eli
>
>
> On 3/8/2017 5:25 PM, Toshiyasu Morita wrote:
>
> Oops, missed initializing some stuff. Added:
>
> LLVMLinkInMCJIT();
> LLVMInitializeNativeTarget();
> LLVMInitializeNativeAsmPrinter();
> LLVMInitializeNativeAsmParser();
>
> Now it crashes in LLVMGetFunctionAddress().
>
> Hmm.
>
>
> On Wed, Mar 8, 2017 at 5:14 PM, Toshiyasu Morita <toshi at
tensyr.com> wrote:
>
>> Made it a bit further. Here's the current code:
>>
>> void llvm_load_IR_library(char *path)
>> {
>> char *error;
>> LLVMExecutionEngineRef engine;
>> object0_t* (*func)(void), *output;
>> LLVMContextRef global_context;
>> LLVMMemoryBufferRef module;
>> LLVMModuleRef ir_lib_module;
>> bool flag;
>>
>> printf("loading IR library from path: %s\n", path);
>>
>> LLVMCreateMemoryBufferWithContentsOfFile(path, &module,
&error);
>>
>> global_context = LLVMGetGlobalContext();
>>
>> flag = LLVMGetBitcodeModuleInContext2(global_context, module,
>> &ir_lib_module);
>>
>> printf("LLVMGetBitcodeModuleInContext2() returned
%d\n", flag);
>>
>> LLVMVerifyModule(ir_lib_module, LLVMAbortProcessAction,
&error);
>> LLVMDumpModule(ir_lib_module);
>>
>> if (LLVMCreateExecutionEngineForModule(&engine,
ir_lib_module,
>> &error) != 0) {
>> fprintf(stderr, "failed to create execution
engine\n");
>> abort();
>> }
>>
>> // Call the function
>> func = (object0_t * (*)(void))LLVMGetFunctionAddress(engine,
>> "test");
>> output = (*func)();
>> }
>>
>> when this code is executed, i see:
>>
>> ...
>> LLVMGetBitcodeModuleInContext2() returned 0
>> ; ModuleID = '/home/toshi/tensyr/debug_build/test.bc'
>> source_filename = "test.c"
>> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>> target triple = "x86_64-unknown-linux-gnu"
>>
>> @str = private unnamed_addr constant [16 x i8] c"test
successful\00"
>>
>> ; Materializable
>> ; Function Attrs: nounwind uwtable
>> define void @test() local_unnamed_addr #0 {}
>>
>> ; Function Attrs: nounwind
>> declare i32 @puts(i8* nocapture readonly) #1
>>
>> attributes #0 = { nounwind uwtable
"disable-tail-calls"="false"
>> "less-precise-fpmad"="false"
"no-frame-pointer-elim"="false"
>> "no-infs-fp-math"="false"
"no-jump-tables"="false"
>> "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false"
>> "stack-protector-buffer-size"="8"
"target-cpu"="x86-64"
>> "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
"unsafe-fp-math"="false"
>> "use-soft-float"="false" }
>> attributes #1 = { nounwind }
>>
>> !llvm.ident = !{!0}
>>
>> !0 = !{!"clang version 3.9.1 (tags/RELEASE_391/final)"}
>> failed to create execution engine
>> Aborted (core dumped)
>>
>> Not sure why LLVMCreateExecutionEngineForModule is failing.
>> Any help appreciated.
>>
>> Toshi
>>
>>
>> On Wed, Mar 8, 2017 at 3:56 PM, Toshiyasu Morita <toshi at
tensyr.com>
>> wrote:
>>
>>> Or do you mean I need to load the module into memory before calling
>>> LLVMGetBitcodeModuleInContext2?
>>>
>>>
>>> > Yes, you need to load the module into memory first.
>>> > LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>>>
>>> Thanks!
>>>
>>>
>>> On Wed, Mar 8, 2017 at 3:48 PM, Friedman, Eli <efriedma at
codeaurora.org>
>>> wrote:
>>>
>>>> On 3/8/2017 3:44 PM, Toshiyasu Morita wrote:
>>>>
>>>>
>>>>> module_path =
LLVMCreateMemoryBufferWithMemoryRange(path,
>>>>> strlen(path), "path", 1);
>>>>>
>>>>
>>>> LLVMCreateMemoryBufferWithContentsOfFile takes a path.
>>>>
>>>> Erm...no...the code is calling
LLVMCreateMemoryBufferWithMemoryRange,
>>>> not LLVMCreateMemoryBufferWithContentsOfFile...
>>>>
>>>> Or do you mean I need to load the module into memory before
calling
>>>> LLVMGetBitcodeModuleInContext2?
>>>>
>>>>
>>>> Yes, you need to load the module into memory first.
>>>> LLVMCreateMemoryBufferWithContentsOfFile will do that for you.
>>>>
>>>> -Eli
>>>>
>>>> --
>>>> Employee of Qualcomm Innovation Center, Inc.
>>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora
Forum, a Linux Foundation Collaborative Project
>>>>
>>>>
>>>
>>
>
>
> --
> Employee of Qualcomm Innovation Center, Inc.
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux
Foundation Collaborative Project
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170308/683aa46c/attachment-0001.html>