runtime: make runtime-gdb.py tolerant of creatively-named gdb versions

"Fedora" and "Red Hat" are not numbers, it turns out.
Don't rely on version numbers, instead use a regexp to
handle variation across the 2 patterns thus far observed
for gdb-generated Go type names.

Change-Id: I18c81aa2848265a47daf1180d8f6678566ae3f19
Reviewed-on: https://go-review.googlesource.com/c/go/+/236280
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/runtime/runtime-gdb.py b/src/runtime/runtime-gdb.py
index 7b5ba71..8d96dfb 100644
--- a/src/runtime/runtime-gdb.py
+++ b/src/runtime/runtime-gdb.py
@@ -28,24 +28,6 @@
 goobjfile = gdb.current_objfile() or gdb.objfiles()[0]
 goobjfile.pretty_printers = []
 
-# A bit of hand optimization since oldnew is used for slice printing
-splitgdbversion = gdb.VERSION.split('.')
-majorgdbversion = int(splitgdbversion[0])
-
-# Older gdb renders some types differently.
-def oldnew(old, new):
-  if majorgdbversion < 8:
-    return old
-  if majorgdbversion > 8:
-     return new
-  try:
-    # Minor versions need not be actual numbers, e.g., 7.3a.
-    if int(splitgdbversion[1]) < 2:
-      return old
-  except Exception:
-    return new # All the existing gdb 8.minor versions are numbers, so if it is not a number, it is new.
-  return new
-
 # G state (runtime2.go)
 
 def read_runtime_const(varname, default):
@@ -117,11 +99,11 @@
 #  Pretty Printers
 #
 
-
+# The patterns for matching types are permissive because gdb 8.2 switched to matching on (we think) typedef names instead of C syntax names.
 class StringTypePrinter:
 	"Pretty print Go strings."
 
-	pattern = re.compile(oldnew(r'^struct string( \*)?$',r'^string$'))
+	pattern = re.compile(r'^(struct string( \*)?|string)$')
 
 	def __init__(self, val):
 		self.val = val
@@ -137,7 +119,7 @@
 class SliceTypePrinter:
 	"Pretty print slices."
 
-	pattern = re.compile(oldnew(r'^struct \[\]',r'^\[\]'))
+	pattern = re.compile(r'^(struct \[\]|\[\])')
 
 	def __init__(self, val):
 		self.val = val
@@ -146,7 +128,10 @@
 		return 'array'
 
 	def to_string(self):
-		return str(self.val.type)[oldnew(6,0):]  # skip 'struct ' for old gdb
+		t = str(self.val.type)
+		if (t.startswith("struct ")):
+			return t[len("struct "):]
+		return t
 
 	def children(self):
 		sval = SliceValue(self.val)