* ldlang.c (lang_output_section_statement_lookup_1): Don't cast a

unary & address operator, as that breaks GCC's strict aliasing
rules.
This commit is contained in:
DJ Delorie 2005-07-28 20:08:15 +00:00
parent bec15d1f6a
commit 8980686623
2 changed files with 12 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2005-07-28 DJ Delorie <dj@redhat.com>
* ldlang.c (lang_output_section_statement_lookup_1): Don't cast a
unary & address operator, as that breaks GCC's strict aliasing
rules.
2005-07-25 Jan Hubicka <jh@suse.cz> 2005-07-25 Jan Hubicka <jh@suse.cz>
H.J. Lu <hongjiu.lu@intel.com> H.J. Lu <hongjiu.lu@intel.com>

View file

@ -1010,6 +1010,7 @@ static lang_output_section_statement_type *
lang_output_section_statement_lookup_1 (const char *const name, int constraint) lang_output_section_statement_lookup_1 (const char *const name, int constraint)
{ {
lang_output_section_statement_type *lookup; lang_output_section_statement_type *lookup;
lang_output_section_statement_type **nextp;
lookup = lang_output_section_find_1 (name, constraint); lookup = lang_output_section_find_1 (name, constraint);
if (lookup == NULL) if (lookup == NULL)
@ -1038,9 +1039,13 @@ lang_output_section_statement_lookup_1 (const char *const name, int constraint)
lookup->update_dot_tree = NULL; lookup->update_dot_tree = NULL;
lookup->phdrs = NULL; lookup->phdrs = NULL;
/* GCC's strict aliasing rules prevent us from just casting the
address, so we store the pointer in a variable and cast that
instead. */
nextp = &lookup->next;
lang_statement_append (&lang_output_section_statement, lang_statement_append (&lang_output_section_statement,
(lang_statement_union_type *) lookup, (lang_statement_union_type *) lookup,
(lang_statement_union_type **) &lookup->next); (lang_statement_union_type **) nextp);
} }
return lookup; return lookup;
} }