[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