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