LLVM Module
의 DataLayout
은 포인터의 크기를 지정합니다. DataLayout
은 모든 LLVM Module
이 가져야하는 아키텍처 및 대상 트리플에 바인딩됩니다.
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
편집 :
x86_64
아키텍처에서 DataLayout
은 다음과 같습니다 p는 공간을 해결하기 위해 포인터를 나타낸다 명시 적으로 포인터의 크기를 설정하면 p[n]:<size>:<abi>:<pref>
을 추가 할 수 있습니다 [N] (이 옵션 및 기본값입니다 0). 두 번째 매개 변수는 포인터의 크기 (예 : 64 비트)입니다. 대체 규칙 위에 제공된 DataLayout
가 사용을 (here에서 인용)
가 가
LLVM 주어진 유형의 배치를 결정하고, 그것이 다음 규칙 사용
:
- 를 입력 추구하면 는 사양 중 하나에 정확히 일치하므로 해당 사양이 사용됩니다. 일치하는 항목이없고 찾은 형식이 인 경우 정수형이고 가장 작은 정수 유형은 찾은 형식의 bitwidth보다 큰
입니다.
- 사양이 비트 폭보다 크지 않으면 가장 큰 정수 유형이 사용됩니다. 예를 들어 위의 기본값 인 을 지정하면 i7 유형은 i8 (다음으로 큰)을 사용하고 i65와 i256은 모두 i64 (최대 지정)의 정렬을 사용합니다.
- 일치하는 항목이없고 벡터 유형 인 경우 찾은 벡터 유형 보다 작은 가장 큰 벡터 유형이 폴백으로 사용됩니다. 이는 < 128 x double> 이 64 < 2 x double>과 관련하여 구현 될 수 있기 때문에 발생합니다.
백엔드는 포인터 크기를 인식하고 (유효하다면) 받아들입니다. 이와
당신이 (가) LLVM C++ API로 Module
의 DataLayout
를 사용하여 각 Type
의 할당 크기를 얻기 위해 다음과 같은 작업을 수행 할 수 말했다
Module* M = /*your current module*/;
Type* myType = /*some type*/;
unsigend size = M->getDataLayout()->getTypeAllocSize(myType);
//size is 8 with the DataLayout defined above
내가 텍스트 표현을 생성하고 이후 나를 위해 작동하지 않습니다 LLVM-IR의 그런 경우에 이것을 할 수있는 방법이 있습니까? – ki92
텍스트 표현이란 무엇입니까? DataLayout 프로 바이더는 모듈의 텍스트 형식입니다. DL에서 8 바이트가되도록 포인터를 선언하면 malloc 크기는 항상 포인터 유형에 대해 8이됩니다. –
나는'llvm-as'를 사용하여 비트 코드로 컴파일 된 텍스트 파일을 만들고 API를 사용하지 않는다는 것을 의미합니다. – ki92