//===- JITEventListenerTest.cpp - Tests for Intel JITEventListener --------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "JITEventListenerTestCommon.h" using namespace llvm; // Because we want to keep the implementation details of the Intel API used to // communicate with Amplifier out of the public header files, the header below // is included from the source tree instead. #include "../../../lib/ExecutionEngine/IntelJITEvents/IntelJITEventsWrapper.h" #include #include namespace { // map of function ("method") IDs to source locations NativeCodeMap ReportedDebugFuncs; } // namespace /// Mock implementaion of Intel JIT API jitprofiling library namespace test_jitprofiling { int NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) { switch (EventType) { case iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED: { EXPECT_TRUE(0 != EventSpecificData); iJIT_Method_Load* msg = static_cast(EventSpecificData); ReportedDebugFuncs[msg->method_id]; for(unsigned int i = 0; i < msg->line_number_size; ++i) { EXPECT_TRUE(0 != msg->line_number_table); std::pair loc( std::string(msg->source_file_name), msg->line_number_table[i].LineNumber); ReportedDebugFuncs[msg->method_id].push_back(loc); } } break; case iJVM_EVENT_TYPE_METHOD_UNLOAD_START: { EXPECT_TRUE(0 != EventSpecificData); unsigned int UnloadId = *reinterpret_cast(EventSpecificData); EXPECT_TRUE(1 == ReportedDebugFuncs.erase(UnloadId)); } default: break; } return 0; } iJIT_IsProfilingActiveFlags IsProfilingActive(void) { // for testing, pretend we have an Intel Parallel Amplifier XE 2011 // instance attached return iJIT_SAMPLING_ON; } unsigned int GetNewMethodID(void) { static unsigned int id = 0; return ++id; } } //namespace test_jitprofiling class IntelJITEventListenerTest : public JITEventListenerTestBase { public: IntelJITEventListenerTest() : JITEventListenerTestBase( new IntelJITEventsWrapper(test_jitprofiling::NotifyEvent, 0, test_jitprofiling::IsProfilingActive, 0, 0, test_jitprofiling::GetNewMethodID)) { EXPECT_TRUE(0 != MockWrapper); Listener.reset(JITEventListener::createIntelJITEventListener( MockWrapper.take())); EXPECT_TRUE(0 != Listener); EE->RegisterJITEventListener(Listener.get()); } }; TEST_F(IntelJITEventListenerTest, NoDebugInfo) { TestNoDebugInfo(ReportedDebugFuncs); } TEST_F(IntelJITEventListenerTest, SingleLine) { TestSingleLine(ReportedDebugFuncs); } TEST_F(IntelJITEventListenerTest, MultipleLines) { TestMultipleLines(ReportedDebugFuncs); } // This testcase is disabled because the Intel JIT API does not support a single // JITted function with source lines associated with multiple files /* TEST_F(IntelJITEventListenerTest, MultipleFiles) { TestMultipleFiles(ReportedDebugFuncs); } */ testing::Environment* const jit_env = testing::AddGlobalTestEnvironment(new JITEnvironment);