Received: by 2002:ab2:620c:0:b0:1ef:ffd0:ce49 with SMTP id o12csp667574lqt; Mon, 18 Mar 2024 22:55:00 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCW/OwGoEJAHDzXp8cPuxyrWkXtv6zIWezgZjuwjewxxUqKy7NUnjQJKQfs9ElQOFeLUzMHjDvretTKAcAb498A9CS3y64EniW55qE9cMQ== X-Google-Smtp-Source: AGHT+IEMKrU8mvimTShWbCLDox35lhGVksS9lSFUTvWx3vQHPxme9Yi+IgEb+jvIQGiBeOWVCtye X-Received: by 2002:ac8:7dc5:0:b0:430:b2f2:b9f1 with SMTP id c5-20020ac87dc5000000b00430b2f2b9f1mr13791662qte.48.1710827700335; Mon, 18 Mar 2024 22:55:00 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710827700; cv=pass; d=google.com; s=arc-20160816; b=LaO+JgrgzdhkvxoflDmjoKKPmIrxyl1yik7Ioi0lhNCtbyVovY5ZzTfVBxiW/WGyB2 Skl3QwxYWrRo0ZbUQ3ZvB/5OpW3ENgF7zcShCj8y3q/1cDKn2RE+ZhDA4TnRFNa3Jq0I 9PMcDvAKbtGZ8SiUmXHeY6mbd4BMfBZSM4odKcs7iDv6VVIN1SEQdZPMuTkPsi+d4e5E 2f/17637Fe7+SW2v4TJWe1jp+OE7qMzKcoKtuXQl2JL5wfgM5sJ0EuntCasXKeWHCnlB zLAvXti9BvQhc+lrLhyrVIBiTsbO7NDwE2QKR9hB6Kqpt9e0AHrY22qntfm19ymV/i0/ KARg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=hCf+n58uf4DRUbkcWSmRoidd6582s7pxlTzhrIFTR8c=; fh=44lErbL5kvNUjSV6UDWgBEjJyOJpjjMpxi6K+HFi+Bc=; b=tvsE0uAZhLyx2bBmKDxyX1WNJW7ES+TzXi2BAx9gZcr2wbvfx/zuynfbl1z6784GX6 LijbYmEAYqt+NNQlU3jegfmgUmpbWaCAbZBi1llVjUu1Y/qR0p/WHuQG2g2X5JPZif0D VqVhCy2IGqchtw6PNEbZD6/gfQMZzrgW1FN4ctnO/Kam/Cnp5i5MllKf2tVB4uLHrJVa llzrfR5sBori2HkjI+IPIFaB0QoHqp5nwrSRaNSxYe7tZUC9cstG6VDupmefwp8TS8Dc alBDlG+B+u2AUg7xEouS7xYGJ9e9b2LnkZPuDgoOCuEy4n/UlHv+CFl/BtfsAutjgeCU tFCQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CmHLe6hS; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-107041-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-107041-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id n19-20020a05622a041300b0042ef826e657si11631548qtx.43.2024.03.18.22.55.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Mar 2024 22:55:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-107041-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=CmHLe6hS; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-107041-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-107041-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 1412B1C21890 for ; Tue, 19 Mar 2024 05:55:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0CDE77E11A; Tue, 19 Mar 2024 05:51:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CmHLe6hS" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BE167F7C2; Tue, 19 Mar 2024 05:51:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710827487; cv=none; b=EEB8U/4e3ok3HX5w3pqjJP23ulx5CVus1tMgyYZzmYASBaaqvckTfN+ujsZBO0nSzixChnOc1HSehhPsAXeycdmrWBTtRDTtnd4bZLr411wj0qGnSzSxgo51oVqK+5le0nmH47+2AB43Edxl6wQ3Rd6a7ddBnYhcqpWQENYYGUA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710827487; c=relaxed/simple; bh=QLyOSfT8f1zHgXyW3/7xJapPDD+hyj+Y2KOoSnTTUs4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U+DUcln8KBj8sgBwIj94HZCuNAow+ilicr5c4TuNPJy+AcaLN90W5EujsVOoQvXRP/9o3Ho9aW9tF8atHhmSacyusCTYfIKwowPfHasx6lV9WZBDt4Kp4lfnMmdK98G2IfhYSZVw7bnOaK54kKE2Mnebj6tSopmiDc0en+sb6kc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CmHLe6hS; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36E9BC433B1; Tue, 19 Mar 2024 05:51:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710827486; bh=QLyOSfT8f1zHgXyW3/7xJapPDD+hyj+Y2KOoSnTTUs4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CmHLe6hSMentoh66Ns63Ow8SJ319+tSJ5SCofEnzoYJpYnbqad4sc5tlYLMlM2FhR yawE2ROfAXRvHUkzQjozN9FWLx2clQOi42acR01FJi1VPvMEqjlCHTrnh0hzDM5MyC TkkN0gfLoPsIDq2lSdMXEK1VfeDIOViDGew47V8b21vXdsRQV+CBRRsihHYzufum2X FcxIfTFnA6rd1vIgKrLUvewylHe+ejPbTdIJHTClx3Merjt5uSH18gN8eShL0wgTdx twudnPQLHM+S4dI6ZwGNWkNZpyjelOcQegeO7n5xK0CmTdGxLyx9R5unyRBQqA31Aw scQnTbr0DDYDg== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Linus Torvalds , Stephane Eranian , Masami Hiramatsu , linux-toolchains@vger.kernel.org, linux-trace-devel@vger.kernel.org Subject: [PATCH 15/23] perf annotate-data: Check register state for type Date: Mon, 18 Mar 2024 22:51:07 -0700 Message-ID: <20240319055115.4063940-16-namhyung@kernel.org> X-Mailer: git-send-email 2.44.0.291.gc1ea87d7ee-goog In-Reply-To: <20240319055115.4063940-1-namhyung@kernel.org> References: <20240319055115.4063940-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit As instruction tracking updates the type state for each register, check the final type info for the target register at the given instruction. Signed-off-by: Namhyung Kim --- tools/perf/util/annotate-data.c | 88 ++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c index 13ba65693367..f5329a78a97d 100644 --- a/tools/perf/util/annotate-data.c +++ b/tools/perf/util/annotate-data.c @@ -788,12 +788,83 @@ static void delete_var_types(struct die_var_type *var_types) } /* It's at the target address, check if it has a matching type */ -static bool find_matching_type(struct type_state *state __maybe_unused, - struct data_loc_info *dloc __maybe_unused, - int reg __maybe_unused, - Dwarf_Die *type_die __maybe_unused) +static bool check_matching_type(struct type_state *state, + struct data_loc_info *dloc, int reg, + Dwarf_Die *type_die) { - /* TODO */ + Dwarf_Word size; + u32 insn_offset = dloc->ip - dloc->ms->sym->start; + + pr_debug_dtp("chk [%x] reg%d offset=%#x ok=%d", + insn_offset, reg, dloc->op->offset, state->regs[reg].ok); + + if (state->regs[reg].ok) { + int tag = dwarf_tag(&state->regs[reg].type); + + pr_debug_dtp("\n"); + + /* + * Normal registers should hold a pointer (or array) to + * dereference a memory location. + */ + if (tag != DW_TAG_pointer_type && tag != DW_TAG_array_type) + return false; + + /* Remove the pointer and get the target type */ + if (die_get_real_type(&state->regs[reg].type, type_die) == NULL) + return false; + + dloc->type_offset = dloc->op->offset; + + /* Get the size of the actual type */ + if (dwarf_aggregate_size(type_die, &size) < 0 || + (unsigned)dloc->type_offset >= size) + return false; + + return true; + } + + if (reg == dloc->fbreg) { + struct type_state_stack *stack; + + pr_debug_dtp(" fbreg\n"); + + stack = find_stack_state(state, dloc->type_offset); + if (stack == NULL) + return false; + + *type_die = stack->type; + /* Update the type offset from the start of slot */ + dloc->type_offset -= stack->offset; + + return true; + } + + if (dloc->fb_cfa) { + struct type_state_stack *stack; + u64 pc = map__rip_2objdump(dloc->ms->map, dloc->ip); + int fbreg, fboff; + + pr_debug_dtp(" cfa\n"); + + if (die_get_cfa(dloc->di->dbg, pc, &fbreg, &fboff) < 0) + fbreg = -1; + + if (reg != fbreg) + return false; + + stack = find_stack_state(state, dloc->type_offset - fboff); + if (stack == NULL) + return false; + + *type_die = stack->type; + /* Update the type offset from the start of slot */ + dloc->type_offset -= fboff + stack->offset; + + return true; + } + + pr_debug_dtp("\n"); return false; } @@ -825,8 +896,8 @@ static bool find_data_type_insn(struct data_loc_info *dloc, int reg, update_var_state(&state, dloc, addr, dl->al.offset, var_types); if (this_ip == dloc->ip) { - found = find_matching_type(&state, dloc, reg, - type_die); + found = check_matching_type(&state, dloc, reg, + type_die); goto out; } @@ -896,6 +967,9 @@ static int find_data_type_block(struct data_loc_info *dloc, int reg, if (find_data_type_insn(dloc, reg, &basic_blocks, var_types, cu_die, type_die)) { ret = 0; + pr_debug_dtp("found by insn track: %#x(reg%d) type-offset=%#x", + dloc->op->offset, reg, dloc->type_offset); + pr_debug_type_name(type_die); break; } -- 2.44.0.291.gc1ea87d7ee-goog