From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24033 invoked by alias); 15 Mar 2002 18:22:23 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 23957 invoked from network); 15 Mar 2002 18:22:18 -0000 Received: from unknown (HELO kerberos.suse.cz) (195.47.106.10) by sources.redhat.com with SMTP; 15 Mar 2002 18:22:18 -0000 Received: from chimera.suse.cz (chimera.suse.cz [10.20.0.2]) by kerberos.suse.cz (SuSE SMTP server) with ESMTP id 4FC3359D354; Fri, 15 Mar 2002 19:22:18 +0100 (CET) Received: from suse.cz (leviathan.suse.cz [10.20.1.56]) by chimera.suse.cz (8.11.0/8.11.0/SuSE Linux 8.11.0-0.4) with ESMTP id g2FIMIp05921; Fri, 15 Mar 2002 19:22:18 +0100 X-Authentication-Warning: chimera.suse.cz: Host leviathan.suse.cz [10.20.1.56] claimed to be suse.cz Message-ID: <3C923BD9.80403@suse.cz> Date: Fri, 15 Mar 2002 10:22:00 -0000 From: Michal Ludvig Organization: SuSE CR User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020310 X-Accept-Language: cs, cz, en MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [RFA] x86_64_skip_prologue Content-Type: multipart/mixed; boundary="------------040104040702020509090900" X-SW-Source: 2002-03/txt/msg00242.txt.bz2 This is a multi-part message in MIME format. --------------040104040702020509090900 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit Content-length: 901 Hi all, I have written a new x86_64_skip_prologue() function. The approach is, 1) Detect, wherher the function seems to have a prolog (ie. starts with instructions push %rbp and mov %rsp,%rbp). If not, return pc and exit. 2) Try to get debuginfo. If not, just return pc. 3) Now pc points to the first line of the sourcecode of the function (usually opening '{'). If the next line with debuginfo has pc within bounds of this function, we will return this pc instead. Is this correct? For me it seems to work... Anyway I'm not sure, wherher the lines in linetab _must_ grow up monotonically (I assume so). Also perhaps there are some macros for those horrible long nested structures, but I don't know about them. Index: ChangeLog * x86-64-tdep.c (x86_64_skip_prologue): Rewritten from scratch. Michal Ludvig -- * SuSE CR, s.r.o * mludvig@suse.cz * +420 2 9654 5373 * http://www.suse.cz --------------040104040702020509090900 Content-Type: text/plain; name="x8664-03.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="x8664-03.diff" Content-length: 2397 Index: x86-64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/x86-64-tdep.c,v retrieving revision 1.10 diff -c -3 -p -r1.10 x86-64-tdep.c *** x86-64-tdep.c 2002/03/04 11:08:28 1.10 --- x86-64-tdep.c 2002/03/15 18:07:16 *************** x86_64_frameless_function_invocation (st *** 759,769 **** return 0; } ! /* On x86_64 there are no reasonable prologs. */ CORE_ADDR x86_64_skip_prologue (CORE_ADDR pc) { ! return pc; } /* Sequence of bytes for breakpoint instruction. */ --- 759,815 ---- return 0; } ! /* If a function with debugging information and known beginning ! is detected, we will return pc of the next line in the source ! code. With this approach we effectively skip the prolog. */ ! ! #define PROLOG_BUFSIZE 4 CORE_ADDR x86_64_skip_prologue (CORE_ADDR pc) { ! int i, firstline, currline; ! struct symtab *v_symtab; ! struct symbol *v_function; ! CORE_ADDR startaddr=0, endaddr=0; ! ! /* We will handle only functions beginning with: ! 55 pushq %rbp ! 48 89 e5 movq %rsp,%rbp ! */ ! unsigned char prolog_expect[PROLOG_BUFSIZE]={0x55, 0x48, 0x89, 0xe5}, ! prolog_buf[PROLOG_BUFSIZE]; ! ! read_memory (pc, (char *) prolog_buf, PROLOG_BUFSIZE); ! ! /* First check, whether pc points to pushq %rbp, movq %rsp,%rbp. */ ! for(i=0; ilinetable || ! !v_function->ginfo.value.block) ! return pc; ! ! firstline=v_function->line; ! currline=firstline; ! startaddr=v_function->ginfo.value.block->startaddr; ! endaddr=v_function->ginfo.value.block->endaddr; ! ! for(i=0; i < v_symtab->linetable->nitems; i++) ! if(v_symtab->linetable->item[i].line > firstline && ! v_symtab->linetable->item[i].pc < endaddr) ! { ! pc=v_symtab->linetable->item[i].pc; ! currline=v_symtab->linetable->item[i].line; ! break; ! } ! ! return pc; } /* Sequence of bytes for breakpoint instruction. */ --------------040104040702020509090900--