libgo: Upgrade to Go 1.4.2 release.
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Mar 2015 16:19:05 +0000 (16:19 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 6 Mar 2015 16:19:05 +0000 (16:19 +0000)
From-SVN: r221245

18 files changed:
libgo/MERGE
libgo/VERSION
libgo/go/cmd/go/doc.go
libgo/go/cmd/go/generate.go
libgo/go/cmd/go/generate_test.go
libgo/go/cmd/go/get.go
libgo/go/math/big/int.go
libgo/go/math/big/int_test.go
libgo/go/reflect/type.go
libgo/go/runtime/crash_cgo_test.go
libgo/go/runtime/hashmap.go
libgo/go/runtime/hashmap_fast.go
libgo/go/runtime/mprof.go
libgo/go/runtime/os_plan9.go
libgo/go/runtime/sigqueue.go
libgo/go/runtime/syscall_windows.go
libgo/go/syscall/route_openbsd.go
libgo/merge.sh

index 0e12671be4e7e5b9bbe58a3624567039ade09f7b..260f8cf8e5980906d098a34490e4961b820e7a7d 100644 (file)
@@ -1,4 +1,4 @@
-14854533dcc7
+883bc6ed0ea815293fe6309d66f967ea60630e87
 
-The first line of this file holds the Mercurial revision number of the
+The first line of this file holds the git revision number of the
 last merge done from the master library sources.
index 40c8f5c53699865995e8fa1404aec5f51ef5b6b8..bcab27e8d3e70ed7a07e5eda1a62df377075d852 100644 (file)
@@ -1 +1 @@
-go1.4
\ No newline at end of file
+go1.4.2
\ No newline at end of file
index d0d8a8a5b2e8d298b544e295360ebf7923ab1658..7191ee0f3a9f8e99629f8f0f9512ea9574f58689 100644 (file)
@@ -308,6 +308,7 @@ The generator is run in the package's source directory.
 Go generate accepts one specific flag:
 
        -run=""
+               TODO: This flag is unimplemented.
                if non-empty, specifies a regular expression to
                select directives whose command matches the expression.
 
index baf4d2b55c1f8792c1794fc46ff8d895bfdf31e9..3c0af8760b5eeeb00b17c7dedfea877303ce2eac 100644 (file)
@@ -106,6 +106,7 @@ The generator is run in the package's source directory.
 Go generate accepts one specific flag:
 
        -run=""
+               TODO: This flag is unimplemented.
                if non-empty, specifies a regular expression to
                select directives whose command matches the expression.
 
@@ -255,6 +256,10 @@ func (g *Generator) split(line string) []string {
        // Parse line, obeying quoted strings.
        var words []string
        line = line[len("//go:generate ") : len(line)-1] // Drop preamble and final newline.
+       // There may still be a carriage return.
+       if len(line) > 0 && line[len(line)-1] == '\r' {
+               line = line[:len(line)-1]
+       }
        // One (possibly quoted) word per iteration.
 Words:
        for {
index 660ebabbe84d8b2d5593bca35fec4b137c9fd421..2ec548630acc095d3847de3723d48a70d35a8a38 100644 (file)
@@ -40,9 +40,15 @@ func TestGenerateCommandParse(t *testing.T) {
        }
        g.setShorthand([]string{"-command", "yacc", "go", "tool", "yacc"})
        for _, test := range splitTests {
+               // First with newlines.
                got := g.split("//go:generate " + test.in + "\n")
                if !reflect.DeepEqual(got, test.out) {
                        t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
                }
+               // Then with CRLFs, thank you Windows.
+               got = g.split("//go:generate " + test.in + "\r\n")
+               if !reflect.DeepEqual(got, test.out) {
+                       t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
+               }
        }
 }
index 86e1697618ab4d6e21f8e5d78ef1d5b547abc2ac..50e0ca93bf42053466b83543c63cccf45bae90e4 100644 (file)
@@ -290,7 +290,7 @@ func downloadPackage(p *Package) error {
                                                }
                                        }
                                        if remote != repo {
-                                               return fmt.Errorf("%s is from %s, should be from %s", dir, remote, repo)
+                                               return fmt.Errorf("%s is a custom import path for %s, but %s is checked out from %s", rr.root, repo, dir, remote)
                                        }
                                }
                        }
