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ドライバのビルドに移れるのであった.



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42