1 /* L A B E L H A N D L I N G */
20 if( !(df = define(nd->nd_IDF, CurrentScope, D_LABEL)) ) {
21 node_error(nd, "label %s redeclared", nd->nd_IDF->id_text);
24 df->lab_no = ++text_label;
31 register struct node *labnd = BlockScope->sc_lablist;
32 register struct def *df;
39 /* jump to undefined label */
40 error("jump to undefined label %s",
44 "label %s declared but never defined",
47 else if( df->lab_level == Slevel )
49 else if( !df->lab_level ) {
50 struct lab *plab = df->lab_next;
53 if( plab->lb_level == Slevel )
58 labnd = labnd->nd_next;
63 register struct node *nd;
65 register struct def *df;
67 df = lookfor(nd, CurrVis, 0);
68 if( df->df_kind == D_ERROR ) {
69 node_error(nd, "label %s not declared", df->df_idf->id_text);
70 df->df_kind = D_LABEL;
72 nd->nd_next = BlockScope->sc_lablist;
73 BlockScope->sc_lablist = nd;
78 df->df_flags = D_USED;
79 if( !df->lab_level ) {
81 register struct lab *labelptr;
84 labelptr->lb_next = df->lab_next;
85 df->lab_next = labelptr;
86 if( df->df_scope == BlockScope ) {
88 labelptr->lb_level = Slevel;
92 /* non-local jump, only permitted to
93 outermost level (ISO 6.8.1 Note 2)
95 labelptr->lb_level = 1;
99 else if( df->lab_level == -1 || df->lab_level > Slevel )
100 node_error(nd, "illegal jump to label %s", df->df_idf->id_text);
106 register struct node *nd;
108 register struct def *df;
110 if( !(df = lookup(nd->nd_IDF, BlockScope, D_INUSE)) ) {
111 node_error(nd, "label %s must be declared in same block"
112 , nd->nd_IDF->id_text);
113 df = define(nd->nd_IDF, BlockScope, D_LABEL);
115 df->lab_no = ++text_label;
116 nd->nd_next = BlockScope->sc_lablist;
117 BlockScope->sc_lablist = nd;
121 df->df_flags |= D_SET;
123 node_error(nd, "label %s already defined", nd->nd_IDF->id_text);
125 register struct lab *labelptr;
127 df->lab_level = Slevel;
128 labelptr = df->lab_next;
130 if( labelptr->lb_level < Slevel ) {
131 node_error(nd, "illegal jump to label %s",
132 nd->nd_IDF->id_text);
135 labelptr = labelptr->lb_next;
137 C_df_ilb(df->lab_no);
142 register struct def *df;
144 if( err_occurred ) return;
150 int level = df->df_scope->sc_level;
152 if( !df->lab_descr ) {
153 /* generate label for goto descriptor */
154 df->lab_descr = ++data_label;
155 C_ina_dlb(data_label);
157 /* perform the jump */
158 C_lae_dlb(df->lab_descr, (arith) 0);
160 /* LB of target procedure */
162 C_lxl((arith) proclevel - level);
166 C_asp( 2 * pointer_size);