sysctl, HW_PHYSMEM, and crippled gcc

Steve Kargl sgk at troutmask.apl.washington.edu
Fri Dec 9 12:09:22 PST 2005


On Thu, Dec 08, 2005 at 10:05:48PM -0600, Dan Nelson wrote:
> In the last episode (Dec 08), Steve Kargl said:
> > Anyone have any insight into fixing gcc to make better use of system
> > memory on systems with more than 4 GB. It appears that
> > libiberty/physmem.c tries to use sysctl() to determine the amount of
> > physical memory in a system.
> > 
> >   { /* This works on *bsd and darwin.  */
> >     unsigned int physmem;
> >     size_t len = sizeof physmem;
> >     static int mib[2] = { CTL_HW, HW_PHYSMEM };
> > 
> >     if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0
> >         && len == sizeof (physmem))
> >       return (double) physmem;
> >   }
> > 
> > This works if you have less than 4GB because of the unsigned int
> > physmem.  I have 12 GB, which of course, when expanded to the number
> > of bytes doesn't fit into a unsigned int physmem.
> 
> physmem is actually an unsigned long, not an unsigned int, so on amd64
> that sysctl call should fail anyway (amd64 is LP64, so a long won't fit
> into an int).

I changed "unsigned int physmem;" to "size_t physmem;".
Now, the 12 GB are recognized.

> > gcc version 3.4.4 [FreeBSD] 20050518
> > GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
> > 
> > In particular, ggc-min-heapsize=4096 is ridiculously small for a
> > system with 12 GB of memory.
> 
> On all my FreeBSD boxes from 128MB to 1GB of RAM, I get the exact same
> heuristic values as you, so I'm not sure whether the code works at all.

I forced physmem to be 8196 and recompiled gcc.  For whatever reason,
ggc-min-heapsize=4096 was still reported, but my compiling problems
disappeared.  I think you may be right about the code not doing
working as the programmer may have thought.


-- 
Steve


More information about the freebsd-hackers mailing list