Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] [Extern]Re: Interfacing C with code synthesised by CertiCoq

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] [Extern]Re: Interfacing C with code synthesised by CertiCoq


Chronological Thread 
  • From: Andrew Appel <appel AT cs.princeton.edu>
  • To: coq-club <coq-club AT inria.fr>
  • Cc: Mario Frank <mafrank AT uni-potsdam.de>, Joomy Korkut <joomy AT princeton.edu>
  • Subject: Re: [Coq-Club] [Extern]Re: Interfacing C with code synthesised by CertiCoq
  • Date: Sat, 7 Oct 2023 10:34:20 -0400 (EDT)
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=appel AT cs.princeton.edu; spf=Pass smtp.mailfrom=appel AT cs.princeton.edu; spf=Pass smtp.helo=postmaster AT violeteyes.cs.princeton.edu
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:Qg4UqqrYzlyVUd0BEjbWF5MaV5ooeYIsimQD101hICG9vPb3qy nOpoV46faaslwssR0b9OxoW5PwIk80l6QV3WB5B97LNzUO3lHFEGgI1+vfKkjbakrDH5lmpM FdmsZFZ+EYdWIK6foStzPIduod/A==
  • Ironport-phdr: A9a23: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
  • Ironport-sdr: 65216c76_ggelAYQAlh9DT4oBl2duxy/0BItK5yVBAgcT1r2Hc3SSKkM lWg7P2i+Vc/pt4B+jc6u2nRJll7a8gMbMUilVfA==

Joomy Korkut writes,

For some reason I did not receive Mario Frank's email about CertiCoq even though I'm subscribed to coq-club. Here's my response:

Suppose your Coq code looks like this:

```
Definition coq_fun (val1 : nat) (val2 : nat) (val3 : Z) (val4 : nat) : Z := ...
```

On the Coq side, you can compile your function and generate glue code with these two commands:
```
CertiCoq Compile coq_fun.
CertiCoq Generate Glue -file "glue" [ Z, nat ].
```

This generates a C and a header file for your program (named based on the module path) and the glue code (here it's named glue.{c,h}).

Now, keep in mind that the compiled Coq code produces a closure when `body` is called on the C side. In your case, it's a closure for a curried function that takes 4 arguments. You can use the `call` function in the glue code to call it. I see that you're trying to inspect the result, but `Int_val` doesn't achieve that. You have to use the glue functions for that as well.
If you're trying to check whether the result of coq_fun is -1 (that is `Zneg xH` in Coq), you would have to write the code below for that:

```
#include "gc.h"

typedef enum { Z0, ZPOS, ZNEG } tag_Z;
typedef enum { XI, XO, XH } tag_positive;

int my_fun(value val1, value val2, value val3, value val4)
{
  struct thread_info *ti = make_tinfo();
  value tmp = body(ti);
  tmp = call(ti, tmp, val1);
  tmp = call(ti, tmp, val2);
  tmp = call(ti, tmp, val3);
  tmp = call(ti, tmp, val4);
  switch (get_Coq_Numbers_BinNums_Z_tag(tmp)) {
    case ZNEG:
      return (get_Coq_Numbers_BinNums_positive_tag(get_args(tmp)[0]) == XH ? -1 : 0);
    default:
      return 0;
  }
}
```

(though keep in mind that make_tinfo can fail, it currently doesn't return a null pointer when it fails to malloc. But maybe it should do that.)
(You should link gc_stack.c when you're compiling, such as `gcc -g -o prog main.c gc_stack.c prog.prog.c glue.c`)

For more examples (with actual primitives), you can look at our repo's (github.com/CertiCoq/VeriFFI) examples folder. We're currently writing a paper on this, so there should be better documentation soon.




Archive powered by MHonArc 2.6.19+.

Top of Page