LLVM学习笔记(59)

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<TargetLoweringObjectFile>智能指针,createTLOF()根据编译器的triple值确定具体的目标文件格式。

95       static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {

96         if (TT.isOSBinFormatMachO()) {

97           if (TT.getArch() == Triple::x86_64)

98             return make_unique<X86_64MachoTargetObjectFile>();

99           return make_unique<TargetLoweringObjectFileMachO>();

100       }

101    

102       if (TT.isOSFreeBSD())

103         return llvm::make_unique<X86FreeBSDTargetObjectFile>();

104       if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())

105         return make_unique<X86LinuxNaClTargetObjectFile>();

106       if (TT.isOSSolaris())

107         return llvm::make_unique<X86SolarisTargetObjectFile>();

108       if (TT.isOSFuchsia())

109         return llvm::make_unique<X86FuchsiaTargetObjectFile>();

110       if (TT.isOSBinFormatELF())

111         return make_unique<X86ELFTargetObjectFile>();

112       if (TT.isOSBinFormatCOFF())

113         return make_unique<TargetLoweringObjectFileCOFF>();

114       llvm_unreachable("unknown subtarget type");

115     }

以TargetLoweringObjectFile为基类,LLVM定义了上述所示的若干目标文件格式对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值