modernc.org/99c@v1.0.1-0.20181109153923-a9e8197063d9/examples/plugin/main.go (about)

     1  //go:generate 99c -99lib lib42.c
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"os"
     8  
     9  	"modernc.org/ir"
    10  	"modernc.org/virtual"
    11  	"modernc.org/xc"
    12  )
    13  
    14  func main() {
    15  	f, err := os.Open("a.out")
    16  	if err != nil {
    17  		panic(err)
    18  	}
    19  
    20  	var bin virtual.Binary
    21  	if _, err := bin.ReadFrom(f); err != nil {
    22  		panic(err)
    23  	}
    24  
    25  	m, _, err := virtual.New(&bin, nil, nil, nil, nil, 0, 1<<10, "")
    26  	if err != nil {
    27  		panic(err)
    28  	}
    29  
    30  	defer m.Close()
    31  
    32  	pc, ok := bin.Sym[ir.NameID(xc.Dict.SID("f42"))]
    33  	if !ok {
    34  		panic("symbol not found")
    35  	}
    36  
    37  	t, err := m.NewThread(1 << 10)
    38  	if err != nil {
    39  		panic(err)
    40  	}
    41  
    42  	for _, v := range []int{1, 2, 3} {
    43  		var y int32
    44  		_, err := t.FFI1(pc, virtual.Int32Result{&y}, virtual.Int32(int32(v)))
    45  		if err != nil {
    46  			panic(err)
    47  		}
    48  
    49  		fmt.Println(y)
    50  	}
    51  }