From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 114543 invoked by alias); 1 May 2019 00:19:33 -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 114534 invoked by uid 89); 1 May 2019 00:19:33 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 spammy=ancient X-HELO: userp2120.oracle.com Received: from userp2120.oracle.com (HELO userp2120.oracle.com) (156.151.31.85) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 01 May 2019 00:19:31 +0000 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x3UMsb7K101482 for ; Tue, 30 Apr 2019 22:57:26 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=LUdUUtiO5Ah3/Dgxey2QrLSMoxADl7QsbY6zbiM+dmc=; b=KZicNSATuq50OP7W7ZkLFuDd8+zp8793r2CCjf4mrHeIrRnKzezpJ6df84ZVDUQlcEgA Kk23ozHSYSV3+6U/eQQYq2giklTnBIWlAmkyiS8hjuin23GFn41ZROQ1uByTb6Z3o7H3 kA700R98olAuXW+EWZRmLBxLubedCsC5ow2hDTOypMzbzx0h4DnTTSuVjlZDi5SqUPCK 6P+TokfHM2Ux8jSeMaeWxbSBAdjuwfpraRs0iqFf8EMKUYCGknpKXExEcI+/yN+gJCzo T1uclKCOhHAz/x2XDfxIe8uCRCEXHV6Jr1KiEx2Ndqhc72s0KrB78xgCGnupv3Pi64FQ hQ== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by userp2120.oracle.com with ESMTP id 2s6xhyg6y7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 30 Apr 2019 22:57:26 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x3UMtipF161759 for ; Tue, 30 Apr 2019 22:57:26 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userp3030.oracle.com with ESMTP id 2s6xhh0q6j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 30 Apr 2019 22:57:25 +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 x3UMvPLa019542 for ; Tue, 30 Apr 2019 22:57:25 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:24 -0700 From: Nick Alcock To: binutils@sourceware.org Subject: [PATCH 16/19] libctf: labels Date: Wed, 01 May 2019 00:19:00 -0000 Message-Id: <20190430225706.159422-17-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-05/txt/msg00001.txt.bz2 This facility allows you to associate regions of type IDs with *labels*, a labelled tiling of the type ID space. You can use these to define CTF containers with distinct parents for distinct ranges of the ID space, or to assist with parallelization of CTF processing, or for any other purpose you can think of. Notably absent from here (though declared in the API header) is any way to define new labels: this will probably be introduced soon, as part of the linker deduplication work. (One existed in the past, but was deeply tied to the Solaris CTF file generator and had to be torn out.) I would be happy to drop this entire commit for now as half-baked, but it's an ancient interface and so to some degree shows what the original designers of CTF thought you could do with it. libctf/ * ctf-labels.c: New. include/ * ctf-api.h (ctf_label_f): New. (ctf_label_set): New. (ctf_label_get): New. (ctf_label_topmost): New. (ctf_label_info): New. (ctf_label_iter): New. --- include/ctf-api.h | 9 +++ libctf/ctf-labels.c | 138 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 libctf/ctf-labels.c diff --git a/include/ctf-api.h b/include/ctf-api.h index 8687fa9004..7cf3f9a3de 100644 --- a/include/ctf-api.h +++ b/include/ctf-api.h @@ -208,6 +208,8 @@ typedef int ctf_member_f (const char *name, ctf_id_t membtype, typedef int ctf_enum_f (const char *name, int val, void *arg); typedef int ctf_variable_f (const char *name, ctf_id_t type, void *arg); typedef int ctf_type_f (ctf_id_t type, void *arg); +typedef int ctf_label_f (const char *name, const ctf_lblinfo_t *info, + void *arg); typedef int ctf_archive_member_f (ctf_file_t *fp, const char *name, void *arg); typedef int ctf_archive_raw_member_f (const char *name, const void *content, size_t len, void *arg); @@ -273,9 +275,16 @@ extern int ctf_array_info (ctf_file_t *, ctf_id_t, ctf_arinfo_t *); extern const char *ctf_enum_name (ctf_file_t *, ctf_id_t, int); extern int ctf_enum_value (ctf_file_t *, ctf_id_t, const char *, int *); +extern void ctf_label_set (ctf_file_t *, const char *); +extern const char *ctf_label_get (ctf_file_t *); + +extern const char *ctf_label_topmost (ctf_file_t *); +extern int ctf_label_info (ctf_file_t *, const char *, ctf_lblinfo_t *); + extern int ctf_member_iter (ctf_file_t *, ctf_id_t, ctf_member_f *, void *); extern int ctf_enum_iter (ctf_file_t *, ctf_id_t, ctf_enum_f *, void *); extern int ctf_type_iter (ctf_file_t *, ctf_type_f *, void *); +extern int ctf_label_iter (ctf_file_t *, ctf_label_f *, void *); extern int ctf_variable_iter (ctf_file_t *, ctf_variable_f *, void *); extern int ctf_archive_iter (const ctf_archive_t *, ctf_archive_member_f *, void *); diff --git a/libctf/ctf-labels.c b/libctf/ctf-labels.c new file mode 100644 index 0000000000..c76207c966 --- /dev/null +++ b/libctf/ctf-labels.c @@ -0,0 +1,138 @@ +/* Labelled ranges of type IDs. + Copyright (C) 2002-2018 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 + +static int +extract_label_info (ctf_file_t *fp, const ctf_lblent_t **ctl, + uint32_t *num_labels) +{ + const ctf_header_t *h; + + h = (const ctf_header_t *) fp->ctf_data.cts_data; + + *ctl = (const ctf_lblent_t *) (fp->ctf_buf + h->cth_lbloff); + *num_labels = (h->cth_objtoff - h->cth_lbloff) / sizeof (ctf_lblent_t); + + return 0; +} + +/* Returns the topmost label, or NULL if any errors are encountered. */ + +const char * +ctf_label_topmost (ctf_file_t *fp) +{ + const ctf_lblent_t *ctlp = NULL; + const char *s; + uint32_t num_labels = 0; + + if (extract_label_info (fp, &ctlp, &num_labels) == CTF_ERR) + return NULL; /* errno is set for us. */ + + if (num_labels == 0) + { + (void) ctf_set_errno (fp, ECTF_NOLABELDATA); + return NULL; + } + + if ((s = ctf_strraw (fp, (ctlp + num_labels - 1)->ctl_label)) == NULL) + (void) ctf_set_errno (fp, ECTF_CORRUPT); + + return s; +} + +/* Iterate over all labels. We pass the label string and the lblinfo_t struct + to the specified callback function. */ +int +ctf_label_iter (ctf_file_t *fp, ctf_label_f *func, void *arg) +{ + const ctf_lblent_t *ctlp = NULL; + uint32_t i; + uint32_t num_labels = 0; + ctf_lblinfo_t linfo; + const char *lname; + int rc; + + if (extract_label_info (fp, &ctlp, &num_labels) == CTF_ERR) + return CTF_ERR; /* errno is set for us. */ + + if (num_labels == 0) + return (ctf_set_errno (fp, ECTF_NOLABELDATA)); + + for (i = 0; i < num_labels; i++, ctlp++) + { + if ((lname = ctf_strraw (fp, ctlp->ctl_label)) == NULL) + { + ctf_dprintf ("failed to decode label %u with " + "type %u\n", ctlp->ctl_label, ctlp->ctl_type); + return (ctf_set_errno (fp, ECTF_CORRUPT)); + } + + linfo.ctb_type = ctlp->ctl_type; + if ((rc = func (lname, &linfo, arg)) != 0) + return rc; + } + + return 0; +} + +typedef struct linfo_cb_arg +{ + const char *lca_name; /* Label we want to retrieve info for. */ + ctf_lblinfo_t *lca_info; /* Where to store the info about the label. */ +} linfo_cb_arg_t; + +static int +label_info_cb (const char *lname, const ctf_lblinfo_t *linfo, void *arg) +{ + /* If lname matches the label we are looking for, copy the + lblinfo_t struct for the caller. */ + + if (strcmp (lname, ((linfo_cb_arg_t *) arg)->lca_name) == 0) + { + /* * Allow caller not to allocate storage to test if label exists. */ + + if (((linfo_cb_arg_t *) arg)->lca_info != NULL) + memcpy (((linfo_cb_arg_t *) arg)->lca_info, linfo, + sizeof (ctf_lblinfo_t)); + return 1; /* Indicate we found a match. */ + } + + return 0; +} + +/* Retrieve information about the label with name "lname". */ +int +ctf_label_info (ctf_file_t *fp, const char *lname, ctf_lblinfo_t *linfo) +{ + linfo_cb_arg_t cb_arg; + int rc; + + cb_arg.lca_name = lname; + cb_arg.lca_info = linfo; + + if ((rc = ctf_label_iter (fp, label_info_cb, &cb_arg)) == CTF_ERR) + return rc; + + if (rc != 1) + return (ctf_set_errno (fp, ECTF_NOLABEL)); + + return 0; +} -- 2.21.0.237.gd0cfaa883d