cmd/internal/gc: use crypto/md5 instead of md5.go

Note: for simplicity, this CL changes the identifiers assigned to
gclocals.* objects; e.g., on amd64, gclocals.ABCDEFGHIJKLMNOP is now
gclocals.HGFEDCBAPONMLKJI.  However, since Go requires all packages to
be built with the same toolchain version anyway, this should be a
non-issue.

Similarly, type hashes change somewhat, but don't seem to be exposed
to users in any detectable manner.

Change-Id: Iadb3bce472af9b022b88d52b3c4c5e4113cda330
Reviewed-on: https://go-review.googlesource.com/6232
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/internal/gc/md5.go b/src/cmd/internal/gc/md5.go
deleted file mode 100644
index b8935da..0000000
--- a/src/cmd/internal/gc/md5.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gc
-
-// 64-bit MD5 (does full MD5 but returns 64 bits only).
-// Translation of ../../crypto/md5/md5*.go.
-
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-type MD5 struct {
-	s   [4]uint32
-	x   [64]uint8
-	nx  int
-	len uint64
-}
-
-const (
-	_Chunk = 64
-)
-
-const (
-	_Init0 = 0x67452301
-	_Init1 = 0xEFCDAB89
-	_Init2 = 0x98BADCFE
-	_Init3 = 0x10325476
-)
-
-func md5reset(d *MD5) {
-	d.s[0] = _Init0
-	d.s[1] = _Init1
-	d.s[2] = _Init2
-	d.s[3] = _Init3
-	d.nx = 0
-	d.len = 0
-}
-
-func md5write(d *MD5, p []byte, nn int) {
-	d.len += uint64(nn)
-	if d.nx > 0 {
-		n := nn
-		if n > _Chunk-d.nx {
-			n = _Chunk - d.nx
-		}
-		for i := 0; i < n; i++ {
-			d.x[d.nx+i] = uint8(p[i])
-		}
-		d.nx += n
-		if d.nx == _Chunk {
-			md5block(d, d.x[:], _Chunk)
-			d.nx = 0
-		}
-
-		p = p[n:]
-		nn -= n
-	}
-
-	n := md5block(d, p, nn)
-	p = p[n:]
-	nn -= n
-	if nn > 0 {
-		for i := 0; i < nn; i++ {
-			d.x[i] = uint8(p[i])
-		}
-		d.nx = nn
-	}
-}
-
-func md5sum(d *MD5, hi *uint64) uint64 {
-	// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
-	len := d.len
-
-	var tmp [64]uint8
-	tmp[0] = 0x80
-	if len%64 < 56 {
-		md5write(d, tmp[:], int(56-len%64))
-	} else {
-		md5write(d, tmp[:], int(64+56-len%64))
-	}
-
-	// Length in bits.
-	len <<= 3
-
-	for i := 0; i < 8; i++ {
-		tmp[i] = uint8(len >> uint(8*i))
-	}
-	md5write(d, tmp[:], 8)
-
-	if d.nx != 0 {
-		Fatal("md5sum")
-	}
-
-	if hi != nil {
-		*hi = uint64(d.s[2]) | uint64(d.s[3])<<32
-	}
-	return uint64(d.s[0]) | uint64(d.s[1])<<32
-}
-
-// MD5 block step.
-// In its own file so that a faster assembly or C version
-// can be substituted easily.
-
-// table[i] = int((1<<32) * abs(sin(i+1 radians))).
-var table = [64]uint32{
-	// round 1
-	0xd76aa478,
-	0xe8c7b756,
-	0x242070db,
-	0xc1bdceee,
-	0xf57c0faf,
-	0x4787c62a,
-	0xa8304613,
-	0xfd469501,
-	0x698098d8,
-	0x8b44f7af,
-	0xffff5bb1,
-	0x895cd7be,
-	0x6b901122,
-	0xfd987193,
-	0xa679438e,
-	0x49b40821,
-
-	// round 2
-	0xf61e2562,
-	0xc040b340,
-	0x265e5a51,
-	0xe9b6c7aa,
-	0xd62f105d,
-	0x2441453,
-	0xd8a1e681,
-	0xe7d3fbc8,
-	0x21e1cde6,
-	0xc33707d6,
-	0xf4d50d87,
-	0x455a14ed,
-	0xa9e3e905,
-	0xfcefa3f8,
-	0x676f02d9,
-	0x8d2a4c8a,
-
-	// round3
-	0xfffa3942,
-	0x8771f681,
-	0x6d9d6122,
-	0xfde5380c,
-	0xa4beea44,
-	0x4bdecfa9,
-	0xf6bb4b60,
-	0xbebfbc70,
-	0x289b7ec6,
-	0xeaa127fa,
-	0xd4ef3085,
-	0x4881d05,
-	0xd9d4d039,
-	0xe6db99e5,
-	0x1fa27cf8,
-	0xc4ac5665,
-
-	// round 4
-	0xf4292244,
-	0x432aff97,
-	0xab9423a7,
-	0xfc93a039,
-	0x655b59c3,
-	0x8f0ccc92,
-	0xffeff47d,
-	0x85845dd1,
-	0x6fa87e4f,
-	0xfe2ce6e0,
-	0xa3014314,
-	0x4e0811a1,
-	0xf7537e82,
-	0xbd3af235,
-	0x2ad7d2bb,
-	0xeb86d391,
-}
-
-var shift1 = []uint32{7, 12, 17, 22}
-
-var shift2 = []uint32{5, 9, 14, 20}
-
-var shift3 = []uint32{4, 11, 16, 23}
-
-var shift4 = []uint32{6, 10, 15, 21}
-
-func md5block(dig *MD5, p []byte, nn int) int {
-	var aa uint32
-	var bb uint32
-	var cc uint32
-	var dd uint32
-	var i int
-	var j int
-	var X [16]uint32
-
-	a := dig.s[0]
-	b := dig.s[1]
-	c := dig.s[2]
-	d := dig.s[3]
-	n := 0
-
-	for nn >= _Chunk {
-		aa = a
-		bb = b
-		cc = c
-		dd = d
-
-		for i = 0; i < 16; i++ {
-			j = i * 4
-			X[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
-		}
-
-		// Round 1.
-		for i = 0; i < 16; i++ {
-			x := uint32(i)
-			t := uint32(i)
-			s := shift1[i%4]
-			f := ((c ^ d) & b) ^ d
-			a += f + X[x] + table[t]
-			a = a<<s | a>>(32-s)
-			a += b
-
-			t = d
-			d = c
-			c = b
-			b = a
-			a = t
-		}
-
-		// Round 2.
-		for i = 0; i < 16; i++ {
-			x := (1 + 5*uint32(i)) % 16
-			t := 16 + uint32(i)
-			s := shift2[i%4]
-			g := ((b ^ c) & d) ^ c
-			a += g + X[x] + table[t]
-			a = a<<s | a>>(32-s)
-			a += b
-
-			t = d
-			d = c
-			c = b
-			b = a
-			a = t
-		}
-
-		// Round 3.
-		for i = 0; i < 16; i++ {
-			x := (5 + 3*uint32(i)) % 16
-			t := 32 + uint32(i)
-			s := shift3[i%4]
-			h := b ^ c ^ d
-			a += h + X[x] + table[t]
-			a = a<<s | a>>(32-s)
-			a += b
-
-			t = d
-			d = c
-			c = b
-			b = a
-			a = t
-		}
-
-		// Round 4.
-		for i = 0; i < 16; i++ {
-			x := (7 * uint32(i)) % 16
-			s := shift4[i%4]
-			t := 48 + uint32(i)
-			ii := c ^ (b | ^d)
-			a += ii + X[x] + table[t]
-			a = a<<s | a>>(32-s)
-			a += b
-
-			t = d
-			d = c
-			c = b
-			b = a
-			a = t
-		}
-
-		a += aa
-		b += bb
-		c += cc
-		d += dd
-
-		p = p[_Chunk:]
-		n += _Chunk
-		nn -= _Chunk
-	}
-
-	dig.s[0] = a
-	dig.s[1] = b
-	dig.s[2] = c
-	dig.s[3] = d
-	return n
-}
diff --git a/src/cmd/internal/gc/pgen.go b/src/cmd/internal/gc/pgen.go
index e78a0d0..abfc533 100644
--- a/src/cmd/internal/gc/pgen.go
+++ b/src/cmd/internal/gc/pgen.go
@@ -6,6 +6,7 @@
 
 import (
 	"cmd/internal/obj"
+	"crypto/md5"
 	"fmt"
 	"strings"
 )
@@ -130,12 +131,7 @@
 	if len(ls.R) > 0 {
 		Fatal("cannot rosymdup %s with relocations", ls.Name)
 	}
-	var d MD5
-	md5reset(&d)
-	md5write(&d, ls.P, len(ls.P))
-	var hi uint64
-	lo := md5sum(&d, &hi)
-	ls.Name = fmt.Sprintf("gclocals·%016x%016x", lo, hi)
+	ls.Name = fmt.Sprintf("gclocals·%x", md5.Sum(ls.P))
 	ls.Dupok = 1
 }
 
diff --git a/src/cmd/internal/gc/subr.go b/src/cmd/internal/gc/subr.go
index 9eeb5d9..a6e9bf3 100644
--- a/src/cmd/internal/gc/subr.go
+++ b/src/cmd/internal/gc/subr.go
@@ -7,6 +7,8 @@
 import (
 	"bytes"
 	"cmd/internal/obj"
+	"crypto/md5"
+	"encoding/binary"
 	"fmt"
 	"os"
 	"sort"
@@ -1587,12 +1589,8 @@
 	}
 
 	//print("typehash: %s\n", p);
-	var d MD5
-	md5reset(&d)
-
-	md5write(&d, []byte(p), len(p))
-
-	return uint32(md5sum(&d, nil))
+	h := md5.Sum([]byte(p))
+	return binary.LittleEndian.Uint32(h[:4])
 }
 
 func Ptrto(t *Type) *Type {