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