<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:0cm;
        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;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
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="DE" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Is there a code example or maybe a documentation about this subject? Sadly it is an important part of my project to get the addresses of the constructors and destructors.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">I really ran out of ideas though, every time when I try to look them up, they seem to be gone already .w.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> David Blaikie <dblaikie@gmail.com>
<br>
<b>Sent:</b> 19 December 2019 20:52<br>
<b>To:</b> Gaier, Bjoern <Bjoern.Gaier@horiba.com>; Lang Hames <lhames@gmail.com><br>
<b>Cc:</b> llvm-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors?<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><a href="mailto:lhames@gmail.com">+Lang Hames</a> owner/author of the ORC JIT (though I think he's out of office at the moment, so replies from him might be delayed).<br>
<br>
I believe there's a way to wire up the global ctors, but I don't know the details unfortunately - perhaps someone else will chime in if/before Lang gets a chance.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 19, 2019 at 5:53 AM Gaier, Bjoern via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">Heyho,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">Recently I tried out the ORCv2 JIT, especially the LLJIT. I gotta say, that I really like the new interface and the way you use it! However there is one thing
 I’m missing. I wrote a small bit code file, which should force having a global constructor.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> wuff();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">__declspec</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">noinline</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">)
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> miau()</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">{</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">       printf(</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#A31515">"Huhuhu"</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">return</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> wuff();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> x = miau();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">When I parse this IR file in my JIT and go through the ‘globals()’ of the llvm::Module, then I will encounter a symbol with the following name:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">“_GLOBAL__sub_I_VectorBIOS.cpp” where VectorBIOS.cpp was the name of the source file I compiled to the bit code.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">I then wanted to get the address of that symbol - from the MCJIT times I remember, that those functions are the global constructors, but when calling lookup on
 that name, I was not able to find the symbol.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">So I tried a different way:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">GlobalVariable</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
 *var = </span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:gray">module</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:teal">-></span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">getNamedGlobal(</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#A31515">"llvm.global_ctors"</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">if</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(var)</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">{</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">       llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantArray</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
 *InitList = (llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantArray</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">*)var->getInitializer();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">      
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">for</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">unsigned</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">int</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> n = 0; n < InitList->getNumOperands(); n++)</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">       {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantStruct</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
 *CS = (llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantStruct</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">*)InitList->getOperand(n);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">            
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">if</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(!CS)</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">                   
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">continue</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Constant</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
 *FP = CS->getOperand(1);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">            
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">if</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(FP->isNullValue())</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">                   
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">continue</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantExpr</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">
 *CE = (llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">ConstantExpr</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">*)FP;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">            
</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:blue">if</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">(CE->isCast())</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">                    FP = CE->getOperand(0);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">             ((llvm::</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:#2B91AF">Function</span><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">*)FP)->getName();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">       }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB" style="font-size:9.5pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">I then printed the name of the llvm::Function but it was exactly the name I expected “_GLOBAL__sub_I_VectorBIOS.cpp”. This code was executed before I added module
 to the JIT. </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">For various reasons I wanted to store the address to the constructor – so I don’t want to call the LLJIT runConstructor – simply because I want to execute those
 functions later, when the LLJIT does not exist anymore.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">I hope someone can help me with this…</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">Kind Greetings</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-GB">Björn</span><o:p></o:p></p>
</div>
<p class="MsoNormal">Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika
<o:p></o:p></p>
</div>
<p class="MsoNormal">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
</blockquote>
</div>
</div>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika
</body>
</html>