[Lldb-commits] [lldb] r177759 - Added option parsing to the lldb_perf_clang performance test.
Greg Clayton
gclayton at apple.com
Fri Mar 22 14:12:50 PDT 2013
Author: gclayton
Date: Fri Mar 22 16:12:50 2013
New Revision: 177759
URL: http://llvm.org/viewvc/llvm-project?rev=177759&view=rev
Log:
Added option parsing to the lldb_perf_clang performance test.
Modified:
lldb/trunk/tools/lldb-perf/common/clang/lldb_perf_clang.cpp
Modified: lldb/trunk/tools/lldb-perf/common/clang/lldb_perf_clang.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-perf/common/clang/lldb_perf_clang.cpp?rev=177759&r1=177758&r2=177759&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-perf/common/clang/lldb_perf_clang.cpp (original)
+++ lldb/trunk/tools/lldb-perf/common/clang/lldb_perf_clang.cpp Fri Mar 22 16:12:50 2013
@@ -16,6 +16,7 @@
#include <iostream>
#include <unistd.h>
#include <fstream>
+#include <getopt.h>
using namespace lldb_perf;
@@ -27,9 +28,13 @@ public:
m_set_bp_main_by_name(CreateTimeMeasurement([this] () -> void
{
m_target.BreakpointCreateByName("main");
- m_target.BreakpointCreateByName("malloc");
}, "breakpoint1-relative-time", "Elapsed time to set a breakpoint at main by name, run and hit the breakpoint.")),
- m_delta_memory("breakpoint1-memory-delta", "Memory increase that occurs due to setting a breakpoint at main by name.")
+ m_delta_memory("breakpoint1-memory-delta", "Memory increase that occurs due to setting a breakpoint at main by name."),
+ m_total_memory(),
+ m_exe_path(),
+ m_out_path(),
+ m_launch_info (NULL),
+ m_use_dsym (false)
{
}
@@ -41,9 +46,11 @@ public:
virtual bool
Setup (int argc, const char** argv)
{
- SetVerbose(true);
- m_app_path.assign(argv[1]);
- m_out_path.assign(argv[2]);
+ if (m_exe_path.empty())
+ return false;
+ if (m_out_path.empty())
+ return false;
+ m_launch_info.SetArguments(argv, false);
return true;
}
@@ -60,7 +67,7 @@ public:
case 0:
{
m_total_memory.Start();
- m_target = m_debugger.CreateTarget(m_app_path.c_str());
+ m_target = m_debugger.CreateTarget(m_exe_path.c_str());
const char *clang_argv[] = { "clang --version", NULL };
m_delta_memory.Start();
m_set_bp_main_by_name();
@@ -100,21 +107,230 @@ public:
results.Write(m_out_path.c_str());
}
+
+
+ const char *
+ GetExecutablePath () const
+ {
+ if (m_exe_path.empty())
+ return NULL;
+ return m_exe_path.c_str();
+ }
+
+ const char *
+ GetResultFilePath () const
+ {
+ if (m_out_path.empty())
+ return NULL;
+ return m_out_path.c_str();
+ }
+
+ void
+ SetExecutablePath (const char *path)
+ {
+ if (path && path[0])
+ m_exe_path = path;
+ else
+ m_exe_path.clear();
+ }
+
+ void
+ SetResultFilePath (const char *path)
+ {
+ if (path && path[0])
+ m_out_path = path;
+ else
+ m_out_path.clear();
+ }
+
+ void
+ SetUseDSYM (bool b)
+ {
+ m_use_dsym = b;
+ }
+
+
+
private:
// C++ formatters
TimeMeasurement<std::function<void()>> m_set_bp_main_by_name;
MemoryMeasurement<std::function<void()>> m_delta_memory;
MemoryGauge m_total_memory;
- std::string m_app_path;
+ std::string m_exe_path;
std::string m_out_path;
+ SBLaunchInfo m_launch_info;
+ bool m_use_dsym;
+
+};
+
+
+struct Options
+{
+ std::string clang_path;
+ std::string out_file;
+ bool verbose;
+ bool use_dsym;
+ bool error;
+ bool print_help;
+
+ Options() :
+ verbose (false),
+ error (false),
+ print_help (false)
+ {
+ }
+};
+static struct option g_long_options[] = {
+ { "verbose", no_argument, NULL, 'v' },
+ { "clang", required_argument, NULL, 'c' },
+ { "out-file", required_argument, NULL, 'o' },
+ { "dsym", no_argument, NULL, 'd' },
+ { NULL, 0, NULL, 0 }
};
-// argv[1] == path to app
-// argv[2] == path to result
+
+std::string
+GetShortOptionString (struct option *long_options)
+{
+ std::string option_string;
+ for (int i = 0; long_options[i].name != NULL; ++i)
+ {
+ 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));
+
ClangTest test;
+
+ 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 'c':
+ {
+ SBFileSpec file(optarg);
+ if (file.Exists())
+ test.SetExecutablePath(optarg);
+ else
+ fprintf(stderr, "error: file specified in --clang (-c) option doesn't exist: '%s'\n", optarg);
+ }
+ break;
+
+ case 'o':
+ test.SetResultFilePath(optarg);
+ break;
+
+ case 'd':
+ test.SetUseDSYM(true);
+ break;
+
+ default:
+ option_data.error = true;
+ option_data.print_help = true;
+ fprintf (stderr, "error: unrecognized option %c\n", short_option);
+ break;
+ }
+ }
+
+
+ if (test.GetExecutablePath() == NULL)
+ {
+ // --clang is mandatory
+ option_data.print_help = true;
+ option_data.error = true;
+ fprintf (stderr, "error: the '--clang=PATH' option is mandatory\n");
+ }
+
+ if (test.GetResultFilePath() == NULL)
+ {
+ // --out-file is mandatory
+ option_data.print_help = true;
+ option_data.error = true;
+ fprintf (stderr, "error: the '--out-file=PATH' option is mandatory\n");
+ }
+
+ if (option_data.print_help)
+ {
+ puts(R"(
+NAME
+ lldb_perf_clang -- a tool that measures LLDB peformance while debugging clang.
+
+SYNOPSIS
+ lldb_perf_clang --clang=PATH --out-file=PATH [--verbose --dsym] -- [clang options]
+
+DESCRIPTION
+ Runs a set of static timing and memory tasks against clang and outputs results
+ to a plist file.
+)");
+ }
+ if (option_data.error)
+ {
+ exit(1);
+ }
+
+ // Update argc and argv after parsing options
+ argc -= optind;
+ argv += optind;
+
test.SetVerbose(true);
TestCase::Run(test, argc, argv);
return 0;
More information about the lldb-commits
mailing list