Backport patches to improve dtrace's input flexibility

- Let dtrace use its old method if pyparsing fails (rhbz1131586)
- Allow dtrace -fPIC (rhbz1145993)
This commit is contained in:
Josh Stone 2014-09-25 11:21:41 -07:00
parent a0d02f20c1
commit 27a0f624fc
2 changed files with 393 additions and 1 deletions

View File

@ -0,0 +1,383 @@
From c486eff3f809b5ce544d5a032198e7680f2b7f2b Mon Sep 17 00:00:00 2001
From: Stan Cox <scox@redhat.com>
Date: Tue, 9 Sep 2014 15:07:44 -0400
Subject: [PATCH 1/3] Add -fpic -fPIC to the list of accepted but ignored
dtrace options.
* dtrace.in (main): Add ignore_options.
---
dtrace.in | 4 +++-
testsuite/systemtap.base/dtrace.exp | 8 ++++----
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/dtrace.in b/dtrace.in
index d5f189d4fc9e..2f9fb6307e28 100644
--- a/dtrace.in
+++ b/dtrace.in
@@ -305,6 +305,8 @@ def main():
s_filename = ""
includes = []
defines = []
+ ignore_options = ["-64", "-32", "-fpic", "-fPIC"]
+
while i < len(sys.argv):
if sys.argv[i] == "-o":
i += 1
@@ -330,7 +332,7 @@ def main():
HAVE_PYP = False
elif sys.argv[i] == "--types":
print sys.argv[0] + ": note: obsolete option --types used"
- elif sys.argv[i] == "-64" or sys.argv[i] == "-32":
+ elif sys.argv[i] in ignore_options:
pass # dtrace users sometimes pass these flags
elif sys.argv[i] == "--help":
dtrace_help()
diff --git a/testsuite/systemtap.base/dtrace.exp b/testsuite/systemtap.base/dtrace.exp
index 252dad90ede5..e029748100d6 100644
--- a/testsuite/systemtap.base/dtrace.exp
+++ b/testsuite/systemtap.base/dtrace.exp
@@ -53,12 +53,12 @@ set incpath "/tmp/dtrace_inc"
# -----------------------------------------------------------------
# test command line option and file handling
-verbose -log "$dtrace -G -s $dpath -o XXX.o"
-catch {exec $dtrace -G -s $dpath -o XXX.o}
+verbose -log "$dtrace -G -64 -fPIC -s $dpath -o XXX.o"
+catch {exec $dtrace -G -64 -fPIC -s $dpath -o XXX.o}
if {[file exists XXX.o]} then {
- pass "dtrace -G -o XXX.o"
+ pass "dtrace -G -64 -fPIC -o XXX.o"
} else {
- fail "dtrace -G -o XXX.o"
+ fail "dtrace -G -64 -fPIC -o XXX.o"
}
exec rm -f XXX.o
--
1.9.3
From 52cac9d8159a399b824201f4d2c98abe89a01767 Mon Sep 17 00:00:00 2001
From: Stan Cox <scox@redhat.com>
Date: Tue, 23 Sep 2014 13:42:54 -0400
Subject: [PATCH 2/3] Ignore C declarations in .d file and use string pattern
matching as a fallback mechanism.
* dtrace.in (_PypProvider): SkipTo the provider{...}
(main): If pyparsing fails, then fallback to pattern matching.
* dtrace.exp: Add a fallback test.
---
dtrace.in | 39 +++++++++++++++++++++++++++---------
testsuite/systemtap.base/dtrace.exp | 40 +++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/dtrace.in b/dtrace.in
index 2f9fb6307e28..04ace92181d9 100644
--- a/dtrace.in
+++ b/dtrace.in
@@ -29,13 +29,13 @@ try:
from pyparsing import alphas, cStyleComment, delimitedList, Group, \
Keyword, lineno, Literal, nestedExpr, nums, oneOf, OneOrMore, \
Optional, ParseException, ParserElement, restOfLine, restOfLine, \
- Suppress, Word, ZeroOrMore
+ Suppress, SkipTo, Word, ZeroOrMore
HAVE_PYP = True
except ImportError:
HAVE_PYP = False
-# Common file creation methods for pyparsing and regexparsing
+# Common file creation methods for pyparsing and string pattern matching
class _HeaderCreator(object):
def init_semaphores(self, fdesc):
@@ -149,7 +149,7 @@ class _PypProvider(_HeaderCreator):
provider_decl = (PROVIDER + Optional(ident)
+ lbrace + Group(probe_decls) + rbrace + Optional(semi))
- dtrace_statement = Group(decls | provider_decl)
+ dtrace_statement = Group (SkipTo("provider", include=False) + provider_decl)
self.dtrace_statements = ZeroOrMore(dtrace_statement)
cplusplus_linecomment = Literal("//") + restOfLine
@@ -167,7 +167,10 @@ class _PypProvider(_HeaderCreator):
for asti in self.ast:
if len(asti) == 0:
continue
- elif asti[0] == "provider":
+ # ignore SkipTo token
+ if asti[0] != "provider":
+ del asti[0]
+ if asti[0] == "provider":
# list of probes
for prb in asti[2]:
semaphores_def += self.add_semaphore(asti[1], prb[1])
@@ -186,15 +189,18 @@ class _PypProvider(_HeaderCreator):
self.ast = self.bnf.parseFile(provider).asList()
except ParseException, err:
if len(self.current_probe):
- print "%s:%s:%d: syntax error near:\nprobe %s\n" % (sys.argv[0],provider, self.current_lineno, self.current_probe)
+ print "Warning: %s:%s:%d: syntax error near:\nprobe %s\n" % (sys.argv[0],provider, self.current_lineno, self.current_probe)
else:
- print "%s:%s:%d syntax error near:\n%s\n" % (sys.argv[0],provider,err.lineno, err.line)
- sys.exit(1)
+ print "Warning: %s:%s:%d syntax error near:\n%s\n" % (sys.argv[0],provider,err.lineno, err.line)
+ raise ParseException, err
probes_def = ""
for asti in self.ast:
if len(asti) == 0:
continue
+ # ignore SkipTo token
+ if asti[0] != "provider":
+ del asti[0]
if asti[0] == "provider":
# list of probes
for prb in asti[2]:
@@ -369,14 +375,29 @@ def main():
providers = _PypProvider()
else:
providers = _ReProvider()
- providers.probe_write(s_filename, filename + suffix)
+ while True:
+ try:
+ providers.probe_write(s_filename, filename + suffix)
+ break;
+ # complex C declarations can fool the pyparsing grammar.
+ # we could increase the complexity of the grammar
+ # instead we fall back to string pattern matching
+ except ParseException, err:
+ print "Warning: Proceeding as if --no-pyparsing was given.\n"
+ providers = _ReProvider()
elif build_source:
if HAVE_PYP:
providers = _PypProvider()
else:
providers = _ReProvider()
(ignore, fname) = mkstemp(suffix=".h")
- providers.probe_write(s_filename, fname)
+ while True:
+ try:
+ providers.probe_write(s_filename, fname)
+ break;
+ except ParseException, err:
+ print "Warning: Proceeding as if --no-pyparsing was given.\n"
+ providers = _ReProvider()
if not keep_temps:
os.remove(fname)
else:
diff --git a/testsuite/systemtap.base/dtrace.exp b/testsuite/systemtap.base/dtrace.exp
index e029748100d6..60cab3f5abf2 100644
--- a/testsuite/systemtap.base/dtrace.exp
+++ b/testsuite/systemtap.base/dtrace.exp
@@ -207,6 +207,46 @@ if { $ok == 4} {
}
exec rm -f XXX.h
+set ok 0
+set pypath "/tmp/pypath.d"
+set $fp [open $pypath "w"]
+puts $fp "
+#include <sys/types.h>
+
+provider alpha {
+ probe request__start(string, uint8_t, uint16_t, int, void *);
+ probe request__one(string, uint8_t, uint32_t, int, int);
+ probe client__two(int, int);
+ probe client__three(int, string, pid_t, zoneid_t);
+ probe input__stop(int, int, uint32_t, uint32_t, int8_t, uint8_t*, double*);
+};
+
+#ifdef DCL_AFTER_PROVIDER
+typedef unsigned short int __u_short;
+typedef const static unsigned short __u_c_short;
+#endif
+
+#pragma D attributes Unknown provider alpha provider
+"
+close $fp
+verbose -log "$dtrace -C -h -s $pypath -o XXX.h"
+spawn $dtrace -C -DDCL_AFTER_PROVIDER -h -s $pypath -o XXX.h
+expect {
+ -re {Warning.*syntax error} {incr ok; exp_continue}
+ -re {Warning.*--no-pyparsing} {incr ok; exp_continue}
+ eof { }
+}
+catch {close}; catch {wait}
+if {[file exists XXX.h]} then {
+ incr ok;
+}
+if { $ok == 3} {
+ pass "dtrace parser check"
+} else {
+ fail "dtrace parser check $ok"
+}
+exec rm -f XXX.h
+
verbose -log "$dtrace -I$incpath -G -s $idpath"
catch {exec $dtrace -G -s $dpath}
if {[file exists test.o]} then {
--
1.9.3
From 3525152408f15e23dcffe2371bbd575f1646d691 Mon Sep 17 00:00:00 2001
From: Stan Cox <scox@redhat.com>
Date: Thu, 25 Sep 2014 13:47:04 -0400
Subject: [PATCH 3/3] Add pyparsing / no-parsing compatibility test.
* dtrace.exp: Add pyparsing compatibility test.
---
testsuite/systemtap.base/dtrace.exp | 93 ++++++++++++++++++++++++++++---------
1 file changed, 72 insertions(+), 21 deletions(-)
diff --git a/testsuite/systemtap.base/dtrace.exp b/testsuite/systemtap.base/dtrace.exp
index 60cab3f5abf2..e455c298737a 100644
--- a/testsuite/systemtap.base/dtrace.exp
+++ b/testsuite/systemtap.base/dtrace.exp
@@ -8,6 +8,8 @@ if {[installtest_p]} {
set dtrace ../dtrace
}
+# Create the test .d files
+
exec mkdir -p /tmp/dtrace
set dpath "/tmp/dtrace/test.d"
@@ -48,6 +50,29 @@ provider tstsyscall
"
close $fp
+set pypath "/tmp/pypath.d"
+set $fp [open $pypath "w"]
+puts $fp "
+#include <sys/types.h>
+
+provider alpha {
+ probe request__start(string, uint8_t, uint16_t, int, void *);
+ probe request__one(string, uint8_t, uint32_t, int, int);
+ probe client__two(int, int);
+ probe client__three(int, string, pid_t, zoneid_t);
+ probe input__stop(int, int, uint32_t, uint32_t, int8_t, uint8_t*, double*);
+};
+
+#ifdef DCL_AFTER_PROVIDER
+typedef unsigned short int __u_short;
+typedef const static unsigned short __u_c_short;
+#endif
+
+#pragma D attributes Unknown provider alpha provider
+"
+close $fp
+
+
set incpath "/tmp/dtrace_inc"
# -----------------------------------------------------------------
@@ -156,6 +181,9 @@ if { $ok != 0} {
fail "dtrace CFLAGS= CC="
}
+# -----------------------------------------------------------------
+# test -h header file creation
+
set ok 0
verbose -log "$dtrace -C -h -s $dpath -o XXX.h"
catch {exec $dtrace -C -h -s $dpath -o XXX.h}
@@ -189,6 +217,9 @@ if { $ok == 4} {
}
exec rm -f XXX.h
+# -----------------------------------------------------------------
+# test --no-pyparsing
+
set ok 0
verbose -log "$dtrace -C --no-pyparsing -I$incpath -h -s $idpath -o XXX.h"
catch {exec $dtrace -C --no-pyparsing -I$incpath -h -s $idpath -o XXX.h}
@@ -207,28 +238,10 @@ if { $ok == 4} {
}
exec rm -f XXX.h
-set ok 0
-set pypath "/tmp/pypath.d"
-set $fp [open $pypath "w"]
-puts $fp "
-#include <sys/types.h>
-
-provider alpha {
- probe request__start(string, uint8_t, uint16_t, int, void *);
- probe request__one(string, uint8_t, uint32_t, int, int);
- probe client__two(int, int);
- probe client__three(int, string, pid_t, zoneid_t);
- probe input__stop(int, int, uint32_t, uint32_t, int8_t, uint8_t*, double*);
-};
-
-#ifdef DCL_AFTER_PROVIDER
-typedef unsigned short int __u_short;
-typedef const static unsigned short __u_c_short;
-#endif
+# -----------------------------------------------------------------
+# test fallback to --no-pyparsing
-#pragma D attributes Unknown provider alpha provider
-"
-close $fp
+set ok 0
verbose -log "$dtrace -C -h -s $pypath -o XXX.h"
spawn $dtrace -C -DDCL_AFTER_PROVIDER -h -s $pypath -o XXX.h
expect {
@@ -247,6 +260,9 @@ if { $ok == 3} {
}
exec rm -f XXX.h
+# -----------------------------------------------------------------
+# test -G object file creation
+
verbose -log "$dtrace -I$incpath -G -s $idpath"
catch {exec $dtrace -G -s $dpath}
if {[file exists test.o]} then {
@@ -256,5 +272,40 @@ if {[file exists test.o]} then {
}
exec rm -f test.o
+# -----------------------------------------------------------------
+# test dtrace for pyparsing / --no-pyparsing compatibility
+
+set ok 0
+set dfiles {dtrace}
+foreach i $dfiles {
+ verbose -log "$dtrace $srcdir/$subdir/$i.d"
+ catch {exec $dtrace -C -h -s $srcdir/$subdir/$i.d -o $i-1.h}
+ catch {exec $dtrace -C -h --no-pyparsing -s $srcdir/$subdir/$i.d -o $i-2.h}
+ spawn diff -wqs $i-1.h $i-2.h
+ expect {
+ -re {Files.*identical} {incr ok; exp_continue}
+ eof { }
+ }
+ catch {exec $dtrace -C -G -s $srcdir/$subdir/$i.d -o $i-1.o}
+ catch {exec $dtrace -C -G --no-pyparsing -s $srcdir/$subdir/$i.d -o $i-2.o}
+ verbose -log "exec nm $i-1.o > $i-1.od"
+ catch {exec nm $i-1.o > $i-1.od}
+ catch {exec nm $i-2.o > $i-2.od}
+ spawn diff -qs $i-1.od $i-2.od
+ expect {
+ -re {Files.*identical} {incr ok; exp_continue}
+ eof { }
+ }
+ catch {exec /bin/rm $i-1.h $i-2.h $i-1.o $i-2.o}
+}
+if { $ok == 2} {
+ pass "dtrace known uses"
+} else {
+ fail "dtrace known uses ${ok}"
+}
+
+# -----------------------------------------------------------------
+# cleanup
+
exec /bin/rm -r /tmp/dtrace /tmp/dtrace_inc
# -----------------------------------------------------------------
--
1.9.3

View File

@ -68,7 +68,7 @@
Name: systemtap
Version: 2.6
Release: 1%{?dist}
Release: 2%{?dist}
# for version, see also configure.ac
@ -103,6 +103,8 @@ License: GPLv2+
URL: http://sourceware.org/systemtap/
Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz
Patch2: systemtap-2.6-dtrace-flexibility.patch
# Build*
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: gcc-c++
@ -390,6 +392,8 @@ systemtap-runtime-virthost machine to execute systemtap scripts.
%prep
%setup -q %{?setup_elfutils}
%patch2 -p1
%if %{with_bundled_elfutils}
cd elfutils-%{elfutils_version}
%patch1 -p1
@ -1030,6 +1034,11 @@ done
# http://sourceware.org/systemtap/wiki/SystemTapReleases
%changelog
* Thu Sep 25 2014 Josh Stone <jistone@redhat.com> - 2.6-2
- Backport patches to improve dtrace's input flexibility
- Let dtrace use its old method if pyparsing fails (rhbz1131586)
- Allow dtrace -fPIC (rhbz1145993)
* Fri Sep 05 2014 Josh Stone <jistone@redhat.com> - 2.6-1
- Upstream release.