diary/Kojima/2013-09-04
の編集
http://sv5.linet.gr.jp/index.php?diary/Kojima/2013-09-04
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
-- 雛形とするページ --
diary/Template
[[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
タイムスタンプを変更しない
[[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
テキスト整形のルールを表示する