<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 14 (filtered medium)">
<style><!--
/* Font Definitions */
@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;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
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">Thanks for the review, Jim. We’re looking into it, and will be in touch!<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"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<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""> Jim Grosbach [mailto:grosbach@apple.com]
<br>
<b>Sent:</b> Wednesday, February 15, 2012 04:00<br>
<b>To:</b> Bendersky, Eli<br>
<b>Cc:</b> llvm-commits@cs.uiuc.edu LLVM; Chris Lattner<br>
<b>Subject:</b> Re: [llvm-commits] [PATCH] JIT profiling support with Intel Parallel Amplifier XE 2011 (VTune)<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi Eli,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This all looks pretty reasonable, although I confess I'm no expert on the Intel profiling libs.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Can you elaborate on why the support is a configure time option? I assume it's due to reference Intel headers and such? Assuming so, or something along those lines, we should not build the source files for the support at all when it's not
 configured, rather than using #if inside the files. That is, building the code or not should be handled by the build system, not via macros in the source. Specifically, I'd really like to avoid things like "#if USE_OPROFILE" around the contents of a .cpp file.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Specific, mostly just nitty details, comments inline. I'll generally explicitly comment only comment on the first instance of any recurring patterns to avoid bloating the email more than necessary. Please do go through and look for additional
 instances, though. Please format to fit within 80 columns. I'm seeing lots of lines longer than that in the patch. Likewise, there's a bit of trailing whitespace that should be removed. Mostly indentation on blank lines.<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">Lots of this is style stuff. See <a href="http://llvm.org/docs/CodingStandards.html">http://llvm.org/docs/CodingStandards.html</a> for the gory details.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">(Chris: context sensitive question for you in the body of "OProfileWrapper")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  Jim<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">ps, I still owe you a couple more emails on other JIT related stuff. Haven't forgotten!<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#ifndef INTEL_JIT_EVENTS_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define INTEL_JIT_EVENTS_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "jitprofiling.h"</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This should use the <> style include since the file isn't in the current directory.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Function pointer types for testing implementation of Intel jitprofiling</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// library</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef int (*NotifyEventPtr)(iJIT_JVM_EVENT, void*);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef void (*RegisterCallbackExPtr)(void *, iJIT_ModeChangedEx );</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef iJIT_IsProfilingActiveFlags (*IsProfilingActivePtr)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef void (*FinalizeThreadPtr)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef void (*FinalizeProcessPtr)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef unsigned int (*GetNewMethodIDPtr)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">These should be members of the IntelJITEventsWrapper class, not out in the general llvm namespace.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class IntelJITEventsWrapper {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  NotifyEventPtr NotifyEventFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  RegisterCallbackExPtr RegisterCallbackExFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IsProfilingActivePtr IsProfilingActiveFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  FinalizeThreadPtr FinalizeThreadFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  FinalizeProcessPtr FinalizeProcessFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  GetNewMethodIDPtr GetNewMethodIDFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Some brief comments on what these are for those not as familiar with the profiler would be awesome. Not a big deal, would just be a nice addition if it's not too much trouble.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool IsAmplifierRunning() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Function names start with a lower case letter.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">On a side note, yes LLVM is very inconsistent about this at the moment. It's a recent(ish) change to the standards and the codebase hasn't been fully migrated over yet.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+    return IsProfilingActive() == iJIT_SAMPLING_ON;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IntelJITEventsWrapper()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : NotifyEventFunc(::iJIT_NotifyEvent)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , RegisterCallbackExFunc(::iJIT_RegisterCallbackEx)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , IsProfilingActiveFunc(::iJIT_IsProfilingActive)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , FinalizeThreadFunc(::FinalizeThread)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , FinalizeProcessFunc(::FinalizeProcess)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , GetNewMethodIDFunc(::iJIT_GetNewMethodID) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IntelJITEventsWrapper(NotifyEventPtr notify_event_impl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                   RegisterCallbackExPtr register_callback_ex_impl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                   IsProfilingActivePtr is_profiling_active_impl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                   FinalizeThreadPtr finalize_thread_impl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                   FinalizeProcessPtr finalize_process_impl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                   GetNewMethodIDPtr get_new_method_id_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : NotifyEventFunc(notify_event_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , RegisterCallbackExFunc(register_callback_ex_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , IsProfilingActiveFunc(is_profiling_active_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , FinalizeThreadFunc(finalize_thread_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , FinalizeProcessFunc(finalize_process_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , GetNewMethodIDFunc(get_new_method_id_impl) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Commas on preceding line, not at the start of the next line.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int  NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 == NotifyEventFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">LLVM style is to put the constant value on the right hand side and use the compiler warnings to catch inadvertant misuse of the assignment vs. the comparison operators.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">For NULL comparisons of pointers, it's OK to just have "if (ptrval)" as well.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+      return -1;</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">When there's only a single statement, in particular a single line statement, following an 'if', 'for', 'while', et. al., LLVM style is to not use a compound statement unless necessary to make control flow (nested 'if' statements, e.g.)
 clear.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+    } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">No need to have this in an 'else' clause at all since the 'true' clause doesn't fall through.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">i.e., something like:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">int NotifyEvent(…) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  if (NotifyEventFunc)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    return -1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  return NotifiyEventFunc(…);<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">Similarly for the other functions.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+      return NotifyEventFunc(EventType, EventSpecificData);'</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I gather the normal function returns more than just a success/failure code? If it's just a zero/non-zero for success vs. failure like lots of C interfaces, we should convert that to a bool for LLVM's C++ wrappers.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void RegisterCallbackEx(void *userdata, iJIT_ModeChangedEx NewModeCallBackFuncEx) {</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">"userdata" should be "UserData". Camelcase variable names starting w/ a capital.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 != RegisterCallbackExFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      RegisterCallbackExFunc(userdata, NewModeCallBackFuncEx);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  iJIT_IsProfilingActiveFlags IsProfilingActive(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 == IsProfilingActiveFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // No jitprofiling library connection, so report nothing running</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      return iJIT_NOTHING_RUNNING;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      return IsProfilingActiveFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void FinalizeThread(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 != FinalizeThreadFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      FinalizeThreadFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void FinalizeProcess(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 != FinalizeProcessFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      FinalizeProcessFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  unsigned int GetNewMethodID(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 == GetNewMethodIDFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      return GetNewMethodIDFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} //namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //INTEL_JIT_EVENTS_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/include/llvm/ExecutionEngine/JITEventListener.h b/include/llvm/ExecutionEngine/JITEventListener.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 94212e1..b41ab79 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- a/include/llvm/ExecutionEngine/JITEventListener.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/include/llvm/ExecutionEngine/JITEventListener.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -74,9 +74,22 @@ public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   virtual void NotifyFreeingMachineCode(void *) {}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> };</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// This returns NULL if support isn't available.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Construct an OProfileJITEventListener</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> JITEventListener *createOProfileJITEventListener();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Construct an IntelJITEventListener</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class OProfileWrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Forward class declarations should go at the top of the header file, not interspersed throughout immediately prior to usage.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Construct an OProfileJITEventListener with a test opagent implementation</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createOProfileJITEventListener(OProfileWrapper* alternativeImpl);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class IntelJITEventsWrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Construct an IntelJITEventListener with a test Intel JIT API implementation</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener(IntelJITEventsWrapper* alternativeImpl);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">It strikes me that these might be better as static method on the relevant classes, if that's possible. i.e.,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">JITEventListener *OProfileWrapper::Create(…);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I don't know the details of how these are used well enough to know for sure, but that would be good if it's a reasonable alternative.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black"> } // end namespace llvm.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #endif</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/include/llvm/ExecutionEngine/OProfileWrapper.h b/include/llvm/ExecutionEngine/OProfileWrapper.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..a7533ee</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/include/llvm/ExecutionEngine/OProfileWrapper.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,118 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===-- OProfileWrapper.h - OProfile JIT API Wrapper -------------*- C++ -*-===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file defines a OProfileWrapper object that detects if the oprofile</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// daemon is running, and provides wrappers for opagent functions used to</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// communicate with the oprofile JIT interface. The dynamic library libopagent</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// does not need to be linked directly as this object lazily loads the library</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// when the first op_ function is called.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// See <a href="http://oprofile.sourceforge.net/doc/devel/jit-interface.html">
