Cortex-A時代の新コンパイラ LLVM/Clangのしくみと使い方

第 2 部 新時代コンパイラLLVMを定番ボードBeagleBone Blackで試す
第
6章
試しながらステップ・バイ・ステップ!
Cortex-A 時代の新コンパイラ
LLVM/Clang のしくみと使い方
村井 和夫
最適化に関する処理
言語に関する処理
LLVM
プロセッサに関する処理
書き込みファイル
バックエンド
x86
Clang
フロントエンド
(プリプロセッサ含む)
最適化
(Optimizer)
ARM
アセンブラ
リンカ
実行可能ファイル
PowerPC
中間言語に
対する最適化
…
Cプログラム
opt
lld
llvm-mc
Clang -emit-llvm -S -c
llc
中間言語
LLVM IR
中間言語
LLVM IR
gld/gold
gas
アセンブリ・
コード
オブジェクト・
コード
次の3種類の表現形式がある
・compiler-IR形式(メモリ展開用)
・ビット・コード表現形式(バイナリ)
・アセンブリ言語表現形式(テキスト)
図 1 LLVM/Clang コンパイル環境の全体構成
第 2 部では 2000 年より静的・動的プログラミング言
語の動的コンパイル技術を調査する研究基盤として開
発された LLVM について紹介します.実際に LLVM
を使いながら内部の構造を見ていきます.また,GCC
と LLVM の ARM クロス開発環境を構築し,生成され
た実行可能ファイルを Cortex-A(BeagleBone Black)
や Cortex-M(本誌 2012 年 6 月号付属 FM3 マイコン基
板)などで実際に動かしてみます.
全体構成
LLVM(広義のコンパイラ)の全体構成を図 1 に示
します.全体の処理内容は第 1 章でも紹介した従来の
GCC とほぼ同じですが,コンパイラ本体部周辺の構
造が異なります.
LLVM では GCC と同様,各段階ごとに個別にコン
パイルすることができます.各段階で行う処理や個別
にコンパイルする際に使用する実行コマンドなどを
2015 年 3 月号
表 1 に示します.
LLVM は GCC と異なり,コンパイラ本体部の三つ
の機能であるフロントエンド,最適化,バックエンド
がそれぞれ独立した構造となっています.
● フロントエンド:言語ごとに用意するプログ
ラミング言語 - コンパイラ用言語変換ソフト
プログラミング言語に関する処理を行うフロントエ
ン ド 部 は,LLVM か ら 完 全 に 独 立 し て い ま す.C/
C++ と Objective-C/C++ のフロントエンド部として
Clang というコンパイラ・フロントエンドが LLVM と
共 に 提 供 さ れ て い ま す.Clang は ソ ー ス コ ー ド を
LLVM IR という LLVM で用いられる中間言語に変換
します.
● 最適化:優れた中間言語による独立構造な処
理部
LLVM は,Clang などのフロントエンドで生成され
43