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

Yafei Liu via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 14 01:52:25 PST 2020


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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200114/3213e690/attachment.html>


More information about the llvm-dev mailing list