V9/jerq/sgs/ld/y.tab.c
# line 2 "ld.yac"
static char ID[] = "@(#) ld.yac: 1.8 12/1/83";
#include "system.h"
#include <stdio.h>
#include "bool.h"
#include "attributes.h"
#include "list.h"
#include "structs.h"
#if TRVEC
#include "tv.h"
#include "ldtv.h"
#endif
#include "extrns.h"
#include "sgs.h"
#include "sgsmacros.h"
#include "ldmacros.h"
extern char inline[];
/*
*
* There is a very important variable, called
*
* in_y_exp
*
* that is used to help recognize filenames.
*
* The problems is this: a UNIX filename can contain
* virtually any character, and the nodes in the pathname
* are separated by slashes. Unfortunately, slashes also
* occur in expressions, comments, and the /= assignment
* operator. Moreover, the LEX rules ignore white space,
* which is important to knowing where one filename stops
* and the next begins.
*
* The resolution is this. Lex doesn't know enough alone to
* recognize a filename; so we give it some help. Whenever we
* are in an expression, we set in_y_exp to TRUE, and then lex knows
* that any slash is a slash, and should not be kept as part of
* a filename. a/b is a divided by b, not the file a/b.
*
* Consequently, whenever a slash must be kept as a slash,
* in_y_exp will be TRUE. Otherwise, it will be FALSE, and the
* lexical analyzer will treat a/b as a filename.
*/
int in_y_exp;
static secnum; /* number of sections */
static char *fnamptr;
static int nsecspcs, fillflag; /* parsing status flags */
static ACTITEM *aiptr, *afaiptr, *grptr; /* pointers to action items */
extern char *curfilnm; /* name of current ifile */
#if TRVEC
static TVASSIGN *tvslotn, /* ptr to last in list of tv slots */
*slotptr; /* temp for traversing list */
#endif
static int tempi; /* temporary int */
/*eject*/
# line 167 "ld.yac"
typedef union {
int ivalue; /* yylval values */
char *sptr;
long *lptr;
ACTITEM *aitem; /* nonterminal values */
ENODE *enode;
} YYSTYPE;
# define NAME 2
# define LONGINT 3
# define INT 4
# define ALIGN 5
# define DOT 6
# define LEN 7
# define MEMORY 8
# define ORG 9
# define REGIONS 10
# define SECTIONS 11
# define PHY 12
# define AND 13
# define ANDAND 14
# define BNOT 15
# define COLON 16
# define COMMA 17
# define DIV 18
# define EQ 19
# define EQEQ 20
# define GE 21
# define GT 23
# define LBRACE 24
# define LE 26
# define LPAREN 27
# define LSHIFT 28
# define LT 29
# define MINUS 30
# define MULT 31
# define NE 32
# define NOT 33
# define OR 34
# define OROR 35
# define PC 36
# define PLUS 37
# define RBRACE 38
# define RPAREN 39
# define RSHIFT 40
# define SEMICOL 41
# define DIVEQ 42
# define MINUSEQ 43
# define MULTEQ 44
# define PLUSEQ 45
# define FILENAME 46
# define TV 47
# define SPARE 48
# define DSECT 49
# define NOLOAD 50
# define COPY 51
# define INFO 52
# define BLOCK 53
# define UMINUS 54
# define GROUP 55
# define RANGE 56
# define ASSIGN 57
#define yyclearin yychar = -1
#define yyerrok yyerrflag = 0
extern int yychar;
extern short yyerrflag;
#ifndef YYMAXDEPTH
#define YYMAXDEPTH 150
#endif
YYSTYPE yylval, yyval;
# define YYERRCODE 256
# line 737 "ld.yac"
/*eject*/
/*VARARGS*/
yyerror(format, a1, a2, a3, a4)
char *format;
{
/*
* Issue a parsing error message
*/
char *p;
p = sname(curfilnm); /* strip off directories from path name */
/*
* For any purely YACC-generated error, also print out the current
* line, up to the point of the error
*/
if( strcmp(format, "syntax error") == 0 )
lderror(1, lineno, p, "%s : scanned line = (%s)", format, inline, a1, a2 );
else
lderror(1, lineno, p, format, a1, a2, a3, a4);
}
short yyexca[] ={
-1, 1,
0, -1,
-2, 0,
-1, 17,
19, 123,
42, 123,
43, 123,
44, 123,
45, 123,
-2, 125,
-1, 147,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 103,
-1, 148,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 104,
-1, 149,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 105,
-1, 150,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 106,
-1, 151,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 107,
-1, 152,
20, 0,
21, 0,
23, 0,
26, 0,
29, 0,
32, 0,
-2, 108,
};
# define YYNPROD 128
# define YYLAST 404
short yyact[]={
97, 105, 17, 40, 108, 93, 20, 104, 101, 52,
99, 36, 52, 102, 207, 96, 100, 91, 92, 103,
40, 98, 106, 94, 90, 17, 36, 95, 107, 20,
51, 13, 188, 12, 15, 81, 71, 51, 167, 68,
194, 45, 127, 47, 175, 57, 18, 65, 16, 54,
135, 44, 77, 19, 75, 55, 77, 214, 215, 216,
217, 229, 53, 86, 228, 176, 227, 226, 33, 18,
14, 225, 222, 97, 105, 219, 82, 180, 93, 160,
104, 101, 39, 99, 28, 119, 102, 35, 96, 100,
91, 92, 103, 74, 98, 106, 94, 90, 209, 179,
95, 78, 79, 82, 198, 78, 79, 27, 29, 30,
31, 82, 18, 115, 110, 111, 112, 88, 197, 177,
172, 69, 66, 124, 123, 185, 134, 129, 114, 16,
113, 121, 174, 125, 211, 72, 82, 82, 84, 137,
138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 151, 152, 153, 154, 169, 80, 72,
156, 93, 170, 155, 83, 42, 25, 213, 22, 173,
97, 105, 21, 195, 92, 93, 82, 104, 101, 94,
99, 132, 178, 102, 9, 96, 100, 91, 92, 103,
239, 98, 106, 94, 90, 233, 157, 95, 230, 189,
187, 32, 186, 182, 162, 158, 122, 120, 184, 200,
117, 67, 159, 190, 129, 193, 16, 201, 93, 116,
231, 220, 64, 237, 136, 204, 20, 210, 96, 206,
91, 92, 212, 93, 240, 235, 94, 90, 221, 232,
95, 218, 223, 109, 205, 91, 92, 203, 202, 199,
181, 94, 90, 165, 164, 163, 131, 41, 87, 24,
224, 130, 168, 49, 8, 37, 49, 208, 234, 192,
183, 238, 118, 85, 41, 89, 97, 105, 191, 11,
37, 93, 171, 104, 101, 128, 99, 126, 48, 102,
50, 96, 100, 91, 92, 103, 133, 98, 46, 94,
90, 97, 43, 95, 166, 76, 93, 161, 104, 101,
73, 99, 23, 38, 102, 34, 96, 100, 91, 92,
103, 10, 98, 7, 94, 90, 97, 6, 95, 5,
4, 93, 3, 104, 101, 2, 99, 1, 236, 102,
196, 96, 100, 91, 92, 103, 70, 26, 0, 94,
90, 0, 93, 95, 104, 101, 0, 99, 0, 0,
102, 0, 96, 100, 91, 92, 103, 0, 0, 0,
94, 90, 64, 56, 95, 61, 20, 0, 0, 0,
0, 0, 62, 0, 0, 60, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 63, 0, 0,
58, 0, 0, 59 };
short yypact[]={
-1000,-1000, 23,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000, 148, 144, 256, 142, 65,-1000,-1000, 66,
-1000, 24, 18, 141,-1000, 7, 370,-1000,-1000,-1000,
-1000,-1000,-1000,-1000, 9,-1000, 195,-1000, 1,-1000,
108,-1000, 45, 120,-1000,-1000,-1000,-1000, 140,-1000,
114, 271, 255, 255, -13,-1000,-1000,-1000, 370, 370,
370, 103, 101, 370,-1000,-1000,-1000, 210,-1000,-1000,
194,-1000, 270, 47, 188,-1000, 49, 187, 97, 96,
-1000, 7,-1000, 0, 10,-1000, 219,-1000, 219,-1000,
370, 370, 370, 370, 370, 370, 370, 370, 370, 370,
370, 370, 370, 370, 370, 370, 370,-1000,-1000,-1000,
-1000,-1000,-1000, 370, 220, 157, 186, 203, 40, 185,
252,-1000, 251, 250, 260,-1000, 119,-1000, 93,-1000,
-1000,-1000,-1000, 94,-1000, 12, 92, 12, 143, 143,
-1000,-1000,-1000, 215, 215, 334, 313, 200, 200, 200,
200, 200, 200, 288, 263, 60, 38,-1000, 247, 184,
-1000,-1000, 268,-1000,-1000, 191, 86,-1000, 181, 180,
0,-1000, 267, 10, 150, 91, 77, 246, 193,-1000,
-1000, 159, 245,-1000, 244,-1000, 260, 241, 150, 11,
-1000, 59,-1000,-1000,-1000, 132, 151, 8, 238, 36,
-1000, 214, 159, 33,-1000,-1000,-1000,-1000,-1000, 180,
258,-1000,-1000,-1000, 32, 28, 27, 25, 22,-1000,
179, 213,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
236, 176, 159, 232, 217, 159,-1000, 171,-1000, 231,
-1000 };
short yypgo[]={
0, 261, 347, 36, 45, 49, 181, 32, 43, 40,
346, 44, 63, 50, 340, 55, 338, 337, 335, 332,
330, 329, 327, 323, 321, 315, 87, 35, 313, 82,
312, 310, 307, 54, 305, 304, 38, 302, 51, 41,
298, 296, 290, 288, 287, 42, 285, 282, 278, 275 };
short yyr1[]={
0, 17, 18, 18, 19, 19, 19, 19, 19, 19,
19, 19, 20, 25, 25, 26, 26, 27, 27, 16,
16, 21, 28, 28, 29, 29, 10, 10, 3, 22,
31, 31, 33, 33, 34, 34, 34, 32, 32, 35,
35, 35, 36, 30, 30, 23, 37, 37, 38, 38,
38, 41, 41, 40, 42, 8, 39, 39, 43, 11,
11, 12, 12, 13, 13, 14, 14, 14, 14, 14,
44, 44, 44, 45, 45, 45, 45, 46, 47, 47,
48, 48, 9, 9, 9, 7, 7, 7, 1, 2,
2, 2, 2, 2, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 49, 49, 49, 15, 15, 15, 15, 15,
15, 15, 15, 4, 4, 6, 6, 24 };
short yyr2[]={
0, 1, 2, 0, 1, 1, 1, 1, 1, 1,
1, 1, 4, 1, 2, 11, 1, 1, 0, 3,
0, 4, 1, 2, 11, 1, 1, 0, 3, 6,
3, 1, 2, 0, 3, 6, 4, 2, 0, 1,
3, 0, 3, 1, 0, 4, 1, 3, 1, 1,
1, 1, 3, 5, 5, 2, 6, 1, 6, 4,
0, 1, 0, 4, 0, 3, 3, 3, 3, 0,
1, 3, 0, 2, 1, 1, 1, 1, 4, 0,
1, 3, 2, 2, 0, 2, 0, 2, 4, 1,
1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 1, 1, 1, 1, 1, 1, 2, 2, 2,
4, 4, 3, 1, 1, 1, 1, 2 };
short yychk[]={
-1000, -17, -18, -19, -20, -21, -22, -23, -1, -6,
-24, 256, 10, 8, 47, 11, -4, 2, 46, 30,
6, 24, 24, -30, 3, 24, -2, 42, 19, 43,
44, 45, -6, 2, -25, -26, 2, 256, -28, -29,
2, 256, 24, -37, -38, -39, -40, -8, -43, 256,
-42, 30, 2, 55, -5, -15, 3, -4, 30, 33,
15, 5, 12, 27, 2, 38, -26, 16, 38, -29,
-10, -3, 27, -31, 48, -33, -34, 7, 56, 57,
38, -27, 17, 24, 24, 2, -12, 3, -12, -49,
37, 30, 31, 18, 36, 40, 28, 13, 34, 23,
29, 21, 26, 32, 20, 14, 35, 41, 17, 256,
-15, -15, -15, 27, 27, -5, 9, 16, 2, 38,
19, -33, 19, 27, 27, -38, -44, -45, -46, -8,
-1, 256, -6, -41, -39, -13, 5, -13, -5, -5,
-5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
-5, -5, -5, -5, -5, -5, -4, 39, 19, 9,
39, -32, 19, 3, 3, 3, -35, -36, 2, 38,
-27, -47, 27, -27, 38, -11, 53, 27, -11, 39,
39, 3, 19, 2, 17, 39, -27, 19, -7, 19,
-45, -48, 2, -39, -9, 23, -14, 27, 27, 3,
16, -27, 3, 3, -36, 3, -9, 3, 256, 39,
-27, 2, -3, 16, 49, 50, 51, 52, 3, 39,
7, -27, 39, -7, 2, 39, 39, 39, 39, 39,
19, 7, 3, 19, -27, 3, -16, 6, -27, 19,
3 };
short yydef[]={
3, -2, 1, 2, 4, 5, 6, 7, 8, 9,
10, 11, 0, 0, 44, 0, 0, -2, 126, 0,
124, 0, 0, 0, 43, 0, 0, 89, 90, 91,
92, 93, 127, 125, 0, 13, 0, 16, 0, 22,
27, 25, 33, 18, 46, 48, 49, 50, 0, 57,
0, 0, 62, 62, 0, 111, 115, 116, 0, 0,
0, 0, 0, 0, 123, 12, 14, 0, 21, 23,
0, 26, 0, 0, 0, 31, 33, 0, 0, 0,
45, 0, 17, 72, 0, 55, 64, 61, 64, 88,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 112, 113, 114,
117, 118, 119, 0, 0, 0, 0, 0, 0, 38,
0, 32, 0, 0, 41, 47, 18, 70, 79, 74,
75, 76, 77, 18, 51, 60, 0, 60, 94, 95,
96, 97, 98, 99, 100, 101, 102, -2, -2, -2,
-2, -2, -2, 109, 110, 0, 0, 122, 0, 0,
28, 29, 0, 30, 34, 0, 18, 39, 0, 86,
0, 73, 0, 0, 84, 69, 0, 0, 0, 120,
121, 18, 0, 37, 0, 36, 0, 0, 84, 0,
71, 18, 80, 52, 53, 0, 0, 0, 0, 0,
54, 0, 18, 0, 40, 42, 56, 85, 87, 86,
0, 82, 83, 58, 0, 0, 0, 0, 0, 63,
0, 0, 35, 78, 81, 65, 66, 67, 68, 59,
0, 0, 18, 0, 20, 18, 15, 0, 24, 0,
19 };
#ifndef lint
static char yaccpar_sccsid[] = "@(#)yaccpar 1.6 88/02/08 SMI"; /* from UCB 4.1 83/02/11 */
#endif
#
# define YYFLAG -1000
# define YYERROR goto yyerrlab
# define YYACCEPT return(0)
# define YYABORT return(1)
/* parser for yacc output */
#ifdef YYDEBUG
int yydebug = 0; /* 1 for debugging */
#endif
YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
int yychar = -1; /* current input token number */
int yynerrs = 0; /* number of errors */
short yyerrflag = 0; /* error recovery flag */
yyparse() {
short yys[YYMAXDEPTH];
short yyj, yym;
register YYSTYPE *yypvt;
register short yystate, *yyps, yyn;
register YYSTYPE *yypv;
register short *yyxi;
yystate = 0;
yychar = -1;
yynerrs = 0;
yyerrflag = 0;
yyps= &yys[-1];
yypv= &yyv[-1];
yystack: /* put a state and value onto the stack */
#ifdef YYDEBUG
if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
#endif
if( ++yyps>= &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
*yyps = yystate;
++yypv;
*yypv = yyval;
yynewstate:
yyn = yypact[yystate];
if( yyn<= YYFLAG ) goto yydefault; /* simple state */
if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
yychar = -1;
yyval = yylval;
yystate = yyn;
if( yyerrflag > 0 ) --yyerrflag;
goto yystack;
}
yydefault:
/* default state action */
if( (yyn=yydef[yystate]) == -2 ) {
if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
/* look through exception table */
for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
while( *(yyxi+=2) >= 0 ){
if( *yyxi == yychar ) break;
}
if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
}
if( yyn == 0 ){ /* error */
/* error ... attempt to resume parsing */
switch( yyerrflag ){
case 0: /* brand new error */
yyerror( "syntax error" );
yyerrlab:
++yynerrs;
case 1:
case 2: /* incompletely recovered error ... try again */
yyerrflag = 3;
/* find a state where "error" is a legal shift action */
while ( yyps >= yys ) {
yyn = yypact[*yyps] + YYERRCODE;
if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
yystate = yyact[yyn]; /* simulate a shift of "error" */
goto yystack;
}
yyn = yypact[*yyps];
/* the current yyps has no shift onn "error", pop stack */
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
#endif
--yyps;
--yypv;
}
/* there is no state on the stack with an error shift ... abort */
yyabort:
return(1);
case 3: /* no shift yet; clobber input char */
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery discards char %d\n", yychar );
#endif
if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
yychar = -1;
goto yynewstate; /* try again in the same state */
}
}
/* reduction by production yyn */
#ifdef YYDEBUG
if( yydebug ) printf("reduce %d\n",yyn);
#endif
yyps -= yyr2[yyn];
yypvt = yypv;
yypv -= yyr2[yyn];
yyval = yypv[1];
yym=yyn;
/* consult goto table to find next state */
yyn = yyr1[yyn];
yyj = yypgo[yyn] + *yyps + 1;
if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
switch(yym){
case 1:
# line 178 "ld.yac"
; break;
case 3:
# line 182 "ld.yac"
; break;
case 8:
# line 188 "ld.yac"
{
bldexp(yypvt[-0].enode, &explist);
} break;
case 9:
# line 191 "ld.yac"
{
filespec(yypvt[-0].sptr);
} break;
case 11:
# line 195 "ld.yac"
{
for( tempi = lineno; tempi == lineno; )
yychar = yylex();
yyerrok;
yyclearin;
} break;
case 12:
# line 203 "ld.yac"
{
#if USEREGIONS == 0
yyerror("REGIONS command not allowed in a %s load", SGS);
#endif
} break;
case 14:
# line 211 "ld.yac"
; break;
case 15:
# line 213 "ld.yac"
{
long *orgp, *lenp, *vaddrp, vzero;
REGION *rgnp;
orgp = yypvt[-6].lptr;
lenp = yypvt[-2].lptr;
if (*lenp <= 0)
yyerror("region %s has invalid length",yypvt[-10].sptr);
if ( (vaddrp = yypvt[-0].lptr) == NULL )
vzero = *orgp;
else
vzero = *orgp - *vaddrp;
if ( (vzero & 0xfL) != 0 ) {
yyerror("virtual 0 (paddr %.1lx) of region %s is not a multiple of 16",
vzero, yypvt[-10].sptr);
vzero &= ~0xfL;
}
rgnp = (REGION *) myalloc(sizeof(REGION));
rgnp->rgorig = *orgp;
rgnp->rglength = *lenp;
rgnp->rgvaddr = (vaddrp == NULL) ? 0L : *vaddrp;
if( (rgnp->rgvaddr + rgnp->rglength) > 0x10000L ) {
yyerror("addresses of region %s (vaddr=%.1lx len=%.1lx) exceed 64K",
yypvt[-10].sptr, rgnp->rgvaddr, *lenp);
rgnp->rglength = 0x10000L - rgnp->rgvaddr;
}
strncpy( rgnp->rgname, yypvt[-10].sptr, 8 );
listadd(l_REG, ®list, rgnp);
} break;
case 16:
# line 241 "ld.yac"
{
yyerror("REGIONS specification ignored");
} break;
case 18:
# line 248 "ld.yac"
; break;
case 19:
# line 250 "ld.yac"
{
if ( *(long *) yypvt[-0].lptr > 0xffffL ) {
yyerror("virtual address %.1lx exceeds 0xffff: truncated to %.1lx",
*(long *) yypvt[-0].lptr, *(long *) yypvt[-0].lptr & 0xffffL);
*(long *) yypvt[-0].lptr &= 0xffffL;
}
yyval.lptr = yypvt[-0].lptr;
} break;
case 20:
# line 259 "ld.yac"
{
yyval.lptr = NULL;
} break;
case 21:
# line 264 "ld.yac"
; break;
case 23:
# line 268 "ld.yac"
; break;
case 24:
# line 270 "ld.yac"
{
long *orgp, *lenp;
MEMTYPE *memp;
orgp = yypvt[-5].lptr;
lenp = yypvt[-1].lptr;
memp = (MEMTYPE *) myalloc(sizeof(MEMTYPE));
memp->mtorig = *orgp;
memp->mtlength = *lenp;
memp->mtattr = yypvt[-9].ivalue;
strncpy( memp->mtname, yypvt[-10].sptr, 8 );
listadd(l_MEM, &memlist, memp);
} break;
case 25:
# line 282 "ld.yac"
{
yyerror("MEMORY specification ignored");
} break;
case 26:
# line 287 "ld.yac"
{
yyval.ivalue = yypvt[-0].ivalue;
} break;
case 27:
# line 290 "ld.yac"
{ /* empty */
yyval.ivalue = att_R | att_W | att_X | att_I;
} break;
case 28:
# line 295 "ld.yac"
{
int attflgs;
char *p;
attflgs = 0;
for( p = yypvt[-1].sptr; *p; p++ )
switch (*p) {
case 'R': attflgs |= att_R; break;
case 'W': attflgs |= att_W; break;
case 'X': attflgs |= att_X; break;
case 'I': attflgs |= att_I; break;
default: yyerror("bad attribute value in MEMORY directive: %c", *p);
}
yyval.ivalue = attflgs;
} break;
case 29:
# line 311 "ld.yac"
{
#if TRVEC
int length;
tvspec.tvinflnm = curfilnm;
tvspec.tvinlnno = lineno;
length = 0;
for( slotptr = tvslot1; slotptr != NULL; slotptr = slotptr->nxtslot ) {
TVASSIGN *slotptr2;
length = max(length, slotptr->slot);
for (slotptr2 = tvslot1; slotptr2 != slotptr; slotptr2 = slotptr2->nxtslot )
if (slotptr2->slot == slotptr->slot) {
lderror(1,0,NULL,
"function %s assigned to tv slot %d which is already in use", slotptr->funname, slotptr->slot);
break;
}
}
if( tvspec.tvlength > 0 ) {
if( length > tvspec.tvlength ) {
yyerror("ASSIGN slot %d exceeds total TV size of %d",
length, tvspec.tvlength);
tvspec.tvlength = length;
}
if( tvspec.tvrange[1] > tvspec.tvlength ) {
yyerror("RANGE value %d exceeds total TV size of %d",
tvspec.tvrange[1], tvspec.tvlength);
tvspec.tvlength = tvspec.tvrange[1];
}
}
else
tvspec.tvlength = max(length, tvspec.tvrange[1]);
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 30:
# line 349 "ld.yac"
{
#if TRVEC
tvspec.tvosptr = (OUTSECT *) ((unsigned) *(long *) yypvt[-0].lptr);
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 34:
# line 363 "ld.yac"
{
#if TRVEC
if( tvspec.tvlength > 0 )
yyerror("illegal multiple LENGTH fields in the TV directive");
tvspec.tvlength = (int) (*(long *) yypvt[-0].lptr);
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 35:
# line 372 "ld.yac"
{
#if TRVEC
if( tvspec.tvrange[1] > 0 )
yyerror("illegal multiple RANGE fields in the TV directive");
if( tvspec.tvrange[0] < 0 || tvspec.tvrange[0] > tvspec.tvrange[1] )
yyerror("illegal RANGE syntax: r[0]<0 or r[0]>r[1]");
else {
tvspec.tvrange[0] = (int) (*(long *) yypvt[-3].lptr);
tvspec.tvrange[1] = (int) (*(long *) yypvt[-1].lptr);
}
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 37:
# line 389 "ld.yac"
{
#if TRVEC
#if FLEXNAMES
tvspec.tvfnfill = savefn(yypvt[-0].sptr);
#else
strncpy(tvspec.tvfnfill, yypvt[-0].sptr, 8 );
#endif
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 42:
# line 407 "ld.yac"
{
#if TRVEC
if( (int) (*(long *) yypvt[-0].lptr) == 0 )
yyerror("illegal ASSIGN slot number (0)");
if( tvslot1 == NULL )
tvslot1 = tvslotn = (TVASSIGN *) myalloc(sizeof(TVASSIGN));
else
tvslotn = tvslotn->nxtslot = (TVASSIGN *) myalloc(sizeof(TVASSIGN));
#if FLEXNAMES
tvslotn->funname = savefn(yypvt[-2].sptr);
#else
strncpy(tvslotn->funname, yypvt[-2].sptr, 8);
#endif
tvslotn->slot = (int) (*(long *) yypvt[-0].lptr);
tvslotn->nxtslot = NULL;
#else
yyerror("usage of unimplemented syntax");
#endif
} break;
case 43:
# line 428 "ld.yac"
{
long org;
org = *(long *) yypvt[-0].lptr;
#if TRVEC
chktvorg(org, &(tvspec.tvbndadr));
#endif
} break;
case 45:
# line 438 "ld.yac"
; break;
case 53:
# line 454 "ld.yac"
{
listadd(l_AI,&bldoutsc,grptr);
grptr = NULL;
} break;
case 54:
# line 460 "ld.yac"
{
if ( yypvt[-3].lptr != NULL && yypvt[-2].lptr != NULL )
yyerror("bonding excludes alignment");
grptr = dfnscngrp(AIDFNGRP, (long *)yypvt[-3].lptr, (long *)yypvt[-2].lptr, (long *)yypvt[-1].lptr);
strncpy( grptr->dfnscn.ainame, "*group*", 8 );
} break;
case 55:
# line 468 "ld.yac"
{
char *fp;
fp = yypvt[-0].sptr;
if (fp[0] == 'l') /* library flag */
library(fp);
else
yyerror("bad flag value in SECTIONS directive: -%s", yypvt[-0].sptr);
} break;
case 56:
# line 478 "ld.yac"
{
if (aiptr == NULL)
goto scnerr;
aiptr->dfnscn.aifill = yypvt[-1].ivalue;
aiptr->dfnscn.aifillfg = fillflag;
listadd(l_AI,grptr ? &grptr->dfnscn.sectspec : &bldoutsc,aiptr);
if (grptr && yypvt[-0].ivalue)
yyerror("can not specify an owner for section within a group");
aiptr = NULL;
} break;
case 57:
# line 488 "ld.yac"
{
if (aiptr)
yyerror("section %s not built", aiptr->dfnscn.ainame);
scnerr:
aiptr = NULL;
} break;
case 58:
# line 496 "ld.yac"
{
secnum++;
if ( OKSCNNAME(yypvt[-5].sptr) == 0 )
yyerror("%s is a reserved section name", yypvt[-5].sptr);
if ( yypvt[-4].lptr != NULL && yypvt[-3].lptr != NULL )
yyerror("bonding excludes alignment");
aiptr = dfnscngrp(AIDFNSCN, (long *)yypvt[-4].lptr, (long *)yypvt[-3].lptr, (long *)yypvt[-2].lptr);
if (grptr && aiptr->dfnscn.aibndadr != -1L)
yyerror("can not bond a section within a group");
if (grptr && aiptr->dfnscn.aialign != 0L)
yyerror("can not align a section within a group");
aiptr->dfnscn.aisctype = yypvt[-1].ivalue;
strncpy( aiptr->dfnscn.ainame, yypvt[-5].sptr, 8 );
} break;
case 59:
# line 512 "ld.yac"
{
yyval.lptr = yypvt[-1].lptr;
} break;
case 60:
# line 515 "ld.yac"
{ /* empty */
yyval.lptr = NULL;
} break;
case 61:
# line 520 "ld.yac"
{
yyval.lptr = yypvt[-0].lptr;
} break;
case 62:
# line 523 "ld.yac"
{ /* empty */
yyval.lptr = NULL;
} break;
case 63:
# line 528 "ld.yac"
{
yyval.lptr = yypvt[-1].lptr;
} break;
case 64:
# line 531 "ld.yac"
{ /* empty */
yyval.lptr = NULL;
} break;
case 65:
# line 536 "ld.yac"
{
yyval.ivalue = STYP_DSECT;
} break;
case 66:
# line 539 "ld.yac"
{
yyval.ivalue = STYP_NOLOAD;
} break;
case 67:
# line 542 "ld.yac"
{
yyval.ivalue = STYP_COPY | STYP_DSECT;
} break;
case 68:
# line 545 "ld.yac"
{
yyval.ivalue = STYP_INFO | STYP_DSECT;
} break;
case 69:
# line 548 "ld.yac"
{ /* empty */
yyval.ivalue = STYP_REG;
} break;
case 74:
# line 559 "ld.yac"
{
bldadfil( ((ACTITEM *) ldfilist.tail)->ldlbry.aifilnam, aiptr );
} break;
case 75:
# line 562 "ld.yac"
{
bldexp(yypvt[-0].enode,&aiptr->dfnscn.sectspec);
} break;
case 76:
# line 565 "ld.yac"
{
in_y_exp = 0;
yyerror("statement ignored");
for( tempi = lineno; ((int)yychar > 0) && (tempi == lineno) ; )
yychar = yylex();
if ((int) yychar <= 0)
lderror(2,0,NULL, "unexpected EOF");
yyerrok;
yyclearin;
} break;
case 77:
# line 577 "ld.yac"
{
fnamptr = savefn(yypvt[-0].sptr);
nsecspcs = 0;
bldldfil(fnamptr,0);
afaiptr = bldadfil(fnamptr,aiptr);
} break;
case 78:
# line 584 "ld.yac"
{
afaiptr->adfile.ainadscs = nsecspcs;
afaiptr->adfile.aifilflg = fillflag;
afaiptr->adfile.aifill2 = yypvt[-0].ivalue;
} break;
case 80:
# line 592 "ld.yac"
{
nsecspcs++;
bldadscn(yypvt[-0].sptr,fnamptr,aiptr);
} break;
case 81:
# line 596 "ld.yac"
{
nsecspcs++;
bldadscn(yypvt[-0].sptr,fnamptr,aiptr);
} break;
case 82:
# line 602 "ld.yac"
{
if (grptr)
strncpy( grptr->dfnscn.aiowname, yypvt[-0].sptr, 8 );
else
strncpy( aiptr->dfnscn.aiowname, yypvt[-0].sptr, 8 );
yyval.ivalue = 1;
} break;
case 83:
# line 609 "ld.yac"
{
if (grptr)
grptr->dfnscn.aiattown = yypvt[-0].ivalue;
else
aiptr->dfnscn.aiattown = yypvt[-0].ivalue;
yyval.ivalue = 1;
} break;
case 84:
# line 616 "ld.yac"
{ /* empty */
yyval.ivalue = 0;
} break;
case 85:
# line 621 "ld.yac"
{
fillflag = 1;
yyval.ivalue = (int) (*(long *)yypvt[-0].lptr);
} break;
case 86:
# line 625 "ld.yac"
{ /* empty */
fillflag = 0;
yyval.ivalue = 0;
} break;
case 87:
# line 629 "ld.yac"
{
yyerror("bad fill value");
fillflag = 0;
yyerrok;
yyclearin;
yyval.ivalue = 0;
} break;
case 88:
# line 638 "ld.yac"
{
in_y_exp = 0;
if ( yypvt[-2].ivalue == EQ )
yyval.enode = buildtree(EQ, yypvt[-3].enode, yypvt[-1].enode);
else {
ENODE *p,*ndp;
ndp = buildtree(yypvt[-2].ivalue,yypvt[-3].enode,yypvt[-1].enode);
p = (ENODE *) myalloc(sizeof(ENODE));
*p = *yypvt[-3].enode;
yyval.enode = buildtree(EQ,p,ndp);
}
} break;
case 89:
# line 652 "ld.yac"
{ yyval.ivalue = DIV; in_y_exp = TRUE; } break;
case 90:
# line 653 "ld.yac"
{ yyval.ivalue = EQ; in_y_exp = TRUE; } break;
case 91:
# line 654 "ld.yac"
{ yyval.ivalue = MINUS; in_y_exp = TRUE; } break;
case 92:
# line 655 "ld.yac"
{ yyval.ivalue = MULT; in_y_exp = TRUE; } break;
case 93:
# line 656 "ld.yac"
{ yyval.ivalue = PLUS; in_y_exp = TRUE; } break;
case 94:
# line 659 "ld.yac"
{
bop:
yyval.enode = buildtree(yypvt[-1].ivalue,yypvt[-2].enode,yypvt[-0].enode);
} break;
case 95:
# line 663 "ld.yac"
{ goto bop; } break;
case 96:
# line 664 "ld.yac"
{ goto bop; } break;
case 97:
# line 665 "ld.yac"
{ goto bop; } break;
case 98:
# line 666 "ld.yac"
{ goto bop; } break;
case 99:
# line 667 "ld.yac"
{ goto bop; } break;
case 100:
# line 668 "ld.yac"
{ goto bop; } break;
case 101:
# line 669 "ld.yac"
{ goto bop; } break;
case 102:
# line 670 "ld.yac"
{ goto bop; } break;
case 103:
# line 671 "ld.yac"
{ goto bop; } break;
case 104:
# line 672 "ld.yac"
{ goto bop; } break;
case 105:
# line 673 "ld.yac"
{ goto bop; } break;
case 106:
# line 674 "ld.yac"
{ goto bop; } break;
case 107:
# line 675 "ld.yac"
{ goto bop; } break;
case 108:
# line 676 "ld.yac"
{ goto bop; } break;
case 109:
# line 677 "ld.yac"
{ goto bop; } break;
case 110:
# line 678 "ld.yac"
{ goto bop; } break;
case 111:
# line 679 "ld.yac"
{
yyval.enode = yypvt[-0].enode;
} break;
case 114:
# line 686 "ld.yac"
{
yyerror ("semicolon required after expression");
} break;
case 115:
# line 691 "ld.yac"
{
yyval.enode = cnstnode(*(long *) yypvt[-0].lptr);
} break;
case 116:
# line 694 "ld.yac"
{
yyval.enode = yypvt[-0].enode;
} break;
case 117:
# line 697 "ld.yac"
{
yyval.enode = buildtree(UMINUS,yypvt[-0].enode,NULL);
} break;
case 118:
# line 700 "ld.yac"
{
yyval.enode = buildtree(yypvt[-1].ivalue,yypvt[-0].enode,NULL);
} break;
case 119:
# line 703 "ld.yac"
{
yyval.enode = buildtree(BNOT,yypvt[-1].ivalue,NULL);
} break;
case 120:
# line 706 "ld.yac"
{
yyval.enode = buildtree(yypvt[-3].ivalue,yypvt[-1].enode,NULL);
} break;
case 121:
# line 709 "ld.yac"
{
yyval.enode = buildtree(yypvt[-3].ivalue,yypvt[-1].enode,NULL);
} break;
case 122:
# line 712 "ld.yac"
{
yyval.enode = yypvt[-1].enode;
} break;
case 123:
# line 717 "ld.yac"
{
yyval.enode = symnode(yypvt[-0].sptr);
} break;
case 124:
# line 720 "ld.yac"
{
yyval.enode = symnode(NULL);
} break;
case 125:
# line 725 "ld.yac"
{
yyval.sptr = yypvt[-0].sptr;
} break;
case 126:
# line 728 "ld.yac"
{
yyval.sptr = yypvt[-0].sptr;
} break;
case 127:
# line 733 "ld.yac"
{
pflags(yypvt[-0].sptr, TRUE);
} break;
}
goto yystack; /* stack new state and value */
}