diff options
Diffstat (limited to 'src/cmd/8a/a.y')
-rw-r--r-- | src/cmd/8a/a.y | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/cmd/8a/a.y b/src/cmd/8a/a.y index 246643427..13ccc985b 100644 --- a/src/cmd/8a/a.y +++ b/src/cmd/8a/a.y @@ -33,6 +33,7 @@ #include <stdio.h> /* if we don't, bison will, and a.h re-#defines getc */ #include <libc.h> #include "a.h" +#include "../../pkg/runtime/funcdata.h" %} %union { Sym *sym; @@ -54,7 +55,7 @@ %left '*' '/' '%' %token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4 %token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG LTYPEXC -%token <lval> LTYPEX LCONST LFP LPC LSB +%token <lval> LTYPEX LTYPEPC LTYPEF LCONST LFP LPC LSB %token <lval> LBREG LLREG LSREG LFREG LXREG %token <dval> LFCONST %token <sval> LSCONST LSP @@ -63,7 +64,7 @@ %type <con2> con2 %type <gen> mem imm imm2 reg nam rel rem rim rom omem nmem %type <gen2> nonnon nonrel nonrem rimnon rimrem remrim -%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10 +%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10 spec11 spec12 %% prog: | prog @@ -118,6 +119,8 @@ inst: | LTYPEG spec8 { outcode($1, &$2); } | LTYPEXC spec9 { outcode($1, &$2); } | LTYPEX spec10 { outcode($1, &$2); } +| LTYPEPC spec11 { outcode($1, &$2); } +| LTYPEF spec12 { outcode($1, &$2); } nonnon: { @@ -307,6 +310,26 @@ spec10: /* PINSRD */ $$.to.offset = $1.offset; } +spec11: /* PCDATA */ + rim ',' rim + { + if($1.type != D_CONST || $3.type != D_CONST) + yyerror("arguments to PCDATA must be integer constants"); + $$.from = $1; + $$.to = $3; + } + +spec12: /* FUNCDATA */ + rim ',' rim + { + if($1.type != D_CONST) + yyerror("index for FUNCDATA must be integer constant"); + if($3.type != D_EXTERN && $3.type != D_STATIC) + yyerror("value for FUNCDATA must be symbol reference"); + $$.from = $1; + $$.to = $3; + } + rem: reg | mem @@ -448,12 +471,12 @@ con2: LCONST { $$.v1 = $1; - $$.v2 = 0; + $$.v2 = ArgsSizeUnknown; } | '-' LCONST { $$.v1 = -$2; - $$.v2 = 0; + $$.v2 = ArgsSizeUnknown; } | LCONST '-' LCONST { |