Three gcc changes for obstack update
1) Current glibc obstack.h casts the return of obstack_base() to
void*, with the result that a few places in gcc need a (char *)
cast.
2) My 64-bit obstack support corrects the obstack_chunk_alloc
parameter, which was "long", to "size_t". This means a number of
places in gcc currently specifying the old prototype are now wrong.
I'd argue they are wrong anyway, since there are convenience macros
that avoid any need for user code to type cast allocation and free
functions.
3) An optimisation in my new obstack.h depends on SIZEOF_INT and
SIZEOF_SIZE_T being defined, thus the config additions anywhare
obstack.h is used.
Bootstrapped and regression tested x86_64-linux and powerpc-linux,
with both the new obstack.{h,c} and the old versions.
I'd like to commit (1) and (2) now, leaving (3) until after the 64-bit
obstack changes go in. OK for mainline gcc?
gcc/
* gengtype.h (obstack_chunk_alloc, obstack_chunk_free): Remove cast.
* coretypes.h (obstack_chunk_alloc, obstack_chunk_free): Likewise.
(gcc_obstack_init): Use obstack_specify_allocation in place of
_obstack_begin.
* genautomata.c (next_sep_el): Cast result of obstack_base to (char *).
(regexp_representation): Likewise.
* godump.c (go_output_type): Likewise.
* configure.ac: Check size of size_t.
* configure: Regenerate.
* config.in: Regenerate.
gcc/java/
* mangle.c (finish_mangling): Cast result of obstack_base to (char *).
* typeck.c (build_java_argument_signature): Likewise.
(build_java_signature): Likewise.
gcc/objc/
* objc-encoding.c (encode_array): Cast result of obstack_base.
(encode_type): Likewise.
libcpp/
* symtab.c (ht_create): Use obstack_specify_allocation in place of
_obstack_begin.
* files.c (_cpp_init_files): Likewise.
* init.c (cpp_create_reader): Likewise.
* identifiers.c (_cpp_init_hashtable): Likewise.
* configure.ac: Check size of size_t.
* configure: Regenerate.
* config.in: Regenerate.
libvtv/
* vtv-malloc.c: Include config.h.
* configure.ac: Generate config.h. Check size of int and size_t.
* configure: Regenerate.
* config.in: Generate.
libsanitizer/
* configure.ac: Check size of int and size_t.
* configure: Regenerate.
* config.in: Regenerate.
===================================================================
@@ -20,8 +20,8 @@
#ifndef GCC_GENGTYPE_H
#define GCC_GENGTYPE_H
-#define obstack_chunk_alloc ((void *(*) (long)) xmalloc)
-#define obstack_chunk_free ((void (*) (void *)) free)
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
#define OBSTACK_CHUNK_SIZE 0
/* Sets of accepted source languages like C, C++, Ada... are
===================================================================
@@ -158,13 +158,13 @@ struct basic_block_def;
typedef struct basic_block_def *basic_block;
typedef const struct basic_block_def *const_basic_block;
-#define obstack_chunk_alloc ((void *(*) (long)) xmalloc)
-#define obstack_chunk_free ((void (*) (void *)) free)
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
#define OBSTACK_CHUNK_SIZE 0
-#define gcc_obstack_init(OBSTACK) \
- _obstack_begin ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \
- obstack_chunk_alloc, \
- obstack_chunk_free)
+#define gcc_obstack_init(OBSTACK) \
+ obstack_specify_allocation ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \
+ obstack_chunk_alloc, \
+ obstack_chunk_free)
/* enum reg_class is target specific, so it should not appear in
target-independent code or interfaces, like the target hook declarations
===================================================================
@@ -1178,7 +1178,7 @@ next_sep_el (const char **pstr, int sep, int par_f
}
}
obstack_1grow (&irp, '\0');
- out_str = obstack_base (&irp);
+ out_str = (char *) obstack_base (&irp);
obstack_finish (&irp);
*pstr = p;
@@ -6873,7 +6873,7 @@ regexp_representation (regexp_t regexp)
{
form_regexp (regexp);
obstack_1grow (&irp, '\0');
- return obstack_base (&irp);
+ return (char *) obstack_base (&irp);
}
/* The function frees memory allocated for last formed string
@@ -9289,7 +9289,7 @@ initiate_automaton_gen (char **argv)
obstack_grow (&irp, STANDARD_OUTPUT_DESCRIPTION_FILE_SUFFIX,
strlen (STANDARD_OUTPUT_DESCRIPTION_FILE_SUFFIX) + 1);
obstack_1grow (&irp, '\0');
- output_description_file_name = obstack_base (&irp);
+ output_description_file_name = (char *) obstack_base (&irp);
obstack_finish (&irp);
}
===================================================================
@@ -921,7 +921,7 @@ go_output_type (struct godump_container *container
ob = &container->type_obstack;
obstack_1grow (ob, '\0');
- fputs (obstack_base (ob), go_dump_file);
+ fputs ((char *) obstack_base (ob), go_dump_file);
obstack_free (ob, obstack_base (ob));
}
===================================================================
@@ -311,6 +311,7 @@ AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_TYPES([long long], [AC_CHECK_SIZEOF(long long)])
+AC_CHECK_SIZEOF(size_t)
GCC_STDINT_TYPES
if test x"$ac_cv_c_uint64_t" = x"no" -o x"$ac_cv_c_int64_t" = x"no"; then
AC_MSG_ERROR([uint64_t or int64_t not found])
===================================================================
@@ -711,7 +711,7 @@ finish_mangling (void)
compression_table = NULL_TREE;
compression_next = 0;
obstack_1grow (mangle_obstack, '\0');
- result = get_identifier (obstack_base (mangle_obstack));
+ result = get_identifier ((char *) obstack_base (mangle_obstack));
obstack_free (mangle_obstack, obstack_base (mangle_obstack));
return result;
===================================================================
@@ -477,7 +477,7 @@ build_java_argument_signature (tree type)
}
obstack_1grow (&temporary_obstack, '\0');
- sig = get_identifier (obstack_base (&temporary_obstack));
+ sig = get_identifier ((char *) obstack_base (&temporary_obstack));
TYPE_ARGUMENT_SIGNATURE (type) = sig;
obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
}
@@ -554,7 +554,7 @@ build_java_signature (tree type)
obstack_grow0 (&temporary_obstack,
IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
- sig = get_identifier (obstack_base (&temporary_obstack));
+ sig = get_identifier ((char *) obstack_base (&temporary_obstack));
obstack_free (&temporary_obstack,
obstack_base (&temporary_obstack));
}
===================================================================
@@ -380,7 +380,7 @@ encode_array (tree type, int curtype, int format)
identifier.
*/
{
- char *enc = obstack_base (&util_obstack) + curtype;
+ char *enc = (char *) obstack_base (&util_obstack) + curtype;
if (memchr (enc, '=',
obstack_object_size (&util_obstack) - curtype) == NULL)
{
@@ -729,7 +729,7 @@ encode_type (tree type, int curtype, int format)
to be rearranged for compatibility with gcc-3.3. */
if (code == POINTER_TYPE && obstack_object_size (&util_obstack) >= 3)
{
- char *enc = obstack_base (&util_obstack) + curtype;
+ char *enc = (char *) obstack_base (&util_obstack) + curtype;
/* Rewrite "in const" from "nr" to "rn". */
if (curtype >= 1 && !strncmp (enc - 1, "nr", 2))
===================================================================
@@ -61,9 +61,7 @@ ht_create (unsigned int order)
table = XCNEW (cpp_hash_table);
/* Strings need no alignment. */
- _obstack_begin (&table->stack, 0, 0,
- (void *(*) (long)) xmalloc,
- (void (*) (void *)) free);
+ obstack_specify_allocation (&table->stack, 0, 0, xmalloc, free);
obstack_alignment_mask (&table->stack) = 0;
===================================================================
@@ -1267,9 +1267,8 @@ _cpp_init_files (cpp_reader *pfile)
pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string,
nonexistent_file_hash_eq,
NULL, xcalloc, free);
- _obstack_begin (&pfile->nonexistent_file_ob, 0, 0,
- (void *(*) (long)) xmalloc,
- (void (*) (void *)) free);
+ obstack_specify_allocation (&pfile->nonexistent_file_ob, 0, 0,
+ xmalloc, free);
}
/* Finalize everything in this source file. */
===================================================================
@@ -260,9 +260,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_tabl
_cpp_expand_op_stack (pfile);
/* Initialize the buffer obstack. */
- _obstack_begin (&pfile->buffer_ob, 0, 0,
- (void *(*) (long)) xmalloc,
- (void (*) (void *)) free);
+ obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
_cpp_init_files (pfile);
===================================================================
@@ -54,9 +54,7 @@ _cpp_init_hashtable (cpp_reader *pfile, cpp_hash_t
table = ht_create (13); /* 8K (=2^13) entries. */
table->alloc_node = alloc_node;
- _obstack_begin (&pfile->hash_ob, 0, 0,
- (void *(*) (long)) xmalloc,
- (void (*) (void *)) free);
+ obstack_specify_allocation (&pfile->hash_ob, 0, 0, xmalloc, free);
}
table->pfile = pfile;
===================================================================
@@ -71,6 +71,7 @@ fi
AC_STRUCT_TM
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(size_t)
define(libcpp_UNLOCKED_FUNCS, clearerr_unlocked feof_unlocked dnl
ferror_unlocked fflush_unlocked fgetc_unlocked fgets_unlocked dnl
fileno_unlocked fprintf_unlocked fputc_unlocked fputs_unlocked dnl
===================================================================
@@ -31,6 +31,7 @@
in vtv_rts.cc. We use the existing obstack implementation in our
memory allocation scheme. */
+#include "config.h"
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
===================================================================
@@ -5,6 +5,7 @@ AC_PREREQ([2.64])
AC_INIT([GNU Vtable Verification Runtime Library], 1.0,,[libvtv])
#AC_INIT(package-unused, version-unused, libvtv)
AC_CONFIG_SRCDIR([vtv_rts.h])
+AC_CONFIG_HEADER([config.h])
# -------
# Options
@@ -119,6 +120,10 @@ AC_CHECK_TOOL(AS, as)
AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, :)
+# Get size of int and size_t for obstack.h.
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(size_t)
+
# Configure libtool
AC_LIBTOOL_DLOPEN
AM_PROG_LIBTOOL
===================================================================
@@ -76,6 +76,8 @@ esac
AC_SUBST(enable_shared)
AC_SUBST(enable_static)
+AC_CHECK_SIZEOF([int])
+AC_CHECK_SIZEOF([size_t])
AC_CHECK_SIZEOF([void *])
if test "${multilib}" = "yes"; then