From patchwork Fri Apr 26 19:16:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Terekhov, Mikhail via Gdb-patches" X-Patchwork-Id: 32428 Received: (qmail 16462 invoked by alias); 26 Apr 2019 19:16:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 16406 invoked by uid 89); 26 Apr 2019 19:16:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-29.9 required=5.0 tests=AWL, BAYES_00, ENV_AND_HDR_SPF_MATCH, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, SPF_PASS, USER_IN_DEF_SPF_WL autolearn=ham version=3.3.1 spammy=H*c:alternative X-HELO: mail-wm1-f53.google.com Received: from mail-wm1-f53.google.com (HELO mail-wm1-f53.google.com) (209.85.128.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 Apr 2019 19:16:18 +0000 Received: by mail-wm1-f53.google.com with SMTP id w15so5797734wmc.3 for ; Fri, 26 Apr 2019 12:16:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=CHiAWYpqh6vHaGL2iqOG3H+oAXrLUiRPRSxmZFMJwcQ=; b=t5OCw9zdRgpMWpbInQuAykZCg5puZKU2Su3IVaJHitvH6L84z2riYQjokVha7Kqmbq kvQ1kYeHBuyI18DKdvZ42ZWMi2BI3mOM2luAtLC1MtDax8W1XTR7xcpBIG3bW2kH/nsv dfPfKJU5k39T206ICLkSDpzPrM4YxsFzK5ecyFPngbS/oXT3e6k79+pqnyqhb5/4zWCc 5ROBeWrZx7UC9F577okAWL8cGBareNMQlBpi37eKod3ZhCtH053vb5PLmzHTLrAJF2KC sBMXB+5nchecS4OkMv6R+dd+SCjn2OmsKG4KWCQccmK46WqrpGPdHtiY+eCujlH9mpxj pfew== MIME-Version: 1.0 X-Patchwork-Original-From: "Ali Tamur via gdb-patches" From: "Terekhov, Mikhail via Gdb-patches" Reply-To: Ali Tamur Date: Fri, 26 Apr 2019 12:16:04 -0700 Message-ID: Subject: [PATCH] Support DW_FORM_strx1, _strx2, _strx3, _strx4 forms. To: gdb-patches@sourceware.org X-IsSubscribed: yes Dwarf5 defines DW_FORM_strx1 and others, which are similar to DW_FORM_strx but uses 1-4 bytes unsigned integers. This is a small step towards supporting dwarf5 in gdb. gdb/ChangeLog: 2019-04-26 Ali Tamur * gdb/dwarf2read.c (read_3_bytes): New declaration. (read_attribute_value): Added DW_FORM_strx1-4 cases. (read_3_bytes): New function. * gdb/testsuite/lib/dwarf.exp(): Added DW_FORM_strx1-4. --- gdb/dwarf2read.c | 49 +++++++++++++++++++++++++++++++++++++++++---- gdb/testsuite/lib/dwarf.exp | 4 ++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4259c386b9..be7cc9ccbb 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1531,6 +1531,8 @@ static int read_1_signed_byte (bfd *, const gdb_byte *); static unsigned int read_2_bytes (bfd *, const gdb_byte *); +static unsigned int read_3_bytes (bfd *, const gdb_byte *); + static unsigned int read_4_bytes (bfd *, const gdb_byte *); static ULONGEST read_8_bytes (bfd *, const gdb_byte *); @@ -19289,6 +19291,10 @@ read_attribute_value (const struct die_reader_specs *reader, info_ptr += bytes_read; break; case DW_FORM_strx: + case DW_FORM_strx1: + case DW_FORM_strx2: + case DW_FORM_strx3: + case DW_FORM_strx4: case DW_FORM_GNU_str_index: if (reader->dwo_file == NULL) { @@ -19299,12 +19305,34 @@ read_attribute_value (const struct die_reader_specs *reader, bfd_get_filename (abfd)); } { - ULONGEST str_index = - read_unsigned_leb128 (abfd, info_ptr, &bytes_read); - + ULONGEST str_index; + if (form == DW_FORM_strx1) + { + str_index = read_1_byte (abfd, info_ptr); + info_ptr += 1; + } + else if (form == DW_FORM_strx2) + { + str_index = read_2_bytes (abfd, info_ptr); + info_ptr += 2; + } + else if (form == DW_FORM_strx3) + { + str_index = read_3_bytes (abfd, info_ptr); + info_ptr += 3; + } + else if (form == DW_FORM_strx4) + { + str_index = read_4_bytes (abfd, info_ptr); + info_ptr += 4; + } + else + { + str_index = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); + info_ptr += bytes_read; + } DW_STRING (attr) = read_str_index (reader, str_index); DW_STRING_IS_CANONICAL (attr) = 0; - info_ptr += bytes_read; } break; default: @@ -19374,6 +19402,19 @@ read_2_signed_bytes (bfd *abfd, const gdb_byte *buf) return bfd_get_signed_16 (abfd, buf); } +static unsigned int +read_3_bytes (bfd *abfd, const gdb_byte *buf) +{ + unsigned int result = 0; + for (int i = 0; i < 3; ++i) + { + unsigned char byte = bfd_get_8 (abfd, buf); + buf++; + result |= ((unsigned int) byte << (i * 8)); + } + return result; +} + static unsigned int read_4_bytes (bfd *abfd, const gdb_byte *buf) { diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index 3a430fcd96..3cc592890c 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -528,6 +528,10 @@ namespace eval Dwarf { DW_FORM_exprloc - DW_FORM_strx - + DW_FORM_strx1 - + DW_FORM_strx2 - + DW_FORM_strx3 - + DW_FORM_strx4 - DW_FORM_GNU_addr_index -