【问题标题】:LLVM Instruction variable names and parametersLLVM 指令变量名称和参数
【发布时间】:2012-03-22 16:53:46
【问题描述】:

我正在尝试检测数组声明并为静态大小的数组构建符号值表。它将包含一个 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 ;
         }
    } 
    

    当我打印 v 时,我得到了 i32 1
    有谁知道这是为什么?
    我认为除了地址之外没有任何 32 位的内容。

【问题讨论】:

  • 好的,所以我想出了如何获取大小: ArrayType *a = cast(p->getElementType()); a->getNumElements()
  • 好吧...所以...我也想出了如何获取名称... allocInst->getName() 为什么只是在stackoverflow上发布可以帮助我更快地找到答案...: P
  • 最好只发布包含此信息的答案,而不是 cmets。这样,问题将被正确标记为已回答。
  • Realn0wherman,我同意@Oak,请发布这些 cmets 作为答案并接受它们,因为人们通常在花时间阅读 cmets 之前向下滚动以寻找那张可爱的绿色支票。
  • 多维数组呢。如果我取 arr[100][100],那么 a->getNumElements() 给出 100。如何获得总大小?。

标签: llvm


【解决方案1】:

部分答案在 cmets 中,但这里有更完整的解释。

alloca 中有两个大小来源:分配的 type 的大小和分配的该类型元素的数量。如果您没有明确指定数字,您将获得分配单个元素的隐式默认值。这是您从操作数#0 中得到的i32 1 值。 如果分配的类型是数组类型(使用dyn_cast&lt;...&gt; 来测试这一点,cast&lt;...&gt; 将断言),那么您还需要考虑该大小。

在 LLVM 中,优化器将静态大小大于 1 的 alloca 指令规范化为具有该大小的单个数组的 alloca 指令。因此,您最常将 alloca 大小视为一个常数。

还有更友好的 API:http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

特别是,AllocaInst::getArraySize() 将为您提供元素的数量(通常为 1),AllocaInst::getAllocatedType() 将为您提供已分配元素的类型(有时是数组)。

最后,关于使用名称的说明:LLVM 不对指令名称做出任何保证。优化器的各个部分将破坏名称或更改它们。将它们用于生产代码时要小心,因为当它们消失时您可能会感到惊讶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多