diff --git a/internal/build/build.go b/internal/build/build.go index 0678268d..75b38232 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -812,7 +812,7 @@ func buildPkg(ctx *context, aPkg *aPackage, verbose bool) error { } check(err) - ctx.cTransformer.TransformModule(ret) + ctx.cTransformer.TransformModule(ret.Path(), ret.Module()) aPkg.LPkg = ret cgoLLFiles, cgoLdflags, err := buildCgo(ctx, aPkg, aPkg.Package.Syntax, externs, verbose) diff --git a/internal/cabi/cabi.go b/internal/cabi/cabi.go index de44c10e..e741012f 100644 --- a/internal/cabi/cabi.go +++ b/internal/cabi/cabi.go @@ -52,8 +52,7 @@ func (p *Transformer) isCFunc(name string) bool { return !strings.Contains(name, ".") } -func (p *Transformer) TransformModule(pkg ssa.Package) { - m := pkg.Module() +func (p *Transformer) TransformModule(path string, m llvm.Module) { ctx := m.Context() var fns []llvm.Value var callInstrs []llvm.Value @@ -67,6 +66,13 @@ func (p *Transformer) TransformModule(pkg ssa.Package) { p.transformFuncCall(m, fn) if p.isWrapFunctionType(m.Context(), fn.GlobalValueType()) { fns = append(fns, fn) + use := fn.FirstUse() + for !use.IsNil() { + if call := use.User().IsACallInst(); !call.IsNil() && call.CalledValue() == fn { + callInstrs = append(callInstrs, call) + } + use = use.NextUse() + } } } fn = llvm.NextFunction(fn)