koffie drinker via llvm-dev
2015-Dec-30 08:36 UTC
[llvm-dev] mapping a returned struct (from IR) to std::vector<GenericValue>
Hi all,
I'm working on a run time that allows you to run code on the fly. My
language allows users to define custom structs.
Once I have generated a func that returns a struct, I would like to map the
function result back to a std::vector<GenericValue> to be used in the c++
part. For normal return types (char, ints, double) its easy to cast to
their function pointer and execute and wrap the results.
// for double f();
auto func = (double (*f)()) engine->getFunctionAddress("f");
double result = func();
// how to do this for exampleStruct {double, double}, where example struct
is defined by the user
// exampleStruct f();
// we can't do auto func = (exampleStruct (*f)())
engine->getFunctionAddress("f");
// since example struct is defined by the user inside the
runtime/interpreter
??
How can I cast a function that returns a user defined struct ? I know the
layout of the struct, but the struct layout might be different in the IR vs
C++? I know I could alloc memory in the func and return a ptr to a struct
(returned as void* ), and use that as an offset to read the struct values,
but I would like to avoid using a ptr in this case. What would be the right
approach in ths case?
I tried to look into t he executionengine::runFunction but, they are
incomplete.
I'm using llvm 3.7 btw.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20151230/0a23109e/attachment.html>
Lang Hames via llvm-dev
2016-Jan-21 16:26 UTC
[llvm-dev] mapping a returned struct (from IR) to std::vector<GenericValue>
Hi Koffie, Casting is out, as you noted, since the struct is user defined. I think using a pointer to the struct is your only option. - Lang. On Wed, Dec 30, 2015 at 12:36 AM, koffie drinker via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi all, > > I'm working on a run time that allows you to run code on the fly. My > language allows users to define custom structs. > > Once I have generated a func that returns a struct, I would like to map > the function result back to a std::vector<GenericValue> to be used in the > c++ part. For normal return types (char, ints, double) its easy to cast to > their function pointer and execute and wrap the results. > > // for double f(); > auto func = (double (*f)()) engine->getFunctionAddress("f"); > double result = func(); > > // how to do this for exampleStruct {double, double}, where example struct > is defined by the user > // exampleStruct f(); > // we can't do auto func = (exampleStruct (*f)()) > engine->getFunctionAddress("f"); > // since example struct is defined by the user inside the > runtime/interpreter > ?? > > How can I cast a function that returns a user defined struct ? I know the > layout of the struct, but the struct layout might be different in the IR vs > C++? I know I could alloc memory in the func and return a ptr to a struct > (returned as void* ), and use that as an offset to read the struct values, > but I would like to avoid using a ptr in this case. What would be the right > approach in ths case? > > I tried to look into t he executionengine::runFunction but, they are > incomplete. > I'm using llvm 3.7 btw. > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160121/50666158/attachment.html>