Как объявить глобальный целочисленный экземпляр в LLVM IR?

Мне было интересно, если кто-нибудь знает, как объявить глобальный целочисленный экземпляр в LLVM IR. До сих пор я делал следующее:

// 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");

Когда я пытаюсь запустить, я получаю следующую ошибку:

static llvm::PointerType* llvm::PointerType::get(llvm::Type*, unsigned int): Assertion `EltTy && "Can't get a pointer to <null> type!"' failed.

1

Решение

Это из-за неправильного типа. Вы можете взглянуть на Type::getPrimitiveType реализация Вот. Проще говоря, это НЕ тот API, который вам рекомендуется использовать; для IntegerType возвращает nullptr. Также в определении TypeID в LLVM / ИК / Type.h, Есть комментарии, которые:

/// Примечание: если вы добавляете элемент к этому, вам нужно добавить элемент к
/// Type :: getPrimitiveType, иначе все будет сломано!

В основном вы можете сгенерировать тип двумя способами:

  • статический 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
    

Кстати, вы также можете попробовать ELLCC онлайн компилятор чтобы получить соответствующий код C ++ для генерации LLVM IR текущего c / c ++ src, где вам нужно выбрать цель Параметры вывода как API-код LLVM C ++. В качестве альтернативы вы можете попробовать это самостоятельно на своей машине (так как внутренне онлайн-компилятор просто вызывает llc):

llc input.ll -march=cpp -o -
2

Другие решения


По вопросам рекламы [email protected]