如何通过LLVM IR C++ API创建匿名全局变量?
如何通过LLVM IR C++ API创建匿名全局变量
我已经掌握如何通过LLVM IR C++ API创建命名全局变量,示例代码如下:
GlobalVariable *createGlobalVariable( Module *module, Type *type, std::string name ) { module->getOrInsertGlobal(name, type); return module->getNamedGlobal(name); }
使用示例:
auto context = new LLVMContext(); auto module = new Module("Module", *context); auto type = IntegerType::getInt32Ty(*context); auto globalVariable = createGlobalVariable( module, type, "globalVariableName" ); auto constantInt = ConstantInt::getIntegerValue( type, APInt(32, 42) ); globalVariable->setInitializer(constantInt); module->dump();
上述代码生成的LLVM IR如下:
; ModuleID = 'Module' source_filename = "Module" @globalVariableName = global i32 42
现在需要创建匿名全局变量,期望生成如下形式的LLVM IR:
; ModuleID = 'Module' source_filename = "Module" @0 = global i32 42
其中@0为LLVM自动分配的唯一标识符。
解决方案
创建匿名全局变量时,不需要指定自定义名称,直接传递空字符串作为名称,LLVM会自动为其分配数字形式的唯一标识符,有两种实现方式:
方式1:直接使用GlobalVariable构造函数
GlobalVariable* createAnonymousGlobalVariable( Module* module, Type* type, Constant* initializer = nullptr ) { // 第三个参数传空字符串,触发LLVM自动分配数字标识符 GlobalVariable* globalVar = new GlobalVariable( *module, type, false, GlobalValue::ExternalLinkage, initializer, "" ); return globalVar; }
使用示例
auto context = new LLVMContext(); auto module = new Module("Module", *context); auto type = IntegerType::getInt32Ty(*context); auto constantInt = ConstantInt::getIntegerValue(type, APInt(32, 42)); auto anonymousGlobal = createAnonymousGlobalVariable(module, type, constantInt); module->dump();
生成的LLVM IR与预期一致:
; ModuleID = 'Module' source_filename = "Module" @0 = global i32 42
方式2:沿用getOrInsertGlobal传递空字符串
可以基于你原有的命名全局变量实现逻辑,仅将名称参数改为空字符串:
GlobalVariable* createAnonymousGlobalVariable( Module* module, Type* type ) { module->getOrInsertGlobal("", type); return module->getNamedGlobal(""); }
后续同样设置初始化值即可,生成的IR效果完全相同。
内容的提问来源于stack exchange,提问作者CWKSC
相关产品推荐
相关产品推荐

