我正在尝试检测数组声明并为静态大小的数组构建符号值表.它将包含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 ;
}
}
Run Code Online (Sandbox Code Playgroud)
i32 1当我打印时产生我v.
有人知道为什么吗?
除了可能的地址之外,我认为没有任何关于此的32bit.
一些答案在评论中,但这里有更完整的解释。
alloca 中的大小有两个来源:分配类型的大小和分配的该类型的元素数量。如果您没有显式指定数字,则会获得分配单个元素的隐式默认值。这是i32 1从操作数 #0 中获得的值。如果分配的类型是数组类型(用于dyn_cast<...>测试这一点,如cast<...>断言所示),那么您还需要考虑该大小。
在 LLVM 中,优化器将静态大小大于 1 的分配指令规范化为具有该大小的单个数组的分配指令。因此,您通常会看到分配大小是一个常量。
还有更友好的 API:http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html
特别是,AllocaInst::getArraySize()将获取元素的数量(通常为 1)并AllocaInst::getAllocatedType()获取分配元素的类型(有时是数组)。
最后,关于使用名称的注意事项:LLVM 不对指令的名称做出任何保证。优化器的各个部分都会破坏名称或更改它们。请小心地将它们用于生产代码,因为当它们消失时您可能会感到惊讶。
| 归档时间: |
|
| 查看次数: |
2186 次 |
| 最近记录: |