[[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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS