<div><font class="Apple-style-span" face="arial, sans-serif" size="5"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 18px;"><br></span></font></div><div>Hello everyone:</div><div><br></div><div>
I am new to LLVM, and now investigating the feasibility of</div><div>using LLVM to implement several "hybrid" program analysis</div><div>techniques, which use  both static source code and dynamic</div><div>execution  information.</div>
<div><br></div><div>A particular question to me is "how well can LLVM</div><div>preserve RTTI information in its compiled bytecode (it can</div><div>be binary, IR, or other form)"? or "is there are support for</div>
<div>reflectively execute a piece of simple code (a sequence of</div><div>method invocations)"?</div><div><br></div><div>For example, suppose we are going to build a test generation</div><div>tool, which executes a test immediately after the test is generated.</div>
<div>The obtained execution information can guide the further test</div><div>generation, towards certain goals. So, the key question is "</div><div>how to execute a chuck of code  in the same process"?</div><div>
<br></div><div>Assume the tool is going to create tests for the following piece</div><div>of code:</div><div><br></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 15px; white-space: pre; "><span class="kw4" style="color: rgb(153, 51, 51); ">struct</span> C<span class="sy0" style="color: rgb(51, 153, 51); ">*</span> createStruct(int i) {</span></div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 15px; white-space: pre; ">   assert i > 0;</span></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 15px; white-space: pre; ">   ....</span></div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 15px; white-space: pre; ">   //return a new created struct C</span></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 15px; white-space: pre; "></span>}</div>
<div><br></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; line-height: 15px; white-space: pre; font-size: 9.02775px; "><font class="Apple-style-span" color="#993333">char*</font> printStruct(<span class="Apple-style-span" style="font-size: 10.8333px; "><span class="kw4" style="color: rgb(153, 51, 51); ">struct*</span> C</span>) {</span></div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; line-height: 15px; white-space: pre; font-size: 9.02775px; ">   ....</span></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; line-height: 15px; white-space: pre; font-size: 9.02775px; ">   //do something here</span></div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; line-height: 15px; white-space: pre; font-size: 9.02775px; "></span></div><div>}  </div><div><br></div><div>A possible test created can be:</div>
<div><br></div><div>Test 1:</div><div><br></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 18px; white-space: pre; ">int i = 10;</span></div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 18px; white-space: pre; ">struct C* c = createStruct(int i)</span></div><div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 18px; white-space: pre; ">char* result = printStruct(c);</span></div>
<div><br></div><div>For Test1, is it possible to <b>obtain the value of "<font class="Apple-style-span" color="#FF0000">char* result</font>"</b></div><div>before creating new tests?</div><div><br></div><div>This has many benefits:  it can be used to prune search</div>
<div>space. For example,  in Test 1, if <span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 21px; white-space: pre; ">i = -10</span>, the execution of</div>
<div><span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 25px; white-space: pre; ">createStruct(int i)</span> will not succeed, thus, there is no need to</div>
<div>further extend an erroneousness test  (call <span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 25px; white-space: pre; ">printStruct(c); </span>) any more.</div>
<div>This is in contrast to "executing tests when all of them are created"!</div><div><br></div><div>In Java, such information can be easily obtained via</div><div>its Reflection API, e.g., calling "<span class="Apple-style-span" style="font-family: monospace, 'Courier New'; font-size: 10.8333px; line-height: 30px; white-space: pre; ">Method.invoke(...)</span>". So, I</div>
<div>am wondering is LLVM has a similar mechanism to achieve</div><div>this purpose?  If not, what is the most feasible way to work around</div><div>this? Adding type information to IR, or invoke a interpreter?</div><div>
<br></div><div>It would be tremendously helpful if anyone can kindly share</div><div>some experience, or point me to the right resource! Any</div><div>comments are highly appreciated!</div><div><br></div><div>Thanks</div>
<div><div><br></div></div><div>-Sai</div><div><br></div><div><br></div><div><br></div>