<div dir="ltr"><div>Hi Fahad,</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;color:rgb(0,0,0);font-family:Arial;font-size:11pt;white-space:pre-wrap;vertical-align:baseline">> Improve dynamic memory related capabilities of Attributor. For example Improve </span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;color:rgb(0,0,0);font-family:Arial;font-size:11pt;white-space:pre-wrap;font-weight:700;vertical-align:baseline">HeapToStackConversions</span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;color:rgb(0,0,0);font-family:Arial;font-size:11pt;white-space:pre-wrap;vertical-align:baseline">. Maybe such deductions can help safety (dis)provers. For example, can we improve the </span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;color:rgb(0,0,0);font-family:Arial;font-size:11pt;white-space:pre-wrap;font-weight:700;vertical-align:baseline">use-after-free bug detection</span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;color:rgb(0,0,0);font-family:Arial;font-size:11pt;white-space:pre-wrap;vertical-align:baseline"> using some attributes?
</span><br>Stefan should know more about H2S. Regarding the use-after-free, I don't think there's currently any plans for it directly, but they can be I assume.</blockquote><div> </div><div>You are somewhat right. However, H2S is not about 'use-after-free' bug detection, but rather its prevention. We already do this, see <a href="https://godbolt.org/z/HgrC7H">example</a>.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In the rest of this post I'll try to help you familiarize yourself with the Attributor and maybe answer your questions.<br>Johannes can then give you specific things to do to get started.</blockquote><div><br></div><div>In the meantime you could look at some TODOs in the Attributor itself and try those you see fit. </div><div><br></div><div>If you have any questions, don't hesitate to ask.</div><div><br></div><div>-stefan</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 13, 2020 at 10:14 PM Stefanos Baziotis <<a href="mailto:stefanos.baziotis@gmail.com">stefanos.baziotis@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Fahad,<br><br>We're all happy to see you being interested in LLVM! More so in the Attributor! I'm a relatively new contributor so I<br>think I can help. Please note that the Attributor, apart from Johannes (who CC'd), has at least another 2 great<br>contributors, Hideto and Stefan (who I also CC'd). They were among the initial creators.<br><br>In the rest of this post I'll try to help you familiarize yourself with the Attributor and maybe answer your questions.<br>Johannes can then give you specific things to do to get started.<br><br>Starting off, understanding the theory of data-flow analysis can help. I'd say don't get too hang up on it, you just<br>have to understand the idea of fix-point analyses.<br><br>I don't how much you know about the Attributor, so I'll defer a too long (or too beginner) description because you might already know<br>a lot of things. You can of course any specific questions you want:<br>A summary is:<br>The Attributor tries to deduce attributes in different points of an LLVM IR program (you can see that in the video).<br>The deduction of these attributes is inter-connected, which is the whole point of the Attributor. The attributes<br>"ask" one another for information. For example, one attribute tries to see if a load loads from null pointer.<br>But the pointer operand might be non-constant (like %v in LLVM IR). Well, another attribute, whose job is to do value simplification<br>(i.e. constant folding / propagation etc.) might have folded that (%v) into the constant null. So, the former can ask him.<br>These connections give the power and the complexity.<br><br>The attributes have a state, that changes. When the state stops changing, it has reached a fixpoint, at which point<br>the deduction of it stops. From the initialization of the attribute until a fixpoint is reached, the state changes<br>in updates (called updateImpl() in the source code). This is where attributes try to deduce new things, ask one another<br>and eventually try to reach a fixpoint.<br><br>Finally, a fixpoint can be enforced. Because if we for some reason never stop changing, it would run forever.<br>Note however that attributes should be programmed in a way that fixpoint should be able to be reached<br>(This is where theory might help a little).<br><br>I'd suggest that you try to run the Attributor and follow a specific attribute's updates and see what it tries to deduce.<br>That is, see its updateImpl(). With a couple of prints you can get a good idea of what it does and what info it<br>gets from other attributes (and when it stops). You can of course ask us if you're interested in a specific one, if<br>there's something you don't understand etc.<br><br>Now, to (try to) answer your questions and hopefully other people can help.<br>> <span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">How Attributor can help for standard inter-procedural and intra-procedural analysis passes of LLVm. I’ve seen the tutorial</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;font-weight:700;vertical-align:baseline"> [4]</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">. I would like to discuss ways of improving other optimization passes similarly (or some examples which have already been implemented).</span><br><br>The Attributor AFAIK is self-contained. It's not in "production" yet and so it's not connected with other passes. At this point, LLVM is focused on heavy inlining, which while very useful, you'll lose a lot of the interprocedural information.<br>Note that there are other transforms that do Inter-Procedural Optimization (<a href="https://github.com/llvm/llvm-project/tree/master/llvm/lib/Transforms/IPO" target="_blank">https://github.com/llvm/llvm-project/tree/master/llvm/lib/Transforms/IPO</a>) but they don't follow the idea of the Attributor.<br>But they might follow a fix-point analysis.<br><br><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">> Improve dynamic memory related capabilities of Attributor. For example Improve </span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;font-weight:700;vertical-align:baseline">HeapToStackConversions</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">. Maybe such deductions can help safety (dis)provers. For example, can we improve the </span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;font-weight:700;vertical-align:baseline">use-after-free bug detection</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline"> using some attributes?
</span><br>Stefan should know more about H2S. Regarding the use-after-free, I don't think there's currently any plans for it directly, but they can be I assume.<br><br>> <span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">Improve Liveness related capabilities of Attributor. Again I want to consider whether some attribute deduction can help liveness (dis)provers. For example </span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;font-weight:700;vertical-align:baseline">NoReturn, WillReturn</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline"> can be improved. I am sure these 2 attributes do not cover all the cases as it is an undecidable problem. But I was wondering whether there is room for improvement in their deduction mechanism.

