tgo: Implement special case for LLVM intrinsics

Этот коммит содержится в:
Ayke van Laethem 2018-06-03 17:13:00 +02:00
родитель 89f77fa861
коммит a9bbed2f6c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

13
tgo.go
Просмотреть файл

@ -320,7 +320,7 @@ func (c *Compiler) isPointer(typ types.Type) bool {
} }
} }
func (c *Compiler) getFunctionName(fn *ssa.Function) string { func getFunctionName(fn *ssa.Function) string {
if fn.Signature.Recv() != nil { if fn.Signature.Recv() != nil {
// Method on a defined type. // Method on a defined type.
typeName := fn.Params[0].Type().(*types.Named).Obj().Name() typeName := fn.Params[0].Type().(*types.Named).Obj().Name()
@ -331,7 +331,12 @@ func (c *Compiler) getFunctionName(fn *ssa.Function) string {
// Name CGo functions directly. // Name CGo functions directly.
return fn.Name()[len("_Cfunc_"):] return fn.Name()[len("_Cfunc_"):]
} else { } else {
return pkgPrefix(fn.Pkg) + "." + fn.Name() name := pkgPrefix(fn.Pkg) + "." + fn.Name()
if fn.Pkg.Pkg.Path() == "runtime" && strings.HasPrefix(fn.Name(), "_llvm_") {
// Special case for LLVM intrinsics in the runtime.
name = "llvm." + strings.Replace(fn.Name()[len("_llvm_"):], "_", ".", -1)
}
return name
} }
} }
} }
@ -470,7 +475,6 @@ func (c *Compiler) parsePackage(program *ssa.Program, pkg *ssa.Package) error {
func (c *Compiler) parseFuncDecl(f *ssa.Function) (*Frame, error) { func (c *Compiler) parseFuncDecl(f *ssa.Function) (*Frame, error) {
f.WriteTo(os.Stdout) f.WriteTo(os.Stdout)
name := c.getFunctionName(f)
frame := &Frame{ frame := &Frame{
params: make(map[*ssa.Parameter]int), params: make(map[*ssa.Parameter]int),
@ -503,6 +507,7 @@ func (c *Compiler) parseFuncDecl(f *ssa.Function) (*Frame, error) {
fnType := llvm.FunctionType(retType, paramTypes, false) fnType := llvm.FunctionType(retType, paramTypes, false)
name := getFunctionName(f)
frame.llvmFn = c.mod.NamedFunction(name) frame.llvmFn = c.mod.NamedFunction(name)
if frame.llvmFn.IsNil() { if frame.llvmFn.IsNil() {
frame.llvmFn = llvm.AddFunction(c.mod, name, fnType) frame.llvmFn = llvm.AddFunction(c.mod, name, fnType)
@ -790,7 +795,7 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string)
func (c *Compiler) parseFunctionCall(frame *Frame, call *ssa.CallCommon, fn *ssa.Function) (llvm.Value, error) { func (c *Compiler) parseFunctionCall(frame *Frame, call *ssa.CallCommon, fn *ssa.Function) (llvm.Value, error) {
fmt.Printf(" function: %s\n", fn) fmt.Printf(" function: %s\n", fn)
name := c.getFunctionName(fn) name := getFunctionName(fn)
target := c.mod.NamedFunction(name) target := c.mod.NamedFunction(name)
if target.IsNil() { if target.IsNil() {
return llvm.Value{}, errors.New("undefined function: " + name) return llvm.Value{}, errors.New("undefined function: " + name)