|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)pseudoop.c 1.1 86/02/03 Copyr 1985 Sun Micro";
3: #endif
4:
5: /*
6: * Copyright (c) 1985 by Sun Microsystems, Inc.
7: */
8:
9: #include "as.h"
10: #include "c2.h"
11:
12: /* Csect descriptor */
13: struct csect {
14: char *name_cs; /* print name */
15: long len_cs; /* Length in machine addresses, */
16: /* i.e., highest address referenced */
17: long dot_cs; /* current dot in this cs, in machine addresses */
18: short id_cs; /* UNIX a.out name for this csect */
19: short which_cs; /* our name for this csect (see below) */
20: };
21:
22: /* table used to determine node type. */
23: /*
24: * we would really like this table to be subscripted by the enumerated type
25: * opcode_t, but C cannot hack that. Order here is VERY IMPORTANT,
26: * and this table must change if the opcode order or number changes!!
27: */
28: char opcodetypes[] = {
29: 0, /* FIRST */
30: PSEUDONOCODE, /* COMMENT */
31: 0, /* LABEL */
32: PSEUDOCODE, /* LONG */
33: PSEUDOCODE, /* WORD */
34: PSEUDOCODE, /* BYTE */
35: PSEUDONOCODE, /* TEXT */
36: PSEUDONOCODE, /* DATA */
37: PSEUDONOCODE, /* DATA1 */
38: PSEUDONOCODE, /* DATA2 */
39: PSEUDONOCODE, /* BSS */
40: PSEUDONOCODE, /* GLOBL */
41: PSEUDONOCODE, /* COMM */
42: PSEUDOCODE, /* EVEN */
43: PSEUDOCODE, /* ALIGN */
44: PSEUDOCODE, /* ASCIZ */
45: PSEUDOCODE, /* ASCII */
46: PSEUDOCODE, /* SINGLE */
47: PSEUDOCODE, /* DOUBLE */
48: PSEUDONOCODE, /* STABS */
49: PSEUDONOCODE, /* STABD */
50: PSEUDONOCODE, /* STABN */
51: PSEUDOCODE, /* SKIP */
52: PSEUDONOCODE, /* LCOMM */
53: PSEUDONOCODE, /* CPID */
54: INSTRTYPE|BRANCHTYPE, /* CSWITCH */
55: INSTRTYPE|BRANCHTYPE, /* FSWITCH */
56: INSTRTYPE|BRANCHTYPE, /* BRANCH */
57: INSTRTYPE, /* MOVE */
58: INSTRTYPE, /* MOVEM */
59: INSTRTYPE|BRANCHTYPE, /* EXIT */
60: INSTRTYPE|BRANCHTYPE, /* DBRA */
61: INSTRTYPE, /* CALL */
62: INSTRTYPE|BRANCHTYPE|JUMPTYPE, /* JUMP */
63: INSTRTYPE|BRANCHTYPE|JUMPTYPE, /* DJMP */
64: INSTRTYPE, /* LINK */
65: INSTRTYPE, /* CMP */
66: INSTRTYPE, /* PEA */
67: INSTRTYPE, /* ADD */
68: INSTRTYPE, /* AND */
69: INSTRTYPE, /* EXT */
70: INSTRTYPE, /* OR */
71: INSTRTYPE, /* TST */
72: INSTRTYPE, /* ASL */
73: INSTRTYPE, /* ASR */
74: INSTRTYPE, /* SUB */
75: INSTRTYPE, /* UNLK */
76: INSTRTYPE, /* LEA */
77: INSTRTYPE, /* CLR */
78: INSTRTYPE, /* BOP */
79: INSTRTYPE, /* EOR */
80: INSTRTYPE, /* FTST */
81: INSTRTYPE, /* OTHER */
82: };
83: extern struct sym_bkt *dot_bkt;
84:
85: struct csect csects[] = {
86: ".text", 0,0,0,C_TEXT, /* text csect */
87: ".data", 0,0,0,C_DATA, /* data csect */
88: ".data1",0,0,0,C_DATA1, /* data csect */
89: ".data2",0,0,0,C_DATA2, /* data csect */
90: ".bss", 0,0,0, C_BSS, /* uninitialized csect */
91: 0
92: } ;
93:
94: struct csect *cur_csect = &(csects[0]);/* ptr to current csect */
95: struct csect *all_csects[] = { 0 ,
96: &(csects[0]), &(csects[1]), &(csects[2]), &(csects[3]), &(csects[4])
97: };
98:
99: short cur_csect_name = C_TEXT;
100:
101: void
102: init_csects(){
103: register struct sym_bkt *sbp;
104: struct csect *csp;
105: for (csp = csects; csp->name_cs != NULL; csp++){
106: sbp = lookup(csp->name_cs);
107: sbp->attr_s |= S_DEC | S_DEF | S_LOCAL;
108: sbp->csect_s = csp->which_cs;
109: sbp->value_s = 0;
110: }
111: }
112:
113: void
114: new_csect()
115: {
116: extern struct csect *cur_csect; /* ptr to current csect */
117: extern struct sym_bkt *dot_bkt; /* sym_bkt for location counter */
118:
119: cur_csect = all_csects[cur_csect_name];
120: dot = cur_csect->dot_cs;
121: dot_bkt->csect_s = cur_csect_name;/* update dot's csect. dot_bkt->value_s */
122: /* will be updated in the main loop */
123: }
124:
125: int
126: ascii(csectname)
127: { register char *p;
128: int count;
129: extern char *malloc();
130:
131: if (numops!=1 || operands[0].type_o!=T_STRING)
132: { PROG_ERROR(E_OPERAND); return 0; }
133: if (csectname == C_TEXT){
134: count = strlen(operands[0].stringval_o);
135: p = malloc( count+1);
136: strcpy( p, operands[0].stringval_o);
137: operands[0].stringval_o = p;
138: } else
139: p = operands[0].stringval_o;
140: /* scan out the string, so we can figure how much space it will take */
141: count = 0;
142: while (*p) {
143: count++;
144: if ( *p++ == '\\' )
145: switch ( *p ){
146: case '\\':
147: case '"':
148: p++;
149: break;
150: default:
151: {
152: register i;
153: /* \octal number. Max of 3 octal digits */
154:
155: for(i=0;i<3;i++,p++) {
156: if (!((*p >= '0') && (*p <= '7')))
157: break;
158: }
159: }
160: }
161: }
162: return count;
163: }
164:
165: int
166: pseudo_size( ip )
167: struct ins_bkt *ip;
168: {
169: int val, delta;
170: switch( ip->op_i ){
171: case OP_LONG:
172: return numops*sizeof(long);
173: case OP_WORD:
174: return numops*sizeof(short);
175: case OP_BYTE:
176: return numops*sizeof(char);
177: case OP_SKIP:
178: return operands[0].value_o;
179: case OP_EVEN:
180: return dot&1;
181: case OP_ALIGN:
182: val = operands[0].value_o;
183: delta = val - (dot%val);
184: if (delta == val) delta = 0;
185: return delta;
186: }
187: return 0;
188: }
189:
190: int
191: pseudo_code( op ) opcode_t op;
192: {
193: /*
194: * 1 => can generate code
195: * 0 => cannot generate code
196: * -1 => not a pseudo-op
197: */
198: if (opcodetypes[(int)op]&PSEUDONOCODE) return 0;
199: if (opcodetypes[(int)op]&PSEUDOCODE ) return 1;
200: return -1;
201: }
202:
203: void
204: save_stabs(csectname)
205: {
206: char *p;
207: /* IF IN TEXT, save stabs string */
208: if (csectname != C_TEXT) return;
209: /* like ascii above */
210: p = malloc( 1 + strlen(operands[0].stringval_o));
211: strcpy( p, operands[0].stringval_o);
212: operands[0].stringval_o = p;
213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.