浏览代码

changes regarding globals

Jeremy Siek 4 年之前
父节点
当前提交
5e79e028f8
共有 1 个文件被更改,包括 51 次插入47 次删除
  1. 51 47
      book.tex

+ 51 - 47
book.tex

@@ -5123,7 +5123,6 @@ of the \key{if} is taken.  The element at index $0$ of \code{t} is
 \begin{array}{lcl}
 \begin{array}{lcl}
   \Type &::=& \gray{\key{Integer} \mid \key{Boolean}}
   \Type &::=& \gray{\key{Integer} \mid \key{Boolean}}
   \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}\\
   \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}\\
-  \itm{cmp} &::= & \gray{ \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} } \\
   \Exp &::=& \gray{  \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-}\;\Exp\;\Exp) }  \\
   \Exp &::=& \gray{  \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-}\;\Exp\;\Exp) }  \\
   &\mid&  \gray{  \Var \mid (\key{let}~([\Var~\Exp])~\Exp)  }\\
   &\mid&  \gray{  \Var \mid (\key{let}~([\Var~\Exp])~\Exp)  }\\
   &\mid& \gray{ \key{\#t} \mid \key{\#f} 
   &\mid& \gray{ \key{\#t} \mid \key{\#f} 
@@ -5164,8 +5163,6 @@ of the \key{if} is taken.  The element at index $0$ of \code{t} is
 \begin{minipage}{0.96\textwidth}
 \begin{minipage}{0.96\textwidth}
 \[
 \[
 \begin{array}{lcl}
 \begin{array}{lcl}
-  \itm{bool} &::=& \key{\#t} \mid \key{\#f} \\
-  \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
 \Exp &::=& \gray{ \INT{\Int} \mid \READ{} \mid \NEG{\Exp} } \\
 \Exp &::=& \gray{ \INT{\Int} \mid \READ{} \mid \NEG{\Exp} } \\
      &\mid& \gray{ \ADD{\Exp}{\Exp} 
      &\mid& \gray{ \ADD{\Exp}{\Exp} 
       \mid \BINOP{\code{'-}}{\Exp}{\Exp} } \\
       \mid \BINOP{\code{'-}}{\Exp}{\Exp} } \\
@@ -5905,7 +5902,9 @@ start:
 In this pass we generate x86 code for most of the new operations that
 In this pass we generate x86 code for most of the new operations that
 were needed to compile tuples, including \code{Allocate},
 were needed to compile tuples, including \code{Allocate},
 \code{Collect}, \code{vector-ref}, \code{vector-set!}, and
 \code{Collect}, \code{vector-ref}, \code{vector-set!}, and
-\code{void}. We postpone \code{GlobalValue} to \code{print-x86}.
+\code{void}. We compile \code{GlobalValue} to \code{Global} because
+the later has a different concrete syntax (see
+Figures~\ref{fig:x86-2-concrete} and \ref{fig:x86-2}).
 
 
 The \code{vector-ref} and \code{vector-set!} forms translate into
 The \code{vector-ref} and \code{vector-set!} forms translate into
 \code{movq} instructions with the appropriate \key{deref}.  (The
 \code{movq} instructions with the appropriate \key{deref}.  (The
@@ -5943,8 +5942,8 @@ pointer mask region of the tag.
 \begin{lstlisting}
 \begin{lstlisting}
    |$\itm{lhs}$| = (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|));
    |$\itm{lhs}$| = (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|));
    |$\Longrightarrow$|
    |$\Longrightarrow$|
-   movq (global free_ptr), |$\itm{lhs}'$|
-   addq $|$8(\itm{len}+1)$|, (global free_ptr)
+   movq free_ptr(%rip), |$\itm{lhs}'$|
+   addq $|$8(\itm{len}+1)$|, free_ptr(%rip)
    movq |$\itm{lhs}'$|, %r11
    movq |$\itm{lhs}'$|, %r11
    movq $|$\itm{tag}$|, 0(%r11)
    movq $|$\itm{tag}$|, 0(%r11)
 \end{lstlisting}
 \end{lstlisting}
@@ -5964,6 +5963,23 @@ the register allocator.
 \end{lstlisting}
 \end{lstlisting}
 
 
 
 
+
+\begin{figure}[tp]
+\fbox{
+\begin{minipage}{0.96\textwidth}
+\[
+\begin{array}{lcl}
+  \Arg &::=& \gray{ \key{\$}\Int \mid \key{\%}\Reg \mid \Int\key{(}\key{\%}\Reg\key{)} \mid \key{\%}\itm{bytereg} } \mid \Var \key{(\%rip)} \\
+x86_1 &::= & \gray{ \key{.globl main} }\\
+      &    & \gray{ \key{main:} \; \Instr^{+} }
+\end{array}
+\]
+\end{minipage}
+}
+\caption{The concrete syntax of x86$_2$  (extends x86$_1$ of Figure~\ref{fig:x86-1-concrete}).}
+\label{fig:x86-2-concrete}
+\end{figure}
+
 \begin{figure}[tp]
 \begin{figure}[tp]
 \fbox{
 \fbox{
   \begin{minipage}{0.96\textwidth}
   \begin{minipage}{0.96\textwidth}
@@ -5973,20 +5989,7 @@ the register allocator.
   \Arg &::=&  \gray{  \INT{\Int} \mid \REG{\Reg} \mid \DEREF{\Reg}{\Int}
   \Arg &::=&  \gray{  \INT{\Int} \mid \REG{\Reg} \mid \DEREF{\Reg}{\Int}
    \mid \BYTEREG{\Reg}} \\
    \mid \BYTEREG{\Reg}} \\
    &\mid& (\key{Global}~\Var) \\
    &\mid& (\key{Global}~\Var) \\
-\itm{cc} & ::= & \gray{  \key{e} \mid \key{l} \mid \key{le} \mid \key{g} \mid \key{ge}  } \\
-\Instr &::=& \gray{ \BININSTR{\code{'addq}}{\Arg}{\Arg} 
-       \mid \BININSTR{\code{'subq}}{\Arg}{\Arg} } \\
-       &\mid& \gray{ \BININSTR{\code{'movq}}{\Arg}{\Arg} 
-       \mid \UNIINSTR{\code{'negq}}{\Arg} } \\
-       &\mid& \gray{ \CALLQ{\itm{label}} \mid \RETQ{} 
-       \mid \PUSHQ{\Arg} \mid \POPQ{\Arg} \mid \JMP{\itm{label}} } \\
-       &\mid& \gray{ \BININSTR{\code{'xorq}}{\Arg}{\Arg}
-       \mid \BININSTR{\code{'cmpq}}{\Arg}{\Arg} }\\
-       &\mid& \gray{ \BININSTR{\code{'set}}{\itm{cc}}{\Arg} 
-       \mid \BININSTR{\code{'movzbq}}{\Arg}{\Arg} }\\
-       &\mid& \gray{ \JMPIF{\itm{cc}}{\itm{label}} } \\
-\Block &::= & \gray{ \BLOCK{\itm{info}}{\Instr^{+}} } \\
-x86_1 &::= & \gray{ \PROGRAM{\itm{info}}{\CFG{\key{(}\itm{label} \,\key{.}\, \Block \key{)}^{+}}} }
+x86_2 &::= & \gray{ \PROGRAM{\itm{info}}{\CFG{\key{(}\itm{label} \,\key{.}\, \Block \key{)}^{+}}} }
 \end{array}
 \end{array}
 \]
 \]
 \end{minipage}
 \end{minipage}
@@ -5995,21 +5998,21 @@ x86_1 &::= & \gray{ \PROGRAM{\itm{info}}{\CFG{\key{(}\itm{label} \,\key{.}\, \Bl
 \label{fig:x86-2}
 \label{fig:x86-2}
 \end{figure}
 \end{figure}
 
 
-The syntax of the $x86_2$ language is defined in
-Figure~\ref{fig:x86-2}.  It differs from x86$_1$ just in the addition
-of the form for global variables.
+The concrete and abstract syntax of the $x86_2$ language is defined in
+Figures~\ref{fig:x86-2-concrete} and \ref{fig:x86-2}.  It differs from
+x86$_1$ just in the addition of the form for global variables.
 %
 %
 Figure~\ref{fig:select-instr-output-gc} shows the output of the
 Figure~\ref{fig:select-instr-output-gc} shows the output of the
 \code{select-instructions} pass on the running example.
 \code{select-instructions} pass on the running example.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \centering
 \centering
-\begin{minipage}{0.75\textwidth}
 % tests/s2_17.rkt
 % tests/s2_17.rkt
+\begin{minipage}[t]{0.5\textwidth}
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 block35:
 block35:
-    movq (global free_ptr), alloc9024
-    addq $16, (global free_ptr)
+    movq free_ptr(%rip), alloc9024
+    addq $16, free_ptr(%rip)
     movq alloc9024, %r11
     movq alloc9024, %r11
     movq $131, 0(%r11)
     movq $131, 0(%r11)
     movq alloc9024, %r11
     movq alloc9024, %r11
@@ -6023,44 +6026,48 @@ block35:
 block36:
 block36:
     movq $0, collectret9027
     movq $0, collectret9027
     jmp block35
     jmp block35
-block37:
-    movq %r15, %rdi
-    movq $16, %rsi
-    callq 'collect
-    jmp block35
 block38:
 block38:
-    movq (global free_ptr), alloc9020
-    addq $16, (global free_ptr)
+    movq free_ptr(%rip), alloc9020
+    addq $16, free_ptr(%rip)
     movq alloc9020, %r11
     movq alloc9020, %r11
     movq $3, 0(%r11)
     movq $3, 0(%r11)
     movq alloc9020, %r11
     movq alloc9020, %r11
     movq vecinit9021, 8(%r11)
     movq vecinit9021, 8(%r11)
     movq $0, initret9022
     movq $0, initret9022
     movq alloc9020, vecinit9025
     movq alloc9020, vecinit9025
-    movq (global free_ptr), tmp9031
+    movq free_ptr(%rip), tmp9031
     movq tmp9031, tmp9032
     movq tmp9031, tmp9032
     addq $16, tmp9032
     addq $16, tmp9032
-    movq (global fromspace_end), tmp9033
+    movq fromspace_end(%rip), tmp9033
     cmpq tmp9033, tmp9032
     cmpq tmp9033, tmp9032
     jl block36
     jl block36
     jmp block37
     jmp block37
-block39:
-    movq $0, collectret9023
-    jmp block38
-block40:
+block37:
     movq %r15, %rdi
     movq %r15, %rdi
     movq $16, %rsi
     movq $16, %rsi
     callq 'collect
     callq 'collect
+    jmp block35
+block39:
+    movq $0, collectret9023
     jmp block38
     jmp block38
+\end{lstlisting}
+\end{minipage}
+\begin{minipage}[t]{0.45\textwidth}
+\begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 start:
 start:
     movq $42, vecinit9021
     movq $42, vecinit9021
-    movq (global free_ptr), tmp9028
+    movq free_ptr(%rip), tmp9028
     movq tmp9028, tmp9029
     movq tmp9028, tmp9029
     addq $16, tmp9029
     addq $16, tmp9029
-    movq (global fromspace_end), tmp9030
+    movq fromspace_end(%rip), tmp9030
     cmpq tmp9030, tmp9029
     cmpq tmp9030, tmp9029
     jl block39
     jl block39
     jmp block40
     jmp block40
+block40:
+    movq %r15, %rdi
+    movq $16, %rsi
+    callq 'collect
+    jmp block38
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 \caption{Output of the \code{select-instructions} pass.}
 \caption{Output of the \code{select-instructions} pass.}
@@ -6113,16 +6120,12 @@ stack.
 \section{Print x86}
 \section{Print x86}
 \label{sec:print-x86-gc}
 \label{sec:print-x86-gc}
 
 
-
-\margincomment{\scriptsize We need to show the translation to x86 and what
-  to do about global. \\ --Jeremy}
-
 Figure~\ref{fig:print-x86-output-gc} shows the output of the
 Figure~\ref{fig:print-x86-output-gc} shows the output of the
 \code{print-x86} pass on the running example. In the prelude and
 \code{print-x86} pass on the running example. In the prelude and
 conclusion of the \code{main} function, we treat the root stack very
 conclusion of the \code{main} function, we treat the root stack very
 much like the regular stack in that we move the root stack pointer
 much like the regular stack in that we move the root stack pointer
-(\code{r15}) to make room for all of the spills to the root stack,
-except that the root stack grows up instead of down.  For the running
+(\code{r15}) to make room for the spills to the root stack, except
+that the root stack grows up instead of down.  For the running
 example, there was just one spill so we increment \code{r15} by 8
 example, there was just one spill so we increment \code{r15} by 8
 bytes. In the conclusion we decrement \code{r15} by 8 bytes.
 bytes. In the conclusion we decrement \code{r15} by 8 bytes.
 
 
@@ -6195,6 +6198,7 @@ start:
 	movq	$16, %rsi
 	movq	$16, %rsi
 	callq	collect
 	callq	collect
 	jmp block38
 	jmp block38
+        
 	.globl main
 	.globl main
 main:
 main:
 	pushq	%rbp
 	pushq	%rbp