From patchwork Wed May 22 11:47:30 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venkataramanan Kumar X-Patchwork-Id: 17086 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ee0-f71.google.com (mail-ee0-f71.google.com [74.125.83.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id DB89E238FE for ; Wed, 22 May 2013 11:48:28 +0000 (UTC) Received: by mail-ee0-f71.google.com with SMTP id t10sf1473154eei.2 for ; Wed, 22 May 2013 04:47:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-beenthere:x-forwarded-to:x-forwarded-for:delivered-to :mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:x-gm-message-state:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-google-group-id:list-post:list-help:list-archive:list-unsubscribe :content-type; bh=LO9EsTMM+gQb+GhjODswnRhbacHHQyui8KkgwDrHWaM=; b=Wvyn/VrF7cQTSKM/SOFT+A+Wp20BpUfU7Aj9ZaJeFXQH1LGijWetogLiUovTOJPyNQ IwpekC2Jtp3jhQmG2ykFrPtI36L40JUpFYNyDzRhxOw3bymKe+6dAYTSHzMpYlGo/Gat Eo75Cwxnci16qXm12pOSuuVcNZ458YhsLBZX3YsAvy+VNEFIFdoRlUDsS65rK2XdIBTR Be1+NCPflrNbsjmkfRqFy0l8dY0Ys18N1aI7JG3j31wrU/rqeFOjFvgNNOSWzaNPNOqq VdODbq4tttokNfATZau9VpHbuIKB9BNoyf+Gx0Rd25xyjUELbSFbvMaKpJYnDsCkNNXP aiBQ== X-Received: by 10.180.109.111 with SMTP id hr15mr1988143wib.1.1369223254871; Wed, 22 May 2013 04:47:34 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.180.82.68 with SMTP id g4ls844207wiy.41.canary; Wed, 22 May 2013 04:47:34 -0700 (PDT) X-Received: by 10.180.99.232 with SMTP id et8mr32894672wib.17.1369223254777; Wed, 22 May 2013 04:47:34 -0700 (PDT) Received: from mail-ve0-x22f.google.com (mail-ve0-x22f.google.com [2607:f8b0:400c:c01::22f]) by mx.google.com with ESMTPS id fy5si4855254wib.45.2013.05.22.04.47.34 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 22 May 2013 04:47:34 -0700 (PDT) Received-SPF: neutral (google.com: 2607:f8b0:400c:c01::22f is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=2607:f8b0:400c:c01::22f; Received: by mail-ve0-f175.google.com with SMTP id cz11so1372615veb.34 for ; Wed, 22 May 2013 04:47:33 -0700 (PDT) X-Received: by 10.58.250.66 with SMTP id za2mr2615962vec.56.1369223253471; Wed, 22 May 2013 04:47:33 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.126.138 with SMTP id c10csp178385vcs; Wed, 22 May 2013 04:47:32 -0700 (PDT) X-Received: by 10.180.36.147 with SMTP id q19mr13876097wij.26.1369223252083; Wed, 22 May 2013 04:47:32 -0700 (PDT) Received: from mail-ve0-x234.google.com (mail-ve0-x234.google.com [2607:f8b0:400c:c01::234]) by mx.google.com with ESMTPS id o10si10334341wiy.32.2013.05.22.04.47.31 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 22 May 2013 04:47:32 -0700 (PDT) Received-SPF: neutral (google.com: 2607:f8b0:400c:c01::234 is neither permitted nor denied by best guess record for domain of venkataramanan.kumar@linaro.org) client-ip=2607:f8b0:400c:c01::234; Received: by mail-ve0-f180.google.com with SMTP id c13so1374786vea.11 for ; Wed, 22 May 2013 04:47:30 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.220.248.137 with SMTP id mg9mr2647914vcb.38.1369223250547; Wed, 22 May 2013 04:47:30 -0700 (PDT) Received: by 10.220.107.211 with HTTP; Wed, 22 May 2013 04:47:30 -0700 (PDT) In-Reply-To: <519C8122.2090106@arm.com> References: <519C8122.2090106@arm.com> Date: Wed, 22 May 2013 17:17:30 +0530 Message-ID: Subject: Re: [Patch AArch64] gprof support for AArch64 From: Venkataramanan Kumar To: Marcus Shawcroft Cc: "binutils@sourceware.org" , Richard Earnshaw , Patch Tracking X-Gm-Message-State: ALoCoQnTfvV1KkTEin9XlgHFbGA+QY+ngKEiyXJe95NAG7lTyze2oqhRmRcxCOeY8oq+SI7MbKEr X-Original-Sender: venkataramanan.kumar@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 2607:f8b0:400c:c01::22f is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Hi Marcus, I have incorporated your review comments in the attached patch. regards, Venkat. On 22 May 2013 13:56, Marcus Shawcroft wrote: > On 21/05/13 15:22, Venkataramanan Kumar wrote: >> >> +/* Opcode of the "bl" and "b" instructions. */ >> +#define BRANCHANDLINK (0x94000000) >> +#define BRANCH (0x14000000) >> + >> +void aarch64_find_call (Sym *, bfd_vma, bfd_vma); >> + >> +void >> +aarch64_find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc) >> +{ >> + bfd_vma pc, dest_pc, offset; >> + unsigned int insn; >> + Sym *child; >> + >> + DBG (CALLDEBUG, printf ("[find_call] %s: 0x%lx to 0x%lx\n", >> + parent->name, (unsigned long) p_lowpc, >> + (unsigned long) p_highpc)); >> + >> + for (pc = p_lowpc; pc < p_highpc; pc += 4) >> + { >> + >> + insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space >> + + pc - core_text_sect->vma)); >> >> + >> + if (((insn & 0xfc000000) == BRANCHANDLINK) >> + ||((insn & 0xfc000000) == BRANCH)) >> + { > > > The encoding for the branch instruction is: > > 31 30 29 28 27 26 25 .. 0 > L 0 0 1 0 1 imm26 > > .. where L is the link flag that distinguishes between BRANCH and > BRANCHANDLINK, therefore the above can be written as: > > #define BRANCH_MASK 0x7c000000 > #define BRANCH_PATTERN 0x14000000 > > (insn & BRANCH_MASK) == BRANCH_PATTERN > > /Marcus > diff -urN src/gprof/aarch64.c src-patch/gprof/aarch64.c --- src/gprof/aarch64.c 1970-01-01 05:30:00.000000000 +0530 +++ src-patch/gprof/aarch64.c 2013-05-22 16:49:00.646077008 +0530 @@ -0,0 +1,100 @@ +/* Gprof -c option support for AArch64. + Copyright 2013 Linaro Ltd. + + Based upon gprof/i386.c. + + Copyright (c) 1983, 1993, 2001 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. */ + +#include "gprof.h" +#include "search_list.h" +#include "source.h" +#include "symtab.h" +#include "cg_arcs.h" +#include "corefile.h" +#include "hist.h" + +#define BRANCH_MASK 0x7c000000 +#define BRANCH_PATTERN 0x14000000 + +void aarch64_find_call (Sym *, bfd_vma, bfd_vma); + +void +aarch64_find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc) +{ + bfd_vma pc, dest_pc, offset; + unsigned int insn; + Sym *child; + + DBG (CALLDEBUG, printf ("[find_call] %s: 0x%lx to 0x%lx\n", + parent->name, (unsigned long) p_lowpc, + (unsigned long) p_highpc)); + + for (pc = p_lowpc; pc < p_highpc; pc += 4) + { + + insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space + + pc - core_text_sect->vma)); + + if ((insn & BRANCH_MASK) == BRANCH_PATTERN) + { + DBG (CALLDEBUG, + printf ("[find_call] 0x%lx: bl", (unsigned long) pc)); + + /* Regular pc relative addressing check that this is the + address of a function. */ + offset = ((insn & 0x3ffffff) << 2); + + dest_pc = pc + ((offset ^ 0x8000000) - 0x8000000); + + if (hist_check_address (dest_pc)) + { + + child = sym_lookup (&symtab, dest_pc); + + if (child) + { + DBG (CALLDEBUG, + printf ("\tdest_pc=0x%lx, (name=%s, addr=0x%lx)\n", + (unsigned long) dest_pc, child->name, + (unsigned long) child->addr)); + + if (child->addr == dest_pc) + { + /* a hit. */ + arc_add (parent, child, (unsigned long) 0); + continue; + } + } + } + + /* Something funny going on. */ + DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); + } + } +} diff -urN src/gprof/corefile.c src-patch/gprof/corefile.c --- src/gprof/corefile.c 2012-09-20 18:45:48.000000000 +0530 +++ src-patch/gprof/corefile.c 2013-05-22 11:11:39.532392857 +0530 @@ -54,6 +54,7 @@ extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma); extern void sparc_find_call (Sym *, bfd_vma, bfd_vma); extern void mips_find_call (Sym *, bfd_vma, bfd_vma); +extern void aarch64_find_call (Sym *, bfd_vma, bfd_vma); static void parse_error (const char *filename) @@ -320,6 +321,10 @@ mips_find_call (parent, p_lowpc, p_highpc); break; + case bfd_arch_aarch64: + aarch64_find_call (parent, p_lowpc, p_highpc); + break; + default: fprintf (stderr, _("%s: -c not supported on architecture %s\n"), whoami, bfd_printable_name(core_bfd)); diff -urN src/gprof/Makefile.am src-patch/gprof/Makefile.am --- src/gprof/Makefile.am 2012-12-17 22:26:03.000000000 +0530 +++ src-patch/gprof/Makefile.am 2013-05-22 11:11:39.532392857 +0530 @@ -43,7 +43,7 @@ sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ - i386.c alpha.c vax.c tahoe.c sparc.c mips.c + i386.c alpha.c vax.c tahoe.c sparc.c mips.c aarch64.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(LIBINTL_DEP) gprof_LDADD = ../bfd/libbfd.la ../libiberty/libiberty.a $(LIBINTL) diff -urN src/gprof/Makefile.in src-patch/gprof/Makefile.in --- src/gprof/Makefile.in 2012-12-17 22:26:03.000000000 +0530 +++ src-patch/gprof/Makefile.in 2013-05-22 11:11:39.532392857 +0530 @@ -92,7 +92,8 @@ hertz.$(OBJEXT) hist.$(OBJEXT) source.$(OBJEXT) \ search_list.$(OBJEXT) symtab.$(OBJEXT) sym_ids.$(OBJEXT) \ utils.$(OBJEXT) i386.$(OBJEXT) alpha.$(OBJEXT) vax.$(OBJEXT) \ - tahoe.$(OBJEXT) sparc.$(OBJEXT) mips.$(OBJEXT) + tahoe.$(OBJEXT) sparc.$(OBJEXT) mips.$(OBJEXT) \ + aarch64.$(OBJEXT) am_gprof_OBJECTS = $(am__objects_1) flat_bl.$(OBJEXT) \ bsd_callg_bl.$(OBJEXT) fsf_callg_bl.$(OBJEXT) gprof_OBJECTS = $(am_gprof_OBJECTS) @@ -309,7 +310,7 @@ sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ - i386.c alpha.c vax.c tahoe.c sparc.c mips.c + i386.c alpha.c vax.c tahoe.c sparc.c mips.c aarch64.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(LIBINTL_DEP) @@ -451,6 +452,7 @@ distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_blocks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsd_callg_bl.Po@am__quote@