[LLVMdev] X86_thiscall

Taco H. in den Bosch taco at heddesit.nl
Tue Sep 3 13:33:35 PDT 2013


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_bac
k(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.

 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130903/215ffaf3/attachment.html>


More information about the llvm-dev mailing list