搜索本站
订阅《编译点滴》
-
热门点击
- Google的野心–Native Client+LLVM - 5,428 views
- 有写编译器的冲动?这些资料很重要 - 4,414 views
- 好消息:GodSon-T第一款芯片已经流片归来,正在测试 - 2,894 views
- 前瞻-LLVM大事记(2004-2010) - 2,810 views
- 前瞻-全时优化和LLVM-2 - 2,302 views
- 来仔细看看GCC 4.5.0 - 2,260 views
- GCC初窥 - 2,234 views
- 前瞻-全时优化和LLVM-1 - 2,100 views
- WebKit和Firefox的JavaScript性能对比 - 2,035 views
- Expected unqualified-id before 查错 - 2,023 views
近期评论
- 有写编译器的冲动?这些资料很重要 | 编译点滴 发表在《a list of compiler books — 汗牛充栋的编译器参考资料》
- a list of compiler books — 汗牛充栋的编译器参考资料 | 编译点滴 发表在《有写编译器的冲动?这些资料很重要》
- erlv 发表在《a list of compiler books — 汗牛充栋的编译器参考资料》
- Cheng 发表在《a list of compiler books — 汗牛充栋的编译器参考资料》
- zym 发表在《留言板》
- erlv 发表在《华为3G 上网卡Mobile Partener 21.005 NDSI driver install fail问题》
Category Archives: 编译理论实践和应用
Open64业内外人士对LLVM和Open64的观点
写这篇博文,是因为最近某上海惠普Open64编译部门师兄来实验室搞了个小座谈(惠普在中国准备扩大编译团队,有感兴趣的,别错过机会).期间,我就问了关于LLVM的问题,Open64社区如何看待可能来自LLVM的威胁。以下内容,是我自己的记录和演绎版本,本人不保证完全是原话和原意,请各位酌情理解:) 师兄先举了几个例子。他前天在清华和别人聊的时候,也聊到这个问题,虽然LLVM很活跃,但毕竟很年轻。虽然概念很好(前瞻-全时优化和LLVM-2 前瞻-全时优化和LLVM-1),但实施起来很难。就目前LLVM所做的工作来说(前瞻-LLVM大事记(2004-2010) ),大部分只是在重复Open64十几年前所做的。其实SSA的思想最早也是来自Open64.之后才开始在GCC,LLVM中有涉及。 Google内部也曾经争论过是否应该推LLVM,曾经争论很大,但最终还是没有推。当时支持LLVM的人,大多是对编译不太了解的人,而反对的,则是在编译上有很多经验的人。
前瞻-全时优化和LLVM-2
上篇文章,以论文为主要依据,介绍了LLVM的概况和中间表示,本篇关注论文的后半部分内容–架构设计和LLVM的整体评测: LLVM的架构设计: 总览 LLVM的架构设计以让传统的链接时,安装时,运行时和空闲时代码转换都能透明地在LLVM中间表示上展开为目的。上图就是LLVM的高层设计架构。包括静态的编译器前端用于生成LLVM中间表示;连接器用于做连接时优化,尤其是过程间优化。连接器的输出被JIT或者机器代码生成器生成机器代码。在机器代码生成时,可以通过插入低代价的抽样指令来测量运行时的profile,检测热代码,并将空闲时进行优化。
探秘CPU性能测试:Spec CPU2000之整点篇
概览SPEC Standard Performance Evaluation Corporation:标准性能测试协会,一个致力于发布管理计算机性能标准化测试的组织.建立于1988年,会员包括Apple,Dell,IBM,Intel,Microsoft和Sun。Spec的测试例子被光感应用于计算机系统的性能测试中。 SPEC的测试例子是为了测试实际生活中的场景,如SPEC web2005通过并发HTTP请求测试web服务器的性能.SPEC CPU通过多个例子的运行时间长短衡量CPU的性能。SPEC的测试例子都采用平台无关代码编写,以便能使用各种编译器和平台来测试。现在的工业界更是针对SPEC中的测试例子做优化来证明编译器,CPU,web服务器等等的性能提升。 SPEC发布了以下性能测试集: SPEC CPU2006/2000用来测试CPU,存储和编译器的性能 SPEC jms 2007,用于测试JAVA消息服务的性能 SPEC web 2005 用于测试PHP或者JSP的性能 SPEC Viewperf,用于测试OpenGL 3D图形系统的性能 SPEC apc,用于测试给定系统中多个3D交互应用的性能 SPEC OMP2001 使用OpenMP测试并行系统的性能 SPEC MPI2007 使用MPI测试并行系统的性能 SPEC JVM 2008,测试Java Runtime Environment(JAVA运行时环境,JRE)在不同客户和服务器系统上的JAVA性能 SPEC jAppServer2004, 测试JAVA 2 Enterprise Edition应用服务器的性能 … Continue reading
前瞻-全时优化和LLVM-1
读论文<LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation> CGO 04 1,写在前面的话 全时优化(LifeLong Optimization)对于每个编译爱好者来说,太有魅力了。我在起初也是被这个题目所吸引打算一探究竟。本文是04年LLVM的最早两位开发者Chris Lattner和Vikram Adve所写,发表在04年的CGO上, 先来说说LLVM的历史。2000年LLVM开始开发,2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。Apple已经将它用在OpenCL的流水线优化,Xcode已经能使用llvm-gcc编译代码。可以说05年之前LLVM一直都是学术界的东西,05年之后用于工业界.而这篇文章写在04年.本博最近听过一个关于LLVM的讨论会,会中有资深人士提到LLVM现在越来越像一个普通的编译器。说这番话的意思是,我们可以从这篇文章里找到LLVM的架构设计和早期的一些实现思想,但请不要迷信LLVM现在有多么神奇,每个架构都会有它的优缺点。 这篇文章,我现在已经读完了理论和介绍部分,性能评测部分还没有读。所以标题里面加了个1,因为接下来,还想作几件事,一是读完文章,二是跟踪一下Chris Lattner最近几年的文章,三是尝试将Open64和LLVM做个对比,最后看看代码。所以敬请期待之后的系列文章。
GNU工具链学习笔记
1..so为动态链接库,.a为静态连接库。他们在Linux下按照ELF格式存储。ELF有四种文件类型。可重定位文件(Relocatable file,*.o,*.a),包含代码和数据,可用来连接成可执行文件或共享目标文件;可执行文件(Executable File),ELF可执行文件;共享目标文件(Shared Object File,*.so),包含代码和数据;核心转储文件(Core Dump File),进程意外终止时,系统将该进程的地址空间内容和其他信息保存到该文件中。 file命令可以查看。 2,Objdump程序,来自binutils,可以查看Object file内的结构。-h:打印各个段基本信息;-s所有段内容以16进制打印;-d:将所有包含指令的段反汇编。 3, ar -t libc.a;查看libc.a压缩了那些.o文件。 4, collect2 是ld连接器的包装,它调用ld链接目标文件,并对结果做处理,包括收集所有与程序初始化相关的信息并构造初始化结构。 5,readelf:查看ELF文件。 -s:打印符号信息;
小例子–回眸一笑百媚生
这两天在折腾小例子,用来表现对语言做某种扩展后将可更高效的编程。我那蹩脚的coding技术捉襟见肘。一个小例子要言简意赅,写在半页ppt里,要有对比,有突出,又要很直观。尝试了很多次。写小例子很能考察编程能力,指针,静态,数组,寄存器变量,各个类型长度等等。要达到瞄一眼就能印象深刻,被震撼的感觉,难! 眼见为实,看下面的小例子,简单的写个循环: [code lang="cpp"] ip (short int* fb, short int* bb,short int* res) { int i=0; for (; i< 8; i++) res[i] = fb[i] + bb[i]+1; }[/code] 在龙芯上用simd(单指令多数据,一条指令可以存多个数据)来实现的话,需要这么写,别忘了包含loongson.h头文件,这段代码在gcc4.3之后才支持:
反汇编器和汇编器
反汇编器和汇编器是两个互逆的过程,后者将汇编源文件转换为机器码,前者将机器码转换成汇编语言。 汇编器通过将汇编指令符号转换为opcode和解析符号名为存储位置的形式创建目标代码,该目标代码就是机器码.其中符号解析是汇编器的关键部分.很多汇编器还提供宏支持来方便文本替换.相对于高层语言的编译器,汇编器简单很多.最早的汇编器出现在20世纪50年代,很多现代汇编其器都支持指令调度优化.Linux下使用最频繁的汇编器是gas,Gnu Assembler,因为它是GCC的默认后端,是Binutils的一部分。 反汇编器的输出通常是可读的汇编码格式,因此它时反向工程的重要工具。通常汇编语言允许常数和注释,但是在生成机器码时这些信息通常被删除,所以,在机器码上的反汇编操作只能产生无常数和注释的汇编码,所以程序员很难读懂,也很难转换为原来的高级代码。现在也有些编译器通过使用符号调试信息和交互式允许用户为特定区域的代码和值使用符号代替的方式来增强可读性。现在常见的反汇编器有:各种调试器都包含反汇编器,如GNU Binutils中的objdump就是gdb的交互式反汇编器,其他的还有PVDasm,一个支持多CPU反汇编器,OllyDbg–32位汇编级分析调试器,ILDASM–.NET Framework SDK中,用来反汇编PE文件等等 参考: http://en.wikipedia.org/wiki/Assembly_language#Assembler http://en.wikipedia.org/wiki/GNU_Assembler http://en.wikipedia.org/wiki/Disassembler
GCC中的pie和fpie选项
Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。 引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小
GCC初窥
这是gcc maillist中某国际友人 laurent@guerby.net 做的2个小时报告的ppt,报告题目为。最近一直想深入了解gcc,而这个ppt基本包含本博想了解的内容,所以将其翻译并分享到这里。翻译过程中,很多地方可能有错,请大家不吝赐教。
什么是GCC
GCC–GNU Compiler Collection,即GNU 编译器集合。GCC即可作为本地编译器也能作为交叉编译器,它支持很多高级语言和多个编译和目标平台。GCC的网址 http://gcc.gnu.org.它是FSF基金会版权所有的自由软件. Continue reading
