我正在尝试检测数组声明并为静态大小的数组构建符号值表。它将包含一个name-arraySize配对。我有几个问题:
%a = alloca [200 x i8], align 16
如何从中提取数组名称a
? 200
提取为数组大小,但是此代码:if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){
PointerType *p = allocInst->getType();
if(p->getElementType()->isArrayTy()){
Value* v = allocInst->getOperand(0);
errs() << *v ;
}
}
当我打印
i32 1
时产生v
。有人知道为什么吗?
我认为除了地址外,没有其他32位的内容。
最佳答案
一些答案在注释中,但这是更完整的解释。
分配中有两个大小来源:分配的类型的大小和分配的该类型的元素数。如果未明确指定数字,则将获得分配单个元素的隐式默认值。这是您从操作数#0中获得的i32 1
值。如果分配的类型是数组类型(请使用dyn_cast<...>
进行测试,就像cast<...>
会声明的那样),那么您还需要考虑该大小。
在LLVM中,优化器将静态大小大于1的alloca指令规范化为具有该大小的单个数组的alloca指令。因此,您最经常将alloca大小视为恒定大小。
也有一些更友好的API:http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html
特别是,AllocaInst::getArraySize()
将为您提供元素的数量(通常为1),而AllocaInst::getAllocatedType()
将为您提供分配的元素的类型(有时为数组)。
最后,关于名称的注释:LLVM不能保证指令名称。优化器的各个部分将破坏名称或对其进行更改。请小心使用它们作为生产代码,因为当它们消失时,您可能会感到惊讶。
关于LLVM指令变量名称和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826903/