Clangのtarget triple指定

clangには-ccc-host-tripleというオプションが有り、これを指定すると後続するtoolchainのtarget tripleを指定することができる。
libcや他の関連ライブラリを自分で管理することで、clang一つで非常に広範なアーキテクチャに対応したクロスコンパイラとすることができ、便利。(clang -ccc-host-triple x86_64-unknown-linux ならLinux amd64コンパイラになる 等)
ただ、現在のところLLVM-MCがMach-Oにしか対応していないので、対応するldとas(要するにbinutils)は追加でインストールしなければならない。もし、Mach-Oバイナリしか必要でないならば、-integrated-asオプションでasすら不要になる。

clangに与えられるオプションは全てtblgenに与える表として纏められている。
僕はこのオプションを知らなかったので、clangを内蔵したnmoshというかnmoshを内蔵したclangをわざわざ作り、コンパイラドライバを自作していた。
もっとも、通常のシチュエーションでは-ccc-host-tripleは正常に動かないことも多いので、clangのcc1を起動し、適切なasに入力するシェルスクリプトなり何なりを書くのが好ましいように思える。
clangのcc1(Cソースコードアセンブラソースへの変換)はclang -cc1で起動できる。see clang -cc1 --help。これにはプリプロセサも統合されている。clang -cc1では、tripleの指定は-tripleオプションで行う。

コンパイラドライバ

通常のコンパイルプロセスが複数のプログラムの組合せで実現されていることを意識する必要がある。clangはコンパイラドライバの効率に関してそれなりの考察を持つ : http://clang.llvm.org/docs/DriverInternals.html
... ここにLSI-C 86の図を入れようと思ったら何故かページが2つ有るのに気付いた。http://www.lsi-j.co.jp/product/c86/index.html http://www.lsi-j.co.jp/broadcast/LSIC86.html