On Mon, Mar 26, 2012 at 18:37, Steve Kargl
s...@troutmask.apl.washington.edu wrote:
On Mon, Mar 26, 2012 at 06:17:08PM +0300, Janne Blomqvist wrote:
currently in libgfortran we have two malloc() wrappers, get_mem and
internal_malloc_size, which abort the program if malloc fails.
internal_malloc_size does
if (size == 0)
size = 1;
and then calls get_mem, which doesn't have such a zero-size check.
This is, however, a bug in get_mem, as malloc(0) is allowed to return
NULL, and in that case get_mem would incorrectly abort the program.
Thus having both these functions is unnecessary. The attached patch
combines these two functions into one. As I couldn't decide between
get_mem and internal_malloc_size and didn't particularly like either
of the names, I named the combined function xmalloc, as is common
for such functions to be called.
When developing the patch, I noticed that the implementations of the
intrinsics IALL, IANY, IPARITY, NORM2, and PARITY weren't being
regenerated from the m4 sources. The reason, it turned out, was that
the dependencies were specified incorrectly in Makefile.am. The patch
also fixes this.
Regtested on x86_64-unknown-linux-gnu. While the patch is large, it's
also mechanical, hence committed as obvious.
The patch looks ok to me, but I do have two questions.
1) xmalloc is used in other parts of gcc. Is there a
possibility of confusing the libgfortran version
with the other(s)? Perhaps, a unique name is in
order, gfc_xmalloc().
I though about that, and ultimately decided against it, as the symbol
name is mangled anyway (__gfortrani_xmalloc IIRC), and so shouldn't
cause any linking problems. Also, I don't think it's worth worrying
about similar named source identifiers in other subdirectories in the
GCC tree; it's easy enough to find the implementation that is used in
libgfortran with (git) grep.
2) Unless I've misread the patch (which is always a
possibility), it seems that you've removed
GFC_CLEAR_MEMORY, which used calloc to zero the
allocated memory. Is there a situation where
libgfortran needs/assumes the memory is zeroed
upon allocation?
GFC_CLEAR_MEMORY was a macro for debugging purposes. Today, with tools
like valgrind available, replacing malloc with calloc is quite a
inefficient debugging tool. And as it's only a one-line change to
replace the malloc call with calloc inside xmalloc, if somebody wants
to do that it's no more effort than uncommenting the GFC_CLEAR_MEMORY
macro definition was before.
And yes, we nowadays have a corresponding xcalloc for those cases
where the caller requires zeroed memory; before xcalloc the caller
used memset to explicitly zero the memory, so GFC_CLEAR_MEMORY was
never needed from a correctness standpoint.
--
Janne Blomqvist