[llvm-dev] sizeof implementation: how to get size as a constantInt?

122 views
Skip to first unread message

Yafei Liu via llvm-dev

unread,
Jan 14, 2020, 4:52:55 AM1/14/20
to llvm-dev
I'm implementing c style "sizeof()", and I did as http://nondot.org/sabre/LLVMNotes/SizeOf-OffsetOf-VariableSizedStructs.txt illuarstrated, and it works find, here's an example of my implementation:
auto *p = builder.CreateGEP(structTy,
                              llvm::ConstantPointerNull::get(pointerTy),
                              constint1);

  auto *size = builder.CreatePtrToInt(p, llvm::IntegerType::get(context, 64));

and type definitions:
auto *constint1 = llvm::ConstantInt::get(context, llvm::APInt(64, 1));
auto *int64Ty = llvm::IntegerType::get(context, 64);
auto *doubleTy = llvm::Type::getDoubleTy(context);
auto *structTy = llvm::StructType::create(context, "Foo");
structTy->setBody({int64Ty, doubleTy});
auto *pointerTy = llvm::PointerType::get(structTy, 0);

take care that the "size" is a "llvm::Value" type, not a "llvm::constantInt" type, this leads to a problem:  definitions like "int i[sizeof(Foo)]" will fail (please ignore that this definition makes no sense), because in my implementation, sizeof() should get the result on compile time, but the current implementation seems calculate at runtime( or at least an llvm::Value, not an llvm::ConstantInt)

and I noticed this in the tutorial:
Note that in both of these cases, the expression will be evaluated to a
constant at code generation time, so there is no runtime overhead to using this
technique.
But how can he cast an llvm::Value to llvm::ConstantInt?

Eli Friedman via llvm-dev

unread,
Jan 14, 2020, 2:10:41 PM1/14/20
to Yafei Liu, llvm-dev

I’d recommend just using DataLayout::getTypeAllocSize() directly to get the number you want.  (If you really want to fold your Constant to a ConstantInt, llvm::ConstantFoldConstant should work, but that’s a really convoluted way to do it.)

 

-Eli

Yafei Liu via llvm-dev

unread,
Jan 14, 2020, 8:48:54 PM1/14/20
to Eli Friedman, llvm-dev
Hi Eli, do you know what's the difference between "DataLayout::getTypeAllocSize()" and "llvm::ConstantExpr::getSizeOf()"
Reply all
Reply to author
Forward
0 new messages