<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=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (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:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","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;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@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"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">The MCJITCtor and JITCtor are initialized from static constructors defined in MCJIT.cpp and JIT.cpp respectively.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">The problem you are seeing is probably caused by the linker optimizing out these static constructors on Windows.  In order to force these constructors to be
 linked in, you need to include “llvm/ExecutionEngine/MCJIT.h” from some module that you know contains non-static code.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-Andy<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> llvmdev-bounces@cs.uiuc.edu [mailto:llvmdev-bounces@cs.uiuc.edu]
<b>On Behalf Of </b>Xinglin Zhang<br>
<b>Sent:</b> Thursday, August 09, 2012 10:04 AM<br>
<b>To:</b> llvmdev@cs.uiuc.edu<br>
<b>Subject:</b> [LLVMdev] question about ExectuionEngine::Create<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">I found the following problem when I try to debug "target does not support mc emission" in linux (the same code executes OK in windows):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">Below is a snippet extracted from this method,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">if (UseMCJIT && ExecutionEngine::MCJITCtor) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        ExecutionEngine *EE =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">          ExecutionEngine::MCJITCtor(M, ErrorStr, JMM, OptLevel,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                     AllocateGVsWithCode, TM);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        if (EE) return EE;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">      } else if (ExecutionEngine::JITCtor) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        ExecutionEngine *EE =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">          ExecutionEngine::JITCtor(M, ErrorStr, JMM, OptLevel,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                   AllocateGVsWithCode, TM);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        if (EE) return EE;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">      }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Both ExecutionEngine::MCJITCtor and ExecutionEngine::JITCtor are function pointers (static members in class ExecutionEngine) and are initialized at the very beginning of ExecutionEngine.cpp to be 0 (NULL): <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">ExecutionEngine *(*ExecutionEngine::JITCtor)(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  Module *M,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  std::string *ErrorStr,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  JITMemoryManager *JMM,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  CodeGenOpt::Level OptLevel,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  bool GVsWithCode,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  TargetMachine *TM) = 0;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">ExecutionEngine *(*ExecutionEngine::MCJITCtor)(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  Module *M,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  std::string *ErrorStr,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  JITMemoryManager *JMM,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  CodeGenOpt::Level OptLevel,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  bool GVsWithCode,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  TargetMachine *TM) = 0;<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">When I create the engine, I set UseMCJIT to "true" using <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">engineBuilder.setUseMCJIT(true);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Then I call <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">engineBuilder.crate()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">to create the Execution engine.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">In windows and Linux (Ubuntu), I got a different execution path when it reaches the if/else structure mentioned in the very beginning of this email:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Windows: it goes into the "else if" branch, which means that  ExecutionEngine::MCJITCtor is evaluated as 0/NULL. It then uses ExecutionEngine::JITCtor to create the engine and successful. However, this is not what I meant to do.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Linux: it goes into the "if" branch, which means ExecutionEngine::MCJITCtor is not 0/NULL, and it must have been assigned a value somewhere. Then it uses ExecutionEngine::MCJITCtor (which is what I meant to do) but fails, giving me an error
 "target does not support mc emission"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">In Windows, I am linking all the libraries (.lib) statically; In Linux, I am dynamic linking
<a href="http://libLLVM3.0.so">libLLVM3.0.so</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Question:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">1. Where and when do  ExecutionEngine::MCJITCtor and ExecutionEngine::JITCtor get assigned a different value other than 0/NULL?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">2. Why the value of ExecutionEngine::MCJITCtor are different in Windows and Linux?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks.<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">-- <br>
Xinglin Zhang<o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>