トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2007-2-20の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!今日の稽古
中心をとるために,意識して左の方に踏み込むように練習.
それなりに中心をとることができたかな.
ただ意識しすぎて体が硬くなっているのか,
相手のすばやい動きに追従するのが若干困難.
あとは,左足の遊び癖もなおさないと.

!COINSでの構造体
::coins/hir2lir/ConvToNewLir 1854
      case HIR.OP_ARROW:
        return
          convertLoadMember
          (convertNode(((PointedExp)pHir).getPointerExp(), cc),
           ((PointedExp)pHir).getPointedElem(),
           type, cc);
::coins/hir2lir/ConvToNewLir 2909
  /** Convert expression loading x.member / x->member. **/
  private ImList convertLoadMember(ImList base, Elem elem,
                                   Type type, ConvContext cc) {
    String ltype = htype2ltype(type);
    String inttype = hkind2ltype(Type.KIND_INT);
    String ptrtype = hkind2ltype(Type.KIND_POINTER);
 
    long offset = elem.evaluateDisp();
::coins/sym/ElemImpl 89
 public long evaluateDisp()
 {
  if (fDispIsSet)
    return fDisplacement;
  if (fDispExp != null)  {
    fDisplacement = fDispExp.evaluateAsInt();
    fDispIsSet    = true;
    return fDisplacement;
  }else {
    symRoot.ioRoot.msgRecovered.put(1014, "Displacement is not evaluable "
                             + getName());
    return 0;
  }
 } // evaluateDisp
::coins/sym/ElemImpl 109
 public void
 setDisplacement( long pDisplacement ) {
  fDisplacement = pDisplacement;
  fDispIsSet    = true;
 }

こういう構造体を与えた時
 struct bitMapFileHeader{
   unsigned short bfType __attribute__((packed));
   unsigned int bfSize __attribute__((packed)); // 2
   unsigned short bfReserved1 __attribute__((packed)); // 6
   unsigned short bfReserved2 __attribute__((packed)); // 8
   unsigned int offBits __attribute__((packed)); // 10
 };
setDisplacementの後のElemImplのダンプ結果
 bfType 0 disp 0
 bfSize 0 disp 4
 bfReserved1 0 disp 8
 bfReserved2 0 disp 10
 offBits 0 disp 12

このsetDisplacementの呼出元は
::coins/sym/StructImple 223
      }else { // Not a bit field.
        if (lBitFieldBegin) { // Previous fields are bit field.
          lSize = lContainingObjectDisplacement
                  + (lBitFieldSumWithinWord+7) / 8;
          lBitFieldSumWithinWord = 0;
        }
        lBitFieldBegin = false;
        lDisplacement = lSize + lElemType.getAlignmentGap(lSize);
        lContainingObjectDisplacement = lDisplacement;
        lElem.setDisplacement(lDisplacement);
        //## lElem.setDispExp( ... );   // REFINE
        lSize = lDisplacement + lElemSize;
        lElemAlignment = lElemType.getAlignment();
        if (lElemType.getFlag(Sym.FLAG_INCOMPLETE_TYPE)) {
          lIncomplete = true;
          lUniformSize = false;
        }
        if (! lElemType.getFlag(Sym.FLAG_UNIFORM_SIZE))
          lUniformSize = false;
        if (! lElemType.isSizeEvaluable())
          lSizeIsSet = false;
      }

この中のlElemTypeはTypeImplを継承したクラスで

::coins/sym/TypeImpl 468
 public int                             // to be refined
 getAlignmentGap( long pPrecedingSize ) {
  int lAlignment, lAlignmentGap;
  long lResidue;
  lAlignment = getAlignment();
  lResidue = pPrecedingSize % lAlignment;
  if (lResidue == 0)
    lAlignmentGap = 0;
  else
    lAlignmentGap = (int)(lAlignment - lResidue);
  return lAlignmentGap;
 } // getAlignmentGap

::coins/sym/TypeImpl 468
 public int
 getAlignment()
 {
  int lAlignment;
  //##67 if (fTypeKind == Type.KIND_SUBP) {
  //##67   lAlignment = ((SubpType)this).getReturnType().getAlignment();
  //##67 }else {
  lAlignment = Type.KIND_ALIGNMENT[fTypeKind];
            // STRUCT, UNION, VECTOR have their own method.
  //##67 }
  return lAlignment;
 }

::coins/sym/TypeImple 550
public void
 setStaticTable(MachineParam pMachineParam)
 {
  for (int i = 0; i < KIND_ALIGNMENT.length; i++) {    //##52
    KIND_ALIGNMENT[i] = pMachineParam.getAlignment(i); //##52
  }                                                    //##52
  /* //##52

::coins/sym/SymRoot 304
  ioRoot.symRoot = this; //##12
  ((SymImpl)sym).setParameters(machineParam, sourceLanguage); //##51
  (new TypeImpl(this)).setStaticTable(machineParam);          //##51 
 } // SymRoot

machineParamは、coins/MachinParamXXXにある。デフォルトの場合はcoins/Machinparam