2012-02-23 3 views
1

제로 확장 명령과 곱하기 명령어를 기본 블록에 삽입하고 싶습니다. 입력은, 기본 블록에 제로 확장 명령 삽입하기

define void @DriverInit() { 
    EntryBlock: 
     %abc = call i32 @cuInit(i32 0) 
     ret void 
    } 

내가 그것을 변환 할이다
define void @DriverInit() { 
     EntryBlock: 
      %abc = call i32 @cuInit(i32 0) 
      %2 = zext i32 1 to i64 
    %3 = mul i64 %2, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) 
      ret void 
     } 

어떻게 LLVM C++ API를 사용하여 그것을 할 수

? 제로 확장 명령을 만들기 위해 아래의 코드를 사용합니다,하지만 그것을 할 수 없습니다.

IRBuilder<> builder(BB); 
Value *One = builder.getInt32(1); 

Value *zer=builder.CreateZExt(One, IntegerType::getInt64Ty(M.getContext()),"1"); 

CreateZExt의 두 번째 인수는 제로 확장을 원하는 대상 유형입니다. 내가 틀렸다면 수정하십시오.

저는 LLVM의 초보자이며 패스에서 어떤 기능을 사용할 지에 대한 정보를 얻기가 어렵습니다. 소스 코드에 대한 doxygen 문서를 제외하고는 어떤 자원을 사용할 수 있습니까?

+0

귀하의 질문을 이해할 수 없습니다 - 명확히 할 수 있습니까? 가지고있는 IR의 입력은 무엇이며, 만들고 싶은 출력은 무엇입니까? 'mul'에 대한 두 번째 인수에서 포인터 지시문은 무엇입니까? –

+0

입력 기능에 'EntryBlock'이 이미있는 경우 기본 블록을 생성하는 이유는 무엇입니까? – CAFxX

+0

게다가, 당신이 실제로하고있는 것을 설명하기 전에, 당신이 실제로하고있는 것을 설명하기 전에 도움이 될 것입니다. – CAFxX

답변

1

일단 LLVM에 대한 경험이 있으면 코드를 어디서 볼 수 있는지 알 것입니다. 까지 경험을 쌓으면 C++ 백엔드를 사용하여 주어진 IR과 동일한 API 호출을 생성 할 수 있습니다.

IR을 llc으로 컴파일하는 방법 중 하나는 C++ 백엔드를 사용하는 것입니다. z.ll라는 이름의 실행 파일에 저장

define void @DriverInit() { 
EntryBlock: 
    %0 = zext i32 1 to i64 
    %1 = mul i64 %0, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) 
    ret void 
} 

: 예를 들어,이 단순화 된 IR을

llc -march=cpp -O0 -cppgen=program z.ll 

당신은 LLVM 설치하거나 llc에 액세스 할 어딘가에 내장되어 있어야합니다. 전체 모듈을 작성하기 위해 C++ API 호출을 갖는 z.cpp을 생성합니다. EntryBlock 기본 블록의 관련 부분은 다음과 같습니다

// Function: DriverInit (func_DriverInit) 
{ 

    BasicBlock* label_EntryBlock = BasicBlock::Create(mod->getContext(), "EntryBlock",func_DriverInit,0); 

    // Block EntryBlock (label_EntryBlock) 
    CastInst* int64_6 = new ZExtInst(const_int32_1, IntegerType::get(mod->getContext(), 64), "", label_EntryBlock); 
    BinaryOperator* int64_7 = BinaryOperator::Create(Instruction::Mul, int64_6, const_int64_2, "", label_EntryBlock); 
    ReturnInst::Create(mod->getContext(), label_EntryBlock); 
} 

어떤에서 당신이 IR을 생성하기 위해 올바르게 zExtInstr 생성자 나중에 BinaryOperator::Create 전화를 사용하는 방법을 참조하십시오.