process //export with initLink
This commit is contained in:
@@ -126,7 +126,6 @@ type context struct {
|
|||||||
cgoArgs []llssa.Expr
|
cgoArgs []llssa.Expr
|
||||||
cgoRet llssa.Expr
|
cgoRet llssa.Expr
|
||||||
cgoSymbols []string
|
cgoSymbols []string
|
||||||
cgoExports map[string]string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type pkgState byte
|
type pkgState byte
|
||||||
@@ -1008,7 +1007,6 @@ func NewPackageEx(prog llssa.Program, patches Patches, pkg *ssa.Package, files [
|
|||||||
loaded: map[*types.Package]*pkgInfo{
|
loaded: map[*types.Package]*pkgInfo{
|
||||||
types.Unsafe: {kind: PkgDeclOnly}, // TODO(xsw): PkgNoInit or PkgDeclOnly?
|
types.Unsafe: {kind: PkgDeclOnly}, // TODO(xsw): PkgNoInit or PkgDeclOnly?
|
||||||
},
|
},
|
||||||
cgoExports: make(map[string]string),
|
|
||||||
cgoSymbols: make([]string, 0, 128),
|
cgoSymbols: make([]string, 0, 128),
|
||||||
}
|
}
|
||||||
ctx.initPyModule()
|
ctx.initPyModule()
|
||||||
@@ -1044,12 +1042,6 @@ func NewPackageEx(prog llssa.Program, patches Patches, pkg *ssa.Package, files [
|
|||||||
fn()
|
fn()
|
||||||
}
|
}
|
||||||
externs = ctx.cgoSymbols
|
externs = ctx.cgoSymbols
|
||||||
for fnName, exportName := range ctx.cgoExports {
|
|
||||||
fn := ret.FuncOf(fnName)
|
|
||||||
if fn != nil {
|
|
||||||
fn.SetName(exportName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
21
cl/import.go
21
cl/import.go
@@ -310,7 +310,10 @@ func (p *context) initLinkname(line string, f func(inPkgName string) (fullName s
|
|||||||
p.initLink(line, len(llgolink), f)
|
p.initLink(line, len(llgolink), f)
|
||||||
return hasLinkname
|
return hasLinkname
|
||||||
} else if strings.HasPrefix(line, export) {
|
} else if strings.HasPrefix(line, export) {
|
||||||
p.initCgoExport(line, len(export), f)
|
// rewrite //export FuncName to //export FuncName FuncName
|
||||||
|
funcName := strings.TrimSpace(line[len(export):])
|
||||||
|
line = line + " " + funcName
|
||||||
|
p.initLink(line, len(export), f)
|
||||||
return hasLinkname
|
return hasLinkname
|
||||||
} else if strings.HasPrefix(line, directive) {
|
} else if strings.HasPrefix(line, directive) {
|
||||||
// skip unknown annotation but continue to parse the next annotation
|
// skip unknown annotation but continue to parse the next annotation
|
||||||
@@ -319,24 +322,13 @@ func (p *context) initLinkname(line string, f func(inPkgName string) (fullName s
|
|||||||
return noDirective
|
return noDirective
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) initCgoExport(line string, prefix int, f func(inPkgName string) (fullName string, isVar, ok bool)) {
|
|
||||||
name := strings.TrimSpace(line[prefix:])
|
|
||||||
if fullName, _, ok := f(name); ok {
|
|
||||||
p.cgoExports[fullName] = name // TODO(xsw): why not use prog.SetLinkname?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *context) initLink(line string, prefix int, f func(inPkgName string) (fullName string, isVar, ok bool)) {
|
func (p *context) initLink(line string, prefix int, f func(inPkgName string) (fullName string, isVar, ok bool)) {
|
||||||
text := strings.TrimSpace(line[prefix:])
|
text := strings.TrimSpace(line[prefix:])
|
||||||
if idx := strings.IndexByte(text, ' '); idx > 0 {
|
if idx := strings.IndexByte(text, ' '); idx > 0 {
|
||||||
inPkgName := text[:idx]
|
inPkgName := text[:idx]
|
||||||
if fullName, isVar, ok := f(inPkgName); ok {
|
if fullName, _, ok := f(inPkgName); ok {
|
||||||
link := strings.TrimLeft(text[idx+1:], " ")
|
link := strings.TrimLeft(text[idx+1:], " ")
|
||||||
if isVar || strings.Contains(link, ".") { // eg. C.printf, C.strlen, llgo.cstr
|
|
||||||
p.prog.SetLinkname(fullName, link)
|
p.prog.SetLinkname(fullName, link)
|
||||||
} else {
|
|
||||||
p.prog.SetLinkname(fullName, "C."+link)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintln(os.Stderr, "==>", line)
|
fmt.Fprintln(os.Stderr, "==>", line)
|
||||||
fmt.Fprintf(os.Stderr, "llgo: linkname %s not found and ignored\n", inPkgName)
|
fmt.Fprintf(os.Stderr, "llgo: linkname %s not found and ignored\n", inPkgName)
|
||||||
@@ -523,6 +515,9 @@ func (p *context) funcName(fn *ssa.Function) (*types.Package, string, int) {
|
|||||||
if checkCgo(fname) && !cgoIgnored(fname) {
|
if checkCgo(fname) && !cgoIgnored(fname) {
|
||||||
return nil, fname, llgoInstr
|
return nil, fname, llgoInstr
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(fname, "_cgoexp_") {
|
||||||
|
return nil, fname, ignoredFunc
|
||||||
|
}
|
||||||
if isCgoExternSymbol(fn) {
|
if isCgoExternSymbol(fn) {
|
||||||
if _, ok := llgoInstrs[fname]; ok {
|
if _, ok := llgoInstrs[fname]; ok {
|
||||||
return nil, fname, llgoInstr
|
return nil, fname, llgoInstr
|
||||||
|
|||||||
Reference in New Issue
Block a user