index d22e39e7c94fa3591b61236eb433e4130bdf0d86..ade5c2fc8cddb151b07e731b280e93500292d0b6 100644 (file)
@@ -887,7 +887,7 @@ func (z *Int) AndNot(x, y *Int) *Int {
        }
 
        // x &^ (-y) == x &^ ^(y-1) == x & (y-1)
-       y1 := nat(nil).add(y.abs, natOne)
+       y1 := nat(nil).sub(y.abs, natOne)
        z.abs = z.abs.and(x.abs, y1)
        z.neg = false
        return z
index 6070cf325d206ed6ec508cf3805ac3dfac9c23c6..2d762dbc89f49db4e33e7746792eea7605364179 100644 (file)
@@ -1201,6 +1201,7 @@ var bitwiseTests = []struct {
        {"-0x01", "-0x01", "-0x01", "-0x01", "0x00", "0x00"},
        {"0x07", "0x08", "0x00", "0x0f", "0x0f", "0x07"},
        {"0x05", "0x0f", "0x05", "0x0f", "0x0a", "0x00"},
+       {"0xff", "-0x0a", "0xf6", "-0x01", "-0xf7", "0x09"},
        {"0x013ff6", "0x9a4e", "0x1a46", "0x01bffe", "0x01a5b8", "0x0125b0"},
        {"-0x013ff6", "0x9a4e", "0x800a", "-0x0125b2", "-0x01a5bc", "-0x01c000"},
        {"-0x013ff6", "-0x9a4e", "-0x01bffe", "-0x1a46", "0x01a5b8", "0x8008"},
index 101135410cf7ca867f2d9c0294f21a8272ffcca3..5cbf7e577a3338c883b9402ec47fdbe9c77eb436 100644 (file)
@@ -248,12 +248,12 @@ const (
 // with a unique tag like `reflect:"array"` or `reflect:"ptr"`
 // so that code cannot convert from, say, *arrayType to *ptrType.
 type rtype struct {
-       kind       uint8   // enumeration for C
-       align      int8    // alignment of variable with this type
-       fieldAlign uint8   // alignment of struct field with this type
-       _          uint8   // unused/padding
+       kind       uint8 // enumeration for C
+       align      int8  // alignment of variable with this type
+       fieldAlign uint8 // alignment of struct field with this type
+       _          uint8 // unused/padding
        size       uintptr
-       hash       uint32  // hash of type; avoids computation in hash tables
+       hash       uint32 // hash of type; avoids computation in hash tables
 
        hashfn  uintptr // hash function code
        equalfn uintptr // equality function code
@@ -1582,8 +1582,9 @@ func MapOf(key, elem Type) Type {
 
 // gcProg is a helper type for generatation of GC pointer info.
 type gcProg struct {
-       gc   []byte
-       size uintptr // size of type in bytes
+       gc     []byte
+       size   uintptr // size of type in bytes
+       hasPtr bool
 }
 
 func (gc *gcProg) append(v byte) {
@@ -1644,11 +1645,14 @@ func (gc *gcProg) appendWord(v byte) {
        gc.gc[nptr/2] &= ^(3 << ((nptr%2)*4 + 2))
        gc.gc[nptr/2] |= v << ((nptr%2)*4 + 2)
        gc.size += ptrsize
+       if v == bitsPointer {
+               gc.hasPtr = true
+       }
 }
 
-func (gc *gcProg) finalize() unsafe.Pointer {
+func (gc *gcProg) finalize() (unsafe.Pointer, bool) {
        if gc.size == 0 {
-               return nil
+               return nil, false
        }
        ptrsize := unsafe.Sizeof(uintptr(0))
        gc.align(ptrsize)
@@ -1663,7 +1667,7 @@ func (gc *gcProg) finalize() unsafe.Pointer {
                        gc.appendWord(extractGCWord(gc.gc, i))
                }
        }
-       return unsafe.Pointer(&gc.gc[0])
+       return unsafe.Pointer(&gc.gc[0]), gc.hasPtr
 }
 
 func extractGCWord(gc []byte, i uintptr) byte {
@@ -1708,10 +1712,6 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
        for i := 0; i < int(bucketSize*unsafe.Sizeof(uint8(0))/ptrsize); i++ {
                gc.append(bitsScalar)
        }
-       gc.append(bitsPointer) // overflow
-       if runtime.GOARCH == "amd64p32" {
-               gc.append(bitsScalar)
-       }
        // keys
        for i := 0; i < bucketSize; i++ {
                gc.appendProg(ktyp)
@@ -1720,10 +1720,15 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
        for i := 0; i < bucketSize; i++ {
                gc.appendProg(etyp)
        }
+       // overflow
+       gc.append(bitsPointer)
+       if runtime.GOARCH == "amd64p32" {
+               gc.append(bitsScalar)
+       }
 
        b := new(rtype)
        b.size = gc.size
-       // b.gc[0] = gc.finalize()
+       // b.gc[0], _ = gc.finalize()
        b.kind |= kindGCProg
        s := "bucket(" + *ktyp.string + "," + *etyp.string + ")"
        b.string = &s
index 972eedc624ee3d192240d0b764cfa517f174a6ef..29f90fa36d27fc521c008ad71b923b103334bd52 100644 (file)
@@ -7,6 +7,7 @@
 package runtime_test
 
 import (
+       "os/exec"
        "runtime"
        "strings"
        "testing"
@@ -50,6 +51,30 @@ func TestCgoExternalThreadPanic(t *testing.T) {
        }
 }
 
+func TestCgoExternalThreadSIGPROF(t *testing.T) {
+       // issue 9456.
+       switch runtime.GOOS {
+       case "plan9", "windows":
+               t.Skipf("no pthreads on %s", runtime.GOOS)
+       case "darwin":
+               // static constructor needs external linking, but we don't support
+               // external linking on OS X 10.6.
+               out, err := exec.Command("uname", "-r").Output()
+               if err != nil {
+                       t.Fatalf("uname -r failed: %v", err)
+               }
+               // OS X 10.6 == Darwin 10.x
+               if strings.HasPrefix(string(out), "10.") {
+                       t.Skipf("no external linking on OS X 10.6")
+               }
+       }
+       got := executeTest(t, cgoExternalThreadSIGPROFSource, nil)
+       want := "OK\n"
+       if got != want {
+               t.Fatalf("expected %q, but got %q", want, got)
+       }
+}
+
 const cgoSignalDeadlockSource = `
 package main
 
@@ -194,3 +219,46 @@ start(void)
                printf("_beginthreadex failed\n");
 }
 `
+
+const cgoExternalThreadSIGPROFSource = `
+package main
+
+/*
+#include <stdint.h>
+#include <signal.h>
+#include <pthread.h>
+
+volatile int32_t spinlock;
+
+static void *thread1(void *p) {
+       (void)p;
+       while (spinlock == 0)
+               ;
+       pthread_kill(pthread_self(), SIGPROF);
+       spinlock = 0;
+       return NULL;
+}
+__attribute__((constructor)) void issue9456() {
+       pthread_t tid;
+       pthread_create(&tid, 0, thread1, NULL);
+}
+*/
+import "C"
+
+import (
+       "runtime"
+       "sync/atomic"
+       "unsafe"
+)
+
+func main() {
+       // This test intends to test that sending SIGPROF to foreign threads
+       // before we make any cgo call will not abort the whole process, so
+       // we cannot make any cgo call here. See http://golang.org/issue/9456.
+       atomic.StoreInt32((*int32)(unsafe.Pointer(&C.spinlock)), 1)
+       for atomic.LoadInt32((*int32)(unsafe.Pointer(&C.spinlock))) == 1 {
+               runtime.Gosched()
+       }
+       println("OK")
+}
+`
index b4e624423f684e6010da5e537d701886c4861218..791af8cf36a7b3512be85c5c352b6df7e9b0a1f6 100644 (file)
@@ -117,12 +117,12 @@ type hmap struct {
 
 // A bucket for a Go map.
 type bmap struct {
-       tophash  [bucketCnt]uint8
-       overflow *bmap
+       tophash [bucketCnt]uint8
        // Followed by bucketCnt keys and then bucketCnt values.
        // NOTE: packing all the keys together and then all the values together makes the
        // code a bit more complicated than alternating key/value/key/value/... but it allows
        // us to eliminate padding which would be needed for, e.g., map[int64]int8.
+       // Followed by an overflow pointer.
 }
 
 // A hash iteration structure.
@@ -149,6 +149,13 @@ func evacuated(b *bmap) bool {
        return h > empty && h < minTopHash
 }
 
+func (b *bmap) overflow(t *maptype) *bmap {
+       return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-regSize))
+}
+func (b *bmap) setoverflow(t *maptype, ovf *bmap) {
+       *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-regSize)) = ovf
+}
+
 func makemap(t *maptype, hint int64) *hmap {
        if sz := unsafe.Sizeof(hmap{}); sz > 48 || sz != uintptr(t.hmap.size) {
                gothrow("bad hmap size")
@@ -275,7 +282,7 @@ func mapaccess1(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
                                return v
                        }
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero)
                }
@@ -323,7 +330,7 @@ func mapaccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool)
                                return v, true
                        }
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero), false
                }
