comp.lang.ada
 help / color / mirror / Atom feed
From: Tero Koskinen <tero.koskinen@iki.fi>
Subject: Re: Importing C function with variable argument list
Date: Tue, 10 Apr 2012 23:02:15 +0300
Date: 2012-04-10T23:02:15+03:00	[thread overview]
Message-ID: <20120410230215.502473d3a9f0287850900775@iki.fi> (raw)
In-Reply-To: 610ee323-4c7f-413d-8568-aed4955f5152@z38g2000vbu.googlegroups.com

Hi,

On Tue, 10 Apr 2012 02:21:59 -0700 (PDT)
Maxim Reznik <reznikmm@gmail.com> wrote:

> Hi, All
> 
> It seems it's impossible to call C function variable argument lists
> from Ada.
> Even when one knows in advace all arguments at compile time.
> 
> Functions with Variable Argument Lists have their own ABI. For
> instance, in x86_64:
> 
> > When a function taking variable-arguments is called, %rax must be set to the
> > total number of floating point parameters passed to the function in vector registers.
...
> But it's impossible to specify this fact in pragma Import (C, ...
...
> What do you think?

To work-around this, I use a small wrapper for x86_64 (Linux)
environments in my curl bindings:
https://bitbucket.org/tkoskine/curl-ada/src/ebd5156f7334/Makefile#cl-6
https://bitbucket.org/tkoskine/curl-ada/src/ebd5156f7334/utils/easywrap.pl
https://bitbucket.org/tkoskine/curl-ada/src/ebd5156f7334/src/template/curl-easy.adb.tmpl#cl-144

Ada code is following:
         procedure curl_easy_setopt
           (C_Handle : CURL_Private_Access;
            C_Option : CURL.Options.CURL_Option_Type;
            C_Action : C_Action_Callback);
         pragma Import (C, curl_easy_setopt, "wrap_setopt");

         procedure curl_easy_setopt_data
           (C_Handle : CURL_Private_Access;
            C_Option : CURL.Options.CURL_Option_Type;
            Data     : Callback_Interface_Class_Access);
         pragma Import (C, curl_easy_setopt_data, "wrap_setopt");

And C wrapper:
CURLcode wrap_setopt(CURL* handle, CURLoption option, void* param)
{
        return curl_easy_setopt(handle, option, param);
}

For i386, I do s/wrap_setopt/curl_easy_setopt/ replacement before
compiling:

if ($Config{archname} =~ m/x86_86/) { $use_wrap = 1; }
while (<>) {
        if ($use_wrap == 0) {
                $_ =~ s/wrap_setopt/curl_easy_setopt/g;
        }
        print $_;
}

-- 
Tero Koskinen - http://iki.fi/tero.koskinen/



  parent reply	other threads:[~2012-04-10 20:03 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-10  9:21 Importing C function with variable argument list Maxim Reznik
2012-04-10 11:22 ` Patrick
2012-04-10 13:09   ` Maxim Reznik
2012-04-10 13:50     ` Georg Bauhaus
2012-04-10 13:18 ` Markus Schöpflin
2012-04-10 16:47   ` Simon Wright
2012-04-12 10:08     ` Markus Schöpflin
2012-04-12 16:58       ` Adam Beneschan
2012-04-12 20:47         ` Randy Brukardt
2012-04-13  8:43           ` Markus Schöpflin
2012-04-13 23:01             ` Randy Brukardt
2012-04-27  8:24           ` Natasha Kerensikova
2012-04-27  9:18             ` Jacob Sparre Andersen
2012-04-27 16:48               ` Natasha Kerensikova
2012-05-03 20:15             ` sbelmont700
2012-05-13  4:18               ` David Thompson
2012-05-13  9:03                 ` Simon Wright
2012-05-13 17:01                   ` Jeffrey Carter
2012-05-13 18:20                     ` Simon Wright
2012-05-13 19:11                       ` Jeffrey Carter
2012-05-13 19:55                         ` Ludovic Brenta
2012-05-14  0:52                           ` Jeffrey Carter
2012-05-13 21:12                         ` Simon Wright
2012-05-13 23:57                           ` Georg Bauhaus
2012-05-14  0:54                           ` Jeffrey Carter
2012-05-14  8:10                             ` Nomen Nescio
2012-05-14 15:21               ` Natasha Kerensikova
2012-05-14 20:53                 ` sbelmont700
2012-04-13  4:08         ` Tero Koskinen
2012-04-13  8:04           ` Markus Schöpflin
2012-04-10 20:02 ` Tero Koskinen [this message]
2012-04-13  3:28   ` Tero Koskinen
2012-04-10 20:25 ` sbelmont700
2012-04-11 23:24 ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox