summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--buildrun.cxx2
-rw-r--r--hash.cxx1
-rw-r--r--main.cxx27
-rw-r--r--session.h3
-rw-r--r--stap.1.in7
-rw-r--r--testsuite/systemtap.base/cache.exp15
6 files changed, 53 insertions, 2 deletions
diff --git a/buildrun.cxx b/buildrun.cxx
index ccf1ca15..b54a0534 100644
--- a/buildrun.cxx
+++ b/buildrun.cxx
@@ -187,7 +187,7 @@ compile_pass (systemtap_session& s)
// if (s.keep_tmpdir)
// o << "CFLAGS += -fverbose-asm -save-temps" << endl;
- o << "EXTRA_CFLAGS += -freorder-blocks" << endl; // improve on -Os
+ o << "EXTRA_CFLAGS += " << s.gcc_flags << endl; // Add -O[0123s]
// o << "CFLAGS += -fno-unit-at-a-time" << endl;
diff --git a/hash.cxx b/hash.cxx
index 45ae05eb..4e85ed28 100644
--- a/hash.cxx
+++ b/hash.cxx
@@ -175,6 +175,7 @@ find_script_hash (systemtap_session& s, const string& script, const hash &base)
h.add(s.ignore_dwarf); // --ignore-dwarf
h.add(s.consult_symtab); // --kelf, --kmap
h.add(s.skip_badvars); // --skip-badvars
+ h.add(s.gcc_flags); // -O[0123s]
if (!s.kernel_symtab_path.empty()) // --kmap
{
h.add(s.kernel_symtab_path);
diff --git a/main.cxx b/main.cxx
index 9dc658ff..2aeff580 100644
--- a/main.cxx
+++ b/main.cxx
@@ -111,6 +111,14 @@ usage (systemtap_session& s, int exitcode)
<< " " << s.module_name << endl
<< " -o FILE send script output to file, instead of stdout. This supports" << endl
<< " strftime(3) formats for FILE" << endl
+ << " -O[0123s] optimization to use for C code. Passed to gcc in pass 4." << endl
+ << " -O Alias for -O1" << endl
+ << " -O0 Fast compilation" << endl
+ << " -O1 Optimize, takes a bit more time" << endl
+ << " -O2 Optimize more, takes more time" << endl
+ << " -O3 Optimize even more, takes even more time" << endl
+ << " -Os Optimize for size, like -O2 but tuned for small code size" << endl
+ << " Default is -O0." << endl
<< " -c CMD start the probes, run CMD, and exit when it finishes" << endl
<< " -x PID sets target() to PID" << endl
<< " -F run as on-file flight recorder with -o." << endl
@@ -403,6 +411,7 @@ main (int argc, char * const argv [])
s.ignore_dwarf = false;
s.load_only = false;
s.skip_badvars = false;
+ s.gcc_flags = "-O0";
// Location of our signing certificate.
// If we're root, use the database in SYSCONFDIR, otherwise
@@ -487,7 +496,7 @@ main (int argc, char * const argv [])
{ "vp", 1, &long_opt, LONG_OPT_VERBOSE_PASS },
{ NULL, 0, NULL, 0 }
};
- int grc = getopt_long (argc, argv, "hVMvtp:I:e:o:R:r:m:kgPc:x:D:bs:uqwl:d:L:FS:",
+ int grc = getopt_long (argc, argv, "hVMvtp:I:e:o:O::R:r:m:kgPc:x:D:bs:uqwl:d:L:FS:",
long_options, NULL);
if (grc < 0)
break;
@@ -551,6 +560,22 @@ main (int argc, char * const argv [])
s.output_file = string (optarg);
break;
+ case 'O':
+ if (optarg == NULL)
+ s.gcc_flags = "-O1";
+ else
+ s.gcc_flags = "-O" + string (optarg);
+
+ if (s.gcc_flags != "-O0" && s.gcc_flags != "-O1"
+ && s.gcc_flags != "-O2" && s.gcc_flags != "-O3"
+ && s.gcc_flags != "-Os")
+ {
+ cerr << "'" << s.gcc_flags << "'"
+ << " isn't a valid optimization option." << endl;
+ usage (s, 1);
+ }
+ break;
+
case 'R':
s.runtime_path = string (optarg);
break;
diff --git a/session.h b/session.h
index a617e47f..32004410 100644
--- a/session.h
+++ b/session.h
@@ -135,6 +135,9 @@ struct systemtap_session
// Skip bad $ vars
bool skip_badvars;
+ // Optimization flag passed to gcc -O[0123s]
+ std::string gcc_flags;
+
// NB: It is very important for all of the above (and below) fields
// to be cleared in the systemtap_session ctor (elaborate.cxx)
// and/or main.cxx(main).
diff --git a/stap.1.in b/stap.1.in
index 7736a612..1a287a3e 100644
--- a/stap.1.in
+++ b/stap.1.in
@@ -183,6 +183,13 @@ Send standard output to named file. In bulk mode, percpu files will
start with FILE_ (FILE_cpu with -F) followed by the cpu number.
This supports strftime(3) formats for FILE.
.TP
+.BI \-O[0123s]
+Optimization to use for C code. Passed to gcc in pass 4. -O is an
+alias for -O1, -O0 enables fast compilation, -O1 optimizes the code and
+takes a bit more time, -O2 optimizes more and takes more time, -O3
+optimizes even more and takes even more time, -Os optimizes for size,
+like -O2 but tuned for small code size. The default is -O0.
+.TP
.BI \-c " CMD"
Start the probes, run CMD, and exit when CMD finishes.
.TP
diff --git a/testsuite/systemtap.base/cache.exp b/testsuite/systemtap.base/cache.exp
index 5c5c1441..e70f3334 100644
--- a/testsuite/systemtap.base/cache.exp
+++ b/testsuite/systemtap.base/cache.exp
@@ -102,6 +102,21 @@ stap_compile MERGE2 [F_CACHED_COMPILE] $basic_script1 -b -M
stap_compile TIMING1 [F_UNCACHED_COMPILE] $basic_script1 -t
stap_compile TIMING2 [F_CACHED_COMPILE] $basic_script1 -t
+# Using '-O[0123s]' (C compile optimizations) should change the hash
+# unless they are the same
+stap_compile OPTO [F_UNCACHED_COMPILE] $basic_script1 -O
+# -O0 is the default, so will have been cached by BASIC1
+stap_compile OPTZERO [F_CACHED_COMPILE] $basic_script1 -O0
+# -O is an alias for -O1, so already cached
+stap_compile OPTONE [F_CACHED_COMPILE] $basic_script1 -O1
+stap_compile OPTTWO [F_UNCACHED_COMPILE] $basic_script1 -O2
+stap_compile OPTTHREE [F_UNCACHED_COMPILE] $basic_script1 -O3
+stap_compile OPTSMALL [F_UNCACHED_COMPILE] $basic_script1 -Os
+# Bad -O argument should be rejected
+stap_compile OPTBAD [F_UNCACHED_NO_COMPILE] $basic_script1 -OX
+
+stap_compile TIMING2 [F_CACHED_COMPILE] $basic_script1 -t
+
# Changing the runtime directory should change the hash
set new_runtime [exec pwd]/.cache_test_runtime
exec /bin/rm -f $new_runtime