From a2beee000b8e175489284abda4b82453d08af758 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 15 Jun 2016 10:07:16 -0700 Subject: [PATCH] [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 --- src/cmd/compile/internal/ssa/regalloc.go | 31 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go index ec43687c97..9f0d13b29a 100644 --- a/src/cmd/compile/internal/ssa/regalloc.go +++ b/src/cmd/compile/internal/ssa/regalloc.go @@ -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