[llvm-dev] Correct way to pass int128 from LLVM to C++ function (MSVC)
Stefan de Bruijn via llvm-dev
llvm-dev at lists.llvm.org
Wed Dec 21 04:35:15 PST 2016
Hi,
I've been attempting to call a C++ function from LLVM code. The LLVM code is JIT'ted and executed from C++. Basically my idea was as follows:
-- LLVM IR code -
; ModuleID = 'native'
define i32 @main(i32, i8**) {
code:
call void @"Helper::Test"(i128 128932)
ret i32 0
-- C++ code -
struct int128
{
uint64_t v1;
uint64_t v2;
// ... code omitted... *1
};
struct Helper
{
static void Test(int128 value)
{
}
};
If I try to execute the code, I notice that MSVC++ seems to expect a pointer. Most notably, if you implement the copy constructor: int128(const int128& o) { ... } , the address of o will be 128932 . As for assembler output, I noticed that %ecx is set to the value, %edx is zero'd and then the method is called.
As evidenced by the resulting crash, this is apparently not the right way to do something like this... Obviously, I can also try to pass the value by pointer - but will then get issues with return values. Alternatively, I can introduce a 2x64-bit structure, fill that with the int128 and pass that.
My question is: what's the correct way to do something like this?
Kind regards,
Stefan.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161221/f364d2ad/attachment.html>
More information about the llvm-dev
mailing list