]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: improve special register error checking
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 15 Jun 2016 17:07:16 +0000 (10:07 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 16 Jun 2016 14:34:01 +0000 (14:34 +0000)
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>
src/cmd/compile/internal/ssa/regalloc.go

index ec43687c9770ca1369816db119e8d7a90c61008e..9f0d13b29ac551cdcc23a0f060cde8a21e4b00bc 100644 (file)
@@ -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