Now we'll examine a second program, example2
, which builds on the
first example to introduce the rest of the stab types, symbol
descriptors, and type descriptors used in C.
See section Example2.c - source code for extended example for the complete `.c' source,
and see section Example2.s - assembly code for extended example for the `.s' assembly code.
This description includes parts of those files.
.stabn
N_SLINE
, N_LBRAC
, N_RBRAC
(cont.)
Consider the body of main
, from `example2.c'. It shows more
about how N_SLINE
, N_RBRAC
, and N_LBRAC
stabs are used.
20 { 21 static float s_flap; 22 int times; 23 for (times=0; times < s_g_repeat; times++){ 24 int inner; 25 printf ("Hello world\n"); 26 } 27 };
Here we have a single source line, the `for' line, that generates
non-linear flow of control, and non-contiguous code. In this case, an
N_SLINE
stab with the same line number proceeds each block of
non-contiguous code generated from the same source line.
The example also shows nested scopes. The N_LBRAC
and
N_LBRAC
stabs that describe block structure are nested in the
same order as the corresponding code blocks, those of the for loop
inside those for the body of main.
This is the label for the N_LBRAC
(left brace) stab marking the
start of main
.
57 LBB2:
In the first code range for C source line 23, the for
loop
initialize and test, N_SLINE
(68) records the line number:
.stabn N_SLINE, NIL, line, address 58 .stabn 68,0,23,LM2 59 LM2: 60 st %g0,[%fp-20] 61 L2: 62 sethi %hi(_s_g_repeat),%o0 63 ld [%fp-20],%o1 64 ld [%o0+%lo(_s_g_repeat)],%o0 65 cmp %o1,%o0 66 bge L3 67 nop label for theN_LBRAC
(start block) marking the start offor
loop 68 LBB3: 69 .stabn 68,0,25,LM3 70 LM3: 71 sethi %hi(LC0),%o1 72 or %o1,%lo(LC0),%o0 73 call _printf,0 74 nop 75 .stabn 68,0,26,LM4 76 LM4: label for theN_RBRAC
(end block) stab marking the end of thefor
loop 77 LBE3:
Now we come to the second code range for source line 23, the for
loop increment and return. Once again, N_SLINE
(68) records the
source line number:
.stabn, N_SLINE, NIL, line, address 78 .stabn 68,0,23,LM5 79 LM5: 80 L4: 81 ld [%fp-20],%o0 82 add %o0,1,%o1 83 st %o1,[%fp-20] 84 b,a L2 85 L3: 86 .stabn 68,0,27,LM6 87 LM6: label for theN_RBRAC
(end block) stab marking the end of thefor
loop 88 LBE2: 89 .stabn 68,0,27,LM7 90 LM7: 91 L1: 92 ret 93 restore 94 .stabs "main:F1",36,0,0,_main 95 .stabs "argc:p1",160,0,0,68 96 .stabs "argv:p20=*21=*2",160,0,0,72 97 .stabs "s_flap:V12",40,0,0,_s_flap.0 98 .stabs "times:1",128,0,0,-20
Here is an illustration of stabs describing nested scopes. The scope
nesting is reflected in the nested bracketing stabs (N_LBRAC
,
192, appears here).
.stabn N_LBRAC,NIL,NIL, block-start-address 99 .stabn 192,0,0,LBB2 ## begin proc label 100 .stabs "inner:1",128,0,0,-24 101 .stabn 192,0,0,LBB3 ## begin for label
N_RBRAC
(224), "right brace" ends a lexical block (scope).
.stabn N_RBRAC,NIL,NIL, block-end-address 102 .stabn 224,0,0,LBE3 ## end for label 103 .stabn 224,0,0,LBE2 ## end proc label