public inbox for gdb-testers@sourceware.org
help / color / mirror / Atom feed
From: gdb-buildbot@sergiodj.net
To: gdb-testers@sourceware.org
Subject: [binutils-gdb] Add comp_unit_head to dwarf2_per_cu_data
Date: Fri, 29 May 2020 00:36:23 -0400	[thread overview]
Message-ID: <2e6a9f7959dca5af9a7e6e5cea8c5dccd2e510f0@gdb-build> (raw)

*** TEST RESULTS FOR COMMIT 2e6a9f7959dca5af9a7e6e5cea8c5dccd2e510f0 ***

commit 2e6a9f7959dca5af9a7e6e5cea8c5dccd2e510f0
Author:     Simon Marchi <simon.marchi@polymtl.ca>
AuthorDate: Wed May 27 11:14:10 2020 -0400
Commit:     Simon Marchi <simon.marchi@efficios.com>
CommitDate: Wed May 27 11:19:40 2020 -0400

    Add comp_unit_head to dwarf2_per_cu_data
    
    The per_cu_header_read_in function allows obtaining a filled
    comp_unit_head object for a given dwarf2_per_cu_data object.  If a
    dwarf2_cu object exists for this dwarf2_per_cu_data, then it just
    returns a pointer to the comp_unit_head from that dwarf2_cu.  Otherwise,
    it reads the header into a temporary buffer provided by the caller, and
    returns a pointer to that.
    
    Since the dwarf2_per_cu_data::cu link is going to be removed
    (dwarf2_per_cu_data will become objfile-independent while dwarf2_cu
    stays objfile-dependent), we cannot rely anymore on returning the header
    from the dwarf2_cu object.
    
    The not too complex solution implemented by this patch is to keep a copy
    of the header in the dwarf2_per_cu_data object, independent from the
    copy in dwarf2_cu.  The new copy is only used in the addr_size,
    offset_size and ref_addr_size methods of dwarf2_per_cu_data.
    
    There's nothing intrinsic to the comp_unit_head object that prevents it
    to be shared between two dwarf2_cu objects (belonging to different
    objfiles) representing the same CU.  In other words, I think we could
    eventually get rid of the copy in dwarf2_cu to only keep the one in
    dwarf2_per_cu_data.  It is not trivial, however, so I have decided not
    to do it for the moment.
    
    gdb/ChangeLog:
    
            * dwarf2/read.h (struct dwarf2_per_cu_data) <m_header,
            m_header_read_in>: New fields.
            <get_header>: New method.
            * dwarf2/read.c (per_cu_header_read_in): Remove.
            (dwarf2_per_cu_data::get_header): New.
            (dwarf2_per_cu_data::addr_size): Update.
            (dwarf2_per_cu_data::offset_size): Update.
            (dwarf2_per_cu_data::ref_addr_size): Update.
    
    Change-Id: Id7541fca7562843eba110ece21c4df38d45fca23

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 13aeada94f..b85a8aa2dc 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+2020-05-27  Simon Marchi  <simon.marchi@polymtl.ca>
+
+	* dwarf2/read.h (struct dwarf2_per_cu_data) <m_header,
+	m_header_read_in>: New fields.
+	<get_header>: New method.
+	* dwarf2/read.c (per_cu_header_read_in): Remove.
+	(dwarf2_per_cu_data::get_header): New.
+	(dwarf2_per_cu_data::addr_size): Update.
+	(dwarf2_per_cu_data::offset_size): Update.
+	(dwarf2_per_cu_data::ref_addr_size): Update.
+
 2020-05-27  Simon Marchi  <simon.marchi@polymtl.ca>
 
 	* dwarf2/read.c (load_cu): Return dwarf2_cu.
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index a27c351e1c..a6b7f2c6d2 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -23335,26 +23335,23 @@ dwarf2_symbol_mark_computed (const struct attribute *attr, struct symbol *sym,
     }
 }
 
-/* Return comp_unit_head for PER_CU, either already available in PER_CU->CU
-   (CU_HEADERP is unused in such case) or prepare a temporary copy at
-   CU_HEADERP first.  */
+/* See read.h.  */
 
-static const struct comp_unit_head *
-per_cu_header_read_in (struct comp_unit_head *cu_headerp,
-		       const struct dwarf2_per_cu_data *per_cu)
+const comp_unit_head *
+dwarf2_per_cu_data::get_header () const
 {
-  const gdb_byte *info_ptr;
-
-  if (per_cu->cu)
-    return &per_cu->cu->header;
+  if (!m_header_read_in)
+    {
+      const gdb_byte *info_ptr
+	= this->section->buffer + to_underlying (this->sect_off);
 
-  info_ptr = per_cu->section->buffer + to_underlying (per_cu->sect_off);
+      memset (&m_header, 0, sizeof (m_header));
 
-  memset (cu_headerp, 0, sizeof (*cu_headerp));
-  read_comp_unit_head (cu_headerp, info_ptr, per_cu->section,
-		       rcuh_kind::COMPILE);
+      read_comp_unit_head (&m_header, info_ptr, this->section,
+			   rcuh_kind::COMPILE);
+    }
 
-  return cu_headerp;
+  return &m_header;
 }
 
 /* See read.h.  */
