1d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===-- TestCase.h ----------------------------------------------*- C++ -*-===//
2f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
3d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//                     The LLVM Compiler Infrastructure
4f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
5d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// This file is distributed under the University of Illinois Open Source
6d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// License. See LICENSE.TXT for details.
7f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
8d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===----------------------------------------------------------------------===//
9f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
10f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#ifndef __PerfTestDriver__TestCase__
11f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#define __PerfTestDriver__TestCase__
12f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
13f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include "lldb/API/LLDB.h"
14f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include "Measurement.h"
15b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata#include <getopt.h>
16f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
179de4dec874148d30cc1d4c498d38cd048a8164caGreg Claytonnamespace lldb_perf {
189de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton
199de4dec874148d30cc1d4c498d38cd048a8164caGreg Claytonclass Results;
209de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton
21f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granataclass TestCase
22f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
23f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatapublic:
24f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    TestCase();
25f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
26f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    struct ActionWanted
27f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	{
28f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata		enum class Type
29f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata		{
309de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton			eStepOver,
31af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton			eContinue,
3291c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton            eStepOut,
33b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            eRelaunch,
34442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata            eCallNext,
35af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton			eKill
36f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata		} type;
37af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton		lldb::SBThread thread;
38b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata        lldb::SBLaunchInfo launch_info;
39af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton
40af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        ActionWanted () :
41af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            type (Type::eContinue),
42b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            thread (),
43b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            launch_info (NULL)
44af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        {
45af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        }
46af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton
47af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        void
48af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        Continue()
49af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        {
50af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            type = Type::eContinue;
51af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            thread = lldb::SBThread();
52af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        }
53af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton
54af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        void
5591c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton        StepOver (lldb::SBThread t)
56af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        {
579de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton            type = Type::eStepOver;
58af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            thread = t;
59af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        }
60af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton
61af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        void
6291c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton        StepOut (lldb::SBThread t)
63af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        {
6491c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton            type = Type::eStepOut;
65af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            thread = t;
66af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        }
67af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton
68af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        void
69b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata        Relaunch (lldb::SBLaunchInfo l)
70b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata        {
71b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            type = Type::eRelaunch;
72b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            thread = lldb::SBThread();
73b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata            launch_info = l;
74b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata        }
75b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata
76b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata        void
77af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        Kill ()
78af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        {
79af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            type = Type::eKill;
80af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton            thread = lldb::SBThread();
81af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton        }
82442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata
83442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata        void
84442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata        CallNext ()
85442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata        {
86442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata            type = Type::eCallNext;
87442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata            thread = lldb::SBThread();
88442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata        }
89f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	};
90f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
91f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    virtual
92f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    ~TestCase ()
9375fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton    {
9475fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton    }
95f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
9691c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton	virtual bool
97b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata	Setup (int& argc, const char**& argv);
98f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
99af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	virtual void
100af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	TestStep (int counter, ActionWanted &next_action) = 0;
101f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
102f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	bool
10391c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton	Launch (lldb::SBLaunchInfo &launch_info);
104f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
105101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata    bool
106101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata	Launch (std::initializer_list<const char*> args = {});
107101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata
108f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	void
109f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	Loop();
110f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
111f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    void
112f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    SetVerbose (bool);
113f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
114f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    bool
115f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    GetVerbose ();
116f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
117f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    virtual void
1189de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton    WriteResults (Results &results) = 0;
119f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
120f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    template <typename G,typename A>
121c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata    Measurement<G,A> CreateMeasurement (A a, const char* name = NULL, const char* description = NULL)
122f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    {
123c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata        return Measurement<G,A> (a,name, description);
124c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata    }
125c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata
126c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata    template <typename A>
127c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata    TimeMeasurement<A> CreateTimeMeasurement (A a, const char* name = NULL, const char* description = NULL)
128c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata    {
129c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata        return TimeMeasurement<A> (a,name, description);
130f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    }
131f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
13253bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata    template <typename A>
13353bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata    MemoryMeasurement<A> CreateMemoryMeasurement (A a, const char* name = NULL, const char* description = NULL)
13453bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata    {
13553bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata        return MemoryMeasurement<A> (a,name, description);
13653bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata    }
13753bba61c0b9f3b3ceff5835f79d61efa0d81847cEnrico Granata
138101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata    static int
139f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    Run (TestCase& test, int argc, const char** argv);
140f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
141b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    virtual bool
142b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    ParseOption (int short_option, const char* optarg)
143b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    {
144b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata        return false;
145b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    }
146b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata
147b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    virtual struct option*
148b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    GetLongOptions ()
149b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    {
150b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata        return NULL;
151b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata    }
152b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata
1532002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    lldb::SBDebugger &
1542002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    GetDebugger()
1552002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    {
1562002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton        return m_debugger;
1572002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    }
1582002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton
1592002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    lldb::SBTarget &
1602002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    GetTarget()
1612002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    {
1622002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton        return m_target;
1632002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    }
1642002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton
1652002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    lldb::SBProcess &
1662002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    GetProcess ()
1672002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    {
1682002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton        return m_process;
1692002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    }
1702002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton
1712002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    lldb::SBThread &
1722002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    GetThread ()
1732002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    {
1742002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton        return m_thread;
1752002c030ded5da1adf38ceb76a7f393baa7a87e3Greg Clayton    }
176e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata
177e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata    int
178e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata    GetStep ()
179e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata    {
180e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata        return m_step;
181e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata    }
182e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata
183101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata    static const int RUN_SUCCESS = 0;
184101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata    static const int RUN_SETUP_ERROR = 100;
185101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata
186f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granataprotected:
187af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton    lldb::SBDebugger m_debugger;
188af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	lldb::SBTarget m_target;
189af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	lldb::SBProcess m_process;
190af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	lldb::SBThread m_thread;
191af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton	lldb::SBListener m_listener;
192f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata    bool m_verbose;
193e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata    int m_step;
194f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata};
195af222500aa2ce2b18149277e561cdf75f2115df2Greg Clayton}
196f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
197f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#endif /* defined(__PerfTestDriver__TestCase__) */
198