[LLVMdev] Size of structs & arrays

Duncan Sands
Thu, 23 Feb 2012 07:47:28 -0000

Hi Fraser,

> I'm trying to work out the size of a struct so that I can pass this to
the
> 'llvm.memcpy' intrinsic. It's easy to find out how I'm
supposed to do this,
> as I keep seeing the following:
>
> %Size = getelementptr %T* null, int 1
> %SizeI = cast %T* %Size to uint
>
> But I'm unsure how I actually do this in the C++ API. Is the
'null' here a
> llvm::ConstantPointerNull? Any help here would be much appreciated.

you can use ConstantExpr::getSizeOf.

> Additionally, I was wondering whether I can use this method to find out the
> size of variable-length arrays, such as [0 x i32], for example? I've
tried
> doing this and am obviously doing something wrong.
>
> %Size = getelementptr [0 x i32]* %1, i32* null, i32 1
> %SizeI = ptrtoint i32* %Size to i64
>
> This gives entirely the wrong result,

This will return zero, since this array has size zero.  It is not a variable
length array, it is an array with length zero.

  and I'm not surprised, as it doesn't
> look correct. Should I instead be implementing these arrays with a size
> associated with them? Something like { i32, [0 x i32]}, for instance?

You need to know the length somehow.  This is one way.

Ciao, Duncan.