LLVM 项目博客

LLVM 项目新闻和来自战壕的细节

LLVM 每周 - #3,2014 年 1 月 20 日

欢迎来到 LLVM 每周的第三期,这是一份每周发布的新闻简报(每周一发布),涵盖 LLVM、Clang 和相关项目的发展动态。LLVM 每周由 Alex Bradbury 为您提供。在 http://llvmweekly.org 订阅未来期刊,并转发给您认为可能感兴趣的任何人。请将任何提示或反馈发送至 [email protected],或在 Twitter 上发送至 @llvmweekly@asbradbury

本期的规范网址 可以在 llvmweekly.org 找到

来自网络的新闻和文章

Eli Bendersky 撰写了 关于 LLVM 与 libjit 的一些想法。Eli 将 libjit 描述为更有限,但由于其专注性,更容易理解和上手。他还提出了一些有趣的观点,例如“说实话,我认为在 LLVM 的框架内不可能创建真正快速的 JIT,因为它的模块化。JIT 越快,您就越需要偏离 LLVM 的框架”。除了博客文章中的直接评论外,还有一些关于 Reddit 的良好讨论。

版本 2.0-RC1 Capstone 反汇编框架已发布。Capstone 是使用 LLVM 代码构建的。新版本具有降低的内存使用率、更快的 Python 绑定以及对 PowerPC 的支持,以及其他更改。

Planet Clang宣布。它是一个新闻源,跟踪来自 Clang 和 LLVM 提交者和贡献者的博客文章。博客列表目前还很短,但欢迎您通过公告帖子中的电子邮件地址提交您的 RSS 提要。

即将在下个月的 CGO 上发表的论文的 PDF 已发布。 WatchdogLite:基于硬件加速的编译器指针检查 提出了指令集扩展以加速指针检查函数,并以 29% 的性能开销作为回报来实现内存安全。编译器扩展了(并与之进行了比较)SoftBound + CETS

在邮件列表上

  • David Woodhouse 发布了 关于 LLVM 中 16 位 x86 状态的详细更新。David 成功地构建了 Linux 内核的 16 位启动代码,并邀请大家在真实代码上开始测试它。

  • Tom Stellard 开始了关于 稳定 LLVM 3.4.x 版本 的讨论。许多人自愿提供帮助,并且似乎普遍同意,任何 3.4.1 版本都将只包含错误修复,而不会进行 ABI 更改。

  • Diego Novillo 正在寻求利用配置文件信息和循环展开来提高 SPEC 基准 libquantum 的性能 。Sean Silva 为我们做了很棒的服务,要求澄清在这种情况下“运行时展开器”的含义。答案是循环执行的次数(循环执行的次数)在编译时是未知的。如果您对循环展开或矢量化感兴趣,建议您阅读此线程。

  • Aaron Ballman 已 成为属性子系统的代码所有者,并获得了全体一致的批准。

  • Skye Wanderman-Milne 正在寻求帮助 使用 C++ API 展开单个函数的循环。仅仅将 LoopUnrollPass 添加到 FunctionPassManager 并没有效果,但在从邮件列表中得到一些建议后,Skye 确实回复确认,一组 ScalarReplAggregates、LoopRotate 和 LoopUnroll 通道确实产生了预期效果。

  • Tobias Grosser 询问为什么 LLVM 的 LNT(用于性能跟踪)默认使用 通过取最小值而不是平均值来聚合结果。回复很快集中在实际问题上,即结果可能“嘈杂”,可能是由于机器上的其他进程,但也量化为某些值,因为计时器与基准测试的执行时间相比比较粗粒度。

  • 本周的未解决问题来自 Keith Walker,他注意到,在 ARM 上,GCC 和 LLVM 在生成的函数序言中最终会 使用帧寄存器指向不同的地址。LLVM 序言导致帧指针指向推入的 r11 寄存器(已保存的帧指针)之后,而在 GCC 中,帧指针指向推入的链接寄存器之后。这种差异使得难以生成通用的堆栈遍历器。

LLVM 提交

  • MCJIT 远程执行协议已进行大量重构,希望在之前无法正常工作的 ARM 上进行修复。但是,ARM 上仍然存在一些随机故障,请参见 错误 18507r199261

  • 尝试将 switch 转换为查找表的截止值已从 4 更改为 3。通过实验,Hans Wennborg 发现有两个情况没有加速,但三个情况产生了加速。在构建 Clang 时,这会导致 480 个新的 switch 被转换,并且二进制文件大小减少了 8KB。 r199294

  • 引入了对 preserve_mostccpreserve_allcc 调用约定 的支持,并针对 x86-64 进行了实现。这些调用约定旨在由将来的 ObjectiveC 运行时版本使用,以减少运行时调用的开销。 r199508

  • 配置脚本现在检查是否具有足够现代的主机编译器(Clang 3.1 或 GCC 4.7)r199182

  • 对新的 PassManager 驱动程序进行了更多工作。现在可以使用新的 PM 来写入位代码,并且已执行更多准备/清理工作。 r199078r199095r199104

  • Dominators.h 和 Verifier.h 已从 Analysis 目录移动到 IR 目录。 r199082

  • DAGCombiner 学习了重新关联(即更改顺序)向量运算 r199135

  • dllexport 和 dllimport 不再表示为链接类型 r199218

  • 修复了 ARM 汇编中 .symver 指令的解析 r199339

Clang 提交

  • MS ABI 现在默认用于 Win32 目标 r199131

  • MicrosoftMode 语言选项已重命名为 MSVCCompat,并对其作用进行了澄清(有关 MicrosoftExt 与 MSVCCompat 的描述,请参见提交消息)。 r199209

  • -cxx-abi 命令行标志已被删除,而是根据目标推断。 r199250

  • 分析器了解到,将常量值按其位宽移位是未定义的。 r199405

  • nonnull 属性现在可以直接应用于参数。 r199467

  • 编译器驱动程序中添加了对 NetBSD 上的 AArch64 的支持。 r199124

其他项目提交

  • compiler-rt 中的 AddressSanitizer 获得了以“停用”模式启动的能力。它可以在 instrumented 库中调用 __asan_init 时被激活。 r199377

  • 许多补丁已提交给 lld 以更好地支持 MIPS。 r199231 以及更多。

  • lldb 在主机三元组的供应商部分识别 Linux 发行版。例如 x86_64-ubuntu-linux-gnur199510