From 1abd8d8fd04fd64f90d3c1cbce675ab2317ec449 Mon Sep 17 00:00:00 2001
From: Shenghou Ma <minux.ma@gmail.com>
Date: Wed, 21 Mar 2012 00:51:48 +0800
Subject: [PATCH] misc/cgo/gmp: update for Go 1 1. make the program go
 buildable 2. update os.EINVAL and runtime.Cgocalls() 3. wrap mpz_div_2exp()
 and mpz_mul_2exp to support both    pre-5.0 and post-5.0 gmp (we really have
 no reason to    restrict ourselves to gmp 5.0+)

R=golang-dev, remyoudompheng, iant
CC=golang-dev
https://golang.org/cl/5847061
---
 misc/cgo/gmp/gmp.go | 24 ++++++++++++++++++------
 misc/cgo/gmp/pi.go  |  2 +-
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/misc/cgo/gmp/gmp.go b/misc/cgo/gmp/gmp.go
index 9325d8bfde3..3bcf99151d5 100644
--- a/misc/cgo/gmp/gmp.go
+++ b/misc/cgo/gmp/gmp.go
@@ -98,8 +98,20 @@ Go to hang on to a reference to the pointer until C is done with it.
 */
 package gmp
 
-// #include <gmp.h>
-// #include <stdlib.h>
+/*
+#cgo LDFLAGS: -lgmp
+#include <gmp.h>
+#include <stdlib.h>
+
+// gmp 5.0.0+ changed the type of the 3rd argument to mp_bitcnt_t,
+// so, to support older versions, we wrap these two functions.
+void _mpz_mul_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) {
+	mpz_mul_2exp(a, b, n);
+}
+void _mpz_div_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) {
+	mpz_div_2exp(a, b, n);
+}
+*/
 import "C"
 
 import (
@@ -182,12 +194,12 @@ func (z *Int) SetInt64(x int64) *Int {
 func (z *Int) SetString(s string, base int) error {
 	z.doinit()
 	if base < 2 || base > 36 {
-		return os.EINVAL
+		return os.ErrInvalid
 	}
 	p := C.CString(s)
 	defer C.free(unsafe.Pointer(p))
 	if C.mpz_set_str(&z.i[0], p, C.int(base)) < 0 {
-		return os.EINVAL
+		return os.ErrInvalid
 	}
 	return nil
 }
@@ -265,7 +277,7 @@ func (z *Int) Mod(x, y *Int) *Int {
 func (z *Int) Lsh(x *Int, s uint) *Int {
 	x.doinit()
 	z.doinit()
-	C.mpz_mul_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s))
+	C._mpz_mul_2exp(&z.i[0], &x.i[0], C.ulong(s))
 	return z
 }
 
@@ -273,7 +285,7 @@ func (z *Int) Lsh(x *Int, s uint) *Int {
 func (z *Int) Rsh(x *Int, s uint) *Int {
 	x.doinit()
 	z.doinit()
-	C.mpz_div_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s))
+	C._mpz_div_2exp(&z.i[0], &x.i[0], C.ulong(s))
 	return z
 }
 
diff --git a/misc/cgo/gmp/pi.go b/misc/cgo/gmp/pi.go
index 019861e592f..1914cf214fe 100644
--- a/misc/cgo/gmp/pi.go
+++ b/misc/cgo/gmp/pi.go
@@ -102,5 +102,5 @@ func main() {
 		}
 	}
 
-	fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.Cgocalls(), numer.Len(), accum.Len(), denom.Len())
+	fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.NumCgoCall(), numer.Len(), accum.Len(), denom.Len())
 }
-- 
GitLab