gpt4 book ai didi

LLVM指令变量名称和参数

转载 作者:行者123 更新时间:2023-12-04 04:31:42 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com