Fix colon spaces, reorganize fib7 listing flow
This commit is contained in:
parent
825b6c3e36
commit
31efc6b32a
2 changed files with 32 additions and 38 deletions
|
@ -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}
|
||||
|
||||
|
@ -553,7 +550,7 @@ kept in subscript.
|
|||
|
||||
\medskip
|
||||
|
||||
Thus, we define $\semI{\bullet}{s}(\bullet) : \DWARF \times \FDE \to \FDE$, for
|
||||
Thus, we define $\semI{\bullet}{s}(\bullet): \DWARF \times \FDE \to \FDE$, for
|
||||
$s$ a stack of $\dwrow$, that is,
|
||||
\[
|
||||
s \in \rowstack := \dwrow^\ast
|
||||
|
@ -642,7 +639,7 @@ this way.}
|
|||
|
||||
\medskip
|
||||
|
||||
We now define $\semC{\bullet} : \DWARF \to C$, in the context presented
|
||||
We now define $\semC{\bullet}: \DWARF \to C$, in the context presented
|
||||
earlier. The translation from $\intermedlang$ to C is defined as follows:
|
||||
|
||||
\begin{itemize}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue