diff options
-rw-r--r-- | buildrun.cxx | 2 | ||||
-rw-r--r-- | hash.cxx | 1 | ||||
-rw-r--r-- | main.cxx | 28 | ||||
-rw-r--r-- | parse.cxx | 2 | ||||
-rw-r--r-- | session.h | 3 | ||||
-rw-r--r-- | stap.1.in | 7 | ||||
-rw-r--r-- | tapset/aux_syscalls.stp | 7 | ||||
-rw-r--r-- | tapsets.cxx | 4 | ||||
-rw-r--r-- | testsuite/systemtap.base/cache.exp | 20 |
9 files changed, 64 insertions, 10 deletions
diff --git a/buildrun.cxx b/buildrun.cxx index d24a2be4..b77eac14 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; @@ -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); @@ -112,6 +112,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 @@ -491,6 +499,8 @@ main (int argc, char * const argv []) s.load_only = false; s.skip_badvars = false; s.unprivileged = false; + s.gcc_flags = "-O0"; + s.unprivileged = false; // Location of our signing certificate. // If we're root, use the database in SYSCONFDIR, otherwise @@ -585,7 +595,7 @@ main (int argc, char * const argv []) { "unprivileged", 0, &long_opt, LONG_OPT_UNPRIVILEGED }, { 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; @@ -649,6 +659,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; @@ -91,7 +91,7 @@ tt2str(token_type tt) ostream& operator << (ostream& o, const source_loc& loc) { - o << loc.file << ":" + o << loc.file->name << ":" << loc.line << ":" << loc.column; @@ -136,6 +136,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). @@ -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/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index 9cb7a3df..9347e46f 100644 --- a/tapset/aux_syscalls.stp +++ b/tapset/aux_syscalls.stp @@ -292,6 +292,9 @@ function _struct_sockaddr_u:string(uaddr:long, len:long) #define DADDR (&inet->daddr) #endif +// Use kernel builtin instead of picking up user space ntohs (function). +#define _stp_ntohs be16_to_cpu + //FIXME. Not done yet. char *str = THIS->__retvalue; const int strlen = MAXSTRINGLEN; @@ -301,7 +304,7 @@ function _struct_sockaddr_u:string(uaddr:long, len:long) struct sockaddr_in *sin = (struct sockaddr_in *)buf; const unsigned char *addr = (unsigned char *)&sin->sin_addr; snprintf(str, strlen, "{AF_INET, %d.%d.%d.%d, %d}", - addr[0], addr[1], addr[2], addr[3], ntohs(sin->sin_port)); + addr[0], addr[1], addr[2], addr[3], _stp_ntohs(sin->sin_port)); } else if ((sa->sa_family == AF_UNIX)&&(len == sizeof(struct sockaddr_un))) { @@ -318,7 +321,7 @@ function _struct_sockaddr_u:string(uaddr:long, len:long) // FIXME. Address is probably not correctly displayed struct sockaddr_in6 *sin = (struct sockaddr_in6 *)buf; snprintf(str, strlen, "{AF_INET6, %016llx, %d}", - *(long long *)&sin->sin6_addr, ntohs(sin->sin6_port)); + *(long long *)&sin->sin6_addr, _stp_ntohs(sin->sin6_port)); } else if ((sa->sa_family == AF_PACKET)&&(len == sizeof(struct sockaddr_ll))) { diff --git a/tapsets.cxx b/tapsets.cxx index d7fc79ac..51e2917f 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -3245,7 +3245,7 @@ dwarf_derived_probe_group::emit_module_init (systemtap_session& s) s.op->newline() << "if (rc) {"; // PR6749: tolerate a failed register_*probe. s.op->newline(1) << "sdp->registered_p = 0;"; s.op->newline() << "if (!sdp->optional_p)"; - s.op->newline(1) << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);"; + s.op->newline(1) << "_stp_warn (\"probe %s (address 0x%lx) registration error (rc %d)\", probe_point, relocated_addr, rc);"; s.op->newline(-1) << "rc = 0;"; // continue with other probes // XXX: shall we increment numskipped? s.op->newline(-1) << "}"; @@ -4795,7 +4795,7 @@ kprobe_derived_probe_group::emit_module_init (systemtap_session& s) s.op->newline() << "if (rc) {"; // PR6749: tolerate a failed register_*probe. s.op->newline(1) << "sdp->registered_p = 0;"; s.op->newline() << "if (!sdp->optional_p)"; - s.op->newline(1) << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);"; + s.op->newline(1) << "_stp_warn (\"probe %s (address 0x%lx) registration error (rc %d)\", probe_point, addr, rc);"; s.op->newline(-1) << "rc = 0;"; // continue with other probes // XXX: shall we increment numskipped? s.op->newline(-1) << "}"; diff --git a/testsuite/systemtap.base/cache.exp b/testsuite/systemtap.base/cache.exp index b10a4f28..e70f3334 100644 --- a/testsuite/systemtap.base/cache.exp +++ b/testsuite/systemtap.base/cache.exp @@ -99,9 +99,23 @@ stap_compile MERGE1 [F_UNCACHED_COMPILE] $basic_script1 -b -M stap_compile MERGE2 [F_CACHED_COMPILE] $basic_script1 -b -M # Using '-t' (benchmark timing) should change the hash -# These two tests will fail until PR3523 is fixed. -#stap_compile TIMING1 [F_UNCACHED_COMPILE] $basic_script1 -t -#stap_compile TIMING2 [F_CACHED_COMPILE] $basic_script1 -t +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 |