Date: Sat, 10 Dec 2005 04:06:43 +0200 From: Giorgos Keramidas <keramida@linux.gr> To: babkin@users.sourceforge.net Cc: freebsd-hackers@freebsd.org, Divacky Roman <xdivac02@stud.fit.vutbr.cz> Subject: Re: Re: sysctl, HW_PHYSMEM, and crippled gcc Message-ID: <20051210020643.GA6206@flame.pc> In-Reply-To: <10939303.1134158545675.JavaMail.root@vms070.mailsrvcs.net> References: <10939303.1134158545675.JavaMail.root@vms070.mailsrvcs.net>
index | next in thread | previous in thread | raw e-mail
On 2005-12-09 14:02, Sergey Babkin <babkin@verizon.net> wrote:
>Divacky Roman <xdivac02@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.
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051210020643.GA6206>
