From: aldyh Date: Tue, 9 Jun 2015 09:43:07 +0000 (+0000) Subject: * varasm.c (output_object_block_htab): Remove. X-Git-Tag: upstream/6.1~6549 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cd64e0fa659fb399a64713de76a44b7826fb5a29;p=platform%2Fupstream%2Flinaro-gcc.git * varasm.c (output_object_block_htab): Remove. (output_object_block_compare): New. (output_object_blocks): Sort named object_blocks before outputting them. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224274 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4897ca..7adf74a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-06-09 Aldy Hernandez + + * varasm.c (output_object_block_htab): Remove. + (output_object_block_compare): New. + (output_object_blocks): Sort named object_blocks before outputting + them. + 2015-06-09 Richard Biener PR tree-optimization/66419 diff --git a/gcc/varasm.c b/gcc/varasm.c index 95cb539..b2ad795 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -7413,14 +7413,31 @@ output_object_block (struct object_block *block) } } -/* A htab_traverse callback used to call output_object_block for - each member of object_block_htab. */ +/* A callback for qsort to compare object_blocks. */ -int -output_object_block_htab (object_block **slot, void *) +static int +output_object_block_compare (const void *x, const void *y) { - output_object_block (*slot); - return 1; + object_block *p1 = *(object_block * const*)x; + object_block *p2 = *(object_block * const*)y; + + if (p1->sect->common.flags & SECTION_NAMED + && !(p2->sect->common.flags & SECTION_NAMED)) + return 1; + + if (!(p1->sect->common.flags & SECTION_NAMED) + && p2->sect->common.flags & SECTION_NAMED) + return -1; + + if (p1->sect->common.flags & SECTION_NAMED + && p2->sect->common.flags & SECTION_NAMED) + return strcmp (p1->sect->named.name, p2->sect->named.name); + + unsigned f1 = p1->sect->common.flags; + unsigned f2 = p2->sect->common.flags; + if (f1 == f2) + return 0; + return f1 < f2 ? -1 : 1; } /* Output the definitions of all object_blocks. */ @@ -7428,7 +7445,23 @@ output_object_block_htab (object_block **slot, void *) void output_object_blocks (void) { - object_block_htab->traverse (NULL); + vec v; + v.create (object_block_htab->elements ()); + object_block *obj; + hash_table::iterator hi; + + FOR_EACH_HASH_TABLE_ELEMENT (*object_block_htab, obj, object_block *, hi) + v.quick_push (obj); + + /* Sort them in order to output them in a deterministic manner, + otherwise we may get .rodata sections in different orders with + and without -g. */ + v.qsort (output_object_block_compare); + unsigned i; + FOR_EACH_VEC_ELT (v, i, obj) + output_object_block (obj); + + v.release (); } /* This function provides a possible implementation of the