Fed*_*dor 5 c++ x86-64 cross-compiling visual-studio
我有一个基于 Visual C++ 的 Intel/AMD x64 架构项目。我在最新的 Visual Studio 2022 版本 17.6 中使用 x86 构建工具进行交叉编译。(实际上,Microsoft 支持人员建议解决本机 x64 构建工具经常发生的error C3859: Failed to create virtual memory for PCH问题: https://developercommunity.visualstudio.com/t/error-C3859 :-Failed-to-create-virtual-me/10056333 )fatal error C1076: compiler limit: internal heap limit
我预计用于交叉编译的本机 x64 工具链和 x86 工具链将生成完全相同的汇编代码。但事实上似乎并非总是如此。
我能得到的最小的例子如下:
constexpr float foo(size_t itemCount) {
return ( 10 - 4.0f * ( itemCount - 1 ) ) / float ( itemCount );
}
int main() {
constexpr float a = foo(3);
const float & b = foo(3);
printf( "%g %g", a, b );
}
Run Code Online (Sandbox Code Playgroud)
在使用本机 x64 工具链的发布配置(/O2命令行开关)中<PreferredToolArchitecture>x64</PreferredToolArchitecture>,程序打印0.666667 0.666667,汇编代码为
00007FF7785E1014 movsd xmm1,mmword ptr [__real@3fe5555560000000 (07FF7785E2228h)]
00007FF7785E101C lea rcx,[string "%g %g" (07FF7785E2220h)]
00007FF7785E1023 movaps xmm2,xmm1
00007FF7785E1026 movq r8,xmm1
00007FF7785E102B movq rdx,xmm1
00007FF7785E1030 call printf (07FF7785E1040h)
Run Code Online (Sandbox Code Playgroud)
使用 x86 构建工具进行交叉编译,<PreferredToolArchitecture>x86</PreferredToolArchitecture>使程序打印0.666667 1出汇编代码:
00007FF689721014 movsd xmm2,mmword ptr [__real@3ff0000000000000 (07FF689722230h)]
00007FF68972101C lea rcx,[string "%g %g" (07FF689722220h)]
00007FF689721023 movsd xmm1,mmword ptr [__real@3fe5555560000000 (07FF689722228h)]
00007FF68972102B movq r8,xmm2
00007FF689721030 movq rdx,xmm1
00007FF689721035 call printf (07FF689721050h)
Run Code Online (Sandbox Code Playgroud)
可以看出,这两个值都是在编译期间计算的,但现在它们不同了。
为了简化复制,只需克隆这个GitHub 存储库即可。
使用交叉编译生成的机器代码是否可以不同,或者应该与本机构建工具生成的机器代码完全相同?
来自 Fedor 提交的报告:
https://developercommunity.visualstudio.com/t/x86-build-tools-create-wrong-x64-code/10394622。
此问题的修复已在内部实施,并正在准备发布。
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |