public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Subject: [pushed] gdb: Fix std::{min, max}-related build breakage on 32-bit hosts
Date: Sun, 18 Sep 2016 23:26:00 -0000	[thread overview]
Message-ID: <2048ff63-1438-8776-7a31-8ce38dc80e05@redhat.com> (raw)
In-Reply-To: <77416303-1ed7-fe71-7a52-1dbd1ca6aa56@redhat.com>

On 09/16/2016 08:00 PM, Pedro Alves wrote:

> From 325fac504a327de9c46a4e5cf9c88ece9d9d7701 Mon Sep 17 00:00:00 2001
> From: Pedro Alves <palves@redhat.com>
> Date: Fri, 16 Sep 2016 19:55:17 +0100
> Subject: [PATCH] gdb: Use std::min and std::max throughout

This broke the build on 32-bit hosts, where CORE_ADDR is 32-bit.
I've pushed the fix.

From 768adc05c44c7e8b5c0f9ca5ad3ca96657715293 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Sun, 18 Sep 2016 23:56:01 +0100
Subject: [PATCH] gdb: Fix std::{min, max}-related build breakage on 32-bit
 hosts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Building on a 32-bit host fails currently with errors like:

  .../src/gdb/exec.c: In function ‘target_xfer_status section_table_read_available_memory(gdb_byte*, ULONGEST, ULONGEST, ULONGEST*)’:
  .../src/gdb/exec.c:801:54: error: no matching function for call to ‘min(ULONGEST, long unsigned int)’
      end = std::min (offset + len, r->start + r->length);
							^
  In file included from /usr/include/c++/5.3.1/algorithm:61:0,
		   from .../src/gdb/exec.c:46:
  /usr/include/c++/5.3.1/bits/stl_algobase.h:195:5: note: candidate: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
       min(const _Tp& __a, const _Tp& __b)
       ^
  /usr/include/c++/5.3.1/bits/stl_algobase.h:195:5: note:   template argument deduction/substitution failed:
  .../src/gdb/exec.c:801:54: note:   deduced conflicting types for parameter ‘const _Tp’ (‘long long unsigned int’ and ‘long unsigned int’)
      end = std::min (offset + len, r->start + r->length);
							^
  In file included from /usr/include/c++/5.3.1/algorithm:61:0,
		   from .../src/gdb/exec.c:46:
  /usr/include/c++/5.3.1/bits/stl_algobase.h:243:5: note: candidate: template<class _Tp, class _Compare> const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
       min(const _Tp& __a, const _Tp& __b, _Compare __comp)
       ^

The problem is that the std::min/std::max function templates use the
same type for both parameters.  When the argument types are different,
the compiler can't automatically deduce which template specialization
to pick from the arguments' types.

Fix that by specifying the specialization we want explicitly.

gdb/ChangeLog:
2016-09-18  Pedro Alves  <palves@redhat.com>

	* breakpoint.c (hardware_watchpoint_inserted_in_range): Explicitly
	specify the std:min/std::max specialization.
	* exec.c (section_table_read_available_memory): Likewise.
	* remote.c (remote_read_qxfer): Likewise.
	* target.c (simple_verify_memory): Likewise.
---
 gdb/ChangeLog    | 8 ++++++++
 gdb/breakpoint.c | 4 ++--
 gdb/exec.c       | 2 +-
 gdb/remote.c     | 2 +-
 gdb/target.c     | 2 +-
 5 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2c980b7..f86e0a4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2016-09-18  Pedro Alves  <palves@redhat.com>
+
+	* breakpoint.c (hardware_watchpoint_inserted_in_range): Explicitly
+	specify the std:min/std::max specialization.
+	* exec.c (section_table_read_available_memory): Likewise.
+	* remote.c (remote_read_qxfer): Likewise.
+	* target.c (simple_verify_memory): Likewise.
+
 2016-09-16  Simon Marchi  <simark@simark.ca>
 
 	* infrun.c (restore_current_uiout_cleanup): Move to ui-out.c.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 28331f1..1e05932 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -4436,8 +4436,8 @@ hardware_watchpoint_inserted_in_range (struct address_space *aspace,
 	    CORE_ADDR l, h;
 
 	    /* Check for intersection.  */
-	    l = std::max (loc->address, addr);
-	    h = std::min (loc->address + loc->length, addr + len);
+	    l = std::max<CORE_ADDR> (loc->address, addr);
+	    h = std::min<CORE_ADDR> (loc->address + loc->length, addr + len);
 	    if (l < h)
 	      return 1;
 	  }
diff --git a/gdb/exec.c b/gdb/exec.c
index b18ca8b..7435971 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -798,7 +798,7 @@ section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
 	  enum target_xfer_status status;
 
 	  /* Get the intersection window.  */
-	  end = std::min (offset + len, r->start + r->length);
+	  end = std::min<CORE_ADDR> (offset + len, r->start + r->length);
 
 	  gdb_assert (end - offset <= len);
 
diff --git a/gdb/remote.c b/gdb/remote.c
index 2309205..e80db79 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -9907,7 +9907,7 @@ remote_read_qxfer (struct target_ops *ops, const char *object_name,
      may not, since we don't know how much of it will need to be escaped;
      the target is free to respond with slightly less data.  We subtract
      five to account for the response type and the protocol frame.  */
-  n = std::min (get_remote_packet_size () - 5, len);
+  n = std::min<LONGEST> (get_remote_packet_size () - 5, len);
   snprintf (rs->buf, get_remote_packet_size () - 4, "qXfer:%s:read:%s:%s,%s",
 	    object_name, annex ? annex : "",
 	    phex_nz (offset, sizeof offset),
diff --git a/gdb/target.c b/gdb/target.c
index 628bceb..b93244d 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -3585,7 +3585,7 @@ simple_verify_memory (struct target_ops *ops,
       ULONGEST xfered_len;
       enum target_xfer_status status;
       gdb_byte buf[1024];
-      ULONGEST howmuch = std::min (sizeof (buf), size - total_xfered);
+      ULONGEST howmuch = std::min<ULONGEST> (sizeof (buf), size - total_xfered);
 
       status = target_xfer_partial (ops, TARGET_OBJECT_MEMORY, NULL,
 				    buf, NULL, lma + total_xfered, howmuch,
-- 
2.5.5


  reply	other threads:[~2016-09-18 23:26 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-15 16:52 [PATCH] gdb: Use std::max and std::min throughout Pedro Alves
2016-09-15 17:47 ` Simon Marchi
2016-09-16 19:01   ` Pedro Alves
2016-09-18 23:26     ` Pedro Alves [this message]
2016-09-18 23:37     ` [pushed] gdb/s390: Fix build breakage due to std::min/std::max usage without header Pedro Alves
2016-09-19 11:47     ` [PATCH] gdb: Use std::max and std::min throughout Ulrich Weigand
2016-09-19 13:36       ` Pedro Alves
2016-09-19 13:44         ` Pedro Alves
2016-09-19 14:02           ` Pedro Alves
2016-09-19 14:56         ` Ulrich Weigand
2016-09-19 15:23           ` Pedro Alves
2016-09-19 15:59             ` [pushed] gdb: Fix build breakage with GCC 4.1 and --disable-nls Pedro Alves
2016-09-19 16:18               ` Ulrich Weigand

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=2048ff63-1438-8776-7a31-8ce38dc80e05@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@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).