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