From 0cd8faf74494f400d278b9b0071908951bea6f40 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 17 Jun 2016 12:28:31 -0700 Subject: [PATCH] cmd/internal/obj: add opcode space safety check This CL adds a safety mechanism for changing the number of opcodes available per architecture. A subsequent CL will actually make the change. Change-Id: I6332ed5514f2f153c54d11b7da0cc8a6be1c8066 Reviewed-on: https://go-review.googlesource.com/24222 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/internal/obj/link.go | 3 ++- src/cmd/internal/obj/util.go | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 3c66eecbf0..edd45d411d 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -308,7 +308,8 @@ const ( ABaseMIPS64 ABaseS390X - AMask = 1<<12 - 1 // AND with this to use the opcode as an array index. + AllowedOpCodes = 1 << 12 // The number of opcodes available for any given architecture. + AMask = AllowedOpCodes - 1 // AND with this to use the opcode as an array index. ) // An LSym is the sort of symbol that is written to an object file. diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index a80af26c07..1572071ed3 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -462,6 +462,9 @@ var aSpace []opSet // RegisterOpcode binds a list of instruction names // to a given instruction number range. func RegisterOpcode(lo As, Anames []string) { + if len(Anames) > AllowedOpCodes { + panic(fmt.Sprintf("too many instructions, have %d max %d", len(Anames), AllowedOpCodes)) + } aSpace = append(aSpace, opSet{lo, Anames}) } -- 2.48.1