* ldlang.c (lang_output_section_statement_lookup_1): Don't cast a
authorDJ Delorie <dj@redhat.com>
Thu, 28 Jul 2005 20:08:15 +0000 (20:08 +0000)
committerDJ Delorie <dj@redhat.com>
Thu, 28 Jul 2005 20:08:15 +0000 (20:08 +0000)
unary & address operator, as that breaks GCC's strict aliasing
rules.

ld/ChangeLog
ld/ldlang.c

index 460fb39..d218b95 100644 (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>
            H.J. Lu  <hongjiu.lu@intel.com>
 
index dc8aa14..7cdb7c8 100644 (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_type *lookup;
+  lang_output_section_statement_type **nextp;
 
   lookup = lang_output_section_find_1 (name, constraint);
   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->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_union_type *) lookup,
-                            (lang_statement_union_type **) &lookup->next);
+                            (lang_statement_union_type **) nextp);
     }
   return lookup;
 }