summaryrefslogtreecommitdiff
path: root/src/cmd/8a/a.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/8a/a.y')
-rw-r--r--src/cmd/8a/a.y31
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
{