If GC does that, then how come there is all this effort to do
mmap testing to see if it has the facility to zero memory, and

I can't see what you are refering to.

I obviously misinterpreted that then.

why is the surrounding code (in GCC 4.4's alloc_page())
calling XCNEWVEC instead of XNEWVEC?

That's the page table entries, not the data itself.

There wouldn't be the need for ggc_alloc_cleared if ggc_alloc
would already zero pages.

Ok, based on this, I traced it back further:

rtx
gen_rtx_fmt_e0 (code, mode, arg0)
    RTX_CODE code;
    enum machine_mode mode;
    rtx arg0;
{
 rtx rt;
 rt = ggc_alloc_rtx (2);
 memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));



rtx
gen_rtx_MEM (mode, addr)
    enum machine_mode mode;
    rtx addr;
{
 rtx rt = gen_rtx_raw_MEM (mode, addr);

 /* This field is not cleared by the mere allocation of the rtx, so
    we clear it here.  */
 MEM_ATTRS (rt) = 0;

 return rt;
}



void
init_caller_save ()
{
...
 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
   for (mode = 0 ; mode < MAX_MACHINE_MODE; mode++)
     if (HARD_REGNO_MODE_OK (i, mode))
       {
     rtx mem = gen_rtx_MEM (mode, address);


And indeed, this code - caller_save, shows up as one of the symptoms.
One of the symptoms is that where it is meant to be saving a register
prior to a function call, it instead generates a completely stupid
instruction - and that stupid instruction happens to be the first
instruction listed in i370.md.

Right at the moment the symptom is:

/ID SAVE-JOB-123456 @BLD000 9999 9999 9999 9999
/SYS REGION=9999,XREGION=64M
/FILE SYSPRINT PRT OSRECFM(F) OSLRECL(256)
/FILE SYSIN N(MATH.C) SHR
/FILE O N(MATH.S) NEW RECFM(V) SP(1000)
/FILE SYSINCL PDS(*.H)
/FILE INCLUDE PDS(*.H)
/PARM -Os -S -DUSE_MEMMGR -DMUSIC -o dd:o -
/LOAD XMON
<stdin>: In function `acos':
<stdin>:137: Internal compiler error in ?, at <stdin>:724
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.

compiling something from my C runtime library.  But I basically get
different behaviour depending on what I initialize uninitialized memory
to.

Any ideas on what to look for now?  I can probably isolate which bit
of the malloc()ed memory is being referenced before initialization.
But finding out who is doing the reference could be tricky.

I might be able to trace it from a different approach, getting more
information about that internal error, now that I know where some
of the involved memory is.  I'll get that <stdin> converted into a
PC filename first.

BFN.  Paul.

Reply via email to