Moved all token cache streaming to it's respective in/out streamer. They were non-static exposed methods, but were only used in pph-streamer-in/out.c
This is a pure copy/paste patch. I will change the functions names to reflect the pph naming scheme in a subsequent patch. Tested with bootstrap and pph regression testing. 2011-06-27 Gabriel Charette <gch...@google.com> * pph-streamer-in.c (pth_get_type_from_index): Moved from pph.c. (pth_load_number): Moved from pph.c. (pth_load_token_value): Moved from pph.c. (pth_load_token): Moved from pph.c. (pth_load_token_cache): Moved from pph.c. Made static. * pph-streamer-out.c (pth_get_index_from_type): Moved from pph.c. (pth_write_number): Moved from pph.c. (pth_save_token_value): Moved from pph.c. (pth_save_token): Moved from pph.c. (pth_save_token_cache): Moved from pph.c. Made static. * pph-streamer.h (struct cp_token_cache): Not declared in pph.c, but in parser.h, removed. (pth_save_token_cache): Now static, removed. (pth_load_token_cache): Now static, removed. diff --git a/gcc/cp/pph-streamer-in.c b/gcc/cp/pph-streamer-in.c index 605b214..6743c3c 100644 --- a/gcc/cp/pph-streamer-in.c +++ b/gcc/cp/pph-streamer-in.c @@ -242,6 +242,164 @@ pph_register_shared_data (pph_stream *stream, void *data, unsigned ix) } +/* Given a type index TYPE_IDX and TYPE_KIND specifying the kind of type, + return a type from integer_types or global_trees. */ + +static tree +pth_get_type_from_index (unsigned type_idx, unsigned type_kind) +{ + if (type_kind == CPP_N_INTEGER) + return integer_types[type_idx]; + else if (type_kind == CPP_N_FLOATING || type_kind == CPP_N_FRACT) + return global_trees[type_idx]; + else if (type_kind == CPP_N_IMAGINARY) + { + /* We don't need a type for the complex number. The type is + associated with the real and imaginary parts. */ + return NULL_TREE; + } + else + gcc_unreachable (); +} + + +/* Load a numeric value from file F. Return the corresponding tree. */ + +static tree +pth_load_number (pph_stream *f) +{ + unsigned type_idx, type_kind; + tree type, val; + + type_idx = pph_in_uint (f); + type_kind = pph_in_uint (f); + + type = pth_get_type_from_index (type_idx, type_kind); + + if (type_kind == CPP_N_INTEGER) + { + HOST_WIDE_INT v[2]; + pph_in_bytes (f, v, 2 * sizeof (HOST_WIDE_INT)); + val = build_int_cst_wide (type, v[0], v[1]); + } + else if (type_kind == CPP_N_FLOATING) + { + REAL_VALUE_TYPE r; + pph_in_bytes (f, &r, sizeof (REAL_VALUE_TYPE)); + val = build_real (type, r); + } + else if (type_kind == CPP_N_FRACT) + { + FIXED_VALUE_TYPE fv; + pph_in_bytes (f, &fv, sizeof (FIXED_VALUE_TYPE)); + val = build_fixed (type, fv); + } + else if (type_kind == CPP_N_IMAGINARY) + { + tree r = pth_load_number (f); + tree i = pth_load_number (f); + val = build_complex (NULL_TREE, r, i); + } + else + gcc_unreachable (); + + return val; +} + + +/* Load the tree value associated with TOKEN to file F. */ + +static void +pth_load_token_value (cp_token *token, pph_stream *f) +{ + const char *str; + + switch (token->type) + { + case CPP_TEMPLATE_ID: + case CPP_NESTED_NAME_SPECIFIER: + break; + + case CPP_NAME: + str = pph_in_string (f); + token->u.value = get_identifier (str); + break; + + case CPP_KEYWORD: + token->u.value = ridpointers[token->keyword]; + break; + + case CPP_CHAR: + case CPP_WCHAR: + case CPP_CHAR16: + case CPP_CHAR32: + case CPP_NUMBER: + token->u.value = pth_load_number (f); + break; + + case CPP_STRING: + case CPP_WSTRING: + case CPP_STRING16: + case CPP_STRING32: + str = pph_in_string (f); + token->u.value = build_string (strlen (str), str); + break; + + case CPP_PRAGMA: + /* Nothing to do. Field pragma_kind has already been loaded. */ + break; + + default: + pph_in_bytes (f, &token->u.value, sizeof (token->u.value)); + gcc_assert (token->u.value == NULL); + } +} + + +/* Read and return a token from STREAM. */ + +static cp_token * +pth_load_token (pph_stream *stream) +{ + cp_token *token = ggc_alloc_cleared_cp_token (); + + /* Do not read the whole structure, the token value has + dynamic size as it contains swizzled pointers. + FIXME pph, restructure to allow bulk reads of the whole + section. */ + pph_in_bytes (stream, token, sizeof (cp_token) - sizeof (void *)); + + /* FIXME pph. Use an arbitrary (but valid) location to avoid + confusing the rest of the compiler for now. */ + token->location = input_location; + + /* FIXME pph: verify that pth_load_token_value works with no tokens. */ + pth_load_token_value (token, stream); + + return token; +} + + +/* Read and return a cp_token_cache instance from STREAM. */ + +static cp_token_cache * +pth_load_token_cache (pph_stream *stream) +{ + unsigned i, num; + cp_token *first, *last; + + num = pph_in_uint (stream); + for (last = first = NULL, i = 0; i < num; i++) + { + last = pth_load_token (stream); + if (first == NULL) + first = last; + } + + return cp_token_cache_new (first, last); +} + + /* Read all fields in lang_decl_base instance LDB from STREAM. */ static void diff --git a/gcc/cp/pph-streamer-out.c b/gcc/cp/pph-streamer-out.c index 9104ec6..2811207 100644 --- a/gcc/cp/pph-streamer-out.c +++ b/gcc/cp/pph-streamer-out.c @@ -231,6 +231,207 @@ pph_out_start_record (pph_stream *stream, void *data) } +/* Compute an index value for TYPE suitable for restoring it later + from global_trees[] or integer_types. The index is saved + in TYPE_IX_P and the number category (one of CPP_N_INTEGER, + CPP_N_FLOATING, etc) is saved in CATEGORY_P. */ + +static void +pth_get_index_from_type (tree type, unsigned *type_ix_p, unsigned *category_p) +{ + void **val_p; + static struct pointer_map_t *type_cache = NULL; + + /* For complex types we will just use the type of the components. */ + if (TREE_CODE (type) == COMPLEX_TYPE) + { + *type_ix_p = 0; + *category_p = CPP_N_IMAGINARY; + return; + } + + if (type_cache == NULL) + type_cache = pointer_map_create (); + + val_p = pointer_map_contains (type_cache, type); + if (val_p) + *type_ix_p = *((unsigned *) val_p); + else + { + if (CP_INTEGRAL_TYPE_P (type)) + { + unsigned i; + for (i = itk_char; i < itk_none; i++) + if (type == integer_types[i]) + { + *type_ix_p = (unsigned) i; + break; + } + + gcc_assert (i != itk_none); + } + else if (FLOAT_TYPE_P (type) || FIXED_POINT_TYPE_P (type)) + { + unsigned i; + + for (i = TI_ERROR_MARK; i < TI_MAX; i++) + if (global_trees[i] == type) + { + *type_ix_p = (unsigned) i; + break; + } + + gcc_assert (i != TI_MAX); + } + else + gcc_unreachable (); + } + + if (CP_INTEGRAL_TYPE_P (type)) + *category_p = CPP_N_INTEGER; + else if (FLOAT_TYPE_P (type)) + *category_p = CPP_N_FLOATING; + else if (FIXED_POINT_TYPE_P (type)) + *category_p = CPP_N_FRACT; + else + gcc_unreachable (); +} + + +/* Save the number VAL to file F. */ + +static void +pth_write_number (pph_stream *f, tree val) +{ + unsigned type_idx, type_kind; + + pth_get_index_from_type (TREE_TYPE (val), &type_idx, &type_kind); + + pph_out_uint (f, type_idx); + pph_out_uint (f, type_kind); + + if (type_kind == CPP_N_INTEGER) + { + HOST_WIDE_INT v[2]; + + v[0] = TREE_INT_CST_LOW (val); + v[1] = TREE_INT_CST_HIGH (val); + pph_out_bytes (f, v, 2 * sizeof (HOST_WIDE_INT)); + } + else if (type_kind == CPP_N_FLOATING) + { + REAL_VALUE_TYPE r = TREE_REAL_CST (val); + pph_out_bytes (f, &r, sizeof (REAL_VALUE_TYPE)); + } + else if (type_kind == CPP_N_FRACT) + { + FIXED_VALUE_TYPE fv = TREE_FIXED_CST (val); + pph_out_bytes (f, &fv, sizeof (FIXED_VALUE_TYPE)); + } + else if (type_kind == CPP_N_IMAGINARY) + { + pth_write_number (f, TREE_REALPART (val)); + pth_write_number (f, TREE_IMAGPART (val)); + } + else + gcc_unreachable (); +} + + +/* Save the tree associated with TOKEN to file F. */ + +static void +pth_save_token_value (pph_stream *f, cp_token *token) +{ + const char *str; + unsigned len; + tree val; + + val = token->u.value; + switch (token->type) + { + case CPP_TEMPLATE_ID: + case CPP_NESTED_NAME_SPECIFIER: + break; + + case CPP_NAME: + /* FIXME pph. Hash the strings and emit a string table. */ + str = IDENTIFIER_POINTER (val); + len = IDENTIFIER_LENGTH (val); + pph_out_string_with_length (f, str, len); + break; + + case CPP_KEYWORD: + /* Nothing to do. We will reconstruct the keyword from + ridpointers[token->keyword] at load time. */ + break; + + case CPP_CHAR: + case CPP_WCHAR: + case CPP_CHAR16: + case CPP_CHAR32: + case CPP_NUMBER: + pth_write_number (f, val); + break; + + case CPP_STRING: + case CPP_WSTRING: + case CPP_STRING16: + case CPP_STRING32: + /* FIXME pph. Need to represent the type. */ + str = TREE_STRING_POINTER (val); + len = TREE_STRING_LENGTH (val); + pph_out_string_with_length (f, str, len); + break; + + case CPP_PRAGMA: + /* Nothing to do. Field pragma_kind has already been written. */ + break; + + default: + gcc_assert (token->u.value == NULL); + pph_out_bytes (f, &token->u.value, sizeof (token->u.value)); + } +} + + +/* Save TOKEN on file F. Return the number of bytes written on F. */ + +static void +pth_save_token (cp_token *token, pph_stream *f) +{ + /* Do not write out the final field in TOKEN. It contains + pointers that need to be pickled separately. + + FIXME pph - Need to also emit the location_t table so we can + reconstruct it when reading the PTH state. */ + pph_out_bytes (f, token, sizeof (cp_token) - sizeof (void *)); + pth_save_token_value (f, token); +} + + +/* Save all the tokens in CACHE to PPH stream F. */ + +static void +pth_save_token_cache (cp_token_cache *cache, pph_stream *f) +{ + unsigned i, num; + cp_token *tok; + + if (cache == NULL) + { + pph_out_uint (f, 0); + return; + } + + for (num = 0, tok = cache->first; tok != cache->last; tok++) + num++; + + pph_out_uint (f, num); + for (i = 0, tok = cache->first; i < num; tok++, i++) + pth_save_token (tok, f); +} + /* Write all the fields in lang_decl_base instance LDB to OB. */ static void diff --git a/gcc/cp/pph-streamer.h b/gcc/cp/pph-streamer.h index c8fb4a9..b36d622 100644 --- a/gcc/cp/pph-streamer.h +++ b/gcc/cp/pph-streamer.h @@ -157,11 +157,6 @@ tree pph_alloc_tree (enum tree_code, struct lto_input_block *, struct data_in *); void pph_read_file (const char *filename); -/* In pph.c. FIXME pph move these to pph-streamer.c. */ -struct cp_token_cache; -void pth_save_token_cache (struct cp_token_cache *, pph_stream *); -struct cp_token_cache *pth_load_token_cache (pph_stream *); - /* Inline functions. */ /* Output AST T to STREAM. If REF_P is true, output all the leaves of T diff --git a/gcc/cp/pph.c b/gcc/cp/pph.c index 480c0fe..a1c4096 100644 --- a/gcc/cp/pph.c +++ b/gcc/cp/pph.c @@ -42,365 +42,6 @@ along with GCC; see the file COPYING3. If not see -fpph_logfile. If this flag is not given, stdout is used. */ FILE *pph_logfile = NULL; -/* Compute an index value for TYPE suitable for restoring it later - from global_trees[] or integer_types. The index is saved - in TYPE_IX_P and the number category (one of CPP_N_INTEGER, - CPP_N_FLOATING, etc) is saved in CATEGORY_P. */ - -static void -pth_get_index_from_type (tree type, unsigned *type_ix_p, unsigned *category_p) -{ - void **val_p; - static struct pointer_map_t *type_cache = NULL; - - /* For complex types we will just use the type of the components. */ - if (TREE_CODE (type) == COMPLEX_TYPE) - { - *type_ix_p = 0; - *category_p = CPP_N_IMAGINARY; - return; - } - - if (type_cache == NULL) - type_cache = pointer_map_create (); - - val_p = pointer_map_contains (type_cache, type); - if (val_p) - *type_ix_p = *((unsigned *) val_p); - else - { - if (CP_INTEGRAL_TYPE_P (type)) - { - unsigned i; - for (i = itk_char; i < itk_none; i++) - if (type == integer_types[i]) - { - *type_ix_p = (unsigned) i; - break; - } - - gcc_assert (i != itk_none); - } - else if (FLOAT_TYPE_P (type) || FIXED_POINT_TYPE_P (type)) - { - unsigned i; - - for (i = TI_ERROR_MARK; i < TI_MAX; i++) - if (global_trees[i] == type) - { - *type_ix_p = (unsigned) i; - break; - } - - gcc_assert (i != TI_MAX); - } - else - gcc_unreachable (); - } - - if (CP_INTEGRAL_TYPE_P (type)) - *category_p = CPP_N_INTEGER; - else if (FLOAT_TYPE_P (type)) - *category_p = CPP_N_FLOATING; - else if (FIXED_POINT_TYPE_P (type)) - *category_p = CPP_N_FRACT; - else - gcc_unreachable (); -} - - -/* Save the number VAL to file F. */ - -static void -pth_write_number (pph_stream *f, tree val) -{ - unsigned type_idx, type_kind; - - pth_get_index_from_type (TREE_TYPE (val), &type_idx, &type_kind); - - pph_out_uint (f, type_idx); - pph_out_uint (f, type_kind); - - if (type_kind == CPP_N_INTEGER) - { - HOST_WIDE_INT v[2]; - - v[0] = TREE_INT_CST_LOW (val); - v[1] = TREE_INT_CST_HIGH (val); - pph_out_bytes (f, v, 2 * sizeof (HOST_WIDE_INT)); - } - else if (type_kind == CPP_N_FLOATING) - { - REAL_VALUE_TYPE r = TREE_REAL_CST (val); - pph_out_bytes (f, &r, sizeof (REAL_VALUE_TYPE)); - } - else if (type_kind == CPP_N_FRACT) - { - FIXED_VALUE_TYPE fv = TREE_FIXED_CST (val); - pph_out_bytes (f, &fv, sizeof (FIXED_VALUE_TYPE)); - } - else if (type_kind == CPP_N_IMAGINARY) - { - pth_write_number (f, TREE_REALPART (val)); - pth_write_number (f, TREE_IMAGPART (val)); - } - else - gcc_unreachable (); -} - - -/* Save the tree associated with TOKEN to file F. */ - -static void -pth_save_token_value (pph_stream *f, cp_token *token) -{ - const char *str; - unsigned len; - tree val; - - val = token->u.value; - switch (token->type) - { - case CPP_TEMPLATE_ID: - case CPP_NESTED_NAME_SPECIFIER: - break; - - case CPP_NAME: - /* FIXME pph. Hash the strings and emit a string table. */ - str = IDENTIFIER_POINTER (val); - len = IDENTIFIER_LENGTH (val); - pph_out_string_with_length (f, str, len); - break; - - case CPP_KEYWORD: - /* Nothing to do. We will reconstruct the keyword from - ridpointers[token->keyword] at load time. */ - break; - - case CPP_CHAR: - case CPP_WCHAR: - case CPP_CHAR16: - case CPP_CHAR32: - case CPP_NUMBER: - pth_write_number (f, val); - break; - - case CPP_STRING: - case CPP_WSTRING: - case CPP_STRING16: - case CPP_STRING32: - /* FIXME pph. Need to represent the type. */ - str = TREE_STRING_POINTER (val); - len = TREE_STRING_LENGTH (val); - pph_out_string_with_length (f, str, len); - break; - - case CPP_PRAGMA: - /* Nothing to do. Field pragma_kind has already been written. */ - break; - - default: - gcc_assert (token->u.value == NULL); - pph_out_bytes (f, &token->u.value, sizeof (token->u.value)); - } -} - - -/* Save TOKEN on file F. Return the number of bytes written on F. */ - -static void -pth_save_token (cp_token *token, pph_stream *f) -{ - /* Do not write out the final field in TOKEN. It contains - pointers that need to be pickled separately. - - FIXME pph - Need to also emit the location_t table so we can - reconstruct it when reading the PTH state. */ - pph_out_bytes (f, token, sizeof (cp_token) - sizeof (void *)); - pth_save_token_value (f, token); -} - - -/* Save all the tokens in CACHE to PPH stream F. */ - -void -pth_save_token_cache (cp_token_cache *cache, pph_stream *f) -{ - unsigned i, num; - cp_token *tok; - - if (cache == NULL) - { - pph_out_uint (f, 0); - return; - } - - for (num = 0, tok = cache->first; tok != cache->last; tok++) - num++; - - pph_out_uint (f, num); - for (i = 0, tok = cache->first; i < num; tok++, i++) - pth_save_token (tok, f); -} - - -/* Given a type index TYPE_IDX and TYPE_KIND specifying the kind of type, - return a type from integer_types or global_trees. */ - -static tree -pth_get_type_from_index (unsigned type_idx, unsigned type_kind) -{ - if (type_kind == CPP_N_INTEGER) - return integer_types[type_idx]; - else if (type_kind == CPP_N_FLOATING || type_kind == CPP_N_FRACT) - return global_trees[type_idx]; - else if (type_kind == CPP_N_IMAGINARY) - { - /* We don't need a type for the complex number. The type is - associated with the real and imaginary parts. */ - return NULL_TREE; - } - else - gcc_unreachable (); -} - - -/* Load a numeric value from file F. Return the corresponding tree. */ - -static tree -pth_load_number (pph_stream *f) -{ - unsigned type_idx, type_kind; - tree type, val; - - type_idx = pph_in_uint (f); - type_kind = pph_in_uint (f); - - type = pth_get_type_from_index (type_idx, type_kind); - - if (type_kind == CPP_N_INTEGER) - { - HOST_WIDE_INT v[2]; - pph_in_bytes (f, v, 2 * sizeof (HOST_WIDE_INT)); - val = build_int_cst_wide (type, v[0], v[1]); - } - else if (type_kind == CPP_N_FLOATING) - { - REAL_VALUE_TYPE r; - pph_in_bytes (f, &r, sizeof (REAL_VALUE_TYPE)); - val = build_real (type, r); - } - else if (type_kind == CPP_N_FRACT) - { - FIXED_VALUE_TYPE fv; - pph_in_bytes (f, &fv, sizeof (FIXED_VALUE_TYPE)); - val = build_fixed (type, fv); - } - else if (type_kind == CPP_N_IMAGINARY) - { - tree r = pth_load_number (f); - tree i = pth_load_number (f); - val = build_complex (NULL_TREE, r, i); - } - else - gcc_unreachable (); - - return val; -} - - -/* Load the tree value associated with TOKEN to file F. */ - -static void -pth_load_token_value (cp_token *token, pph_stream *f) -{ - const char *str; - - switch (token->type) - { - case CPP_TEMPLATE_ID: - case CPP_NESTED_NAME_SPECIFIER: - break; - - case CPP_NAME: - str = pph_in_string (f); - token->u.value = get_identifier (str); - break; - - case CPP_KEYWORD: - token->u.value = ridpointers[token->keyword]; - break; - - case CPP_CHAR: - case CPP_WCHAR: - case CPP_CHAR16: - case CPP_CHAR32: - case CPP_NUMBER: - token->u.value = pth_load_number (f); - break; - - case CPP_STRING: - case CPP_WSTRING: - case CPP_STRING16: - case CPP_STRING32: - str = pph_in_string (f); - token->u.value = build_string (strlen (str), str); - break; - - case CPP_PRAGMA: - /* Nothing to do. Field pragma_kind has already been loaded. */ - break; - - default: - pph_in_bytes (f, &token->u.value, sizeof (token->u.value)); - gcc_assert (token->u.value == NULL); - } -} - - -/* Read and return a token from STREAM. */ - -static cp_token * -pth_load_token (pph_stream *stream) -{ - cp_token *token = ggc_alloc_cleared_cp_token (); - - /* Do not read the whole structure, the token value has - dynamic size as it contains swizzled pointers. - FIXME pph, restructure to allow bulk reads of the whole - section. */ - pph_in_bytes (stream, token, sizeof (cp_token) - sizeof (void *)); - - /* FIXME pph. Use an arbitrary (but valid) location to avoid - confusing the rest of the compiler for now. */ - token->location = input_location; - - /* FIXME pph: verify that pth_load_token_value works with no tokens. */ - pth_load_token_value (token, stream); - - return token; -} - - -/* Read and return a cp_token_cache instance from STREAM. */ - -cp_token_cache * -pth_load_token_cache (pph_stream *stream) -{ - unsigned i, num; - cp_token *first, *last; - - num = pph_in_uint (stream); - for (last = first = NULL, i = 0; i < num; i++) - { - last = pth_load_token (stream); - if (first == NULL) - first = last; - } - - return cp_token_cache_new (first, last); -} - /* Dump a complicated name for tree T to FILE using FLAGS. See TDF_* in tree-pass.h for flags. */ -- This patch is available for review at http://codereview.appspot.com/4635073