mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-03 10:37:46 +00:00
dd04f34059
The ir package has long lost its original purpose (which was doing some analysis and optimization on the Go SSA directly). There is very little of it left, which is best integrated directly in the compiler package to avoid unnecessary abstraction.
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package compiler
|
|
|
|
// This file contains some utility functions related to error handling.
|
|
|
|
import (
|
|
"go/scanner"
|
|
"go/token"
|
|
"go/types"
|
|
"path/filepath"
|
|
|
|
"tinygo.org/x/go-llvm"
|
|
)
|
|
|
|
// makeError makes it easy to create an error from a token.Pos with a message.
|
|
func (c *compilerContext) makeError(pos token.Pos, msg string) types.Error {
|
|
return types.Error{
|
|
Fset: c.program.Fset,
|
|
Pos: pos,
|
|
Msg: msg,
|
|
}
|
|
}
|
|
|
|
func (c *compilerContext) addError(pos token.Pos, msg string) {
|
|
c.diagnostics = append(c.diagnostics, c.makeError(pos, msg))
|
|
}
|
|
|
|
// errorAt returns an error value at the location of the instruction.
|
|
// The location information may not be complete as it depends on debug
|
|
// information in the IR.
|
|
func errorAt(inst llvm.Value, msg string) scanner.Error {
|
|
return scanner.Error{
|
|
Pos: getPosition(inst),
|
|
Msg: msg,
|
|
}
|
|
}
|
|
|
|
// getPosition returns the position information for the given value, as far as
|
|
// it is available.
|
|
func getPosition(val llvm.Value) token.Position {
|
|
if !val.IsAInstruction().IsNil() {
|
|
loc := val.InstructionDebugLoc()
|
|
if loc.IsNil() {
|
|
return token.Position{}
|
|
}
|
|
file := loc.LocationScope().ScopeFile()
|
|
return token.Position{
|
|
Filename: filepath.Join(file.FileDirectory(), file.FileFilename()),
|
|
Line: int(loc.LocationLine()),
|
|
Column: int(loc.LocationColumn()),
|
|
}
|
|
} else if !val.IsAFunction().IsNil() {
|
|
loc := val.Subprogram()
|
|
if loc.IsNil() {
|
|
return token.Position{}
|
|
}
|
|
file := loc.ScopeFile()
|
|
return token.Position{
|
|
Filename: filepath.Join(file.FileDirectory(), file.FileFilename()),
|
|
Line: int(loc.SubprogramLine()),
|
|
}
|
|
} else {
|
|
return token.Position{}
|
|
}
|
|
}
|