http://oprofile.sourceforge.net/doc/devel/jit-interface.html</a> for the</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// definition of the interface.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#ifndef OPROFILE_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define OPROFILE_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <stdint.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <opagent.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  op_agent_t    (*op_open_agent_ptr_t)();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  int           (*op_close_agent_ptr_t)(op_agent_t);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  int           (*op_write_native_code_ptr_t)(op_agent_t, const char*, uint64_t, void const*, const unsigned int);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  int           (*op_write_debug_line_info_ptr_t)(op_agent_t, void const*, size_t, struct debug_line_info const*);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  int           (*op_unload_native_code_ptr_t)(op_agent_t, uint64_t);</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Move into the OProfileWrapper class. Change to adhere to the LLVM naming conventions. (see below)<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Also used for op_minor_version function which has the same signature</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  int           (*op_major_version_ptr_t)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This is not a part of the opagent API, but is useful nonetheless</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef  bool          (*IsOProfileRunningPtrT)(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class OProfileWrapper {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_agent_t                      Agent;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_open_agent_ptr_t             OpenAgentFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_close_agent_ptr_t            CloseAgentFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_write_native_code_ptr_t      WriteNativeCodeFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_write_debug_line_info_ptr_t  WriteDebugLineInfoFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_unload_native_code_ptr_t     UnloadNativeCodeFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_major_version_ptr_t          MajorVersionFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  op_major_version_ptr_t          MinorVersionFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IsOProfileRunningPtrT           IsOProfileRunningFunc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool Initialized;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OProfileWrapper();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  //For testing with a mock opagent implementation, skips the dynamic load and the function</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  //resolution.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OProfileWrapper(op_open_agent_ptr_t OpenAgentImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_close_agent_ptr_t CloseAgentImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_write_native_code_ptr_t WriteNativeCodeImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_write_debug_line_info_ptr_t WriteDebugLineInfoImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_unload_native_code_ptr_t UnloadNativeCodeImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_major_version_ptr_t MajorVersionImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  op_major_version_ptr_t MinorVersionImpl,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                  IsOProfileRunningPtrT MockIsOProfileRunningImpl = 0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : OpenAgentFunc(OpenAgentImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , CloseAgentFunc(CloseAgentImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , WriteNativeCodeFunc(WriteNativeCodeImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , WriteDebugLineInfoFunc(WriteDebugLineInfoImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , UnloadNativeCodeFunc(UnloadNativeCodeImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , MajorVersionFunc(MajorVersionImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , MinorVersionFunc(MinorVersionImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , IsOProfileRunningFunc(MockIsOProfileRunningImpl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , Initialized(true)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Calls op_open_agent in the oprofile JIT library and saves the returned op_agent_t</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // handle internally so it can be used when calling all the other op_* functions. Callers</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // of this class do not need to keep track of op_agent_t objects.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool open_agent();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int close_agent();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int write_native_code(const char* name,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                        uint64_t addr,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                        void const* code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                        const unsigned int size);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int write_debug_line_info(void const* code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                            size_t num_entries,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                            struct debug_line_info const* info);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int unload_native_code(uint64_t addr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int major_version(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int minor_version(void);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Returns true if the oprofiled process is running, the opagent library is loaded</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // and a connection to the agent has been established, and false otherwise.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool have_agent();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">These are wrappers for API functions of the same names in the Intel library, I gather? I can see why that would be clearer to have them be identical even though it means the names aren't following the LLVM conventions. I don't have a strong
 opinion either way. Chris will be better able to guide us here.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+private:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Loads the libopagent library and initializes this wrapper if the oprofile</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // daemon is running</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Searches /proc for the oprofile daemon and returns true if the process if</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // found, or false otherwise.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool CheckForOProfileProcEntry();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  bool IsOProfileRunning();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //OPROFILE_WRAPPER_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/lib/ExecutionEngine/JIT/EventListenerCommon.h b/lib/ExecutionEngine/JIT/EventListenerCommon.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..9ef71cd</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/lib/ExecutionEngine/JIT/EventListenerCommon.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,63 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===-- JIT.h - Abstract Execution Engine Interface -------------*- C++ -*-===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Common functionality for JITEventListener implementations</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#ifndef EVENT_LISTENER_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define EVENT_LISTENER_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Metadata.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Analysis/DebugInfo.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ADT/DenseMap.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/ValueHandle.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Path.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class FilenameCache {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This should probably either get a less generic name since it's in a header now, or, probably better, be put in a dedicated profiler namespace.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+  // Holds the filename of each Scope, so that we can pass a null-terminated</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // string into oprofile.  Use an AssertingVH rather than a ValueMap because we</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // shouldn't be modifying any MDNodes while this map is alive.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  DenseMap<AssertingVH<MDNode>, std::string> Filenames;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  DenseMap<AssertingVH<MDNode>, std::string> Paths;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+ public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  const char *getFilename(MDNode *Scope) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    std::string &Filename = Filenames[Scope];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (Filename.empty()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      DIScope di_scope(Scope);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      Filename = di_scope.getFilename();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return Filename.c_str();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  const char *getFullPath(MDNode *Scope) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    std::string &P = Paths[Scope];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (P.empty()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      DIScope di_scope(Scope);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      StringRef dir_name = di_scope.getDirectory();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      StringRef file_name = di_scope.getFilename();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      SmallString<256> full_path;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      if (dir_name != "." && dir_name != "") {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        full_path = dir_name;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      if (file_name != "") {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        sys::path::append(full_path, file_name);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      P = full_path.str();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return P.c_str();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //EVENT_LISTENER_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/lib/ExecutionEngine/JIT/IntelJITEventListener.cpp b/lib/ExecutionEngine/JIT/IntelJITEventListener.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..b77017c</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/lib/ExecutionEngine/JIT/IntelJITEventListener.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,201 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===-- IntelJITEventListener.cpp - Tell Parallel Amplifier XE about JITted code ----===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file defines a JITEventListener object to tell Intel(R) VTune(TM)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Amplifier XE 2011 about JITted functions.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Config/config.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_INTEL_JITEVENTS</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define DEBUG_TYPE "amplifier-jit-event-listener"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Function.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Metadata.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ADT/DenseMap.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ADT/OwningPtr.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Analysis/DebugInfo.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/CodeGen/MachineFunction.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/IntelJITEventsWrapper.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/JITEventListener.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Debug.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/raw_ostream.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Errno.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/ValueHandle.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "EventListenerCommon.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class IntelJITEventListener : public JITEventListener {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  typedef DenseMap<void*, unsigned int> method_id_map_t;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IntelJITEventsWrapper& Wrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  method_id_map_t MethodIDs;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  FilenameCache Filenames;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IntelJITEventListener(IntelJITEventsWrapper& libraryWrapper)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : Wrapper(libraryWrapper) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  ~IntelJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  virtual void NotifyFunctionEmitted(const Function &F,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                     void *FnStart, size_t FnSize,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                     const EmittedFunctionDetails &Details);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  virtual void NotifyFreeingMachineCode(void *OldPtr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+static LineNumberInfo LineStartToIntelJITFormat(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    uintptr_t StartAddress,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    uintptr_t Address,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugLoc Loc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  LineNumberInfo Result;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.Offset = Address - StartAddress;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.LineNumber = Loc.getLine();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return Result;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+static iJIT_Method_Load FunctionDescToIntelJITFormat(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    IntelJITEventsWrapper& Wrapper,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    const char* FnName,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    uintptr_t FnStart,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    size_t FnSize) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  iJIT_Method_Load Result;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  memset(&Result, 0, sizeof(iJIT_Method_Load));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.method_id = Wrapper.GetNewMethodID();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.method_name = const_cast<char*>(FnName);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.method_load_address = reinterpret_cast<void*>(FnStart);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.method_size = FnSize;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.class_id = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.class_file_name = NULL;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.user_data = NULL;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.user_data_size = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Result.env = iJDE_JittingAPI;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return Result;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Adds the just-emitted function to the symbol table.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+void IntelJITEventListener::NotifyFunctionEmitted(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    const Function &F, void *FnStart, size_t FnSize,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    const EmittedFunctionDetails &Details) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  iJIT_Method_Load functionMessage = FunctionDescToIntelJITFormat(Wrapper,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                      F.getName().data(),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                      reinterpret_cast<uint64_t>(FnStart),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                      FnSize);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  std::vector<LineNumberInfo> LineInfo;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Details.LineStarts.empty()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    // Now convert the line number information from the address/DebugLoc</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    // format in Details to the offset/lineno in Intel JIT API format.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    LineInfo.reserve(Details.LineStarts.size() + 1);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugLoc FirstLoc = Details.LineStarts[0].Loc;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    assert(!FirstLoc.isUnknown()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+           && "LineStarts should not contain unknown DebugLocs");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    MDNode *FirstLocScope = FirstLoc.getScope(F.getContext());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DISubprogram FunctionDI = getDISubprogram(FirstLocScope);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (FunctionDI.Verify()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      functionMessage.source_file_name = const_cast<char*>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                          Filenames.getFullPath(FirstLocScope));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      LineNumberInfo first_line;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      first_line.Offset = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      first_line.LineNumber = FunctionDI.getLineNumber();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      LineInfo.push_back(first_line);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    for (std::vector<EmittedFunctionDetails::LineStart>::const_iterator I =</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          Details.LineStarts.begin(), E = Details.LineStarts.end();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          I != E; ++I) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // This implementation ignores the DebugLoc filename because the Intel</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // JIT API does not support multiple source files associated with a single</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // JIT function</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      LineInfo.push_back(LineStartToIntelJITFormat(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                          reinterpret_cast<uintptr_t>(FnStart),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                          I->Address,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                          I->Loc));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // If we have no file name yet for the function, use the filename from</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // the first instruction that has one</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      if (0 == functionMessage.source_file_name) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        MDNode* scope = I->Loc.getScope(Details.MF->getFunction()->getContext());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        functionMessage.source_file_name = const_cast<char*>(Filenames.getFullPath(scope));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    functionMessage.line_number_size = LineInfo.size();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    functionMessage.line_number_table = &*LineInfo.begin();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    functionMessage.line_number_size = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    functionMessage.line_number_table = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  Wrapper.NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, &functionMessage);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  MethodIDs[FnStart] = functionMessage.method_id;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+void IntelJITEventListener::NotifyFreeingMachineCode(void *FnStart) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  method_id_map_t::iterator i = MethodIDs.find(FnStart);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (i != MethodIDs.end()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Wrapper.NotifyEvent(iJVM_EVENT_TYPE_METHOD_UNLOAD_START, &i->second);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    MethodIDs.erase(i);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}  // anonymous namespace.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  static OwningPtr<IntelJITEventsWrapper> jitprofilingWrapper(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                            new IntelJITEventsWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return new IntelJITEventListener(*jitprofilingWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// for testing</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener(IntelJITEventsWrapper* test_impl) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return new IntelJITEventListener(*test_impl);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#else  // USE_INTEL_JITEVENTS</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class IntelJITEventsWrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class JITEventListener;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// By defining this to return NULL, we can let clients call it unconditionally,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// even if they haven't configured the build with the Intel JIT API support</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createIntelJITEventListener(IntelJITEventsWrapper* test_impl) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}  // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif  // USE_INTEL_JITEVENTS</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp b/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 9a9ed6d..803b475 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- a/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -7,51 +7,56 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> //</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> //===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> //</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// This file defines a JITEventListener object that calls into OProfile to tell</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// it about JITted functions.  For now, we only record function names and sizes,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// but eventually we'll also record line number information.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// See <a href="http://oprofile.sourceforge.net/doc/devel/jit-interface.html">
