Home | History | Annotate | Download | only in JIT
      1 //===- JITEventListenerTest.cpp - Tests for Intel JITEventListener --------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "JITEventListenerTestCommon.h"
     11 
     12 using namespace llvm;
     13 
     14 // Because we want to keep the implementation details of the Intel API used to
     15 // communicate with Amplifier out of the public header files, the header below
     16 // is included from the source tree instead.
     17 #include "../../../lib/ExecutionEngine/IntelJITEvents/IntelJITEventsWrapper.h"
     18 
     19 #include <map>
     20 #include <list>
     21 
     22 namespace {
     23 
     24 // map of function ("method") IDs to source locations
     25 NativeCodeMap ReportedDebugFuncs;
     26 
     27 } // namespace
     28 
     29 /// Mock implementaion of Intel JIT API jitprofiling library
     30 namespace test_jitprofiling {
     31 
     32 int NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {
     33   switch (EventType) {
     34     case iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED: {
     35       EXPECT_TRUE(0 != EventSpecificData);
     36       iJIT_Method_Load* msg = static_cast<iJIT_Method_Load*>(EventSpecificData);
     37 
     38       ReportedDebugFuncs[msg->method_id];
     39 
     40       for(unsigned int i = 0; i < msg->line_number_size; ++i) {
     41         EXPECT_TRUE(0 != msg->line_number_table);
     42         std::pair<std::string, unsigned int> loc(
     43           std::string(msg->source_file_name),
     44           msg->line_number_table[i].LineNumber);
     45         ReportedDebugFuncs[msg->method_id].push_back(loc);
     46       }
     47     }
     48     break;
     49     case iJVM_EVENT_TYPE_METHOD_UNLOAD_START: {
     50       EXPECT_TRUE(0 != EventSpecificData);
     51       unsigned int UnloadId
     52         = *reinterpret_cast<unsigned int*>(EventSpecificData);
     53       EXPECT_TRUE(1 == ReportedDebugFuncs.erase(UnloadId));
     54     }
     55     default:
     56       break;
     57   }
     58   return 0;
     59 }
     60 
     61 iJIT_IsProfilingActiveFlags IsProfilingActive(void) {
     62   // for testing, pretend we have an Intel Parallel Amplifier XE 2011
     63   // instance attached
     64   return iJIT_SAMPLING_ON;
     65 }
     66 
     67 unsigned int GetNewMethodID(void) {
     68   static unsigned int id = 0;
     69   return ++id;
     70 }
     71 
     72 } //namespace test_jitprofiling
     73 
     74 class IntelJITEventListenerTest
     75   : public JITEventListenerTestBase<IntelJITEventsWrapper> {
     76 public:
     77   IntelJITEventListenerTest()
     78   : JITEventListenerTestBase<IntelJITEventsWrapper>(
     79       new IntelJITEventsWrapper(test_jitprofiling::NotifyEvent, 0,
     80         test_jitprofiling::IsProfilingActive, 0, 0,
     81         test_jitprofiling::GetNewMethodID))
     82   {
     83     EXPECT_TRUE(0 != MockWrapper);
     84 
     85     Listener.reset(JITEventListener::createIntelJITEventListener(
     86       MockWrapper.release()));
     87     EXPECT_TRUE(0 != Listener);
     88     EE->RegisterJITEventListener(Listener.get());
     89   }
     90 };
     91 
     92 TEST_F(IntelJITEventListenerTest, NoDebugInfo) {
     93   TestNoDebugInfo(ReportedDebugFuncs);
     94 }
     95 
     96 TEST_F(IntelJITEventListenerTest, SingleLine) {
     97   TestSingleLine(ReportedDebugFuncs);
     98 }
     99 
    100 TEST_F(IntelJITEventListenerTest, MultipleLines) {
    101   TestMultipleLines(ReportedDebugFuncs);
    102 }
    103 
    104 // This testcase is disabled because the Intel JIT API does not support a single
    105 // JITted function with source lines associated with multiple files
    106 /*
    107 TEST_F(IntelJITEventListenerTest, MultipleFiles) {
    108   TestMultipleFiles(ReportedDebugFuncs);
    109 }
    110 */
    111 
    112 testing::Environment* const jit_env =
    113   testing::AddGlobalTestEnvironment(new JITEnvironment);
    114