<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>inasayang&#39;s blog</title>
    <link>/</link>
    <description>Recent blog posts on inasayang&#39;s blog</description>
    
    <generator>Hugo (https://gohugo.io)</generator>
    
    <language>zh-cn</language>
    
    <managingEditor>xiayangzzw@gmail.com (inasayang)</managingEditor>
    
    <webMaster>xiayangzzw@gmail.com (inasayang)</webMaster>
    
    <lastBuildDate>Tue, 15 Apr 2025 00:00:00 Z</lastBuildDate>
    
    <atom:link href="/tags/llvm/index.xml" rel="self" type="application/rss+xml" />
    

    <item>
      <title>Rust | LTO和Thin LTO编译器</title>
      <link>/posts/250415_ltothinlto/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;lto-link-time-optimization&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-link-time-optimization&#34;&gt;
        #
    &lt;/a&gt;
    LTO (Link Time Optimization)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;链接时优化是一种编译器优化技术，它在程序的链接阶段而非传统的编译阶段执行代码优化。&lt;/p&gt;
&lt;h3 id=&#34;lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编译阶段&lt;/strong&gt;：编译器在编译单个源文件时，不仅生成机器代码，还保存中间表示（IR，Intermediate Representation）到目标文件中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接阶段&lt;/strong&gt;：链接器收集所有模块的IR，将它们合并为一个统一的程序表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局优化&lt;/strong&gt;：对整个程序执行优化，基于对所有代码的完整视图&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨模块优化&lt;/strong&gt;：可以进行跨越多个源文件的优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内联函数&lt;/strong&gt;：更强大的函数内联能力，包括跨编译单元边界&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死代码消除&lt;/strong&gt;：更有效地移除未使用的代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更精确的别名分析&lt;/strong&gt;：改进指针分析和内存访问优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码大小减少&lt;/strong&gt;：通过移除不必要的代码减小二进制大小&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lto-的缺点&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e7%bc%ba%e7%82%b9&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的缺点
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内存消耗大&lt;/strong&gt;：处理大型程序时需要大量内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译时间长&lt;/strong&gt;：链接过程变得更加复杂和耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;thin-lto-轻量级链接时优化&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e8%bd%bb%e9%87%8f%e7%ba%a7%e9%93%be%e6%8e%a5%e6%97%b6%e4%bc%98%e5%8c%96&#34;&gt;
        #
    &lt;/a&gt;
    Thin LTO (轻量级链接时优化)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Thin LTO 是 LLVM 编译器基础设施引入的 LTO 变种，旨在解决传统 LTO 的性能和扩展性问题。&lt;/p&gt;
&lt;h3 id=&#34;thin-lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;索引生成&lt;/strong&gt;：每个目标文件都独立生成索引，包含符号和引用信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行优化&lt;/strong&gt;：基于索引信息，将全局优化工作分解成多个可并行执行的任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块级优化&lt;/strong&gt;：在各个模块上并行执行优化，而不是合并所有IR&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;thin-lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;减少内存使用&lt;/strong&gt;：不需要加载整个程序的IR到内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行编译&lt;/strong&gt;：通过并行化加速编译过程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量编译支持&lt;/strong&gt;：更好地支持增量构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留大部分传统LTO的优化效果&lt;/strong&gt;：仍能执行跨模块优化&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;LTO&lt;/th&gt;
					&lt;th&gt;Thin LTO&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;优化效果&lt;/td&gt;
					&lt;td&gt;最大化&lt;/td&gt;
					&lt;td&gt;接近LTO但略低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内存使用&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;编译速度&lt;/td&gt;
					&lt;td&gt;慢&lt;/td&gt;
					&lt;td&gt;快（尤其在多核系统）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;并行度&lt;/td&gt;
					&lt;td&gt;有限&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;适用场景&lt;/td&gt;
					&lt;td&gt;最终发布构建&lt;/td&gt;
					&lt;td&gt;日常开发和发布&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;rust-中使用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#rust-%e4%b8%ad%e4%bd%bf%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    Rust 中使用
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[profile.release]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;fat&amp;#34;   &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;thin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LTO 通常与其他优化标志一起使用。&lt;/p&gt;</content:encoded>
      
      <category>rust</category>
      
      <category>llvm</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/250415_ltothinlto/</guid>
    </item>
    
  </channel>
</rss>
