2015-01-29 4 views
3

나는 내 자신의 언어로 된 컴파일러를 LLVM-IR에 작성하고있다. 나는 배열을 나타내는 몇 가지 구조 유형 정의 :LLVM malloc 포인터 배열

{ i32, [ 0 x i32] } 

지금 나는이 구조체에 대한 포인터의 실제 배열에 대한 메모리를 ALLOC 필요를 즉

[{ i32, [ 0 x i32] }* x 10] 

그러나 메모리를 할당 할 수 malloc에 ​​알려줄 수 포인터 크기가 필요합니다. 어떻게 찾을 수 있습니까?

P. 나는 더 많은 포인터를 가진 아키텍처가 존재하지 않기 때문에 포인터 당 8 바이트가 OK 여야한다는 것을 알지만보다 일반적인 해결책을 찾고있다.

답변

3

LLVM ModuleDataLayout은 포인터의 크기를 지정합니다. 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로 ModuleDataLayout를 사용하여 각 Type의 할당 크기를 얻기 위해 다음과 같은 작업을 수행 할 수 말했다

Module* M = /*your current module*/; 
Type* myType = /*some type*/; 
unsigend size = M->getDataLayout()->getTypeAllocSize(myType); 
//size is 8 with the DataLayout defined above 
+0

내가 텍스트 표현을 생성하고 이후 나를 위해 작동하지 않습니다 LLVM-IR의 그런 경우에 이것을 할 수있는 방법이 있습니까? – ki92

+0

텍스트 표현이란 무엇입니까? DataLayout 프로 바이더는 모듈의 텍스트 형식입니다. DL에서 8 바이트가되도록 포인터를 선언하면 malloc 크기는 항상 포인터 유형에 대해 8이됩니다. –

+0

나는'llvm-as'를 사용하여 비트 코드로 컴파일 된 텍스트 파일을 만들고 API를 사용하지 않는다는 것을 의미합니다. – ki92