Skip to content
This repository was archived by the owner on Feb 2, 2022. It is now read-only.

Commit beefe34

Browse files
committed
update chapter 12
1 parent 78a771c commit beefe34

File tree

11 files changed

+83
-83
lines changed

11 files changed

+83
-83
lines changed

content/3/chapter12/0.tex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
LLVM有一个非常灵活的架构。您还可以向它添加一个新的后端,后端的核心是目标描述,大部分代码都是从它生成的。但是,还不可能生成一个完整的后端,并且实现调用规则需要进行手动编码。本章中,我们将学习如何添加对老CPU的支持。\par
1+
LLVM有一个非常灵活的架构。您可以向它添加一个新的后端,后端的核心是目标描述,大部分代码都是从它生成的。但是,还不可能生成一个完整的后端,并且实现调用规则需要进行手动编码。本章中,我们将学习如何添加对老CPU的支持。\par
22

3-
在本章中,我们将学习以下内容:\par
3+
本章中,我们将学习以下内容:\par
44

55
\begin{itemize}
6-
\item 在设置一个新的后端时,我们将向您介绍M88k CPU体系架构,并向您展示在哪里可以找到您需要的信息。
6+
\item 设置一个新的后端时,我们将向您介绍M88k CPU体系架构,并向您展示在哪里可以找到您需要的信息。
77

88
\item 将新的体系结构添加到Triple类中,将教会您如何让LLVM了解新的CPU体系架构。
99

1010
\item 在扩展LLVM中的ELF文件格式定义时,可以向处理ELD对象文件的库和工具中添加对m88k特定重定位的支持。
1111

12-
\item 在创建目标描述时,您将使用TableGen语言开发目标描述的所有部分。
12+
\item 创建目标描述时,您将使用TableGen语言开发目标描述的所有部分。
1313

14-
\item 在实现DAG指令选择类时,您将创建指令选择所需的Pass和支持的类。
14+
\item 实现DAG指令选择类时,您将创建指令选择所需的Pass和支持的类。
1515

1616
\item 生成汇编指令时,会带您了解如何实现汇编打印,生成汇编文本。
1717

@@ -22,7 +22,7 @@
2222
\item 将这些功能整合在一起时,就可以将新后端的源代码集成到构建系统中。
2323
\end{itemize}
2424

25-
在本章结束时,您将了解如何开发一个新的和完整的后端。您将了解后台的不同组成部分,从而更深入地了解LLVM体系结构。\par
25+
本章结束时,您将了解如何开发一个新的和完整的后端。您将了解后台的不同组成部分,从而更深入地了解LLVM体系结构。\par
2626

2727

2828

content/3/chapter12/10.tex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
我们还需要提供llvm/lib/Target/M88k/CMakeLists.txt来构建目标。除了列出目标的C++文件外,还定义了从目标描述生成源文件的方法。\par
88

9-
\begin{tcolorbox}[colback=blue!5!white,colframe=blue!75!black, title=从目标描述生成所有类型的源]
9+
\begin{tcolorbox}[colback=blue!5!white,colframe=blue!75!black, title=从目标描述生成所有类型的源码]
1010
llvm-tblgen工具的不同运行方式,会生成C++代码的不同部分。但是,建议将所有部件的生成添加到CMakeLists.txt文件中。这样做的原因是能提供了更好的检查,例如:如果您在指令编码方面犯了错误,那么这只会在反汇编程序生成代码期间捕获。因此,即使不打算支持反汇编程序,仍值得为其生成源码。
1111
\end{tcolorbox}
1212

@@ -63,13 +63,13 @@
6363
\$ bin/llc –version
6464
\end{tcolorbox}
6565

66-
注册目标的输出应该包含以下行:\par
66+
注册目标的输出:\par
6767

6868
\begin{tcolorbox}[colback=white,colframe=black]
6969
m88k \hspace{2cm} - M88k
7070
\end{tcolorbox}
7171

72-
噢耶!我们完成了后端实现。让我们试一下。下面LLVM IR中的f1函数在函数的两个参数之间执行一个按位的AND操作并返回结果。将其保存成example.ll文件:\par
72+
噢耶!我们完成了后端实现。下面LLVM IR中的f1函数在函数的两个参数之间执行一个按位的AND操作并返回结果。将其保存成example.ll文件:\par
7373