@@ -366,7 +373,7 @@ func mapaccessK(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, unsafe
                                return k, v
                        }
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return nil, nil
                }
@@ -437,10 +444,11 @@ again:
                        memmove(v2, val, uintptr(t.elem.size))
                        return
                }
-               if b.overflow == nil {
+               ovf := b.overflow(t)
+               if ovf == nil {
                        break
                }
-               b = b.overflow
+               b = ovf
        }
 
        // did not find mapping for key.  Allocate new cell & add entry.
@@ -455,7 +463,7 @@ again:
                        memstats.next_gc = memstats.heap_alloc
                }
                newb := (*bmap)(newobject(t.bucket))
-               b.overflow = newb
+               b.setoverflow(t, newb)
                inserti = &newb.tophash[0]
                insertk = add(unsafe.Pointer(newb), dataOffset)
                insertv = add(insertk, bucketCnt*uintptr(t.keysize))
@@ -525,7 +533,7 @@ func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {
                        h.count--
                        return
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return
                }
@@ -720,7 +728,7 @@ next:
                        return
                }
        }
-       b = b.overflow
+       b = b.overflow(t)
        i = 0
        goto next
 }
@@ -778,7 +786,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                yk := add(unsafe.Pointer(y), dataOffset)
                xv := add(xk, bucketCnt*uintptr(t.keysize))
                yv := add(yk, bucketCnt*uintptr(t.keysize))
