diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1bd305..f6d4bda 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-06-07 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-06 Jan Hubicka * alias.c (get_alias_set): Be ready for TYPE_CANONICAL diff --git a/gcc/varasm.c b/gcc/varasm.c index 18f3eac..d69ba5a 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -7420,14 +7420,29 @@ 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; + return f1 < f2 ? -1 : (f1 > f2 ? 1 : 0); } /* Output the definitions of all object_blocks. */ @@ -7435,7 +7450,20 @@ output_object_block_htab (object_block **slot, void *) void output_object_blocks (void) { - object_block_htab->traverse (NULL); + vec v = vNULL; + object_block *obj; + hash_table::iterator hi; + + FOR_EACH_HASH_TABLE_ELEMENT (*object_block_htab, obj, object_block *, hi) + v.safe_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); } /* This function provides a possible implementation of the