7474
\begin{tcolorbox}[colback=white,colframe=black]
7575
target triple = "m88k-openbsd" \\
@@ -103,7 +103,7 @@
103103
104104
输出是有效的GNU语法。对于f1函数,将生成和和jmp指令。参数在\%r2和\%r3寄存器中传递,这两个寄存器在and指令中使用。结果存储在\%r2寄存器中,该寄存器也是返回32位值的寄存器。函数的返回通过分支到\%r1寄存器中的hold地址实现,该地址也与ABI匹配。一切看起来都很好!\par
105105
106-
学习了本章中的内容,您现在可以实现自己的LLVM后端。对于许多相对简单的CPU,如:数字信号处理器(DSP),您只需要实现这些功能就够用了。当然,M88k CPU体系结构的实现还不支持该体系架构的所有特性,例如:浮点寄存器。不过,现在您已经了解了LLVM后端开发中所有重要概念,有了这些知识,您将能够添加任何缺失的部分!\par
106+
学习了本章中的内容,现在可以实现自己的LLVM后端。对于许多相对简单的CPU,如:数字信号处理器(DSP),只需要实现这些功能就够用了。当然,M88k CPU体系结构的实现还不支持该体系架构的所有特性,例如:浮点寄存器。不过,现在已经了解了LLVM后端开发中所有重要概念,有了这些知识,您将能够添加任何缺失的部分!\par
107107
108108
109109

content/3/chapter12/11.tex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
在本章中,您学习了如何为LLVM开发一个新的后端目标。首先收集了所需的文档,并通过增强Triple类使LLVM了解了新的体系结构。该文档还包括ELF文件格式的重定位定义,并向LLVM添加了对此的支持。\par
1+
本章中,学习了如何为LLVM开发一个新的后端目标。首先收集了所需的文档,并通过增强Triple类使LLVM了解了新的体系结构。该文档还包括ELF文件格式的重定位定义,并向LLVM添加了对此的支持。\par
22

3-
您了解了目标描述包含的不同部分,并使用它生成C++代码,了解了如何实现指令选择。为了输出生成的代码,开发了一个汇编打印器,并了解了需要哪些支持类来写入目标文件。还学习了如何添加对反汇编的支持,反汇编用于将目标文件转换回汇编文本。最后,您扩展了构建系统以在构建中包含新目标\par
3+
了解了目标描述包含的不同部分,并使用它生成C++代码,了解了如何实现指令选择。为了输出生成的代码,开发了一个汇编打印器,并了解了需要哪些支持类来写入目标文件。还学习了如何添加对反汇编的支持,反汇编用于将目标文件转换回汇编文本。最后,扩展了构建系统以在构建中包含新目标\par
44

55
现在,您已经具备了在自己的项目中创造性地使用LLVM所需的一切。LLVM生态系统是非常活跃的,一直在添加新功能,所以请务必跟上它的发展!\par
66

7-
作为一名编译器开发人员,我很高兴能够写关于LLVM的文章,并在此过程中发现了一些新的特性。希望你在LLVM中玩得开心! :)
7+
作为一名编译器开发人员,我很高兴能够写关于LLVM的文章,并在此过程中发现了一些新的特性。希望你也能在LLVM中玩得开心! :)
88

99
\newpage

content/3/chapter12/2.tex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
无论是商业上需要支持一个新的CPU,还是只是一个业余项目需要添加对一些旧架构的支持,为LLVM添加一个新的后端都是一项重要任务。以下部分概述了开发新后端所需的内容。我们将为摩托罗拉M88k架构添加一个后端,这是一个20世纪80年代的RISC架构。\par
1+
无论是商业上需要支持一个新的CPU,还是只是一个业余项目需要添加对一些旧架构的支持,为LLVM添加一个新后端都是一项重要任务。以下部分概述了开发新后端所需的内容。我们将为摩托罗拉M88k架构添加一个后端,这是一个20世纪80年代的RISC架构。\par
22

