sysctl, HW_PHYSMEM, and crippled gcc

Giorgos Keramidas keramida at linux.gr
Fri Dec 9 18:07:38 PST 2005


On 2005-12-09 14:02, Sergey Babkin <babkin at verizon.net> wrote:
>Divacky Roman <xdivac02 at stud.fit.vutbr.cz> wrote:
>>On Thu, Dec 08, 2005 at 05:06:16PM -0800, Steve Kargl wrote:
>>> 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.
>
>>> In particular, ggc-min-heapsize=4096 is ridiculously small for a
>>> system with 12 GB of memory.
>>
>> the code works here (512M of memory)... dont know about the ifdefs its
>> surrounded by..
>
> I guess you've confused M and G :-) The point is that
> it breaks with over 4G of memory.

Can someone with access to a system with more than 4 GB verify that the
following works correctly?

% flame:/home/keramida/tmp/physmem$ cat -n physmem.c
%      1  #include <sys/types.h>
%      2  #include <sys/sysctl.h>
%      3
%      4  #include <err.h>
%      5  #include <stdint.h>
%      6  #include <stdio.h>
%      7  #include <stdlib.h>
%      8
%      9  int
%     10  main(void)
%     11  {
%     12          uint64_t physmem;
%     13          size_t len = sizeof physmem;
%     14          static int mib[] = { CTL_HW, HW_PHYSMEM };
%     15          static size_t miblen = sizeof(mib) / sizeof(mib[0]);
%     16
%     17          if (sysctl(mib, miblen, &physmem, &len, NULL, 0) != 0)
%     18                  err(1, "sysctl hw.physmem");
%     19          printf("Physical memory = %ju bytes\n", (intmax_t)physmem);
%     20          return EXIT_SUCCESS;
%     21  }
% flame:/home/keramida/tmp/physmem$ ./physmem
% Physical memory = 526151680 bytes
% flame:/home/keramida/tmp/physmem$

Then we can probably try to push a similar change towards the libiberty
developers too, unless there are serious problems with supporting
uint64_t on some of the platforms that libiberty needs to run on.



More information about the freebsd-hackers mailing list