2017-02-15 1 views
1

I했습니다 I가 C의 ++를 생성하려면 다음 IR 코드 : 어떻게정수 목록을 사용하여 LLVM에서 정수 배열을 초기화하는 방법은 무엇입니까?

ConstantAggregateZero* const_array_2 = ConstantAggregateZero::get(ArrayTy_0); 
    GArray->setInitializer(const_array_2); 

: 내가 모두 0 배열을 초기화하는 코드 줄을 사용할 수 있습니다 알고

@gArray = global [10 x i32] [i32 3, i32 4, i32 5, i32 6, i32 0, i32 0, i32 0, i32 0, i32 12, i32 0], align 16 

LLVM의 배열을 값 목록으로 초기화합니까?

당신은 일정한 초기화 목록을 만들 수 있습니다

답변

2

:

std::vector<llvm::Constant*> values; 
... 
/* Make the value 42 appear in the array - ty is "i32" */ 
llvm::Constant* c = llvm::Constant::getIntegerValue(ty, 42); 
values.push_back(c); 
... // Add more values here ... 
llvm::Constant* init = llvm::ConstantArray::get(arrayTy_0, values); 
GArray->setInitializer(init); 

이 코드 (그리고 전에 20 정도 선)이 초기화되는 글로벌 구조체 생성 : 여기 https://github.com/Leporacanthicus/lacsap/blob/master/expr.cpp#L2585

을 그리고 또 다른 예이다 setInitializer를 사용하여 - 다시 배열이지만 구조체는 아니지만 개념적으로 배열과 구조체 간에는 큰 차이가 없습니다. https://github.com/Leporacanthicus/lacsap/blob/master/expr.cpp#L3376

참조 : (예 :) http://llvm.org/docs/doxygen/html/classllvm_1_1ConstantArray.html

+0

감사합니다! 'ConstantArray'와'ConstantDataArray'의 차이점은 무엇입니까? – Shuzheng

+0

ConstantDataArray와 같은 것은 "제한된 범위의 멤버 유형 만 지원합니다 (1/2/4/8 바이트 유형 - 예 : int 또는 float 또는 double") - 그렇습니다. 이 경우에 사용할 수 있습니다 - 제 설명은 모든 유형에 적용됩니다 [물론, getIntegerValue는 비 - 통합 유형이있는 경우 작동하지 않습니다] –

+0

고마워요, 매우 유용합니다! – Shuzheng

관련 문제