33
\begin{tcolorbox}[colback=blue!5!white,colframe=blue!75!black, title=References]
4-
\hspace*{0.7cm}你可以在维基百科上阅读更多关于该架构的信息:\url{https://en.wikipedia.org/wiki/Motorola_88000}。关于这个体系结构的重要信息仍然可以在互联网上找到可以在\url{http://www.bitsavers.org/components/motorola/88000/}找到带有指令集和计时信息的CPU手册,和SystemV ABI M88k处理器补充ELF格式的定义和调用规则可以在\url{https://archive.org/details/bitsavers_attunixSysa0138776555SystemVRelease488000ABI1990_8011463}找到。\par
4+
\hspace*{0.7cm}可以在维基百科上阅读更多关于该架构的信息:\url{https://en.wikipedia.org/wiki/Motorola_88000}。关于这个体系结构的重要信息仍然可以在互联网上找到可以在\url{http://www.bitsavers.org/components/motorola/88000/}找到带有指令集和计时信息的CPU手册,和SystemV ABI M88k处理器补充ELF格式的定义和调用规则可以在\url{https://archive.org/details/bitsavers_attunixSysa0138776555SystemVRelease488000ABI1990_8011463}找到。\par
55

66
\hspace*{0.7cm}OpenBSD(可在\url{https://www.openbsd.org/}获得)仍然支持LUNA-88k系统。在OpenBSD系统上,很容易为M88k创建一个GCC交叉编译器。GXemul可在\url{http://gavare。se/gxemul/}查看相应资料,并且其有一个模拟器能够运行针对M88k体系结构的某些OpenBSD版本。
77
\end{tcolorbox}
88

9-
总的来说,M88k体系结构已经淘汰很久了,但是我们找到了足够的信息和工具,为它添加一个LLVM后端。我们将从一个非常基本的任务开始,并扩展到Triple类。\par
9+
总的来说,M88k体系结构已经淘汰很久了,但是我们找到了足够的信息和工具,可以为它添加一个LLVM后端。我们将从一个非常基本的任务开始,并扩展到Triple类。\par
1010

1111

1212

content/3/chapter12/3.tex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
};
1616
\end{lstlisting}
1717

18-
在llvm/lib/Support/Triple.cpp文件中,有许多使用ArchType枚举的地方。你需要扩展它们,例如:在getArchTypeName()方法中,添加一个新的case:\par
18+
在llvm/lib/Support/Triple.cpp文件中,有许多使用ArchType枚举的地方。需要扩展它们,例如:在getArchTypeName()方法中,添加一个新的case:\par
1919

2020
\begin{lstlisting}[caption={}]
2121
switch (Kind) {
@@ -24,7 +24,7 @@
2424
}
2525
\end{lstlisting}
2626

27-
在大多数情况下,如果您忘记在某个函数中处理新的m88k枚举成员,编译器会发出警告。接下来,我们将扩展可执行和可链接格式(ELF)定义。\par
27+
大多数情况下,如果忘记在某个函数中处理新的m88k枚举成员,编译器会发出警告。接下来,我们将扩展可执行和可链接格式(ELF)定义。\par
2828

2929

3030

content/3/chapter12/4.tex

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ELF文件格式是LLVM支持读写的二进制对象文件格式之一。ELF本身是为许多CPU架构结构定义的,对于M88k体系架构也有一个定义。我们需要做的就是添加重定位的定义和一些标志。重定位可在System V ABI M88k处理器手册的第4章看到:\par
22

33
\begin{enumerate}
4-
\item 我们需要在llvm/include/llvm/BinaryFormat/ELFRelocs/M88k.def文件中输入以下内容:
4+
\item 需要在llvm/include/llvm/BinaryFormat/ELFRelocs/M88k.def文件中输入以下内容:
55
\begin{lstlisting}[caption={}]
66
#ifndef ELF_RELOC
77
#error "ELF_RELOC must be defined"
@@ -11,7 +11,7 @@
1111
// Many more…
1212
\end{lstlisting}
1313

14-
\item 我们还在llvm/include/llvm/BinaryFormat/ELF.h文件中添加了一些标志,并包含了重定位定义:
14+
\item 还需要在llvm/include/llvm/BinaryFormat/ELF.h文件中添加了一些标志,并包含了重定位定义:
1515
\begin{lstlisting}[caption={}]
1616
// M88k Specific e_flags
1717
enum : unsigned {
@@ -27,7 +27,7 @@
2727
\end{lstlisting}
2828
代码可以添加到文件中的任何地方,但最好保持排序顺序,并在MIPS体系结构的代码之前插入它。
2929

30-
\item 我们还需要扩展其他一些方法。在llvm/include/llvm/Object/ELFObjectFile.h文件中,有一些方法可以在枚举成员和字符串之间进行转换,例如:我们必须在getFileFormatName()方法中添加新的case语句:
30+
\item 还需要扩展其他一些方法。在llvm/include/llvm/Object/ELFObjectFile.h文件中,有一些方法可以在枚举成员和字符串之间进行转换,例如:必须在getFileFormatName()方法中添加新的case语句:
3131
\begin{lstlisting}[caption={}]
3232
switch (EF.getHeader()->e_ident[ELF::EI_CLASS]) {
3333
// Many more cases
@@ -36,9 +36,9 @@
3636
}
3737
\end{lstlisting}
3838

39-
\item 类似地,我们扩展了getArch()方法。
39+
\item 类似地,扩展了getArch()方法。
4040

41-
\item 最后,我们在llvm/lib/Object/ELF.cpp文件的getELFRelocationTypeName()方法中使用重定位定义:
41+
\item 最后,在llvm/lib/Object/ELF.cpp文件的getELFRelocationTypeName()方法中使用重定位定义:
4242
\begin{lstlisting}[caption={}]
4343
switch (Machine) {
4444
// Many more cases
@@ -54,16 +54,16 @@
5454

5555
\item 为了完成支持,还可以在llvm/lib/ObjectYAML/ELFYAML.cpp文件中,映射ELFYAML::\allowbreak ELF\underline{~}REL枚举的方法中添加重定位。
5656

57-
\item 至此,我们已经以ELF文件格式完成了对m88k体系结构的支持。您可以使用llvm-readobj工具检查ELF对象文件,例如:由OpenBSD上的交叉编译器创建的文件。同样,可以使用yaml2obj工具为m88k体系结构创建一个ELF对象文件。
57+
\item 至此,我们已经以ELF文件格式完成了对m88k体系结构的支持。可以使用llvm-readobj工具检查ELF对象文件,例如:由OpenBSD上的交叉编译器创建的文件。同样,可以使用yaml2obj工具为m88k体系结构创建一个ELF对象文件。
5858

5959
\begin{tcolorbox}[colback=blue!5!white,colframe=blue!75!black, title=是否必须添加对对象文件格式的支持?]
6060

61-
将架构支持集成到ELF文件格式实现中只需要几行代码。如果您为其创建LLVM后端的体系结构使用ELF格式,那么您应该采用此方法。另一方面,添加对全新二进制文件格式的支持本身就是一项复杂的任务。在这种情况下,一种可能的方法是只输出汇编程序文件,并使用外部汇编程序创建对象文件。
61+
将架构支持集成到ELF文件格式实现中只需要几行代码。如果为其创建LLVM后端的体系结构使用ELF格式,那么应该采用此方法。另一方面,添加对全新二进制文件格式的支持本身就是一项复杂的任务。在这种情况下,一种可能的方法是只输出汇编程序文件,并使用外部汇编程序创建对象文件。
6262
\end{tcolorbox}
6363

6464
\end{enumerate}
6565

66-
通过这些添加,ELF文件格式的实现现在支持M88k体系结构。在下一节中,我们将创建M88k体系结构的描述,该描述介绍了该体系结构的指令、寄存器、调用规则,以及其他细节。\par
66+
通过这些添加,ELF文件格式的实现现在支持M88k体系结构。下一节中,我们将创建M88k体系结构的描述,该描述介绍了该体系结构的指令、寄存器、调用规则,以及其他细节。\par
6767

6868

6969

0 commit comments

Comments
 (0)