From patchwork Wed Mar 23 21:24:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Diego Novillo X-Patchwork-Id: 88119 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 A0F33B6F77 for ; Thu, 24 Mar 2011 08:25:07 +1100 (EST) Received: (qmail 15114 invoked by alias); 23 Mar 2011 21:25:03 -0000 Received: (qmail 15045 invoked by uid 22791); 23 Mar 2011 21:24:57 -0000 X-SWARE-Spam-Status: No, hits=-2.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; Wed, 23 Mar 2011 21:24:51 +0000 Received: from hpaq3.eem.corp.google.com (hpaq3.eem.corp.google.com [172.25.149.3]) by smtp-out.google.com with ESMTP id p2NLOnNP012559; Wed, 23 Mar 2011 14:24:49 -0700 Received: from tobiano.tor.corp.google.com (tobiano.tor.corp.google.com [172.29.41.6]) by hpaq3.eem.corp.google.com with ESMTP id p2NLOm9v018655; Wed, 23 Mar 2011 14:24:48 -0700 Received: by tobiano.tor.corp.google.com (Postfix, from userid 54752) id 97E98AE1C2; Wed, 23 Mar 2011 17:24:47 -0400 (EDT) To: gcc-patches@gcc.gnu.org, reply@codereview.appspotmail.com Subject: [lto] Minor cleanups, export some functions (issue4272068) Message-Id: <20110323212447.97E98AE1C2@tobiano.tor.corp.google.com> Date: Wed, 23 Mar 2011 17:24:47 -0400 (EDT) From: dnovillo@google.com (Diego Novillo) 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 This patch has a few cleanups and exports 5 functions from the LTO streamer that we are using from PPH. - When calling output_string_with_length, every caller would first write a 0 to indicate that the string is not NULL before writing the actual string. I moved that into output_string_with_length. - The functions to read/write raw data blocks was private to lto-opts.c. I moved it as a general available function into lto-streamer-*.c. - Similarly, the functions to read/write strings and the code to emit decl streams and references were private. I made them extern so they can be called from pph. None of the above changes behaviour in LTO. The patch bootstrap and tests on x86_64. OK for trunk? Diego. * lto-opts.c (input_data_block): Move to lto-streamer-in.c. * lto-streamer-in.c (input_string_internal): Add clarifying comments. (lto_input_data_block): Move from lto-opts.c. Make extern. Update all users. (lto_input_string): Rename from input_string. Make extern. Update all users. * lto-streamer-out.c (lto_output_string_with_length): Rename from output_string_with_length. Output 0 to indicate a non-NULL string. Update all callers to not emit 0. (lto_output_string): Rename from output_string. Make extern. Update all users. (lto_output_decl_state_streams): Make extern. (lto_output_decl_state_refs): Make extern. * lto-streamer.h (lto_input_string): Declare. (lto_input_data_block): Declare. (lto_output_string): Declare. (lto_output_string_with_length): Declare. (lto_output_decl_state_streams): Declare. (lto_output_decl_state_refs): Declare. --- This patch is available for review at http://codereview.appspot.com/4272068 diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c index ec4e78d..9979e8d 100644 --- a/gcc/lto-opts.c +++ b/gcc/lto-opts.c @@ -162,18 +162,6 @@ output_string_stream (struct lto_output_stream *stream, const char *string) output_data_stream (stream, &flag, sizeof (flag)); } -/* Read LENGTH bytes from STREAM to ADDR. */ - -static void -input_data_block (struct lto_input_block *ib, void *addr, size_t length) -{ - size_t i; - unsigned char *const buffer = (unsigned char *const) addr; - - for (i = 0; i < length; i++) - buffer[i] = lto_input_1_unsigned (ib); -} - /* Return a string from IB. The string is allocated, and the caller is responsible for freeing it. */ @@ -182,15 +170,15 @@ input_string_block (struct lto_input_block *ib) { bool flag; - input_data_block (ib, &flag, sizeof (flag)); + lto_input_data_block (ib, &flag, sizeof (flag)); if (flag) { size_t length; char *string; - input_data_block (ib, &length, sizeof (length)); + lto_input_data_block (ib, &length, sizeof (length)); string = (char *) xcalloc (1, length + 1); - input_data_block (ib, string, length); + lto_input_data_block (ib, string, length); return string; } @@ -336,16 +324,16 @@ input_options (struct lto_input_block *ib) { size_t length, i; - input_data_block (ib, &length, sizeof (length)); + lto_input_data_block (ib, &length, sizeof (length)); for (i = 0; i < length; i++) { opt_t o; - input_data_block (ib, &o.type, sizeof (o.type)); - input_data_block (ib, &o.code, sizeof (o.code)); + lto_input_data_block (ib, &o.type, sizeof (o.type)); + lto_input_data_block (ib, &o.code, sizeof (o.code)); o.arg = input_string_block (ib); - input_data_block (ib, &o.value, sizeof (o.value)); + lto_input_data_block (ib, &o.value, sizeof (o.value)); VEC_safe_push (opt_t, heap, file_options, &o); } } diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index a873258..383bfc2 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -140,7 +140,10 @@ input_string_internal (struct data_in *data_in, struct lto_input_block *ib, unsigned int loc; const char *result; + /* Read the location of the string from IB. */ loc = lto_input_uleb128 (ib); + + /* Get the string stored at location LOC in DATA_IN->STRINGS. */ LTO_INIT_INPUT_BLOCK (str_tab, data_in->strings, loc, data_in->strings_len); len = lto_input_uleb128 (&str_tab); *rlen = len; @@ -191,10 +194,24 @@ input_identifier (struct data_in *data_in, struct lto_input_block *ib) return get_identifier_with_length (ptr, len); } + +/* Read LENGTH bytes from STREAM to ADDR. */ + +void +lto_input_data_block (struct lto_input_block *ib, void *addr, size_t length) +{ + size_t i; + unsigned char *const buffer = (unsigned char *const) addr; + + for (i = 0; i < length; i++) + buffer[i] = lto_input_1_unsigned (ib); +} + + /* Read a NULL terminated string from the string table in DATA_IN. */ -static const char * -input_string (struct data_in *data_in, struct lto_input_block *ib) +const char * +lto_input_string (struct data_in *data_in, struct lto_input_block *ib) { unsigned int len; const char *ptr; @@ -275,7 +292,7 @@ lto_input_location (struct lto_input_block *ib, struct data_in *data_in) { expanded_location xloc; - xloc.file = input_string (data_in, ib); + xloc.file = lto_input_string (data_in, ib); if (xloc.file == NULL) return UNKNOWN_LOCATION; @@ -2307,7 +2324,7 @@ lto_input_ts_translation_unit_decl_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, tree expr) { - TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (input_string (data_in, ib)); + TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (lto_input_string (data_in, ib)); VEC_safe_push (tree, gc, all_translation_units, expr); } @@ -2590,7 +2607,7 @@ lto_get_builtin_tree (struct lto_input_block *ib, struct data_in *data_in) else gcc_unreachable (); - asmname = input_string (data_in, ib); + asmname = lto_input_string (data_in, ib); if (asmname) set_builtin_user_assembler_name (result, asmname); diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index ba916b6..4857947 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -154,11 +154,11 @@ destroy_output_block (struct output_block *ob) table in OB. The string might or might not include a trailing '\0'. Then put the index onto the INDEX_STREAM. */ -static void -output_string_with_length (struct output_block *ob, - struct lto_output_stream *index_stream, - const char *s, - unsigned int len) +void +lto_output_string_with_length (struct output_block *ob, + struct lto_output_stream *index_stream, + const char *s, + unsigned int len) { struct string_slot **slot; struct string_slot s_slot; @@ -170,6 +170,9 @@ output_string_with_length (struct output_block *ob, s_slot.len = len; s_slot.slot_num = 0; + /* Indicate that this is not a NULL string. */ + lto_output_uleb128_stream (index_stream, 0); + slot = (struct string_slot **) htab_find_slot (ob->string_hash_table, &s_slot, INSERT); if (*slot == NULL) @@ -200,16 +203,14 @@ output_string_with_length (struct output_block *ob, /* Output the '\0' terminated STRING to the string table in OB. Then put the index onto the INDEX_STREAM. */ -static void -output_string (struct output_block *ob, - struct lto_output_stream *index_stream, - const char *string) +void +lto_output_string (struct output_block *ob, + struct lto_output_stream *index_stream, + const char *string) { if (string) - { - lto_output_uleb128_stream (index_stream, 0); - output_string_with_length (ob, index_stream, string, strlen (string) + 1); - } + lto_output_string_with_length (ob, index_stream, string, + strlen (string) + 1); else lto_output_uleb128_stream (index_stream, 1); } @@ -224,12 +225,9 @@ output_string_cst (struct output_block *ob, tree string) { if (string) - { - lto_output_uleb128_stream (index_stream, 0); - output_string_with_length (ob, index_stream, - TREE_STRING_POINTER (string), - TREE_STRING_LENGTH (string)); - } + lto_output_string_with_length (ob, index_stream, + TREE_STRING_POINTER (string), + TREE_STRING_LENGTH (string )); else lto_output_uleb128_stream (index_stream, 1); } @@ -244,12 +242,9 @@ output_identifier (struct output_block *ob, tree id) { if (id) - { - lto_output_uleb128_stream (index_stream, 0); - output_string_with_length (ob, index_stream, - IDENTIFIER_POINTER (id), - IDENTIFIER_LENGTH (id)); - } + lto_output_string_with_length (ob, index_stream, + IDENTIFIER_POINTER (id), + IDENTIFIER_LENGTH (id)); else lto_output_uleb128_stream (index_stream, 1); } @@ -611,13 +606,13 @@ lto_output_location (struct output_block *ob, location_t loc) if (loc == UNKNOWN_LOCATION) { - output_string (ob, ob->main_stream, NULL); + lto_output_string (ob, ob->main_stream, NULL); return; } xloc = expand_location (loc); - output_string (ob, ob->main_stream, xloc.file); + lto_output_string (ob, ob->main_stream, xloc.file); output_sleb128 (ob, xloc.line); output_sleb128 (ob, xloc.column); output_sleb128 (ob, xloc.sysp); @@ -1155,7 +1150,7 @@ static void lto_output_ts_translation_unit_decl_tree_pointers (struct output_block *ob, tree expr) { - output_string (ob, ob->main_stream, TRANSLATION_UNIT_LANGUAGE (expr)); + lto_output_string (ob, ob->main_stream, TRANSLATION_UNIT_LANGUAGE (expr)); } /* Helper for lto_output_tree. Write all pointer fields in EXPR to output @@ -1320,12 +1315,12 @@ lto_output_builtin_tree (struct output_block *ob, tree expr, int ix) reader side from adding a second '*', we omit it here. */ const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr)); if (strlen (str) > 1 && str[0] == '*') - output_string (ob, ob->main_stream, &str[1]); + lto_output_string (ob, ob->main_stream, &str[1]); else - output_string (ob, ob->main_stream, NULL); + lto_output_string (ob, ob->main_stream, NULL); } else - output_string (ob, ob->main_stream, NULL); + lto_output_string (ob, ob->main_stream, NULL); } @@ -1745,7 +1740,7 @@ output_gimple_stmt (struct output_block *ob, gimple stmt) lto_output_uleb128_stream (ob->main_stream, gimple_asm_noutputs (stmt)); lto_output_uleb128_stream (ob->main_stream, gimple_asm_nclobbers (stmt)); lto_output_uleb128_stream (ob->main_stream, gimple_asm_nlabels (stmt)); - output_string (ob, ob->main_stream, gimple_asm_string (stmt)); + lto_output_string (ob, ob->main_stream, gimple_asm_string (stmt)); /* Fallthru */ case GIMPLE_ASSIGN: @@ -2342,7 +2337,7 @@ write_global_references (struct output_block *ob, /* Write all the streams in an lto_out_decl_state STATE using output block OB and output stream OUT_STREAM. */ -static void +void lto_output_decl_state_streams (struct output_block *ob, struct lto_out_decl_state *state) { @@ -2356,7 +2351,7 @@ lto_output_decl_state_streams (struct output_block *ob, /* Write all the references in an lto_out_decl_state STATE using output block OB and output stream OUT_STREAM. */ -static void +void lto_output_decl_state_refs (struct output_block *ob, struct lto_output_stream *out_stream, struct lto_out_decl_state *state) diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index d8669a2..c7c865d 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -862,6 +862,9 @@ extern struct data_in *lto_data_in_create (struct lto_file_decl_data *, const char *, unsigned, VEC(ld_plugin_symbol_resolution_t,heap) *); extern void lto_data_in_delete (struct data_in *); +extern const char *lto_input_string (struct data_in *, + struct lto_input_block *); +extern void lto_input_data_block (struct lto_input_block *, void *, size_t); /* In lto-streamer-out.c */ @@ -870,6 +873,18 @@ extern struct output_block *create_output_block (enum lto_section_type); extern void destroy_output_block (struct output_block *); extern void lto_output_tree (struct output_block *, tree, bool); extern void produce_asm (struct output_block *ob, tree fn); +extern void lto_output_string (struct output_block *, + struct lto_output_stream *, + const char *); +extern void lto_output_string_with_length (struct output_block *, + struct lto_output_stream *, + const char *, + unsigned int); +void lto_output_decl_state_streams (struct output_block *, + struct lto_out_decl_state *); +void lto_output_decl_state_refs (struct output_block *, + struct lto_output_stream *, + struct lto_out_decl_state *); /* In lto-cgraph.c */