LLVM指令变量名称和参数

时间:2012-03-22 16:53:47

标签: llvm

我正在尝试检测数组声明并为静态大小的数组构建符号值表。它将包含name-arraySize配对。我有几个问题:

  1. 给出%a = alloca [200 x i8], align 16之类的指示 如何从中提取a数组的名称?

  2. 我正在尝试提取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 有谁知道这是为什么?
    除了地址之外,我认为没有任何关于此的信息。

1 个答案:

答案 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不会使任何保证指令的名称。优化器的各个部分将破坏名称或更改它们。请小心使用它们作为生产代码,因为当它们消失时您可能会感到惊讶。