diff options
author | Wez Furlong <wez@netevil.org> | 2011-04-03 14:37:41 -0400 |
---|---|---|
committer | Wez Furlong <wez@netevil.org> | 2011-04-03 14:37:41 -0400 |
commit | 253acb864d82ab0406d6a6bcecd09e502c64b140 (patch) | |
tree | 115e5562e80acc02e7329053f258cf1c0e3e1e38 /common | |
download | ctf-253acb864d82ab0406d6a6bcecd09e502c64b140.tar.gz |
Pull in the CTF sources from the FreeBSD 8.2 tree; arrange for them
to build under autoconf.
Diffstat (limited to 'common')
-rw-r--r-- | common/ctf_headers.h | 72 | ||||
-rw-r--r-- | common/list.c | 228 | ||||
-rw-r--r-- | common/list.h | 58 | ||||
-rw-r--r-- | common/memory.c | 103 | ||||
-rw-r--r-- | common/memory.h | 52 | ||||
-rw-r--r-- | common/symbol.c | 61 | ||||
-rw-r--r-- | common/symbol.h | 44 | ||||
-rw-r--r-- | common/utils.c | 107 | ||||
-rw-r--r-- | common/utils.h | 53 |
9 files changed, 778 insertions, 0 deletions
diff --git a/common/ctf_headers.h b/common/ctf_headers.h new file mode 100644 index 0000000..b00b8fd --- /dev/null +++ b/common/ctf_headers.h @@ -0,0 +1,72 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _CTF_HEADERS_H +#define _CTF_HEADERS_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Because the ON tools are executed on the system where they are built, + * the tools need to include the headers installed on the build system, + * rather than those in the ON source tree. However, some of the headers + * required by the tools are part of the ON source tree, but not delivered + * as part of Solaris. These include the following: + * + * $(SRC)/lib/libctf/common/libctf.h + * $(SRC)/uts/common/sys/ctf_api.h + * $(SRC)/uts/common/sys/ctf.h + * + * These headers get installed in the proto area in the build environment + * under $(ROOT)/usr/include and $(ROOT)/usr/include/sys. Though these + * headers are not part of the release, in releases including and prior to + * Solaris 9, they did get installed on the build system via bfu. Therefore, + * we can not simply force the order of inclusion with -I/usr/include first + * in Makefile.ctf because we might actually get downlevel versions of the + * ctf headers. Depending on the order of the -I includes, we can also have + * a problem with mismatched headers when building the ctf tools with some + * headers getting pulled in from /usr/include and others from + * $(SRC)/uts/common/sys. + * + * To address the problem, we have done two things: + * 1) Created this header with a specific order of inclusion for the + * ctf headers. Because the <libctf.h> header includes <sys/ctf_api.h> + * which in turn includes <sys/ctf.h> we need to include these in + * reverse order to guarantee that we get the correct versions of + * the headers. + * 2) In $(SRC)/tools/ctf/Makefile.ctf, we order the -I includes such + * that we first search the directories where the ctf headers + * live, followed by /usr/include, followed by $(SRC)/uts/common. + * This last -I include is needed in order to prevent a build failure + * when <sys/ctf_api.h> is included via a nested #include rather than + * an explicit path #include. + */ + +#include <uts/common/sys/ctf.h> +#include <uts/common/sys/ctf_api.h> +#include <lib/libctf/common/libctf.h> + +#endif /* _CTF_HEADERS_H */ diff --git a/common/list.c b/common/list.c new file mode 100644 index 0000000..4958f27 --- /dev/null +++ b/common/list.c @@ -0,0 +1,228 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Routines for manipulating linked lists + */ + +#include <stdio.h> +#include <assert.h> +#include <stdlib.h> + +#include "list.h" +#include "memory.h" + +struct list { + void *l_data; + struct list *l_next; +}; + +/* Add an element to a list */ +void +list_add(list_t **list, void *data) +{ + list_t *le; + + le = xmalloc(sizeof (list_t)); + le->l_data = data; + le->l_next = *list; + *list = le; +} + +/* Add an element to a sorted list */ +void +slist_add(list_t **list, void *data, int (*cmp)(void *, void *)) +{ + list_t **nextp; + + for (nextp = list; *nextp; nextp = &((*nextp)->l_next)) { + if (cmp((*nextp)->l_data, data) > 0) + break; + } + + list_add(nextp, data); +} + +/*ARGSUSED2*/ +static int +list_defcmp(void *d1, void *d2, void *private __unused) +{ + return (d1 != d2); +} + +void * +list_remove(list_t **list, void *data, int (*cmp)(void *, void *, void *), + void *private) +{ + list_t *le, **le2; + void *led; + + if (!cmp) + cmp = list_defcmp; + + for (le = *list, le2 = list; le; le2 = &le->l_next, le = le->l_next) { + if (cmp(le->l_data, data, private) == 0) { + *le2 = le->l_next; + led = le->l_data; + free(le); + return (led); + } + } + + return (NULL); +} + +void +list_free(list_t *list, void (*datafree)(void *, void *), void *private) +{ + list_t *le; + + while (list) { + le = list; + list = list->l_next; + if (le->l_data && datafree) + datafree(le->l_data, private); + free(le); + } +} + +/* + * This iterator is specifically designed to tolerate the deletion of the + * node being iterated over. + */ +int +list_iter(list_t *list, int (*func)(void *, void *), void *private) +{ + list_t *lnext; + int cumrc = 0; + int cbrc; + + while (list) { + lnext = list->l_next; + if ((cbrc = func(list->l_data, private)) < 0) + return (cbrc); + cumrc += cbrc; + list = lnext; + } + + return (cumrc); +} + +/*ARGSUSED*/ +static int +list_count_cb(void *data __unused, void *private __unused) +{ + return (1); +} + +int +list_count(list_t *list) +{ + return (list_iter(list, list_count_cb, NULL)); +} + +int +list_empty(list_t *list) +{ + return (list == NULL); +} + +void * +list_find(list_t *list, void *tmpl, int (*cmp)(void *, void *)) +{ + for (; list; list = list->l_next) { + if (cmp(list->l_data, tmpl) == 0) + return (list->l_data); + } + + return (NULL); +} + +void * +list_first(list_t *list) +{ + return (list ? list->l_data : NULL); +} + +void +list_concat(list_t **list1, list_t *list2) +{ + list_t *l, *last; + + for (l = *list1, last = NULL; l; last = l, l = l->l_next) + continue; + + if (last == NULL) + *list1 = list2; + else + last->l_next = list2; +} + +/* + * Merges two sorted lists. Equal nodes (as determined by cmp) are retained. + */ +void +slist_merge(list_t **list1p, list_t *list2, int (*cmp)(void *, void *)) +{ + list_t *list1, *next2; + list_t *last1 = NULL; + + if (*list1p == NULL) { + *list1p = list2; + return; + } + + list1 = *list1p; + while (list2 != NULL) { + if (cmp(list1->l_data, list2->l_data) > 0) { + next2 = list2->l_next; + + if (last1 == NULL) { + /* Insert at beginning */ + *list1p = last1 = list2; + list2->l_next = list1; + } else { + list2->l_next = list1; + last1->l_next = list2; + last1 = list2; + } + + list2 = next2; + } else { + + last1 = list1; + list1 = list1->l_next; + + if (list1 == NULL) { + /* Add the rest to the end of list1 */ + last1->l_next = list2; + list2 = NULL; + } + } + } +} diff --git a/common/list.h b/common/list.h new file mode 100644 index 0000000..2e41271 --- /dev/null +++ b/common/list.h @@ -0,0 +1,58 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _LIST_H +#define _LIST_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Routines for manipulating linked lists + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct list list_t; + +void list_add(list_t **, void *); +void slist_add(list_t **, void *, int (*)(void *, void *)); +void *list_remove(list_t **, void *, int (*)(void *, void *, void *), void *); +void list_free(list_t *, void (*)(void *, void *), void *); +void *list_find(list_t *, void *, int (*)(void *, void *)); +void *list_first(list_t *); +int list_iter(list_t *, int (*)(void *, void *), void *); +int list_count(list_t *); +int list_empty(list_t *); +void list_concat(list_t **, list_t *); +void slist_merge(list_t **, list_t *, int (*)(void *, void *)); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIST_H */ diff --git a/common/memory.c b/common/memory.c new file mode 100644 index 0000000..e16044a --- /dev/null +++ b/common/memory.c @@ -0,0 +1,103 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Routines for memory management + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "memory.h" + +static void +memory_bailout(void) +{ + (void) fprintf(stderr, "Out of memory\n"); + exit(1); +} + +void * +xmalloc(size_t size) +{ + void *mem; + + if ((mem = malloc(size)) == NULL) + memory_bailout(); + + return (mem); +} + +void * +xcalloc(size_t size) +{ + void *mem; + + mem = xmalloc(size); + bzero(mem, size); + + return (mem); +} + +char * +xstrdup(const char *str) +{ + char *newstr; + + if ((newstr = strdup(str)) == NULL) + memory_bailout(); + + return (newstr); +} + +char * +xstrndup(char *str, size_t len) +{ + char *newstr; + + if ((newstr = malloc(len + 1)) == NULL) + memory_bailout(); + + (void) strncpy(newstr, str, len); + newstr[len] = '\0'; + + return (newstr); +} + +void * +xrealloc(void *ptr, size_t size) +{ + void *mem; + + if ((mem = realloc(ptr, size)) == NULL) + memory_bailout(); + + return (mem); +} diff --git a/common/memory.h b/common/memory.h new file mode 100644 index 0000000..88ca31b --- /dev/null +++ b/common/memory.h @@ -0,0 +1,52 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2001-2002 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _MEMORY_H +#define _MEMORY_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Routines for memory management + */ + +#include <sys/types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +void *xmalloc(size_t); +void *xcalloc(size_t); +char *xstrdup(const char *); +char *xstrndup(char *, size_t); +void *xrealloc(void *, size_t); + +#ifdef __cplusplus +} +#endif + +#endif /* _MEMORY_H */ diff --git a/common/symbol.c b/common/symbol.c new file mode 100644 index 0000000..f8313e6 --- /dev/null +++ b/common/symbol.c @@ -0,0 +1,61 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include "libctf/ctf_impl.h" + +#include "symbol.h" + +int +ignore_symbol(GElf_Sym *sym, const char *name) +{ + uchar_t type = GELF_ST_TYPE(sym->st_info); + + /* + * As an optimization, we do not output function or data object + * records for undefined or anonymous symbols. + */ + if (sym->st_shndx == SHN_UNDEF || sym->st_name == 0) + return (1); + + /* + * _START_ and _END_ are added to the symbol table by the + * linker, and will never have associated type information. + */ + if (strcmp(name, "_START_") == 0 || strcmp(name, "_END_") == 0) + return (1); + + /* + * Do not output records for absolute-valued object symbols + * that have value zero. The compiler insists on generating + * things like this for __fsr_init_value settings, etc. + */ + if (type == STT_OBJECT && sym->st_shndx == SHN_ABS && + sym->st_value == 0) + return (1); + return (0); +} diff --git a/common/symbol.h b/common/symbol.h new file mode 100644 index 0000000..92b5e89 --- /dev/null +++ b/common/symbol.h @@ -0,0 +1,44 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYMBOL_H +#define _SYMBOL_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <gelf.h> + +#ifdef __cplusplus +extern "C" { +#endif + +int ignore_symbol(GElf_Sym *sym, const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYMBOL_H */ diff --git a/common/utils.c b/common/utils.c new file mode 100644 index 0000000..49dc25e --- /dev/null +++ b/common/utils.c @@ -0,0 +1,107 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1998-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include "libctf/ctf_impl.h" +#include "common/utils.h" + +/*LINTLIBRARY*/ + +static const char *pname; + +#pragma init(getpname) +const char * +getpname(void) +{ + const char *p, *q; + + if (pname != NULL) + return (pname); + +#if HAVE_GETEXECNAME + p = getexecname(); +#elif HAVE_GETPROGNAME + p = getprogname(); +#else +# error dont know how to find my executable name +#endif + + if (p != NULL) + q = strrchr(p, '/'); + else + q = NULL; + + if (q == NULL) + pname = p; + else + pname = q + 1; + + return (pname); +} + +void +vwarn(const char *format, va_list alist) +{ + int err = errno; + + if (pname != NULL) + (void) fprintf(stderr, "%s: ", pname); + + (void) vfprintf(stderr, format, alist); + + if (strchr(format, '\n') == NULL) + (void) fprintf(stderr, ": %s\n", strerror(err)); +} + +/*PRINTFLIKE1*/ +void +warn(const char *format, ...) +{ + va_list alist; + + va_start(alist, format); + vwarn(format, alist); + va_end(alist); +} + +void +vdie(const char *format, va_list alist) +{ + vwarn(format, alist); + exit(E_ERROR); +} + +/*PRINTFLIKE1*/ +void +die(const char *format, ...) +{ + va_list alist; + + va_start(alist, format); + vdie(format, alist); + va_end(alist); +} diff --git a/common/utils.h b/common/utils.h new file mode 100644 index 0000000..9b07361 --- /dev/null +++ b/common/utils.h @@ -0,0 +1,53 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1998-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ + +#ifndef _UTILS_H +#define _UTILS_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <stdarg.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define E_SUCCESS 0 /* Exit status for success */ +#define E_ERROR 1 /* Exit status for error */ +#define E_USAGE 2 /* Exit status for usage error */ + +extern void vwarn(const char *, va_list); +extern void warn(const char *, ...); +extern void vdie(const char *, va_list); +extern void die(const char *, ...); + +extern const char *getpname(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _UTILS_H */ |