Add mfasr and mtasr
[oota-llvm.git] / unittests / ExecutionEngine / JIT / IntelJITEventListenerTest.cpp
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);