Fix trace.py USDT argument filtering (#710)

diff --git a/tools/trace.py b/tools/trace.py
index d37c60d..2e168b0 100755
--- a/tools/trace.py
+++ b/tools/trace.py
@@ -299,6 +299,26 @@
                                         (idx, Probe.c_type[field_type], expr)
                 self._bail("unrecognized field type %s" % field_type)
 
+        def _generate_usdt_filter_read(self):
+            text = ""
+            if self.probe_type == "u":
+                    for arg, _ in Probe.aliases.items():
+                        if not (arg.startswith("arg") and (arg in self.filter)):
+                                continue
+                        arg_index = int(arg.replace("arg", ""))
+                        arg_ctype = self.usdt.get_probe_arg_ctype(
+                                self.usdt_name, arg_index)
+                        if not arg_ctype:
+                                self._bail("Unable to determine type of {} "
+                                           "in the filter".format(arg))
+                        text += """
+        {} {}_filter;
+        bpf_usdt_readarg({}, ctx, &{}_filter);
+                        """.format(arg_ctype, arg, arg_index, arg)
+                        self.filter = self.filter.replace(
+                                arg, "{}_filter".format(arg))
+            return text
+
         def generate_program(self, include_self):
                 data_decl = self._generate_data_decl()
                 # kprobes don't have built-in pid filters, so we have to add
@@ -331,6 +351,7 @@
 {
         %s
         %s
+        %s
         if (!(%s)) return 0;
 
         struct %s __data = {0};
@@ -343,7 +364,8 @@
 }
 """
                 text = text % (self.probe_name, signature,
-                               pid_filter, prefix, self.filter,
+                               pid_filter, prefix,
+                               self._generate_usdt_filter_read(), self.filter,
                                self.struct_name, data_fields, self.events_name)
 
                 return data_decl + "\n" + text