cgo: fix calling CGo callback inside generic function

The package of the generic function might not be set, so we have to call
Origin() for it.

Found while porting mcufont to TinyGo.
Этот коммит содержится в:
Ayke van Laethem 2024-01-10 18:24:56 +01:00 коммит произвёл Ron Evans
родитель a40b11f535
коммит d0445d6f83
3 изменённых файлов: 15 добавлений и 1 удалений

Просмотреть файл

@ -3261,7 +3261,11 @@ func (b *builder) createUnOp(unop *ssa.UnOp) (llvm.Value, error) {
// Instead of a load from the global, create a bitcast of the // Instead of a load from the global, create a bitcast of the
// function pointer itself. // function pointer itself.
name := strings.TrimSuffix(unop.X.(*ssa.Global).Name(), "$funcaddr") name := strings.TrimSuffix(unop.X.(*ssa.Global).Name(), "$funcaddr")
_, fn := b.getFunction(b.fn.Pkg.Members[name].(*ssa.Function)) pkg := b.fn.Pkg
if pkg == nil {
pkg = b.fn.Origin().Pkg
}
_, fn := b.getFunction(pkg.Members[name].(*ssa.Function))
if fn.IsNil() { if fn.IsNil() {
return llvm.Value{}, b.makeError(unop.Pos(), "cgo function not found: "+name) return llvm.Value{}, b.makeError(unop.Pos(), "cgo function not found: "+name)
} }

9
testdata/cgo/main.go предоставленный
Просмотреть файл

@ -43,6 +43,7 @@ func main() {
println("callback 1:", C.doCallback(20, 30, cb)) println("callback 1:", C.doCallback(20, 30, cb))
cb = C.binop_t(C.mul) cb = C.binop_t(C.mul)
println("callback 2:", C.doCallback(20, 30, cb)) println("callback 2:", C.doCallback(20, 30, cb))
genericCallbackCall[int]()
// variadic functions // variadic functions
println("variadic0:", C.variadic0()) println("variadic0:", C.variadic0())
@ -197,3 +198,11 @@ func printBitfield(bitfield *C.bitfield_t) {
println("bitfield d:", bitfield.d) println("bitfield d:", bitfield.d)
println("bitfield e:", bitfield.e) println("bitfield e:", bitfield.e)
} }
type Int interface {
int | uint
}
func genericCallbackCall[T Int]() {
println("callback inside generic function:", C.doCallback(20, 30, C.binop_t(C.add)))
}

1
testdata/cgo/out.txt предоставленный
Просмотреть файл

@ -13,6 +13,7 @@ defined expr: 9
25: 25 25: 25
callback 1: 50 callback 1: 50
callback 2: 600 callback 2: 600
callback inside generic function: 50
variadic0: 1 variadic0: 1
variadic2: 15 variadic2: 15
headerfunc: 6 headerfunc: 6