import CS systemtap-5.3-3.el9
This commit is contained in:
		
							parent
							
								
									7495b4b165
								
							
						
					
					
						commit
						cee91c4e47
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | |||||||
| SOURCES/systemtap-5.2.tar.gz | SOURCES/systemtap-5.3.tar.gz | ||||||
|  | |||||||
| @ -1 +1 @@ | |||||||
| c4a891e0732378f7ff6131e59aa6e173282a6adb SOURCES/systemtap-5.2.tar.gz | 5a3cbaf151ef6d8621ba24fefc1c2304a041d377 SOURCES/systemtap-5.3.tar.gz | ||||||
|  | |||||||
| @ -1,223 +0,0 @@ | |||||||
| commit 8b87bd584dcadb3713eaf6d0c9b540b4f54124bf |  | ||||||
| gpg: Signature made Mon 11 Nov 2024 11:48:03 AM EST |  | ||||||
| gpg:                using RSA key D8F2E95271BA794E222FBEE0DB83606EC7DAAB26 |  | ||||||
| gpg: Can't check signature: No public key |  | ||||||
| Author: Martin Cermak <mcermak@redhat.com> |  | ||||||
| Date:   Mon Nov 11 17:41:53 2024 +0100 |  | ||||||
| 
 |  | ||||||
|     PR32302:  Emit forward decls within tracepoint_derived_probe_group() too |  | ||||||
|      |  | ||||||
|     Forward decls added in commit 069def0ae9184 need to actually be |  | ||||||
|     emitted in 2 locations, roughtly corresponding to where |  | ||||||
|     tracepoint_extra_decls() is used. |  | ||||||
|      |  | ||||||
|     It would be ideal to put them directly to tracepoint_extra_decls() |  | ||||||
|     but that gives significantly less recognized tracepoints. |  | ||||||
|      |  | ||||||
|     The plan is toreview this again though and try to merge the |  | ||||||
|     tracepoint_forward_decls() body into tracepoint_extra_decls() |  | ||||||
|     if possible. |  | ||||||
| 
 |  | ||||||
| diff --git a/tapsets.cxx b/tapsets.cxx
 |  | ||||||
| index b4ad7e14e..06540cafc 100644
 |  | ||||||
| --- a/tapsets.cxx
 |  | ||||||
| +++ b/tapsets.cxx
 |  | ||||||
| @@ -11729,6 +11729,89 @@ static bool header_exists(systemtap_session& s, const string& header)
 |  | ||||||
|    return false; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static vector<string> tracepoint_forward_decls ()
 |  | ||||||
| +{
 |  | ||||||
| +    vector<string> retval;
 |  | ||||||
| +    // Kernel 6.12
 |  | ||||||
| +    retval.push_back("enum cachefiles_content;");
 |  | ||||||
| +    retval.push_back("enum extent_type;");
 |  | ||||||
| +    retval.push_back("struct bch_fs;");
 |  | ||||||
| +    retval.push_back("struct bch_move_stats;");
 |  | ||||||
| +    retval.push_back("struct bpos;");
 |  | ||||||
| +    retval.push_back("struct btree_bkey_cached_common;");
 |  | ||||||
| +    retval.push_back("struct btree_insert_entry;");
 |  | ||||||
| +    retval.push_back("struct btree_path;");
 |  | ||||||
| +    retval.push_back("struct btree_trans;");
 |  | ||||||
| +    retval.push_back("struct cachefiles_msg;");
 |  | ||||||
| +    retval.push_back("struct cachefiles_open;");
 |  | ||||||
| +    retval.push_back("struct cachefiles_read;");
 |  | ||||||
| +    retval.push_back("struct cachefiles_volume;");
 |  | ||||||
| +    retval.push_back("struct clk_rate_request;");
 |  | ||||||
| +    retval.push_back("struct compact_control;");
 |  | ||||||
| +    retval.push_back("struct fsi_device;");
 |  | ||||||
| +    retval.push_back("struct fsi_msg;");
 |  | ||||||
| +    retval.push_back("struct fsi_slave;");
 |  | ||||||
| +    retval.push_back("struct fuse_req;");
 |  | ||||||
| +    retval.push_back("struct get_locks_fail;");
 |  | ||||||
| +    retval.push_back("struct gss_cred;");
 |  | ||||||
| +    retval.push_back("struct handshake_req;");
 |  | ||||||
| +    retval.push_back("struct i2c_client;");
 |  | ||||||
| +    retval.push_back("struct ib_mad_agent_private;");
 |  | ||||||
| +    retval.push_back("struct ib_mad_qp_info;");
 |  | ||||||
| +    retval.push_back("struct ib_mad_send_wr_private;");
 |  | ||||||
| +    retval.push_back("struct ib_smp;");
 |  | ||||||
| +    retval.push_back("struct iomap;");
 |  | ||||||
| +    retval.push_back("struct iomap_iter;");
 |  | ||||||
| +    retval.push_back("struct mctp_sk_key;");
 |  | ||||||
| +    retval.push_back("struct mptcp_ext;");
 |  | ||||||
| +    retval.push_back("struct mptcp_subflow_context;");
 |  | ||||||
| +    retval.push_back("struct nbd_request;");
 |  | ||||||
| +    retval.push_back("struct netfs_io_request;");
 |  | ||||||
| +    retval.push_back("struct netfs_io_stream;");
 |  | ||||||
| +    retval.push_back("struct netfs_io_subrequest;");
 |  | ||||||
| +    retval.push_back("struct nfs42_clone_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_copy_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_copy_notify_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_copy_notify_res;");
 |  | ||||||
| +    retval.push_back("struct nfs42_copy_res;");
 |  | ||||||
| +    retval.push_back("struct nfs42_falloc_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_offload_status_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_seek_args;");
 |  | ||||||
| +    retval.push_back("struct nfs42_seek_res;");
 |  | ||||||
| +    retval.push_back("struct nfs_direct_req;");
 |  | ||||||
| +    retval.push_back("struct nfs_page;");
 |  | ||||||
| +    retval.push_back("struct opa_smp;");
 |  | ||||||
| +    retval.push_back("struct p9_fid;");
 |  | ||||||
| +    retval.push_back("struct pwc_device;");
 |  | ||||||
| +    retval.push_back("struct request;");
 |  | ||||||
| +    retval.push_back("struct rpc_auth;");
 |  | ||||||
| +    retval.push_back("struct rpc_gss_wire_cred;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_ep;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_mr;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_notification;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_rep;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_req;");
 |  | ||||||
| +    retval.push_back("struct rpcrdma_xprt;");
 |  | ||||||
| +    retval.push_back("struct rpc_rqst;");
 |  | ||||||
| +    retval.push_back("struct rpc_task;");
 |  | ||||||
| +    retval.push_back("struct selinux_audit_data;");
 |  | ||||||
| +    retval.push_back("struct spi_device;");
 |  | ||||||
| +    retval.push_back("struct svc_rdma_chunk;");
 |  | ||||||
| +    retval.push_back("struct svc_rdma_recv_ctxt;");
 |  | ||||||
| +    retval.push_back("struct svc_rdma_segment;");
 |  | ||||||
| +    retval.push_back("struct svc_rdma_send_ctxt;");
 |  | ||||||
| +    retval.push_back("struct svc_rqst;");
 |  | ||||||
| +    retval.push_back("struct svcxprt_rdma;");
 |  | ||||||
| +    retval.push_back("struct tmigr_cpu;");
 |  | ||||||
| +    retval.push_back("struct tmigr_group;");
 |  | ||||||
| +    retval.push_back("struct virtio_gpu_ctrl_hdr;");
 |  | ||||||
| +    retval.push_back("struct virtqueue;");
 |  | ||||||
| +    retval.push_back("struct somenonexistentstruct_123;");
 |  | ||||||
| +    retval.push_back("union ifs_sbaf;");
 |  | ||||||
| +    retval.push_back("union ifs_sbaf_status;");
 |  | ||||||
| +    retval.push_back("union tmigr_state;");
 |  | ||||||
| +    return retval;
 |  | ||||||
| +}
 |  | ||||||
