<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">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.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Eli<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> llvm-dev <llvm-dev-bounces@lists.llvm.org> <b>On Behalf Of
</b>Yafei Liu via llvm-dev<br>
<b>Sent:</b> Tuesday, January 14, 2020 1:52 AM<br>
<b>To:</b> llvm-dev <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> [EXT] [llvm-dev] sizeof implementation: how to get size as a constantInt?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">I'm implementing c style "sizeof()", and I did as <a href="http://nondot.org/sabre/LLVMNotes/SizeOf-OffsetOf-VariableSizedStructs.txt">http://nondot.org/sabre/LLVMNotes/SizeOf-OffsetOf-VariableSizedStructs.txt</a> illuarstrated, and it
 works find, here's an example of my implementation:<o:p></o:p></p>
<div>
<p class="MsoNormal">auto *p = builder.CreateGEP(structTy,<br>
                              llvm::ConstantPointerNull::get(pointerTy),<br>
                              constint1);<br>
<br>
  auto *size = builder.CreatePtrToInt(p, llvm::IntegerType::get(context, 64));<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">and type definitions:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">auto *constint1 = llvm::ConstantInt::get(context, llvm::APInt(64, 1));<br>
auto *int64Ty = llvm::IntegerType::get(context, 64);<br>
auto *doubleTy = llvm::Type::getDoubleTy(context);<br>
auto *structTy = llvm::StructType::create(context, "Foo");<br>
structTy->setBody({int64Ty, doubleTy});<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">auto *pointerTy = llvm::PointerType::get(structTy, 0);<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">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)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">and I noticed this in the tutorial:<o:p></o:p></p>
</div>
<div>
<pre style="white-space:pre-wrap"><span style="color:black">Note that in both of these cases, the expression will be evaluated to a<o:p></o:p></span></pre>
<pre><span style="color:black">constant at code generation time, so there is no runtime overhead to using this<o:p></o:p></span></pre>
<pre><span style="color:black">technique.<o:p></o:p></span></pre>
</div>
<div>
<p class="MsoNormal">But how can he cast an llvm::Value to llvm::ConstantInt?<o:p></o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>