Clang-3.0がリリースされたので、SystemCとの相性をみるため、まずはClangそのものをインストールしてみる。
Clangをインストールして使うためにはgcc-4.5以降のヘッダファイルが必要になる。それ以前のバージョンのgccでもインストールはできるのだが、いざC++のプログラムをコンパイルする際にweakref関連のエラーが出てしまうためだ。ここではgcc-4.6.0を使用した。
tar zxvf /path/to/llvm-3.0.tgz
cd llvm-3.0
tar zxvf /path/to/clang-3.0.tgz
mv clang-3.0 tools/clang
../configure --prefix=/path/to/clang-3.0 --enable-jit --enable-optimized --enable-targets=all --with-c-include-dirs=/path/to/tools-gcc-4.6.0/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/include:/path/to/tools-gcc-4.6.0/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/include-fixed:/usr/include --with-cxx-include-root=/path/to//tools-gcc-4.6.0/include/c++/4.6.0 --with-cxx_include-arch=x86_64-unknown-linux-gnu | & tee log.configure
make -j4
make install
使う際は、gcc-4.6.0をインストールしたディレクトリのlib以下もLD_LIBRARY_PATHに追加しないと、ランタイムエラーが発生する。
set path=(/path/to/clang-3.0 $path)
setenv LD_LIBRARY_PATH /path/to/tools-gcc-4.6.0/lib:/path/to/clang-3.0/lib:$LD_LIBRARY_PATH
2011年12月18日日曜日
2011年11月25日金曜日
参照メンバへのmutable指定
↓のサイトでも取り上げられているように、現行のSystemCのソースコードにはクラスの参照メンバにmutable指定している記述がある。これは規格違反のため、最新のGCCやclang等でコンパイルできない。
http://lsifrontend.blog100.fc2.com/blog-entry-186.html
理由はC++03の規格書7.1.1.8に以下のように書かれているため。
The mutable specifier can be applied only to names of class data members (9.2) and cannot be applied to names declared const or static, and cannot be applied to reference members.
これだけだと発展がないため、自分なりの解釈を書いてみる。
たとえば以下のようなクラスだと
f0()は規格違反だが、f1()は有効な記述である。
注:const int *ptr;ではない。
また、mutable int *ptr;にするとf0()もOKになる。
mutable int *const ptr;は規格違反である。
これはmutable const int i;が無効なのと同じ。
constなメンバ関数からはポインタが何を指すかを変えてはならない、ということだろう。
一方、参照はそもそも初期化時に指定したオブジェクトを指すだけで、
途中で指す対象を変更することができない。
したがってmutableの指定は無効と考えられる。
ちなみにOSCIもSystemC-2.2の規格違反な記述については認識していて、
次のリリースでは解消される見込みのようだ。
http://lsifrontend.blog100.fc2.com/blog-entry-186.html
理由はC++03の規格書7.1.1.8に以下のように書かれているため。
The mutable specifier can be applied only to names of class data members (9.2) and cannot be applied to names declared const or static, and cannot be applied to reference members.
これだけだと発展がないため、自分なりの解釈を書いてみる。
たとえば以下のようなクラスだと
f0()は規格違反だが、f1()は有効な記述である。
つまりconstなメンバ関数からメンバ変数ptrはint *const ptr;として見える。class C{ int *ptr; void f0()const{ ptr = NULL; //NG } void f1()const{ *ptr = 0; //OK } };
注:const int *ptr;ではない。
また、mutable int *ptr;にするとf0()もOKになる。
mutable int *const ptr;は規格違反である。
これはmutable const int i;が無効なのと同じ。
constなメンバ関数からはポインタが何を指すかを変えてはならない、ということだろう。
一方、参照はそもそも初期化時に指定したオブジェクトを指すだけで、
途中で指す対象を変更することができない。
したがってmutableの指定は無効と考えられる。
ちなみにOSCIもSystemC-2.2の規格違反な記述については認識していて、
次のリリースでは解消される見込みのようだ。
引越し
Nucleusで自前でblog運用するのはどうも面倒なので引越し。
http://blog.something-like-that.net/の内容はいずれこっちに移さなきゃ。
幸か不幸か投稿数も少ないし。
http://blog.something-like-that.net/の内容はいずれこっちに移さなきゃ。
幸か不幸か投稿数も少ないし。
登録:
投稿 (Atom)