diff options
Diffstat (limited to 'src/cmd/6a/a.y')
-rw-r--r-- | src/cmd/6a/a.y | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/src/cmd/6a/a.y b/src/cmd/6a/a.y index 42af65e35..ed72916b2 100644 --- a/src/cmd/6a/a.y +++ b/src/cmd/6a/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; @@ -49,8 +50,8 @@ %left '+' '-' %left '*' '/' '%' %token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4 -%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPEG -%token <lval> LTYPES LTYPEM LTYPEI LTYPEXC LTYPEX LTYPERT +%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPEG LTYPEPC +%token <lval> LTYPES LTYPEM LTYPEI LTYPEXC LTYPEX LTYPERT LTYPEF %token <lval> LCONST LFP LPC LSB %token <lval> LBREG LLREG LSREG LFREG LMREG LXREG %token <dval> LFCONST @@ -58,8 +59,9 @@ %token <sym> LNAME LLAB LVAR %type <lval> con con2 expr pointer offset %type <gen> mem imm imm2 reg nam rel rem rim rom omem nmem -%type <gen2> nonnon nonrel nonrem rimnon rimrem remrim spec10 spec11 +%type <gen2> nonnon nonrel nonrem rimnon rimrem remrim %type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 +%type <gen2> spec10 spec11 spec12 spec13 %% prog: | prog @@ -115,6 +117,8 @@ inst: | LTYPEX spec9 { outcode($1, &$2); } | LTYPERT spec10 { outcode($1, &$2); } | LTYPEG spec11 { outcode($1, &$2); } +| LTYPEPC spec12 { outcode($1, &$2); } +| LTYPEF spec13 { outcode($1, &$2); } nonnon: { @@ -308,6 +312,26 @@ spec11: /* GLOBL */ $$.to = $5; } +spec12: /* PCDATA */ + rim ',' rim + { + if($1.type != D_CONST || $3.type != D_CONST) + yyerror("arguments to PCDATA must be integer constants"); + $$.from = $1; + $$.to = $3; + } + +spec13: /* 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 @@ -494,6 +518,15 @@ omem: $$.scale = $8; checkscale($$.scale); } +| con '(' LLREG ')' '(' LSREG '*' con ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + $$.index = $6; + $$.scale = $8; + checkscale($$.scale); + } | '(' LLREG ')' { $$ = nullgen; @@ -597,11 +630,13 @@ con: con2: LCONST { - $$ = $1 & 0xffffffffLL; + $$ = ($1 & 0xffffffffLL) + + ((vlong)ArgsSizeUnknown << 32); } | '-' LCONST { - $$ = -$2 & 0xffffffffLL; + $$ = (-$2 & 0xffffffffLL) + + ((vlong)ArgsSizeUnknown << 32); } | LCONST '-' LCONST { |