From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7104 invoked by alias); 30 Apr 2019 22:57:19 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 7037 invoked by uid 89); 30 Apr 2019 22:57:18 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 spammy=claiming, triggering, alist X-HELO: aserp2130.oracle.com Received: from aserp2130.oracle.com (HELO aserp2130.oracle.com) (141.146.126.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 30 Apr 2019 22:57:16 +0000 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x3UMsPtf090621 for ; Tue, 30 Apr 2019 22:57:14 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=corp-2018-07-02; bh=ekEC6tNvMAqcKrsAAUB4fzOeMxHwCNyyJDf5cvZKPg4=; b=1CgxRwoTW57F00g2D17QOa3PVvvNj6MrHt9EhKIKf+3mqLvng68KP9FfXSEuS8mqauXi oSW3OFCgNxpTurVDgHW6tnufQPlopnxPejBly5F5B6XicABF5QmnSF9mN9C5AprkxwXS 5aJQyogWtwugX2YH+VWlZ7nO4dKkaawrHp41oVgJDcebEPE0LiwGNOYPdEVUN/b+HhQF oiiSD1Kba4yRMzIk6KxVhzrc7T23HtBqm8XBn/AKCZNJ7PUkcLDIzJYSiCAdZBvGEc/R p0i6DV9P/yOqualjKXKebmkvv41+dMqVtbJpq5dU3NWltFeAm5ejyZexnc1RlW3TcFh2 xA== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2130.oracle.com with ESMTP id 2s6xhy871p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 30 Apr 2019 22:57:14 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x3UMujZr171794 for ; Tue, 30 Apr 2019 22:57:14 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserp3030.oracle.com with ESMTP id 2s6xhg8q6x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 30 Apr 2019 22:57:14 +0000 Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x3UMvDOq019456 for ; Tue, 30 Apr 2019 22:57:13 GMT Received: from loom.srvr.nix (/81.187.191.129) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 30 Apr 2019 15:57:13 -0700 From: Nick Alcock To: binutils@sourceware.org Subject: [PATCH 03/19] libctf: lowest-level memory allocation and debug-dumping wrappers Date: Tue, 30 Apr 2019 22:57:00 -0000 Message-Id: <20190430225706.159422-4-nick.alcock@oracle.com> In-Reply-To: <20190430225706.159422-1-nick.alcock@oracle.com> References: <20190430225706.159422-1-nick.alcock@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2019-04/txt/msg00272.txt.bz2 Note for reviewers: I could easily be convinced that all of these wrappers serve no purpose and should be globally removed, but the debugging tracer is frequently useful, and the malloc/free/mmap/munmap wrappers have proved mildly useful in conjunction with symbol interposition for allocation debugging in the (relatively distant) past. (The debugging dumper is initialized via an ELF constructor in a different TU, ctf-lib.c, because this ELF constructor also does other things, mostly specific ctf-lib.c, which will be introduced in later commits, and we wanted to keep the number of ELF constructors down.) (I am amenable to replacing the environment-variable triggering of ctf_dprintf() with something else in the binutils commit, and dropping the other wrappers entirely, if you prefer. If some other way of triggering debugging trace output is preferred, or if the tracer should be replaced with a do-nothing wrapper in binutils, that is fine too.) libctf/ * ctf-impl.h: New file. * ctf-lib.c: New file. * ctf-subr.c: New file. --- libctf/ctf-impl.h | 71 +++++++++++++++++++++++++++++++++++++++++++++ libctf/ctf-lib.c | 26 +++++++++++++++++ libctf/ctf-subr.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 libctf/ctf-impl.h create mode 100644 libctf/ctf-lib.c create mode 100644 libctf/ctf-subr.c diff --git a/libctf/ctf-impl.h b/libctf/ctf-impl.h new file mode 100644 index 0000000000..108c89d2c5 --- /dev/null +++ b/libctf/ctf-impl.h @@ -0,0 +1,71 @@ +/* Implementation header. + Copyright (C) 2006-2019 Free Software Foundation, Inc. + + This file is part of libctf. + + libctf is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not see + . */ + +#ifndef _CTF_IMPL_H +#define _CTF_IMPL_H + +#include "config.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" + { +#endif + +/* Compiler attributes. */ + +#if defined (__GNUC__) + +/* GCC. We assume that all compilers claiming to be GCC support sufficiently + many GCC attributes that the code below works. If some non-GCC compilers + masquerading as GCC in fact do not implement these attributes, version checks + may be required. */ + +/* We use the _libctf_*_ pattern to avoid clashes with any future attribute + macros glibc may introduce, which have names of the pattern + __attribute_blah__. */ + +#define _libctf_constructor_(x) __attribute__ ((__constructor__)) +#define _libctf_destructor_(x) __attribute__ ((__destructor__)) +#define _libctf_printflike_(string_index,first_to_check) \ + __attribute__ ((__format__ (__printf__, (string_index), (first_to_check)))) +#define _libctf_unlikely_(x) __builtin_expect ((x), 0) +#define _libctf_unused_ __attribute__ ((__unused__)) + +#endif + +extern void *ctf_data_alloc (size_t); +extern void ctf_data_free (void *, size_t); +extern void ctf_data_protect (void *, size_t); + +extern void *ctf_alloc (size_t); +extern void ctf_free (void *, size_t); + +_libctf_printflike_ (1, 2) +extern void ctf_dprintf (const char *, ...); + +extern int _libctf_debug; /* debugging messages enabled */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CTF_IMPL_H */ diff --git a/libctf/ctf-lib.c b/libctf/ctf-lib.c new file mode 100644 index 0000000000..1e81f3d20e --- /dev/null +++ b/libctf/ctf-lib.c @@ -0,0 +1,26 @@ +/* Miscellary. + Copyright (C) 2003-2019 Free Software Foundation, Inc. + + This file is part of libctf. + + libctf is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not see + . */ + +#include + +_libctf_constructor_(_libctf_init) +static void _libctf_init (void) +{ + _libctf_debug = getenv ("LIBCTF_DEBUG") != NULL; +} diff --git a/libctf/ctf-subr.c b/libctf/ctf-subr.c new file mode 100644 index 0000000000..f358298b7d --- /dev/null +++ b/libctf/ctf-subr.c @@ -0,0 +1,74 @@ +/* Simple subrs. + Copyright (C) 2003-2019 Free Software Foundation, Inc. + + This file is part of libctf. + + libctf is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not see + . */ + +#include +#include +#include +#include + +void * +ctf_data_alloc (size_t size) +{ + return (mmap (NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, -1, 0)); +} + +void +ctf_data_free (void *buf, size_t size) +{ + (void) munmap (buf, size); +} + +void +ctf_data_protect (void *buf, size_t size) +{ + (void) mprotect (buf, size, PROT_READ); +} + +void * +ctf_alloc (size_t size) +{ + return (malloc (size)); +} + +void +ctf_free (void *buf, size_t size _libctf_unused_) +{ + free (buf); +} + +const char * +ctf_strerror (int err) +{ + return (const char *) (strerror (err)); +} + +_libctf_printflike_ (1, 2) +void ctf_dprintf (const char *format, ...) +{ + if (_libctf_debug) + { + va_list alist; + + va_start (alist, format); + (void) fputs ("libctf DEBUG: ", stderr); + (void) vfprintf (stderr, format, alist); + va_end (alist); + } +} -- 2.21.0.237.gd0cfaa883d