我正在尝试检测数组声明并为静态大小的数组构建符号值表。它将包含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
有谁知道这是为什么?
除了地址之外,我认为没有任何关于此的信息。
答案 0 :(得分:3)
一些答案在评论中,但这里有更全面的解释。
alloca中有两个大小来源:分配的类型的大小以及分配的该类型的元素数。如果您没有明确指定数字,则会获得分配单个元素的隐式默认值。这是从操作数#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不会使任何保证指令的名称。优化器的各个部分将破坏名称或更改它们。请小心使用它们作为生产代码,因为当它们消失时您可能会感到惊讶。