From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2181 invoked by alias); 9 Jul 2002 21:08:00 -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 2170 invoked from network); 9 Jul 2002 21:08:00 -0000 Received: from unknown (HELO tetsuo.nj.caldera.com) (63.124.204.226) by sources.redhat.com with SMTP; 9 Jul 2002 21:08:00 -0000 Received: from caldera.com (localhost.localdomain [127.0.0.1]) by tetsuo.nj.caldera.com (8.11.6/8.11.6) with ESMTP id g69LK7402731; Tue, 9 Jul 2002 17:20:07 -0400 Message-ID: <3D2B5385.997D474D@caldera.com> Date: Tue, 09 Jul 2002 14:08:00 -0000 From: Petr Sorfa Organization: Caldera X-Accept-Language: en MIME-Version: 1.0 To: "gdb-patches@sources.redhat.com" Subject: [PATCH] DW_AT_calling_convention support Content-Type: multipart/mixed; boundary="------------1BDB637AF4A5A58A75611AEF" X-SW-Source: 2002-07/txt/msg00161.txt.bz2 This is a multi-part message in MIME format. --------------1BDB637AF4A5A58A75611AEF Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-length: 1175 Hi, Patch for supporting DW_AT_calling_convention. This helps GDB identify the "main" program for languages that do not have a starting subroutine called "main". The patch also adds a new type flag, TYPE_FLAG_MAIN_PROGRAM which is set if the type is describing a "main" entry point. This can be used, for example, in noting a subroutine type as a FORTRAN PROGRAM. 2002-07-09 Petr Sorfa (petrs@caldera.com) * dwarf2read.c (read_subroutine_type): Expanded to recognize the DW_AT_calling_convention DWARF attribute and for DW_CC_program set the TYPE_FLAG_MAIN_PROGRAM type flag and call set_main_name (). (read_partial_die): Now recognizes the DW_AT_calling_convention attribute and calls set_main_name(). Note that TYPE_FLAG_MAIN_PROGRAM type flag is not set, as the partial_die might not denote a subroutine type. * gdbtypes.h (TYPE_FLAG_MAIN_PROGRAM): New type flag which indicates whether the type denotes a main program subroutine. (TYPE_MAIN_PROGRAM): New macro that returns a non-zero value if the type describes a main program subroutine. --------------1BDB637AF4A5A58A75611AEF Content-Type: text/plain; charset=us-ascii; name="calling_convention.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="calling_convention.patch" Content-length: 3308 Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.60 diff -c -p -r1.60 dwarf2read.c *** dwarf2read.c 22 Jun 2002 00:05:59 -0000 1.60 --- dwarf2read.c 9 Jul 2002 20:42:35 -0000 *************** read_subroutine_type (struct die_info *d *** 3026,3031 **** --- 3026,3053 ---- || cu_language == language_cplus) TYPE_FLAGS (ftype) |= TYPE_FLAG_PROTOTYPED; + /* Check for the calling convention. A DW_CC_program indicates that + the subroutine is the the "main" of the program. This needs + to be set for languages that don't have a predefined name + for the starting subroutines, such as FORTRAN. */ + attr = dwarf_attr (die, DW_AT_calling_convention); + if (attr && (DW_UNSND (attr) != 0)) + { + switch (DW_UNSND (attr)) + { + case DW_CC_program: + /* Set this subroutine as the "main" subroutine + for the program. */ + TYPE_FLAGS (ftype) |= TYPE_FLAG_MAIN_PROGRAM; + set_main_name (TYPE_NAME (ftype)); + break; + case DW_CC_normal: + case DW_CC_nocall: + default: + break; + } + } + if (die->has_children) { struct die_info *child_die; *************** read_partial_die (struct partial_die_inf *** 3414,3419 **** --- 3436,3442 ---- int found_spec_attr = 0; int has_low_pc_attr = 0; int has_high_pc_attr = 0; + int is_main_program = 0; *part_die = zeroed_partial_die; abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); *************** read_partial_die (struct partial_die_inf *** 3446,3451 **** --- 3469,3486 ---- if (part_die->name == NULL) part_die->name = DW_STRING (&attr); break; + case DW_AT_calling_convention: + switch (DW_UNSND (&attr)) + { + case DW_CC_program: + is_main_program = 1; + break; + case DW_CC_normal: + case DW_CC_nocall: + default: + break; + } + break; case DW_AT_MIPS_linkage_name: part_die->name = DW_STRING (&attr); break; *************** read_partial_die (struct partial_die_inf *** 3489,3494 **** --- 3524,3534 ---- default: break; } + } + + if (is_main_program) + { + set_main_name (part_die->name); } /* If we found a reference attribute and the die has no name, try Index: gdbtypes.h =================================================================== RCS file: /cvs/src/src/gdb/gdbtypes.h,v retrieving revision 1.33 diff -c -p -r1.33 gdbtypes.h *** gdbtypes.h 14 Jun 2002 14:34:24 -0000 1.33 --- gdbtypes.h 9 Jul 2002 20:42:35 -0000 *************** enum type_code *** 252,257 **** --- 252,263 ---- #define TYPE_FLAG_VECTOR (1 << 12) #define TYPE_VECTOR(t) (TYPE_FLAGS (t) & TYPE_FLAG_VECTOR) + /* This flag is to indicate that the subprogram type indicates + a the main program. Mainly used to indicate FORTRAN program + scopes. */ + #define TYPE_FLAG_MAIN_PROGRAM (1 << 13) + #define TYPE_MAIN_PROGRAM(t) (TYPE_FLAGS (t) & TYPE_FLAG_MAIN_PROGRAM) + struct main_type { /* Code for kind of type */ --------------1BDB637AF4A5A58A75611AEF--