<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Hi,</p>
<p><br>
</p>
<p>I was trying to print out a 128 bit result at runtime using a call to printf in LLVM.</p>
<p><br>
</p>
<p>I am able to print 32 uptil 64 bit integers using the format string "%d" in printf .</p>
<p><br>
</p>
<p><br>
</p>
<p>Please see the code in red below , as I am having a bit difficulty in trying to print the 128 bit value computed at
<b>runtime</b>. The code in red is never executed since the value may never be casted to a ConstantInt.</p>
<p><br>
</p>
<p>( I saw this approach on SO - <a href="https://stackoverflow.com/questions/5315176/llvm-get-constant-integer-back-from-value" class="OWAAutoLink" id="LPlnk587182" previewremoved="true">https://stackoverflow.com/questions/5315176/llvm-get-constant-integer-back-from-value</a> ) </p>
<br>
<p><br>
</p>
<p><br>
</p>
<p>//=========  Relevant code below ==========</p>
<p><br>
</p>
<p><br>
</p>
<p><span id="ms-rterangepaste-start"></span></p>
<div>Value* val = e->codegen() ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(!val)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>return logError("Error evaluating argument to function call");</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(val->getType()->isIntegerTy() )</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(val->getType()->getIntegerBitWidth() <= 64)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>tempString = tempString + "%+d,";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div>                        <span style="color: rgb(255, 0, 0);">  // Is this correct ?</span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span><span style="color: rgb(255, 0, 0);">else </span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">{</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span></div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">if(ConstantInt* CI = dyn_cast<ConstantInt>(val))</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">{</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">// base 10 and signed</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">std::string res = CI->getValue().toString(10,true);</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">val=Builder.CreateGlobalStringPtr(res,"str");</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span></div>
<div><span style="color: rgb(255, 0, 0);"></span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">tempString = tempString + "%+s,";</span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">}</span></div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span></div>
<div><span class="Apple-tab-span" style="white-space: pre; color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">}</span></div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>tempString = tempString + "%+d,";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// if any of the 6 floating point types</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>else if(val->getType()->isFloatingPointTy())</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>tempString = tempString + "%+f,";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>//Apparently this is needed by printf,otehrwise prints 0.000</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>val = convertType(val,Type::getDoubleTy(TheContext));</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>argsValueVector.push_back(val);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>++i;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>formatString = formatString + tempString + "\n" ;</div>
<div><br>
</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// For something like printf , insert a format string at the beginning.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if( F->isVarArg() )</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// every string is declared as a "global constant" at the top of the module.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Value* val=Builder.CreateGlobalStringPtr(formatString,"str");</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>std::vector<Value*>::iterator it = argsValueVector.begin();</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>argsValueVector.insert(it,val);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>return Builder.CreateCall(F,argsValueVector,"calltmp") ;</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<span id="ms-rterangepaste-end"></span><br>
<p></p>
</div>
</body>
</html>