Simplify function names by removing $async suffix
Этот коммит содержится в:
родитель
58e31fd470
коммит
309de00fd6
3 изменённых файлов: 15 добавлений и 31 удалений
34
compiler.go
34
compiler.go
|
@ -350,15 +350,11 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
|
||||||
c.builder.CreateRetVoid()
|
c.builder.CreateRetVoid()
|
||||||
|
|
||||||
// Adjust main function.
|
// Adjust main function.
|
||||||
main := c.mod.NamedFunction("main.main")
|
|
||||||
realMain := c.mod.NamedFunction(c.ir.mainPkg.Pkg.Path() + ".main")
|
realMain := c.mod.NamedFunction(c.ir.mainPkg.Pkg.Path() + ".main")
|
||||||
if !realMain.IsNil() {
|
if c.ir.NeedsScheduler() {
|
||||||
main.ReplaceAllUsesWith(realMain)
|
c.mod.NamedFunction("main.main$async").ReplaceAllUsesWith(realMain)
|
||||||
}
|
} else {
|
||||||
mainAsync := c.mod.NamedFunction("main.main$async")
|
c.mod.NamedFunction("main.main").ReplaceAllUsesWith(realMain)
|
||||||
realMainAsync := c.mod.NamedFunction(c.ir.mainPkg.Pkg.Path() + ".main$async")
|
|
||||||
if !realMainAsync.IsNil() {
|
|
||||||
mainAsync.ReplaceAllUsesWith(realMainAsync)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set functions referenced in runtime.ll to internal linkage, to improve
|
// Set functions referenced in runtime.ll to internal linkage, to improve
|
||||||
|
@ -392,7 +388,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
|
||||||
for _, method := range meta.Methods {
|
for _, method := range meta.Methods {
|
||||||
f := c.ir.GetFunction(program.MethodValue(method))
|
f := c.ir.GetFunction(program.MethodValue(method))
|
||||||
if f.llvmFn.IsNil() {
|
if f.llvmFn.IsNil() {
|
||||||
return errors.New("cannot find function: " + f.LinkName(false))
|
return errors.New("cannot find function: " + f.LinkName())
|
||||||
}
|
}
|
||||||
fn := llvm.ConstBitCast(f.llvmFn, c.i8ptrType)
|
fn := llvm.ConstBitCast(f.llvmFn, c.i8ptrType)
|
||||||
funcPointers = append(funcPointers, fn)
|
funcPointers = append(funcPointers, fn)
|
||||||
|
@ -670,7 +666,7 @@ func (c *Compiler) parseFuncDecl(f *Function) (*Frame, error) {
|
||||||
|
|
||||||
fnType := llvm.FunctionType(retType, paramTypes, false)
|
fnType := llvm.FunctionType(retType, paramTypes, false)
|
||||||
|
|
||||||
name := f.LinkName(frame.blocking)
|
name := f.LinkName()
|
||||||
frame.fn.llvmFn = c.mod.NamedFunction(name)
|
frame.fn.llvmFn = c.mod.NamedFunction(name)
|
||||||
if frame.fn.llvmFn.IsNil() {
|
if frame.fn.llvmFn.IsNil() {
|
||||||
frame.fn.llvmFn = llvm.AddFunction(c.mod, name, fnType)
|
frame.fn.llvmFn = llvm.AddFunction(c.mod, name, fnType)
|
||||||
|
@ -1367,18 +1363,13 @@ func (c *Compiler) parseCall(frame *Frame, instr *ssa.CallCommon, parentHandle l
|
||||||
return c.builder.CreateCall(target, nil, ""), nil
|
return c.builder.CreateCall(target, nil, ""), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
targetBlocks := false
|
targetFunc := c.ir.GetFunction(call)
|
||||||
name := c.ir.GetFunction(call).LinkName(targetBlocks)
|
name := targetFunc.LinkName()
|
||||||
llvmFn := c.mod.NamedFunction(name)
|
llvmFn := c.mod.NamedFunction(name)
|
||||||
if llvmFn.IsNil() {
|
if llvmFn.IsNil() {
|
||||||
targetBlocks = true
|
return llvm.Value{}, errors.New("undefined function: " + name)
|
||||||
nameAsync := c.ir.GetFunction(call).LinkName(targetBlocks)
|
|
||||||
llvmFn = c.mod.NamedFunction(nameAsync)
|
|
||||||
if llvmFn.IsNil() {
|
|
||||||
return llvm.Value{}, errors.New("undefined function: " + name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return c.parseFunctionCall(frame, instr.Args, llvmFn, targetBlocks, parentHandle)
|
return c.parseFunctionCall(frame, instr.Args, llvmFn, targetFunc.blocking, parentHandle)
|
||||||
default: // function pointer
|
default: // function pointer
|
||||||
value, err := c.parseExpr(frame, instr.Value)
|
value, err := c.parseExpr(frame, instr.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1465,7 +1456,7 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) {
|
||||||
}
|
}
|
||||||
return c.builder.CreateGEP(val, indices, ""), nil
|
return c.builder.CreateGEP(val, indices, ""), nil
|
||||||
case *ssa.Function:
|
case *ssa.Function:
|
||||||
return c.mod.NamedFunction(c.ir.GetFunction(expr).LinkName(false)), nil
|
return c.mod.NamedFunction(c.ir.GetFunction(expr).LinkName()), nil
|
||||||
case *ssa.Global:
|
case *ssa.Global:
|
||||||
if strings.HasPrefix(expr.Name(), "__cgofn__cgo_") || strings.HasPrefix(expr.Name(), "_cgo_") {
|
if strings.HasPrefix(expr.Name(), "__cgofn__cgo_") || strings.HasPrefix(expr.Name(), "_cgo_") {
|
||||||
// Ignore CGo global variables which we don't use.
|
// Ignore CGo global variables which we don't use.
|
||||||
|
@ -2072,9 +2063,6 @@ func (c *Compiler) ApplyFunctionSections() {
|
||||||
for !llvmFn.IsNil() {
|
for !llvmFn.IsNil() {
|
||||||
if !llvmFn.IsDeclaration() {
|
if !llvmFn.IsDeclaration() {
|
||||||
name := llvmFn.Name()
|
name := llvmFn.Name()
|
||||||
if strings.HasSuffix(name, "$async") {
|
|
||||||
name = name[:len(name)-len("$async")]
|
|
||||||
}
|
|
||||||
llvmFn.SetSection(".text." + name)
|
llvmFn.SetSection(".text." + name)
|
||||||
}
|
}
|
||||||
llvmFn = llvm.NextFunction(llvmFn)
|
llvmFn = llvm.NextFunction(llvmFn)
|
||||||
|
|
10
ir.go
10
ir.go
|
@ -125,21 +125,17 @@ func (p *Program) GetGlobal(ssaGlobal *ssa.Global) *Global {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the link name for this function.
|
// Return the link name for this function.
|
||||||
func (f *Function) LinkName(blocking bool) string {
|
func (f *Function) LinkName() string {
|
||||||
suffix := ""
|
|
||||||
if blocking {
|
|
||||||
suffix = "$async"
|
|
||||||
}
|
|
||||||
if f.fn.Signature.Recv() != nil {
|
if f.fn.Signature.Recv() != nil {
|
||||||
// Method on a defined type (which may be a pointer).
|
// Method on a defined type (which may be a pointer).
|
||||||
return f.fn.RelString(nil) + suffix
|
return f.fn.RelString(nil)
|
||||||
} else {
|
} else {
|
||||||
// Bare function.
|
// Bare function.
|
||||||
if name := f.CName(); name != "" {
|
if name := f.CName(); name != "" {
|
||||||
// Name CGo functions directly.
|
// Name CGo functions directly.
|
||||||
return name
|
return name
|
||||||
} else {
|
} else {
|
||||||
name := f.fn.RelString(nil) + suffix
|
name := f.fn.RelString(nil)
|
||||||
if f.fn.Pkg.Pkg.Path() == "runtime" && strings.HasPrefix(f.fn.Name(), "_llvm_") {
|
if f.fn.Pkg.Pkg.Path() == "runtime" && strings.HasPrefix(f.fn.Name(), "_llvm_") {
|
||||||
// Special case for LLVM intrinsics in the runtime.
|
// Special case for LLVM intrinsics in the runtime.
|
||||||
name = "llvm." + strings.Replace(f.fn.Name()[len("_llvm_"):], "_", ".", -1)
|
name = "llvm." + strings.Replace(f.fn.Name()[len("_llvm_"):], "_", ".", -1)
|
||||||
|
|
|
@ -71,7 +71,7 @@ func (p *Program) AnalyseCallgraph() {
|
||||||
if child.CName() != "" {
|
if child.CName() != "" {
|
||||||
continue // assume non-blocking
|
continue // assume non-blocking
|
||||||
}
|
}
|
||||||
if child.LinkName(false) == "runtime.Sleep" {
|
if child.LinkName() == "runtime.Sleep" {
|
||||||
f.blocking = true
|
f.blocking = true
|
||||||
}
|
}
|
||||||
f.children = append(f.children, child)
|
f.children = append(f.children, child)
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче