added stack layout for armv8
[dyninst.git] / stackwalk / doc / fig / layout-armv8.tex
1 \begin{figure}
2 \centering
3 \tikzstyle{class} = [rectangle, draw, minimum width=4cm, minimum height=1.5em,
4 font=\ttfamily, node distance=1.5em]
5 \tikzstyle{top} = [rectangle, minimum width=4cm, draw, minimum height=1.5em,
6 fill=white, draw=white]
7 \tikzstyle{annotate} = [rectangle]
8 \tikzstyle{code} = [rectangle, font=\ttfamily]
9 \tikzstyle{line} = [draw, -latex']
10 \begin{tikzpicture}[
11         every text node part/.style={align=left}
12     ]
13
14     % Label
15     \node [annotate] (callstack) {\textbf{Call Stack}};
16
17     % The callstack
18     \node [top, below of=callstack] (dots) {...};
19     \node [class, below of=dots] (a) {a};
20     \node [class, below of=a] (b) {b};
21     \node [class, below of=b] (mainRA) {main's RA};
22     \node [class, below of=mainRA] (mainFP) {main's FP};
23     \node [class, below of=mainFP] (c) {C};
24     \node [class, below of=c] (fooRA) {foo's RA(0x400010c)};
25     \node [class, below of=fooRA] (fooFP) {foo's FP};
26     \node [class, below of=fooFP] (d) {d};
27     \node [class, below of=d] (barRA) {bar's RA(0x400021c)};
28     \node [class, below of=barRA] (barFP) {bar's FP};
29
30     % Registers
31     \node [annotate, below=1cm of barFP] (registers) {Registers};
32     \node [class, below of=registers] (FramePointer) {Frame Pointer};
33     \node [class, below of=FramePointer] (StackPointer) {StackPointer};
34     \node [class, below of=StackPointer] (ProgramCounter) {Program Counter};
35
36     % Left labels
37     \node [code, left=7cm of dots,anchor=north] (main) {
38         0x4000100\hspace{0.5cm}void main() \{\\
39         0x4000104\hspace{1cm}int a;\\
40         0x4000108\hspace{1cm}foo(0);\\
41         0x400010c\hspace{1cm}...\\
42         \hspace{2.2cm}\}
43     };
44     
45     \node [code, below=3cm of main.west,anchor=west] (foo) {
46         0x4000200\hspace{0.5cm}void foo(int b) \{\\
47         0x4000204\hspace{1cm}int c;\\
48         0x4000208\hspace{1cm}bar();\\
49         0x400020c\hspace{1cm}...\\
50         \hspace{2.2cm}\}
51     };
52
53     \node [code, below=3cm of foo.west,anchor=west] (bar) {
54         0x4000300\hspace{0.5cm}void bar() \{\\
55         0x4000304\hspace{1cm}int d;\\
56         0x4000308\hspace{1cm}while(1);\\
57         \hspace{2.2cm}\}
58     };
59
60     % Callstack->callstack labels
61     \path [line] (mainFP.east) [bend right=20] to (dots.east);
62     \path [line] (fooFP.east) [bend right=40] to (mainFP.east);
63     \path [line] (barFP.east) [bend right=40] to (fooFP.east);
64     \path [line] (FramePointer.east) [bend right=40] to (barFP.east);
65     \path [line] (StackPointer.east) [bend right=40] to (barFP.east);
66
67     % Right labels
68     \node [code, left=2.5cm of dots,anchor=south] (mainFO) {main\textnormal{'s}\\ Frame Object};
69     \node [code, below=.25em of mainFO] (mainFPlabel) {FP};
70     \path [line] (mainFPlabel) -- (mainFP.west);
71     \node [code, below=.25em of mainFPlabel] (mainSPlabel) {SP};
72     \path [line] (mainSPlabel) -- (mainFP.west);
73     \node [code, below=.25em of mainSPlabel] (mainRAlabel) {RA};
74     \path [line, dashed] (mainRAlabel) -- (fooRA.west);
75
76     \node [code, below=2cm of mainFO] (fooFO) {foo\textnormal{'s}\\ Frame Object};
77     \node [code, below=.25em of fooFO] (fooFPlabel) {FP};
78     \path [line] (fooFPlabel) -- (fooFP.west);
79     \node [code, below=.25em of fooFPlabel] (fooSPlabel) {SP};
80     \path [line] (fooSPlabel) -- (fooFP.west);
81     \node [code, below=.25em of fooSPlabel] (fooRAlabel) {RA};
82     \path [line, dashed] (fooRAlabel) -- (barRA.west);
83
84     \node [code, below=2cm of fooFO] (barFO) {bar\textnormal{'s}\\ Frame Object};
85     \node [code, below=.25em of barFO] (barFPlabel) {FP};
86     \path [line, dashed] (barFPlabel) -- (FramePointer.west);
87     \path [line] (barFPlabel) -- (barFP.west);
88     \node [code, below=.25em of barFPlabel] (barSPlabel) {SP};
89     \path [line, dashed] (barSPlabel) -- (StackPointer.west);
90     \path [line] (barSPlabel) -- (barFP.west);
91     \node [code, below=.25em of barSPlabel] (barRAlabel) {RA};
92     \path [line, dashed] (barRAlabel) -- (ProgramCounter.west);
93
94     % Callstack->source code labels
95     \path [line] (mainRAlabel.west) -- ($(main.south east) + (-.75cm, 2em)$);
96     \path [line] (fooRAlabel.west) -- ($(foo.south east) + (-1.5cm, 2em)$);
97     \path [line] (barRAlabel.west) -- ($(bar.south east) + (0, 2em)$);
98
99
100 \end{tikzpicture}
101
102 \begin{tikzpicture}[]
103     % Legend
104     \node [annotate] (la1) {A};
105     \node [annotate, right of=la1] (lb1) {B};
106     \path [line] (la1) -- (lb1);
107     \node [annotate, right=1cm of lb1] (l1) {A contains B's address};
108     
109     \node [annotate, below=.5cm of la1] (la2) {A};
110     \node [annotate, right of=la2] (lb2) {B};
111     \path [line, dashed] (la2) -- (lb2);
112     \node [annotate, right=1cm of lb2] (l2) {A contains the contents of B};
113
114     % Legend Box
115     \node [rectangle, draw, fit=(la1)(lb1)(l1)(la2)(lb2)(l2)] (legendBox) {};
116     \node [rectangle, label=left: \rotatebox{90}{LEGEND},fit=(legendBox)] {};
117 \end{tikzpicture}
118
119 \caption{Stack Frame and Frame Object Layout}
120 \label{fig:layout}
121
122 \end{figure}
123
124