compiler: improve debug info to cover initialization

Этот коммит содержится в:
Ayke van Laethem 2018-10-03 19:24:29 +02:00
родитель f2768bee17
коммит 5d2ffa79e5
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

Просмотреть файл

@ -362,9 +362,15 @@ func (c *Compiler) Compile(mainPath string) error {
// After all packages are imported, add a synthetic initializer function
// that calls the initializer of each package.
initFn := c.mod.NamedFunction("runtime.initAll")
initFn.SetLinkage(llvm.InternalLinkage)
block := c.ctx.AddBasicBlock(initFn, "entry")
initFn := c.ir.GetFunction(c.ir.Program.ImportedPackage("runtime").Members["initAll"].(*ssa.Function))
initFn.LLVMFn.SetLinkage(llvm.InternalLinkage)
difunc, err := c.attachDebugInfo(initFn)
if err != nil {
return err
}
pos := c.ir.Program.Fset.Position(initFn.Pos())
c.builder.SetCurrentDebugLocation(uint(pos.Line), uint(pos.Column), difunc, llvm.Metadata{})
block := c.ctx.AddBasicBlock(initFn.LLVMFn, "entry")
c.builder.SetInsertPointAtEnd(block)
for _, fn := range c.initFuncs {
c.builder.CreateCall(fn, nil, "")
@ -811,6 +817,17 @@ func (c *Compiler) parseFuncDecl(f *ir.Function) (*Frame, error) {
if c.Debug && f.Syntax() != nil && len(f.Blocks) != 0 {
// Create debug info file if needed.
difunc, err := c.attachDebugInfo(f)
if err != nil {
return nil, err
}
frame.difunc = difunc
}
return frame, nil
}
func (c *Compiler) attachDebugInfo(f *ir.Function) (llvm.Metadata, error) {
pos := c.ir.Program.Fset.Position(f.Syntax().Pos())
if _, ok := c.difiles[pos.Filename]; !ok {
dir, file := filepath.Split(pos.Filename)
@ -822,7 +839,7 @@ func (c *Compiler) parseFuncDecl(f *ir.Function) (*Frame, error) {
for _, param := range f.Params {
ditype, err := c.getDIType(param.Type())
if err != nil {
return nil, err
return llvm.Metadata{}, err
}
diparams = append(diparams, ditype)
}
@ -831,7 +848,7 @@ func (c *Compiler) parseFuncDecl(f *ir.Function) (*Frame, error) {
Parameters: diparams,
Flags: 0, // ?
})
frame.difunc = c.dibuilder.CreateFunction(c.difiles[pos.Filename], llvm.DIFunction{
difunc := c.dibuilder.CreateFunction(c.difiles[pos.Filename], llvm.DIFunction{
Name: f.RelString(nil),
LinkageName: f.LinkName(),
File: c.difiles[pos.Filename],
@ -843,10 +860,8 @@ func (c *Compiler) parseFuncDecl(f *ir.Function) (*Frame, error) {
Flags: llvm.FlagPrototyped,
Optimized: true,
})
frame.fn.LLVMFn.SetSubprogram(frame.difunc)
}
return frame, nil
f.LLVMFn.SetSubprogram(difunc)
return difunc, nil
}
// Create a new global hashmap bucket, for map initialization.