2016-08-23 5 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 { 

, 여기에 두 멤버 사이의 패딩은 무엇인가 : 예를 들어

, 나는이 코드 조각이?

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); 
} 
:

프로그래밍,이 인덱스에 의해 회원의 오프셋을 취득하는 것이 가능