From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4271 invoked by alias); 23 Nov 2014 19:11:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 4260 invoked by uid 89); 23 Nov 2014 19:11:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Sun, 23 Nov 2014 19:11:41 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sANJBewo002860 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Sun, 23 Nov 2014 14:11:40 -0500 Received: from host2.jankratochvil.net (ovpn-116-31.ams2.redhat.com [10.36.116.31]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sANJBaTk011984 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Sun, 23 Nov 2014 14:11:38 -0500 Date: Sun, 23 Nov 2014 19:11:00 -0000 From: Jan Kratochvil To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [PATCH v3 12/14] add linux_infcall_mmap Message-ID: <20141123191136.GA31798@host2.jankratochvil.net> References: <20141101214552.13230.45564.stgit@host1.jankratochvil.net> <20141101214719.13230.96367.stgit@host1.jankratochvil.net> <54623CA7.8060702@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54623CA7.8060702@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes X-SW-Source: 2014-11/txt/msg00574.txt.bz2 On Tue, 11 Nov 2014 17:43:19 +0100, Pedro Alves wrote: > On 11/01/2014 09:47 PM, Jan Kratochvil wrote: > > +/* See gdbarch.sh 'infcall_mmap'. */ > > + > > +static CORE_ADDR > > +linux_infcall_mmap (CORE_ADDR size, unsigned prot) > > +{ > > + struct objfile *objf; > > + /* Do there still exist any Linux systems without "mmap64"? > > + "mmap" uses 64-bit off_t on x86_64 and 32-bit off_t on i386 and x32. */ > > + struct value *mmap_val = find_function_in_inferior ("mmap64", &objf); > > + struct value *addr_val; > > + struct gdbarch *gdbarch = get_objfile_arch (objf); > > + CORE_ADDR retval; > > + enum > > + { > > + ARG_ADDR, ARG_LENGTH, ARG_PROT, ARG_FLAGS, ARG_FD, ARG_OFFSET, ARG_MAX > > + }; > > + struct value *arg[ARG_MAX]; > > + > > + arg[ARG_ADDR] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr, > > + 0); > > + /* Assuming sizeof (unsigned long) == sizeof (size_t). */ > > + arg[ARG_LENGTH] = value_from_ulongest > > + (builtin_type (gdbarch)->builtin_unsigned_long, size); > > + gdb_assert ((prot & ~7) == 0); > > + arg[ARG_PROT] = value_from_longest (builtin_type (gdbarch)->builtin_int, > > + 0 > > + | ((prot & 4) != 0 ? PROT_READ : 0) > > + | ((prot & 2) != 0 ? PROT_WRITE : 0) > > + | ((prot & 1) != 0 ? PROT_EXEC : 0)); > > + arg[ARG_FLAGS] = value_from_longest (builtin_type (gdbarch)->builtin_int, > > + MAP_PRIVATE | MAP_ANONYMOUS); > > PROT_READ, PROT_WRITE, PROT_EXEC, MAP_PRIVATE, MAP_ANONYMOUS > are host values/macros. Added to arch-utils.h: +/* Symbols for gdbarch_infcall_mmap; their Linux PROT_* system + definitions would be dependent on compilation host. */ +#define GDB_MMAP_PROT_READ 0x1 /* Page can be read. */ +#define GDB_MMAP_PROT_WRITE 0x2 /* Page can be written. */ +#define GDB_MMAP_PROT_EXEC 0x4 /* Page can be executed. */ Added to linux-tdep.c: +/* Symbols for linux_infcall_mmap's ARG_FLAGS; their Linux MAP_* system + definitions would be dependent on compilation host. */ +#define GDB_MMAP_MAP_PRIVATE 0x02 /* Changes are private. */ +#define GDB_MMAP_MAP_ANONYMOUS 0x20 /* Don't use a file. */ and - gdb_assert ((prot & ~7) == 0); + gdb_assert ((prot & ~(GDB_MMAP_PROT_READ | GDB_MMAP_PROT_WRITE + | GDB_MMAP_PROT_EXEC)) + == 0); Changed gdbarch.sh comment: -# PROT has rwx bitmask format - bit 2 (value 4) is for readable memory, bit 1 -# (value 2) is for writable memory and bit 0 (value 1) is for executable memory. +# PROT has GDB_MMAP_PROT_* bitmask format. Change changed the magic numbers to GDB_MMAP_PROT_* accordingly: // Make the memory always readable. - prot = 4; + prot = GDB_MMAP_PROT_READ; if ((bfd_get_section_flags (abfd, sect) & SEC_READONLY) == 0) - prot |= 2; + prot |= GDB_MMAP_PROT_WRITE; if ((bfd_get_section_flags (abfd, sect) & SEC_CODE) != 0) - prot |= 1; + prot |= GDB_MMAP_PROT_EXEC; [...] - TYPE_LENGTH (regs_type), 4); + TYPE_LENGTH (regs_type), + GDB_MMAP_PROT_READ); > It also likely breaks --enable-targets=all builds on hosts > that don't have mmap at all. E.g., this comes out empty on F20: > > $ grep -rn PROT_READ /usr/i686-w64-mingw32/sys-root/mingw/include/ This could be caught automatically by Gerrit+Jenkins like other projects do instead of wasting engineering time to do by hand all the parts of reviews which machines can do. Moreover such regressions would be caught before the commit, compared to the GDB regressions happening post-commit as there is no automatic pre-commit checking. My Gerrit proposal was denied and replaced by Patchwork instead. This also makes regression results comparison difficult to do as the regressions stack on top of each others. Thanks, Jan