[LLVMdev] X86_thiscall

Anton Korobeynikov anton at korobeynikov.info
Tue Sep 3 14:42:19 PDT 2013


Hello

You have not specified the calling convention for the call.

Something like this:

auto result=llvm_builder.CreateCall(module->interface_group_get_interface,
get_interface_args);
result->setCallingConv(CallingConv::X86_ThisCall);

should do the trick

On Wed, Sep 4, 2013 at 12:33 AM, Taco H. in den Bosch <taco at heddesit.nl> wrote:
> Hi everyone,
>
> I have some problems with gettings the X86_thiscall calling convention to
> work. I am new to LLVM, so if this is the wrong place for this question then
> I appologise, please tell me where to go instead.
>
> I am generating code to call a member function of a class compiled with
> Microsoft Visual C++ using the JIT compiler.
>
> The following code is used to register the pointer to the function. as_ptr
> retrieves the address of a member function pointer. Yes, this is a bit of a
> hack, but it works (I have tested it in other situations).
>
> vector<llvm::Type *> arguments;
> arguments.push_back(interface_group_ptr);
> arguments.push_back(any);
> arguments.push_back(instance_ptr);
>
> auto get_interface_type=FunctionType::get(any, arguments, false);
> interface_group_get_interface=Function::Create(get_interface_type,
> Function::ExternalLinkage, "get_interface", llvm_module);
> interface_group_get_interface->setCallingConv(CallingConv::X86_ThisCall);
> execution_engine->addGlobalMapping(interface_group_get_interface, (void
> *)as_ptr(&InterfaceGroup::get_interface));
>
> The following call generates the code for the call:
>
> vector<Value *> get_interface_args;
> get_interface_args.push_back(interface_group_variable);
> get_interface_args.push_back(requested_type);
> get_interface_args.push_back(ptr_this);
> auto result=llvm_builder.CreateCall(module->interface_group_get_interface,
> get_interface_args);
>
> Now the problem is that the generated code does not actually seem to be
> using the thiscall calling convention specified for the called function:
>
> 0011001B  mov         dword ptr [esp+8],eax
> 0011001F  mov         eax,dword ptr [esp+14h]
> 00110023  mov         dword ptr [esp+4],eax
> 00110027  mov         dword ptr [esp],102594h
> 0011002E  call        Zeo::InterfaceGroup::get_interface (0151B133h)
> 00110033  add         esp,10h
>
> 0x102594 is the address of the object that I am trying to call a member
> function on, and should be loaded into ecx by the code, instead of stored on
> the stack. The result is that the right function is called, but 'this' and
> the other parameters are incorrect.
>
> From what I have been reading about it, this calling convention should be
> implemented, so either I am doing something wrong, or there is a bug in LLVM
> in general, or the JIT compiler specifically. The chance that I am doing
> something wrong is probably bigger, but I do not know what.
>
> Any tips would be greatly appreciated. By the way, I am using a 3.3 release
> built with Visual Studio.
>
> With kind regards,
> Taco.
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



-- 
With best regards, Anton Korobeynikov
Faculty of Mathematics and Mechanics, Saint Petersburg State University



More information about the llvm-dev mailing list