From patchwork Mon Jun 27 18:51:10 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gab Charette X-Patchwork-Id: 102258 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 101CCB6F67 for ; Tue, 28 Jun 2011 04:52:00 +1000 (EST) Received: (qmail 21001 invoked by alias); 27 Jun 2011 18:51:55 -0000 Received: (qmail 20976 invoked by uid 22791); 27 Jun 2011 18:51:51 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 27 Jun 2011 18:51:24 +0000 Received: from hpaq6.eem.corp.google.com (hpaq6.eem.corp.google.com [172.25.149.6]) by smtp-out.google.com with ESMTP id p5RIpLIO002208; Mon, 27 Jun 2011 11:51:21 -0700 Received: from gchare.mtv.corp.google.com (gchare.mtv.corp.google.com [172.18.111.122]) by hpaq6.eem.corp.google.com with ESMTP id p5RIpB5C027484; Mon, 27 Jun 2011 11:51:11 -0700 Received: by gchare.mtv.corp.google.com (Postfix, from userid 138564) id F015E1C18CF; Mon, 27 Jun 2011 11:51:10 -0700 (PDT) To: reply@codereview.appspotmail.com, crowl@google.com, dnovillo@google.com, gcc-patches@gcc.gnu.org Subject: [pph] Moved token cache streaming to in/out respectively (issue4635073) Message-Id: <20110627185110.F015E1C18CF@gchare.mtv.corp.google.com> Date: Mon, 27 Jun 2011 11:51:10 -0700 (PDT) From: gchare@google.com (Gabriel Charette) X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 * 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. --- This patch is available for review at http://codereview.appspot.com/4635073 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. */