-               for ; b != nil; b = b.overflow {
+               for ; b != nil; b = b.overflow(t) {
                        k := add(unsafe.Pointer(b), dataOffset)
                        v := add(k, bucketCnt*uintptr(t.keysize))
                        for i := 0; i < bucketCnt; i, k, v = i+1, add(k, uintptr(t.keysize)), add(v, uintptr(t.valuesize)) {
@@ -828,7 +836,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                                                        memstats.next_gc = memstats.heap_alloc
                                                }
                                                newx := (*bmap)(newobject(t.bucket))
-                                               x.overflow = newx
+                                               x.setoverflow(t, newx)
                                                x = newx
                                                xi = 0
                                                xk = add(unsafe.Pointer(x), dataOffset)
@@ -855,7 +863,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                                                        memstats.next_gc = memstats.heap_alloc
                                                }
                                                newy := (*bmap)(newobject(t.bucket))
-                                               y.overflow = newy
+                                               y.setoverflow(t, newy)
                                                y = newy
                                                yi = 0
                                                yk = add(unsafe.Pointer(y), dataOffset)
@@ -881,7 +889,6 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                // Unlink the overflow buckets & clear key/value to help GC.
                if h.flags&oldIterator == 0 {
                        b = (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
-                       b.overflow = nil
                        memclr(add(unsafe.Pointer(b), dataOffset), uintptr(t.bucketsize)-dataOffset)
                }
        }
index 8e21e02d64e2bc1a1d5f91ce1dc30717946eae38..afa6ecc99a9fd5f9e581fe7603ac4b781460e9d9 100644 (file)
@@ -43,7 +43,7 @@ func mapaccess1_fast32(t *maptype, h *hmap, key uint32) unsafe.Pointer {
                        }
                        return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize))
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero)
                }
