[[diary/Kojima]]
・LLVM-3.3 on Plamo-5.1/i586(その3)
LLVMのソースコードを調べてみようかとも思ったものの,
llvm-3.3.src, cfe-3.3, compiler-rt-3.3.src に分かれた
関連ファイルは約2万,サイズも200MB近いので,
どこから調べたものかなぁ,,と思っているうちに,
ヒントは意外なところから見つかった.
他のディストリビューションではこういう問題が発生していないのだろうか,
と思って,Ubuntuの使っているパッチを眺めていたら,
GCCのバージョンを追加するようなパッチをあてていた.
--- clang-2.9.orig/tools/clang/lib/Driver/ToolChains.cpp 2011-08-31 00:48:15.000000000 +0200
+++ clang-2.9/tools/clang/lib/Driver/ToolChains.cpp 2011-08-31 00:48:35.000000000 +0200
@@ -1449,7 +1449,8 @@
GccTriple = "i586-suse-linux";
}
- const char* GccVersions[] = {"4.5.2", "4.5.1", "4.5", "4.4.5", "4.4.4",
+ const char* GccVersions[] = {"4.6.1", "4.6.0", "4.6",
+ "4.5.3","4.5.2", "4.5.1", "4.5", "4.4.5", "4.4.4",
"4.4.3", "4.4", "4.3.4", "4.3.3", "4.3.2",
"4.3", "4.2.4", "4.2.3", "4.2.2", "4.2.1",
"4.2"};
このパッチを見る限り,LLVMは内部でGCCのバージョンとかも見ているらしい.
どうもこの tools/clang/lib/Driver/ToolChains.cpp というファイルで,
GCCとか関連ツールの情報を扱っているらしいと調べてみると,
こんなコードが見つかった.
1104 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1105 static const char *const X86Triples[] = {
1106 "i686-linux-gnu",
1107 "i686-pc-linux-gnu",
1108 "i486-linux-gnu",
1109 "i386-linux-gnu",
1110 "i386-redhat-linux6E",
1111 "i686-redhat-linux",
1112 "i586-redhat-linux",
1113 "i386-redhat-linux",
1114 "i586-suse-linux",
1115 "i486-slackware-linux",
1116 "i686-montavista-linux"
1117 };
これを見ると X86Triples[] の中に,GCCがコンパイル環境用に使っている
"CPU-distribution-OS" の3つ組情報(triple)を収めて,
それと上記GCCのバージョン情報を組み合わせて使っているらしい.
設定されているtripleを見ると,i686-pc-linux-gnuやi386-linux-gnu,
i486-slackware-linux, i586-{redhat,suse}-linux はあるものの,
Plamoで指定している i586-pc-linux-gnu は存在していない.
もう少し上には64ビット用の設定があるのだけど,
そちらには Plamo が使っている x86_64-pc-linux-gnu は設定されている.
1092 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1093 static const char *const X86_64Triples[] = {
1094 "x86_64-linux-gnu",
1095 "x86_64-unknown-linux-gnu",
1096 "x86_64-pc-linux-gnu",
1097 "x86_64-redhat-linux6E",
1098 "x86_64-redhat-linux",
1099 "x86_64-suse-linux",
1100 "x86_64-manbo-linux-gnu",
1101 "x86_64-linux-gnu",
1102 "x86_64-slackware-linux"
1103 };
どうもこの X86Triples[] に設定が無いことが原因っぽい,
と思って,i586-pc-linux-gnu を追加するようなパッチを入れてみた.
--- build/tools/clang/lib/Driver/ToolChains.cpp 2013-05-07 01:26:41.000000000 +0900
+++ llvm-3.3.src/tools/clang/lib/Driver/ToolChains.cpp 2013-08-31 12:13:40.231298275 +0900
@@ -1105,6 +1105,7 @@
static const char *const X86Triples[] = {
"i686-linux-gnu",
"i686-pc-linux-gnu",
+ "i586-pc-linux-gnu",
"i486-linux-gnu",
"i386-linux-gnu",
"i386-redhat-linux6E",
このパッチがビンゴだったらしく,再ビルドした clang++ では,
オプションを指定しなくても必要なインクルードファイルや
リンク用オブジェクトを見つけれるようになった.
$ clang++ -v test.cpp
clang version 3.3 (tags/RELEASE_33/final)
Target: i386-pc-linux-gnu
Thread model: posix
"/usr/bin/clang-3.3" -cc1 -triple i386-pc-linux-gnu -emit-obj -mrelax-all
-disable-free -disable-llvm-verifier -main-file-name test.cpp
-mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose
-mconstructor-aliases -target-cpu i586 -v -resource-dir /usr/bin/../lib/clang/3.3
-internal-isystem /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3
-internal-isystem /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3/i586-pc-linux-gnu
-internal-isystem /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3/backward
-internal-isystem /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/i586-pc-linux-gnu/c++/4.6.3
-internal-isystem /usr/local/include
-internal-isystem /usr/bin/../lib/clang/3.3/include
-internal-externc-isystem /include
-internal-externc-isystem /usr/include -fdeprecated-macro
-fdebug-compilation-dir /mnt/L/LLVM -ferror-limit 19 -fmessage-length 127
-mstackrealign -fobjc-runtime=gcc -fobjc-default-synthesize-properties
-fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics
-backend-option -vectorize-loops -o /tmp/test-tkSih7.o -x c++ test.cpp
clang -cc1 version 3.3 based upon LLVM 3.3svn default target i386-pc-linux-gnu
ignoring nonexistent directory "/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/i586-pc-linux-gnu/c++/4.6.3"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3/i586-pc-linux-gnu
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../include/c++/4.6.3/backward
/usr/local/include
/usr/bin/../lib/clang/3.3/include
/usr/include
End of search list.
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
-o a.out /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../crt1.o
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../crti.o
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtbegin.o
-L/usr/lib/gcc/i586-pc-linux-gnu/4.6.3
-L/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../../i586-pc-linux-gnu/lib
-L/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../..
-L/lib -L/usr/lib /tmp/test-tkSih7.o -lstdc++ -lm -lgcc_s -lgcc -lc
-lgcc_s -lgcc /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtend.o
/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/../../../crtn.o
$ ldd a.out
linux-gate.so.1 (0xffffe000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7602000)
libm.so.6 => /lib/libm.so.6 (0xb75c2000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb75a5000)
libc.so.6 => /lib/libc.so.6 (0xb741f000)
/lib/ld-linux.so.2 (0xb7715000)
$ ./a.out
Hello World!
i686,i486,i386 には,汎用的な linux-gnu や pc-linux-gnu が用意されているのに,
i586 には redhat-linux か suse-linux しかない理由はよく分からないのだけれど,
とりあえずこれで32ビット環境でもLLVMを利用可能になったので,
LLVMが必要なMesaLib-9.1.6のgallium3dドライバのビルドに移れるのであった.
#comment