1 /* jit/parse.c *****************************************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Parser for JavaVM to intermediate code translation
9 Author: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: $Id: parse.c 384 2003-07-08 21:49:19Z carolyn $
12 include Rapid Type Analysis parse - 5/2003 - carolyn
15 *******************************************************************************/
18 /* data about the currently parsed method */
20 static classinfo *rt_class; /* class the compiled method belongs to */
21 static methodinfo *rt_method; /* pointer to method info of compiled method */
22 static utf *rt_descriptor; /* type descriptor of compiled method */
23 static int rt_jcodelength; /*length of JavaVM-codes */
24 static u1 *rt_jcode; /* pointer to start of JavaVM-code */
27 /* macros for byte code fetching ***********************************************
29 fetch a byte code of given size from position p in code array jcode
31 *******************************************************************************/
33 #define code_get_u1(p) jcode[p]
34 #define code_get_s1(p) ((s1)jcode[p])
35 #define code_get_u2(p) ((((u2)jcode[p])<<8)+jcode[p+1])
36 #define code_get_s2(p) ((s2)((((u2)jcode[p])<<8)+jcode[p+1]))
37 #define code_get_u4(p) ((((u4)jcode[p])<<24)+(((u4)jcode[p+1])<<16)\
38 +(((u4)jcode[p+2])<<8)+jcode[p+3])
39 #define code_get_s4(p) ((s4)((((u4)jcode[p])<<24)+(((u4)jcode[p+1])<<16)\
40 +(((u4)jcode[p+2])<<8)+jcode[p+3]))
43 /* functionc compiler_addinitclass *********************************************
45 add class into the list of classes to initialize
47 *******************************************************************************/
49 static void compiler_addinitclass (classinfo *c)
53 if (c->initialized) return;
55 cl = chain_first(uninitializedclasses);
60 cl = chain_next(uninitializedclasses);
66 sprintf(logtext, "compiler_addinitclass: ");
67 utf_sprint(logtext+strlen(logtext), c->name);
70 chain_addlast(uninitializedclasses, c);
75 sprintf(logtext, "compiler_addinitclass: ");
76 utf_sprint(logtext+strlen(logtext), c->name);
79 chain_addbefore(uninitializedclasses, c);
82 cl = chain_next(uninitializedclasses);
87 /* function descriptor2types ***************************************************
89 decodes a already checked method descriptor. The parameter count, the
90 return type and the argument types are stored in the passed methodinfo.
92 *******************************************************************************/
94 static void descriptor2types (methodinfo *m)
100 types = DMNEW (u1, m->descriptor->blength);
103 if (!(m->flags & ACC_STATIC)) {
108 utf_ptr = m->descriptor->text + 1;
110 while ((c = *utf_ptr++) != ')') {
117 case 'Z': *tptr++ = TYPE_INT;
119 case 'J': *tptr++ = TYPE_LNG;
121 case 'F': *tptr++ = TYPE_FLT;
123 case 'D': *tptr++ = TYPE_DBL;
125 case 'L': *tptr++ = TYPE_ADR;
126 while (*utf_ptr++ != ';');
128 case '[': *tptr++ = TYPE_ADR;
132 while (*utf_ptr++ != ';') /* skip */;
134 default: panic ("Ill formed methodtype-descriptor");
138 /* compute return type */
140 switch (*utf_ptr++) {
145 case 'Z': m->returntype = TYPE_INT;
147 case 'J': m->returntype = TYPE_LNG;
149 case 'F': m->returntype = TYPE_FLT;
151 case 'D': m->returntype = TYPE_DBL;
154 case 'L': m->returntype = TYPE_ADR;
156 case 'V': m->returntype = TYPE_VOID;
159 default: panic ("Ill formed methodtype-descriptor");
162 m->paramcount = pcount;
163 m->paramtypes = types;
169 /* function allocate_literals **************************************************
171 Scans the JavaVM code of a method and allocates string literals (in the
172 same order as the old JIT). Needed to generate the same addresses as the
175 *******************************************************************************/
177 static void allocate_literals()
184 for (p = 0; p < jcodelength; p = nextp) {
187 nextp = p + jcommandsize[opcode];
191 if (code_get_u1(p + 1) == JAVA_IINC)
197 case JAVA_LOOKUPSWITCH:
198 nextp = ALIGN((p + 1), 4);
199 num = code_get_u4(nextp + 4);
200 nextp = nextp + 8 + 8 * num;
203 case JAVA_TABLESWITCH:
204 nextp = ALIGN ((p + 1),4);
205 num = code_get_s4(nextp + 4);
206 num = code_get_s4(nextp + 8) - num;
207 nextp = nextp + 16 + 4 * num;
211 i = code_get_u1(p+1);
212 goto pushconstantitem;
215 i = code_get_u2(p + 1);
217 if (class_constanttype(class, i) == CONSTANT_String) {
218 s = class_getconstant(class, i, CONSTANT_String);
219 (void) literalstring_new(s);
228 /*******************************************************************************
230 function 'parse' scans the JavaVM code and generates intermediate code
232 During parsing the block index table is used to store at bit pos 0
233 a flag which marks basic block starts and at position 1 to 31 the
234 intermediate instruction index. After parsing the block index table
235 is scanned, for marked positions a block is generated and the block
236 number is stored in the block index table.
238 *******************************************************************************/
240 /* intermediate code generating macros */
242 #define PINC iptr++;ipc++
243 #define LOADCONST_I(v) iptr->opc=ICMD_ICONST;iptr->op1=0;iptr->val.i=(v);PINC
244 #define LOADCONST_L(v) iptr->opc=ICMD_LCONST;iptr->op1=0;iptr->val.l=(v);PINC
245 #define LOADCONST_F(v) iptr->opc=ICMD_FCONST;iptr->op1=0;iptr->val.f=(v);PINC
246 #define LOADCONST_D(v) iptr->opc=ICMD_DCONST;iptr->op1=0;iptr->val.d=(v);PINC
247 #define LOADCONST_A(v) iptr->opc=ICMD_ACONST;iptr->op1=0;iptr->val.a=(v);PINC
248 #define OP(o) iptr->opc=(o);iptr->op1=0;iptr->val.l=0;PINC
249 #define OP1(o,o1) iptr->opc=(o);iptr->op1=(o1);iptr->val.l=(0);PINC
250 #define OP2I(o,o1,v) iptr->opc=(o);iptr->op1=(o1);iptr->val.i=(v);PINC
251 #define OP2A(o,o1,v) iptr->opc=(o);iptr->op1=(o1);iptr->val.a=(v);PINC
252 #define BUILTIN1(v,t) isleafmethod=false;iptr->opc=ICMD_BUILTIN1;iptr->op1=t;\
254 #define BUILTIN2(v,t) isleafmethod=false;iptr->opc=ICMD_BUILTIN2;iptr->op1=t;\
256 #define BUILTIN3(v,t) isleafmethod=false;iptr->opc=ICMD_BUILTIN3;iptr->op1=t;\
260 /* block generating and checking macros */
262 #define block_insert(i) {if(!(block_index[i]&1))\
263 {b_count++;block_index[i] |= 1;}}
264 #define bound_check(i) {if((i< 0) || (i>=jcodelength)) \
265 panic("branch target out of code-boundary");}
266 #define bound_check1(i) {if((i< 0) || (i>jcodelength)) \
267 panic("branch target out of code-boundary");}
272 int p; /* java instruction counter */
273 int nextp; /* start of next java instruction */
274 int opcode; /* java opcode */
275 int i; /* temporary for different uses (counters) */
276 int ipc = 0; /* intermediate instruction counter */
277 int b_count = 0; /* basic block counter */
278 int s_count = 0; /* stack element counter */
279 bool blockend = false; /* true if basic block end has been reached */
280 bool iswide = false; /* true if last instruction was a wide */
281 instruction *iptr; /* current pointer into instruction array */
284 /*RTAprint*/ if ((opt_rt) && ((pOpcodes == 2) || (pOpcodes == 3)) )
285 /*RTAprint*/ {printf("PARSE method name =");
286 /*RTAprint*/ utf_display(method->class->name);printf(".");
287 /*RTAprint*/ method_display(method); printf(">\n\n");fflush(stdout);}
289 RT_jit_parse(method);
292 if ((opt_xta) && (xta1 == 0)) {
293 /*printf("XTA - not available yet\n"); */
295 XTA_jit_parse(method);
296 /*XTAprint*/ if (((pOpcodes == 1) || (pOpcodes == 3)) && opt_rt)
297 /*XTAprint*/ {printf("XTA PARSE method name =");
298 /*XTAprint*/ utf_display(rt_method->class->name);printf(".");
299 /*XTAprint*/ method_display(rt_method); printf(">\n\n");fflush(stdout);}
306 /* generate the same addresses as the old JIT compiler */
312 /* allocate instruction array and block index table */
314 /* 1 additional for end ipc and 3 for loop unrolling */
316 block_index = DMNEW(int, jcodelength + 4);
318 /* 1 additional for TRACEBUILTIN and 4 for MONITORENTER/EXIT */
319 /* additional MONITOREXITS are reached by branches which are 3 bytes */
321 iptr = instr = DMNEW(instruction, jcodelength + 5);
323 /* initialize block_index table (unrolled four times) */
328 for (i = 0, ip = block_index; i <= jcodelength; i += 4, ip += 4) {
336 /* compute branch targets of exception table */
338 extable = DMNEW(xtable, exceptiontablelength + 1);
340 for (i = 0; i < exceptiontablelength; i++) {
342 p = extable[i].startpc = raw_extable[i].startpc;
346 p = extable[i].endpc = raw_extable[i].endpc;
351 p = extable[i].handlerpc = raw_extable[i].handlerpc;
355 extable[i].catchtype = raw_extable[i].catchtype;
357 extable[i].next = NULL;
358 extable[i].down = &extable[i+1];
361 if (exceptiontablelength > 0)
362 extable[exceptiontablelength-1].down = NULL;
366 s_count = 1 + exceptiontablelength; /* initialize stack element counter */
369 if (checksync && (method->flags & ACC_SYNCHRONIZED)) {
374 /* scan all java instructions */
376 for (p = 0; p < jcodelength; p = nextp) {
378 opcode = code_get_u1 (p); /* fetch op code */
380 /*RTAprint*/ if ((opt_rt) && ((pOpcodes == 2) || (pOpcodes == 3)) )
381 /*RTAprint*/ {printf("Parse<%i> p=%i<%i< opcode=<%i> %s\n",
382 /*RTAprint*/ pOpcodes, p,jcodelength,opcode,opcode_names[opcode]);}
384 block_index[p] |= (ipc << 1); /* store intermediate count */
387 block_insert(p); /* start new block */
391 nextp = p + jcommandsize[opcode]; /* compute next instruction start */
392 s_count += stackreq[opcode]; /* compute stack element count */
399 /* pushing constants onto the stack p */
402 LOADCONST_I(code_get_s1(p+1));
406 LOADCONST_I(code_get_s2(p+1));
410 i = code_get_u1(p+1);
411 goto pushconstantitem;
414 i = code_get_u2(p + 1);
418 if (i >= class->cpcount)
419 panic ("Attempt to access constant outside range");
421 switch (class->cptags[i]) {
422 case CONSTANT_Integer:
423 LOADCONST_I(((constant_integer*)
424 (class->cpinfos[i]))->value);
427 LOADCONST_L(((constant_long*)
428 (class->cpinfos[i]))->value);
431 LOADCONST_F(((constant_float*)
432 (class->cpinfos[i]))->value);
434 case CONSTANT_Double:
435 LOADCONST_D(((constant_double*)
436 (class->cpinfos[i]))->value);
438 case CONSTANT_String:
439 LOADCONST_A(literalstring_new((utf*)
440 (class->cpinfos[i])));
442 default: panic("Invalid constant type to push");
446 case JAVA_ACONST_NULL:
457 LOADCONST_I(opcode - JAVA_ICONST_0);
462 LOADCONST_L(opcode - JAVA_LCONST_0);
468 LOADCONST_F(opcode - JAVA_FCONST_0);
473 LOADCONST_D(opcode - JAVA_DCONST_0);
476 /* loading variables onto the stack */
484 i = code_get_u1(p+1);
486 i = code_get_u2(p+1);
497 OP1(ICMD_ILOAD, opcode - JAVA_ILOAD_0);
504 OP1(ICMD_LLOAD, opcode - JAVA_LLOAD_0);
511 OP1(ICMD_FLOAD, opcode - JAVA_FLOAD_0);
518 OP1(ICMD_DLOAD, opcode - JAVA_DLOAD_0);
525 OP1(ICMD_ALOAD, opcode - JAVA_ALOAD_0);
528 /* storing stack values into local variables */
536 i = code_get_u1(p+1);
538 i = code_get_u2(p+1);
549 OP1(ICMD_ISTORE, opcode - JAVA_ISTORE_0);
556 OP1(ICMD_LSTORE, opcode - JAVA_LSTORE_0);
563 OP1(ICMD_FSTORE, opcode - JAVA_FSTORE_0);
570 OP1(ICMD_DSTORE, opcode - JAVA_DSTORE_0);
577 OP1(ICMD_ASTORE, opcode - JAVA_ASTORE_0);
585 i = code_get_u1(p + 1);
586 v = code_get_s1(p + 2);
589 i = code_get_u2(p + 1);
590 v = code_get_s2(p + 3);
598 /* wider index for loading, storing and incrementing */
605 /* managing arrays ************************************************/
608 OP2I(ICMD_CHECKASIZE, 0, 0);
609 switch (code_get_s1(p+1)) {
611 BUILTIN1((functionptr)builtin_newarray_boolean, TYPE_ADR);
614 BUILTIN1((functionptr)builtin_newarray_char, TYPE_ADR);
617 BUILTIN1((functionptr)builtin_newarray_float, TYPE_ADR);
620 BUILTIN1((functionptr)builtin_newarray_double, TYPE_ADR);
623 BUILTIN1((functionptr)builtin_newarray_byte, TYPE_ADR);
626 BUILTIN1((functionptr)builtin_newarray_short, TYPE_ADR);
629 BUILTIN1((functionptr)builtin_newarray_int, TYPE_ADR);
632 BUILTIN1((functionptr)builtin_newarray_long, TYPE_ADR);
634 default: panic("Invalid array-type to create");
639 OP2I(ICMD_CHECKASIZE, 0, 0);
640 i = code_get_u2(p+1);
641 /* array or class type ? */
642 if (class_constanttype (class, i) == CONSTANT_Arraydescriptor) {
644 LOADCONST_A(class_getconstant(class, i,
645 CONSTANT_Arraydescriptor));
647 BUILTIN2((functionptr) asm_builtin_newarray_array, TYPE_ADR);
649 BUILTIN2((functionptr)builtin_newarray_array, TYPE_ADR);
653 LOADCONST_A(class_getconstant(class, i, CONSTANT_Class));
656 BUILTIN2((functionptr) asm_builtin_anewarray, TYPE_ADR);
658 BUILTIN2((functionptr)builtin_anewarray, TYPE_ADR);
663 case JAVA_MULTIANEWARRAY:
665 i = code_get_u2(p+1);
667 int v = code_get_u1(p+3);
668 constant_arraydescriptor *desc =
669 class_getconstant (class, i, CONSTANT_Arraydescriptor);
670 OP2A(opcode, v, desc);
692 i = p + code_get_s2(p+1);
700 i = p + code_get_s4(p+1);
709 i = code_get_u1(p+1);
711 i = code_get_u2(p+1);
735 /* table jumps ********************************/
737 case JAVA_LOOKUPSWITCH:
742 nextp = ALIGN((p + 1), 4);
743 OP2A(opcode, 0, jcode + nextp);
747 j = p + code_get_s4(nextp);
748 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
753 /* number of pairs */
755 num = code_get_u4(nextp);
756 *((s4*)(jcode + nextp)) = num;
759 for (i = 0; i < num; i++) {
763 j = code_get_s4(nextp);
764 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
769 j = p + code_get_s4(nextp);
770 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
780 case JAVA_TABLESWITCH:
785 nextp = ALIGN((p + 1), 4);
786 OP2A(opcode, 0, jcode + nextp);
790 j = p + code_get_s4(nextp);
791 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
798 j = code_get_s4(nextp);
799 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
804 num = code_get_s4(nextp);
805 *((s4*)(jcode + nextp)) = num; /* restore for little endian */
810 for (i = 0; i <= num; i++) {
811 j = p + code_get_s4(nextp);
812 *((s4*)(jcode + nextp)) = j; /* restore for little endian */
822 /* load and store of object fields *******************/
825 BUILTIN3((functionptr) asm_builtin_aastore, TYPE_VOID);
830 i = code_get_u2(p + 1);
834 fr = class_getconstant (class, i, CONSTANT_Fieldref);
835 fi = class_findfield (fr->class, fr->name, fr->descriptor);
836 compiler_addinitclass (fr->class);
837 OP2A(opcode, fi->type, fi);
842 i = code_get_u2(p + 1);
846 fr = class_getconstant (class, i, CONSTANT_Fieldref);
847 fi = class_findfield (fr->class, fr->name, fr->descriptor);
848 OP2A(opcode, fi->type, fi);
853 /* method invocation *****/
855 case JAVA_INVOKESTATIC:
856 i = code_get_u2(p + 1);
861 mr = class_getconstant (class, i, CONSTANT_Methodref);
862 mi = class_findmethod (mr->class, mr->name, mr->descriptor);
863 /*RTAprint*/ if (((pOpcodes == 2) || (pOpcodes == 3)) && opt_rt)
864 /*RTAprint*/ {printf(" method name =");
865 /*RTAprint*/ utf_display(mi->class->name); printf(".");
866 /*RTAprint*/ utf_display(mi->name);printf("\tINVOKE STATIC\n");
867 /*RTAprint*/ fflush(stdout);}
868 if (! (mi->flags & ACC_STATIC))
869 panic ("Static/Nonstatic mismatch calling static method");
870 descriptor2types(mi);
872 OP2A(opcode, mi->paramcount, mi);
875 case JAVA_INVOKESPECIAL:
876 case JAVA_INVOKEVIRTUAL:
877 i = code_get_u2(p + 1);
882 mr = class_getconstant (class, i, CONSTANT_Methodref);
883 mi = class_findmethod (mr->class, mr->name, mr->descriptor);
884 /*RTAprint*/ if (((pOpcodes == 2) || (pOpcodes == 3)) && opt_rt)
885 /*RTAprint*/ {printf(" method name =");
887 /*RTAprint*/ utf_display(mi->class->name); printf(".");
888 /*RTAprint*/ utf_display(mi->name);printf("\tINVOKE SPECIAL/VIRTUAL\n");
889 /*RTAprint*/ fflush(stdout);}
891 if (mi->flags & ACC_STATIC)
892 panic ("Static/Nonstatic mismatch calling static method");
893 descriptor2types(mi);
895 OP2A(opcode, mi->paramcount, mi);
898 case JAVA_INVOKEINTERFACE:
899 i = code_get_u2(p + 1);
904 mr = class_getconstant (class, i, CONSTANT_InterfaceMethodref);
905 mi = class_findmethod (mr->class, mr->name, mr->descriptor);
906 if (mi->flags & ACC_STATIC)
907 panic ("Static/Nonstatic mismatch calling static method");
908 descriptor2types(mi);
910 OP2A(opcode, mi->paramcount, mi);
914 /* miscellaneous object operations *******/
917 i = code_get_u2 (p+1);
919 LOADCONST_A(class_getconstant(class, i, CONSTANT_Class));
921 BUILTIN1((functionptr) builtin_new, TYPE_ADR);
925 i = code_get_u2(p+1);
927 /* array type cast-check */
928 if (class_constanttype (class, i) == CONSTANT_Arraydescriptor) {
929 LOADCONST_A(class_getconstant(class, i, CONSTANT_Arraydescriptor));
931 BUILTIN2((functionptr) asm_builtin_checkarraycast, TYPE_ADR);
933 else { /* object type cast-check */
935 LOADCONST_A(class_getconstant(class, i, CONSTANT_Class));
937 BUILTIN2((functionptr) asm_builtin_checkcast, TYPE_ADR);
939 OP2A(opcode, 1, (class_getconstant(class, i, CONSTANT_Class)));
943 case JAVA_INSTANCEOF:
944 i = code_get_u2(p+1);
946 /* array type cast-check */
947 if (class_constanttype (class, i) == CONSTANT_Arraydescriptor) {
948 LOADCONST_A(class_getconstant(class, i, CONSTANT_Arraydescriptor));
951 BUILTIN2((functionptr) asm_builtin_arrayinstanceof, TYPE_INT);
953 BUILTIN2((functionptr) builtin_arrayinstanceof, TYPE_INT);
956 else { /* object type cast-check */
958 LOADCONST_A(class_getconstant(class, i, CONSTANT_Class));
960 BUILTIN2((functionptr) builtin_instanceof, TYPE_INT);
962 OP2A(opcode, 1, (class_getconstant(class, i, CONSTANT_Class)));
966 case JAVA_MONITORENTER:
969 #ifdef SOFTNULLPTRCHECK
971 BUILTIN1((functionptr) asm_builtin_monitorenter, TYPE_VOID);
974 /* BUILTIN1((functionptr) builtin_monitorenter, TYPE_VOID); */
975 BUILTIN1((functionptr) asm_builtin_monitorenter, TYPE_VOID);
978 BUILTIN1((functionptr) builtin_monitorenter, TYPE_VOID);
984 OP(ICMD_NULLCHECKPOP);
988 case JAVA_MONITOREXIT:
991 BUILTIN1((functionptr) builtin_monitorexit, TYPE_VOID);
1000 /* any other basic operation **************************************/
1020 /* BUILTIN2((functionptr) asm_builtin_frem, TYPE_FLOAT); */
1023 BUILTIN2((functionptr) builtin_frem, TYPE_FLOAT);
1031 BUILTIN2((functionptr) builtin_drem, TYPE_DOUBLE);
1037 BUILTIN1((functionptr) builtin_f2i, TYPE_INT);
1046 BUILTIN1((functionptr) builtin_f2l, TYPE_LONG);
1055 BUILTIN1((functionptr) builtin_d2i, TYPE_INT);
1064 BUILTIN1((functionptr) builtin_d2l, TYPE_LONG);
1071 case JAVA_BREAKPOINT:
1072 panic("Illegal opcode Breakpoint encountered");
1128 printf("Illegal opcode %d at instr %d", opcode, ipc);
1129 panic("encountered");
1140 if (p != jcodelength)
1141 panic("Command-sequence crosses code-boundary");
1144 panic("Code does not end with branch/return/athrow - stmt");
1146 /* adjust block count if target 0 is not first intermediate instruction */
1148 if (!block_index[0] || (block_index[0] > 1))
1151 /* copy local to global variables */
1154 block_count = b_count;
1155 stack_count = s_count + block_count * maxstack;
1157 /* allocate stack table */
1159 stack = DMNEW(stackelement, stack_count);
1164 bptr = block = DMNEW(basicblock, b_count + 1); /* one more for end ipc */
1169 /* additional block if target 0 is not first intermediate instruction */
1171 if (!block_index[0] || (block_index[0] > 1)) {
1172 bptr->iinstr = instr;
1175 bptr->type = BBTYPE_STD;
1176 bptr->branchrefs = NULL;
1177 bptr->pre_count = 0;
1178 bptr->debug_nr = c_debug_nr++;
1181 (bptr - 1)->next = bptr;
1185 /* allocate blocks */
1188 for (p = 0; p < jcodelength; p++)
1190 if (block_index[p] & 1) {
1191 bptr->iinstr = instr + (block_index[p] >> 1);
1192 bptr->debug_nr = c_debug_nr++;
1194 (bptr - 1)->icount = bptr->iinstr - (bptr - 1)->iinstr;
1198 bptr->type = BBTYPE_STD;
1199 bptr->branchrefs = NULL;
1200 block_index[p] = b_count;
1201 bptr->pre_count = 0;
1205 (bptr - 1)->next = bptr;
1208 /* allocate additional block at end */
1211 bptr->instack = bptr->outstack = NULL;
1212 bptr->indepth = bptr->outdepth = 0;
1213 bptr->iinstr = NULL;
1214 (bptr - 1)->icount = (instr + instr_count) - (bptr - 1)->iinstr;
1219 bptr->type = BBTYPE_STD;
1220 bptr->branchrefs = NULL;
1221 bptr->pre_count = 0;
1222 bptr->debug_nr = c_debug_nr++;
1224 (bptr - 1)->next = bptr;
1231 for (i = 0; i < exceptiontablelength; ++i) {
1232 p = extable[i].startpc;
1233 extable[i].start = block + block_index[p];
1235 p = extable[i].endpc;
1236 extable[i].end = block + block_index[p];
1238 p = extable[i].handlerpc;
1239 extable[i].handler = block + block_index[p];
1244 #include "parseRT.h"
1245 #include "parseXTA.h"
1248 * These are local overrides for various environment variables in Emacs.
1249 * Please do not remove this and leave it at the end of the file, where
1250 * Emacs will automagically detect them.
1251 * ---------------------------------------------------------------------
1254 * indent-tabs-mode: t