Pre*_*and 1 arrays pointers llvm clang
我需要在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
Run Code Online (Sandbox Code Playgroud)
但是有一些棘手的案例,如下面的地方,它打破了.答案是1024字节但我的上述逻辑将给出2048,因为它完全没有意识到i32
%arrayidx932 = getelementptr inbounds [256 x i32], [256 x i32]* @array5, i64 0, i64 %idxprom931, !dbg !168
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我纠正我的逻辑吗?
当你写的时候I->getOperand(2),你得到一个索引,它与数组类型无关.如果您的代码无论如何都适用,那只是巧合.
你知道T在这种情况下代表什么[256 x i32].你已经得到了256使用getNumElements(),你可以getElementType()用来获取i32,然后从那里找出大小.
可能是一个更好的办法是得到DataLayout了你Module,然后调用getTypeAllocSize(T).
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |