LLVM,初始化值为 0 的整数全局变量

LLVM, Initialize an integer global variable with value 0

提问人:asimes 提问时间:4/28/2014 更新时间:4/28/2014 访问量:6020

问:

我一直在 LLVM 文档/堆栈溢出中兜圈子,无法弄清楚如何将整数全局变量初始化为 0(第一次使用 LLVM)。这是我目前的一些代码:

TheModule = (argc > 1) ? new Module(argv[1], Context) : new Module("Filename", Context);

// Unrelated code

// currentGlobal->id is just a string
TheModule->getOrInsertGlobal(currentGlobal->id, Builder.getInt32Ty());
llvm::GlobalVariable* gVar = TheModule->getNamedGlobal(currentGlobal->id);
gVar->setLinkage(llvm::GlobalValue::CommonLinkage);
gVar->setAlignment(4);

// What replaces "???" below?
//gVar->setInitializer(???);

这几乎做到了我想要的,它可以产生的输出示例:

@a = common global i32, align 4
@b = common global i32, align 4
@c = common global i32, align 4

但是,也产生了我想要的这个:clang foo.c -S -emit-llvm

@a = common global i32 0, align 4
@b = common global i32 0, align 4
@c = common global i32 0, align 4

据我所知,我需要一个我拥有的地方,但不确定该怎么做:http://llvm.org/docs/doxygen/html/classllvm_1_1GlobalVariable.html#a095f8f031d99ce3c0b25478713293deaConstant*"???"

C++(英语:C++) llvm的

评论


答:

5赞 Marco A. 4/28/2014 #1

使用 APInt 构造函数之一获取 0 值(AP 代表任意精度)ConstantInt

ConstantInt* const_int_val = ConstantInt::get(module->getContext(), APInt(32,0));

然后设置初始值设定项值(Constant 子类)

global_var->setInitializer(const_int_val);

评论

0赞 asimes 4/28/2014
谢谢,我了解参数的上下文,an 是什么,我假设只是一个整数的位表示。那和呢?ConstantIntAPInt32StringRef("0")10
0赞 Marco A. 4/28/2014
我发布的那个,它可能不是你需要做的最好的构造函数,但我希望它易于使用,类似于 atoi 函数。我编辑了这篇文章以使其更简单,但第一个版本解释了给定基数中的字符串:您基本上是在基数 10 中询问字符串“10”的整数值
0赞 asimes 4/28/2014
谢谢你,我终于站稳了脚跟,我去了,我相信它做同样的事情gVar->setInitializer(ConstantInt::get(Context, APInt(32, 0, true)));
0赞 Marco A. 4/28/2014
没错,llvm 中的几乎所有内容都是一个值子类,您通常有工厂方法来获得正确的方法