David Smith [Fri, 8 Jan 2016 21:45:41 +0000 (15:45 -0600)]
Fix PR19396 by updating tracepoint query code to find more tracepoints.
* tapsets.cxx (tracepoint_extra_decls): Add new parameter to let the
function know if we're compiling a tracequery module or not. Handle
several odd trace headers that get unintentially included. Add a few
tweaks for a few more trace headers.
(emit_module_decls): Update the call to tracepoint_extra_decls.
(get_tracequery_modules): Ditto.
(init_dw): Add a few more paths of potential places to look for
tracepoint headers.
* session.h: Add new 'kernel_extra_cflags' member variable to the session
object.
* session.cxx (systemtap_session): Initialize 'kernel_extra_cflags'.
* buildrun.cxx (compile_pass): Add in custom extra cflags.
(make_tracequeries): Ditto.
* scripts/tracepoint-diff: Ignore more tracepoints we can't use.
* testsuite/systemtap.base/tracepoints.exp: Save the tracepoint script to
a file, since it can grow large than the command line will support on a
system with lots of tracepoints.
* testsuite/systemtap.base/tracepoints_list.exp: New testcase that makes
sure that all tracepoints found by perf can be seen by systemtap.
Josh Stone [Thu, 7 Jan 2016 01:12:18 +0000 (17:12 -0800)]
Restore the dedupe logic for tracepoint headers
With and without this dedupe logic, I see no difference in the
tracepoints found on Fedora 23, RHEL7, and RHEL6. But it is faster
since we avoid processing headers found in both the kernel source tree
and build tree.
The way the header paths are normalized for #include, I don't see how
skipping that dedupe logic was supposed to help find more tracepoints.
I've added a comment pointing to what other functions would need to
change as well for that to have a more tangible effect, in case we
decide to compare file contents instead of just paths, for instance.
See also commit b1966849ecf that introduced the "#if 0" I'm removing.
The specific tracepoints mentioned in irq_vectors.h are still fine.
Felix Lu [Wed, 6 Jan 2016 15:41:35 +0000 (10:41 -0500)]
PR9968: Share global variable between embedded C and script
Embedded-C functions and blocks can now use the
STAP_GLOBAL_{GET,SET}_* macros to access script level global variables.
* NEWS: description
* doc/langref.text: description + added section for stable and
unmodified-fnargs pragmas which was only in man/stap.1
* staptree.cxx: scan for pragmas in varuse_collecting_visitor
visit_embeddedcode and visit_embedded_expr to allow proper locks
to be emitted
* translate.cxx: c_unparser visit_embeddedcode and visit_embedded_expr
generates the needed macros
Zhou Wenjian [Wed, 23 Dec 2015 15:48:47 +0000 (09:48 -0600)]
Add test cases for '-p', '-k', and type mismatches.
* testsuite/parseko/cmdline24.stp: Add a case for '-p'.
* testsuite/semko/typemismatch5.stp: Add a type mismatch case.
* testsuite/systemtap.base/temp-directory.exp: Add a test case for '-k'.
David Smith [Mon, 21 Dec 2015 17:25:41 +0000 (11:25 -0600)]
PR19216 fix: Do some code renaming.
* runtime/linux/kprobes.c: Rename 'stap_dwarf_kprobe' to 'stap_kprobe' and
'stap_dwarf_probe' to 'stap_kprobe_probe', since those structures aren't
just related to dwarf-based kprobes anymore.
* tapsets.cxx: Ditto.
David Smith [Mon, 21 Dec 2015 15:30:38 +0000 (09:30 -0600)]
Fix PR19216 by merging the dwarf and non-dwarf kprobe support code.
* tapsets.cxx: Move common kprobe code to the new
'generic_kprobe_derived_probe' class and make the 'dwarf_derived_probe'
and 'kprobe_derived_probe' classes derive from it. Replace the
'dwarf_derived_probe_group' and 'kprobe_derived_probe_group' classes with
the 'generic_kprobe_derived_probe_group' class.
* session.cxx (systemtap_session): Replaced the 'dwarf_derived_probes' and
'kprobe_derived_probes' probe groups with the
'generic_kprobe_derived_probes' probe group.
* session.h: Ditto.
* runtime/linux/kprobes.c (stapkp_prepare_kprobe): Set up the kprobe
'symbol_name' field.
(stapkp_prepare_kretprobe): Ditto.
(stapkp_symbol_callback): Handle symbol_name+offset probes in the kernel
and modules.
(stapkp_init): Handle NULL and empty module names.
* testsuite/systemtap.base/modules_out_of_tree.exp: Add dwarfless probing
tests and relative path tests.
William Cohen [Thu, 17 Dec 2015 21:54:54 +0000 (16:54 -0500)]
Remove extranious line from the generated label.c file for label.exp test
The additional line added by commit 2d703227f41f6625f6041b1354010cf1530099ae
was messing up the matching. Removed the beginning blank line so that the
line number matched up again.
Felix Lu [Tue, 15 Dec 2015 15:34:14 +0000 (10:34 -0500)]
PR16672: Support brace expansion for probe points
parse_probe_point() modified to parse the entire alias or
location list instead of one at a time. The expansion of
curly braces is done during parsing.
* NEWS: short blurb
* doc/langref.tex: documentation
* man/stapprobes.3stap: documentation
* parse.cxx: parse_probe_point() renamed to parse_probe_points(),
new functions parse_component() and parse_components() used for
parsing subsections of probe point.
* testsuite/*: test it
Josh Stone [Mon, 14 Dec 2015 22:00:01 +0000 (14:00 -0800)]
PR19362: fix doubled locations in probe copy-ctor
Commit 1341a03cc550835d5ddab35bb9333e43bd623714 moved most of the body
of the probe::probe copy constructor to its initializer list. However,
the push to locations was accidentally left, so this vector was both
initialized and appended, doubling all probes from here. This showed up
in library.exp SDT probes which counted twice too many matches.
William Cohen [Fri, 11 Dec 2015 20:49:40 +0000 (15:49 -0500)]
Ensure use of the function argument values from function entry in lwtools
On some machine such as powerpc64 and aarch64 function arguments are
passed using processor registers. The compiler is free to use those
registers how it sees fit. Thus, the register value on function return
may differ from the original argument value on function entry. To
ensure using the value from function entry the scripts use the
@entry() in the return probes.
David Smith [Fri, 11 Dec 2015 20:45:45 +0000 (14:45 -0600)]
Fix PR19358 by updating netfilter support for 4.4 kernels.
* tapset-netfilter.cxx (emit_module_decls): Handle kernel v4.4 netfilter
changes.
* runtime/linux/autoconf-netfilter-4_4.c: New autoconf test to test for
kernel v4.4 netfilter changes.
* buildrun.cxx (compile_pass): Add new autoconf test.
Josh Stone [Fri, 11 Dec 2015 03:17:56 +0000 (19:17 -0800)]
stapdyn: prepare for the dyninst 9.1 library callback change
The new API uses BPatch_object for the callback, because modules (~=CUs)
are now fully represented in shared objects too. This is better, but we
need to keep fallback code for the old API too, using module->getObject().
Josh Stone [Fri, 11 Dec 2015 03:13:51 +0000 (19:13 -0800)]
stapdyn: re-poll dyninst directly before sleeping
The poll fd comes from proccontrol, but sometimes dyninstAPI pulls events
into its own queue without handling them yet. If we then sleep in syscall
ppoll, we won't hear about those events until we hit the timeout. We can
do a quick dyninst poll first to clear those out.
Torsten Polle [Thu, 10 Dec 2015 18:56:29 +0000 (12:56 -0600)]
Add some support for older arm kernels.
* tapset/linux/arm/aux_syscalls.stp: Add support for arm kernels less than
3.7.
* tapset/linux/aux_syscalls.stp: Ditto.
* tapset/linux/arm/syscalls.stp: Add support for [nd_]syscall.execve for
arm kernels less than 3.7.
* tapset/linux/arm/nd_syscalls.stp: Ditto.
David Smith [Thu, 10 Dec 2015 15:06:33 +0000 (09:06 -0600)]
Make 2 small syscall testsuite changes for arm.
* testsuite/systemtap.syscall/stat.c: Mark fstatat64 as covered.
* testsuite/systemtap.syscall/coverage.tcl: Add a few modifications for
arm-based systems.
Zhou Wenjian [Wed, 9 Dec 2015 21:38:52 +0000 (15:38 -0600)]
Add more arithmetic and map delete test cases.
* testsuite/systemtap.base/arith.stp: Add more cases.
* testsuite/systemtap.maps/ii.stp: Ditto.
* testsuite/systemtap.maps/ii.exp: Update for new test case.
David Smith [Fri, 4 Dec 2015 20:23:17 +0000 (14:23 -0600)]
Add RHEL7.2 fixes for PR18889 so that we can probe module initializers.
* runtime/linux/kprobes.c (stapkp_prepare_kprobe): If we have
kallsyms_on_each_symbol(), just return if we don't have an address.
(stapkp_prepare_kretprobe): Ditto.
(stapkp_symbol_callback): New callback function for
kallsyms_on_each_symbol() to convert symbol_name+offset probes into
address probes. This works around a kernel bug and should be faster as
well.
(stapkp_init): Call kallsyms_on_each_symbol() when needed.
(stapkp_refresh): Ditto.
* runtime/transport/symbols.c (_stp_module_notifier): Change to the new
module refresh logic if the kernel version is 3.10 or higher.
* tapsets.cxx (dwarf_derived_probe_group::emit_module_decls): Ditto.
* testsuite/systemtap.base/kmodule.exp: Only run the subtests that load
the test kernel module after the systemtap module is loaded on systems
that support module refreshes.
Josh Stone [Thu, 26 Nov 2015 00:31:09 +0000 (16:31 -0800)]
Add a nop_visitor, and use it for expression_is_functioncall
In expression_is_functioncall, it only cares if the immediate expression
is a functioncall, but the expression_visitor it was derived from would
fully traverse all other expressions. All it really wanted was like a
visitor-patterned dynamic_cast.
The new nop_visitor better enables this. It does nothing at all for any
node types, and then expression_is_functioncall can override just for the
functioncall it cares about.
(We haven't yet settled whether to prefer a visitor pattern like this,
or more direct virtual calls like expression::is_symbol, or just plain
dynamic_cast<>. Try to avoid the need for downcasts if possible.)
Josh Stone [Wed, 25 Nov 2015 22:10:17 +0000 (14:10 -0800)]
Remove functioncall::var_assigned_to_retval
It's unusual to have a value specific to one visitor stored in the tree
node itself. This particular value is only used by c_unparser. Make it
a c_unparser member instead, saved and restored as necessary to allow
for nested calls.
Josh Stone [Wed, 25 Nov 2015 01:12:35 +0000 (17:12 -0800)]
PR18884: skip tmps for any literal, not by tok->type
Some literal expressions get created dynamically, like const-folding an
expression of two literals. Those will probably not have a tok->type
that looks like a literal, but they're still reasonable candidates to
skip temporary storage and output directly into C.
Add a new c_assign for any tmpvar=expression, which will check for
literals to override the tmp, or else assign them as normal. Literals
are detected with a dynamic_cast of the expression, without looking at
the token at all. In many places that were roughly doing this based on
tok->type, use the new c_assign to handle it automatically.
The new test transok/literal_tmp.stp compares the PR18884 examples,
asserting that they now have *exactly* the same generated code.
Josh Stone [Tue, 24 Nov 2015 22:55:56 +0000 (14:55 -0800)]
Restrict optimization of literals in "%s\n" to streams only
This "use_print" optimization is only effective for printing to streams
with _stp_print(). Then a literal string argument to "%s\n" can just
have that literal token-pasted with the newline string. But when
printing to strings, like sprintln, that optimization isn't actually
taken, so it was getting the newline twice.
Add new tests with sprint and sprintln on string literals, then clean up
the code that does the optimization -- for streams only.
William Cohen [Tue, 24 Nov 2015 01:22:26 +0000 (20:22 -0500)]
Eliminate the use of tex(nomencl.sty) in TeX documentation files
RHEL 7 does not package the nomencl.sty file and having this style
file used in systemtap makes it difficult to build the documentation.
The only place it was being used was in the tutorial.tex and it was
not generating a useful glossary. The glossary generation of
tutorial.tex has been disabled for the time being.
Felix Lu [Mon, 23 Nov 2015 18:53:26 +0000 (13:53 -0500)]
Fix monitor mode to be compatible with the private global feature.
The synthetic functions and variables did not have a __global_
prefix, causing the symbol resolution to fail at finding them.
Commit 0c7e069fe82 assumes that there is a token for every probe
while two synthetic probes are generated in monitor mode with
null context. parse_synthetic_probe uses "<synthetic>" again
if no token is found for the probe. The __global_ prefix is shown
in monitor mode where global variables are shown so they needed
to be unmangled as done in commit 8f54215ef850c809.
* elaborate.cxx: above changes
* parse.cxx: fall back to "<synthetic>" if token is nullptr
* staprun/monitor.c: use return values of function calls
* staptree.cxx: check for token nullptr in functiondecl::printsig
The pipe used in monitor mode was not being read the moment
data was available, causing an overflow. pselect now watches
the pipe fd for data to read. The UI now cuts off the probe name
if terminal size is not wide enough.
Felix Lu [Mon, 16 Nov 2015 16:40:36 +0000 (11:40 -0500)]
PR18848: Fix json parsing error
Quotes in the probe names for the json string were not escaped to
form a valid json object. They had to be escaped once for the
systemtap parser and once more for the json parser.
* elaborate.cxx: escape quotes twice when generating json string
* staprun/monitor.c: check for correct parse result
Felix Lu [Mon, 9 Nov 2015 16:00:48 +0000 (11:00 -0500)]
PR18848: add module output scrollback, status window now refreshed
on input
Users can now use the u and d keys to scroll back and forward through
the output. The scrollback uses a moving window approach over a queue.
The status window is now updated upon input for a smoother experience.
Felix Lu [Wed, 28 Oct 2015 18:44:35 +0000 (14:44 -0400)]
PR18848: add most functionality to curses interface
Currently, a file is used to redirect stp_print output to curses window.
Previous curses interface code in mainloop got refactored into monitor.c.
* runtime/monitor.c: New file. procfs functions for stp_print redirection
* runtime/print_flush.c: Redirect stp_print to curses interface in
monitor mode
* staprun/monitor.c: New file implementing curses interface
* staprun/mainloop.c: Move code into monitor.c
* staprun/Makefile.*: Link json-c and curses library, include monitor.c
to source list
* translate.cxx: Create procfs file for stp_print redirection