2016-08-23 10 views
1

データレイアウトからパックされていないリテラル構造のメンバの整列を取得する方法を理解する必要があります。LLVM:データレイアウトからのメンバの整列

hereと指定されているとおり、この情報を取得することは可能です。

例えば、私は、コードのこの作品があります。ライン%struct.S = type { i8, i64 }

; ModuleID = 'fy4vsjaw.hjq.cpp' 
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-pc-linux" 

%struct.S = type { i8, i64 } 

; Function Attrs: nounwind uwtable 
define { i8, i64 } @foo() #0 !dbg !4 { 

を、ここでは2つの部材間のパディングは何ですか?

私は32ビットまたは64ビットが予想されますが、私は確信しています。

ありがとうございます!

答えて

1

実際にはデータレイアウトに書かれています。 data layout specで指定されているように、レイアウトのこの部分i64:64は、int64が64ビットに整列していることを示しています。

構造体%struct.S = type { i8, i64 }では、2つのフィールドの間に7バイトのパディングがあります。

プログラム、それがインデックスでメンバーのオフセットを取得することが可能です:

uint64_t GetOffset(llvm::Module* mod, llvm::StructType* st, uint32_t int index) { 
    return mod->getDataLayout()->getStructLayout(st)->getElementOffset(index); 
} 
関連する問題