Liveness is certainly something that we're currently trying to improve and I don't think we'll ever stop. Most of the attributes interact with the deadness attribute (AAIsDead) both for asking it info and
providing it info (i.e. the undefined-behavior attribute hopefully will at some point be able to tell AAIsDead that a block is dead because it contains UB).

> </span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline">Is there any attribute that tells whether a function has </span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;font-weight:700;vertical-align:baseline">side-effects</span><span style="color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre-wrap;background-color:transparent;vertical-align:baseline"> (does it always gives the same output for the same input? Or does it affect some global variable directly or indirectly?)?

No AFAIK, although you might be interested in this: </span><a href="https://reviews.llvm.org/D74691#1887983" target="_blank">https://reviews.llvm.org/D74691#1887983</a><br><br>I hope this was helpful! Don't hesitate to ask any questions.<br><br>Kind regards,<br>Stefanos Baziotis</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Στις Παρ, 13 Μαρ 2020 στις 10:25 μ.μ., ο/η Fahad Nayyar via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> έγραψε:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Hi all,</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">My name is Fahad Nayyar. I am an undergraduate student from India. </span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">I am interested to participate in GSOC under the project </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">“Improve inter-procedural analyses and optimizations”. </span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">I have been using LLVM for the past 8 months. I have written various intra-procedural analysis in LLVM as FunctionPass for my course projects and research projects. But I’ve not contributed to the LLVM community yet. I am very excited to contribute to LLVM! </span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">I am not too familiar with the inter-procedural analysis infrastructure of LLVM. I have written small toy inter-procedural dataflow analysis (like taint analysis, reaching definitions, etc) for JAVA programs using SOOT tool <b>[5].</b> I am familiar with the theory of inter-procedural analysis (I’ve read some chapters of  </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[1]</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">,  </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[2] </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">and</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> [3]</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> for this).</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">I am trying to understand the LLVM’s </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Attributor framework</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">. I am interested in these 3 aspects:</span></p><ol style="margin-top:0px;margin-bottom:0px"><li dir="ltr" style="margin-left:15px;list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">How Attributor can help for standard inter-procedural and intra-procedural analysis passes of LLVm. I’ve seen the tutorial</span><span style="font-size:11pt;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline"> [4]</span><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">. I would like to discuss ways of improving other optimization passes similarly (or some examples which have already been implemented).</span></p></li><li dir="ltr" style="margin-left:15px;list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">Improve dynamic memory related capabilities of Attributor. For example Improve </span><span style="font-size:11pt;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">HeapToStackConversions</span><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">. Maybe such deductions can help safety (dis)provers. For example, can we improve the </span><span style="font-size:11pt;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">use-after-free bug detection</span><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline"> using some attributes?</span></p></li><li dir="ltr" style="margin-left:15px;list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">Improve Liveness related capabilities of Attributor. Again I want to consider whether some attribute deduction can help liveness (dis)provers. For example </span><span style="font-size:11pt;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">NoReturn, WillReturn</span><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline"> can be improved. I am sure these 2 attributes do not cover all the cases as it is an undecidable problem. But I was wondering whether there is room for improvement in their deduction mechanism.</span></p></li><li dir="ltr" style="margin-left:15px;list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">Can we optimize the attribute deduction algorithm to reduce compile time?</span></p></li><li dir="ltr" style="margin-left:15px;list-style-type:decimal;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">Is there any attribute that tells whether a function has </span><span style="font-size:11pt;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline">side-effects</span><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline"> (does it always gives the same output for the same input? Or does it affect some global variable directly or indirectly?)?</span></p></li></ol><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">It would be great if Johannes can provide me some TODOs before submitting my proposal. Also please tell some specific IPO improvement goals which you have in mind for this project. I would be most interested in memory-related attributes, liveness deductions from attributes and measurable better IPO using attribute deduction.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Thanks and Regards.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">References:</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[1] </span><a href="https://www.springer.com/gp/book/9783540654100" style="text-decoration-line:none" target="_blank"><span style="font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">Principles of Program Analysis.</span></a></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[2] </span><a href="https://dl.acm.org/doi/book/10.5555/1592955" style="text-decoration-line:none" target="_blank"><span style="font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">Data Flow Analysis: Theory and Practice.</span></a></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[3] </span><a href="https://cs.au.dk/~amoeller/spa/spa.pdf" style="text-decoration-line:none" target="_blank"><span style="font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">Static Program Analysis.</span></a></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">[4] </span><a href="https://www.youtube.com/watch?v=HVvvCSSLiTw" style="text-decoration-line:none" target="_blank"><span style="font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">2019 LLVM Developers’ Meeting: J. Doerfert “The Attributor: A Versatile Inter-procedural Fixpoint.."</span></a></p><span style="font-variant-numeric:normal;font-variant-east-asian:normal;background-color:transparent;font-size:11pt;font-family:Arial;color:rgb(0,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap">[5] </span><a href="https://github.com/Sable/soot" style="text-decoration-line:none" target="_blank"><span style="font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">Soot - A Java optimization framework</span></a><br><br><br><br><img width="0" height="0" alt="" style="display: flex;" src="https://mailtrack.io/trace/mail/aa76e56e0fea3354c19b094874221a1a5076d654.png?u=2246830"></div>
_______________________________________________<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" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</blockquote></div>