<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>编译点滴 &#187; gcc</title>
	<atom:link href="http://www.lingcc.com/tag/gcc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lingcc.com</link>
	<description>编译器、虚拟机、程序设计语言、体系结构、软件调试、操作系统等等</description>
	<lastBuildDate>Sat, 04 Feb 2012 06:56:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Open64、LLVM、GCC源代码行数对比</title>
		<link>http://www.lingcc.com/2012/01/15/11963/</link>
		<comments>http://www.lingcc.com/2012/01/15/11963/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 11:59:30 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[GCC]]></category>
		<category><![CDATA[LLVM]]></category>
		<category><![CDATA[open64]]></category>
		<category><![CDATA[编译技术]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[Open64]]></category>
		<category><![CDATA[代码量]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11963</guid>
		<description><![CDATA[使用如下命令，统计了一下这三个编译器的代码行数情况。 find . -type f -not -regex '\./\.git.*' &#124; xargs cat &#124; wc -l 结果如下，供参考。这三个编译器使用的都是各个代码库中的最新版本，因为《编译点滴》使用git svn工具，所以命令行里有“git”，而标明的版本号却是SVN的。 Open64（SVN R3782）： open64$ find . -type f -not -regex '\./\.git.*' &#124; xargs cat &#124; wc -l 13164644 LLVM（LLVM R148206, 包含Clang  ）： llvm$ find . -type f -not -regex '\./\.git.*' &#124; xargs cat &#124; wc -l 2468255 GCC（R183190）： gcc$ find <a href='http://www.lingcc.com/2012/01/15/11963/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F06%2F15%2F10978%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64业内外人士对LLVM和Open64的观点</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64编译器 5.0版本发布</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F25%2F10418%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–OpenMp和自动并行化</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F27%2F10464%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–付诸实践(Practical Matters)</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/01/04/11490/' rel='bookmark' title='open64 doxygen 上线'>open64 doxygen 上线</a></li>
<li><a href='http://www.lingcc.com/2010/04/28/10807/' rel='bookmark' title='LLVM 2.7 发布'>LLVM 2.7 发布</a></li>
<li><a href='http://www.lingcc.com/2009/11/30/10168/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT I) part II'>Open64 课程–全局标量优化(WOPT I) part II</a></li>
<li><a href='http://www.lingcc.com/2009/12/13/10273/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT II)'>Open64 课程–全局标量优化(WOPT II)</a></li>
<li><a href='http://www.lingcc.com/2010/06/02/10955/' rel='bookmark' title='Google的野心&#8211;Native Client+LLVM'>Google的野心&#8211;Native Client+LLVM</a></li>
<li><a href='http://www.lingcc.com/2009/11/25/10127/' rel='bookmark' title='Open64 课程&#8211;全局标量优化(WOPT I)  part 1'>Open64 课程&#8211;全局标量优化(WOPT I)  part 1</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>使用如下命令，统计了一下这三个编译器的代码行数情况。<br />
<code>find . -type f -not -regex '\./\.git.*' | xargs cat | wc -l</code></p>
<p>结果如下，供参考。这三个编译器使用的都是各个代码库中的最新版本，因为《编译点滴》使用git svn工具，所以命令行里有“git”，而标明的版本号却是SVN的。<br />
Open64（SVN R3782）：</p>
<p><code>open64$ find . -type f -not -regex '\./\.git.*' | xargs cat | wc -l<br />
13164644</code></p>
<p>LLVM（LLVM R148206, 包含Clang  ）：<br />
<code>llvm$ find . -type f -not -regex '\./\.git.*' | xargs cat | wc -l<br />
2468255</code></p>
<p>GCC（R183190）：<br />
<code>gcc$ find . -type f -not -regex '\./\.git.*' | xargs cat | wc -l<br />
12823155</code></p>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F06%2F15%2F10978%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64业内外人士对LLVM和Open64的观点</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64编译器 5.0版本发布</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F25%2F10418%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–OpenMp和自动并行化</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F27%2F10464%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–付诸实践(Practical Matters)</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/01/04/11490/' rel='bookmark' title='open64 doxygen 上线'>open64 doxygen 上线</a></li>
<li><a href='http://www.lingcc.com/2010/04/28/10807/' rel='bookmark' title='LLVM 2.7 发布'>LLVM 2.7 发布</a></li>
<li><a href='http://www.lingcc.com/2009/11/30/10168/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT I) part II'>Open64 课程–全局标量优化(WOPT I) part II</a></li>
<li><a href='http://www.lingcc.com/2009/12/13/10273/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT II)'>Open64 课程–全局标量优化(WOPT II)</a></li>
<li><a href='http://www.lingcc.com/2010/06/02/10955/' rel='bookmark' title='Google的野心&#8211;Native Client+LLVM'>Google的野心&#8211;Native Client+LLVM</a></li>
<li><a href='http://www.lingcc.com/2009/11/25/10127/' rel='bookmark' title='Open64 课程&#8211;全局标量优化(WOPT I)  part 1'>Open64 课程&#8211;全局标量优化(WOPT I)  part 1</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2012/01/15/11963/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux 内核中的.S文件</title>
		<link>http://www.lingcc.com/2011/12/05/11872/</link>
		<comments>http://www.lingcc.com/2011/12/05/11872/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 05:37:21 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[Linux系统]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[linux kernel]]></category>
		<category><![CDATA[午休一小时]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11872</guid>
		<description><![CDATA[接触过内核的朋友肯定在源码中看到许多.S文件，这些文件中基本都是汇编。 这些文件是干什么的，为什么要这么写？ Table of Contents 1 .S 文件们 1.1 实现特权控制 1.2 实现加速 1.3 .S如何如何整合到内核二进制文件中 2 参考 1 .S 文件们 $ find . -name "*.S" &#124; wc -l 1235 可以看到在Linux kernel 3.1的内核中，有上千个.S文件。 这些文件多数分布在arch/下各个体系结构中。 如下是X86的.S文件： ./arch/x86/power/hibernate_asm_64.S ./arch/x86/power/hibernate_asm_32.S ./arch/x86/boot/compressed/head_32.S ./arch/x86/boot/compressed/vmlinux.lds.S ./arch/x86/boot/compressed/head_64.S ./arch/x86/boot/bioscall.S ./arch/x86/boot/header.S ./arch/x86/boot/pmjump.S ./arch/x86/boot/copy.S ./arch/x86/net/bpf_jit.S ./arch/x86/vdso/vdso-layout.lds.S ./arch/x86/vdso/vdso.S ./arch/x86/vdso/vdso32.S ./arch/x86/vdso/vdso.lds.S ./arch/x86/vdso/vdso-note.S ./arch/x86/vdso/vdso32/syscall.S ./arch/x86/vdso/vdso32/note.S ./arch/x86/vdso/vdso32/sysenter.S ./arch/x86/vdso/vdso32/sigreturn.S ./arch/x86/vdso/vdso32/vdso32.lds.S ./arch/x86/vdso/vdso32/int80.S ./arch/x86/math-emu/div_small.S <a href='http://www.lingcc.com/2011/12/05/11872/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F10%2F13%2F11318%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Linux内存的属性</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F03%2F08%2F10709%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GNU工具链学习笔记</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F22%2F11151%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Linux内存管理中的分页</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F01%2F04%2F10582%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Strace命令介绍</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2008%2F08%2F27%2F9982%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">zz Linux下的段错误的原因及调试</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/11/26/11814/' rel='bookmark' title='How start_kernel get start?'>How start_kernel get start?</a></li>
<li><a href='http://www.lingcc.com/2009/12/31/10534/' rel='bookmark' title='Gentoo中的交叉编译利器&#8211;crossdev'>Gentoo中的交叉编译利器&#8211;crossdev</a></li>
<li><a href='http://www.lingcc.com/2010/01/07/10594/' rel='bookmark' title='使用crossdev安装龙芯的O32 gnu交叉工具链'>使用crossdev安装龙芯的O32 gnu交叉工具链</a></li>
<li><a href='http://www.lingcc.com/2010/06/28/10983/' rel='bookmark' title='龙芯N32系统上的Squirrelfish性能'>龙芯N32系统上的Squirrelfish性能</a></li>
<li><a href='http://www.lingcc.com/2010/10/12/11305/' rel='bookmark' title='如何让程序屏蔽CTRL+C和CTRL+Z'>如何让程序屏蔽CTRL+C和CTRL+Z</a></li>
<li><a href='http://www.lingcc.com/2010/01/21/10663/' rel='bookmark' title='小例子&#8211;回眸一笑百媚生'>小例子&#8211;回眸一笑百媚生</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>接触过内核的朋友肯定在源码中看到许多.S文件，这些文件中基本都是汇编。<br />
这些文件是干什么的，为什么要这么写？<span id="more-11872"></span></p>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 .S 文件们 </a>
<ul>
<li><a href="#sec-1.1">1.1 实现特权控制 </a></li>
<li><a href="#sec-1.2">1.2 实现加速 </a></li>
<li><a href="#sec-1.3">1.3 .S如何如何整合到内核二进制文件中 </a></li>
</ul>
</li>
<li><a href="#sec-2">2 参考 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> .S 文件们</h2>
<div id="text-1" class="outline-text-2">
<pre class="src src-sh">$ find . -name <span style="color: #008b00;">"*.S"</span> | wc -l
1235</pre>
<p>可以看到在Linux kernel 3.1的内核中，有上千个.S文件。<br />
这些文件多数分布在arch/下各个体系结构中。<br />
如下是X86的.S文件：</p>
<pre class="src src-sh">./arch/x86/power/hibernate_asm_64.S
./arch/x86/power/hibernate_asm_32.S
./arch/x86/boot/compressed/head_32.S
./arch/x86/boot/compressed/vmlinux.lds.S
./arch/x86/boot/compressed/head_64.S
./arch/x86/boot/bioscall.S
./arch/x86/boot/header.S
./arch/x86/boot/pmjump.S
./arch/x86/boot/copy.S
./arch/x86/net/bpf_jit.S
./arch/x86/vdso/vdso-layout.lds.S
./arch/x86/vdso/vdso.S
./arch/x86/vdso/vdso32.S
./arch/x86/vdso/vdso.lds.S
./arch/x86/vdso/vdso-note.S
./arch/x86/vdso/vdso32/syscall.S
./arch/x86/vdso/vdso32/note.S
./arch/x86/vdso/vdso32/sysenter.S
./arch/x86/vdso/vdso32/sigreturn.S
./arch/x86/vdso/vdso32/vdso32.lds.S
./arch/x86/vdso/vdso32/int80.S
./arch/x86/math-emu/div_small.S
./arch/x86/math-emu/reg_u_mul.S
./arch/x86/math-emu/reg_u_sub.S
./arch/x86/math-emu/wm_sqrt.S
./arch/x86/math-emu/div_Xsig.S
./arch/x86/math-emu/shr_Xsig.S
./arch/x86/math-emu/polynom_Xsig.S
./arch/x86/math-emu/round_Xsig.S
./arch/x86/math-emu/reg_round.S
./arch/x86/math-emu/reg_u_add.S
./arch/x86/math-emu/mul_Xsig.S
./arch/x86/math-emu/reg_u_div.S
./arch/x86/math-emu/reg_norm.S
./arch/x86/math-emu/wm_shrx.S
./arch/x86/xen/xen-asm_32.S
./arch/x86/xen/xen-head.S
./arch/x86/xen/xen-asm.S
./arch/x86/xen/xen-asm_64.S
./arch/x86/lguest/i386_head.S
./arch/x86/crypto/aesni-intel_asm.S
./arch/x86/crypto/aes-i586-asm_32.S
./arch/x86/crypto/ghash-clmulni-intel_asm.S
./arch/x86/crypto/salsa20-x86_64-asm_64.S
./arch/x86/crypto/aes-x86_64-asm_64.S
./arch/x86/crypto/salsa20-i586-asm_32.S
./arch/x86/crypto/twofish-x86_64-asm_64.S
./arch/x86/crypto/twofish-i586-asm_32.S
./arch/x86/kernel/relocate_kernel_32.S
./arch/x86/kernel/head_32.S
./arch/x86/kernel/relocate_kernel_64.S
./arch/x86/kernel/reboot_32.S
./arch/x86/kernel/syscall_table_32.S
./arch/x86/kernel/vmlinux.lds.S
./arch/x86/kernel/trampoline_32.S
./arch/x86/kernel/trampoline_64.S
./arch/x86/kernel/entry_64.S
./arch/x86/kernel/vsyscall_emu_64.S
./arch/x86/kernel/head_64.S
./arch/x86/kernel/verify_cpu.S
./arch/x86/kernel/entry_32.S
./arch/x86/kernel/acpi/realmode/wakeup.lds.S
./arch/x86/kernel/acpi/realmode/bioscall.S
./arch/x86/kernel/acpi/realmode/wakeup.S
./arch/x86/kernel/acpi/realmode/copy.S
./arch/x86/kernel/acpi/wakeup_32.S
./arch/x86/kernel/acpi/wakeup_rm.S
./arch/x86/kernel/acpi/wakeup_64.S
./arch/x86/platform/olpc/xo1-wakeup.S
./arch/x86/platform/efi/efi_stub_32.S
./arch/x86/platform/efi/efi_stub_64.S
./arch/x86/lib/memcpy_64.S
./arch/x86/lib/cmpxchg8b_emu.S
./arch/x86/lib/rwlock.S
./arch/x86/lib/iomap_copy_64.S
./arch/x86/lib/atomic64_386_32.S
./arch/x86/lib/copy_page_64.S
./arch/x86/lib/memmove_64.S
./arch/x86/lib/thunk_32.S
./arch/x86/lib/copy_user_nocache_64.S
./arch/x86/lib/rwsem.S
./arch/x86/lib/cmpxchg16b_emu.S
./arch/x86/lib/clear_page_64.S
./arch/x86/lib/memset_64.S
./arch/x86/lib/msr-reg.S
./arch/x86/lib/atomic64_cx8_32.S
./arch/x86/lib/getuser.S
./arch/x86/lib/csum-copy_64.S
./arch/x86/lib/thunk_64.S
./arch/x86/lib/putuser.S
./arch/x86/lib/copy_user_64.S
./arch/x86/lib/checksum_32.S
./arch/x86/ia32/ia32entry.S</pre>
<p>可以发现休眠、启动、数学运算、虚拟机支持、加密、锁机制、系统调用有关。<br />
这些功能之所以使用汇编而非普通C语言，有两方面的原因</p>
<ul>
<li>实现特权控制</li>
<li>加速</li>
</ul>
</div>
<div id="outline-container-1.1" class="outline-3">
<h3 id="sec-1.1"><span class="section-number-3">1.1</span> 实现特权控制</h3>
<div id="text-1.1" class="outline-text-3">
<p>Linux内核要管理的是整个计算机系统，拥有最高的权限。<br />
通过访问和修改特权特权寄存器、执行特权指令的方式控制和调度各种计算机资源。<br />
这些功能虽然可以直接通过GCC生成汇编的方式做到。<br />
但是，相比在编译器里通过复杂的程序分析折腾，反倒是简单的通过汇编实现更加灵活高效。<br />
而且这种功能并不会被经常使用，做进去意义不大。</p>
<p>以arch/x86/kernel/entry<sub>32</sub>.S为例。<br />
这个文件定义了X86平台下的中断向量数组。<br />
使用汇编来实现，能让程序员更灵活的控制所生成的汇编文件。<br />
这个文件中，使用两个.rept元语就能轻松创建一个很大的数据段。</p>
</div>
</div>
<div id="outline-container-1.2" class="outline-3">
<h3 id="sec-1.2"><span class="section-number-3">1.2</span> 实现加速</h3>
<div id="text-1.2" class="outline-text-3">
<p>对于指针经常出没的系统软件，编译器很难完全保证别名分析准确无误，只能作最保守的程序变换。<br />
在系统软件这种基础架构中，性能也是非常重要的。所以为了尽可能的加速，汇编也被广泛的利用起来。</p>
<p>为什么要把整个文件都写成汇编，而不是直接在函数中写嵌入式汇编呢？<br />
以arch/x86/crypto/aesni-intel<sub>asm</sub>.S为例,这个文件先下面形式定义了一对汇编形式的宏<br />
.macro XXXX PARM1 PARM2<br />
… …<br />
.endm</p>
<p>之后定义了函数aesni<sub>gcm</sub><sub>dec，也是使用汇编的形式。</sub><br />
其实整个文件就相当于一个拥有部分高级语言特性的汇编文件。<br />
经过编译器的处理后，变成普通汇编文件。<br />
需要调用这些函数的时候，就在普通C语言文件中直接调用即可。<br />
所以用这种汇编能达到普通C语言的效果。</p>
<p>之所以不使用嵌入式汇编，个人觉得是因为嵌入式汇编是把汇编嵌到C语言生成的汇编中。<br />
在编译器看来，需要对嵌入式汇编所破坏的程序运行环境，如寄存器,作保存和恢复操作，代价很高。</p>
</div>
</div>
<div id="outline-container-1.3" class="outline-3">
<h3 id="sec-1.3"><span class="section-number-3">1.3</span> .S如何如何整合到内核二进制文件中</h3>
<div id="text-1.3" class="outline-text-3">
<p>该文件会先经编译器处理，在MIPS平台上，对于.S文件编译命令行如下：</p>
<pre class="src src-sh">mips64el-unknown-linux-gnu-gcc -Wp,-MD,arch/mips/kernel/.entry.o.d -nostdinc -isystem
 /home/cross-loongson/bin/../lib/gcc/mips64el-unknown-linux-gnu/4.4.1/include
-I/home2/linux-2.6.35.2-gcc/arch/mips/include -Iinclude -include include/generated/autoconf.h
-D__KERNEL__ -DVMLINUX_LOAD_ADDRESS=0xffffffff80100000 -DDATAOFFSET=0
-ffunction-sections -mabi=64 -G 0 -fno-pic -pipe -msoft-float -ffreestanding -mips64 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS64
-Wa,-mips64 -Wa,--trap -I/home2/linux-2.6.35.2-gcc/arch/mips/include/asm/mach-malta
-I/home2/linux-2.6.35.2-gcc/arch/mips/include/asm/mach-generic
-c -o arch/mips/kernel/entry.o arch/mips/kernel/entry.S

-D__ASSEMBLY__  -gdwarf-2</pre>
<p>对比普通C语言文件的编译命令行如下：</p>
<pre class="src src-sh">mips64el-unknown-linux-gnu-gcc -Wp,-MD,arch/mips/mm/.uasm.o.d -nostdinc -isystem
/home/cross-loongson/bin/../lib/gcc/mips64el-unknown-linux-gnu/4.4.1/include
-I/home2/linux-2.6.35.2-gcc/arch/mips/include -Iinclude -include include/generated/autoconf.h
-D__KERNEL__ -DVMLINUX_LOAD_ADDRESS=0xffffffff80100000 -DDATAOFFSET=0
-ffunction-sections -mabi=64 -G 0 -fno-pic -pipe -msoft-float -ffreestanding -mips64 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS64
-Wa,-mips64 -Wa,--trap -I/home2/linux-2.6.35.2-gcc/arch/mips/include/asm/mach-malta
-I/home2/linux-2.6.35.2-gcc/arch/mips/include/asm/mach-generic
 -c -o arch/mips/mm/uasm.o arch/mips/mm/uasm.c

 -Wframe-larger-than=2048 -fno-stack-protector -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow
 -fconserve-stack -Werror -DKBUILD_STR(s)=#s -DKBUILD_BASENAME=KBUILD_STR(uasm) -DKBUILD_MODNAME=KBUILD_STR(uasm)
 -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security
 -fno-delete-null-pointer-checks -Os</pre>
<p>最下面空格隔开的部分是二者的不同之处。可见普通.c文件多了很多编译控制选项。</p>
<p>最终，.S输出的.o文件和其他文件一起链接到内核二进制文件中:</p>
<pre class="src src-sh">mips64el-unknown-linux-gnu-ld -m elf64ltsmip -r -o arch/mips/kernel/built-in.o
...
arch/mips/kernel/entry.o</pre>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2"><span class="section-number-2">2</span> 参考</h2>
<div id="text-2" class="outline-text-2">
<ul>
<li><a href="http://lkml.indiana.edu/hypermail/linux/kernel/0306.1/0087.html">http://lkml.indiana.edu/hypermail/linux/kernel/0306.1/0087.html</a></li>
<li>《独辟蹊径品内核：Linux内核源代码导读》，李云华编著，电子工业出版社，2009年</li>
</ul>
</div>
</div>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F10%2F13%2F11318%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Linux内存的属性</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F03%2F08%2F10709%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GNU工具链学习笔记</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F22%2F11151%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Linux内存管理中的分页</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F01%2F04%2F10582%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Strace命令介绍</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2008%2F08%2F27%2F9982%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F12%2F05%2F11872%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">zz Linux下的段错误的原因及调试</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/11/26/11814/' rel='bookmark' title='How start_kernel get start?'>How start_kernel get start?</a></li>
<li><a href='http://www.lingcc.com/2009/12/31/10534/' rel='bookmark' title='Gentoo中的交叉编译利器&#8211;crossdev'>Gentoo中的交叉编译利器&#8211;crossdev</a></li>
<li><a href='http://www.lingcc.com/2010/01/07/10594/' rel='bookmark' title='使用crossdev安装龙芯的O32 gnu交叉工具链'>使用crossdev安装龙芯的O32 gnu交叉工具链</a></li>
<li><a href='http://www.lingcc.com/2010/06/28/10983/' rel='bookmark' title='龙芯N32系统上的Squirrelfish性能'>龙芯N32系统上的Squirrelfish性能</a></li>
<li><a href='http://www.lingcc.com/2010/10/12/11305/' rel='bookmark' title='如何让程序屏蔽CTRL+C和CTRL+Z'>如何让程序屏蔽CTRL+C和CTRL+Z</a></li>
<li><a href='http://www.lingcc.com/2010/01/21/10663/' rel='bookmark' title='小例子&#8211;回眸一笑百媚生'>小例子&#8211;回眸一笑百媚生</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/12/05/11872/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC如何进出GIMPLE中间表示</title>
		<link>http://www.lingcc.com/2011/11/29/11859/</link>
		<comments>http://www.lingcc.com/2011/11/29/11859/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 06:00:18 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[GCC]]></category>
		<category><![CDATA[前端和程序分析]]></category>
		<category><![CDATA[后端优化与处理器]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[GIMPLE]]></category>
		<category><![CDATA[rtl]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11859</guid>
		<description><![CDATA[GIMPLE中间表示，是GCC中机器无关的中间表示，机器无关的优化基本都在这个层次上做。 本文先来看看GCC是如何进、出GIMPLE中间表示的。 Table of Contents 1 从 GENERIC 到GIMPLE 2 从 GIMPLE 到 RTL 3 参考 1 从 GENERIC 到GIMPLE GENERIC是GCC最顶层的语言无关中间表示。 GCC 利用 “gimplifier” 将 GENERIC 中间表示转换为 GIMPLE中间表示。 因为GENERIC 是语法树形式的，所以这个转换过程是递归的。 对于一个函数，GENERIC中间表示将其存储在FUNCTION_DECL树节点中的DECL_SAVED_TREE域中。 然后通过调用函数gimplify_function_tree将其转换为GIMPLE. 具体的转换过程一般是 gimplify.c: gimplify_function_tree -&#62; gimplify_body -&#62; gimplify_stmt -&#62; gimplify_expr . GIMPLE中有一个lower的动作，用于将高层次的GIMPLE表示，解析成低层次的，这个lower动作在pass_lower_cf中完成。 比如，嵌套的作用域和表达式。 可以使用选项 -fdump-tree-gimple得到类C的GIMPLE表达形式 如下面程序： int main() { int a; if (a) { <a href='http://www.lingcc.com/2011/11/29/11859/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F16%2F11210%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC Internal 中文文档上线</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/09/05/11185/' rel='bookmark' title='extern inline问题'>extern inline问题</a></li>
<li><a href='http://www.lingcc.com/2011/11/28/11851/' rel='bookmark' title='Illegal Instruction 错误初窥'>Illegal Instruction 错误初窥</a></li>
<li><a href='http://www.lingcc.com/2012/01/30/11974/' rel='bookmark' title='大软件的烦恼与编译技术'>大软件的烦恼与编译技术</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2010/10/09/11296/' rel='bookmark' title='宏和内联函数'>宏和内联函数</a></li>
<li><a href='http://www.lingcc.com/2011/08/14/11695/' rel='bookmark' title='TIPS for writing easily auto-vectorized code'>TIPS for writing easily auto-vectorized code</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>GIMPLE中间表示，是GCC中机器无关的中间表示，机器无关的优化基本都在这个层次上做。<br />
本文先来看看GCC是如何进、出GIMPLE中间表示的。<span id="more-11859"></span></p>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 从 GENERIC 到GIMPLE </a></li>
<li><a href="#sec-2">2 从 GIMPLE 到 RTL </a></li>
<li><a href="#sec-3">3 参考 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> 从 GENERIC 到GIMPLE</h2>
<div id="text-1" class="outline-text-2">
<p>GENERIC是GCC最顶层的语言无关中间表示。<br />
GCC 利用 “gimplifier” 将 GENERIC 中间表示转换为 GIMPLE中间表示。<br />
因为GENERIC 是语法树形式的，所以这个转换过程是递归的。</p>
<p>对于一个函数，GENERIC中间表示将其存储在FUNCTION_DECL树节点中的DECL_SAVED_TREE域中。<br />
然后通过调用函数gimplify_function_tree将其转换为GIMPLE.<br />
具体的转换过程一般是 gimplify.c: gimplify_function_tree -&gt; gimplify_body -&gt; gimplify_stmt -&gt; gimplify_expr .</p>
<p>GIMPLE中有一个lower的动作，用于将高层次的GIMPLE表示，解析成低层次的，这个lower动作在pass_lower_cf中完成。<br />
比如，嵌套的作用域和表达式。 可以使用选项 -fdump-tree-gimple得到类C的GIMPLE表达形式</p>
<p>如下面程序：</p>
<pre class="src src-c"><span style="color: #6920ac;">int</span> <span style="color: #0000cd;">main</span>()
{
  <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">a</span>;
  <span style="color: #ff0000;">if</span> (a)
    {
      <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">b</span>;
      b = 2 + a + b;
    }
  <span style="color: #ff0000;">return</span> 0;
}</pre>
<p>使用该选项得到的转换成C语言形式的GIMPLE中间表示为：</p>
<pre class="src src-c"><span style="color: #0000cd;">main</span> ()
{
  <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">D</span>.1593;
  <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">D</span>.1594;
  <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">a</span>;

  <span style="color: #ff0000;">if</span> (a != 0) <span style="color: #ff0000;">goto</span> &lt;D.1591&gt;; <span style="color: #ff0000;">else</span> <span style="color: #ff0000;">goto</span> &lt;D.1592&gt;;
  &lt;D.1591&gt;:
  {
    <span style="color: #6920ac;">int</span> <span style="color: #0000cd;">b</span>;

    D.1593 = a + 2;
    b = D.1593 + b;
  }
  &lt;D.1592&gt;:
  D.1594 = 0;
  <span style="color: #ff0000;">return</span> D.1594;
}</pre>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2"><span class="section-number-2">2</span> 从 GIMPLE 到 RTL</h2>
<div id="text-2" class="outline-text-2">
<p>做完机器无关优化之后，GCC会将GIMPLE转换为RTL中间表示。<br />
在RTL上，基本都是机器相关的优化，以及寄存器分配，指令调度等功能。<br />
从GIMPLE到RTL中间表示，则是在expr.c:expand_expr_real中，</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3"><span class="section-number-2">3</span> 参考</h2>
<div id="text-3" class="outline-text-2">
<ul>
<li><a href="http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html#GIMPLE">http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html#GIMPLE</a></li>
<li><a href="http://stackoverflow.com/questions/4917756/need-help-on-gcc-gimple">http://stackoverflow.com/questions/4917756/need-help-on-gcc-gimple</a></li>
<li><a href="http://stackoverflow.com/questions/731639/adding-a-pass-to-gcc">http://stackoverflow.com/questions/731639/adding-a-pass-to-gcc</a></li>
<li><a href="http://gcc.gnu.org/wiki/GIMPLE">http://gcc.gnu.org/wiki/GIMPLE</a></li>
<li><a href="http://www.cse.iitb.ac.in/~uday/courses/cs715-09/gcc-gimple.pdf">http://www.cse.iitb.ac.in/~uday/courses/cs715-09/gcc-gimple.pdf</a></li>
<li><a href="http://www.public.asu.edu/~kbai3/docs/Gimple.pdf">http://www.public.asu.edu/~kbai3/docs/Gimple.pdf</a></li>
</ul>
</div>
</div>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F16%2F11210%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC Internal 中文文档上线</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/09/05/11185/' rel='bookmark' title='extern inline问题'>extern inline问题</a></li>
<li><a href='http://www.lingcc.com/2011/11/28/11851/' rel='bookmark' title='Illegal Instruction 错误初窥'>Illegal Instruction 错误初窥</a></li>
<li><a href='http://www.lingcc.com/2012/01/30/11974/' rel='bookmark' title='大软件的烦恼与编译技术'>大软件的烦恼与编译技术</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2010/10/09/11296/' rel='bookmark' title='宏和内联函数'>宏和内联函数</a></li>
<li><a href='http://www.lingcc.com/2011/08/14/11695/' rel='bookmark' title='TIPS for writing easily auto-vectorized code'>TIPS for writing easily auto-vectorized code</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/11/29/11859/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Open64编译器 5.0版本发布</title>
		<link>http://www.lingcc.com/2011/11/10/11799/</link>
		<comments>http://www.lingcc.com/2011/11/10/11799/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 13:50:10 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[open64]]></category>
		<category><![CDATA[bench]]></category>
		<category><![CDATA[Compiler Optimization]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[LLVM]]></category>
		<category><![CDATA[Open64]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11799</guid>
		<description><![CDATA[Open64的Release manageer刚刚发布了5.0版本。 主要改动包括： 增加configure脚本支持 增加VCG图形支持，以便生成控制流图 增加对volatile变量的支持 增加对域敏感别名分析的支持 更多的代码性能提升 if分支转换改进 控制流图优化改进 循环优化改进 内联优化改进 提升-O3的浮点性能 增加结构体优化 提升向量化优化 C++代码优化 代码生成部分改进 支持SSE4.2,AVX，FMA指令 减小指令调度时的寄存器压力 基本快的padding和代码对齐改进 针对Bulldozer处理器的优化和调优 其他注记 将在下个版本中取消gcc 3.x前端支持 IRIX系统支持也将在下个版本取消 目前，能在生产环境中使用的编译器主要有GCC(GPL v3), LLVM(BSD) 和Open64（GPLv2）。phoronix最近对这三款编译器做了一些性能对比，虽然所选benchmark不如SPEC CPU那么权威，但还是有些参考价值。 http://www.phoronix.com/scan.php?page=article&#38;item=llvm3_gcc_open64&#38;num=1 http://www.phoronix.com/scan.php?page=article&#38;item=amd_bulldozer_open64&#38;num=1 http://www.phoronix.com/scan.php?page=article&#38;item=amd_bulldozer_compilers&#38;num=1 Reference： http://wiki.open64.net/index.php/Open64-5.0 http://www.phoronix.com/scan.php?page=news_item&#38;px=MTAxMzg 相关文章： Pathscale 发布 EKOPath 4 编译器套件 open64 doxygen 上线 仔细端详GCC 4.6的新特性 Open64、LLVM、GCC源代码行数对比 安装LLVM2.7 step by step open64中的gcc前端<table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F10%2F07%2F11274%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">AMD编译器开发工程师介绍Open64编译器</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F21%2F10379%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程-循环嵌套优化(LNO)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F25%2F10418%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–OpenMp和自动并行化</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F06%2F15%2F10978%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64业内外人士对LLVM和Open64的观点</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/06/15/11658/' rel='bookmark' title='Pathscale 发布 EKOPath 4 编译器套件'>Pathscale 发布 EKOPath 4 编译器套件</a></li>
<li><a href='http://www.lingcc.com/2011/01/04/11490/' rel='bookmark' title='open64 doxygen 上线'>open64 doxygen 上线</a></li>
<li><a href='http://www.lingcc.com/2011/03/28/11567/' rel='bookmark' title='仔细端详GCC 4.6的新特性'>仔细端详GCC 4.6的新特性</a></li>
<li><a href='http://www.lingcc.com/2012/01/15/11963/' rel='bookmark' title='Open64、LLVM、GCC源代码行数对比'>Open64、LLVM、GCC源代码行数对比</a></li>
<li><a href='http://www.lingcc.com/2010/05/03/10884/' rel='bookmark' title='安装LLVM2.7 step by step'>安装LLVM2.7 step by step</a></li>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Open64的Release manageer刚刚发布了5.0版本。</p>
<p><span id="more-11799"></span></p>
<p>主要改动包括：</p>
<ul>
<li>增加configure脚本支持</li>
<li>增加VCG图形支持，以便生成控制流图</li>
<li>增加对volatile变量的支持</li>
<li>增加对域敏感别名分析的支持</li>
<li>更多的代码性能提升</li>
<ul>
<li>if分支转换改进</li>
<li>控制流图优化改进</li>
<li>循环优化改进</li>
<li>内联优化改进</li>
<li>提升-O3的浮点性能</li>
<li>增加结构体优化</li>
<li>提升向量化优化</li>
<li>C++代码优化</li>
</ul>
<li>代码生成部分改进</li>
<ul>
<li>支持SSE4.2,AVX，FMA指令</li>
<li>减小指令调度时的寄存器压力</li>
<li>基本快的padding和代码对齐改进</li>
<li>针对Bulldozer处理器的优化和调优</li>
</ul>
<li>其他注记</li>
<ul>
<li>将在下个版本中取消gcc 3.x前端支持</li>
<li>IRIX系统支持也将在下个版本取消</li>
</ul>
</ul>
<p>目前，能在生产环境中使用的编译器主要有GCC(GPL v3), LLVM(BSD) 和Open64（GPLv2）。phoronix最近对这三款编译器做了一些性能对比，虽然所选benchmark不如SPEC CPU那么权威，但还是有些参考价值。</p>
<ul>
<li><a href="http://www.phoronix.com/scan.php?page=article&amp;item=llvm3_gcc_open64&amp;num=1">http://www.phoronix.com/scan.php?page=article&amp;item=llvm3_gcc_open64&amp;num=1</a></li>
<li><a href="http://www.phoronix.com/scan.php?page=article&amp;item=amd_bulldozer_open64&amp;num=1">http://www.phoronix.com/scan.php?page=article&amp;item=amd_bulldozer_open64&amp;num=1</a></li>
<li><a href="http://www.phoronix.com/scan.php?page=article&amp;item=amd_bulldozer_compilers&amp;num=1">http://www.phoronix.com/scan.php?page=article&amp;item=amd_bulldozer_compilers&amp;num=1</a></li>
</ul>
<p>Reference：</p>
<ul>
<li><a href="http://wiki.open64.net/index.php/Open64-5.0">http://wiki.open64.net/index.php/Open64-5.0</a></li>
<li><a href="http://www.phoronix.com/scan.php?page=news_item&amp;px=MTAxMzg">http://www.phoronix.com/scan.php?page=news_item&amp;px=MTAxMzg</a></li>
</ul>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F10%2F07%2F11274%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">AMD编译器开发工程师介绍Open64编译器</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F21%2F10379%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程-循环嵌套优化(LNO)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F25%2F10418%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程–OpenMp和自动并行化</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F06%2F15%2F10978%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64业内外人士对LLVM和Open64的观点</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/06/15/11658/' rel='bookmark' title='Pathscale 发布 EKOPath 4 编译器套件'>Pathscale 发布 EKOPath 4 编译器套件</a></li>
<li><a href='http://www.lingcc.com/2011/01/04/11490/' rel='bookmark' title='open64 doxygen 上线'>open64 doxygen 上线</a></li>
<li><a href='http://www.lingcc.com/2011/03/28/11567/' rel='bookmark' title='仔细端详GCC 4.6的新特性'>仔细端详GCC 4.6的新特性</a></li>
<li><a href='http://www.lingcc.com/2012/01/15/11963/' rel='bookmark' title='Open64、LLVM、GCC源代码行数对比'>Open64、LLVM、GCC源代码行数对比</a></li>
<li><a href='http://www.lingcc.com/2010/05/03/10884/' rel='bookmark' title='安装LLVM2.7 step by step'>安装LLVM2.7 step by step</a></li>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/11/10/11799/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>说说静态单赋值（SSA,Static Single-Assignment)</title>
		<link>http://www.lingcc.com/2011/08/13/11685/</link>
		<comments>http://www.lingcc.com/2011/08/13/11685/#comments</comments>
		<pubDate>Sat, 13 Aug 2011 10:52:24 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[GCC]]></category>
		<category><![CDATA[open64]]></category>
		<category><![CDATA[前端和程序分析]]></category>
		<category><![CDATA[后端优化与处理器]]></category>
		<category><![CDATA[编译技术]]></category>
		<category><![CDATA[Compiler Optimization]]></category>
		<category><![CDATA[Control Flow]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[Open64]]></category>
		<category><![CDATA[SSA]]></category>
		<category><![CDATA[Static Single Assignment(SSA)]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11685</guid>
		<description><![CDATA[精确的数据流分析是让编译优化能高效进行的基础。 SSA就是一种高效的数据流分析技术，目前几乎所有的现代编译器，如GCC、Open64、LLVM都有将SSA技术的支持， 不仅仅是编译器，Jikes RVM, HotSpot JVM, .Net的Mono，Python的Pypy， Andoroid的Dalvik，这些虚拟机/解释器中的Just-in-Time Compiler也有了SSA的支持。 Firefox的下一代JavaScript引擎IonMonkey中，也将为其JIT引入SSA。 可以看到，几乎所有热门的语言所用的热门编译器/解释器/虚拟机中都有了SSA。 Table of Contents 1 SSA是什么？ 2 SSA的作用 2.1 SSA与寄存器分配 3 SSA的转换 3.1 从普通中间表示到SSA 3.2 从SSA到普通中间表示 4 更复杂情况下的SSA 4.1 数组、指针等别名 4.2 堆上的存储 4.3 复合结构–结构体 5 GCC中的SSA 6 open64 中的SSA 7 相关资料和文献 1 SSA是什么？ SSA即静态单赋值，Static Single-Assignment，这是一种中间表示形式。 之所以称之为单赋值，是因为每个名字在SSA中仅被赋值一次. 如下图中的一段程序的控制流图。从这张图中可以看到，最后一个基本块中y值的定义或者来自左侧的分支，或者来自右侧的分支。 将每个赋值语句中的变量赋予一个唯一的名称后，一般新名称采用原变量+版本号（Version）的形式。 对于上面这段控制流图，就变成如下形式： 这张图中有个问题，有分支时，若分支中有对变量的操作，就无法确定使用了哪个版本的变量。 因此，引入了PHI节点。如下图所示： PHI将分支中的y1和y2连接，并生成一个新的定义y3。有了PHI节点后，最后一个基本块中y3的定义来自之前的PHI节点，PHI节点中的两个操作数y1和y2分别来自左右两个分支。 2 SSA的作用 在SSA中间表示中，可以保证每个被使用的变量都有唯一的定义，即SSA能带来精确的使用–定义关系。 而在图SSA_example1.1中的y值定义却非常模糊。 概括起来，SSA带来四大益处： <a href='http://www.lingcc.com/2011/08/13/11685/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F30%2F10168%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT I) part II</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F13%2F10273%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT II)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F25%2F10127%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT I)  part 1</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F14%2F10295%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64课程–过程间分析优化(IPA)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64编译器 5.0版本发布</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/11/10/11799/' rel='bookmark' title='Open64编译器 5.0版本发布'>Open64编译器 5.0版本发布</a></li>
<li><a href='http://www.lingcc.com/2009/12/28/10469/' rel='bookmark' title='Open64课程-结语'>Open64课程-结语</a></li>
<li><a href='http://www.lingcc.com/2010/04/30/10822/' rel='bookmark' title='前瞻-LLVM大事记(2004-2010)'>前瞻-LLVM大事记(2004-2010)</a></li>
<li><a href='http://www.lingcc.com/2009/12/13/10273/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT II)'>Open64 课程–全局标量优化(WOPT II)</a></li>
<li><a href='http://www.lingcc.com/2010/01/03/10573/' rel='bookmark' title='过程间分析(InterProcedural Analysis)很好很强大'>过程间分析(InterProcedural Analysis)很好很强大</a></li>
<li><a href='http://www.lingcc.com/2009/11/30/10168/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT I) part II'>Open64 课程–全局标量优化(WOPT I) part II</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>精确的数据流分析是让编译优化能高效进行的基础。 SSA就是一种高效的数据流分析技术，目前几乎所有的现代编译器，如GCC、Open64、LLVM都有将SSA技术的支持， 不仅仅是编译器，Jikes RVM, HotSpot JVM, .Net的Mono，Python的Pypy， Andoroid的Dalvik，这些虚拟机/解释器中的Just-in-Time Compiler也有了SSA的支持。 Firefox的下一代JavaScript引擎IonMonkey中，也将为其JIT引入SSA。<span id="more-11685"></span></p>
<p>可以看到，几乎所有热门的语言所用的热门编译器/解释器/虚拟机中都有了SSA。</p>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 SSA是什么？</a></li>
<li><a href="#sec-2">2 SSA的作用</a>
<ul>
<li><a href="#sec-2.1">2.1 SSA与寄存器分配</a></li>
</ul>
</li>
<li><a href="#sec-3">3 SSA的转换</a>
<ul>
<li><a href="#sec-3.1">3.1 从普通中间表示到SSA</a></li>
<li><a href="#sec-3.2">3.2 从SSA到普通中间表示</a></li>
</ul>
</li>
<li><a href="#sec-4">4 更复杂情况下的SSA</a>
<ul>
<li><a href="#sec-4.1">4.1 数组、指针等别名</a></li>
<li><a href="#sec-4.2">4.2 堆上的存储</a></li>
<li><a href="#sec-4.3">4.3 复合结构–结构体</a></li>
</ul>
</li>
<li><a href="#sec-5">5 GCC中的SSA</a></li>
<li><a href="#sec-6">6 open64 中的SSA</a></li>
<li><a href="#sec-7">7 相关资料和文献</a></li>
</ul>
</div>
</div>
<div id="outline-container-1">
<h2 id="sec-1">1 SSA是什么？</h2>
<div id="text-1">
<p>SSA即静态单赋值，Static Single-Assignment，这是一种中间表示形式。 之所以称之为单赋值，是因为每个名字在SSA中仅被赋值一次.</p>
<p>如下图中的一段程序的控制流图。从这张图中可以看到，最后一个基本块中y值的定义或者来自左侧的分支，或者来自右侧的分支。</p>
<div id="attachment_11688" class="wp-caption alignnone" style="width: 210px"><a href="http://www.lingcc.com/2011/08/13/11685/ssa_example1-1/" rel="attachment wp-att-11688"><img class="size-full wp-image-11688" title="SSA_example1.1" src="http://www.lingcc.com/wp-content/uploads/2011/08/SSA_example1.1.png" alt="SSA_example1.1" width="200" height="290" /></a><p class="wp-caption-text">SSA_example1.1</p></div>
<p>将每个赋值语句中的变量赋予一个唯一的名称后，一般新名称采用原变量+版本号（Version）的形式。 对于上面这段控制流图，就变成如下形式：</p>
<div id="attachment_11689" class="wp-caption alignnone" style="width: 210px"><a href="http://www.lingcc.com/2011/08/13/11685/ssa_example1-2/" rel="attachment wp-att-11689"><img class="size-full wp-image-11689" title="SSA_example1.2" src="http://www.lingcc.com/wp-content/uploads/2011/08/SSA_example1.2.png" alt="SSA_example1.2" width="200" height="290" /></a><p class="wp-caption-text">SSA_example1.2</p></div>
<p>这张图中有个问题，有分支时，若分支中有对变量的操作，就无法确定使用了哪个版本的变量。 因此，引入了PHI节点。如下图所示：</p>
<div id="attachment_11690" class="wp-caption alignnone" style="width: 210px"><a href="http://www.lingcc.com/2011/08/13/11685/ssa_example1-3/" rel="attachment wp-att-11690"><img class="size-full wp-image-11690" title="SSA_example1.3" src="http://www.lingcc.com/wp-content/uploads/2011/08/SSA_example1.3.png" alt="SSA_example1.3" width="200" height="298" /></a><p class="wp-caption-text">SSA_example1.3</p></div>
<p>PHI将分支中的y1和y2连接，并生成一个新的定义y3。有了PHI节点后，最后一个基本块中y3的定义来自之前的PHI节点，PHI节点中的两个操作数y1和y2分别来自左右两个分支。</p>
</div>
</div>
<div id="outline-container-2">
<h2 id="sec-2">2 SSA的作用</h2>
<div id="text-2">
<p>在SSA中间表示中，可以保证每个被使用的变量都有唯一的定义，即SSA能带来精确的使用–定义关系。 而在图SSA_example1.1中的y值定义却非常模糊。</p>
<p>概括起来，SSA带来四大益处：</p>
<ul>
<li>因为SSA使得每个变量都有唯一的定义，因此数据流分析和优化算法可以更加简单</li>
<li>使用-定义关系链所消耗空间从指数增长降低为线性增长。若一个变量有N个使用和M个定义，若不采用SSA，则存在M×N个使用-定义关系。</li>
<li>SSA中因为使用和定义的关系更加的精确，能简化构建干扰图的算法</li>
<li>源程序中对同一个变量的不相关的若干次使用，在SSA形式中会转变成对不同变量的使用，因此能消除很多不必要的依赖关系。</li>
</ul>
<p>有了精确的对象使用–定义关系，许多利用使用–定义关系的优化就能更精确、更彻底、更高效。如</p>
<ul>
<li>常数传播</li>
<li>死代码删除</li>
<li>全局</li>
<li>部分冗余删除</li>
<li>强度削弱</li>
<li>寄存器分配</li>
</ul>
</div>
<div id="outline-container-2.1">
<h3 id="sec-2.1">2.1 SSA与寄存器分配</h3>
<div id="text-2.1">
<p>因为SSA使得依赖分析更加简单、精确，而且PHI节点中的变量不可能同时活跃。因此在SSA形式能协助完成寄存器分配。 实际上，GCC最早的SSA就是GCC 3中RTL阶段。</p>
</div>
</div>
</div>
<div id="outline-container-3">
<h2 id="sec-3">3 SSA的转换</h2>
<div id="text-3">
<p>讲了这么多有关SSA的优点，接下来介绍一下一般编译器构建SSA的方式。</p>
</div>
<div id="outline-container-3.1">
<h3 id="sec-3.1">3.1 从普通中间表示到SSA</h3>
<div id="text-3.1">
<p>两步走战略：</p>
<ul>
<li>插入PHI节点： PHI节点要插在控制流图的汇聚点处（joint point), 只要在汇聚点之前的分支中有针对某个变量的修改， 就需要在该汇聚点插入针对该变量的PHI节点。 PHI节点的操作数是分支路径中重新定义的变量。</li>
<li>变量重命名： 在插入PHI节点后，SSA中所有针对变量的定义就具备了，接下来就依次在定义处重命名变量，并替换对应的变量使用处。</li>
</ul>
<p>此外，为了节省内存空间，简化SSA上的算法，我们需要将插入的PHI节点数目最小化。 因为PHI节点本身只是一个概念性的节点，若插入过多不必要的PHI节点，算法就需要在控制流图的汇聚点针对每个分支做分析。 可以借用变量的支配边界（dominance frontier)进行PHI节点数目最消化。一般都通过直接计算支配边界的方式插入PHI节点。</p>
</div>
</div>
<div id="outline-container-3.2">
<h3 id="sec-3.2">3.2 从SSA到普通中间表示</h3>
<div id="text-3.2">
<p>为什么还要从SSA转换回去呢？很简单，处理器不能直接执行PHI节点对应的操作。最简单的做法，直接拷贝，如下图所示：</p>
<div id="attachment_11686" class="wp-caption alignnone" style="width: 310px"><a href="http://www.lingcc.com/2011/08/13/11685/de-ssa/" rel="attachment wp-att-11686"><img class="size-medium wp-image-11686" title="de-ssa" src="http://www.lingcc.com/wp-content/uploads/2011/08/de-ssa-300x100.png" alt="out of ssa" width="300" height="100" /></a><p class="wp-caption-text">out of ssa</p></div>
<p>但这样有一个问题，如下图。简单的拷贝算法可能改变代码的语义：</p>
<div id="attachment_11687" class="wp-caption alignnone" style="width: 310px"><a href="http://www.lingcc.com/2011/08/13/11685/de-ssa-problem/" rel="attachment wp-att-11687"><img class="size-medium wp-image-11687" title="de-ssa-problem" src="http://www.lingcc.com/wp-content/uploads/2011/08/de-ssa-problem-300x128.png" alt="out of ssa problem" width="300" height="128" /></a><p class="wp-caption-text">out of ssa problem</p></div>
<p>正确的做法：</p>
<ul>
<li>对PHI节点的操作数和结果重命名，使其名称相同，即变成同一个变量</li>
<li>再在分支中插入拷贝操作</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-4">
<h2 id="sec-4">4 更复杂情况下的SSA</h2>
<div id="outline-container-4.1">
<h3 id="sec-4.1">4.1 数组、指针等别名</h3>
<div id="text-4.1">
<p>上面关于SSA的讨论基本都是针对单个简单变量的SSA操作，那么对于复杂的指针、数组之类的访存,SSA应该如何处理呢？ 数组和指针使得编译器无法确定define和use的具体变量。</p>
<p>参考资料7给出了一种定义方式，通过引入maydef，mayuse和zero version使得编译器也能对别名（即指针和数组）存在的程序做SSA分析。 若通过指针为其所指区域赋值，就在此处插入maydef，表示可能对变量做了定义。同理，对使用指针所指向区域的值的，就插入一个mayuse。 因为无法确定指针所指向的到底是哪个变量，为了正确性，需要对所有变量都插入maydef动作。同样mayuse也是针对所有变量的。</p>
<p>当指针操作较多时，这种方式就会引入过多的新变量版本。因此就增加了zero version。 zero version的作用就是尽量把maydef所带来的版本数降低。 将那些很可能不会别名的都使用相同的zero version。 比如某个变量通过maydef产生了一个新版本之后，若还会有新的maydef操作，则直接生成zero version，不再生成新的version。</p>
</div>
</div>
<div id="outline-container-4.2">
<h3 id="sec-4.2">4.2 堆上的存储</h3>
<div id="text-4.2">
<p>在堆上分配的存储空间，一般编译器都将整个堆看作一个对象，来做SSA。</p>
</div>
</div>
<div id="outline-container-4.3">
<h3 id="sec-4.3">4.3 复合结构–结构体</h3>
<div id="text-4.3">
<p>因为结构体也是由很多元素构成的，所以就存在两种处理方式：把结构体整个看作一个整体做SSA、把结构体的每个元素看作一个对象做SSA。 后者相比前者，因为分的更细，在结构体操作频繁的程序中能带来不错的优化效果。</p>
</div>
</div>
</div>
<div id="outline-container-5">
<h2 id="sec-5">5 GCC中的SSA</h2>
<div id="text-5">
<p>GCC的SSA</p>
<ul>
<li>tree-ssa.c</li>
<li>tree-into-ssa.c:将函数转换为SSA形式，插入PHI节点，对于未初始化的变量给出警告。</li>
<li>tree-ssa-dce.c:扫描整个函数，标记无副作用且结果并未被使用的语句，所有存储操作都视为有副作用。</li>
<li>tree-ssa-dom.c:支配关系相关优化：复写传播、常数传播、表达式简化、冗余消除、Jump Threading？</li>
<li>tree-ssa-forwprop.c:前向传播单一引用变量，通过将仅使用一次的变量用相应的表达式替代来尝试容易删除。</li>
<li>tree-ssa-copyrename.c:尝试将由拷贝动作产生的SSA变量用原变量替换之，优化符号表。</li>
<li>tree-ssa-phiopt.c: 识别表达条件表达式的phi节点，并将其重写为直线代码。</li>
<li>tree-ssa-alias.c:流敏感基于SSA的指向分析，得到可能-别名，一定-别名和逃逸分析信息。 这些信息将用于将变量从内存中地址可用对象提升为非别名变量，这样这些变量就能使用SSA形式的分析和优化了。</li>
<li>tree-ssa-structalias.c:用于过程间的指向分析。</li>
<li>tree-sra.c:将合适的无别名局部复合变量转换为一个标量集合，并进而转换为SSA形式。</li>
<li>tree-ssa-dse.c:删除那些无用的存储操作</li>
<li>tree-ssa-sink.c:将存储和赋值语句尽量下沉到和它们的使用点接近的位置。</li>
<li>tree-ssa-pre.c:部分冗余删除、load语句移动、完全冗余删除</li>
<li>tree-ssa-loop.c: SSA形式的循环优化
<ul>
<li>tree-ssa-loop-im.c:循环无关语句移动</li>
<li>tree-ssa-loop-ivcanon.c:循环标准化</li>
<li>tree-ssa-loop-ivopts.c:索引变量优化</li>
<li>tree-ssa-loop-unswitch.c:将循环无关的条件跳转移到循环外</li>
<li>tree-vectorizer.c, tree-vect-analyze.c, tree-vect-transform.c:自动向量化</li>
</ul>
</li>
<li>tree-ssa-ccp.c:条件常数传播</li>
<li>tree-ssa-copy.c:条件复写传播</li>
<li>tree-vrp.c:取值范围传播</li>
<li>tree-outof-ssa.c:从SSA形式转换回普通形式</li>
</ul>
</div>
</div>
<div id="outline-container-6">
<h2 id="sec-6">6 open64 中的SSA</h2>
<div id="text-6">
<p>open64中的SSA主要用于循环嵌套优化、过程间优化以及普通的函数内优化。 除了循环变换和内联优化外的所有机器无关优化都基于SSA做。 这部分可以说是Open64的重要卖点，对应的代码在osprey/be/opt下。</p>
<p>Open64在没有过程间优化时，主要以函数为单位进行，基于控制流图和别名分析得到的信息构建SSA。</p>
<ul>
<li>opt_goto.cxx：goto语句转换，方便做SSA</li>
<li>opt_loop.cxx：循环正规化</li>
<li>opt_sym.cxx：构建相关符号表</li>
<li>opt_alias_class.cxx：别名分类，方便别名分析</li>
<li>opt_cfg.cxx：构建控制流图，包括支配树，不可到达代码识别，if语句转换</li>
<li>opt_tail.cxx：尾递归消除</li>
<li>opt_alias_analysis.cxx：流无关别名分析</li>
<li>opt_ssa.cxx：构建基于WHIRL的SSA</li>
<li>opt_dse.cxx：死store删除</li>
<li>opt_htable.cxx：构建HSSA–基于哈希的全局值编号SSA</li>
<li>opt_ivr.cxx：索引变量标准化</li>
<li>opt_prop.cxx：复写传播</li>
<li>opt_revise_ssa.cxx：将非直接变量展开成直接变量</li>
<li>opt_dce.cxx：死代码删除</li>
<li>opt_cfg_trans.cxx：控制流转换</li>
<li>opt_rename.cxx：SSA变量重命名、更新</li>
<li>opt_du.cxx：构建define-use信息</li>
<li>opt_etable.cxx：基于表达式的部分冗余删除</li>
<li>opt_estr.cxx：强度削弱</li>
<li>opt_ehoist.cxx：代码提升</li>
<li>opt_lftr2.cxx：线性代码测试、替换</li>
<li>opt_vn.cxx：基于值编号的完全冗余删除</li>
<li>opt_ltable.cxx：针对load的部分冗余删除</li>
<li>opt_stable.cxx：store Partial Redundancy Elimination 针对store的部分冗余删除</li>
<li>opt_bdce.cxx： Bitwise dead code elimination–针对结构体</li>
<li>opt_htable_emit.cxx: 从SSA转换回WHIRL中间表示</li>
</ul>
</div>
</div>
<div id="outline-container-7">
<h2 id="sec-7">7 相关资料和文献</h2>
<div id="text-7">
<ul>
<li><a href="http://en.wikipedia.org/wiki/Static_single_assignment_form">http://en.wikipedia.org/wiki/Static_single_assignment_form</a></li>
<li><a href="http://en.wikipedia.org/wiki/SpiderMonkey_%28JavaScript_engine%29">http://en.wikipedia.org/wiki/SpiderMonkey_%28JavaScript_engine%29</a></li>
<li>Advanced Compiler Design and Implementation, by Steven S. Muchnick, Page 252-265</li>
<li>Modern Compiler Implementation in C， by Andrew W. Appel, Page 433-473</li>
<li>Crafting A Compiler, by Charles N. Fischer, etc , Page 410-414</li>
<li>8. Static Single Assignment Form， by Marcus Denker, <a href="http://marcusdenker.de/talks/08CC/08IntroSSA.pdf">http://marcusdenker.de/talks/08CC/08IntroSSA.pdf</a></li>
<li>Effective Representation of Aliases and Indirect Memory Operations in SSA Form, Fred Chow, Sun Chan, etc. Compiler Construction 1996</li>
</ul>
</div>
</div>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F30%2F10168%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT I) part II</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F13%2F10273%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT II)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F25%2F10127%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64 课程–全局标量优化(WOPT I)  part 1</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F14%2F10295%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64课程–过程间分析优化(IPA)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F10%2F11799%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F08%2F13%2F11685%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64编译器 5.0版本发布</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/11/10/11799/' rel='bookmark' title='Open64编译器 5.0版本发布'>Open64编译器 5.0版本发布</a></li>
<li><a href='http://www.lingcc.com/2009/12/28/10469/' rel='bookmark' title='Open64课程-结语'>Open64课程-结语</a></li>
<li><a href='http://www.lingcc.com/2010/04/30/10822/' rel='bookmark' title='前瞻-LLVM大事记(2004-2010)'>前瞻-LLVM大事记(2004-2010)</a></li>
<li><a href='http://www.lingcc.com/2009/12/13/10273/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT II)'>Open64 课程–全局标量优化(WOPT II)</a></li>
<li><a href='http://www.lingcc.com/2010/01/03/10573/' rel='bookmark' title='过程间分析(InterProcedural Analysis)很好很强大'>过程间分析(InterProcedural Analysis)很好很强大</a></li>
<li><a href='http://www.lingcc.com/2009/11/30/10168/' rel='bookmark' title='Open64 课程–全局标量优化(WOPT I) part II'>Open64 课程–全局标量优化(WOPT I) part II</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/08/13/11685/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC几个选项学习</title>
		<link>http://www.lingcc.com/2011/06/27/11679/</link>
		<comments>http://www.lingcc.com/2011/06/27/11679/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 12:20:32 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[GCC]]></category>
		<category><![CDATA[编译技术]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[选项]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11679</guid>
		<description><![CDATA[最近研究了一把GCC的选项，比较有意思，选些出来，学习学习。编译器作为程序员的重要工具，GCC作为编译器中应用最广泛的，无不处处体现出贴心的设计和功能支持。 Table of Contents 1 -dumpmachine 2 -xc 3 -dM 4 -print-file-name=include 5 -isystem DIR 6 -nostdinc/-nostdinc++ 7 -Wp/-Wa/-Wl 8 -EL/-EB 9 -DMACRO/-UMACRO 10 -G num 11 -msym32/-mnosym32 12 -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks 13 -mcheck-zero-division/-mno-check-zero-division 14 -mabicalls/-mno-abicalls 15 -mbranch-likely/-mno-branch-likely 16 -fstack-protector 17 -fstrict-overflow 18 -fconserve-stack 19 参考 1 -dumpmachine 给出当前使用GCC的信息,在erlv的Debian AMD64上，结果如下。 关于GCC的这些字段是什么意思，请参考这篇博文： $ gcc -dumpmachine x86_64-linux-gnu 2 -xc <a href='http://www.lingcc.com/2011/06/27/11679/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F20%2F10065%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Gcc和Open64中的-fPIC选项</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F01%2F08%2F10609%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC中的pie和fpie选项</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC如何进出GIMPLE中间表示</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/12/05/11872/' rel='bookmark' title='Linux 内核中的.S文件'>Linux 内核中的.S文件</a></li>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
<li><a href='http://www.lingcc.com/2008/01/23/9891/' rel='bookmark' title='我的xorg.conf'>我的xorg.conf</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2010/01/08/10609/' rel='bookmark' title='GCC中的pie和fpie选项'>GCC中的pie和fpie选项</a></li>
<li><a href='http://www.lingcc.com/2010/03/25/10717/' rel='bookmark' title='为龙芯电脑安装操作系统常见问题'>为龙芯电脑安装操作系统常见问题</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>最近研究了一把GCC的选项，比较有意思，选些出来，学习学习。编译器作为程序员的重要工具，GCC作为编译器中应用最广泛的，无不处处体现出贴心的设计和功能支持。<br />
<span id="more-11679"></span></p>
<div id="table-of-contents"></div>
<div>
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 -dumpmachine </a></li>
<li><a href="#sec-2">2 -xc </a></li>
<li><a href="#sec-3">3 -dM </a></li>
<li><a href="#sec-4">4 -print-file-name=include </a></li>
<li><a href="#sec-5">5 -isystem DIR </a></li>
<li><a href="#sec-6">6 -nostdinc/-nostdinc++ </a></li>
<li><a href="#sec-7">7 -Wp/-Wa/-Wl </a></li>
<li><a href="#sec-8">8 -EL/-EB </a></li>
<li><a href="#sec-9">9 -DMACRO/-UMACRO </a></li>
<li><a href="#sec-10">10 -G num </a></li>
<li><a href="#sec-11">11 -msym32/-mnosym32 </a></li>
<li><a href="#sec-12">12 -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks </a></li>
<li><a href="#sec-13">13 -mcheck-zero-division/-mno-check-zero-division </a></li>
<li><a href="#sec-14">14 -mabicalls/-mno-abicalls </a></li>
<li><a href="#sec-15">15 -mbranch-likely/-mno-branch-likely </a></li>
<li><a href="#sec-16">16 -fstack-protector </a></li>
<li><a href="#sec-17">17 -fstrict-overflow </a></li>
<li><a href="#sec-18">18 -fconserve-stack </a></li>
<li><a href="#sec-19">19 参考 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> -dumpmachine</h2>
<div id="text-1" class="outline-text-2">
<p>给出当前使用GCC的信息,在erlv的Debian AMD64上，结果如下。<br />
关于GCC的这些字段是什么意思，请参考这篇博文：</p>
<pre class="src src-sh">$ gcc -dumpmachine
x86_64-linux-gnu</pre>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2"><span class="section-number-2">2</span> -xc</h2>
<div id="text-2" class="outline-text-2">
<p>其实，-xc和 “-x c”等同。</p>
<ul>
<li> x用于指定输入的程序的语言，如果使用该选项，GCC就不再根据文件的后缀名判断语言类型。&nbsp;</li>
</ul>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3"><span class="section-number-2">3</span> -dM</h2>
<div id="text-3" class="outline-text-2">
<p>不做实际的预处理，仅仅列出所有#define的宏,这些宏大部分与体系结构和GNU相关，或来自所包含的头文件。</p>
<pre class="src src-sh"><span style="color: #ff7f24;">#</span><span style="color: #ff7f24;">程序输出太长，这里就不列出了
</span>$<span style="color: #eedd82;">gcc</span>  -E -dM hello.c</pre>
<p>另外，还有一些-dCHARS的组合选项：</p>
<ul>
<li> -dD:和-dM类似，不过仅仅包含头文件中定义的宏，不会输出预处理器中默认定义的宏，另外会将源程序代码也预处理输出。</li>
<li> -dN：和-dD类似，但仅输出定义的宏的名称，不输出宏的值。</li>
<li> -dI:给出#include的头文件，预计预处理的结果</li>
<li> -dU:和-dD类似，但仅仅输出那些在源码中需要展开的，或者其定义会被测试到的宏。&nbsp;</li>
</ul>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4"><span class="section-number-2">4</span> -print-file-name=include</h2>
<div id="text-4" class="outline-text-2">
<p>打印GCC默认搜索include头文件的路径</p>
<pre class="src src-sh">$ gcc -print-file-name=include
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/include</pre>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h2 id="sec-5"><span class="section-number-2">5</span> -isystem DIR</h2>
<div id="text-5" class="outline-text-2">
<p>将DIR路径作为头文件搜索路径之一。搜索顺序: -I指定的文件夹 =》  -isystem指定的文件夹 =》 标准系统头文件夹。</p>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h2 id="sec-6"><span class="section-number-2">6</span> -nostdinc/-nostdinc++</h2>
<div id="text-6" class="outline-text-2">
<p>不要搜索标准系统头文件目录，仅搜索-I指定的路径。</p>
</div>
</div>
<div id="outline-container-7" class="outline-2">
<h2 id="sec-7"><span class="section-number-2">7</span> -Wp/-Wa/-Wl</h2>
<div id="text-7" class="outline-text-2">
<p>这三个分别用来指定传递给 预处理起、汇编器和链接器的参数。</p>
<ul>
<li> -Wp,option 等价于  -Xpreprocessor option</li>
<li> -Wa,option 等价于  -Xassembler option</li>
<li> -Wl,option 等价于  -Xlinker option</li>
</ul>
</div>
</div>
<div id="outline-container-8" class="outline-2">
<h2 id="sec-8"><span class="section-number-2">8</span> -EL/-EB</h2>
<div id="text-8" class="outline-text-2">
<p>为小尾端/大尾端系统编译代码。默认是小尾端</p>
</div>
</div>
<div id="outline-container-9" class="outline-2">
<h2 id="sec-9"><span class="section-number-2">9</span> -DMACRO/-UMACRO</h2>
<div id="text-9" class="outline-text-2">
<p>定义宏MACRO/撤销对宏MACRO的定义</p>
</div>
</div>
<div id="outline-container-10" class="outline-2">
<h2 id="sec-10"><span class="section-number-2">10</span> -G num</h2>
<div id="text-10" class="outline-text-2">
<p>将全局和静态对象的大小分割成小于num字节的数据放入bss端的小数据中，而非正常数据中。<br />
默认的num的值为8.</p>
<p>由于MIPS在从符号得到地址时，需要先取出高16位，再取出低16位，做拼接得到最终地址，所以就需要两次访存操作。<br />
当程序中大量使用静态和全局数据时，这种方式就会让程序变慢。<br />
于是就有了利用GP寄存器进行优化的方法，即采用和GP寄存器做相对偏移的方式访存，以便降低访存次数。<br />
关键问题是编译器和汇编器需要在编译时刻确定哪些变量可以使用GP寄存器访问。<br />
通常的做法是让大小小于一定值的变量通过GP寄存器访问。</p>
<p>若num为 0表示将这一优化关闭。</p>
</div>
</div>
<div id="outline-container-11" class="outline-2">
<h2 id="sec-11"><span class="section-number-2">11</span> -msym32/-mnosym32</h2>
<div id="text-11" class="outline-text-2">
<p>不管采取何种ABI，都假设/不假设所有符号都是32位的值。<br />
这一选项配合-mabi=64 和-mno-abicall时非常有用，因为可以通过假设都是32位数据生成更小巧更快的符号地址</p>
</div>
</div>
<div id="outline-container-12" class="outline-2">
<h2 id="sec-12"><span class="section-number-2">12</span> -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks</h2>
<div id="text-12" class="outline-text-2">
<p>delete-null-pointer-checks是一种优化手段，通过全局的数据流分析来识别和删除所有对空指针的检测操作。<br />
编译器假定对空指针的解引用会造成程序终止。但因为有些环境下，这一结论并不一定成立，而O2，O3和Os时会开启此优化。<br />
因此GCC增加了选项-fno-delete-null-pointer-checks</p>
</div>
</div>
<div id="outline-container-13" class="outline-2">
<h2 id="sec-13"><span class="section-number-2">13</span> -mcheck-zero-division/-mno-check-zero-division</h2>
<div id="text-13" class="outline-text-2">
<p>当整数除0操作时，陷入/不陷入</p>
</div>
</div>
<div id="outline-container-14" class="outline-2">
<h2 id="sec-14"><span class="section-number-2">14</span> -mabicalls/-mno-abicalls</h2>
<div id="text-14" class="outline-text-2">
<p>生成/不生成适SVR4形式的动态对象代码，默认生成。</p>
</div>
</div>
<div id="outline-container-15" class="outline-2">
<h2 id="sec-15"><span class="section-number-2">15</span> -mbranch-likely/-mno-branch-likely</h2>
<div id="text-15" class="outline-text-2">
<p>使用/使用 branch likely 指令，不管所指定体系结构默认是否支持。<br />
GCC默认会为支持branch likely指令的体系结构生成branch likely指令。</p>
<p>引入这类指令，是为了引入一种很大可能会发生跳转的指令，这样编译器就能充分的利用MIPS中的delay slot。</p>
</div>
</div>
<div id="outline-container-16" class="outline-2">
<h2 id="sec-16"><span class="section-number-2">16</span> -fstack-protector</h2>
<div id="text-16" class="outline-text-2">
<p>为可能的缓冲区溢出生成额外的检测代码。</p>
</div>
</div>
<div id="outline-container-17" class="outline-2">
<h2 id="sec-17"><span class="section-number-2">17</span> -fstrict-overflow</h2>
<div id="text-17" class="outline-text-2">
<p>允许编译器使用严格的有符号溢出规则。</p>
</div>
</div>
<div id="outline-container-18" class="outline-2">
<h2 id="sec-18"><span class="section-number-2">18</span> -fconserve-stack</h2>
<div id="text-18" class="outline-text-2">
<p>尽量减小对栈的使用。</p>
</div>
</div>
<div id="outline-container-19" class="outline-2">
<h2 id="sec-19"><span class="section-number-2">19</span> 参考</h2>
<div id="text-19" class="outline-text-2">
<ul>
<li> <a href="http://gcc.gnu.org/ml/gcc-help/2006-10/msg00191.html">http://gcc.gnu.org/ml/gcc-help/2006-10/msg00191.html</a></li>
<li> See MIPS Run Linux, 2ed， by Dominic Sweetman， Page 273</li>
<li> GCC man pages</li>
</ul>
</div>
</div>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F11%2F20%2F10065%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Gcc和Open64中的-fPIC选项</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F01%2F08%2F10609%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC中的pie和fpie选项</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC如何进出GIMPLE中间表示</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2011/12/05/11872/' rel='bookmark' title='Linux 内核中的.S文件'>Linux 内核中的.S文件</a></li>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
<li><a href='http://www.lingcc.com/2008/01/23/9891/' rel='bookmark' title='我的xorg.conf'>我的xorg.conf</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2010/01/08/10609/' rel='bookmark' title='GCC中的pie和fpie选项'>GCC中的pie和fpie选项</a></li>
<li><a href='http://www.lingcc.com/2010/03/25/10717/' rel='bookmark' title='为龙芯电脑安装操作系统常见问题'>为龙芯电脑安装操作系统常见问题</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/06/27/11679/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>仔细端详GCC 4.6的新特性</title>
		<link>http://www.lingcc.com/2011/03/28/11567/</link>
		<comments>http://www.lingcc.com/2011/03/28/11567/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 09:24:23 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[GCC]]></category>
		<category><![CDATA[编译技术]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11567</guid>
		<description><![CDATA[去年3月GCC 4.5.0发布，而今，GCC刚刚正式发布了4.6版本。这个版本包含了很多的更新。 亮点： 大大改进了过程间分析和链接时优化。正确性方面，编译了FIrefox，无疑是最有力的证明，但性能方面的评测没有，所以LTO是否真有性能不好说。不过从 Go语言进入了GCC的支持 龙芯3A也支持了。 AVX支持了，但看样子，有点弱(没有自己调研过)。 增加了128位浮点数支持，这个在科学计算领域应该很有用，X86和安腾系的芯片首先得益。 另外，Phoronix刚刚发布了针对GCC4.5.2， 4.6RC2， LLVM2.9和DragonEgg的性能评测，结果看起来GCC4.6不是很给力。不清楚具体开了什么编译选项。 &#160; 细节更新如下： 更标准化的选项。含义不精确的选项被取缔，通过gcc命令传递给汇编器和链接器的选项，也通通需要加上指定的前缀，如-Wl,&#8211;as-needed. 修正了一个GCC内部函数cproj和ISO C99标准不一致的地方，并做了优化，不过用户需要GLIBC 2.12及以后的版本才行。 移除了模块间优化扩展，使用4.5中引入的LTO代替之。 增加了采用LGPL协议的libquadmath数学库，这个库可以为32位x86，x86-64和安腾平台提供128浮点数的浮点运算支持。 删除了一些老旧平台的支持。 优化方面的更新： 增加猥琐级编译优化选项-ofast,这个选项除了打开-O3的所有优化外，还开启了所有能开启的优化，以获得更好的性能，如-ffast-mast优化 改进链接时优化(LTO)： 全局可扩展优化器已经足够稳定。打开LTO后会默认开启此优化。该优化器可以自动分割成几个并行的编译过程，可以用选项-flto=n指定并行编译进程个数。 搞定了很多LTO的bug。打开LTO可以编译Firefox了。 改进连接器插件 C++内联函数和虚表采取了更急进的私有化策略，以便更好的作过程间优化。 改进内存试用 将独立单元的静态构造和析构函数内联到一个单独函数中，以便加速大型C++程序的启动 支持Ada语言 过程间优化的改进 已经为了LTO调优了过程间处理机制，获得了更好的扩展性。 改进对const和pure函数的自动检测 一些针对内联的改进 O2现在会开启部分内联。即，将函数分割成较热的路径和不热的路径。这样，就可以对热路径采用更激进的优化策略。 改进对大的编译单元的扩展性。 对回调的内联更激进 改进对虚方法的内联，以及在开启-Os选项时针对C++程序的内联策略。 加强IPA引用优化阶段 对 全局变量的使用/定义的检测， 死函数地址优化 增加-fstack-usage选项。编译器可以输出程序的栈使用信息 其他更新 改进编译时间和内存占用。 增加Go语言支持 增加对avx的支持 增加对龙芯3A的支持 相关文章： 来仔细看看GCC 4.5.0 GCC初窥 Open64课程-编译过程 说说静态单赋值（SSA,Static Single-Assignment) <a href='http://www.lingcc.com/2011/03/28/11567/'>[...]</a><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F16%2F11210%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC Internal 中文文档上线</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC如何进出GIMPLE中间表示</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F19%2F11208%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC即将支持龙芯3A</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/04/16/10746/' rel='bookmark' title='来仔细看看GCC 4.5.0'>来仔细看看GCC 4.5.0</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2009/11/19/10024/' rel='bookmark' title='Open64课程-编译过程'>Open64课程-编译过程</a></li>
<li><a href='http://www.lingcc.com/2011/08/13/11685/' rel='bookmark' title='说说静态单赋值（SSA,Static Single-Assignment)'>说说静态单赋值（SSA,Static Single-Assignment)</a></li>
<li><a href='http://www.lingcc.com/2011/06/27/11679/' rel='bookmark' title='GCC几个选项学习'>GCC几个选项学习</a></li>
<li><a href='http://www.lingcc.com/2010/09/16/11210/' rel='bookmark' title='GCC Internal 中文文档上线'>GCC Internal 中文文档上线</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>去年3月GCC 4.5.0发布，而今，GCC刚刚正式发布了4.6版本。这个版本包含了很多的更新。</p>
<p>亮点：</p>
<ul>
<li>大大改进了过程间分析和链接时优化。正确性方面，编译了FIrefox，无疑是最有力的证明，但性能方面的评测没有，所以LTO是否真有性能不好说。不过从</li>
<li>Go语言进入了GCC的支持</li>
<li>龙芯3A也支持了。</li>
<li>AVX支持了，<del>但看样子，有点弱</del>(没有自己调研过)。</li>
<li>增加了128位浮点数支持，这个在科学计算领域应该很有用，X86和安腾系的芯片首先得益。</li>
<li>另外，<a href="http://www.phoronix.com/scan.php?page=article&amp;item=gcc_46_llvm29&amp;num=1">Phoronix刚刚发布了针对GCC4.5.2， 4.6RC2， LLVM2.9和DragonEgg的性能评测</a>，结果看起来GCC4.6不是很给力。不清楚具体开了什么编译选项。</li>
</ul>
<p>&nbsp;</p>
<p>细节更新如下：</p>
<ul>
<li>更标准化的选项。含义不精确的选项被取缔，通过gcc命令传递给汇编器和链接器的选项，也通通需要加上指定的前缀，如-Wl,&#8211;as-needed.</li>
<li>修正了一个GCC内部函数cproj和ISO C99标准不一致的地方，并做了优化，不过用户需要GLIBC 2.12及以后的版本才行。</li>
<li>移除了模块间优化扩展，使用4.5中引入的LTO代替之。</li>
<li>增加了采用LGPL协议的libquadmath数学库，这个库可以为32位x86，x86-64和安腾平台提供128浮点数的浮点运算支持。</li>
<li>删除了一些老旧平台的支持。</li>
</ul>
<p><span id="more-11567"></span></p>
<p>优化方面的更新：</p>
<ul>
<li>增加猥琐级编译优化选项-ofast,这个选项除了打开-O3的所有优化外，还开启了所有能开启的优化，以获得更好的性能，如-ffast-mast优化</li>
<li>改进链接时优化(LTO)：
<ul>
<li>全局可扩展优化器已经足够稳定。打开LTO后会默认开启此优化。该优化器可以自动分割成几个并行的编译过程，可以用选项-flto=n指定并行编译进程个数。</li>
<li>搞定了很多LTO的bug。打开LTO可以编译Firefox了。</li>
<li>改进连接器插件</li>
<li>C++内联函数和虚表采取了更急进的私有化策略，以便更好的作过程间优化。</li>
<li>改进内存试用</li>
<li>将独立单元的静态构造和析构函数内联到一个单独函数中，以便加速大型C++程序的启动</li>
<li>支持Ada语言</li>
</ul>
</li>
<li>过程间优化的改进
<ul>
<li>已经为了LTO调优了过程间处理机制，获得了更好的扩展性。</li>
<li>改进对const和pure函数的自动检测</li>
<li>一些针对内联的改进
<ul>
<li>O2现在会开启部分内联。即，将函数分割成较热的路径和不热的路径。这样，就可以对热路径采用更激进的优化策略。</li>
<li>改进对大的编译单元的扩展性。</li>
<li>对回调的内联更激进</li>
<li>改进对虚方法的内联，以及在开启-Os选项时针对C++程序的内联策略。</li>
</ul>
</li>
<li>加强IPA引用优化阶段 对 全局变量的使用/定义的检测，</li>
<li>死函数地址优化</li>
</ul>
</li>
<li>增加-fstack-usage选项。编译器可以输出程序的栈使用信息</li>
</ul>
<p>其他更新</p>
<ul>
<li>改进编译时间和内存占用。</li>
<li>增加Go语言支持</li>
<li>增加对avx的支持</li>
<li>增加对龙芯3A的支持</li>
</ul>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F16%2F11210%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC Internal 中文文档上线</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F11%2F29%2F11859%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC如何进出GIMPLE中间表示</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F09%2F19%2F11208%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC即将支持龙芯3A</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/04/16/10746/' rel='bookmark' title='来仔细看看GCC 4.5.0'>来仔细看看GCC 4.5.0</a></li>
<li><a href='http://www.lingcc.com/2009/12/29/10503/' rel='bookmark' title='GCC初窥'>GCC初窥</a></li>
<li><a href='http://www.lingcc.com/2009/11/19/10024/' rel='bookmark' title='Open64课程-编译过程'>Open64课程-编译过程</a></li>
<li><a href='http://www.lingcc.com/2011/08/13/11685/' rel='bookmark' title='说说静态单赋值（SSA,Static Single-Assignment)'>说说静态单赋值（SSA,Static Single-Assignment)</a></li>
<li><a href='http://www.lingcc.com/2011/06/27/11679/' rel='bookmark' title='GCC几个选项学习'>GCC几个选项学习</a></li>
<li><a href='http://www.lingcc.com/2010/09/16/11210/' rel='bookmark' title='GCC Internal 中文文档上线'>GCC Internal 中文文档上线</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2011/03/28/11567/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>说说静态代码分析工具</title>
		<link>http://www.lingcc.com/2010/11/04/11412/</link>
		<comments>http://www.lingcc.com/2010/11/04/11412/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 14:30:59 +0000</pubDate>
		<dc:creator>erlv</dc:creator>
				<category><![CDATA[前端和程序分析]]></category>
		<category><![CDATA[编译技术]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[icc]]></category>
		<category><![CDATA[PVS-studio]]></category>
		<category><![CDATA[程序静态分析]]></category>

		<guid isPermaLink="false">http://www.lingcc.com/?p=11412</guid>
		<description><![CDATA[昨天的360大战QQ相比各位都有领略了。双方都提到已将代码送交有关部门审查，或者从有关部门拿到了代码审查报告之类的。代码审查，光靠人看可不行，代码分析工具少不了。这是维基上关于静态代码分析的介绍。这个页面列出了很多静态代码分析工具，应该比较全了。碰巧Intel的博客发表了一篇文章。介绍ICC和一款商业代码分析工具的对比。这里就借花献佛，现读现卖。学习学习。这篇文章并不是简单的翻译Intel的博客，增加了很多概念性的和GCC的相关内容。 之所以称之为静态代码分析，是因为只是分析源代码或者生成的目标文件，并不实际运行源代码生成的文件。这个方向现在很热，因为程序越来越多，而越来越多的领域依赖计算机，代码的质量就成了关键。比如航天、国防、工业控制、金融等对安全性，稳定性要求很高的领域。 现在的静态代码分析几乎都是采用形式化的方法，所谓形式化，即使用类似数学推导的形式，运用数学的方法分析代码。当然也会包括一些经典的分析，比如使用memcpy要小心越界、操作字符串要小心之类的提醒。 虽然本质上，计算机只不过是个状态机，在不同的状态之间转换。但实际上，图灵爷早在1930年就证明确实没办法静态确定运行时程序所有的错误。所以，一切静态分析工具理论上都没办法找到所有问题。不过，聊胜于无。找到点总是有好处的。分析工具一般有模型检测、数据流分析、抽象解释模型等方式来实现静态分析。国内，中科院软件所和中国科学技术大学都有团队在做这个方向，其他高校不清楚。 编译器和静态代码分析工具都能检查代码中的潜在问题。但是编译器和其他工具区别很大。intel文章选取了notepad++这个应用程序的代码来测试intel C++编译器和PVS-studio分析器。notepad++用C++编写，代码量比较小，73000行。 ICC编译器的分析 一般的，编译器最重要的作用是生成可执行文件，所以对于词法语法的分析相对局部一些，即在检测错误时，前后查看的代码较少。这也是为了编译器的性能，因为还有很多的优化变换要做，所以编译器在词法语法分析上不能耗费太多时间。尤其是大的工程，代码量很大。编译要半天的时间时，5%的性能差距就会差十几分钟。 编译器在做完预处理后，就开始做词法语法分析，这就是程序分析的主要阶段。有的编译器，在生成抽象语法树(AST)时，会立即对抽象语法树处理，生成汇编。有的会做完整个函数、文件甚至整个程序之后，再做整体分析，生成汇编代码。Visual C++就是典型的第一类，因为它并不看重很多编译优化，更看重快速的程序分析和编译，不过程序员可以规定VC++报warning的级别。GCC和Open64偏向后者，其中Open64在没开过程间优化时，通常针对每个函数做处理，开了优化，就会对整个程序做分析。 编译器的这些区别就决定了能检测的错误的数量。而这错误的数量绝大多数和指定编译器分析代码的范围有关。比如intel文章作者就发现notepad++使用VC++ /w4（最高警告级别)编译不会报任何警告，使用Intel的C++编译器，开到/w5级别，发现了个潜在的问题：可能出错的强制类型转换(函数处理字符串而非字符，但传入的参数仅仅是指向字符的指针，并且会修改内存)。当然，作者也承认，除了这个错外，ICC还报了一些比较无聊的警告。 GCC的代码分析 GCC代码分析的输出可以通过控制警告输出实现，这里给出了所有和语言无关的警告选项。这里给出了C++语言相关的选项。GCC的 调几个说说：-Wall会给出所有用户可能需要仔细考虑的警告，比如字符做数组下标、注释里的格式不对、直接比较枚举类型等等；-Wextra会打开一些-Wall没有打开的警告选项。利用这两个选项，大的程序，应该够你折腾一段时间了：）。 第三方的静态代码分析器 这种工具并没有时间上苛刻的需求，因为不用像编译器那样需要频繁的运行。所以，这些分析工具通常会非常慢。所以你可以白天用编译器写代码，晚上用分析器检查代码。慢是能带来好处的，静态代码分析器可以将程序的抽象语法数保存、分析、转换，精确的分析，找到的问题更多，更准确。 文章作者使用PVS-studio分析了notepad++的代码。结果显示，这个工具很牛，能发现一些潜在问题，或者针对某些潜在问题给出警告。比如，找到memset函数，会提醒你可能溢出；发现一些不容易发现的无意义语句，如if-else走的分支完全一样，或者&#38;&#38;两边的操作数完全相同之类的警告。 问题： 虽然能帮助发现错误，但太敏感也不好。作者使用ICC做检测时，给出了439个警告和3139个注意。总的来说73000/3578=20,也就是说平均20行就有报一个问题，要想每个都好好分析，任重道远。而且仅仅有4个真正的问题。PVS-studio仅仅给出了10个警告，4个是真正的问题。看来还是专业才比较好。 相关文章： open64中的gcc前端 说说静态单赋值（SSA,Static Single-Assignment) GCC如何进出GIMPLE中间表示 Google 与 Clang 推荐文章(未完成) 探秘CPU性能测试：Spec CPU2000之整点篇<table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F16%2F10317%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程—代码生成(CG)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>
<h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
<li><a href='http://www.lingcc.com/2011/08/13/11685/' rel='bookmark' title='说说静态单赋值（SSA,Static Single-Assignment)'>说说静态单赋值（SSA,Static Single-Assignment)</a></li>
<li><a href='http://www.lingcc.com/2011/11/29/11859/' rel='bookmark' title='GCC如何进出GIMPLE中间表示'>GCC如何进出GIMPLE中间表示</a></li>
<li><a href='http://www.lingcc.com/2011/06/05/11625/' rel='bookmark' title='Google 与 Clang'>Google 与 Clang</a></li>
<li><a href='http://www.lingcc.com/com-lib/compiler-articles/' rel='bookmark' title='推荐文章(未完成)'>推荐文章(未完成)</a></li>
<li><a href='http://www.lingcc.com/2010/04/14/10736/' rel='bookmark' title='探秘CPU性能测试：Spec CPU2000之整点篇'>探秘CPU性能测试：Spec CPU2000之整点篇</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>昨天的360大战QQ相比各位都有领略了。双方都提到已将代码送交有关部门审查，或者从有关部门拿到了代码审查报告之类的。代码审查，光靠人看可不行，代码分析工具少不了。<a href="http://en.wikipedia.org/wiki/Static_code_analysis" target="_blank">这</a>是维基上关于静态代码分析的介绍。<a href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis" target="_blank">这个页面</a>列出了很多静态代码分析工具，应该比较全了。碰巧Intel的博客发表了<a href="http://software.intel.com/en-us/articles/difference-of-code-analysis-approaches-in-compilers-and-specialized-tools/" target="_blank">一篇文章</a>。介绍ICC和一款商业代码分析工具的对比。这里就借花献佛，现读现卖。学习学习。这篇文章并不是简单的翻译Intel的博客，增加了很多概念性的和GCC的相关内容。<span id="more-11412"></span></p>
<p>之所以称之为静态代码分析，是因为只是分析源代码或者生成的目标文件，并不实际运行源代码生成的文件。这个方向现在很热，因为程序越来越多，而越来越多的领域依赖计算机，代码的质量就成了关键。比如航天、国防、工业控制、金融等对安全性，稳定性要求很高的领域。</p>
<p>现在的静态代码分析几乎都是采用形式化的方法，所谓形式化，即使用类似数学推导的形式，运用数学的方法分析代码。当然也会包括一些经典的分析，比如使用memcpy要小心越界、操作字符串要小心之类的提醒。</p>
<p>虽然本质上，计算机只不过是个状态机，在不同的状态之间转换。但实际上，图灵爷早在1930年就证明确实没办法静态确定运行时程序所有的错误。所以，一切静态分析工具理论上都没办法找到所有问题。不过，聊胜于无。找到点总是有好处的。分析工具一般有模型检测、数据流分析、抽象解释模型等方式来实现静态分析。国内，中科院软件所和中国科学技术大学都有团队在做这个方向，其他高校不清楚。</p>
<p>编译器和静态代码分析工具都能检查代码中的潜在问题。但是编译器和其他工具区别很大。intel文章选取了notepad++这个应用程序的代码来测试intel C++编译器和PVS-studio分析器。notepad++用C++编写，代码量比较小，73000行。</p>
<p>ICC编译器的分析</p>
<p>一般的，编译器最重要的作用是生成可执行文件，所以对于词法语法的分析相对局部一些，即在检测错误时，前后查看的代码较少。这也是为了编译器的性能，因为还有很多的优化变换要做，所以编译器在词法语法分析上不能耗费太多时间。尤其是大的工程，代码量很大。编译要半天的时间时，5%的性能差距就会差十几分钟。</p>
<p>编译器在做完预处理后，就开始做词法语法分析，这就是程序分析的主要阶段。有的编译器，在生成抽象语法树(AST)时，会立即对抽象语法树处理，生成汇编。有的会做完整个函数、文件甚至整个程序之后，再做整体分析，生成汇编代码。Visual C++就是典型的第一类，因为它并不看重很多编译优化，更看重快速的程序分析和编译，不过<a href="http://msdn.microsoft.com/en-us/library/thxezb7y(v=VS.80).aspx" target="_blank">程序员可以规定VC++报warning的级别</a>。GCC和Open64偏向后者，其中Open64在没开过程间优化时，通常针对每个函数做处理，开了优化，就会对整个程序做分析。</p>
<p>编译器的这些区别就决定了能检测的错误的数量。而这错误的数量绝大多数和指定编译器分析代码的范围有关。比如intel文章作者就发现notepad++使用VC++ /w4（最高警告级别)编译不会报任何警告，使用Intel的C++编译器，开到/w5级别，发现了个潜在的问题：可能出错的强制类型转换(函数处理字符串而非字符，但传入的参数仅仅是指向字符的指针，并且会修改内存)。当然，作者也承认，除了这个错外，ICC还报了一些比较无聊的警告。</p>
<p>GCC的代码分析</p>
<p>GCC代码分析的输出可以通过控制警告输出实现，<a href="http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Warning-Options.html#Warning-Options" target="_blank">这里</a>给出了所有和语言无关的警告选项。<a href="http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/C_002b_002b-Dialect-Options.html#C_002b_002b-Dialect-Options" target="_blank">这里</a>给出了C++语言相关的选项。GCC的 调几个说说：-Wall会给出所有用户可能需要仔细考虑的警告，比如字符做数组下标、注释里的格式不对、直接比较枚举类型等等；-Wextra会打开一些-Wall没有打开的警告选项。利用这两个选项，大的程序，应该够你折腾一段时间了：）。</p>
<p>第三方的静态代码分析器</p>
<p>这种工具并没有时间上苛刻的需求，因为不用像编译器那样需要频繁的运行。所以，这些分析工具通常会非常慢。所以你可以白天用编译器写代码，晚上用分析器检查代码。慢是能带来好处的，静态代码分析器可以将程序的抽象语法数保存、分析、转换，精确的分析，找到的问题更多，更准确。</p>
<p>文章作者使用<a href="http://www.viva64.com/pvs-studio/" target="_blank">PVS-studio</a>分析了notepad++的代码。结果显示，这个工具很牛，能发现一些潜在问题，或者针对某些潜在问题给出警告。比如，找到memset函数，会提醒你可能溢出；发现一些不容易发现的无意义语句，如if-else走的分支完全一样，或者&amp;&amp;两边的操作数完全相同之类的警告。</p>
<p>问题：</p>
<p>虽然能帮助发现错误，但太敏感也不好。作者使用ICC做检测时，给出了439个警告和3139个注意。总的来说73000/3578=20,也就是说平均20行就有报一个问题，要想每个都好好分析，任重道远。而且仅仅有4个真正的问题。PVS-studio仅仅给出了10个警告，4个是真正的问题。看来还是专业才比较好。</p>
<div style=float:left><!-- JiaThis Button BEGIN -->
<div id="jiathis_style_32x32">
	<a class="jiathis_button_qzone"></a>
	<a class="jiathis_button_tsina"></a>
	<a class="jiathis_button_tqq"></a>
	<a class="jiathis_button_renren"></a>
	<a class="jiathis_button_kaixin001"></a>
	<a href="http://www.jiathis.com/share/" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v2.jiathis.com/code/jia.js" charset="utf-8"></script>
<!-- JiaThis Button END --></div><table class="wumii-related-items" cellspacing="0" cellpadding="2" border="0" width="100%" style="clear: both;">
    
    <tr>
        <td ><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2012%2F01%2F15%2F11963%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64、LLVM、GCC源代码行数对比</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2009%2F12%2F16%2F10317%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">Open64课程—代码生成(CG)</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F06%2F27%2F11679%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">GCC几个选项学习</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2010%2F08%2F23%2F11157%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">open64中的gcc前端</font>
                    </a>
                </td>
            </tr>
            <tr>
                <td style="margin: 0 !important; padding: 0 !important; line-height: 20px !important;">
                    <img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif">
                    <a target="_blank" style="text-decoration: none !important;" href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwww.lingcc.com%2F2011%2F03%2F28%2F11567%2F&from=http%3A%2F%2Fwww.lingcc.com%2F2010%2F11%2F04%2F11412%2F">
                        <font size="-1" color="#333333" style="line-height: 1.65em; font-size: 12px !important;">仔细端详GCC 4.6的新特性</font>
                    </a>
                </td>
            </tr>
    
    <tr>
        <td  align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><p><h3>相关文章：</h3><ul>
<li><a href='http://www.lingcc.com/2010/08/23/11157/' rel='bookmark' title='open64中的gcc前端'>open64中的gcc前端</a></li>
<li><a href='http://www.lingcc.com/2011/08/13/11685/' rel='bookmark' title='说说静态单赋值（SSA,Static Single-Assignment)'>说说静态单赋值（SSA,Static Single-Assignment)</a></li>
<li><a href='http://www.lingcc.com/2011/11/29/11859/' rel='bookmark' title='GCC如何进出GIMPLE中间表示'>GCC如何进出GIMPLE中间表示</a></li>
<li><a href='http://www.lingcc.com/2011/06/05/11625/' rel='bookmark' title='Google 与 Clang'>Google 与 Clang</a></li>
<li><a href='http://www.lingcc.com/com-lib/compiler-articles/' rel='bookmark' title='推荐文章(未完成)'>推荐文章(未完成)</a></li>
<li><a href='http://www.lingcc.com/2010/04/14/10736/' rel='bookmark' title='探秘CPU性能测试：Spec CPU2000之整点篇'>探秘CPU性能测试：Spec CPU2000之整点篇</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.lingcc.com/2010/11/04/11412/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