http://oprofile.sourceforge.net/doc/devel/jit-interface.html</a> for the</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// definition of the interface we're using.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file defines a JITEventListener object that uses OProfileWrapper to tell</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// oprofile about JITted functions, including source line information.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> //</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> //===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Config/config.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #define DEBUG_TYPE "oprofile-jit-event-listener"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/Function.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include "llvm/Metadata.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include "llvm/ADT/DenseMap.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ADT/OwningPtr.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/Analysis/DebugInfo.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/CodeGen/MachineFunction.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/ExecutionEngine/JITEventListener.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/OProfileWrapper.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/Support/Debug.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include "llvm/Support/ValueHandle.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/Support/raw_ostream.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #include "llvm/Support/Errno.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include "llvm/Config/config.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include <stddef.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "EventListenerCommon.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#if USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <dirent.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <fcntl.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-#include <opagent.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> namespace {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> class OProfileJITEventListener : public JITEventListener {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  op_agent_t Agent;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OProfileWrapper& Wrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  OProfileJITEventListener();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OProfileJITEventListener(OProfileWrapper& libraryWrapper)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : Wrapper(libraryWrapper) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   ~OProfileJITEventListener();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   virtual void NotifyFunctionEmitted(const Function &F,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">                                      void *FnStart, size_t FnSize,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-                                     const EmittedFunctionDetails &Details);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                     const JITEvent_EmittedFunctionDetails &Details);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   virtual void NotifyFreeingMachineCode(void *OldPtr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> };</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-OProfileJITEventListener::OProfileJITEventListener()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    : Agent(op_open_agent()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  if (Agent == NULL) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+void OProfileJITEventListener::initialize() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Wrapper.open_agent()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     const std::string err_str = sys::StrError();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     DEBUG(dbgs() << "Failed to connect to OProfile agent: " << err_str << "\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -60,8 +65,8 @@ OProfileJITEventListener::OProfileJITEventListener()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> OProfileJITEventListener::~OProfileJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  if (Agent != NULL) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    if (op_close_agent(Agent) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Wrapper.have_agent()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (Wrapper.close_agent() == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">       const std::string err_str = sys::StrError();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">       DEBUG(dbgs() << "Failed to disconnect from OProfile agent: "</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">                    << err_str << "\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -71,22 +76,6 @@ OProfileJITEventListener::~OProfileJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-class FilenameCache {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  // Holds the filename of each Scope, so that we can pass a null-terminated</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  // string into oprofile.  Use an AssertingVH rather than a ValueMap because we</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  // shouldn't be modifying any MDNodes while this map is alive.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  DenseMap<AssertingVH<MDNode>, std::string> Filenames;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">- public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  const char *getFilename(MDNode *Scope) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    std::string &Filename = Filenames[Scope];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    if (Filename.empty()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-      Filename = DIScope(Scope).getFilename();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    return Filename.c_str();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> static debug_line_info LineStartToOProfileFormat(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     const MachineFunction &MF, FilenameCache &Filenames,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     uintptr_t Address, DebugLoc Loc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -103,9 +92,9 @@ static debug_line_info LineStartToOProfileFormat(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> // Adds the just-emitted function to the symbol table.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> void OProfileJITEventListener::NotifyFunctionEmitted(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     const Function &F, void *FnStart, size_t FnSize,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    const EmittedFunctionDetails &Details) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    const JITEvent_EmittedFunctionDetails &Details) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   assert(F.hasName() && FnStart != 0 && "Bad symbol to add");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  if (op_write_native_code(Agent, F.getName().data(),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Wrapper.write_native_code(F.getName().data(),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">                            reinterpret_cast<uint64_t>(FnStart),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">                            FnStart, FnSize) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     DEBUG(dbgs() << "Failed to tell OProfile about native function "</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -151,8 +140,8 @@ void OProfileJITEventListener::NotifyFunctionEmitted(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     // line info's address to include the start of the function.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     LineInfo[0].vma = reinterpret_cast<uintptr_t>(FnStart);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-    if (op_write_debug_line_info(Agent, FnStart,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-                                 LineInfo.size(), &*LineInfo.begin()) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (Wrapper.write_debug_line_info(FnStart, LineInfo.size(),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                                      &*LineInfo.begin()) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">       DEBUG(dbgs()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">             << "Failed to tell OProfile about line numbers for native function "</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">             << F.getName() << " at ["</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -164,7 +153,7 @@ void OProfileJITEventListener::NotifyFunctionEmitted(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> // Removes the being-deleted function from the symbol table.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> void OProfileJITEventListener::NotifyFreeingMachineCode(void *FnStart) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">   assert(FnStart && "Invalid function pointer");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  if (op_unload_native_code(Agent, reinterpret_cast<uint64_t>(FnStart)) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Wrapper.unload_native_code(reinterpret_cast<uint64_t>(FnStart)) == -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">     DEBUG(dbgs()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">           << "Failed to tell OProfile about unload of native function at "</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">           << FnStart << "\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -175,18 +164,38 @@ void OProfileJITEventListener::NotifyFreeingMachineCode(void *FnStart) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> JITEventListener *createOProfileJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  return new OProfileJITEventListener;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  static OwningPtr<OProfileWrapper> oprofileWrapper(new OProfileWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return new OProfileJITEventListener(*oprofileWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// for testing</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createOProfileJITEventListener(OProfileWrapper* test_impl) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return new OProfileJITEventListener(*test_impl);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #else  // USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class OProfileWrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class JITEventListener;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> // By defining this to return NULL, we can let clients call it unconditionally,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-// even if they haven't configured with the OProfile libraries.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-JITEventListener *createOProfileJITEventListener() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">-  return NULL;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// even if they haven't configured the build with the cmake option</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// LLVM_USE_OPROFILE (or configure flag --with-oprofile=)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createOProfileJITEventListener()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+JITEventListener *createOProfileJITEventListener(OProfileWrapper* test_impl)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> }  // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"> #endif  // USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/lib/ExecutionEngine/JIT/OProfileWrapper.cpp b/lib/ExecutionEngine/JIT/OProfileWrapper.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..251a7dd</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/lib/ExecutionEngine/JIT/OProfileWrapper.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,286 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===-- OProfileWrapper.cpp - OProfile JIT API Wrapper implementation -----===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file implements the interface in OProfileWrapper.h. It is responsible</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// for loading the opagent dynamic library when the first call to an op_</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// function occurs.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===----------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/OProfileWrapper.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define DEBUG_TYPE "oprofile-wrapper"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Debug.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/raw_ostream.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/DynamicLibrary.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Mutex.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/MutexGuard.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <sstream></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <cstring></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <stddef.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <dirent.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <sys/stat.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <fcntl.h></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Global mutex to ensure a single thread initializes oprofile agent.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+llvm::sys::Mutex OProfileInitializationMutex;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+template<typename TO, typename FROM></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TO bitwise_cast(FROM source) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  union {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    FROM src;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    TO dst;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } u;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  u.src = source;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return u.dst;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This is just used for the function pointers, so is way overkill. Plain vanilla casting is fine. Either C or C++ style.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+} // anonymous namespace</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace llvm {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+OProfileWrapper::OProfileWrapper()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+: Agent(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, OpenAgentFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, CloseAgentFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, WriteNativeCodeFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, WriteDebugLineInfoFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, UnloadNativeCodeFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, MajorVersionFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, MinorVersionFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, IsOProfileRunningFunc(0)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+, Initialized(false) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool OProfileWrapper::initialize() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  using namespace llvm::sys;</span><o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::MutexGuard guard(OProfileInitializationMutex);</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This probably doesn't need the "llvm::" since we just had the 'using' above.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return OpenAgentFunc != 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Initialized = true;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // If the oprofile daemon is not running, don't load the opagent library</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!IsOProfileRunning()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DEBUG(dbgs() << "OProfile daemon is not detected.\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  std::string error;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if(!DynamicLibrary::LoadLibraryPermanently("libopagent.so", &error)) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Is this support Linux only? I didn't see enforced in the configure script. If not, the name of the library is not always going to be this, most likely. If it is linux only, even just for now, the configure script should enforce that.<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="color:black">+    DEBUG(dbgs() << "OProfile connector library libopagent.so could not be loaded: "</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      << error << "\n");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Indent the "<<" to line up with the "<<" on the preceding line.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Get the addresses of the opagent functions</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OpenAgentFunc = bitwise_cast<op_open_agent_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_open_agent"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  CloseAgentFunc = bitwise_cast<op_close_agent_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_close_agent"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  WriteNativeCodeFunc = bitwise_cast<op_write_native_code_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_write_native_code"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  WriteDebugLineInfoFunc = bitwise_cast<op_write_debug_line_info_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_write_debug_line_info"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  UnloadNativeCodeFunc = bitwise_cast<op_unload_native_code_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_unload_native_code"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  MajorVersionFunc = bitwise_cast<op_major_version_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_major_version"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  MinorVersionFunc = bitwise_cast<op_major_version_ptr_t>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DynamicLibrary::SearchForAddressOfSymbol("op_minor_version"));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // With missing functions, we can do nothing</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!OpenAgentFunc</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    || !CloseAgentFunc</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    || !WriteNativeCodeFunc</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    || !WriteDebugLineInfoFunc</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    || !UnloadNativeCodeFunc) {</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Indent the operators to line up one character after the open-paren of the 'if'.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+    OpenAgentFunc = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    CloseAgentFunc = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    WriteNativeCodeFunc = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    WriteDebugLineInfoFunc = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    UnloadNativeCodeFunc = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return true;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool OProfileWrapper::IsOProfileRunning() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (IsOProfileRunningFunc != 0) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return IsOProfileRunningFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return CheckForOProfileProcEntry();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool OProfileWrapper::CheckForOProfileProcEntry() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  DIR* proc_dir;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  proc_dir = opendir("/proc");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!proc_dir) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Walk the /proc tree looking for the oprofile daemon</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  struct dirent* entry;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  while (0 != (entry = readdir(proc_dir))) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (entry->d_type == DT_DIR) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // Build a path from the current entry name</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      std::stringstream cmdline_fname;</span><o:p></o:p></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">LLVM uses a raw_svector_ostream writing to a SmallString for things like this.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+      cmdline_fname << "/proc/" << entry->d_name << "/cmdline";</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      // Open the cmdline file</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      int cmdline_fd = open(cmdline_fname.str().c_str(), S_IRUSR);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      if (cmdline_fd != -1) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        char    exename[PATH_MAX+1];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        char*   basename = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        // Read the cmdline file</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        ssize_t num_read = read(cmdline_fd, exename, PATH_MAX+1);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        close(cmdline_fd);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        ssize_t idx = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        // Find the terminator for the first string</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        while (idx < num_read-1 && exename[idx] != 0) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          idx++;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        // Go back to the last non-null character</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        idx--;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        // Find the last path separator in the first string</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        while (idx > 0) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          if (exename[idx] == '/') {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+            basename = exename + idx + 1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+            break;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          idx--;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        // Test this to see if it is the oprofile daemon</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        if (basename != 0 && !strcmp("oprofiled", basename)) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          // If it is, we're done</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          closedir(proc_dir);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          return true;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // We've looked through all the files and didn't find the daemon</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  closedir(proc_dir);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool OProfileWrapper::open_agent() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (OpenAgentFunc != 0) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Agent = OpenAgentFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return Agent != 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return false;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int OProfileWrapper::close_agent() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  int ret = -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && CloseAgentFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    ret = CloseAgentFunc(Agent);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (0 == ret) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      Agent = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return ret;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool OProfileWrapper::have_agent() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return Agent != 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int OProfileWrapper::write_native_code(const char* name, uint64_t addr, void const* code, unsigned int size) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && WriteNativeCodeFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return WriteNativeCodeFunc(Agent, name, addr, code, size);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int OProfileWrapper::write_debug_line_info(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void const* code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  size_t num_entries,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  struct debug_line_info const* info) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && WriteDebugLineInfoFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return WriteDebugLineInfoFunc(Agent, code, num_entries, info);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int OProfileWrapper::major_version() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && MajorVersionFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return MajorVersionFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int OProfileWrapper::minor_version() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && MinorVersionFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return MinorVersionFunc();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int  OProfileWrapper::unload_native_code(uint64_t addr) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (!Initialized) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    initialize();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  if (Agent && UnloadNativeCodeFunc) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return UnloadNativeCodeFunc(Agent, addr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  } else {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return -1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace llvm</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/unittests/ExecutionEngine/JIT/IntelJITEventListenerTest.cpp b/unittests/ExecutionEngine/JIT/IntelJITEventListenerTest.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..3eed428</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/unittests/ExecutionEngine/JIT/IntelJITEventListenerTest.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,111 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===- JITEventListenerTest.cpp - Tests for Intel JIT API Events JITEventListener --------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===------------------------------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "JITEventListenerTestCommon.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_INTEL_JITEVENTS</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/IntelJITEventsWrapper.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <map></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <list></span><o:p></o:p></p>
</div>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// map of function ("method") IDs to source locations</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+NativeCodeMap ReportedDebugFuncs;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+/// Mock implementaion of Intel JIT API jitprofiling library</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace test_jitprofiling {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  switch (EventType) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    case iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED: {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      EXPECT_TRUE(0 != EventSpecificData);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      iJIT_Method_Load* msg = static_cast<iJIT_Method_Load*>(EventSpecificData);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      ReportedDebugFuncs[msg->method_id];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      for(unsigned int i = 0; i < msg->line_number_size; ++i) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        EXPECT_TRUE(0 != msg->line_number_table);</span><o:p></o:p></p>
</div>
</blockquote>
</div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="color:black">+        std::pair<std::string, unsigned int> loc(std::string(msg->source_file_name),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          msg->line_number_table[i].LineNumber);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        ReportedDebugFuncs[msg->method_id].push_back(loc);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    break;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    case iJVM_EVENT_TYPE_METHOD_UNLOAD_START: {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      EXPECT_TRUE(0 != EventSpecificData);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      unsigned int UnloadId = *reinterpret_cast<unsigned int*>(EventSpecificData);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      EXPECT_TRUE(1 == ReportedDebugFuncs.erase(UnloadId));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    default:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      break;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+iJIT_IsProfilingActiveFlags IsProfilingActive(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // for testing, pretend we have an Intel Parallel Amplifier XE 2011 instance attached</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return iJIT_SAMPLING_ON;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+unsigned int GetNewMethodID(void) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  static unsigned int id = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return ++id;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} //namespace test_jitprofiling</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class IntelJITEventListenerTest</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : public JITEventListenerTestBase<IntelJITEventsWrapper> {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  IntelJITEventListenerTest()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : JITEventListenerTestBase<IntelJITEventsWrapper>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      new IntelJITEventsWrapper(test_jitprofiling::NotifyEvent, 0,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        test_jitprofiling::IsProfilingActive, 0, 0,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        test_jitprofiling::GetNewMethodID))</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != MockWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Listener.reset(createIntelJITEventListener(MockWrapper.get()));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != Listener);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->RegisterJITEventListener(Listener.get());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(IntelJITEventListenerTest, NoDebugInfo) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestNoDebugInfo(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(IntelJITEventListenerTest, SingleLine) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestSingleLine(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(IntelJITEventListenerTest, MultipleLines) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestMultipleLines(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This testcase is disabled because the Intel JIT API does not support a single</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// JITted function with source lines associated with multiple files</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+/*</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(IntelJITEventListenerTest, MultipleFiles) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestMultipleFiles(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+*/</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+testing::Environment* const jit_env =</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  testing::AddGlobalTestEnvironment(new JITEnvironment);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //USE_INTEL_JITEVENTS</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/unittests/ExecutionEngine/JIT/JITEventListenerTestCommon.h b/unittests/ExecutionEngine/JIT/JITEventListenerTestCommon.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..0067cd4</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/unittests/ExecutionEngine/JIT/JITEventListenerTestCommon.h</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,194 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===- JITEventListenerTestCommon.h- Common functionality in JITEventListener tests --------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===------------------------------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#ifndef JIT_EVENT_LISTENER_TEST_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#define JIT_EVENT_LISTENER_TEST_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Analysis/DIBuilder.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Analysis/DebugInfo.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/CodeGen/MachineCodeInfo.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Config/config.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/JIT.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/JITEventListener.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Instructions.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Module.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/IRBuilder.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/Dwarf.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/TypeBuilder.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/Support/TargetSelect.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "gtest/gtest.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <vector></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <string></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <utility></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef std::vector<std::pair<std::string, unsigned int> > SourceLocations;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef std::map<uint64_t, SourceLocations> NativeCodeMap;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class JITEnvironment : public testing::Environment {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  virtual void SetUp() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    // Required to create a JIT.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    llvm::InitializeNativeTarget();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+inline unsigned int getLine() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 12;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+inline unsigned int getCol() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+inline const char* getFilename() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return "mock_source_file.cpp";</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// Test fixture shared by tests for listener implementations</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+template<typename WrapperT></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class JITEventListenerTestBase : public testing::Test {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+protected:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::OwningPtr<WrapperT> MockWrapper;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::OwningPtr<llvm::JITEventListener> Listener;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::Module* M;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::MDNode* Scope;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::ExecutionEngine* EE;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::DIBuilder* DebugBuilder;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::IRBuilder<> Builder;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  JITEventListenerTestBase(WrapperT* w)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : MockWrapper(w)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , M(new llvm::Module("module", llvm::getGlobalContext()))</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , EE(llvm::EngineBuilder(M)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    .setEngineKind(llvm::EngineKind::JIT)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    .setOptLevel(llvm::CodeGenOpt::None)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    .create())</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , DebugBuilder(new llvm::DIBuilder(*M))</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , Builder(llvm::getGlobalContext())</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugBuilder->createCompileUnit(llvm::dwarf::DW_LANG_C_plus_plus, "JIT", "JIT", "JIT", true, "", 1);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Scope = DebugBuilder->createFile(getFilename(), ".");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  llvm::Function *buildFunction(const SourceLocations& DebugLocations) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    LLVMContext& GlobalContext = getGlobalContext();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations::const_iterator CurrentDebugLocation = DebugLocations.begin();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    if (CurrentDebugLocation != DebugLocations.end()) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      DebugLoc DebugLocation = DebugLoc::get(getLine(), getCol(),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DebugBuilder->createFile(CurrentDebugLocation->first, "."));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      Builder.SetCurrentDebugLocation(DebugLocation);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      CurrentDebugLocation++;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Function *Result = Function::Create(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        TypeBuilder<int32_t(int32_t), false>::get(GlobalContext),</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+        GlobalValue::ExternalLinkage, "id", M);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Value *Arg = Result->arg_begin();</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    BasicBlock *BB = BasicBlock::Create(M->getContext(), "entry", Result);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Builder.SetInsertPoint(BB);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Value* one = ConstantInt::get(GlobalContext, APInt(32, 1));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    for(; CurrentDebugLocation != DebugLocations.end(); ++CurrentDebugLocation) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      Arg = Builder.CreateMul(Arg, Builder.CreateAdd(Arg, one));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      Builder.SetCurrentDebugLocation(DebugLoc::get(CurrentDebugLocation->second, 0,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+          DebugBuilder->createFile(CurrentDebugLocation->first, ".")));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Builder.CreateRet(Arg);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    return Result;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void TestNoDebugInfo(NativeCodeMap& ReportedDebugFuncs) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations DebugLocations;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    llvm::Function* f = buildFunction(DebugLocations);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    //Cause JITting and callbacks to our listener</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != EE->getPointerToFunction(f));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(1 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->freeMachineCodeForFunction(f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void TestSingleLine(NativeCodeMap& ReportedDebugFuncs) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations DebugLocations;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugLocations.push_back(std::make_pair(std::string(getFilename()), getLine()));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    llvm::Function* f = buildFunction(DebugLocations);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != EE->getPointerToFunction(f));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(1 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_STREQ(ReportedDebugFuncs.begin()->second.begin()->first.c_str(), getFilename());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_EQ(ReportedDebugFuncs.begin()->second.begin()->second, getLine());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->freeMachineCodeForFunction(f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void TestMultipleLines(NativeCodeMap& ReportedDebugFuncs) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    using namespace std;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations DebugLocations;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    unsigned int c = 5;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    for(unsigned int i = 0; i < c; ++i) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      DebugLocations.push_back(make_pair(string(getFilename()), getLine() + i));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    llvm::Function* f = buildFunction(DebugLocations);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != EE->getPointerToFunction(f));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(1 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations& FunctionInfo = ReportedDebugFuncs.begin()->second;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_EQ(c, FunctionInfo.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    int VerifyCount = 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    for(SourceLocations::iterator i = FunctionInfo.begin(); i != FunctionInfo.end(); ++i) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      EXPECT_STREQ(i->first.c_str(), getFilename());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      EXPECT_EQ(i->second, getLine() + VerifyCount);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      VerifyCount++;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->freeMachineCodeForFunction(f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  void TestMultipleFiles(NativeCodeMap& ReportedDebugFuncs) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    std::string secondFilename("another_file.cpp");</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations DebugLocations;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugLocations.push_back(std::make_pair(std::string(getFilename()), getLine()));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    DebugLocations.push_back(std::make_pair(secondFilename, getLine()));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    llvm::Function* f = buildFunction(DebugLocations);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != EE->getPointerToFunction(f));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(1 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    SourceLocations& FunctionInfo = ReportedDebugFuncs.begin()->second;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(2 == FunctionInfo.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_STREQ(<a href="http://FunctionInfo.at">FunctionInfo.at</a>(0).first.c_str(), getFilename());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_STREQ(<a href="http://FunctionInfo.at">FunctionInfo.at</a>(1).first.c_str(), secondFilename.c_str());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_EQ(<a href="http://FunctionInfo.at">FunctionInfo.at</a>(0).second, getLine());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_EQ(<a href="http://FunctionInfo.at">FunctionInfo.at</a>(1).second, getLine());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->freeMachineCodeForFunction(f);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 == ReportedDebugFuncs.size());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //JIT_EVENT_LISTENER_TEST_COMMON_H</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">diff --git a/unittests/ExecutionEngine/JIT/OProfileJITEventListenerTest.cpp b/unittests/ExecutionEngine/JIT/OProfileJITEventListenerTest.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">new file mode 100644</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">index 0000000..de9b8d2</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">--- /dev/null</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+++ b/unittests/ExecutionEngine/JIT/OProfileJITEventListenerTest.cpp</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">@@ -0,0 +1,158 @@</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===- OProfileJITEventListenerTest.cpp - Unit tests for OProfileJITEventsListener --------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//                     The LLVM Compiler Infrastructure</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// This file is distributed under the University of Illinois Open Source</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+// License. See LICENSE.TXT for details.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+//===---------------------------------------------------------------------------===//</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#if USE_OPROFILE</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "llvm/ExecutionEngine/OProfileWrapper.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include "JITEventListenerTestCommon.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <map></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#include <list></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+using namespace llvm;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+struct OprofileNativeFunction {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  const char* Name;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  uint64_t Addr;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  const void* CodePtr;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  unsigned int CodeSize;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OprofileNativeFunction(const char* name,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                         uint64_t addr,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                         const void* code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+                         unsigned int size)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : Name(name)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , Addr(addr)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , CodePtr(code)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  , CodeSize(size) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef std::list<OprofileNativeFunction> NativeFunctionList;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+typedef std::list<debug_line_info> NativeDebugList;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+NativeFunctionList NativeFunctions;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+NativeCodeMap ReportedDebugFuncs;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} // namespace</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+/// Mock implementaion of opagent library</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+namespace test_opagent {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+op_agent_t globalAgent = reinterpret_cast<op_agent_t>(42);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+op_agent_t open_agent()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // return non-null op_agent_t</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return globalAgent;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int close_agent(op_agent_t agent)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_EQ(globalAgent, agent);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int write_native_code(op_agent_t agent, const char* name, uint64_t addr, void const* code, unsigned int size)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_EQ(globalAgent, agent);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OprofileNativeFunction func(name, addr, code, size);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  NativeFunctions.push_back(func);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  // Verify no other registration has take place for the same address</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_TRUE(ReportedDebugFuncs.find(addr) == ReportedDebugFuncs.end());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  ReportedDebugFuncs[addr];</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int write_debug_line_info(op_agent_t agent, void const* code, size_t num_entries, struct debug_line_info const* info)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_EQ(globalAgent, agent);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  //verify code has been loaded first</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  uint64_t addr = reinterpret_cast<uint64_t>(code);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_TRUE(i != ReportedDebugFuncs.end());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  NativeDebugList NativeInfo(info, info + num_entries);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  SourceLocations locs;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  for(NativeDebugList::iterator i = NativeInfo.begin(); i != NativeInfo.end(); ++i) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    locs.push_back(std::make_pair(std::string(i->filename), i->lineno));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  ReportedDebugFuncs[addr] = locs;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int unload_native_code(op_agent_t agent, uint64_t addr) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_EQ(globalAgent, agent);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  //verify that something for the given JIT addr has been loaded first</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  EXPECT_TRUE(i != ReportedDebugFuncs.end());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  ReportedDebugFuncs.erase(i);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 0;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+int version() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return 1;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+bool is_oprofile_running() {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  return true;</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+} //namespace test_opagent</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+class OProfileJITEventListenerTest : public JITEventListenerTestBase<OProfileWrapper></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+{</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+public:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  OProfileJITEventListenerTest()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  : JITEventListenerTestBase<OProfileWrapper>(</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    new OProfileWrapper(test_opagent::open_agent,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::close_agent,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::write_native_code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::write_debug_line_info,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::unload_native_code,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::version,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::version,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+      test_opagent::is_oprofile_running))</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != MockWrapper);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    Listener.reset(createOProfileJITEventListener(MockWrapper.get()));</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EXPECT_TRUE(0 != Listener);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+    EE->RegisterJITEventListener(Listener.get());</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(OProfileJITEventListenerTest, NoDebugInfo) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestNoDebugInfo(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(OProfileJITEventListenerTest, SingleLine) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestSingleLine(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(OProfileJITEventListenerTest, MultipleLines) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestMultipleLines(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+TEST_F(OProfileJITEventListenerTest, MultipleFiles) {</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  TestMultipleFiles(ReportedDebugFuncs);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+testing::Environment* const jit_env =</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+  testing::AddGlobalTestEnvironment(new JITEnvironment);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black">+#endif //USE_OPROFILE</span><o:p></o:p></p>
</div>
</blockquote>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Feb 13, 2012, at 10:02 PM, Bendersky, Eli wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal">Ping #3 !<br>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">-----Original Message-----<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">From: <a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a> [mailto:llvm-commits-<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Bendersky, Eli<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Sent: Wednesday, February 08, 2012 08:13<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">To: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Subject: Re: [llvm-commits] [PATCH] JIT profiling support with Intel Parallel<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Amplifier XE 2011 (VTune)<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Ping!<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">-----Original Message-----<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">From: <a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a> [mailto:llvm-commits-<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Bendersky, Eli<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Sent: Friday, February 03, 2012 05:18<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">To: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Subject: Re: [llvm-commits] [PATCH] JIT profiling support with Intel<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Parallel Amplifier XE 2011 (VTune)<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Ping!<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">-----Original Message-----<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">From: <a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a> [mailto:llvm-commits-<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Bendersky, Eli<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Sent: Tuesday, January 31, 2012 11:19<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">To: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Subject: [llvm-commits] [PATCH] JIT profiling support with Intel<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Parallel Amplifier XE 2011 (VTune)<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hello,<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Currently the only profiling LLVM JITted code support is via OProfile.<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">This patch adds profiling support for Intel Parallel Amplifier XE<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">2011 (used to be called "VTune"), does some refactoring to share<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">code between the implementations, and adds unit tests both for the<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">existing OProfile interface and the new Amplifier XE interface. In more<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">detail:<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">- Added Intel JIT Events API compatible JITEventListener, and allow<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">OProfileJITEventListener to load libopagent.so at runtime<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">- Removed link-time requirement on libopagent when building with<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">OProfile support<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">- Added Intel JIT API and OProfile support to cmake builds (Boolean<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">options LLVM_USE_OPROFILE and LLVM_USE_INTEL_JITEVENTS)<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">- Added IntelJITEventListener to connect to Intel JIT API (support<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">for profiling with Parallel Amplifier XE 2011)<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">- Added unit tests for both IntelJIT and OProfile JITEventListener<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">implementations which can still be run in the absence the respective<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">3rd party libraries<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">The change was broken into several patches. The first contains the<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">new implementation and tests. The others are build system changes to<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">incorporate the new code.<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">This is essentially similar to the patch sent by Daniel Malea in the<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">beginning of December, but which unfortunately hasn't received a<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">reply. We updated it to cleanly apply to SVN trunk.<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Please review<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Eli<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">--------------------------------------------------------------------<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">-<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Intel Israel (74) Limited<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">This e-mail and any attachments may contain confidential material<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">for the sole use of the intended recipient(s). Any review or<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">distribution by others is strictly prohibited. If you are not the<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">intended recipient, please contact the sender and delete all copies.<o:p></o:p></p>
</blockquote>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">---------------------------------------------------------------------<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Intel Israel (74) Limited<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">This e-mail and any attachments may contain confidential material for<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">the sole use of the intended recipient(s). Any review or distribution<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">by others is strictly prohibited. If you are not the intended<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">recipient, please contact the sender and delete all copies.<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">_______________________________________________<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">llvm-commits mailing list<o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</blockquote>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">---------------------------------------------------------------------<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Intel Israel (74) Limited<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">This e-mail and any attachments may contain confidential material for the<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">sole use of the intended recipient(s). Any review or distribution by others is<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">strictly prohibited. If you are not the intended recipient, please contact the<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">sender and delete all copies.<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><o:p> </o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">_______________________________________________<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">llvm-commits mailing list<o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><o:p></o:p></p>
</blockquote>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</blockquote>
<p class="MsoNormal">---------------------------------------------------------------------<br>
Intel Israel (74) Limited<br>
<br>
This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<font face="monospace">---------------------------------------------------------------------<br>
Intel Israel (74) Limited<br>
<br>
This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</font></body>
</html>