Re: Error: attempt to get value of unresolved symbol `L0'
authorNick Clifton <nickc@redhat.com>
Tue, 11 Oct 2022 14:28:10 +0000 (15:28 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 11 Oct 2022 14:29:03 +0000 (15:29 +0100)
* symbols.c (S_GET_VALUE): If the unresolved symbol is the fake
label provide a more helpful error message to the user.
(S_GET_VALUE_WHERE): Like S_GET_VALUE, but includes a file/line
number for error reporting purposes.
* symbols.h (S_GET_VALUE_WHERE): Prototype.
* write.c (fixup_segment): Use S_GET_VALUE_WHERE.

gas/ChangeLog
gas/symbols.c
gas/symbols.h
gas/write.c

index ce4e78cd92f7138a27c7efc36a4334815a99e499..0be692c6401c066782c6914023af37bd96d5be27 100644 (file)
@@ -2,6 +2,10 @@
 
        * symbols.c (S_GET_VALUE): If the unresolved symbol is the fake
        label provide a more helpful error message to the user.
+       (S_GET_VALUE_WHERE): Like S_GET_VALUE, but includes a file/line
+       number for error reporting purposes.
+       * symbols.h (S_GET_VALUE_WHERE): Prototype.
+       * write.c (fixup_segment): Use S_GET_VALUE_WHERE.
 
 2022-09-28  Nick Clifton  <nickc@redhat.com>
 
index 0aac3a434f22839939dfd9ea0b4c3776b8d9f0b8..59358c136c8c19970074f8f8175c4d16c3241791 100644 (file)
@@ -2217,7 +2217,7 @@ decode_local_label_name (char *s)
 /* Get the value of a symbol.  */
 
 valueT
-S_GET_VALUE (symbolS *s)
+S_GET_VALUE_WHERE (symbolS *s, const char * file, unsigned int line)
 {
   if (s->flags.local_symbol)
     return resolve_symbol_value (s);
@@ -2238,7 +2238,10 @@ S_GET_VALUE (symbolS *s)
          || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
        {
          if (strcmp (S_GET_NAME (s), FAKE_LABEL_NAME) == 0)
-           as_bad (_("expression is too complex to be resolved"));
+           as_bad_where (file, line, _("expression is too complex to be resolved or converted into relocations"));
+         else if (file != NULL)
+           as_bad_where (file, line, _("attempt to get value of unresolved symbol `%s'"),
+                         S_GET_NAME (s));
          else
            as_bad (_("attempt to get value of unresolved symbol `%s'"),
                    S_GET_NAME (s));
@@ -2247,6 +2250,12 @@ S_GET_VALUE (symbolS *s)
   return (valueT) s->x->value.X_add_number;
 }
 
+valueT
+S_GET_VALUE (symbolS *s)
+{
+  return S_GET_VALUE_WHERE (s, NULL, 0);
+}
+
 /* Set the value of a symbol.  */
 
 void
index c33a28ff86b1c7098c7cc3f62b1cca8023658241..0282197e41ac218c63982e62d40d7171de08affa 100644 (file)
@@ -92,6 +92,7 @@ extern void copy_symbol_attributes (symbolS *, symbolS *);
 
 /* Get and set the values of symbols.  These used to be macros.  */
 extern valueT S_GET_VALUE (symbolS *);
+extern valueT S_GET_VALUE_WHERE (symbolS *, const char *, unsigned int);
 extern void S_SET_VALUE (symbolS *, valueT);
 
 extern int S_IS_FUNCTION (symbolS *);
