雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

gcc4でtolsetはコンパイルできるのか!?

とりあえず、これまでやっていたgcc3系列のパッチを当てたソース。こいつをgcc4でコンパイルできるかどうかやってみる!

ウチの実験はFreeBSDのgcc4.2で行いました。

go_0023s anchor.png Edit

  • 順調にコンパイルが進んでいたけど、やっぱり出た!エラー!
  • cp/内のdecl.c内で、以下のエラーが大量に!
  •   lvalue required as left operand of assignment
コード
current_binding_level = newlevel;
    • 左辺の値は変更可能でないといけないって意味らしい。
    • 左辺すなわちcurrent_binding_level。これはなにかというと・・・
      #define current_binding_level                   \
        (cfun && cp_function_chain->bindings          \
         ? cp_function_chain->bindings                \
         : scope_chain->bindings)
    • こんなことしてあった。なんじゃこれ? 構造体??
    • #defineって、文字の置き換えだよね?。えぇ? でもさ、なんで括弧があるの?それに、置き換え後の値も定義されてないじゃん・・・・
      普通のdefine
      #define aaa 123      <-aaaと書かれたらコンパイル時に123に置き換えろ!
      
      x = aaa + 456;       --->コンパイル時には置換される-->  x = 123 + 456;
    • そうすると、あそこを素直に考えると
      current_binding_level = newlevel;
                          ↓
      (cfun && cp_function_・・・略・・・pe_chain->bindings) = newlevel;
    • こうなるわけ??? なんじゃ?こりゃ???
    • あっれ? 難しく考えすぎてたかな??。これ、単なる計算式じゃない??
        (cfun && cp_function_chain->bindings          \
         ? cp_function_chain->bindings                \
         : scope_chain->bindings)
                         ↓
                ちょっと長くなるのでcp_function_chainをCFCと書く
                         ↓
        (cfun && CFC->bindings ? CFC->bindings : scope_chain->bindings)
    • で、この?と:って条件演算子じゃないの??。そうするとさ、こういうふうにならない?
      if(cfun && CFC->bindings) {
          CFC->bindings;
      } else {
          scope_chain->bindings;
      }
    • ぐはぁ! これなら意味は通じるぞ!。これで合ってるのかな???
    • ・・・じゃあさ、じゃあさ!! エラーがでるあの部分って、こういうふうに書き換えればいいってこと??
      コード
      current_binding_level = newlevel;
                            ↓
      if(cfun && CFC->bindings) {
          CFC->bindings = newlevel;
      } else {
          scope_chain->bindings= newlevel;
      }
Page Top

bim2bin anchor.png Edit

  • でました。エラー。
  • ((int) p) &= ~0x03;
    • たぶん型キャストに問題がある。左辺はキャストしちゃいけないはず。
    • たぶんこんな型キャストしてるということは、pはintじゃない。で、~0x03がintなんだろうと思われる。
      void tek1_btseek(struct TEK1_STR_BTBUF *btbuf, UCHAR *p)
      {
             int bit = (((int) p) & 0x03) << 3;
             ((int) p) &= ~0x03;
             btbuf->rest = 32 - bit;
             btbuf->buf0 = (*(unsigned int *) &p[0]) >> bit;
             btbuf->buf1 &= 0;
             btbuf->ptr = (unsigned int *) &p[4];
             return;
      }
  • やっぱり。UCHAR *p ってことは、pは「アドレス変数」ということになる。
  • つまりここは、分解してちゃんと書くと、こういう意味になるはず。
    ((int) p) &= ~0x03  →  ((int) p) = ((int)p) & ~0x03  ->  ((int) p) = ((int)p) & ~0x03
  • ・・・ということは、こうすればいいのかな???
      p = (UCHAR *)((int)p & ~0x03)
  • ふむ〜。たぶんこれでいけるかも〜。
Page Top

コンパイル完了! はたして!! anchor.png Edit

  • さてー。そんなわけでコンパイルができました。さてこれではりぼては動くか?

最終更新: 2024-01-06 (土) 22:39:12 (JST) (110d) by