2016-08-23 48 views
1

我需要了解如何從數據佈局獲取非壓縮文字結構中的成員對齊。LLVM:從數據佈局的成員對齊

如指定here,可能會得到此信息。

例如,我有這樣的一段代碼:

; 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 { 
在該行 %struct.S = type { i8, i64 }

,這到底是怎麼兩個部件之間的填充?

我期望32或64位,但我想確定。

謝謝!

回答

1

它的確寫在數據佈局中。如在data layout spec中指定的那樣,佈局的這個部分i64:64指示int64是64位對齊的。

在結構%struct.S = type { i8, i64 }中,因此在兩個字段之間有7字節的填充。

編程,有可能通過索引獲得偏移成員的:

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