Better error messages
Этот коммит содержится в:
родитель
bce33bbf41
коммит
fae4c7f555
1 изменённых файлов: 22 добавлений и 9 удалений
31
compiler.go
31
compiler.go
|
@ -426,7 +426,7 @@ func (c *Compiler) getLLVMType(goType types.Type) (llvm.Type, error) {
|
||||||
case types.UnsafePointer:
|
case types.UnsafePointer:
|
||||||
return c.i8ptrType, nil
|
return c.i8ptrType, nil
|
||||||
default:
|
default:
|
||||||
return llvm.Type{}, errors.New("todo: unknown basic type: " + fmt.Sprintf("%#v", typ))
|
return llvm.Type{}, errors.New("todo: unknown basic type: " + typ.String())
|
||||||
}
|
}
|
||||||
case *types.Interface:
|
case *types.Interface:
|
||||||
return c.mod.GetTypeByName("interface"), nil
|
return c.mod.GetTypeByName("interface"), nil
|
||||||
|
@ -643,12 +643,25 @@ func (c *Compiler) parseFuncDecl(f *Function) (*Frame, error) {
|
||||||
// Special function parser for generated package initializers (which also
|
// Special function parser for generated package initializers (which also
|
||||||
// initializes global variables).
|
// initializes global variables).
|
||||||
func (c *Compiler) parseInitFunc(frame *Frame) error {
|
func (c *Compiler) parseInitFunc(frame *Frame) error {
|
||||||
|
if c.dumpSSA {
|
||||||
|
fmt.Printf("\nfunc %s:\n", frame.fn.fn)
|
||||||
|
}
|
||||||
frame.fn.llvmFn.SetLinkage(llvm.PrivateLinkage)
|
frame.fn.llvmFn.SetLinkage(llvm.PrivateLinkage)
|
||||||
llvmBlock := c.ctx.AddBasicBlock(frame.fn.llvmFn, "entry")
|
llvmBlock := c.ctx.AddBasicBlock(frame.fn.llvmFn, "entry")
|
||||||
c.builder.SetInsertPointAtEnd(llvmBlock)
|
c.builder.SetInsertPointAtEnd(llvmBlock)
|
||||||
|
|
||||||
for _, block := range frame.fn.fn.DomPreorder() {
|
for _, block := range frame.fn.fn.DomPreorder() {
|
||||||
|
if c.dumpSSA {
|
||||||
|
fmt.Printf("%s:\n", block.Comment)
|
||||||
|
}
|
||||||
for _, instr := range block.Instrs {
|
for _, instr := range block.Instrs {
|
||||||
|
if c.dumpSSA {
|
||||||
|
if val, ok := instr.(ssa.Value); ok && val.Name() != "" {
|
||||||
|
fmt.Printf("\t%s = %s\n", val.Name(), val.String())
|
||||||
|
} else {
|
||||||
|
fmt.Printf("\t%s\n", instr.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
var err error
|
var err error
|
||||||
switch instr := instr.(type) {
|
switch instr := instr.(type) {
|
||||||
case *ssa.Call, *ssa.Return:
|
case *ssa.Call, *ssa.Return:
|
||||||
|
@ -717,10 +730,10 @@ func (c *Compiler) parseInitFunc(frame *Frame) error {
|
||||||
llvmValue = c.builder.CreateInsertValue(llvmValue, llvmFieldValue, fieldAddr.Field, "")
|
llvmValue = c.builder.CreateInsertValue(llvmValue, llvmFieldValue, fieldAddr.Field, "")
|
||||||
llvmAddr.SetInitializer(llvmValue)
|
llvmAddr.SetInitializer(llvmValue)
|
||||||
default:
|
default:
|
||||||
return errors.New("unknown init store: " + fmt.Sprintf("%#v", addr))
|
return errors.New("unknown init store: " + addr.String())
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return errors.New("unknown init instruction: " + fmt.Sprintf("%#v", instr))
|
return errors.New("unknown init instruction: " + instr.String())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -921,7 +934,7 @@ func (c *Compiler) parseInstr(frame *Frame, instr ssa.Instruction) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
return errors.New("unknown instruction: " + fmt.Sprintf("%#v", instr))
|
return errors.New("unknown instruction: " + instr.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -996,14 +1009,14 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string)
|
||||||
c.builder.CreateCall(fn, []llvm.Value{value}, "")
|
c.builder.CreateCall(fn, []llvm.Value{value}, "")
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
return llvm.Value{}, errors.New("unknown basic arg type: " + fmt.Sprintf("%#v", typ))
|
return llvm.Value{}, errors.New("unknown basic arg type: " + typ.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case *types.Pointer:
|
case *types.Pointer:
|
||||||
ptrValue := c.builder.CreatePtrToInt(value, c.uintptrType, "")
|
ptrValue := c.builder.CreatePtrToInt(value, c.uintptrType, "")
|
||||||
c.builder.CreateCall(c.mod.NamedFunction("runtime.printptr"), []llvm.Value{ptrValue}, "")
|
c.builder.CreateCall(c.mod.NamedFunction("runtime.printptr"), []llvm.Value{ptrValue}, "")
|
||||||
default:
|
default:
|
||||||
return llvm.Value{}, errors.New("unknown arg type: " + fmt.Sprintf("%#v", typ))
|
return llvm.Value{}, errors.New("unknown arg type: " + typ.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if callName == "println" {
|
if callName == "println" {
|
||||||
|
@ -1601,10 +1614,10 @@ func (c *Compiler) parseConst(expr *ssa.Const) (llvm.Value, error) {
|
||||||
n, _ := constant.Int64Val(expr.Value)
|
n, _ := constant.Int64Val(expr.Value)
|
||||||
return llvm.ConstInt(llvmType, uint64(n), true), nil
|
return llvm.ConstInt(llvmType, uint64(n), true), nil
|
||||||
} else {
|
} else {
|
||||||
return llvm.Value{}, errors.New("todo: unknown constant: " + fmt.Sprintf("%v", typ))
|
return llvm.Value{}, errors.New("todo: unknown constant: " + typ.String())
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return llvm.Value{}, errors.New("todo: unknown constant: " + fmt.Sprintf("%#v", typ))
|
return llvm.Value{}, errors.New("todo: unknown constant: " + typ.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1655,7 +1668,7 @@ func (c *Compiler) parseConvert(frame *Frame, typeTo types.Type, x ssa.Value) (l
|
||||||
case *types.Pointer:
|
case *types.Pointer:
|
||||||
return c.builder.CreateBitCast(value, llvmTypeTo, ""), nil
|
return c.builder.CreateBitCast(value, llvmTypeTo, ""), nil
|
||||||
default:
|
default:
|
||||||
return llvm.Value{}, errors.New("todo: convert: extend non-basic type: " + fmt.Sprintf("%#v", typeTo))
|
return llvm.Value{}, errors.New("todo: convert: extend non-basic type: " + typeTo.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче