我手里拿着一个Type*.如何以位/字节找出其大小(此类型的大小对象将占用内存)?我看到各种方法允许我获得"原始"或"标量"大小,但这不会帮助我使用聚合类型...
Don*_*ows 25
如果您只需要大小,因为您将其插入IR(例如,因此您可以将其发送到调用malloc()),您可以使用该getelementptr指令进行脏工作(使用少量转换),如此处所述(使用更新现代LLVM):
虽然LLVM不包含特殊用途
sizeof/offsetof指令,但该getelementptr指令可用于评估这些值.的基本思想是使用getelementptr从null指针根据需要来计算的值.因为getelementptr将值作为指针生成,所以在使用之前将结果转换为整数.例如,要获得某种类型的大小
%T,我们将使用以下内容:Run Code Online (Sandbox Code Playgroud)%Size = getelementptr %T* null, i32 1 %SizeI = ptrtoint %T* %Size to i32这段代码实际上假装有一个
T元素数组,从null指针开始.这将获得指向T数组中第二个元素(元素#1)的指针,并将其视为整数.这会计算一个T元素的大小.
这样做的好处在于它完全适用于您不关心价值的情况; 你只需要将IR中的正确值传递给某些东西.到目前为止,这是我sizeof()在IR代中需要相似操作的最常见情况.
该页面还继续描述如何进行offsetof()等效:
为了获得结构中某些字段的偏移量,使用了类似的技巧.例如,要获取第二个元素(元素#1)的地址
{ i8, i32* }(这取决于指针的目标对齐要求),应该使用以下内容:Run Code Online (Sandbox Code Playgroud)%Offset = getelementptr {i8,i32*}* null, i32 0, i32 1 %OffsetI = ptrtoint i32** %Offset to i32这与
sizeof诀窍的工作方式相同:我们假装在null指针处有一个类型的实例,并获取我们感兴趣的字段的地址.该地址是字段的偏移量.请注意,在这两种情况下,表达式将在代码生成时计算为常量,因此使用此技术不会产生运行时开销.
IR优化器还将值转换为常量.
Oak*_*Oak 23
大小取决于目标(由于几个原因,对齐是其中之一).
在LLVM版本3.2及更高版本中,您需要使用DataLayout,特别是其getTypeAllocSize方法.这将返回以字节为单位的大小,还有一个名为的位版本getTypeAllocSizeInBits.甲DataLayout实例可以通过从当前模块创建它来获得:DataLayout* TD = new DataLayout(M).
LLVM最高版本为3.1(包括),请使用TargetData而不是DataLayout.但它暴露了相同的getTypeAllocSize方法.
| 归档时间: |
|
| 查看次数: |
6101 次 |
| 最近记录: |