4.4.1. 数据布局信息
在X86TargetMachine构造函数的222行,computeDataLayout()给出X86目标机器的各种数据布局信息:
117 static std::string computeDataLayout(const Triple &TT) {
118 // X86 is little endian
119 std::string Ret = "e";
120
121 Ret += DataLayout::getManglingComponent(TT);
122 // X86 and x32 have 32 bit pointers.
123 if ((TT.isArch64Bit() &&
124 (TT.getEnvironment() == Triple::GNUX32 || TT.isOSNaCl())) ||
125 !TT.isArch64Bit())
126 Ret += "-p:32:32";
127
128 // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
129 if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
130 Ret += "-i64:64";
131 else if (TT.isOSIAMCU())
132 Ret += "-i64:32-f64:32";
133 else
134 Ret += "-f64:32:64";
135
136 // Some ABIs align long double to 128 bits, others to 32.
137 if (TT.isOSNaCl() || TT.isOSIAMCU())
138 ; // No f80
139 else if (TT.isArch64Bit() || TT.isOSDarwin())
140 Ret += "-f80:128";
141 else
142 Ret += "-f80:32";
143
144 if (TT.isOSIAMCU())
145 Ret += "-f128:32";
146
147 // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.
148 if (TT.isArch64Bit())
149 Ret += "-n8:16:32:64";
150 else
151 Ret += "-n8:16:32";
152
153 // The stack is aligned to 32 bits on some ABIs and 128 bits on others.
154 if (!TT.isArch64Bit() && TT.isOSWindows() || TT.isOSIAMCU())
155 Ret += "-a:0:32-S32";
156 else
157 Ret += "-S128";
158
159 return Ret;
160 }
computeDataLayout()根据Triple值确定目标机器的各种数据布局,这个函数返回一个对此进行描述的字符串。这个字符串接着交给TargetMachine构造函数,由其中的DataLayout类型的成员DL对该字符串进行解析。显然字符串的好处是容易调试。
4.4.2. 目标文件格式
在X86TargetMachine构造函数104行的TLOF是一个std::unique_ptr
95 static std::unique_ptr
96 if (TT.isOSBinFormatMachO()) {
97 if (TT.getArch() == Triple::x86_64)
98 return make_unique
99 return make_unique
100 }
101
102 if (TT.isOSFreeBSD())
103 return llvm::make_unique
104 if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())
105 return make_unique
106 if (TT.isOSSolaris())
107 return llvm::make_unique
108 if (TT.isOSFuchsia())
109 return llvm::make_unique
110 if (TT.isOSBinFormatELF())
111 return make_unique
112 if (TT.isOSBinFormatCOFF())
113 return make_unique
114 llvm_unreachable("unknown subtarget type");
115 }
以TargetLoweringObjectFile为基类,LLVM定义了上述所示的若干目标文件格式对象。