Clang/LLVM 在 Windows 更新
现在是时候更新 Clang 支持构建原生 Windows 程序,与 Visual C++ 兼容! 在过去几个月里我们一直在努力,并在各个方面改进工具链。 除了调试信息和异常之外,所有 C++ 功能应该都能正常工作。 此 链接 提供更具体的细节。 在 2 月份,我们实现了令人兴奋的里程碑,可以使用 clang-cl (无需回退) 自宿主 Clang 和 LLVM,并且这两个项目都通过了所有测试! 此外,Chrome 和 Firefox 现在都可以使用回退成功编译! 以下是一些近期改进的亮点:
已完成 Microsoft 兼容记录布局! 它已通过彻底的模糊测试,并支持所有 Microsoft 特定组件,例如虚基表指针,vtordisps,__declspec(align) 和 #pragma pack。 事实证明,由于各种功能之间的微妙相互作用,这是一个重大努力。 例如,__declspec(align) 和 #pragma pack 的行为类似于 gcc 变体,但它们彼此之间的交互方式不同。每个版本的 Visual Studio 都会稍微更改 ABI。 截至今日,clang-cl 与 VS2013 的布局兼容。
Clang 现在支持所有在 VS2012 之前使用的调用约定。 VS2013 添加了一些我们尚未实现的新约定。 我们克服的另一个主要兼容性挑战是在 32 位 x86 上按值传递 C++ 对象。 在此努力之前,LLVM 将所有传出参数建模为 SSA 值,这使得获取对调用参数地址的操作变得不可能。 事实证明,在 Windows 上,按值传递的 C++ 对象直接构建到用于函数调用的参数内存中。 在该领域实现 100% 兼容性需要对 LLVM IR 进行根本性更改,以便我们可以计算该地址。
最近,对运行时类型信息 (RTTI) 的支持已完成。 使用 RTTI 支持,可以编译更多程序和库(例如 ICU)无需回退,并且 dynamic_cast 和 typeid 都可以正常工作。 RTTI 支持还带来了对 std::function 的支持。 我们最近还添加了对 lambda 表达式的支持,因此您可以享受所有 C++11 的功能优势!