2016-10-23 9 views
0

入れ子構造体/配列のデータ型の正確なバイト表現を取得したいと考えています。例えば、以下のC構造体:ネストされた構造体/配列のLLVM整列

typedef struct zTy { 
    int x; 
    char c[2]; 
    struct { char d; } v; 
} z; 

これは以下LLVM IRに変換される:アライメント(4バイト)を参照することが可能であるallocaを命令から

%struct.zTy = type { i32, [2 x i8], %struct.anon } 
%struct.anon = type { i8 } 

%a = alloca %struct.zTy, align 4 

。しかし、私はこのアラインメントがどこに挿入されているのか、ネストされた構造体のアライメントがどのように計算されるのか分かりません。 私はgetTypeAllocSizeを()を使用して、私の目標のために、トリプル構造体の合計サイズを取得:

AllocaInst* AI; 
Module &M; 
Type* T = AI->getAllocatedType(); 
int size = M.getDataLayout()->getTypeAllocSize(T) // 8 Byte 

渡すLLVMから私のターゲットアーキテクチャのための任意のネストされたデータ型の正確なレイアウトを決定する方法はありますか?

答えて

1

これはABI固有のものであるため、ターゲットによって異なります。 Clangは一般的に、C/C++のためにそれを個々のメンバーのアライメントの最大値として計算します。 整数は最大のフィールドで、既定の整列制約は4で、これはあなたが得るものです。

クランは、ここでは例えば、構造体/クラスのレイアウトを考え出す助けるためにCC1オプションとして-fdump-record-layoutsを持っている:あなたが点検したい場合は

$ echo "struct zTy { 
    int x; 
    char c[2]; 
    struct { char d; } v; 
} z;" | clang -x c -w - -Xclang -fdump-record-layouts -c 

*** Dumping AST Record Layout 
     0 | struct zTy::(anonymous at <stdin>:4:5) 
     0 | char d 
      | [sizeof=1, align=1] 

*** Dumping AST Record Layout 
     0 | struct zTy 
     0 | int x 
     4 | char [2] c 
     6 | struct zTy::(anonymous at <stdin>:4:5) v 
     6 |  char d 
      | [sizeof=8, align=4] 

はLLVMの内部では、あなたが「C」タイプを失うが、構造体は、使用する必要があります。

uint64_t StructLayout::getElementOffsetInBits(unsigned Idx) const 
を:

const StructLayout *getStructLayout(StructType *Ty) const; 

そして返さStructLayoutを使用して、あなたが使用して各要素のオフセットを得ることができます

+0

私はパス内でこれらの情報をどのように得ることができるか知っていますか? – user2600312

+0

LLVM APIの回答を更新しました。 – Joky