@@ -85,7 +85,7 @@ func mapaccess2_fast32(t *maptype, h *hmap, key uint32) (unsafe.Pointer, bool) {
                        }
                        return add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)), true
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero), false
                }
@@ -127,7 +127,7 @@ func mapaccess1_fast64(t *maptype, h *hmap, key uint64) unsafe.Pointer {
                        }
                        return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero)
                }
@@ -169,7 +169,7 @@ func mapaccess2_fast64(t *maptype, h *hmap, key uint64) (unsafe.Pointer, bool) {
                        }
                        return add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize)), true
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero), false
                }
@@ -271,7 +271,7 @@ dohash:
                                return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize))
                        }
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero)
                }
@@ -371,7 +371,7 @@ dohash:
                                return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)), true
                        }
                }
-               b = b.overflow
+               b = b.overflow(t)
                if b == nil {
                        return unsafe.Pointer(t.elem.zero), false
                }
index d409c6c306a3fe9f32ae5a43ceac739b785f0eaf..f4da45f5c307d51894645e6c4623c412b5f04167 100644 (file)
@@ -575,20 +575,16 @@ func saveg(pc, sp uintptr, gp *g, r *StackRecord) {
 // If all is true, Stack formats stack traces of all other goroutines
 // into buf after the trace for the current goroutine.
 func Stack(buf []byte, all bool) int {
-       mp := acquirem()
-       gp := mp.curg
        if all {
                semacquire(&worldsema, false)
-               mp.gcing = 1
-               releasem(mp)
+               gp := getg()
+               gp.m.gcing = 1
                onM(stoptheworld)
-               if mp != acquirem() {
-                       gothrow("Stack: rescheduled")
-               }
        }
 
        n := 0
        if len(buf) > 0 {
+               gp := getg()
                sp := getcallersp(unsafe.Pointer(&buf))
                pc := getcallerpc(unsafe.Pointer(&buf))
                onM(func() {
@@ -605,11 +601,11 @@ func Stack(buf []byte, all bool) int {
        }
 
        if all {
-               mp.gcing = 0
+               gp := getg()
+               gp.m.gcing = 0
                semrelease(&worldsema)
                onM(starttheworld)
        }
-       releasem(mp)
        return n
 }
 
index 20e47bf42e5cd20bf451be7e0c3c1dc61f12949f..10e5531ecc82eb811cbae018b3a8a71542901c1e 100644 (file)
@@ -6,6 +6,8 @@ package runtime
 
 import "unsafe"
 
+const _SIGPROF = 0 // dummy value for badsignal
+
 func pread(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
 func pwrite(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
 func seek(fd int32, offset int64, whence int32) int64
index 2d9c24d2d24909a206d7efddeb980ed9718b8f75..fed4560fe3399c8df93c51f3043d71f758e47795 100644 (file)
@@ -154,6 +154,15 @@ func signal_disable(s uint32) {
 // This runs on a foreign stack, without an m or a g.  No stack split.
 //go:nosplit
 func badsignal(sig uintptr) {
+       // Some external libraries, for example, OpenBLAS, create worker threads in
+       // a global constructor. If we're doing cpu profiling, and the SIGPROF signal
+       // comes to one of the foreign threads before we make our first cgo call, the
+       // call to cgocallback below will bring down the whole process.
+       // It's better to miss a few SIGPROF signals than to abort in this case.
+       // See http://golang.org/issue/9456.
+       if _SIGPROF != 0 && sig == _SIGPROF && needextram != 0 {
+               return
+       }
        cgocallback(unsafe.Pointer(funcPC(sigsend)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig))
 }
 
index efbcab510dad875dc2ee8decd33b96304a5ff43f..51004b78a0271a5ce535568c26f5a11756a2f9ee 100644 (file)
@@ -8,6 +8,8 @@ import (
        "unsafe"
 )
 
+const _SIGPROF = 0 // dummy value for badsignal
+
 type callbacks struct {
        lock mutex
        ctxt [cb_max]*wincallbackcontext
@@ -52,11 +54,13 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) {
                panic("compilecallback: output parameter size is wrong")
        }
        argsize := uintptr(0)
-       for _, t := range (*[1024](*_type))(unsafe.Pointer(&ft.in[0]))[:len(ft.in)] {
-               if (*t).size > uintptrSize {
-                       panic("compilecallback: input parameter size is wrong")
+       if len(ft.in) > 0 {
+               for _, t := range (*[1024](*_type))(unsafe.Pointer(&ft.in[0]))[:len(ft.in)] {
+                       if (*t).size > uintptrSize {
+                               panic("compilecallback: input parameter size is wrong")
+                       }
+                       argsize += uintptrSize
                }
-               argsize += uintptrSize
        }
 
        lock(&cbs.lock)
index 19f902db74b33cd2a879616b9c331a8e620e5bad..e5086400c5d40b9f2779f84233268502ff72edba 100644 (file)
@@ -12,16 +12,16 @@ func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
        switch any.Type {
        case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
                p := (*RouteMessage)(unsafe.Pointer(any))
-               return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
+               return &RouteMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
        case RTM_IFINFO:
                p := (*InterfaceMessage)(unsafe.Pointer(any))
-               return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
+               return &InterfaceMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
        case RTM_IFANNOUNCE:
                p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
                return &InterfaceAnnounceMessage{Header: p.Header}
        case RTM_NEWADDR, RTM_DELADDR:
                p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-               return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
+               return &InterfaceAddrMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
        }
        return nil
 }
index 6b9e5bb9932751bad8efcc82af91605f63c9e5a9..c79f7596dcaa8cbb13496223b7d25dfb218c6d9d 100755 (executable)
@@ -40,12 +40,14 @@ repository=$1
 old_rev=`sed 1q MERGE`
 
 rm -rf ${OLDDIR}
-hg clone -r ${old_rev} ${repository} ${OLDDIR}
+git clone ${repository} ${OLDDIR}
+(cd ${OLDDIR} && git checkout ${old_rev})
 
 rm -rf ${NEWDIR}
-hg clone -u ${rev} ${repository} ${NEWDIR}
+git clone ${repository} ${NEWDIR}
+(cd ${NEWDIR} && git checkout ${rev})
 
-new_rev=`cd ${NEWDIR} && hg log -r ${rev} | sed 1q | sed -e 's/.*://'`
+new_rev=`cd ${NEWDIR} && git log | sed 1q | sed -e 's/commit //'`
 
 merge() {
   name=$1
@@ -69,7 +71,7 @@ merge() {
   elif test -f ${old}; then
     # The file exists in the old version.
     if ! test -f ${libgo}; then
-      echo "merge.sh: $name: skipping: exists in old and new hg, but not in libgo"
+      echo "merge.sh: $name: skipping: exists in old and new git, but not in libgo"
       continue
     fi
     if cmp -s ${old} ${libgo}; then
@@ -160,11 +162,10 @@ done
   if ! test -d ${oldtd}; then
     continue
   fi
-  (cd ${oldtd} && hg status -A .) | while read f; do
-    if test "`basename $f`" = ".hgignore"; then
+  (cd ${oldtd} && git ls-files .) | while read f; do
+    if test "`basename $f`" = ".gitignore"; then
       continue
     fi
-    f=`echo $f | sed -e 's/^..//'`
     name=$d/$f
     oldfile=${oldtd}/$f
     newfile=${newtd}/$f
@@ -189,11 +190,10 @@ for c in $cmdlist; do
     if ! test -d ${oldtd}; then
       continue
     fi
-    (cd ${oldtd} && hg status -A .) | while read f; do
-      if test "`basename $f`" = ".hgignore"; then
+    (cd ${oldtd} && git ls-files .) | while read f; do
+      if test "`basename $f`" = ".gitignore"; then
         continue
       fi
-      f=`echo $f | sed -e 's/^..//'`
       name=$d/$f
       oldfile=${oldtd}/$f
       newfile=${newtd}/$f