2014-09-17 2 views

답변

2

그건 :

// Create symbol to identify previous block. Added by Justin. 
llvm::Type::TypeID stupidTypeID = llvm::Type::IntegerTyID; 
llvm::Type* typePtr = llvm::Type::getPrimitiveType(_context, stupidTypeID); 
llvm::GlobalVariable* prevBlockID = new llvm::GlobalVariable(typePtr, 
                  false, 
                  llvm::GlobalValue::LinkerPrivateLinkage, 
                  NULL, 
                  "PREV_BLOCK_ID"); 

내가 실행하려고

, 나는 다음과 같은 오류가 발생합니다. Type::getPrimitiveType 구현 here을 살펴볼 수 있습니다. 간단히 말해서, 그것은 당신이 사용하도록 권고받은 API가 아닙니다. IntegerType의 경우 nullptr을 반환합니다.

/// Note: If you add an element to this, you need to add an element to the
/// Type::getPrimitiveType function, or else things will break!

은 기본적으로 당신이이 방법으로 유형을 생성 할 수 있습니다 : 또한, llvm/IR/Type.h에서 TypeID의 정의에 있음이 코멘트 지정된 유형 귀하의 경우에는
에 대한 get

  • 정적 API,

    IntegerType *iTy = IntegerType::get(ctx, 32); // if it's 32bit INT 
    
  • 도우미 클래스 TypeBuilder
    형식 생성을보다 쉽고 보편적으로 만듭니다. TypeBuilder은 더 복잡한 유형을 정의해야 할 때 유용하고 직관적입니다 (예 : FunctionType). 물론 소스 코드를 컴파일하는 데 드는 비용은 물론입니다 (주의해야합니까?).

    IntegerType *intType = TypeBuilder<int, false>::get(ctx); // normal C int 
    IntegerType *intTy = TypeBuilder<types::i<32>, false>::get(ctx); // if it's 32bit INT 
    

BTW, 당신은 또한/C++ SRC, 당신은 LLVM C로 출력 옵션의 대상을 선택해야 할 경우 현재 C의 LLVM IR를 생성하기위한 대응하는 C++ 코드를 얻으려면 ELLCC online compiler을 시도 할 수 있습니다 ++ API 코드. 또는 컴퓨터에서 직접 시도 할 수도 있습니다 (내부 컴파일러는 llc을 호출하기 때문에)

llc input.ll -march=cpp -o -