|   |  | ||||||
|  static vector<string> tracepoint_extra_decls (systemtap_session& s, |  | ||||||
|  					      const string& header, |  | ||||||
| @@ -12187,6 +12270,8 @@ tracepoint_derived_probe_group::emit_module_decls (systemtap_session& s)
 |  | ||||||
|    s.op->newline(); |  | ||||||
|   |  | ||||||
|   |  | ||||||
| +
 |  | ||||||
| +
 |  | ||||||
|    // We create a MODULE_aux_N.c file for each tracepoint header, to allow them |  | ||||||
|    // to be separately compiled.  That's because kernel tracepoint headers sometimes |  | ||||||
|    // conflict.  PR13155. |  | ||||||
| @@ -12207,6 +12292,11 @@ tracepoint_derived_probe_group::emit_module_decls (systemtap_session& s)
 |  | ||||||
|            tpop = s.op_create_auxiliary(); |  | ||||||
|            per_header_aux[header] = tpop; |  | ||||||
|   |  | ||||||
| +          // add needed forward decls/#includes
 |  | ||||||
| +          static vector<string> forward_decls = tracepoint_forward_decls();
 |  | ||||||
| +          for (unsigned z=0; z<forward_decls.size(); z++)
 |  | ||||||
| +             tpop->newline()<< forward_decls[z] << "\n";
 |  | ||||||
| +
 |  | ||||||
|            // PR9993: Add extra headers to work around undeclared types in individual |  | ||||||
|            // include/trace/foo.h files |  | ||||||
|            const vector<string>& extra_decls = tracepoint_extra_decls (s, header, |  | ||||||
| @@ -12773,83 +12863,10 @@ tracepoint_builder::get_tracequery_modules(systemtap_session& s,
 |  | ||||||
|        osrc << "#ifdef CONFIG_TRACEPOINTS" << endl; |  | ||||||
|        osrc << "#include <linux/tracepoint.h>" << endl; |  | ||||||
|   |  | ||||||
| -      osrc << "enum cachefiles_content;" << endl;
 |  | ||||||
| -      osrc << "enum extent_type;" << endl;
 |  | ||||||
| -      osrc << "struct bch_fs;" << endl;
 |  | ||||||
| -      osrc << "struct bch_move_stats;" << endl;
 |  | ||||||
| -      osrc << "struct bpos;" << endl;
 |  | ||||||
| -      osrc << "struct btree_bkey_cached_common;" << endl;
 |  | ||||||
| -      osrc << "struct btree_insert_entry;" << endl;
 |  | ||||||
| -      osrc << "struct btree_path;" << endl;
 |  | ||||||
| -      osrc << "struct btree_trans;" << endl;
 |  | ||||||
| -      osrc << "struct cachefiles_msg;" << endl;
 |  | ||||||
| -      osrc << "struct cachefiles_open;" << endl;
 |  | ||||||
| -      osrc << "struct cachefiles_read;" << endl;
 |  | ||||||
| -      osrc << "struct cachefiles_volume;" << endl;
 |  | ||||||
| -      osrc << "struct clk_rate_request;" << endl;
 |  | ||||||
| -      osrc << "struct compact_control;" << endl;
 |  | ||||||
| -      osrc << "struct fsi_device;" << endl;
 |  | ||||||
| -      osrc << "struct fsi_msg;" << endl;
 |  | ||||||
| -      osrc << "struct fsi_slave;" << endl;
 |  | ||||||
| -      osrc << "struct fuse_req;" << endl;
 |  | ||||||
| -      osrc << "struct get_locks_fail;" << endl;
 |  | ||||||
| -      osrc << "struct gss_cred;" << endl;
 |  | ||||||
| -      osrc << "struct handshake_req;" << endl;
 |  | ||||||
| -      osrc << "struct i2c_client;" << endl;
 |  | ||||||
| -      osrc << "struct ib_mad_agent_private;" << endl;
 |  | ||||||
| -      osrc << "struct ib_mad_qp_info;" << endl;
 |  | ||||||
| -      osrc << "struct ib_mad_send_wr_private;" << endl;
 |  | ||||||
| -      osrc << "struct ib_smp;" << endl;
 |  | ||||||
| -      osrc << "struct iomap;" << endl;
 |  | ||||||
| -      osrc << "struct iomap_iter;" << endl;
 |  | ||||||
| -      osrc << "struct mctp_sk_key;" << endl;
 |  | ||||||
| -      osrc << "struct mptcp_ext;" << endl;
 |  | ||||||
| -      osrc << "struct mptcp_subflow_context;" << endl;
 |  | ||||||
| -      osrc << "struct nbd_request;" << endl;
 |  | ||||||
| -      osrc << "struct netfs_io_request;" << endl;
 |  | ||||||
| -      osrc << "struct netfs_io_stream;" << endl;
 |  | ||||||
| -      osrc << "struct netfs_io_subrequest;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_clone_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_copy_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_copy_notify_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_copy_notify_res;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_copy_res;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_falloc_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_offload_status_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_seek_args;" << endl;
 |  | ||||||
| -      osrc << "struct nfs42_seek_res;" << endl;
 |  | ||||||
| -      osrc << "struct nfs_direct_req;" << endl;
 |  | ||||||
| -      osrc << "struct nfs_page;" << endl;
 |  | ||||||
| -      osrc << "struct opa_smp;" << endl;
 |  | ||||||
| -      osrc << "struct p9_fid;" << endl;
 |  | ||||||
| -      osrc << "struct pwc_device;" << endl;
 |  | ||||||
| -      osrc << "struct request;" << endl;
 |  | ||||||
| -      osrc << "struct rpc_auth;" << endl;
 |  | ||||||
| -      osrc << "struct rpc_gss_wire_cred;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_ep;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_mr;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_notification;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_rep;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_req;" << endl;
 |  | ||||||
| -      osrc << "struct rpcrdma_xprt;" << endl;
 |  | ||||||
| -      osrc << "struct rpc_rqst;" << endl;
 |  | ||||||
| -      osrc << "struct rpc_task;" << endl;
 |  | ||||||
| -      osrc << "struct selinux_audit_data;" << endl;
 |  | ||||||
| -      osrc << "struct spi_device;" << endl;
 |  | ||||||
| -      osrc << "struct svc_rdma_chunk;" << endl;
 |  | ||||||
| -      osrc << "struct svc_rdma_recv_ctxt;" << endl;
 |  | ||||||
| -      osrc << "struct svc_rdma_segment;" << endl;
 |  | ||||||
| -      osrc << "struct svc_rdma_send_ctxt;" << endl;
 |  | ||||||
| -      osrc << "struct svc_rqst;" << endl;
 |  | ||||||
| -      osrc << "struct svcxprt_rdma;" << endl;
 |  | ||||||
| -      osrc << "struct tmigr_cpu;" << endl;
 |  | ||||||
| -      osrc << "struct tmigr_group;" << endl;
 |  | ||||||
| -      osrc << "struct virtio_gpu_ctrl_hdr;" << endl;
 |  | ||||||
| -      osrc << "struct virtqueue;" << endl;
 |  | ||||||
| -      osrc << "struct somenonexistentstruct_123;" << endl;
 |  | ||||||
| -      osrc << "union ifs_sbaf;" << endl;
 |  | ||||||
| -      osrc << "union ifs_sbaf_status;" << endl;
 |  | ||||||
| -      osrc << "union tmigr_state;" << endl;
 |  | ||||||
| +      // add needed forward decls/#includes
 |  | ||||||
| +      static vector<string> forward_decls = tracepoint_forward_decls();
 |  | ||||||
| +      for (unsigned z=0; z<forward_decls.size(); z++)
 |  | ||||||
| +        osrc << forward_decls[z] << "\n";
 |  | ||||||
|   |  | ||||||
|        // BPF raw tracepoint macros for creating the multiple fields |  | ||||||
|        // of the data struct that describes the raw tracepoint. |  | ||||||
							
								
								
									
										604
									
								
								SOURCES/systemtap-defined.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										604
									
								
								SOURCES/systemtap-defined.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,604 @@ | |||||||
|  | commit 4eb1b10d893b8020315df7dd5215a087ebd39372 | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Mon May 19 16:51:42 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 1: improve diagnostics of @defined resolution | ||||||
|  |      | ||||||
|  |     The @defined construct is special in that it is attempted to be | ||||||
|  |     resolved to literal 1/0 fairly early during semantic analysis pass-2, | ||||||
|  |     so that it can guard $context variable references.  But this early | ||||||
|  |     processing is not that systematic: not all script level constructs | ||||||
|  |     properly nest with it.  Those cases that don't happen to match end | ||||||
|  |     up resolved to 0 as a fallback in late during pass-2, due to PR18079. | ||||||
|  |      | ||||||
|  |     This patch adds verbosity diagnostics for some of these cases, and a | ||||||
|  |     warning message for the fallback resolution path.  This triggers | ||||||
|  |     for the test case associated with this bugzilla report. | ||||||
|  | 
 | ||||||
|  | diff --git a/dwflpp.cxx b/dwflpp.cxx
 | ||||||
|  | index 1105272f2..62ae15837 100644
 | ||||||
|  | --- a/dwflpp.cxx
 | ||||||
|  | +++ b/dwflpp.cxx
 | ||||||
|  | @@ -4427,8 +4427,9 @@ dwflpp::literal_stmt_for_pointer (location_context &ctx,
 | ||||||
|  |                                    Dwarf_Die *die_mem) | ||||||
|  |  { | ||||||
|  |    if (sess.verbose>2) | ||||||
|  | -      clog << _F("literal_stmt_for_pointer: finding value for %s (%s)\n",
 | ||||||
|  | -                  dwarf_type_name(start_typedie).c_str(), (dwarf_diename(cu) ?: "<unknown>"));
 | ||||||
|  | +    clog << _("literal_stmt_for_pointer: finding value for ") << *e->tok
 | ||||||
|  | +         << _F(" type %s (%s)\n",
 | ||||||
|  | +               dwarf_type_name(start_typedie).c_str(), (dwarf_diename(cu) ?: "<unknown>"));
 | ||||||
|  |   | ||||||
|  |    assert(ctx.pointer != NULL); | ||||||
|  |    location *tail = ctx.translate_argument (ctx.pointer); | ||||||
|  | diff --git a/elaborate.cxx b/elaborate.cxx
 | ||||||
|  | index 865fe6555..023b4c08f 100644
 | ||||||
|  | --- a/elaborate.cxx
 | ||||||
|  | +++ b/elaborate.cxx
 | ||||||
|  | @@ -1894,7 +1894,7 @@ semantic_pass_symbols (systemtap_session& s)
 | ||||||
|  |        assert_no_interrupts(); | ||||||
|  |        stapfile* dome = s.files[i]; | ||||||
|  |   | ||||||
|  | -      // Pass 1: add globals and functions to systemtap-session primart list,
 | ||||||
|  | +      // Pass 1: add globals and functions to systemtap-session primary list,
 | ||||||
|  |        //         so the find_* functions find them | ||||||
|  |        // | ||||||
|  |        // NB: tapset global/function definitions may duplicate or conflict | ||||||
|  | @@ -2796,6 +2796,8 @@ symresolution_info::visit_symbol (symbol* e)
 | ||||||
|  |    vardecl* d = find_var (e->name, 0, e->tok); | ||||||
|  |    if (d) | ||||||
|  |      { | ||||||
|  | +      if (session.verbose > 4)
 | ||||||
|  | +        clog << "resolved variable " << *e->tok << " to " << *d->tok << endl;
 | ||||||
|  |        e->referent = d; | ||||||
|  |        e->name = d->name; | ||||||
|  |      } | ||||||
|  | @@ -2814,6 +2816,8 @@ symresolution_info::visit_symbol (symbol* e)
 | ||||||
|  |          // must be probe-condition expression | ||||||
|  |          throw SEMANTIC_ERROR (_("probe condition must not reference undeclared global"), e->tok); | ||||||
|  |        e->referent = v; | ||||||
|  | +      if (session.verbose > 4)
 | ||||||
|  | +        clog << "resolved variable " << *e->tok << " to new local" << endl;
 | ||||||
|  |      } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -5112,6 +5116,7 @@ const_folder::visit_defined_op (defined_op* e)
 | ||||||
|  |        // Don't be greedy... we'll only collapse one at a time so type | ||||||
|  |        // resolution can have another go at it. | ||||||
|  |        relaxed_p = false; | ||||||
|  | +      session.print_warning (_F("Collapsing unresolved @define to %ld", value), e->tok);
 | ||||||
|  |        literal_number* n = new literal_number (value); | ||||||
|  |        n->tok = e->tok; | ||||||
|  |        n->visit (this); | ||||||
|  | diff --git a/tapsets.cxx b/tapsets.cxx
 | ||||||
|  | index d25c85043..01fec29e3 100644
 | ||||||
|  | --- a/tapsets.cxx
 | ||||||
|  | +++ b/tapsets.cxx
 | ||||||
|  | @@ -3118,9 +3118,22 @@ var_expanding_visitor::visit_defined_op (defined_op* e)
 | ||||||
|  |   | ||||||
|  |      target_symbol* tsym = dynamic_cast<target_symbol*> (e->operand); | ||||||
|  |      if (tsym && tsym->saved_conversion_error) // failing | ||||||
|  | -      resolved = false;
 | ||||||
|  | +      {
 | ||||||
|  | +        if (sess.verbose>3)
 | ||||||
|  | +          {
 | ||||||
|  | +            for (const semantic_error *c = tsym->saved_conversion_error;
 | ||||||
|  | +                 c != 0;
 | ||||||
|  | +                 c = c->get_chain()) {
 | ||||||
|  | +              clog << _("variable location problem [man error::dwarf]: ") << c->what() << endl;
 | ||||||
|  | +            }
 | ||||||
|  | +          }
 | ||||||
|  | +        resolved = false;
 | ||||||
|  | +      }
 | ||||||
|  |      else if (e->operand == old_operand) // unresolved but not marked failing | ||||||
|  |        { | ||||||
|  | +        if (sess.verbose>3)
 | ||||||
|  | +          clog << _("@defined unresolved due to un-rewritten operand ") << *e << endl;
 | ||||||
|  | +        
 | ||||||
|  |          // There are some visitors that won't touch certain target_symbols, | ||||||
|  |          // e.g. dwarf_var_expanding_visitor won't resolve @cast.  We should | ||||||
|  |          // leave it for now so some other visitor can have a chance. | ||||||
|  | @@ -3132,6 +3145,8 @@ var_expanding_visitor::visit_defined_op (defined_op* e)
 | ||||||
|  |        resolved = true; | ||||||
|  |    } catch (const semantic_error& e) { | ||||||
|  |      // some uncooperative value like @perf("NO_SUCH_VALUE") | ||||||
|  | +    if (sess.verbose > 3)
 | ||||||
|  | +      clog << sess.build_error_msg (e);
 | ||||||
|  |      resolved = false; | ||||||
|  |    } | ||||||
|  |    defined_ops.pop (); | ||||||
|  | 
 | ||||||
|  | commit b36c59692966c6207bf6f69b2f6f91079f7b89ab | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Mon May 19 22:30:29 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 2: document new @defined() warning | ||||||
|  |      | ||||||
|  |     ... in [man stapprobes], though [man stap] is where autocast variable | ||||||
|  |     processing is documented in the "TYPECASTING" section. | ||||||
|  | 
 | ||||||
|  | diff --git a/elaborate.cxx b/elaborate.cxx
 | ||||||
|  | index 023b4c08f..c09e3ddca 100644
 | ||||||
|  | --- a/elaborate.cxx
 | ||||||
|  | +++ b/elaborate.cxx
 | ||||||
|  | @@ -5116,7 +5116,7 @@ const_folder::visit_defined_op (defined_op* e)
 | ||||||
|  |        // Don't be greedy... we'll only collapse one at a time so type | ||||||
|  |        // resolution can have another go at it. | ||||||
|  |        relaxed_p = false; | ||||||
|  | -      session.print_warning (_F("Collapsing unresolved @define to %ld", value), e->tok);
 | ||||||
|  | +      session.print_warning (_F("Collapsing unresolved @define to %ld [stapprobes]", value), e->tok);
 | ||||||
|  |        literal_number* n = new literal_number (value); | ||||||
|  |        n->tok = e->tok; | ||||||
|  |        n->visit (this); | ||||||
|  | diff --git a/man/stapprobes.3stap b/man/stapprobes.3stap
 | ||||||
|  | index 1f980567b..d395e3578 100644
 | ||||||
|  | --- a/man/stapprobes.3stap
 | ||||||
|  | +++ b/man/stapprobes.3stap
 | ||||||
|  | @@ -700,6 +700,11 @@ for use in conditionals such as
 | ||||||
|  |  .SAMPLE | ||||||
|  |  @defined($foo\->bar) ? $foo\->bar : 0 | ||||||
|  |  .ESAMPLE | ||||||
|  | +Use full $context variables or @cast() expressions in @define parameters
 | ||||||
|  | +for unambiguous processing.  The TYPECAST script-level variable
 | ||||||
|  | +facility is incompletely supported.  Simplify the parameters by reducing
 | ||||||
|  | +nesting or indirection, if encountering "Collapsing unresolved @define to ..."
 | ||||||
|  | +warnings.
 | ||||||
|  |  .TP | ||||||
|  |  @probewrite($VAR) | ||||||
|  |  see the PROBES section of \fIstap\fR(1). | ||||||
|  | 
 | ||||||
|  | commit e4786671a999d47003ea62525ed829c1784c03ea | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Thu May 22 17:14:53 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 3: include autocast processing in initial_typeres_pass | ||||||
|  |      | ||||||
|  |     This type resolution pass is done early, but previously purposefully | ||||||
|  |     ommitted opportunistic autocast expansion.  With it done there, once | ||||||
|  |     (in the usual relaxation loop), more autocast-based @defined / | ||||||
|  |     @choose_defined constructs will be processed in the way a user | ||||||
|  |     may expect. | ||||||
|  | 
 | ||||||
|  | diff --git a/elaborate.cxx b/elaborate.cxx
 | ||||||
|  | index c09e3ddca..b03f0aced 100644
 | ||||||
|  | --- a/elaborate.cxx
 | ||||||
|  | +++ b/elaborate.cxx
 | ||||||
|  | @@ -2602,7 +2602,7 @@ semantic_pass (systemtap_session& s)
 | ||||||
|  |        if (rc == 0) rc = semantic_pass_symbols (s); | ||||||
|  |        if (rc == 0) monitor_mode_write (s); | ||||||
|  |        if (rc == 0) rc = semantic_pass_conditions (s); | ||||||
|  | -      if (rc == 0) rc = semantic_pass_optimize1 (s);
 | ||||||
|  | +      if (rc == 0) rc = semantic_pass_optimize1 (s); // includes const_fold and last ditch @defined() processing
 | ||||||
|  |        if (rc == 0) rc = semantic_pass_types (s); | ||||||
|  |        if (rc == 0) rc = gen_dfa_table(s); | ||||||
|  |        if (rc == 0) add_global_var_display (s); | ||||||
|  | @@ -6045,7 +6045,7 @@ struct initial_typeresolution_info : public typeresolution_info
 | ||||||
|  |  static int initial_typeres_pass(systemtap_session& s) | ||||||
|  |  { | ||||||
|  |    // minimal type resolution based off of semantic_pass_types(), without | ||||||
|  | -  // checking for complete type resolutions or autocast expanding
 | ||||||
|  | +  // checking for complete type resolutions, PR32964 but including autocast expanding
 | ||||||
|  |    initial_typeresolution_info ti(s); | ||||||
|  |   | ||||||
|  |    ti.assert_resolvability = false; | ||||||
|  | @@ -6067,6 +6067,30 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |            ti.current_function = fd; | ||||||
|  |            ti.t = pe_unknown; | ||||||
|  |            fd->body->visit (& ti); | ||||||
|  | +
 | ||||||
|  | +          // Check and run the autocast expanding visitor.
 | ||||||
|  | +          if (ti.num_available_autocasts > 0)
 | ||||||
|  | +            {
 | ||||||
|  | +              autocast_expanding_visitor aev (s, ti);
 | ||||||
|  | +              aev.replace (fd->body);
 | ||||||
|  | +              
 | ||||||
|  | +              // PR18079, rerun the const-folder / dead-block-remover
 | ||||||
|  | +              // if autocast evaluation enabled a @defined()
 | ||||||
|  | +              if (! aev.relaxed())
 | ||||||
|  | +                {
 | ||||||
|  | +                  bool relaxed_p = true;
 | ||||||
|  | +                  const_folder cf (s, relaxed_p);
 | ||||||
|  | +                  cf.replace (fd->body);
 | ||||||
|  | +                  if (! s.unoptimized)
 | ||||||
|  | +                    {
 | ||||||
|  | +                      dead_control_remover dc (s, relaxed_p);
 | ||||||
|  | +                      fd->body->visit (&dc);
 | ||||||
|  | +                    }
 | ||||||
|  | +                  (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | +                }
 | ||||||
|  | +              
 | ||||||
|  | +              ti.num_available_autocasts = 0;
 | ||||||
|  | +            }
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |        for (unsigned j=0; j<s.probes.size(); j++) | ||||||
|  | @@ -6079,6 +6103,24 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |            ti.t = pe_unknown; | ||||||
|  |            pn->body->visit (& ti); | ||||||
|  |   | ||||||
|  | +          // Check and run the autocast expanding visitor.
 | ||||||
|  | +          if (ti.num_available_autocasts > 0)
 | ||||||
|  | +            {
 | ||||||
|  | +              autocast_expanding_visitor aev (s, ti);
 | ||||||
|  | +              var_expand_const_fold_loop (s, pn->body, aev);
 | ||||||
|  | +              // PR18079, rerun the const-folder / dead-block-remover
 | ||||||
|  | +              // if autocast evaluation enabled a @defined()
 | ||||||
|  | +              if (! s.unoptimized)
 | ||||||
|  | +                {
 | ||||||
|  | +                  bool relaxed_p;
 | ||||||
|  | +                  dead_control_remover dc (s, relaxed_p);
 | ||||||
|  | +                  pn->body->visit (&dc);
 | ||||||
|  | +                  (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | +                }
 | ||||||
|  | +              
 | ||||||
|  | +              ti.num_available_autocasts = 0;
 | ||||||
|  | +            }
 | ||||||
|  | +          
 | ||||||
|  |            probe_point* pp = pn->sole_location(); | ||||||
|  |            if (pp->condition) | ||||||
|  |              { | ||||||
|  | @@ -6147,30 +6189,8 @@ semantic_pass_types (systemtap_session& s)
 | ||||||
|  |              //   ti.unresolved (fd->tok); | ||||||
|  |              for (unsigned i=0; i < fd->locals.size(); ++i) | ||||||
|  |                ti.check_local (fd->locals[i]); | ||||||
|  | -            
 | ||||||
|  | -            // Check and run the autocast expanding visitor.
 | ||||||
|  | -            if (ti.num_available_autocasts > 0)
 | ||||||
|  | -              {
 | ||||||
|  | -                autocast_expanding_visitor aev (s, ti);
 | ||||||
|  | -                aev.replace (fd->body);
 | ||||||
|  | -
 | ||||||
|  | -                // PR18079, rerun the const-folder / dead-block-remover
 | ||||||
|  | -                // if autocast evaluation enabled a @defined()
 | ||||||
|  | -                if (! aev.relaxed())
 | ||||||
|  | -                  {
 | ||||||
|  | -                    bool relaxed_p = true;
 | ||||||
|  | -                    const_folder cf (s, relaxed_p);
 | ||||||
|  | -                    cf.replace (fd->body);
 | ||||||
|  | -                    if (! s.unoptimized)
 | ||||||
|  | -                      {
 | ||||||
|  | -                        dead_control_remover dc (s, relaxed_p);
 | ||||||
|  | -                        fd->body->visit (&dc);
 | ||||||
|  | -                      }
 | ||||||
|  | -                    (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | -                  }
 | ||||||
|  |   | ||||||
|  | -                ti.num_available_autocasts = 0;
 | ||||||
|  | -              }
 | ||||||
|  | +            // PR32964: autocast resolution is now done early in initial_typeres_pass
 | ||||||
|  |            } | ||||||
|  |          catch (const semantic_error& e) | ||||||
|  |            { | ||||||
|  | @@ -6191,24 +6211,8 @@ semantic_pass_types (systemtap_session& s)
 | ||||||
|  |              pn->body->visit (& ti); | ||||||
|  |              for (unsigned i=0; i < pn->locals.size(); ++i) | ||||||
|  |                ti.check_local (pn->locals[i]); | ||||||
|  | -            
 | ||||||
|  | -            // Check and run the autocast expanding visitor.
 | ||||||
|  | -            if (ti.num_available_autocasts > 0)
 | ||||||
|  | -              {
 | ||||||
|  | -                autocast_expanding_visitor aev (s, ti);
 | ||||||
|  | -                var_expand_const_fold_loop (s, pn->body, aev);
 | ||||||
|  | -                // PR18079, rerun the const-folder / dead-block-remover
 | ||||||
|  | -                // if autocast evaluation enabled a @defined()
 | ||||||
|  | -                if (! s.unoptimized)
 | ||||||
|  | -                  {
 | ||||||
|  | -                    bool relaxed_p;
 | ||||||
|  | -                    dead_control_remover dc (s, relaxed_p);
 | ||||||
|  | -                    pn->body->visit (&dc);
 | ||||||
|  | -                    (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | -                  }
 | ||||||
|  |   | ||||||
|  | -                ti.num_available_autocasts = 0;
 | ||||||
|  | -              }
 | ||||||
|  | +            // PR32964: autocast resolution is now done early in initial_typeres_pass
 | ||||||
|  |               | ||||||
|  |              probe_point* pp = pn->sole_location(); | ||||||
|  |              if (pp->condition) | ||||||
|  | 
 | ||||||
|  | commit 3122ff592bdfcf553afa6683724e90c359f3c5c9 | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Fri May 30 17:50:10 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 4: let autocast pass propagate vardecl/symbol type_details | ||||||
|  |      | ||||||
|  |     The initial_typeres_pass now communicates relaxed status, | ||||||
|  |     and its autocast_expanding_visitor now passes vardecl type_details | ||||||
|  |     to the symbols.  This way, the existing const_folder etc. visitors | ||||||
|  |     can deduce enough type info for @defined(an_autocast_var->foo->bar) | ||||||
|  |     constructs, and early enough, that @defined() works as intended. | ||||||
|  |      | ||||||
|  |     New testsuite/semok/definedautocast.stp tests a simple case. | ||||||
|  | 
 | ||||||
|  | diff --git a/elaborate.cxx b/elaborate.cxx
 | ||||||
|  | index b03f0aced..7a1609f1b 100644
 | ||||||
|  | --- a/elaborate.cxx
 | ||||||
|  | +++ b/elaborate.cxx
 | ||||||
|  | @@ -5163,7 +5163,7 @@ const_folder::visit_target_symbol (target_symbol* e)
 | ||||||
|  |      } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int initial_typeres_pass(systemtap_session& s);
 | ||||||
|  | +static int initial_typeres_pass(systemtap_session& s, bool& relaxed_p);
 | ||||||
|  |  static int semantic_pass_const_fold (systemtap_session& s, bool& relaxed_p) | ||||||
|  |  { | ||||||
|  |    // attempt an initial type resolution pass to see if there are any type | ||||||
|  | @@ -5171,7 +5171,7 @@ static int semantic_pass_const_fold (systemtap_session& s, bool& relaxed_p)
 | ||||||
|  |    // with a const. | ||||||
|  |   | ||||||
|  |    // return if the initial type resolution pass reported errors (type mismatches) | ||||||
|  | -  int rc = initial_typeres_pass(s);
 | ||||||
|  | +  int rc = initial_typeres_pass(s, relaxed_p);
 | ||||||
|  |    if (rc) | ||||||
|  |      { | ||||||
|  |        relaxed_p = true; | ||||||
|  | @@ -5994,6 +5994,25 @@ struct autocast_expanding_visitor: public var_expanding_visitor
 | ||||||
|  |          } | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | +  void visit_symbol (symbol* e) // propagate referent exp_type
 | ||||||
|  | +  {
 | ||||||
|  | +    // PR32964: mimic typeresolution_info::resolve_details, for case
 | ||||||
|  | +    // where the symbol (autocast_op operand) is within a @defined().
 | ||||||
|  | +
 | ||||||
|  | +    if (e->referent && e->referent->type_details && !e->type_details)
 | ||||||
|  | +      {
 | ||||||
|  | +        const exp_type_ptr &src = e->referent->type_details;
 | ||||||
|  | +        exp_type_ptr &dest = e->type_details;
 | ||||||
|  | +        dest = src;
 | ||||||
|  | +        ti.num_newly_resolved++;
 | ||||||
|  | +        relaxed_p = false;
 | ||||||
|  | +        if (sess.verbose > 4)
 | ||||||
|  | +          clog << "resolved early type details " << *dest << " to " << *e->tok << endl;
 | ||||||
|  | +      }
 | ||||||
|  | +    var_expanding_visitor::visit_symbol (e);    
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  |    void visit_autocast_op (autocast_op* e) | ||||||
|  |      { | ||||||
|  |        const bool lvalue = is_active_lvalue (e); | ||||||
|  | @@ -6004,7 +6023,7 @@ struct autocast_expanding_visitor: public var_expanding_visitor
 | ||||||
|  |            if (fc) | ||||||
|  |              { | ||||||
|  |                ti.num_newly_resolved++; | ||||||
|  | -
 | ||||||
|  | +              relaxed_p = false;
 | ||||||
|  |                resolve_functioncall (fc); | ||||||
|  |  	      // NB: at this stage, the functioncall object has one | ||||||
|  |  	      // argument too few if we're in lvalue context.  It will | ||||||
|  | @@ -6042,7 +6061,7 @@ struct initial_typeresolution_info : public typeresolution_info
 | ||||||
|  |    void visit_cast_op (cast_op*) {} | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  | +static int initial_typeres_pass(systemtap_session& s, bool& relaxed_p)
 | ||||||
|  |  { | ||||||
|  |    // minimal type resolution based off of semantic_pass_types(), without | ||||||
|  |    // checking for complete type resolutions, PR32964 but including autocast expanding | ||||||
|  | @@ -6069,7 +6088,7 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |            fd->body->visit (& ti); | ||||||
|  |   | ||||||
|  |            // Check and run the autocast expanding visitor. | ||||||
|  | -          if (ti.num_available_autocasts > 0)
 | ||||||
|  | +          if (true || ti.num_available_autocasts > 0)
 | ||||||
|  |              { | ||||||
|  |                autocast_expanding_visitor aev (s, ti); | ||||||
|  |                aev.replace (fd->body); | ||||||
|  | @@ -6078,7 +6097,7 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |                // if autocast evaluation enabled a @defined() | ||||||
|  |                if (! aev.relaxed()) | ||||||
|  |                  { | ||||||
|  | -                  bool relaxed_p = true;
 | ||||||
|  | +                  // bool relaxed_p = true;
 | ||||||
|  |                    const_folder cf (s, relaxed_p); | ||||||
|  |                    cf.replace (fd->body); | ||||||
|  |                    if (! s.unoptimized) | ||||||
|  | @@ -6086,7 +6105,7 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |                        dead_control_remover dc (s, relaxed_p); | ||||||
|  |                        fd->body->visit (&dc); | ||||||
|  |                      } | ||||||
|  | -                  (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | +                  // (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  |                  } | ||||||
|  |                 | ||||||
|  |                ti.num_available_autocasts = 0; | ||||||
|  | @@ -6104,7 +6123,7 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |            pn->body->visit (& ti); | ||||||
|  |   | ||||||
|  |            // Check and run the autocast expanding visitor. | ||||||
|  | -          if (ti.num_available_autocasts > 0)
 | ||||||
|  | +          if (true || ti.num_available_autocasts > 0)
 | ||||||
|  |              { | ||||||
|  |                autocast_expanding_visitor aev (s, ti); | ||||||
|  |                var_expand_const_fold_loop (s, pn->body, aev); | ||||||
|  | @@ -6112,10 +6131,10 @@ static int initial_typeres_pass(systemtap_session& s)
 | ||||||
|  |                // if autocast evaluation enabled a @defined() | ||||||
|  |                if (! s.unoptimized) | ||||||
|  |                  { | ||||||
|  | -                  bool relaxed_p;
 | ||||||
|  | +                  // bool relaxed_p;
 | ||||||
|  |                    dead_control_remover dc (s, relaxed_p); | ||||||
|  |                    pn->body->visit (&dc); | ||||||
|  | -                  (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  | +                  // (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag
 | ||||||
|  |                  } | ||||||
|  |                 | ||||||
|  |                ti.num_available_autocasts = 0; | ||||||
|  | diff --git a/testsuite/semok/definedautocast.stp b/testsuite/semok/definedautocast.stp
 | ||||||
|  | new file mode 100755 | ||||||
|  | index 000000000..b28be6118
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/testsuite/semok/definedautocast.stp
 | ||||||
|  | @@ -0,0 +1,6 @@
 | ||||||
|  | +#! stap -Wp2
 | ||||||
|  | +
 | ||||||
|  | +probe kernel.function("do_exit") {
 | ||||||
|  | +	x = & @cast(0, "struct block_device")
 | ||||||
|  | +	println(@defined(x->__bd_flags->counter)) 
 | ||||||
|  | +}
 | ||||||
|  | 
 | ||||||
|  | commit 778ba67e356dc1820acc8ecdaa2c4b608c2eb184 | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Fri May 30 22:10:36 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 5: tweak type inference propagation | ||||||
|  |      | ||||||
|  |     Because some type inference is now performed earlier than before, | ||||||
|  |     coupled with early const-folding (so dead code elimination), tests | ||||||
|  |     like semko/binexpr_infer_type.stp started passing with immediately | ||||||
|  |     prior code.  That's because constructs like (foo*0) got quietly | ||||||
|  |     replaced by 0, even if foo was typed pe_string.  This patch | ||||||
|  |     compensates for this change in behaviour by: | ||||||
|  |      | ||||||
|  |     - typeresolution_info::resolve_2types now propagates types | ||||||
|  |       more aggressively & recursively in its three-way inference, | ||||||
|  |       so that the unknown x string x long case is detected in one | ||||||
|  |       incoming invocation of the function, instead of being | ||||||
|  |       deferred to some unknown later relaxation-iteration round. | ||||||
|  |      | ||||||
|  |     - typeresolution_info::mismatch reporting errors, independent | ||||||
|  |       of "assert_resolvability".  That flag was most likely meant | ||||||
|  |       for detection & rejection of pe_unknown types at the end of | ||||||
|  |       all the optimization stuff, not for ignoring outright known | ||||||
|  |       conflicts. | ||||||
|  | 
 | ||||||
|  | diff --git a/elaborate.cxx b/elaborate.cxx
 | ||||||
|  | index 7a1609f1b..d93a83eca 100644
 | ||||||
|  | --- a/elaborate.cxx
 | ||||||
|  | +++ b/elaborate.cxx
 | ||||||
|  | @@ -6683,21 +6683,21 @@ void resolve_2types (Referrer* referrer, Referent* referent,
 | ||||||
|  |        // propagate from upstream | ||||||
|  |        re_type = t; | ||||||
|  |        r->resolved (re_tok, re_type); | ||||||
|  | -      // catch re_type/te_type mismatch later
 | ||||||
|  | +      resolve_2types (referrer, referent, r, t, accept_unknown);
 | ||||||
|  |      } | ||||||
|  |    else if (re_type == pe_unknown && te_type != pe_unknown) | ||||||
|  |      { | ||||||
|  |        // propagate from referent | ||||||
|  |        re_type = te_type; | ||||||
|  |        r->resolved (re_tok, re_type); | ||||||
|  | -      // catch re_type/t mismatch later
 | ||||||
|  | +      resolve_2types (referrer, referent, r, t, accept_unknown);
 | ||||||
|  |      } | ||||||
|  |    else if (re_type != pe_unknown && te_type == pe_unknown) | ||||||
|  |      { | ||||||
|  |        // propagate to referent | ||||||
|  |        te_type = re_type; | ||||||
|  |        r->resolved (re_tok, re_type, referent); | ||||||
|  | -      // catch re_type/t mismatch later
 | ||||||
|  | +      resolve_2types (referrer, referent, r, t, accept_unknown);      
 | ||||||
|  |      } | ||||||
|  |    else if (! accept_unknown) | ||||||
|  |      r->unresolved (re_tok); | ||||||
|  | @@ -7636,14 +7636,14 @@ typeresolution_info::mismatch (const binary_expression* e)
 | ||||||
|  |  { | ||||||
|  |    num_still_unresolved ++; | ||||||
|  |   | ||||||
|  | -  if (assert_resolvability && mismatch_complexity <= 1)
 | ||||||
|  | +  if (mismatch_complexity <= 1)
 | ||||||
|  |      { | ||||||
|  |        stringstream msg; | ||||||
|  |        msg << _F("type mismatch: left and right sides don't agree (%s vs %s)", | ||||||
|  |                  lex_cast(e->left->type).c_str(), lex_cast(e->right->type).c_str()); | ||||||
|  |        session.print_error (SEMANTIC_ERROR (msg.str(), e->tok)); | ||||||
|  |      } | ||||||
|  | -  else if (!assert_resolvability)
 | ||||||
|  | +  else
 | ||||||
|  |      mismatch_complexity = max(1, mismatch_complexity); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -7656,7 +7656,7 @@ typeresolution_info::mismatch (const token* tok, exp_type t1, exp_type t2)
 | ||||||
|  |  { | ||||||
|  |    num_still_unresolved ++; | ||||||
|  |   | ||||||
|  | -  if (assert_resolvability && mismatch_complexity <= 2)
 | ||||||
|  | +  if (mismatch_complexity <= 2)
 | ||||||
|  |      { | ||||||
|  |        stringstream msg; | ||||||
|  |        msg << _F("type mismatch: expected %s", lex_cast(t1).c_str()); | ||||||
|  | @@ -7664,7 +7664,7 @@ typeresolution_info::mismatch (const token* tok, exp_type t1, exp_type t2)
 | ||||||
|  |          msg << _F(" but found %s", lex_cast(t2).c_str()); | ||||||
|  |        session.print_error (SEMANTIC_ERROR (msg.str(), tok)); | ||||||
|  |      } | ||||||
|  | -  else if (!assert_resolvability)
 | ||||||
|  | +  else
 | ||||||
|  |      mismatch_complexity = max(2, mismatch_complexity); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -7679,7 +7679,7 @@ typeresolution_info::mismatch (const token *tok, exp_type type,
 | ||||||
|  |  { | ||||||
|  |    num_still_unresolved ++; | ||||||
|  |   | ||||||
|  | -  if (assert_resolvability && mismatch_complexity <= 3)
 | ||||||
|  | +  if (mismatch_complexity <= 3)
 | ||||||
|  |      { | ||||||
|  |        assert(decl != NULL); | ||||||
|  |   | ||||||
|  | @@ -7737,7 +7737,7 @@ typeresolution_info::mismatch (const token *tok, exp_type type,
 | ||||||
|  |        err.set_chain(chain); | ||||||
|  |        session.print_error (err); | ||||||
|  |      } | ||||||
|  | -  else if (!assert_resolvability)
 | ||||||
|  | +  else
 | ||||||
|  |      mismatch_complexity = max(3, mismatch_complexity); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | 
 | ||||||
|  | commit fd4322e38d1e6504341b67329e112ccc1af387b6 | ||||||
|  | Author: Frank Ch. Eigler <fche@redhat.com> | ||||||
|  | Date:   Sat May 31 09:15:33 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     PR32964 part 6: NEWS & old testcase | ||||||
|  |      | ||||||
|  |     It turns out there was one old testcase that relied on type | ||||||
|  |     non-checking upon elided variables.  This test has been removed, and | ||||||
|  |     the change mentioned in NEWS.  Unfortunately, this is is hard to make | ||||||
|  |     conditional on --compatible=XXXX, so hypothetical old (arguably buggy) | ||||||
|  |     scripts may get hit. | ||||||
|  | 
 | ||||||
|  | diff --git a/NEWS b/NEWS
 | ||||||
|  | index 01b74a671..f1d78e8fa 100644
 | ||||||
|  | --- a/NEWS
 | ||||||
|  | +++ b/NEWS
 | ||||||
|  | @@ -1,3 +1,11 @@
 | ||||||
|  | +* What's new in version 5.4
 | ||||||
|  | +
 | ||||||
|  | +- Type checking and autocast processing have been made more thorough,
 | ||||||
|  | +  so elided variables are checked more and @defined() tests may be
 | ||||||
|  | +  more complicated.  Preexisting scripts that rely on elision for
 | ||||||
|  | +  bypassing type violations may now get caught.  No --compatible
 | ||||||
|  | +  option exists to suppress this new behaviour.
 | ||||||
|  | +
 | ||||||
|  |  * What's new in version 5.3, 2025-05-02 | ||||||
|  |   | ||||||
|  |  - Updated to support drastic linux 6.13 kbuild changes, numerous | ||||||
|  | diff --git a/testsuite/semok/pr30570.stp b/testsuite/semok/pr30570.stp
 | ||||||
|  | index b711b214c..dda7d027c 100755
 | ||||||
|  | --- a/testsuite/semok/pr30570.stp
 | ||||||
|  | +++ b/testsuite/semok/pr30570.stp
 | ||||||
|  | @@ -24,13 +24,16 @@ probe oneshot {
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  # error var and the try block are elided which means | ||||||
|  | -# it's not an issue to use e4 as a long here
 | ||||||
|  | -global e4 = 10
 | ||||||
|  | -probe oneshot {
 | ||||||
|  | -    try { }
 | ||||||
|  | -    catch (e4)
 | ||||||
|  | -    { }
 | ||||||
|  | -}
 | ||||||
|  | +# it's not an issue to use e4 as a long here ...
 | ||||||
|  | +# except after PR32964, type checking is done more
 | ||||||
|  | +# systematically on even elided variables, so this 
 | ||||||
|  | +# would be an error!
 | ||||||
|  | +# global e4 = 10
 | ||||||
|  | +# probe oneshot {
 | ||||||
|  | +#     try { }
 | ||||||
|  | +#     catch (e4)
 | ||||||
|  | +#     { }
 | ||||||
|  | +# }
 | ||||||
|  |   | ||||||
|  |  # e5 can be a global string | ||||||
|  |  global e5 = "foo" | ||||||
							
								
								
									
										59
									
								
								SOURCES/systemtap-dev_tapset.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								SOURCES/systemtap-dev_tapset.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | commit ea6ec6da37f1d3ec9ab1c3b5808287676c9d3742 | ||||||
|  | Author: William Cohen <wcohen@redhat.com> | ||||||
|  | Date:   Mon Jun 2 11:15:44 2025 -0400 | ||||||
|  | 
 | ||||||
|  |     RHEL-90805: Fix dev.stp tapset to work with RHEL 9.7 kernel | ||||||
|  |      | ||||||
|  |     RHEL 9.7 kernels have backported block dev support from Linux 6.14. | ||||||
|  |     The test in the dev.stp tapset checked the kernel version to determine | ||||||
|  |     where to get information and that test did not work in the case of | ||||||
|  |     code backported to the older RHEL 9 Linux 5.14 kernel.  The dev.stp | ||||||
|  |     code has been reworked to search for the particular member field | ||||||
|  |     holding the information instead. | ||||||
|  | 
 | ||||||
|  | diff --git a/tapset/linux/dev.stp b/tapset/linux/dev.stp
 | ||||||
|  | index f6b90c5d3..56b8e63c4 100644
 | ||||||
|  | --- a/tapset/linux/dev.stp
 | ||||||
|  | +++ b/tapset/linux/dev.stp
 | ||||||
|  | @@ -64,17 +64,19 @@ function disk_name:string(hd:long, partno:long)
 | ||||||
|  |  		return sprintf("%s%d", disk_name, partno) | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -%( kernel_v >= "6.10" %?
 | ||||||
|  |  %{ | ||||||
|  | +#include <linux/blk_types.h>
 | ||||||
|  |  #include <linux/blkdev.h> | ||||||
|  |  %} | ||||||
|  |   | ||||||
|  |  function bdev_partno(bdev:long) | ||||||
|  |  %{ /* pure */ /* unprivileged */ | ||||||
|  | +#ifdef BD_PARTNO
 | ||||||
|  |    STAP_RETURN(bdev_partno((const struct block_device *) STAP_ARG_bdev)); | ||||||
|  | +#else
 | ||||||
|  | +  STAP_RETURN(0);
 | ||||||
|  | +#endif
 | ||||||
|  |  %} | ||||||
|  | -%:
 | ||||||
|  | -%)
 | ||||||
|  |   | ||||||
|  |  function bdevname:string(bdev:long) | ||||||
|  |  { | ||||||
|  | @@ -84,15 +86,13 @@ function bdevname:string(bdev:long)
 | ||||||
|  |   | ||||||
|  |  	hd = bdev->bd_disk | ||||||
|  |   | ||||||
|  | -%( kernel_v >= "6.10" %?
 | ||||||
|  | -	partno = bdev_partno(bdev)
 | ||||||
|  | -%:
 | ||||||
|  | -	if (@defined(@cast(bdev, "block_device", "kernel")->bd_partno))
 | ||||||
|  | +	if (@defined(&bdev->__bd_flags))
 | ||||||
|  | +		partno = bdev_partno(bdev)
 | ||||||
|  | +	else if (@defined(bdev->bd_partno))
 | ||||||
|  |  		partno = bdev->bd_partno | ||||||
|  |  	else if (bdev->bd_part) | ||||||
|  |  		partno = bdev->bd_part->partno | ||||||
|  |  	else | ||||||
|  |  		partno = MINOR(bdev->bd_dev) - hd->first_minor; | ||||||
|  | -%)
 | ||||||
|  |  	return disk_name(hd, partno) | ||||||
|  |  } | ||||||
| @ -13,8 +13,8 @@ | |||||||
| %endif | %endif | ||||||
| %{!?with_rpm: %global with_rpm 1} | %{!?with_rpm: %global with_rpm 1} | ||||||
| %{!?elfutils_version: %global elfutils_version 0.179} | %{!?elfutils_version: %global elfutils_version 0.179} | ||||||
| %{!?with_boost: %global with_boost 0} | %{!?with_boost: %global with_boost 1} | ||||||
| %ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64 | %ifarch x86_64 ppc ppc64 ppc64le aarch64 | ||||||
| %{!?with_dyninst: %global with_dyninst 0%{?fedora} >= 18 || 0%{?rhel} >= 7} | %{!?with_dyninst: %global with_dyninst 0%{?fedora} >= 18 || 0%{?rhel} >= 7} | ||||||
| %else | %else | ||||||
| %{!?with_dyninst: %global with_dyninst 0} | %{!?with_dyninst: %global with_dyninst 0} | ||||||
| @ -45,6 +45,10 @@ | |||||||
| %{!?with_httpd: %global with_httpd 0} | %{!?with_httpd: %global with_httpd 0} | ||||||
| %{!?with_specific_python: %global with_specific_python 0%{?fedora} >= 31} | %{!?with_specific_python: %global with_specific_python 0%{?fedora} >= 31} | ||||||
| %{!?with_sysusers: %global with_sysusers 0%{?fedora} >= 32 || 0%{?rhel} >= 9} | %{!?with_sysusers: %global with_sysusers 0%{?fedora} >= 32 || 0%{?rhel} >= 9} | ||||||
|  | # NB: can't turn this on by default on any distro version whose builder system | ||||||
|  | # may run kernels different than the distro version itself. | ||||||
|  | %{!?with_check: %global with_check 0} | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # Virt is supported on these arches, even on el7, but it's not in core EL7 | # Virt is supported on these arches, even on el7, but it's not in core EL7 | ||||||
| %if 0%{?rhel} && 0%{?rhel} <= 7 | %if 0%{?rhel} && 0%{?rhel} <= 7 | ||||||
| @ -120,8 +124,8 @@ m     stapdev  stapdev | |||||||
| 
 | 
 | ||||||
| Name: systemtap | Name: systemtap | ||||||
| # PRERELEASE | # PRERELEASE | ||||||
| Version: 5.2 | Version: 5.3 | ||||||
| Release: 2%{?release_override}%{?dist} | Release: 3%{?release_override}%{?dist} | ||||||
| # for version, see also configure.ac | # for version, see also configure.ac | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -133,7 +137,7 @@ Release: 2%{?release_override}%{?dist} | |||||||
| # systemtap-runtime      /usr/bin/staprun, /usr/bin/stapsh, /usr/bin/stapdyn | # systemtap-runtime      /usr/bin/staprun, /usr/bin/stapsh, /usr/bin/stapdyn | ||||||
| # systemtap-client       /usr/bin/stap, samples, docs, tapset(bonus), req:-runtime | # systemtap-client       /usr/bin/stap, samples, docs, tapset(bonus), req:-runtime | ||||||
| # systemtap-initscript   /etc/init.d/systemtap, dracut module, req:systemtap | # systemtap-initscript   /etc/init.d/systemtap, dracut module, req:systemtap | ||||||
| # systemtap-sdt-devel    /usr/include/sys/sdt.h AND /usr/bin/dtrace | # systemtap-sdt-devel    /usr/include/sys/sdt.h | ||||||
| # systemtap-sdt-dtrace   /usr/bin/dtrace | # systemtap-sdt-dtrace   /usr/bin/dtrace | ||||||
| # systemtap-testsuite    /usr/share/systemtap/testsuite*, req:systemtap, req:sdt-devel | # systemtap-testsuite    /usr/share/systemtap/testsuite*, req:systemtap, req:sdt-devel | ||||||
| # systemtap-runtime-java libHelperSDT.so, HelperSDT.jar, stapbm, req:-runtime | # systemtap-runtime-java libHelperSDT.so, HelperSDT.jar, stapbm, req:-runtime | ||||||
| @ -158,7 +162,9 @@ Summary: Programmable system-wide instrumentation system | |||||||
| License: GPL-2.0-or-later | License: GPL-2.0-or-later | ||||||
| URL: https://sourceware.org/systemtap/ | URL: https://sourceware.org/systemtap/ | ||||||
| Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz | Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz | ||||||
| Patch0: PR32302.patch | 
 | ||||||
|  | Patch1: systemtap-defined.patch | ||||||
|  | Patch2: systemtap-dev_tapset.patch | ||||||
| 
 | 
 | ||||||
| # Build* | # Build* | ||||||
| BuildRequires: make | BuildRequires: make | ||||||
| @ -186,9 +192,7 @@ BuildRequires: pkgconfig(ncurses) | |||||||
| BuildRequires: systemd | BuildRequires: systemd | ||||||
| %endif | %endif | ||||||
| # Needed for libstd++ < 4.0, without <tr1/memory> | # Needed for libstd++ < 4.0, without <tr1/memory> | ||||||
| %if %{with_boost} |  | ||||||
| BuildRequires: boost-devel | BuildRequires: boost-devel | ||||||
| %endif |  | ||||||
| %if %{with_crash} | %if %{with_crash} | ||||||
| BuildRequires: crash-devel zlib-devel | BuildRequires: crash-devel zlib-devel | ||||||
| %endif | %endif | ||||||
| @ -244,6 +248,12 @@ BuildRequires: libuuid-devel | |||||||
| %if %{with_sysusers} | %if %{with_sysusers} | ||||||
| BuildRequires: systemd-rpm-macros | BuildRequires: systemd-rpm-macros | ||||||
| %endif | %endif | ||||||
|  | %if %{with_check} | ||||||
|  | BuildRequires: kernel-devel | ||||||
|  | # and some of the same Requires: as below | ||||||
|  | BuildRequires: dejagnu gcc make | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Install requirements | # Install requirements | ||||||
| @ -382,12 +392,13 @@ boot-time probing if supported. | |||||||
| Summary: Static probe support header files | Summary: Static probe support header files | ||||||
| License: GPL-2.0-or-later AND CC0-1.0 | License: GPL-2.0-or-later AND CC0-1.0 | ||||||
| URL: https://sourceware.org/systemtap/ | URL: https://sourceware.org/systemtap/ | ||||||
|  | # for RHEL buildability compatibility, pull in sdt-dtrace at all times | ||||||
|  | Requires: systemtap-sdt-dtrace = %{version}-%{release} | ||||||
| 
 | 
 | ||||||
| %description sdt-devel | %description sdt-devel | ||||||
| This package includes the <sys/sdt.h> header file used for static | This package includes the <sys/sdt.h> header file used for static | ||||||
| instrumentation compiled into userspace programs. | instrumentation compiled into userspace programs. | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| %package sdt-dtrace | %package sdt-dtrace | ||||||
| Summary: Static probe support dtrace tool | Summary: Static probe support dtrace tool | ||||||
| License: GPL-2.0-or-later AND CC0-1.0 | License: GPL-2.0-or-later AND CC0-1.0 | ||||||
| @ -595,8 +606,7 @@ or within a container. | |||||||
| # ------------------------------------------------------------------------ | # ------------------------------------------------------------------------ | ||||||
| 
 | 
 | ||||||
| %prep | %prep | ||||||
| %setup -q | %autosetup -p1 | ||||||
| %patch -P0 -p1 |  | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| 
 | 
 | ||||||
| @ -849,9 +859,18 @@ done | |||||||
| %py3_shebang_fix %{buildroot}%{python3_sitearch} %{buildroot}%{_bindir}/* | %py3_shebang_fix %{buildroot}%{python3_sitearch} %{buildroot}%{_bindir}/* | ||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
|  | %check | ||||||
|  | %if %{with_check} | ||||||
|  | make check RUNTESTFLAGS=environment_sanity.exp | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| %pre runtime | %pre runtime | ||||||
| %if %{with_sysusers} | %if %{with_sysusers} | ||||||
|  | %if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) | ||||||
| echo '%_systemtap_runtime_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-runtime.conf - | echo '%_systemtap_runtime_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-runtime.conf - | ||||||
|  | exit 0 | ||||||
|  | %endif | ||||||
| %else | %else | ||||||
| getent group stapusr >/dev/null || groupadd -f -g 156 -r stapusr | getent group stapusr >/dev/null || groupadd -f -g 156 -r stapusr | ||||||
| getent group stapsys >/dev/null || groupadd -f -g 157 -r stapsys | getent group stapsys >/dev/null || groupadd -f -g 157 -r stapsys | ||||||
| @ -859,23 +878,29 @@ getent group stapdev >/dev/null || groupadd -f -g 158 -r stapdev | |||||||
| getent passwd stapunpriv >/dev/null || \ | getent passwd stapunpriv >/dev/null || \ | ||||||
|   useradd -c "Systemtap Unprivileged User" -u 159 -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv 2>/dev/null || \ |   useradd -c "Systemtap Unprivileged User" -u 159 -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv 2>/dev/null || \ | ||||||
|   useradd -c "Systemtap Unprivileged User" -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv |   useradd -c "Systemtap Unprivileged User" -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv | ||||||
| %endif |  | ||||||
| exit 0 | exit 0 | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %pre server | %pre server | ||||||
| %if %{with_sysusers} | %if %{with_sysusers} | ||||||
|  | %if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) | ||||||
| echo '%_systemtap_server_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-server.conf - | echo '%_systemtap_server_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-server.conf - | ||||||
|  | exit 0 | ||||||
|  | %endif | ||||||
| %else | %else | ||||||
| getent group stap-server >/dev/null || groupadd -f -g 155 -r stap-server | getent group stap-server >/dev/null || groupadd -f -g 155 -r stap-server | ||||||
| getent passwd stap-server >/dev/null || \ | getent passwd stap-server >/dev/null || \ | ||||||
|   useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \ |   useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \ | ||||||
|   useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server |   useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server | ||||||
| %endif |  | ||||||
| exit 0 | exit 0 | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %pre testsuite | %pre testsuite | ||||||
| %if %{with_sysusers} | %if %{with_sysusers} | ||||||
|  | %if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) | ||||||
| echo '%_systemtap_testsuite_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-testsuite.conf - | echo '%_systemtap_testsuite_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-testsuite.conf - | ||||||
|  | exit 0 | ||||||
|  | %endif | ||||||
| %else | %else | ||||||
| getent passwd stapusr >/dev/null || \ | getent passwd stapusr >/dev/null || \ | ||||||
|     useradd -c "Systemtap 'stapusr' User" -g stapusr -r -s /sbin/nologin stapusr |     useradd -c "Systemtap 'stapusr' User" -g stapusr -r -s /sbin/nologin stapusr | ||||||
| @ -883,8 +908,8 @@ getent passwd stapsys >/dev/null || \ | |||||||
|     useradd -c "Systemtap 'stapsys' User" -g stapsys -G stapusr -r -s /sbin/nologin stapsys |     useradd -c "Systemtap 'stapsys' User" -g stapsys -G stapusr -r -s /sbin/nologin stapsys | ||||||
| getent passwd stapdev >/dev/null || \ | getent passwd stapdev >/dev/null || \ | ||||||
|     useradd -c "Systemtap 'stapdev' User" -g stapdev -G stapusr -r -s /sbin/nologin stapdev |     useradd -c "Systemtap 'stapdev' User" -g stapdev -G stapusr -r -s /sbin/nologin stapdev | ||||||
| %endif |  | ||||||
| exit 0 | exit 0 | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %post server | %post server | ||||||
| 
 | 
 | ||||||
| @ -1246,8 +1271,6 @@ exit 0 | |||||||
| %doc README AUTHORS NEWS  | %doc README AUTHORS NEWS  | ||||||
| %{!?_licensedir:%global license %%doc} | %{!?_licensedir:%global license %%doc} | ||||||
| %license COPYING | %license COPYING | ||||||
| %{_bindir}/dtrace |  | ||||||
| %{_mandir}/man1/dtrace.1* |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| %files sdt-dtrace | %files sdt-dtrace | ||||||
| @ -1330,6 +1353,16 @@ exit 0 | |||||||
| 
 | 
 | ||||||
| # PRERELEASE | # PRERELEASE | ||||||
| %changelog | %changelog | ||||||
|  | * Thu Jun 5 2025 William Cohen <wcohen@redhat.com> - 5.3-3 | ||||||
|  | - RHEL-90805: Update dev.stp tapset to handle RHEL-9.7 kernels. | ||||||
|  | 
 | ||||||
|  | * Mon May 12 2025 Martin Cermak <mcermak@redhat.com> - 5.3-2 | ||||||
|  | - RHEL-RHEL-89809: stap-server log owned by root | ||||||
|  | 
 | ||||||
|  | * Fri May 02 2025 Frank Ch. Eigler <fche@redhat.com> - 5.3-1 | ||||||
|  | - Upstream release, see wiki page below for detailed notes. | ||||||
|  |   https://sourceware.org/systemtap/wiki/SystemTapReleases | ||||||
|  | 
 | ||||||
| * Fri Nov 15 2024 Frank Ch. Eigler <fche@redhat.com> - 5.2-2 | * Fri Nov 15 2024 Frank Ch. Eigler <fche@redhat.com> - 5.2-2 | ||||||
| - RHEL-67586: supply /usr/bin/dtrace in sdt-devel subrpm too | - RHEL-67586: supply /usr/bin/dtrace in sdt-devel subrpm too | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user