【问题标题】:Get size of memory access with non-primitive type获取非原始类型的内存访问大小
【发布时间】:2018-02-02 08:34:12
【问题描述】:

我正在尝试使用

获取内存访问(负载)的大小
dyn_cast<LoadInst>(Inst)->getType()->getPrimitiveSizeinBits()

这适用于大多数情况。

但是,对于像

这样的加载指令
%18 = load i8*, i8** %11, align 8, !tbaa !10

如果我们有双星 (**) 指针访问,这种方法只会返回值 0。我想知道在这种情况下是否有任何方法可以让我获得加载的大小?

提前致谢,
汤姆

【问题讨论】:

    标签: compiler-construction clang llvm llvm-ir


    【解决方案1】:

    指针大小取决于目标,所以需要经过ModuleDataLayout。你可能想要M.getDataLayout().getTypeAllocSizeInBits(Ty) 之类的东西。

    【讨论】:

      【解决方案2】:

      如果你想要原语的类型而不管有多少间接级别, 你可以这样做:

      llvm::Type *t = [...]; // getting the type varies on instruction and operand required
      
      while(t && t->isPointerTy()) {
        t = llvm::dyn_cast<llvm::PointerType>(t)->getElementType();
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 2013-07-09
        • 2014-07-08
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        相关资源
        最近更新 更多