在LLVM IR中查找正确的数组大小

时间:2015-11-21 07:22:58

标签: arrays pointers clang llvm

我需要在GetElementPtr指令I中计算数组的大小(以字节为单位)。我以前一直在使用以下逻辑来推导:

/* Get the bitWidth of the item */
int bitWidth = cast<IntegerType>(I->getOperand(2)->getType())->getBitWidth();

/* Find total number of elements in array */
Type *T = cast<PointerType>(cast<GetElementPtrInst>(I)->getPointerOperandType())->getElementType();
int no_of_elements = cast<ArrayType>(T)->getNumElements();

/* Compute total and return bytes */
return (no_of_elements * bitWidth) / 8

但是有一些棘手的案例,例如以下它会破坏的情况。答案 1024 字节,但我的上述逻辑将提供 2048 ,因为它完全不知道i32

%arrayidx932 = getelementptr inbounds [256 x i32], [256 x i32]* @array5, i64 0, i64 %idxprom931, !dbg !168

任何人都可以帮我纠正我的逻辑吗?

1 个答案:

答案 0 :(得分:7)

当您编写I->getOperand(2)时,您将获得其中一个索引,这与索引类型无关。如果你的代码无论如何都适用,那只是巧合。

您已获得T,在这种情况下代表[256 x i32]。您已使用256获得了getNumElements(),并且您可以使用getElementType()获取i32,然后从中确定大小。

可能更好的方法是get the DataLayout off your Module,然后拨打getTypeAllocSize(T)