@@ -23362,12 +23359,7 @@ per_cu_header_read_in (struct comp_unit_head *cu_headerp,
 int
 dwarf2_per_cu_data::addr_size () const
 {
-  struct comp_unit_head cu_header_local;
-  const struct comp_unit_head *cu_headerp;
-
-  cu_headerp = per_cu_header_read_in (&cu_header_local, this);
-
-  return cu_headerp->addr_size;
+  return this->get_header ()->addr_size;
 }
 
 /* See read.h.  */
@@ -23375,12 +23367,7 @@ dwarf2_per_cu_data::addr_size () const
 int
 dwarf2_per_cu_data::offset_size () const
 {
-  struct comp_unit_head cu_header_local;
-  const struct comp_unit_head *cu_headerp;
-
-  cu_headerp = per_cu_header_read_in (&cu_header_local, this);
-
-  return cu_headerp->offset_size;
+  return this->get_header ()->offset_size;
 }
 
 /* See read.h.  */
@@ -23388,15 +23375,12 @@ dwarf2_per_cu_data::offset_size () const
 int
 dwarf2_per_cu_data::ref_addr_size () const
 {
-  struct comp_unit_head cu_header_local;
-  const struct comp_unit_head *cu_headerp;
-
-  cu_headerp = per_cu_header_read_in (&cu_header_local, this);
+  const comp_unit_head *header = this->get_header ();
 
-  if (cu_headerp->version == 2)
-    return cu_headerp->addr_size;
+  if (header->version == 2)
+    return header->addr_size;
   else
-    return cu_headerp->offset_size;
+    return header->offset_size;
 }
 
 /* See read.h.  */
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 3500b0e7ba..b75be31221 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -22,6 +22,7 @@
 
 #include <queue>
 #include <unordered_map>
+#include "dwarf2/comp-unit.h"
 #include "dwarf2/index-cache.h"
 #include "dwarf2/section.h"
 #include "filename-seen-cache.h"
@@ -468,6 +469,21 @@ struct dwarf2_per_cu_data
   /* Backlink to the owner of this.  */
   dwarf2_per_bfd *per_bfd;
 
+  /* DWARF header of this CU.  Note that dwarf2_cu reads its own version of the
+     header, which may differ from this one, since it may pass rcuh_kind::TYPE
+     to read_comp_unit_head, whereas for dwarf2_per_cu_data we always pass
+     rcuh_kind::COMPILE.
+
+     Don't access this field directly, use the get_header method instead.  It
+     should be private, but we can't make it private at the moment.  */
+  mutable comp_unit_head m_header;
+
+  /* True if HEADER has been read in.
+
+     Don't access this field directly.  It should be private, but we can't make
+     it private at the moment.  */
+  mutable bool m_header_read_in;
+
   /* When dwarf2_per_bfd::using_index is true, the 'quick' field
      is active.  Otherwise, the 'psymtab' field is active.  */
   union
@@ -537,6 +553,9 @@ struct dwarf2_per_cu_data
     imported_symtabs = nullptr;
   }
 
+  /* Get the header of this per_cu, reading it if necessary.  */
+  const comp_unit_head *get_header () const;
+
   /* Return the address size given in the compilation unit header for
      this CU.  */
   int addr_size () const;


             reply	other threads:[~2020-05-29  4:36 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-29  4:36 gdb-buildbot [this message]
2020-05-29  4:36 ` Failures on Ubuntu-Aarch64-native-gdbserver-m64, branch master gdb-buildbot
2020-06-27  2:19 ` Failures on Fedora-i686, " gdb-buildbot
2020-06-27  2:56 ` Failures on Fedora-x86_64-cc-with-index, " gdb-buildbot
2020-06-27  3:31 ` Failures on Fedora-x86_64-m64, " gdb-buildbot
2020-06-27  3:41 ` Failures on Fedora-x86_64-native-extended-gdbserver-m32, " gdb-buildbot
2020-06-27  4:15 ` Failures on Fedora-x86_64-native-extended-gdbserver-m64, " gdb-buildbot
2020-06-27  4:16 ` Failures on Fedora-x86_64-native-gdbserver-m32, " gdb-buildbot
2020-06-27  4:56 ` Failures on Fedora-x86_64-native-gdbserver-m64, " gdb-buildbot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2e6a9f7959dca5af9a7e6e5cea8c5dccd2e510f0@gdb-build \
    --to=gdb-buildbot@sergiodj.net \
    --cc=gdb-testers@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).