Sorry about the fwd in the description.

This is my implementation:

fnDeclType = build_function_type_array(integer_type_node,
argVect.NumOfItems, parmTypes);
tree fnDecl = build_fn_decl(identifier->Str, fnDeclType);
DECL_EXTERNAL(fnDecl) = 1;
fnAddr = build1(ADDR_EXPR, build_pointer_type(fnDeclType), fnDecl);
funcStmt = build_call_array_loc(identifier->Locus, integer_type_node,
fnAddr, argVect.NumOfItems, parms);

It works perfectly for calling functions. Not sure if it is the
preferred way to do it, but gets the job done.

> ...calling conventions (and anything defied in an Application Binary
> Interface) is of course dependant on the architecture and operating
> system you are compiling for, so you need to tell us that.

I am not really that interested in calling convention. It only gets me
to realise that methods (non static) and functions are not the same,
even on a binary level.
If I do it "correctly" on generic level GCC will be taking care of everything.
But for what it's worth here is my specs: Intel x86_64, Ubuntu 16.04
LTS 64bit, gcc 5.2, compiled with g++

> type of the function being called is METHOD_TYPE and not FUNCTION_TYPE
> (but that is actually good for consistency on any platform).  Except
> for static methods, those are functions in gcc internals.

My implementation generates a FUNCTION_TYPE, is there an easy way to
turn it into a METHOD_TYPE, like a single tree call.
That will take care of consistency.

Regards,
André


On Thu, Mar 30, 2017 at 4:03 PM, Martin Jambor <mjam...@suse.cz> wrote:
> Hello,
>
> I am not sure if I can help you but...
>
> On Thu, Mar 30, 2017 at 08:05:07AM +0200, Andre Groenewald wrote:
>> I am discovering the awesome world of GCC internals. I managed to
>> develop a basic front end. It can call internal and external functions
>> and link with standard libraries. All is good.
>>
>> The hunger for more does not end. I want to call c++ libraries and
>> interact with c++ objects.
>>
>> My starting point was to call a test c++ method. I created a test c++
>> class with a test method/function. It was compiled into a library. The
>> library was tested with c++ program and it worked. I manage to call it
>> from my front end, but the parameter I passed was messed up. It was
>> some random value every time I called the method.
>>
>> I disassembled my program and the test c++ program, then compared the
>> two. I found that it uses a different register as in the case when
>> calling a standard c style function.
>>
>> It seems that methods are different in the calling convention than
>> normal functions, which is fine. All that I need to do is set correct
>> tree property and every will work, right? The question is what tree
>> property should I set, which macro should I use to set that property?
>>
>
> ...calling conventions (and anything defied in an Application Binary
> Interface) is of course dependant on the architecture and operating
> system you are compiling for, so you need to tell us that.
>
> Having said that, the only target that I know about that uses
> different argument passing for methods and for functions is
> i686-mingw32 (MS Windows).  If that is your case, make sure that the
> type of the function being called is METHOD_TYPE and not FUNCTION_TYPE
> (but that is actually good for consistency on any platform).  Except
> for static methods, those are functions in gcc internals.
>
> If this does not help, you'll need to provide much more details about
> your whole setup.
>
> Martin
>

Reply via email to