估计很多朋友都关注到了,LLVM 终于发布了3.0版本,这个版本有哪些新的变化呢?我们先从三个大的特性看起。

Continue reading »

 

上上周,Google的人在LLVM blog上写了一篇文章,介绍LLVM在Google中的使用。学习之。

Google有庞大的C++代码基。每天都有成千的工程师在上百万行的C++代码上工作。因此快速和高效的工具对程序员来说非常重要,Google利用Clang构建了许多协助性的C++工具,让工程师可以更好的理解代码,并在代码上线之前,检测出尽量多的bug。

文章中主要介绍了如何使用clang来协助发现和调试代码中的bug,尤其是大型工程中在代码审查、测试和质量确认阶段没有发现的bug。
Response ProcessRequest(Widget foo, Whatsit bar, bool *charge_acct) {
// Do some fancy stuff...
if (/* Detect a subscription user */) {
charge_acct = false;
}
// Lots more fancy stuff...
}

作者给出了上面这个赋值false给bool类型指针的程序,因为false可能为0,因此charge_acct是个指针。因此charge_acct指针就会被赋值成NULL。对人来说发现这个问题比较难。对于这类问题,只有基于词法、语法分析,加上类型推导才可能发现,因此除了编译器前端外,其他的工具难胜任。此外,这只是一种bug,作者提到Google对很多其他类似的bug也都做了处理。

因此,Google选择在Clang基础上作扩展,通过在Clang中增加更多警告信息,使之产生更多针对危险代码和可能bug的提示。因为Clang中的API接口很丰富。通过一年多的努力,目前Google中Clang已经能用了,但接下来的问题是让Google的其他工程师接受并使用这一工具。通过其他组反馈的信息,丰富和完善该工具。

目前这一工具已经在Google的所有C++代码编译时都打开,用于提供更精确和有用的信息给程序员。

Chromium与Clang

Chromium已经在其项目中利用clang plugin协助.例如参考3中的style plugin会协助发现编程风格的问题。比如C++类中补齐默认构造析构函数、漏掉命名空间等问题。

 

《编译点滴》评论:

  1. 其实这类静态程序分析和检测工具目前已经有不少,参考2中列出了许多相关工具。
  2. 之所以Google的这个为他们所津津乐道,是因为他们根据自己的需求,量身定做工具,并根据自己的需要调整。
  3. 相信这一发现bug用的工具也带来不少的误报,也相信经过长时间的积累和使用,这一工具也会越来越好。
  4. 结合公司内部的统一的代码编程风格标准,Clang能更方便的构造相关标准化工具。

参考

  1. http://blog.llvm.org/2011/05/c-at-google-here-be-dragons.html
  2. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
  3. http://dev.chromium.org/developers/coding-style/chromium-style-checker-errors(需翻墙)
 

Nico Weber在Clang的maillist里发布了条可喜消息,clang已经能成功编译chromium。
Clang是LLVM的前端,前不久实现了C语言的自举,最近又成功编译了chromium,而且没有运行问题,可喜可贺。编译使用的版本clang r116145,平台MacBook Pro 4G内存,I5处理器.

编译时间上,Clang比GCC快了10%-87%.编译出的可执行文件clang比gcc小10%。针对Google V8 JavaScript的性能测试显示,gcc和clang的性能差不多。HTML的相关测试,clang也和gcc相差不多,稍好一点(clang 5077->gcc 5163)。gcc版本 gcc-4.2.1

clang的不足,编译GPU硬件加速相关代码会很耗时和内存,可能有bug。如果调过此bug,clang的编译速度可能还会稍快一些。

这里说了如何用clang编译chromium。是编译后的记录文件。这是邮件全文:http://permalink.gmane.org/gmane.comp.compilers.clang.devel/11246

评:

  • Clang正在慢慢成熟,正确性方面也在不断提升,值得庆贺。
  • clang一直标榜的高速编译,在上面的测试中有所体现,但并不是那么明显。
  • 编译所得的性能个人感觉不具说服力。因为chromium中Javascript的性能是用JIT的,而JIT这部分是clang编译出的解释器把javascript的代码再编译成可执行码。所以clang只要保证解释器中jit部分所得的代码性能对JIT的性能影响微乎其微。
 

LLVM2.7已经发布好几天了。今天尝试一下:)

1,下载相关源码包:

wget -c http://llvm.org/releases/2.7/llvm-2.7.tgz
wget -c http://llvm.org/releases/2.7/clang-2.7.tgz
wget -c http://llvm.org/releases/2.7/llvm-gcc-4.2-2.7.source.tgz
wget -c http://llvm.org/releases/2.7/llvm-test-2.7.tgz

llvm-2.7.tgz是LLVM的主要源码包,clang-2.7.tgz:Clang前端,llvm-gcc-4.2-2.7.source.tgz:GCC4.2前端,llvm-test-2.7.tgz:LLVM 测试验证包。
Continue reading »

 

因为之前的两篇博文前瞻-全时优化和LLVM-1前瞻-全时优化和LLVM-2都是基于Chris Lattner 2004年发表在CGO的文章写的。所以需要介绍一下LLVM从2004到2010这六年的变化,LLVM的开发社区很活跃。

从2004年三月到2010年4月,LLVM共发布了1.2-1.9,2.0-2.7,16个版本,至少每年发布两个版本。详细的历史发布版本和release都能从这里找到。

Continue reading »

 

LLVM新版本相对于2.6增加了很多新特性并对很多功能做了改进.包括生成代码质量显著提高、生成调试信息的改进以及核心架构生的很多新特性。最令人兴奋的特性是Clang(LLVM的前端)能自举。自举是任何编译器实际开发中最令人兴奋的里程碑,而且也标志着Clang对复杂的C++标准大部分支持。

LLVM是苹果公司主导开发的下一代编译器,目标是能实现全时优化,即在编译时静态分析源代码实现优化;链接时分析所有源码文件做更加激进有效的过程间优化;运行时使用实时编译进行实时优化,并采集使用信息;空闲时利用使用信息实现反馈优化。但目前LLVM还很不完善,很多功能还亟待开发和完善。目前LLVM仅支持C语言和部分C++.

LLVM已经应用在不少场合。如,Google用它作为一个Python解释器的底层实现(Unladen Swallow)。苹果公司用它实现Mac OS中OpenCL的底层支持。

Chris Lattner 声明 LLVM 2.7发布的邮件
LLVM 2.7 release notes

2009-2011© 编译点滴 Suffusion theme by Sayontan Sinha

无觅相关文章插件,快速提升流量