2014-03-25 4 views
2

전역 변수를 초기화 한 다음 함수를 IR에 삽입하는 함수 단계를 작성했습니다. 전역 변수에 대한 함수 호출의 결과를 설정하고 싶지만 CallInst 유형을 GlobalVariable 유형으로 변환하는 방법이 확실하지 않습니다. 내가 컴파일 할 때LLVM에서 CallInst Type을 GlobalVariable로 변환하는 방법

virtAddr = builder.CreateCall(mmap,putsArgs,"mmap"); 

, 나는이 오류가 :

GlobalVariable *virtAddr = new GlobalVariable(*F.getParent(), 
    Type::getInt8PtrTy(F.getContext(),8), 
    false, 
    GlobalValue::ExternalLinkage, 
    0, 
    "virt_addr"); 
virtAddr->setAlignment(4); 

가 그럼 난이 줄 전역 변수를 설정하려고 : 여기 전역 변수 선언 작성한 코드입니다 :

error: assigning to 'llvm::GlobalVariable *' from incompatible type 
'llvm::CallInst *' 

어떤 도움을 주셔서 감사합니다!

답변

2

이 코드 :

GlobalVariable *virtAddr = new GlobalVariable(...); 
virtAddr = builder.CreateCall(mmap,putsArgs,"mmap"); 

어떤이 코드보다 "3 ~ 4 변환"할 것이다 "는 전역 변수에 CallInst 변환"하지 않습니다 즉

int x = 3; 
x = 4; 

는, 그것의 변수에 대한 일반적인 C++ 할당. 귀하의 경우에는 값과 변수에 호환 유형이 없기 때문에 표준 C++ 유형 오류가 발생합니다.

그래서 어떻게 합니까 당신은 전역 변수에 함수 호출 (또는 다른 값)의 결과를 할당합니까? 음, 전역 변수는 항상 일부 메모리 위치에 대한 포인터를 나타냅니다. 그래서 거기에 아무 것도 저장하고 싶다면 StoreInst을 사용하여 글로벌 변수를 주소로, 콜 명령어를 저장할 값으로 지정해야합니다.

+0

대단히 감사합니다! 이 줄을 추가 할 수있었습니다 : builder.CreateStore (x, virtAddr, false); 결국 내가 원하는 IR 코드를 제공하게되었습니다. 여기서 x는 값 유형이 builder.CreateCall (mmap, putsArgs, "mmap")으로 설정된 값입니다. – Josh