LLVM 每周 - 第 8 期,2014 年 2 月 24 日
欢迎来到 LLVM 每周的第八期,这是一份每周新闻通讯(每周一发布),涵盖 LLVM、Clang 和相关项目的最新进展。LLVM 每周由 Alex Bradbury 编写。订阅未来的期刊,请访问 http://llvmweekly.org,并将其分享给您认为可能感兴趣的任何人。请将任何建议或反馈发送至 asb@asbradbury.org,或在 Twitter 上关注 @llvmweekly 或 @asbradbury。
我将在本周末参加 Raspberry Jamboree,如果你也去的话,一定要打个招呼。
本期文章的正式地址 可在 llvmweekly.org 上找到。
来自网络的新闻和文章
作为 Philip Reames 上周发布的提案的后续,他描述了将精确垃圾收集支持贡献给 LLVM 的计划,他 写了一篇博客文章,说明为什么 llvm.gcroot 内在函数不足以满足此目的。他承诺在后续文章中描述他们决定采取的方法。这篇文章的写作方式让即使不熟悉 GC 实现的人也能理解。他还提出了一些关于 gcroot 的有趣问题,即使在将其用于非重新定位收集器时也是如此。
有些人可能还记得 EuroLLVM 2013 上用于将程序反编译为 LLVM IR 的 Dagger 项目(幻灯片)。承诺的源代码发布没有实现,但开发者 发布了更新,详细说明了他们一直在做什么。已经进行了许多设计更改,并且其中一些工作已作为补丁提交到 LLVM MC 上游。"目前我们没有具体的计划;当我们认为某个补丁已经准备好时,就会将其提交给社区。我们的目标是,在完成之后,我们的工作将成为 LLVM 的一部分,我们和其他所有贡献者都可以继续推动它的发展!"
Tamás Szelei 编写了一份 使用 libclang 和 Python 实现代码生成器的实用指南。
Emscripten 项目 正在准备默认使用其“fastcomp”LLVM 后端。之前他们有一系列用 Javascript 编写的传递,用于将 LLVM IR 转换为 Javascript,但现在已将其实现为 C++ LLVM 后端。有关更多信息,请参见 他们的维基。
Agner 更新了他受欢迎的优化手册,其中包括 AMD Steamroller 处理器的测试结果,并添加了一些有关 AVX-512 的更多信息。
DWARF 调试信息格式委员会 欢迎您在 3 月 31 日之前 对 DWARF 提出意见、建议或更改提案。虽然 DWARF 版本 5 即将完成,但似乎还没有发布草案,因此您必须以 DWARF 4 为基础提出意见。如果您知道其他信息,请告诉我。
对 https://llvm.net.cn/apt/ 进行了一些更新。即将发布的 Ubuntu 14.04 现在是受支持的发行版,此外,LLVM/Clang 的稳定版和开发版都已构建,可以并排安装。
邮件列表中的内容
Renato Golin 提醒我们,虽然正在进行更新所有构建机器以支持 C++11 的工作,但切换到使用
-std=c++11的操作尚未执行,因此您需要稍等片刻,才能在 LLVM/Clang 补丁中使用 C++11 功能。Saleem Abulrasool 指出了在 Linux 内核上运行最新的 Clang 时遇到的问题,该问题与集成汇编器有关。正如经常阅读的读者所知,最近更改了行为,以便对于具有集成汇编器的后端,任何内联汇编代码都将在编译期间由其进行验证,即使是在使用
-S(即输出汇编代码)进行编译时也是如此。问题是,Linux 内核在某些情况下会故意在输出汇编文件时包含无效的汇编代码。早期的回复支持保持当前的行为,那些执行奇怪操作的人可以使用-no-integrated-as开关。针对先前关于 LLVM/Clang 中 unwind 行为的讨论,Logan Chien 发布了他认为存在的问题的详细说明。
Kevin Qin 写了一篇 关于添加寄存器分配约束的问题。在 LLVM 每周中重点介绍的邮件列表主题通常是目前还没有很好的解决方案的棘手问题。我很高兴看到这个问题有一个简单的解决方案,正如 Tim Northover 和 Quentin Colombet 所指出的那样,
@earlyclobber约束可用于确保分配的输出寄存器不同于输入寄存器。在对 CodeGenPrepare 进行更改时,Quentin Combet 注意到他的补丁将引入 libLLVMScalarOpts(CodeGenPrepare 当前所在的位置)对 libLLVMCodeGen 的依赖关系。他 在列表中写道,询问人们对如何解决此问题的看法。形成的共识似乎是应该将其移至 CodeGen。可能,任何直接依赖于 TargetLowering 的 IR 传递也应该移至此处。将 CodeGenPrepare 移至 lib/CodeGen 的操作现在已 提交。
Per Viberg 正在征求意见,以了解他针对改进未初始化参数检测的设计草案。
LLVM 提交
引入了 llvm-profdata 工具。此工具将合并由 Clang 中的 PGO 检测生成的配置文件数据,但以后可能会添加更多功能。 r201535。
在一个早就该进行的清理中,各种成员变量已从 TD 重命名为 DL,以匹配将 TargetData 重命名为 DataLayout 的操作。 r201581、r201827、r201833。此外,名为 DL 的 DebugLoc 变量现在已重命名为 DbgLoc,以避免与 DataLayout 混淆。 r201606。
MCAsmParser 现在支持宏中的必需参数,从而提高了 GNU 汇编器的兼容性。 r201630。
添加了一个新的 TargetLowering 挂钩,
isVectorShiftByScalarCheap,用于指示将向量按标量移位是否比按具有不同通道值的另一个向量移位更便宜。CodeGenPrepare 中的新OptimizeShuffleVectorInst使用它,该指令尝试将 shufflevector 指令下沉到其使用到的基本块中,以便 CodeGen 可以确定移位的右手边是否确实是一个标量。 r201655。现在,MachO 正确支持私有链接。 r201700。
getNameWithPrefix 和 getSymbol 已从 TargetLowering 移至 TargetMachine,这消除了 Target 对 CodeGen 的依赖关系。 r201711。
Clang 提交
PGO 检测现在将在单独的 AST 遍历中计算计数。提交消息中详细记录了此更改的原因和优势。 r201528。
对在 Clang 中记录可用属性进行了一些初步工作。鼓励属性作者提交缺少的文档(文档方法在 InternalManual.rst 的补充中进行了描述)。 r201515。
IdenticalExprChecker 已扩展为检查 if 语句的两个分支以及逻辑和按位表达式。对于那些不熟悉的人来说,此检查器试图警告意外使用相同的表达式。 r201701、r201702。
CGRecordLayoutBuilder 已完全重写,以删除杂乱代码,简化实现,并在一遍中完成。 r201907。
CastSizeChecker 已学会如何正确处理灵活数组成员。 r201583。
一些线程安全属性已被重命名(其旧名称已静默弃用)。例如,
lockable现在是capability,exclusive_locks_required现在是requires_capability。 r201585。此外,文档已更新并大幅扩展。 r201598。添加了 vcvtX 内在函数,用于 v8 ARM,而不是仅在针对 AArch64 时才识别。 r201661。
现在,FreeBSD 支持硬浮点 ARM EABI(通常称为 gnueabihf)。 r201662。
在 C11 和 C++11 模式下,Clang 现在将提供
max_align_t。请注意,提交消息中抱怨max_align_t的定义并非“好”或“有用”。 r201729。同样,还有一些与提高与 MS ABI 的兼容性有关的提交。没有一个提交内容立即引起我的注意,值得单独强调,因此,如果您对此特别感兴趣,建议您浏览一下上周的提交内容。