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