mirror of
https://github.com/golang/go
synced 2024-10-04 15:11:20 -06:00
[dev.ssa] cmd/compile: improve special register error checking
Provide better diagnostic messages. Use an int for numRegs comparisons, to avoid asking whether a uint8 is > 255. Change-Id: I33ae193ce292b24b369865abda3902c3207d7d3f Reviewed-on: https://go-review.googlesource.com/24135 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
d0fa6c2f9e
commit
a2beee000b
@ -439,21 +439,36 @@ func (s *regAllocState) allocValToReg(v *Value, mask regMask, nospill bool, line
|
||||
func (s *regAllocState) init(f *Func) {
|
||||
s.f = f
|
||||
s.registers = f.Config.registers
|
||||
s.numRegs = register(len(s.registers))
|
||||
if s.numRegs > noRegister || s.numRegs > register(unsafe.Sizeof(regMask(0))*8) {
|
||||
panic("too many registers")
|
||||
if nr := len(s.registers); nr == 0 || nr > int(noRegister) || nr > int(unsafe.Sizeof(regMask(0))*8) {
|
||||
s.f.Fatalf("bad number of registers: %d", nr)
|
||||
} else {
|
||||
s.numRegs = register(nr)
|
||||
}
|
||||
// Locate SP, SB, and g registers.
|
||||
s.SPReg = noRegister
|
||||
s.SBReg = noRegister
|
||||
s.GReg = noRegister
|
||||
for r := register(0); r < s.numRegs; r++ {
|
||||
if s.registers[r].Name() == "SP" {
|
||||
switch s.registers[r].Name() {
|
||||
case "SP":
|
||||
s.SPReg = r
|
||||
}
|
||||
if s.registers[r].Name() == "SB" {
|
||||
case "SB":
|
||||
s.SBReg = r
|
||||
}
|
||||
if s.registers[r].Name() == "g" {
|
||||
case "g":
|
||||
s.GReg = r
|
||||
}
|
||||
}
|
||||
// Make sure we found all required registers.
|
||||
switch noRegister {
|
||||
case s.SPReg:
|
||||
s.f.Fatalf("no SP register found")
|
||||
case s.SBReg:
|
||||
s.f.Fatalf("no SB register found")
|
||||
case s.GReg:
|
||||
if f.Config.hasGReg {
|
||||
s.f.Fatalf("no g register found")
|
||||
}
|
||||
}
|
||||
|
||||
// Figure out which registers we're allowed to use.
|
||||
s.allocatable = s.f.Config.gpRegMask | s.f.Config.fpRegMask | s.f.Config.flagRegMask
|
||||
|
Loading…
Reference in New Issue
Block a user