Мне было интересно, если кто-нибудь знает, как объявить глобальный целочисленный экземпляр в 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.
Это из-за неправильного типа. Вы можете взглянуть на 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 -