index 30f6c1109088686416b9a047578141e75c819ebe..1c1b810422259b5d399f2e09111a6fdf401c2743 100644 (file)
@@ -972,16 +972,18 @@ fixup_segment (fixS *fixP, segT this_segment)
       if (fixP->fx_subsy != NULL)
        {
          segT sub_symbol_segment;
+
          resolve_symbol_value (fixP->fx_subsy);
          sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
+
          if (fixP->fx_addsy != NULL
              && sub_symbol_segment == add_symbol_segment
              && !S_FORCE_RELOC (fixP->fx_addsy, 0)
              && !S_FORCE_RELOC (fixP->fx_subsy, 0)
              && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
            {
-             add_number += S_GET_VALUE (fixP->fx_addsy);
-             add_number -= S_GET_VALUE (fixP->fx_subsy);
+             add_number += S_GET_VALUE_WHERE (fixP->fx_addsy, fixP->fx_file, fixP->fx_line);
+             add_number -= S_GET_VALUE_WHERE (fixP->fx_subsy, fixP->fx_file, fixP->fx_line);
              fixP->fx_offset = add_number;
              fixP->fx_addsy = NULL;
              fixP->fx_subsy = NULL;
@@ -994,7 +996,7 @@ fixup_segment (fixS *fixP, segT this_segment)
                   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
                   && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
            {
-             add_number -= S_GET_VALUE (fixP->fx_subsy);
+             add_number -= S_GET_VALUE_WHERE (fixP->fx_subsy, fixP->fx_file, fixP->fx_line);
              fixP->fx_offset = add_number;
              fixP->fx_subsy = NULL;
            }
@@ -1002,7 +1004,7 @@ fixup_segment (fixS *fixP, segT this_segment)
                   && !S_FORCE_RELOC (fixP->fx_subsy, 0)
                   && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
            {
-             add_number -= S_GET_VALUE (fixP->fx_subsy);
+             add_number -= S_GET_VALUE_WHERE (fixP->fx_subsy, fixP->fx_file, fixP->fx_line);
              fixP->fx_offset = (add_number + fixP->fx_dot_value
                                 + fixP->fx_dot_frag->fr_address);
 
@@ -1035,7 +1037,7 @@ fixup_segment (fixS *fixP, segT this_segment)
          else if (sub_symbol_segment != undefined_section
                   && ! bfd_is_com_section (sub_symbol_segment)
                   && MD_APPLY_SYM_VALUE (fixP))
-           add_number -= S_GET_VALUE (fixP->fx_subsy);
+           add_number -= S_GET_VALUE_WHERE (fixP->fx_subsy, fixP->fx_file, fixP->fx_line);
        }
 
       if (fixP->fx_addsy)
@@ -1047,7 +1049,7 @@ fixup_segment (fixS *fixP, segT this_segment)
              /* This fixup was made when the symbol's segment was
                 SEG_UNKNOWN, but it is now in the local segment.
                 So we know how to do the address without relocation.  */
-             add_number += S_GET_VALUE (fixP->fx_addsy);
+             add_number += S_GET_VALUE_WHERE (fixP->fx_addsy, fixP->fx_file, fixP->fx_line);
              fixP->fx_offset = add_number;
              if (fixP->fx_pcrel)
                add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
@@ -1058,14 +1060,14 @@ fixup_segment (fixS *fixP, segT this_segment)
                   && !S_FORCE_RELOC (fixP->fx_addsy, 0)
                   && !TC_FORCE_RELOCATION_ABS (fixP))
            {
-             add_number += S_GET_VALUE (fixP->fx_addsy);
+             add_number += S_GET_VALUE_WHERE (fixP->fx_addsy, fixP->fx_file, fixP->fx_line);
              fixP->fx_offset = add_number;
              fixP->fx_addsy = NULL;
            }
          else if (add_symbol_segment != undefined_section
                   && ! bfd_is_com_section (add_symbol_segment)
                   && MD_APPLY_SYM_VALUE (fixP))
-           add_number += S_GET_VALUE (fixP->fx_addsy);
+           add_number += S_GET_VALUE_WHERE (fixP->fx_addsy, fixP->fx_file, fixP->fx_line);
        }
 
       if (fixP->fx_pcrel)