gas/symbols: introduce md_resolve_symbol
authorDmitry Selyutin <ghostmansd@gmail.com>
Mon, 18 Jul 2022 09:46:53 +0000 (12:46 +0300)
committerAlan Modra <amodra@gmail.com>
Wed, 20 Jul 2022 02:50:14 +0000 (12:20 +0930)
Assuming GMSD is a special operand, marked as O_md1, the code:

    .set VREG, GMSD
    .set REG, VREG
    extsw REG, 2

...fails upon attempts to resolve the value of the symbol. This happens
since machine-dependent values are not handled in the giant op switch.
We introduce a custom md_resolve_symbol macro; the ports can use this
macro to customize the behavior when resolve_symbol_value hits O_md
operand.

gas/doc/internals.texi
gas/symbols.c

index 9221801f635004cc2e5fff58600d04ddb985975b..59b2d3acee59fe31eab6cf8e61a11cbca937c3b0 100644 (file)
@@ -1034,6 +1034,12 @@ Predefined symbols with fixed values, such as register names or condition
 codes, are typically entered directly into the symbol table when @code{md_begin}
 is called.  One argument is passed, a @code{char *} for the symbol.
 
+@item md_resolve_symbol
+@cindex md_resolve_symbol
+If this macro is defined, GAS will call it upon resolving machine-dependent
+symbols (that is, for any symbol with operation O_md1..O_md32 inclusively).
+If this functions returns zero, then the symbol could not be resolved.
+
 @item md_operand
 @cindex md_operand
 GAS will call this function with one argument, an @code{expressionS}
index 6904a3102cf2f115dcd826954c5a691748ba90a3..81383a5e8cb0ade6687c648cd974be5c83bf165b 100644 (file)
@@ -1408,6 +1408,45 @@ resolve_symbol_value (symbolS *symp)
          BAD_CASE (op);
          break;
 
+       case O_md1:
+       case O_md2:
+       case O_md3:
+       case O_md4:
+       case O_md5:
+       case O_md6:
+       case O_md7:
+       case O_md8:
+       case O_md9:
+       case O_md10:
+       case O_md11:
+       case O_md12:
+       case O_md13:
+       case O_md14:
+       case O_md15:
+       case O_md16:
+       case O_md17:
+       case O_md18:
+       case O_md19:
+       case O_md20:
+       case O_md21:
+       case O_md22:
+       case O_md23:
+       case O_md24:
+       case O_md25:
+       case O_md26:
+       case O_md27:
+       case O_md28:
+       case O_md29:
+       case O_md30:
+       case O_md31:
+       case O_md32:
+#ifdef md_resolve_symbol
+         resolved = md_resolve_symbol (symp, &final_val, &final_seg);
+         if (resolved)
+           break;
+#endif
+         goto exit_dont_set_value;
+
        case O_absent:
          final_val = 0;
          /* Fall through.  */