}
if *gccgo {
+ fmt.Fprint(fgo2, gccgoGoProlog)
fmt.Fprint(fc, p.cPrologGccgo())
} else {
fmt.Fprint(fgo2, goProlog)
func _cgoCheckResult(interface{})
`
+const gccgoGoProlog = `
+func _cgoCheckPointer(interface{}, ...interface{}) interface{}
+
+func _cgoCheckResult(interface{})
+`
+
const goStringDef = `
//go:linkname _cgo_runtime_gostring runtime.gostring
func _cgo_runtime_gostring(*_Ctype_char) string
}
func (p *Package) cPrologGccgo() string {
- return strings.Replace(cPrologGccgo, "PREFIX", cPrefix, -1)
+ return strings.Replace(strings.Replace(cPrologGccgo, "PREFIX", cPrefix, -1),
+ "GCCGOSYMBOLPREF", p.gccgoSymbolPrefix(), -1)
}
const cPrologGccgo = `
runtime_throw("runtime: C malloc failed");
return p;
}
+
+struct __go_type_descriptor;
+typedef struct __go_empty_interface {
+ const struct __go_type_descriptor *__type_descriptor;
+ void *__object;
+} Eface;
+
+extern Eface runtimeCgoCheckPointer(Eface, Slice)
+ __asm__("runtime.cgoCheckPointer")
+ __attribute__((weak));
+
+extern Eface localCgoCheckPointer(Eface, Slice)
+ __asm__("GCCGOSYMBOLPREF._cgoCheckPointer");
+
+Eface localCgoCheckPointer(Eface ptr, Slice args) {
+ if(runtimeCgoCheckPointer) {
+ return runtimeCgoCheckPointer(ptr, args);
+ }
+ return ptr;
+}
+
+extern void runtimeCgoCheckResult(Eface)
+ __asm__("runtime.cgoCheckResult")
+ __attribute__((weak));
+
+extern void localCgoCheckResult(Eface)
+ __asm__("GCCGOSYMBOLPREF._cgoCheckResult");
+
+void localCgoCheckResult(Eface val) {
+ if(runtimeCgoCheckResult) {
+ runtimeCgoCheckResult(val);
+ }
+}
`
func (p *Package) gccExportHeaderProlog() string {