Ian Lance Taylor <i...@google.com> writes:

> This patch updates the Go library to the most recent weekly release.  I
> think the only potential portability issues here are the use of the
> ipv6_mreq struct.  I'm not entirely sure the new exp/terminal package is
> portable, but it might be.
>
> I have not included the entire patch here, because it is too large and
> it's just copying changes anyhow.  I've included all patches to files
> which are specific to the Go frontend version.

After this change, I'm seeing another issue: most 32-bit go execution
tests fail like this on Solaris 11/x86:

/vol/gcc/src/hg/trunk/local/libgo/runtime/malloc.goc:366: libgo assertion 
failure
FAIL: go.go-torture/execute/array-1.go execution,  -O0 

Running the test under truss, I find:

14261:  mmap(0xFF000000, 805306368, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0) 
Err#12 ENOMEM

With truss -u (user function tracing), I see:

14285/1@1:      -> libgo:runtime_mallocinit()
14285/1@1:        -> libgo:runtime_InitSizes()
14285/1@1:        <- libgo:runtime_InitSizes() = 2
14285/1@1:        -> libgo:runtime_SysReserve()
14285/1:        mmap(0xFF000000, 805306368, PROT_NONE, MAP_PRIVATE|MAP_ANON, 
-1, 0) Err#12 ENOMEM
14285/1@1:        <- libgo:runtime_SysReserve() = -1
14285/1@1:        -> libgo:__go_assert_fail()

If I remove the adjustment in runtime/malloc.goc (runtime_mallocinit),
the test passes:

14445/1:        mmap(0xFEF78114, 805306368, PROT_NONE, MAP_PRIVATE|MAP_ANON, 
-1, 0) = 0xCE000000

This stuff seems incredibly fragile, and I don't exactly understand
why.  Besides, the assertion failure above is strange/wrong in two ways:

/vol/gcc/src/hg/trunk/local/libgo/runtime/malloc.goc:366: libgo assertion 
failure

* I'd expect to see the message from runtime_throw() here, not just
  `libgo assertion failure'.

* The message points to the wrong line due to a broken test: malloc.goc
  has:

                p = runtime_SysReserve((void*)(0x00f8ULL<<32), bitmap_size + 
arena_size);
                if(p == nil)
                        runtime_throw("runtime: cannot reserve arena virtual 
address space");

  On failure, p will be MAP_FAILED ((void *)-1), not nil, so the wrong
  assertion it thrown.

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to