Fix colon spaces, reorganize fib7 listing flow

This commit is contained in:
Théophile Bastian 2018-08-17 18:15:43 +02:00
parent 825b6c3e36
commit 31efc6b32a
2 changed files with 32 additions and 38 deletions

View file

@ -273,23 +273,20 @@ them.
caption={Original C},label={lst:ex1_c}]
{src/fib7/fib7.c}
\end{minipage} \hfill \begin{minipage}{0.45\textwidth}
\lstinputlisting[language=C,caption={Processed DWARF},
label={lst:ex1_dw}]
{src/fib7/fib7.fde}
\lstinputlisting[language=C,caption={Raw DWARF},label={lst:ex1_dwraw}]
{src/fib7/fib7.raw_fde}
\lstinputlisting[language={[x86masm]Assembler},
caption={Generated assembly},label={lst:ex1_asm}]
{src/fib7/fib7.s}
\end{minipage}
\end{figure}
\begin{figure}[h]
\begin{minipage}{0.45\textwidth}
\lstinputlisting[language={[x86masm]Assembler},lastline=11,
caption={Generated assembly},label={lst:ex1_asm}]
{src/fib7/fib7.s}
\lstinputlisting[language=C,caption={Raw DWARF},label={lst:ex1_dwraw}]
{src/fib7/fib7.raw_fde}
\end{minipage} \hfill \begin{minipage}{0.45\textwidth}
\lstinputlisting[language={[x86masm]Assembler},firstline=12,
firstnumber=last]
{src/fib7/fib7.s}
\lstinputlisting[language=C,caption={Processed DWARF},
label={lst:ex1_dw}]
{src/fib7/fib7.fde}
\end{minipage}
\end{figure}
@ -413,7 +410,7 @@ pointer. The C function representing it will thus take as parameters an array
of the registers' values as well as an IP, and will return another array of
registers values, which will represent the evaluated DWARF row.
\subsection{Original language~: DWARF instructions}
\subsection{Original language: DWARF instructions}
These are the DWARF instructions used for CFI description, that is, the
instructions that contain the stack unwinding table informations. The following
@ -427,50 +424,50 @@ here, those variations between eg. \dwcfa{advance\_loc1} and
operand~-- are irrelevant and will be eluded.
\begin{itemize}
\item{} \dwcfa{set\_loc(loc)}~:
\item{} \dwcfa{set\_loc(loc)}:
start a new table row from address $loc$
\item{} \dwcfa{advance\_loc(delta)}~:
\item{} \dwcfa{advance\_loc(delta)}:
start a new table row at address $prev\_loc + delta$
\item{} \dwcfa{def\_cfa(reg, offset)}~:
\item{} \dwcfa{def\_cfa(reg, offset)}:
sets this row's CFA at $(\reg{reg} + \textit{offset})$
\item{} \dwcfa{def\_cfa\_register(reg)}~:
\item{} \dwcfa{def\_cfa\_register(reg)}:
sets CFA at $(\reg{reg} + \textit{prev\_offset})$
\item{} \dwcfa{def\_cfa\_offset(offset)}~:
\item{} \dwcfa{def\_cfa\_offset(offset)}:
sets CFA at $(\reg{prev\_reg} + \textit{offset})$
\item{} \dwcfa{def\_cfa\_expression(expr)}~:
\item{} \dwcfa{def\_cfa\_expression(expr)}:
sets CFA as the result of $expr$
\item{} \dwcfa{undefined(reg)}~:
\item{} \dwcfa{undefined(reg)}:
sets the register \reg{reg} as undefined in this row
\item{} \dwcfa{same\_value(reg)}~:
\item{} \dwcfa{same\_value(reg)}:
declares that the register \reg{reg} hasn't been touched, or was
restored to its previous value, in this row. An unwinding procedure can
leave it as-is.
\item{} \dwcfa{offset(reg, offset)}~:
\item{} \dwcfa{offset(reg, offset)}:
the value of the register \reg{reg} is stored in memory at the address
$CFA + \textit{offset}$.
\item{} \dwcfa{val\_offset(reg, offset)}~:
\item{} \dwcfa{val\_offset(reg, offset)}:
the value of the register \reg{reg} is the value $CFA + \textit{offset}$
\item{} \dwcfa{register(reg, model)}~:
\item{} \dwcfa{register(reg, model)}:
the register \reg{reg} has, in this row, the value that $\reg{model}$
had in the previous row
\item{} \dwcfa{expression(reg, expr)}~:
\item{} \dwcfa{expression(reg, expr)}:
the value of \reg{reg} is stored in memory at the address defined by
$expr$
\item{} \dwcfa{val\_expression(reg, expr)}~:
\item{} \dwcfa{val\_expression(reg, expr)}:
\reg{reg} has the value of $expr$
\item{} \dwcfa{restore(reg)}~:
\item{} \dwcfa{restore(reg)}:
\reg{reg} has the same value as in this FDE's preamble (CIE) in this
row. This is \emph{not implemented in this semantics} for simplicity
and brevity (we would have to introduce CIE (preamble) and FDE (body)
independently). This is also not much used in actual ELF
files: the analysis in Section~\ref{ssec:instr_cov} found no such
instruction, on a random uniform sample of 4000 ELF files.
\item{} \dwcfa{remember\_state()}~:
\item{} \dwcfa{remember\_state()}:
push the state of all the registers of this row on an implicit stack
\item{} \dwcfa{restore\_state()}~:
\item{} \dwcfa{restore\_state()}:
pop an entry of the implicit stack, and restore all registers in this
row to the value held in the stack record.
\item{} \dwcfa{nop()}~:
\item{} \dwcfa{nop()}:
do nothing (padding)
\end{itemize}
@ -516,7 +513,7 @@ to define $\reg{rax}$ to the value contained in memory 16 bytes below the CFA,
we would have $\reg{rax} \mapsto \valaddr{\reg{CFA}, -16}$, since the stack
grows downwards.
\subsection{Target language~: a C function body}
\subsection{Target language: a C function body}
The target language of these semantics is a C function, to be interpreted with
respect to the C11 standard~\cite{c11std}. The function is supposed to be run
@ -532,7 +529,7 @@ unless the IP obtained after the first unwinding comes from another shared
object file, for instance a call to \prog{libc}. In this case, unwinding the
second frame will require loading the corresponding DWARF information.
The function is the following~:
The function is the following:
\lstinputlisting[language=C]{src/dw_semantics/c_context.c}

View file

@ -2,17 +2,14 @@
615: sub $0x28,%rsp ; Alloc stack
619: movl $0x1,(%rsp) ; fibo[0]
620: movl $0x1,0x4(%rsp) ; fibo[1]
627:
; Begin for loop
628: mov %rsp,%rax
628: mov %rsp,%rax ; BEGIN FOR
62b: lea 0x18(%rax),%rcx
62f: mov (%rax),%edx
631: add 0x4(%rax),%edx
634: mov %edx,0x8(%rax)
637: add $0x4,%rax
63b: cmp %rcx,%rax
63e: jne 62f <fib7+0x1a>
; End for loop
63e: jne 62f <fib7+0x1a> ; END FOR
640: mov 0x1c(%rsp),%esi
644: lea 0xb9(%rip),%rdi
64b: mov $0x0,%eax