161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===- JITEventListenerTestCommon.h - Helper for JITEventListener tests ------------===//
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#ifndef JIT_EVENT_LISTENER_TEST_COMMON_H
1161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#define JIT_EVENT_LISTENER_TEST_COMMON_H
1261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
1316eeb6f5ebc978b03745177b9ac82684ab1c6932Bill Wendling#include "llvm/DIBuilder.h"
1406cb8ed00696eb14d1b831921452e50ec0568ea2Chandler Carruth#include "llvm/DebugInfo.h"
1506cb8ed00696eb14d1b831921452e50ec0568ea2Chandler Carruth#include "llvm/IRBuilder.h"
160bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/Instructions.h"
170bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/Module.h"
1838f488e46292e38c776dd6ec3e3a0b8c57952fcbChandler Carruth#include "llvm/TypeBuilder.h"
1961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/CodeGen/MachineCodeInfo.h"
2061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ExecutionEngine/JIT.h"
2161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ExecutionEngine/JITEventListener.h"
2261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/Dwarf.h"
2361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/TargetSelect.h"
2406cb8ed00696eb14d1b831921452e50ec0568ea2Chandler Carruth#include "llvm/Config/config.h"
2561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
2661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "gtest/gtest.h"
2761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
2861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <vector>
2961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <string>
3061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <utility>
3161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
3261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytypedef std::vector<std::pair<std::string, unsigned int> > SourceLocations;
3361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytypedef std::map<uint64_t, SourceLocations> NativeCodeMap;
3461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
3561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyclass JITEnvironment : public testing::Environment {
3661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  virtual void SetUp() {
3761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    // Required to create a JIT.
3861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    llvm::InitializeNativeTarget();
3961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
4061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky};
4161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyinline unsigned int getLine() {
4361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 12;
4461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
4561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
4661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyinline unsigned int getCol() {
4761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return 0;
4861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
4961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
5061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyinline const char* getFilename() {
5161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  return "mock_source_file.cpp";
5261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}
5361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
5461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// Test fixture shared by tests for listener implementations
5561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskytemplate<typename WrapperT>
5661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyclass JITEventListenerTestBase : public testing::Test {
5761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyprotected:
5861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::OwningPtr<WrapperT> MockWrapper;
5961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::OwningPtr<llvm::JITEventListener> Listener;
6061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
6161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskypublic:
6261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::Module* M;
6361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::MDNode* Scope;
6461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::ExecutionEngine* EE;
6561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::DIBuilder* DebugBuilder;
6661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::IRBuilder<> Builder;
6761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
6861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  JITEventListenerTestBase(WrapperT* w)
6961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  : MockWrapper(w)
7061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , M(new llvm::Module("module", llvm::getGlobalContext()))
7161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , EE(llvm::EngineBuilder(M)
7261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    .setEngineKind(llvm::EngineKind::JIT)
7361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    .setOptLevel(llvm::CodeGenOpt::None)
7461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    .create())
7561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , DebugBuilder(new llvm::DIBuilder(*M))
7661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  , Builder(llvm::getGlobalContext())
7761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  {
7861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    DebugBuilder->createCompileUnit(llvm::dwarf::DW_LANG_C_plus_plus,
7961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    "JIT",
8061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    "JIT",
8161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    "JIT",
8261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    true,
8361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    "",
8461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                    1);
8561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
8661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Scope = DebugBuilder->createFile(getFilename(), ".");
8761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
8861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
8961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  llvm::Function *buildFunction(const SourceLocations& DebugLocations) {
9061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    using namespace llvm;
9161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
9261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    LLVMContext& GlobalContext = getGlobalContext();
9361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
9461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations::const_iterator CurrentDebugLocation
9561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      = DebugLocations.begin();
9661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
9761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    if (CurrentDebugLocation != DebugLocations.end()) {
9861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      DebugLoc DebugLocation = DebugLoc::get(getLine(), getCol(),
9961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky          DebugBuilder->createFile(CurrentDebugLocation->first, "."));
10061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      Builder.SetCurrentDebugLocation(DebugLocation);
10161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      CurrentDebugLocation++;
10261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    }
10361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
10461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Function *Result = Function::Create(
10561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        TypeBuilder<int32_t(int32_t), false>::get(GlobalContext),
10661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        GlobalValue::ExternalLinkage, "id", M);
10761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Value *Arg = Result->arg_begin();
10861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    BasicBlock *BB = BasicBlock::Create(M->getContext(), "entry", Result);
10961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Builder.SetInsertPoint(BB);
11061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Value* one = ConstantInt::get(GlobalContext, APInt(32, 1));
11161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    for(; CurrentDebugLocation != DebugLocations.end();
11261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        ++CurrentDebugLocation) {
11361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      Arg = Builder.CreateMul(Arg, Builder.CreateAdd(Arg, one));
11461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      Builder.SetCurrentDebugLocation(
11561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        DebugLoc::get(CurrentDebugLocation->second, 0,
11661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                      DebugBuilder->createFile(CurrentDebugLocation->first, ".")));
11761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    }
11861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    Builder.CreateRet(Arg);
11961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    return Result;
12061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
12161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
12261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  void TestNoDebugInfo(NativeCodeMap& ReportedDebugFuncs) {
12361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations DebugLocations;
12461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    llvm::Function* f = buildFunction(DebugLocations);
12561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != f);
12661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
12761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    //Cause JITting and callbacks to our listener
12861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != EE->getPointerToFunction(f));
12961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(1 == ReportedDebugFuncs.size());
13061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
13161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EE->freeMachineCodeForFunction(f);
13261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(ReportedDebugFuncs.size() == 0);
13361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
13461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
13561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  void TestSingleLine(NativeCodeMap& ReportedDebugFuncs) {
13661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations DebugLocations;
13761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    DebugLocations.push_back(std::make_pair(std::string(getFilename()),
13861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                            getLine()));
13961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    llvm::Function* f = buildFunction(DebugLocations);
14061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != f);
14161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
14261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != EE->getPointerToFunction(f));
14361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(1 == ReportedDebugFuncs.size());
14461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_STREQ(ReportedDebugFuncs.begin()->second.begin()->first.c_str(),
14561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                 getFilename());
14661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_EQ(ReportedDebugFuncs.begin()->second.begin()->second, getLine());
14761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
14861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EE->freeMachineCodeForFunction(f);
14961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(ReportedDebugFuncs.size() == 0);
15061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
15161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
15261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  void TestMultipleLines(NativeCodeMap& ReportedDebugFuncs) {
15361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    using namespace std;
15461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
15561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations DebugLocations;
15661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    unsigned int c = 5;
15761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    for(unsigned int i = 0; i < c; ++i) {
15861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      DebugLocations.push_back(make_pair(string(getFilename()), getLine() + i));
15961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    }
16061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
16161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    llvm::Function* f = buildFunction(DebugLocations);
16261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != f);
16361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
16461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != EE->getPointerToFunction(f));
16561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(1 == ReportedDebugFuncs.size());
16661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations& FunctionInfo = ReportedDebugFuncs.begin()->second;
16761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_EQ(c, FunctionInfo.size());
16861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
16961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    int VerifyCount = 0;
17061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    for(SourceLocations::iterator i = FunctionInfo.begin();
17161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        i != FunctionInfo.end();
17261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky        ++i) {
17361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      EXPECT_STREQ(i->first.c_str(), getFilename());
17461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      EXPECT_EQ(i->second, getLine() + VerifyCount);
17561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky      VerifyCount++;
17661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    }
17761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
17861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EE->freeMachineCodeForFunction(f);
17961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(ReportedDebugFuncs.size() == 0);
18061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
18161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
18261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  void TestMultipleFiles(NativeCodeMap& ReportedDebugFuncs) {
18361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
18461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    std::string secondFilename("another_file.cpp");
18561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
18661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations DebugLocations;
18761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    DebugLocations.push_back(std::make_pair(std::string(getFilename()),
18861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky                                            getLine()));
18961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    DebugLocations.push_back(std::make_pair(secondFilename, getLine()));
19061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    llvm::Function* f = buildFunction(DebugLocations);
19161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != f);
19261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
19361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(0 != EE->getPointerToFunction(f));
19461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(1 == ReportedDebugFuncs.size());
19561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    SourceLocations& FunctionInfo = ReportedDebugFuncs.begin()->second;
19661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(2 == FunctionInfo.size());
19761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
19861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_STREQ(FunctionInfo.at(0).first.c_str(), getFilename());
19961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_STREQ(FunctionInfo.at(1).first.c_str(), secondFilename.c_str());
20061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
20161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_EQ(FunctionInfo.at(0).second, getLine());
20261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_EQ(FunctionInfo.at(1).second, getLine());
20361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
20461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EE->freeMachineCodeForFunction(f);
20561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky    EXPECT_TRUE(ReportedDebugFuncs.size() == 0);
20661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky  }
20761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky};
20861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky
20961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#endif //JIT_EVENT_LISTENER_TEST_COMMON_H
210