Вы можете сохранить инициализатор выражения в глобальной переменной из основной функции.
// all LLVM includes
using namespace std;
LLVMContext context;
Module* module = new Module("module_1", context);
IRBuilder<> builder(context);
SymbolTable symbolTable; // some structure to map the symbol names to the LLVM value
// ...
Value* createGlobalVar(const string& id, Type* type, Value* init) {
Value* gv = new GlobalVariable(*module, type, false, GlobalValue::PrivateLinkage, Constant::getNullValue(type), id);
Function* mainFunc = symbolTable.get("main");
BasicBlock* entryBB = &(mainFunc->getEntryBlock());
BasicBlock* currentBB = &(builder.GetInsertBlock());
auto currentInsertPoint = builder.GetInsertPoint(); // returns an iterator
builder.SetInsertPoint(entryBB, entryBB->begin());
builder.CreateStore(init, gv);
builder.SetInsertBlock(currentBB, currentInsertPoint);
symbolTable.add(id, gv);
return gv;
}
Хотя вы собираетесь заменить начальное значение произвольным выражением, у GlobalVariable должен быть инициализатор, указывающий, что он принадлежит текущему модулю. В противном случае ожидается некоторая связь с некоторой существующей переменной.
Я написал эту функцию, думая, что ваше объявление глобальной переменной можно найти в любом месте кода. Однако если вы генерируете код из абстрактного синтаксического дерева (AST), скорее всего, ваше объявление будет отображаться перед основным объявлением, то есть до того, как main будет вставлен в таблицу символов. В этом случае вы можете создать глобальную переменную и вставить ее в таблицу символов, а также создать инструкцию сохранения после завершения всего анализа.
person
Rafael Rodrigues dos Santos
schedule
28.11.2018
int nc_global = foo();
и скажете ему испускать LLVM-IR. - person Peter Cordes   schedule 01.11.2020