On Thu, Jun 04, 2026 at 03:09:26PM +0100, James Clark wrote:
[...]
@@ -1798,14 +1746,7 @@ static int cs_etm__sample(struct cs_etm_queue *etmq, tidq->period_instructions += tidq->packet->instr_count;
- /*
* Record a branch when the last instruction in* PREV_PACKET is a branch.*/- if (etm->synth_opts.last_branch &&
tidq->prev_packet->sample_type == CS_ETM_RANGE &&tidq->prev_packet->last_instr_taken_branch)cs_etm__update_last_branch_rb(etmq, tidq);
- cs_etm__add_stack_event(etmq, tidq);
Would it be cleaner to call this whenever a branch sample is generated?
We should not couple stack event and generating branch samples.
The reason is the stack event can be used separately by instruction samples, e.g., the option "--itrace=i100il64g16". And the branch stack and call chain must get ready before synthesing samples.
Seems like the conditions for calling thread_stack__event() and cs_etm__synth_branch_sample() are slightly different (ignoring the fact that branches are only generated when the user asks for them).
Maybe the conditions should be different, but maybe a comment why or if they're the same, a shared function for the conditions would help.
I can add a helper to check if a packet is taken branch and it can be used by cs_etm__add_stack_event() and generating samples.
bool cs_etm__packet_is_taken_branch(struct cs_etm_packet *packet) { if (packet->sample_type == CS_ETM_RANGE && packet->last_instr_taken_branch) return true;
return false; }
Thanks, Leo