BumpPtrAllocator: don't accept 0 for the alignment parameter
[oota-llvm.git] / unittests / ExecutionEngine / JIT / OProfileJITEventListenerTest.cpp
1 //===- OProfileJITEventListenerTest.cpp - Unit tests for OProfileJITEventsListener --------===//
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 "llvm/ExecutionEngine/OProfileWrapper.h"
11 #include "JITEventListenerTestCommon.h"
12 #include "llvm/ExecutionEngine/JITEventListener.h"
13 #include <list>
14 #include <map>
15
16 using namespace llvm;
17
18 namespace {
19
20 struct OprofileNativeFunction {
21   const char* Name;
22   uint64_t Addr;
23   const void* CodePtr;
24   unsigned int CodeSize;
25
26   OprofileNativeFunction(const char* name,
27                          uint64_t addr,
28                          const void* code,
29                          unsigned int size)
30   : Name(name)
31   , Addr(addr)
32   , CodePtr(code)
33   , CodeSize(size) {
34   }
35 };
36
37 typedef std::list<OprofileNativeFunction> NativeFunctionList;
38 typedef std::list<debug_line_info> NativeDebugList;
39 NativeFunctionList NativeFunctions;
40
41 NativeCodeMap ReportedDebugFuncs;
42
43 } // namespace
44
45 /// Mock implementaion of opagent library
46 namespace test_opagent {
47
48 op_agent_t globalAgent = reinterpret_cast<op_agent_t>(42);
49
50 op_agent_t open_agent()
51 {
52   // return non-null op_agent_t
53   return globalAgent;
54 }
55
56 int close_agent(op_agent_t agent)
57 {
58   EXPECT_EQ(globalAgent, agent);
59   return 0;
60 }
61
62 int write_native_code(op_agent_t agent,
63                       const char* name,
64                       uint64_t addr,
65                       void const* code,
66                       unsigned int size)
67 {
68   EXPECT_EQ(globalAgent, agent);
69   OprofileNativeFunction func(name, addr, code, size);
70   NativeFunctions.push_back(func);
71
72   // Verify no other registration has take place for the same address
73   EXPECT_TRUE(ReportedDebugFuncs.find(addr) == ReportedDebugFuncs.end());
74
75   ReportedDebugFuncs[addr];
76   return 0;
77 }
78
79 int write_debug_line_info(op_agent_t agent,
80                           void const* code,
81                           size_t num_entries,
82                           struct debug_line_info const* info)
83 {
84   EXPECT_EQ(globalAgent, agent);
85
86   //verify code has been loaded first
87   uint64_t addr = reinterpret_cast<uint64_t>(code);
88   NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);
89   EXPECT_TRUE(i != ReportedDebugFuncs.end());
90
91   NativeDebugList NativeInfo(info, info + num_entries);
92
93   SourceLocations locs;
94   for(NativeDebugList::iterator i = NativeInfo.begin();
95       i != NativeInfo.end();
96       ++i) {
97     locs.push_back(std::make_pair(std::string(i->filename), i->lineno));
98   }
99   ReportedDebugFuncs[addr] = locs;
100
101   return 0;
102 }
103
104 int unload_native_code(op_agent_t agent, uint64_t addr) {
105   EXPECT_EQ(globalAgent, agent);
106
107   //verify that something for the given JIT addr has been loaded first
108   NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);
109   EXPECT_TRUE(i != ReportedDebugFuncs.end());
110   ReportedDebugFuncs.erase(i);
111   return 0;
112 }
113
114 int version() {
115   return 1;
116 }
117
118 bool is_oprofile_running() {
119   return true;
120 }
121
122 } //namespace test_opagent
123
124 class OProfileJITEventListenerTest
125 : public JITEventListenerTestBase<OProfileWrapper>
126 {
127 public:
128   OProfileJITEventListenerTest()
129   : JITEventListenerTestBase<OProfileWrapper>(
130     new OProfileWrapper(test_opagent::open_agent,
131       test_opagent::close_agent,
132       test_opagent::write_native_code,
133       test_opagent::write_debug_line_info,
134       test_opagent::unload_native_code,
135       test_opagent::version,
136       test_opagent::version,
137       test_opagent::is_oprofile_running))
138   {
139     EXPECT_TRUE(0 != MockWrapper);
140
141     Listener.reset(JITEventListener::createOProfileJITEventListener(
142       MockWrapper.get()));
143     EXPECT_TRUE(0 != Listener);
144     EE->RegisterJITEventListener(Listener.get());
145   }
146 };
147
148 TEST_F(OProfileJITEventListenerTest, NoDebugInfo) {
149   TestNoDebugInfo(ReportedDebugFuncs);
150 }
151
152 TEST_F(OProfileJITEventListenerTest, SingleLine) {
153   TestSingleLine(ReportedDebugFuncs);
154 }
155
156 TEST_F(OProfileJITEventListenerTest, MultipleLines) {
157   TestMultipleLines(ReportedDebugFuncs);
158 }
159
160 TEST_F(OProfileJITEventListenerTest, MultipleFiles) {
161   TestMultipleFiles(ReportedDebugFuncs);
162 }
163
164 testing::Environment* const jit_env =
165   testing::AddGlobalTestEnvironment(new JITEnvironment);