簡體   English   中英

可以通過C和C ++方法優化LTO for gcc或clang

[英]Can LTO for gcc or clang optimize across C and C++ methods

如果鏈接時優化(LTO)與gccclang一起使用 ,是否可以跨C和C ++語言邊界優化代碼?

例如,C函數可以內聯到C ++調用者中嗎?

是!

鏈接時優化通常適用於“胖”目標文件中存在的中間表示(IR),其可以包含用於傳統鏈接的機器代碼和用於LTO鏈接的IR。

在這個階段,沒有更多的高級語言結構,因此鏈接時優化與語言無關。


GCC

GCC的鏈路時間優化 (LTO)適用於GCC的中間代表之一GIMPLE。 IR始終與語言無關,因此任何鏈接時優化都可以在任何語言生成的代碼中使用。

GCC Optimization Options文檔中:

LTO的另一個特性是可以對用不同語言編寫的文件應用過程間優化:

 gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran 

請注意,最終鏈接是使用g ++完成的,以獲取C ++運行時庫,並添加-lgfortran以獲取Fortran運行時庫。 通常,在LTO模式下混合語言時,應使用與在常規(非LTO)編譯中混合語言時相同的鏈接命令選項。


這是一個示例,向您展示這項技術的強大功能。 我們將定義一個C函數並從C ++程序中調用它:

func.h

#ifndef FUNC_DOT_H
#define FUNC_DOT_H

#ifdef __cplusplus
extern "C" {
#endif

int func(int a, int b, int c);

#ifdef __cplusplus
}
#endif

#endif /* FUNC_DOT_H */

func.c

#include "func.h"

int func(int a, int b, int c)
{
    return 3*a + 2*b + c;
}

main.cpp

#include "func.h"

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    return func(a, b, c);
}

gcc -o func.o -c -Wall -Werror -flto -O2 func.c
g++ -o main.o -c -Wall -Werror -flto -O2 main.cpp
g++ -o testlto -flto -O2 main.o func.o

拆解objdump -Mintel -d -R -C testlto

Disassembly of section .text:

00000000004003d0 <main>:
  4003d0:   b8 0a 00 00 00          mov    eax,0xa   ; 1*3 + 2*2 + 3 = 10
  4003d5:   c3                      ret

你可以看到它不僅將我的C func()內聯到我的C ++ main() ,而且它將整個事物變成了一個常量表達式!


Clang / LLVM

使用相同的語法,Clang能夠使用LLVM IR發出“胖”對象文件,可以在鏈接時進行優化。 請參閱LLVM鏈路時間優化

使用與上面相同的測試代碼,clang產生完全相同的結果:

00000000004004b0 <main>:
  4004b0:   b8 0a 00 00 00          mov    eax,0xa
  4004b5:   c3                      ret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM