161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===- OProfileJITEventListenerTest.cpp - Unit tests for OProfileJITEventsListener --------===//
261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//
361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//                     The LLVM Compiler Infrastructure
461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//
561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// This file is distributed under the University of Illinois Open Source
661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// License. See LICENSE.TXT for details.
761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//
861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===--------------------------------------------------------------------------------------===//
961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
1061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ExecutionEngine/JITEventListener.h"
1161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ExecutionEngine/OProfileWrapper.h"
1261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "JITEventListenerTestCommon.h"
1361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
1461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <map>
1561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <list>
1661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
1761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyusing namespace llvm;
1861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
1961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace {
2061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
2161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskystruct OprofileNativeFunction {
2261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  const char* Name;
2361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  uint64_t Addr;
2461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  const void* CodePtr;
2561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  unsigned int CodeSize;
2661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
2761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  OprofileNativeFunction(const char* name,
2861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                         uint64_t addr,
2961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                         const void* code,
3061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                         unsigned int size)
3161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  : Name(name)
3261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , Addr(addr)
3361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , CodePtr(code)
3461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , CodeSize(size) {
3561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
3661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky};
3761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
3861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytypedef std::list<OprofileNativeFunction> NativeFunctionList;
3961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytypedef std::list<debug_line_info> NativeDebugList;
4061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyNativeFunctionList NativeFunctions;
4161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyNativeCodeMap ReportedDebugFuncs;
4361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} // namespace
4561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky/// Mock implementaion of opagent library
4761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace test_opagent {
4861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyop_agent_t globalAgent = reinterpret_cast<op_agent_t>(42);
5061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
5161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyop_agent_t open_agent()
5261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky{
5361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  // return non-null op_agent_t
5461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return globalAgent;
5561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
5661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
5761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint close_agent(op_agent_t agent)
5861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky{
5961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_EQ(globalAgent, agent);
6061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 0;
6161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
6261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
6361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint write_native_code(op_agent_t agent,
6461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                      const char* name,
6561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                      uint64_t addr,
6661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                      void const* code,
6761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                      unsigned int size)
6861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky{
6961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_EQ(globalAgent, agent);
7061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  OprofileNativeFunction func(name, addr, code, size);
7161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  NativeFunctions.push_back(func);
7261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
7361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  // Verify no other registration has take place for the same address
7461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_TRUE(ReportedDebugFuncs.find(addr) == ReportedDebugFuncs.end());
7561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
7661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  ReportedDebugFuncs[addr];
7761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 0;
7861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
7961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
8061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint write_debug_line_info(op_agent_t agent,
8161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                          void const* code,
8261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                          size_t num_entries,
8361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                          struct debug_line_info const* info)
8461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky{
8561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_EQ(globalAgent, agent);
8661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
8761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  //verify code has been loaded first
8861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  uint64_t addr = reinterpret_cast<uint64_t>(code);
8961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);
9061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_TRUE(i != ReportedDebugFuncs.end());
9161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
9261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  NativeDebugList NativeInfo(info, info + num_entries);
9361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
9461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  SourceLocations locs;
9561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  for(NativeDebugList::iterator i = NativeInfo.begin();
9661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      i != NativeInfo.end();
9761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      ++i) {
9861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    locs.push_back(std::make_pair(std::string(i->filename), i->lineno));
9961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
10061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  ReportedDebugFuncs[addr] = locs;
10161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
10261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 0;
10361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
10461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
10561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint unload_native_code(op_agent_t agent, uint64_t addr) {
10661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_EQ(globalAgent, agent);
10761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
10861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  //verify that something for the given JIT addr has been loaded first
10961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  NativeCodeMap::iterator i = ReportedDebugFuncs.find(addr);
11061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  EXPECT_TRUE(i != ReportedDebugFuncs.end());
11161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  ReportedDebugFuncs.erase(i);
11261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 0;
11361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
11461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
11561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint version() {
11661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 1;
11761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
11861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
11961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool is_oprofile_running() {
12061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return true;
12161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
12261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
12361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} //namespace test_opagent
12461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
12561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyclass OProfileJITEventListenerTest
12661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky: public JITEventListenerTestBase<OProfileWrapper>
12761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky{
12861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskypublic:
12961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  OProfileJITEventListenerTest()
13061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  : JITEventListenerTestBase<OProfileWrapper>(
13161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    new OProfileWrapper(test_opagent::open_agent,
13261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::close_agent,
13361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::write_native_code,
13461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::write_debug_line_info,
13561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::unload_native_code,
13661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::version,
13761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::version,
13861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      test_opagent::is_oprofile_running))
13961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  {
14061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != MockWrapper);
14161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
14261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Listener.reset(JITEventListener::createOProfileJITEventListener(
14361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      MockWrapper.get()));
14461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != Listener);
14561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EE->RegisterJITEventListener(Listener.get());
14661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
14761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky};
14861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
14961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyTEST_F(OProfileJITEventListenerTest, NoDebugInfo) {
15061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  TestNoDebugInfo(ReportedDebugFuncs);
15161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
15261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
15361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyTEST_F(OProfileJITEventListenerTest, SingleLine) {
15461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  TestSingleLine(ReportedDebugFuncs);
15561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
15661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
15761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyTEST_F(OProfileJITEventListenerTest, MultipleLines) {
15861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  TestMultipleLines(ReportedDebugFuncs);
15961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
16061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
16161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyTEST_F(OProfileJITEventListenerTest, MultipleFiles) {
16261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  TestMultipleFiles(ReportedDebugFuncs);
16361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
16461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
16561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytesting::Environment* const jit_env =
16661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  testing::AddGlobalTestEnvironment(new JITEnvironment);
167