[Lldb-commits] [lldb] r177964 - Make the stepping perf test case actually work.
Jim Ingham
jingham at apple.com
Mon Mar 25 18:43:37 PDT 2013
Author: jingham
Date: Mon Mar 25 20:43:36 2013
New Revision: 177964
URL: http://llvm.org/viewvc/llvm-project?rev=177964&view=rev
Log:
Make the stepping perf test case actually work.
Modified:
lldb/trunk/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp
lldb/trunk/tools/lldb-perf/common/stepping/stepping-testcase.cpp
lldb/trunk/tools/lldb-perf/lldbperf.xcodeproj/project.pbxproj
Modified: lldb/trunk/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp?rev=177964&r1=177963&r2=177964&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp (original)
+++ lldb/trunk/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp Mon Mar 25 20:43:36 2013
@@ -8,14 +8,18 @@
#include <unistd.h>
#include <string>
+#include <getopt.h>
using namespace lldb_perf;
class StepTest : public TestCase
{
+ typedef void (*no_function) (void);
+
public:
- StepTest() :
- m_do_one_step_over_measurement (std::function<void(StepTest &, int)>(&StepTest::DoOneStep))
+ StepTest(bool use_single_stepping = false) :
+ m_main_source("stepping-testcase.cpp"),
+ m_use_single_stepping(use_single_stepping)
{
}
@@ -25,11 +29,32 @@ public:
virtual bool
Setup (int argc, const char **argv)
{
- m_app_path.assign(argv[1]);
- m_out_path.assign(argv[2]);
TestCase::Setup (argc, argv);
+ // Toggle the fast stepping command on or off as required.
+ const char *single_step_cmd = "settings set target.use-fast-stepping false";
+ const char *fast_step_cmd = "settings set target.use-fast-stepping true";
+ const char *cmd_to_use;
+
+ if (m_use_single_stepping)
+ cmd_to_use = single_step_cmd;
+ else
+ cmd_to_use = fast_step_cmd;
+
+ SBCommandReturnObject return_object;
+ m_debugger.GetCommandInterpreter().HandleCommand(cmd_to_use,
+ return_object);
+ if (!return_object.Succeeded())
+ {
+ if (return_object.GetError() != NULL)
+ printf ("Got an error running settings set: %s.\n", return_object.GetError());
+ else
+ printf ("Failed running settings set, no error.\n");
+ }
+
m_target = m_debugger.CreateTarget(m_app_path.c_str());
+ m_first_bp = m_target.BreakpointCreateBySourceRegex("Here is some code to stop at originally.", m_main_source);
+
const char* file_arg = m_app_path.c_str();
const char* empty = nullptr;
const char* args[] = {file_arg, empty};
@@ -39,44 +64,266 @@ public:
}
void
- DoOneStep (int sequence)
+ WriteResults (Results &results)
{
+ // Gotta turn off the last timer now.
+ size_t num_time_measurements = m_time_measurements.size();
+
+ m_time_measurements[num_time_measurements - 1].Stop();
+
+ Results::Dictionary& results_dict = results.GetDictionary();
+ const char *short_format_string = "step-time-%d";
+ const size_t short_size = strlen(short_format_string) + 5;
+ char short_buffer[short_size];
+ const char *long_format_string = "The time it takes for step %d in the step sequence.";
+ const size_t long_size = strlen(long_format_string) + 5;
+ char long_buffer[long_size];
+ for (size_t i = 0; i < num_time_measurements; i++)
+ {
+ snprintf (short_buffer, short_size, short_format_string, i);
+ snprintf (long_buffer, long_size, long_format_string, i);
+
+ results_dict.AddDouble(short_buffer,
+ long_buffer,
+ m_time_measurements[i].GetGauge().GetDeltaValue());
+
+ }
+
+ results.Write(m_out_path.c_str());
}
+ const char *
+ GetExecutablePath () const
+ {
+ if (m_app_path.empty())
+ return NULL;
+ return m_app_path.c_str();
+ }
+
+ const char *
+ GetResultFilePath () const
+ {
+ if (m_out_path.empty())
+ return NULL;
+ return m_out_path.c_str();
+ }
+
void
- WriteResults (Results &results)
+ SetExecutablePath (const char *path)
{
-// results.Write(m_out_path.c_str());
+ if (path && path[0])
+ m_app_path = path;
+ else
+ m_app_path.clear();
}
-
+ void
+ SetResultFilePath (const char *path)
+ {
+ if (path && path[0])
+ m_out_path = path;
+ else
+ m_out_path.clear();
+ }
+
+ void
+ SetUseSingleStep (bool use_it)
+ {
+ m_use_single_stepping = use_it;
+ }
private:
virtual void
TestStep (int counter, ActionWanted &next_action)
{
+ if (counter > 0)
+ m_time_measurements[counter - 1].Stop();
+
+ if (counter == 0)
+ m_first_bp.SetEnabled(false);
+
+ m_time_measurements.push_back(TimeMeasurement<no_function>());
+ next_action.StepOver(m_process.GetThreadAtIndex(0));
+ m_time_measurements[counter].Start();
+
}
TimeMeasurement<std::function<void(StepTest &, int)> > m_do_one_step_over_measurement;
+ SBBreakpoint m_first_bp;
+ SBFileSpec m_main_source;
+ std::vector<TimeMeasurement<no_function> > m_time_measurements;
+ bool m_use_single_stepping;
std::string m_app_path;
std::string m_out_path;
};
-// argv[1] == path to app
-// argv[2] == path to result
-int main(int argc, const char * argv[])
+struct Options
+{
+ std::string test_file_path;
+ std::string out_file;
+ bool verbose;
+ bool fast_step;
+ bool error;
+ bool print_help;
+
+ Options() :
+ verbose (false),
+ fast_step (true),
+ error (false),
+ print_help (false)
+ {
+ }
+};
+
+static struct option g_long_options[] = {
+ { "verbose", no_argument, NULL, 'v' },
+ { "single-step", no_argument, NULL, 's' },
+ { "test-file", required_argument, NULL, 't' },
+ { "out-file", required_argument, NULL, 'o' },
+ { NULL, 0, NULL, 0 }
+};
+
+
+std::string
+GetShortOptionString (struct option *long_options)
{
- if (argc != 3)
+ std::string option_string;
+ for (int i = 0; long_options[i].name != NULL; ++i)
{
- printf ("Wrong number of arguments, should be \"path to app\", \"path to result.\"\n");
- return -1;
+ if (long_options[i].flag == NULL)
+ {
+ option_string.push_back ((char) long_options[i].val);
+ switch (long_options[i].has_arg)
+ {
+ default:
+ case no_argument:
+ break;
+ case required_argument:
+ option_string.push_back (':');
+ break;
+ case optional_argument:
+ option_string.append (2, ':');
+ break;
+ }
+ }
}
+ return option_string;
+}
+
+int main(int argc, const char * argv[])
+{
+
+ // Prepare for & make calls to getopt_long.
+
+ std::string short_option_string (GetShortOptionString(g_long_options));
StepTest test;
- TestCase::Run(test,argc,argv);
+
+ Options option_data;
+ bool done = false;
+
+#if __GLIBC__
+ optind = 0;
+#else
+ optreset = 1;
+ optind = 1;
+#endif
+ while (!done)
+ {
+ int long_options_index = -1;
+ const int short_option = ::getopt_long_only (argc,
+ const_cast<char **>(argv),
+ short_option_string.c_str(),
+ g_long_options,
+ &long_options_index);
+
+ switch (short_option)
+ {
+ case 0:
+ // Already handled
+ break;
+
+ case -1:
+ done = true;
+ break;
+
+ case '?':
+ option_data.print_help = true;
+ break;
+
+ case 'h':
+ option_data.print_help = true;
+ break;
+
+ case 'v':
+ option_data.verbose = true;
+ break;
+
+ case 's':
+ option_data.fast_step = false;
+ test.SetUseSingleStep(true);
+ break;
+
+ case 't':
+ {
+ SBFileSpec file(optarg);
+ if (file.Exists())
+ test.SetExecutablePath(optarg);
+ else
+ fprintf(stderr, "error: file specified in --test-file (-t) option doesn't exist: '%s'\n", optarg);
+ }
+ break;
+
+ case 'o':
+ test.SetResultFilePath(optarg);
+ break;
+
+ default:
+ option_data.error = true;
+ option_data.print_help = true;
+ fprintf (stderr, "error: unrecognized option %c\n", short_option);
+ break;
+ }
+ }
+
+
+ if (option_data.print_help)
+ {
+ puts(R"(
+NAME
+ lldb-perf-stepping -- a tool that measures LLDB peformance of simple stepping operations.
+
+SYNOPSIS
+ lldb-perf-stepping --test-file=FILE [--out-file=PATH --verbose --fast-step]
+
+DESCRIPTION
+ Runs a set of stepping operations, timing each step and outputs results
+ to a plist file.
+)");
+ exit(0);
+ }
+ if (option_data.error)
+ {
+ exit(1);
+ }
+
+ if (test.GetExecutablePath() == NULL)
+ {
+ // --clang is mandatory
+ option_data.print_help = true;
+ option_data.error = true;
+ fprintf (stderr, "error: the '--test-file=PATH' option is mandatory\n");
+ }
+
+ // Update argc and argv after parsing options
+ argc -= optind;
+ argv += optind;
+
+ test.SetVerbose(true);
+ TestCase::Run(test, argc, argv);
return 0;
}
Modified: lldb/trunk/tools/lldb-perf/common/stepping/stepping-testcase.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-perf/common/stepping/stepping-testcase.cpp?rev=177964&r1=177963&r2=177964&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-perf/common/stepping/stepping-testcase.cpp (original)
+++ lldb/trunk/tools/lldb-perf/common/stepping/stepping-testcase.cpp Mon Mar 25 20:43:36 2013
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <vector>
+#include <string>
+
+struct struct_for_copying
+{
+ struct_for_copying (int in_int, double in_double, const char *in_string) :
+ int_value(in_int),
+ double_value(in_double),
+ string_value (in_string)
+ {
+
+ }
+ struct_for_copying()
+ {
+ struct_for_copying (0, 0, "");
+ }
+
+ int int_value;
+ double double_value;
+ std::string string_value;
+};
+
+int main (int argc, char **argv)
+{
+ struct_for_copying input_struct (150 * argc, 10.0 * argc, argv[0]);
+ struct_for_copying output_struct;
+ int some_int = 44;
+ double some_double = 34.5;
+ double other_double;
+ size_t vector_size;
+ std::vector<struct_for_copying> my_vector;
+
+ printf ("Here is some code to stop at originally. Got: %d, %p.\n", argc, argv);
+ output_struct = input_struct;
+ other_double = (some_double * some_int)/((double) argc);
+ other_double = other_double > 0 ? some_double/other_double : some_double > 0 ? other_double/some_double : 10.0;
+ my_vector.push_back (input_struct);
+ vector_size = my_vector.size();
+
+ return vector_size == 0 ? 0 : 1;
+}
Modified: lldb/trunk/tools/lldb-perf/lldbperf.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-perf/lldbperf.xcodeproj/project.pbxproj?rev=177964&r1=177963&r2=177964&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-perf/lldbperf.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/tools/lldb-perf/lldbperf.xcodeproj/project.pbxproj Mon Mar 25 20:43:36 2013
@@ -66,6 +66,7 @@
4C86C5CB16F7C1D300844407 /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C86C5C616F7A37800844407 /* LLDB.framework */; };
4C86C5CC16F7C1E000844407 /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C86C5C616F7A37800844407 /* LLDB.framework */; };
4C86C5DA16F7CED300844407 /* fmts_tester.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C1E37B316F79E4600FF10BB /* fmts_tester.mm */; };
+ 4CDDF51017011EBB00D95015 /* stepping-testcase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE3708716FB70E100BFD501 /* stepping-testcase.cpp */; };
4CE3707316FB701000BFD501 /* lldb-perf-stepping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE3707216FB701000BFD501 /* lldb-perf-stepping.cpp */; };
4CE3707516FB703B00BFD501 /* liblldbperf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C1E373916F4035D00FF10BB /* liblldbperf.a */; };
4CE3707616FB704300BFD501 /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 264B3DE816F7E47600D1E7AB /* LLDB.framework */; };
@@ -246,12 +247,8 @@
4C86C5C616F7A37800844407 /* LLDB.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LLDB.framework; path = build/Debug/LLDB.framework; sourceTree = "<group>"; };
4C86C5D116F7CC8900844407 /* format-tester */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "format-tester"; sourceTree = BUILT_PRODUCTS_DIR; };
4CE3705416FB6FA100BFD501 /* lldb-perf-step */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "lldb-perf-step"; sourceTree = BUILT_PRODUCTS_DIR; };
- 4CE3705616FB6FA100BFD501 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
- 4CE3705816FB6FA100BFD501 /* lldb_step_test.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = lldb_step_test.1; sourceTree = "<group>"; };
4CE3707216FB701000BFD501 /* lldb-perf-stepping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lldb-perf-stepping.cpp"; path = "stepping/lldb-perf-stepping.cpp"; sourceTree = "<group>"; };
4CE3707C16FB70AD00BFD501 /* stepping-testcase */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "stepping-testcase"; sourceTree = BUILT_PRODUCTS_DIR; };
- 4CE3707E16FB70AD00BFD501 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
- 4CE3708016FB70AD00BFD501 /* stepping_testcase.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = stepping_testcase.1; sourceTree = "<group>"; };
4CE3708716FB70E100BFD501 /* stepping-testcase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "stepping-testcase.cpp"; path = "stepping/stepping-testcase.cpp"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -346,8 +343,6 @@
26DBAD4616FA637D008243D2 /* common */,
4C1E375A16F4081300FF10BB /* cfcpp */,
4C1E374116F407C800FF10BB /* lib */,
- 4CE3705516FB6FA100BFD501 /* lldb-step-test */,
- 4CE3707D16FB70AD00BFD501 /* stepping-testcase */,
4C1E373A16F4035D00FF10BB /* Products */,
4C1E37DD16F7A03900FF10BB /* Frameworks */,
);
@@ -466,15 +461,6 @@
name = Products;
sourceTree = "<group>";
};
- 4CE3705516FB6FA100BFD501 /* lldb-step-test */ = {
- isa = PBXGroup;
- children = (
- 4CE3705616FB6FA100BFD501 /* main.cpp */,
- 4CE3705816FB6FA100BFD501 /* lldb_step_test.1 */,
- );
- path = "lldb-step-test";
- sourceTree = "<group>";
- };
4CE3707416FB701E00BFD501 /* stepping */ = {
isa = PBXGroup;
children = (
@@ -484,15 +470,6 @@
name = stepping;
sourceTree = "<group>";
};
- 4CE3707D16FB70AD00BFD501 /* stepping-testcase */ = {
- isa = PBXGroup;
- children = (
- 4CE3707E16FB70AD00BFD501 /* main.cpp */,
- 4CE3708016FB70AD00BFD501 /* stepping_testcase.1 */,
- );
- path = "stepping-testcase";
- sourceTree = "<group>";
- };
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -797,6 +774,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 4CDDF51017011EBB00D95015 /* stepping-testcase.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1075,6 +1053,7 @@
"$(inherited)",
);
MACOSX_DEPLOYMENT_TARGET = 10.9;
+ OTHER_LDFLAGS = "-Wl,-rpath, at loader_path/../../../../build/Debug";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../ $(SRCROOT)/../../include/";
@@ -1087,6 +1066,7 @@
CLANG_ENABLE_MODULES = YES;
GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
MACOSX_DEPLOYMENT_TARGET = 10.9;
+ OTHER_LDFLAGS = "-Wl,-rpath, at loader_path/../../../../build/Debug";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../ $(SRCROOT)/../../include/";
More information about the lldb-commits
mailing list