LLVM指令变量名称和参数

标签 llvm

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

    相关文章:

    compiler-construction - LLVM如何将三个地址LLVM IR `add`转换为X86两个地址 `add`?

    c++ - clang 能代替 Exuberant Ctags 吗?

    math - 为什么在 LLVM IR 中没有实现除以常数的优化?

    assembly - LLVM 程序集 : call a function using varargs

    centos - Centos 7 上的 Bazel 0.29.1 LLVM-7.0

    c - LLVM IR 是一种机器无关语言吗?

    c - LLVM和GCC,不同的输出相同的代码

    c++ - 为什么 p &key3 + 2 和 p (int*)&key3 + 2 在 LLVM 中会打印不同的结果?

    c++ - 如何追踪 LLVM verifyFunction 错误 "Expected no forward declarations!"?

    c++ - Visual Studio Code 中的 LLVM C++ 调试