Kaleidoscope前面还有两章,我看了但是不想写下来了。
这次看的是第8章,进行后端输出exe文件。
因为是后端,所以涉及Target(目标平台),所以首先要定义目标机器的一些特性。
先看看LLVM关于Target的一些定义。LLVM关于目标平台的记录一共分两类,TargetMachine是目标平台的,MachineCode是目标机的语言的。
TargetMachine:
1.DataLayout: 关于数据设置,比如不同类型的内存等
2. TargetRegisterInfo:寄存器的相关设置
3. TargetInstrInfo:指令的设置
4.TargetFrameInfo: 架构的信息
5. TargetJITInfo: 是否支持JIT
MachineCode:
1.MachineInstr:指令设置
2.MachineBasicBlock:基本块的设置
3.MachineFunction:函数的设置
4.MachineInstr Bundles:命令的
在这个例子,他也是这样的。
这个例子在main中添加了硬件的初始化。而且例子中一下子就初始了所有的目标平台等。还设置CPU等,这点我觉得很神奇,这编译器难道还能根据不同的cpu进行不同的编译吗?
编译时嵌入在代码内的,在设置目标文件名称后,使用这一段函数进行创建,这一段我还不是很懂
auto FileType = TargetMachine::CGFT_ObjectFile;
if (TheTargetMachine->addPassesToEmitFile(pass, dest, nullptr, FileType)) {
errs() << "TheTargetMachine can't emit a file of this type";
return 1;
}