diff options
author | Robert Mustacchi <rm@joyent.com> | 2019-01-17 17:50:46 +0000 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2019-02-11 17:40:04 +0000 |
commit | bc1f688b4872ace323eaddbb1a6365d054e7bf56 (patch) | |
tree | 3b6f2f4caaa4bafcfb4f757be7ea4de2858201ce /usr/src/tools/ctf | |
parent | 2b987d42b0ad07d74e39b18a2498709e5195d7e3 (diff) | |
download | illumos-gate-bc1f688b4872ace323eaddbb1a6365d054e7bf56.tar.gz |
6885 CTF Everywhere Part 1
6886 Want ctfdiff
6887 ctfdump should be written in terms of libctf
6888 ctfmerge should be implemented in terms of libctf
6889 ctfconvert should be implemented in terms of libctf
6890 Want general workq
6891 Want general mergeq
6892 ctf_add_encoded assigns() incorrect byte size to types
6893 ctf_add_{struct,union,enum} can reuse forwards
6894 ctf_add_{struct,union,enum} occasionally forget to dirty the ctf_file_t
6895 ctf_add_member could better handle bitfields
6896 ctf_type_size() reports wrong size for forwards
6897 Want libctf ctf_kind_name() function
6898 Want libctf function to set struct/union size
Portions contributed by: John Levon <john.levon@joyent.com>
Portions contributed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: John Levon <john.levon@joyent.com>
Reviewed by: Andy Fiddaman <andy@omniosce.org>
Reviewed by: Gergő Doma <domag02@gmail.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/tools/ctf')
132 files changed, 615 insertions, 40135 deletions
diff --git a/usr/src/tools/ctf/Makefile b/usr/src/tools/ctf/Makefile index dee410e27c..3ea3da7ca1 100644 --- a/usr/src/tools/ctf/Makefile +++ b/usr/src/tools/ctf/Makefile @@ -26,7 +26,9 @@ include ../Makefile.tools -SUBDIRS = cvt dump stabs ctfstrip +SUBDIRS = stabs ctfstrip libctf ctfdiff ctfdump +$(BUILD_OLD_CTF_TOOLS)SUBDIRS += cvt +$(BUILD_NEW_CTF_TOOLS)SUBDIRS += ctfmerge ctfconvert .PARALLEL: $(SUBDIRS) @@ -38,6 +40,11 @@ lint := TARGET= lint .KEEP_STATE: +ctfmerge: libctf +ctfdiff: libctf +ctfdump: libctf +ctfconvert: libctf + all clean clobber install lint: dwarf .WAIT $(SUBDIRS) dwarf $(SUBDIRS): FRC diff --git a/usr/src/tools/ctf/Makefile.ctf b/usr/src/tools/ctf/Makefile.ctf index 56e569a674..c07310eddf 100644 --- a/usr/src/tools/ctf/Makefile.ctf +++ b/usr/src/tools/ctf/Makefile.ctf @@ -29,12 +29,12 @@ include ../../../Makefile.tools # # A `make install' from the tools directory needs to work, even if the rest of # the tree hasn't been built. As such, we need to tell the ctf builds how -# to find the ctf specific headers located outside the tools subtree. We also +# to find the ctf specific headers located outside the tools subtree. We also # want to tell them how to get to the common tools source files. -# +# # For additonal details on the ordering of includes via -I, see the comments # in $(SRC)/tools/ctf/common/ctf_headers.h. -# +# HDRDIRS= \ -_gcc=-nostdinc \ @@ -42,6 +42,7 @@ HDRDIRS= \ -I$(SRC) \ -I/usr/include \ -I$(SRC)/uts/common \ + -I$(SRC)/common/ctf \ -I$(NATIVE_ADJUNCT)/include CPPFLAGS += $(HDRDIRS) diff --git a/usr/src/tools/ctf/common/ctf_headers.h b/usr/src/tools/ctf/common/ctf_headers.h index b00b8fd9a6..572fb03d4d 100644 --- a/usr/src/tools/ctf/common/ctf_headers.h +++ b/usr/src/tools/ctf/common/ctf_headers.h @@ -22,21 +22,21 @@ /* * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2018 Joyent, Inc. */ #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: + * as part of illumos. These include the following: * * $(SRC)/lib/libctf/common/libctf.h + * $(SRC)/lib/libctf/common/libctf_impl.h * $(SRC)/uts/common/sys/ctf_api.h * $(SRC)/uts/common/sys/ctf.h * @@ -63,10 +63,22 @@ * 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. + * + * We'll also include the local ccompile.h - older build systems often lack + * useful definitions like __unused. Finally, we'll also define ARRAY_SIZE: + * unfortunately, older systems sysmacros.h only have this defined for the + * kernel, and we can't easily pick it up otherwise. */ +#include <uts/common/sys/ccompile.h> #include <uts/common/sys/ctf.h> #include <uts/common/sys/ctf_api.h> +#include <common/ctf/ctf_impl.h> #include <lib/libctf/common/libctf.h> +#include <lib/libctf/common/libctf_impl.h> + +#if !defined(ARRAY_SIZE) +#define ARRAY_SIZE(x) (sizeof (x) / sizeof (x[0])) +#endif #endif /* _CTF_HEADERS_H */ diff --git a/usr/src/tools/ctf/dump/Makefile b/usr/src/tools/ctf/ctfconvert/Makefile index 16d8280cdd..07fadc5f8f 100644 --- a/usr/src/tools/ctf/dump/Makefile +++ b/usr/src/tools/ctf/ctfconvert/Makefile @@ -23,7 +23,6 @@ # Copyright (c) 2001 by Sun Microsystems, Inc. # All rights reserved. # -#ident "%Z%%M% %I% %E% SMI" include ../../Makefile.tools diff --git a/usr/src/tools/ctf/ctfconvert/Makefile.com b/usr/src/tools/ctf/ctfconvert/Makefile.com new file mode 100644 index 0000000000..33268bd979 --- /dev/null +++ b/usr/src/tools/ctf/ctfconvert/Makefile.com @@ -0,0 +1,44 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +PROG = ctfconvert +SRCS = ctfconvert.c + +include ../../Makefile.ctf + +CFLAGS += $(CCVERBOSE) +LDLIBS += -lctf -lelf + +LDFLAGS = \ + -L$(ROOTONBLDLIBMACH) \ + '-R$$ORIGIN/../../lib/$(MACH)' \ + +CPPFLAGS += -include ../../common/ctf_headers.h + +OBJS = $(SRCS:%.c=%.o) + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: $(SRC)/cmd/ctfconvert/%.c + $(COMPILE.c) $< + +$(ROOTONBLDMACHPROG): $(PROG) + +install: $(ROOTONBLDMACHPROG) + +clean: + $(RM) $(OBJS) $(LINTFILES) + +include $(SRC)/tools/Makefile.targ diff --git a/usr/src/tools/ctf/dump/sparc/Makefile b/usr/src/tools/ctf/ctfconvert/i386/Makefile index 94e5883ae2..cd5462bee3 100644 --- a/usr/src/tools/ctf/dump/sparc/Makefile +++ b/usr/src/tools/ctf/ctfconvert/i386/Makefile @@ -23,6 +23,5 @@ # Copyright (c) 2001 by Sun Microsystems, Inc. # All rights reserved. # -#ident "%Z%%M% %I% %E% SMI" include ../Makefile.com diff --git a/usr/src/tools/ctf/dump/i386/Makefile b/usr/src/tools/ctf/ctfconvert/sparc/Makefile index 94e5883ae2..cd5462bee3 100644 --- a/usr/src/tools/ctf/dump/i386/Makefile +++ b/usr/src/tools/ctf/ctfconvert/sparc/Makefile @@ -23,6 +23,5 @@ # Copyright (c) 2001 by Sun Microsystems, Inc. # All rights reserved. # -#ident "%Z%%M% %I% %E% SMI" include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfdiff/Makefile b/usr/src/tools/ctf/ctfdiff/Makefile new file mode 100644 index 0000000000..07fadc5f8f --- /dev/null +++ b/usr/src/tools/ctf/ctfdiff/Makefile @@ -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 (c) 2001 by Sun Microsystems, Inc. +# All rights reserved. +# + +include ../../Makefile.tools + +SUBDIRS = $(MACH) + +all := TARGET= all +install := TARGET= install +clean := TARGET= clean +clobber := TARGET= clobber +lint := TARGET= lint + +.KEEP_STATE: + +install all clean clobber lint: $(SUBDIRS) + +$(SUBDIRS): FRC + @cd $@; pwd; $(MAKE) $(TARGET) + +FRC: diff --git a/usr/src/tools/ctf/ctfdiff/Makefile.com b/usr/src/tools/ctf/ctfdiff/Makefile.com new file mode 100644 index 0000000000..3c5e19fb6e --- /dev/null +++ b/usr/src/tools/ctf/ctfdiff/Makefile.com @@ -0,0 +1,44 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +PROG = ctfdiff +SRCS = ctfdiff.c + +include ../../Makefile.ctf + +CFLAGS += $(CCVERBOSE) +LDLIBS += -lctf + +LDFLAGS = \ + -L$(ROOTONBLDLIBMACH) \ + '-R$$ORIGIN/../../lib/$(MACH)' \ + +CPPFLAGS += -include ../../common/ctf_headers.h + +OBJS = $(SRCS:%.c=%.o) + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: $(SRC)/cmd/ctfdiff/%.c + $(COMPILE.c) $< + +$(ROOTONBLDMACHPROG): $(PROG) + +install: $(ROOTONBLDMACHPROG) + +clean: + $(RM) $(OBJS) $(LINTFILES) + +include $(SRC)/tools/Makefile.targ diff --git a/usr/src/tools/ctf/ctfdiff/i386/Makefile b/usr/src/tools/ctf/ctfdiff/i386/Makefile new file mode 100644 index 0000000000..89525f10f4 --- /dev/null +++ b/usr/src/tools/ctf/ctfdiff/i386/Makefile @@ -0,0 +1,16 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfdiff/sparc/Makefile b/usr/src/tools/ctf/ctfdiff/sparc/Makefile new file mode 100644 index 0000000000..89525f10f4 --- /dev/null +++ b/usr/src/tools/ctf/ctfdiff/sparc/Makefile @@ -0,0 +1,16 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfdump/Makefile b/usr/src/tools/ctf/ctfdump/Makefile new file mode 100644 index 0000000000..20d304216a --- /dev/null +++ b/usr/src/tools/ctf/ctfdump/Makefile @@ -0,0 +1,33 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../../Makefile.tools + +SUBDIRS = $(MACH) + +all := TARGET= all +install := TARGET= install +clean := TARGET= clean +clobber := TARGET= clobber +lint := TARGET= lint + +.KEEP_STATE: + +install all clean clobber lint: $(SUBDIRS) + +$(SUBDIRS): FRC + @cd $@; pwd; $(MAKE) $(TARGET) + +FRC: diff --git a/usr/src/tools/ctf/ctfdump/Makefile.com b/usr/src/tools/ctf/ctfdump/Makefile.com new file mode 100644 index 0000000000..66e7a170c4 --- /dev/null +++ b/usr/src/tools/ctf/ctfdump/Makefile.com @@ -0,0 +1,47 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# Copyright 2018 Joyent, Inc. + +PROG = ctfdump +SRCS = ctfdump.c + +include ../../Makefile.ctf + +CSTD = $(CSTD_GNU99) +C99LMODE = -Xc99=%all +CFLAGS += $(CCVERBOSE) +LDLIBS += -lctf + +LDFLAGS = \ + -L$(ROOTONBLDLIBMACH) \ + '-R$$ORIGIN/../../lib/$(MACH)' \ + +CPPFLAGS += -include ../../common/ctf_headers.h + +OBJS = $(SRCS:%.c=%.o) + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: $(SRC)/cmd/ctfdump/%.c + $(COMPILE.c) $< + +$(ROOTONBLDMACHPROG): $(PROG) + +install: $(ROOTONBLDMACHPROG) + +clean: + $(RM) $(OBJS) $(LINTFILES) + +include $(SRC)/tools/Makefile.targ diff --git a/usr/src/tools/ctf/ctfdump/i386/Makefile b/usr/src/tools/ctf/ctfdump/i386/Makefile new file mode 100644 index 0000000000..89525f10f4 --- /dev/null +++ b/usr/src/tools/ctf/ctfdump/i386/Makefile @@ -0,0 +1,16 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfdump/sparc/Makefile b/usr/src/tools/ctf/ctfdump/sparc/Makefile new file mode 100644 index 0000000000..89525f10f4 --- /dev/null +++ b/usr/src/tools/ctf/ctfdump/sparc/Makefile @@ -0,0 +1,16 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfmerge/Makefile b/usr/src/tools/ctf/ctfmerge/Makefile new file mode 100644 index 0000000000..07fadc5f8f --- /dev/null +++ b/usr/src/tools/ctf/ctfmerge/Makefile @@ -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 (c) 2001 by Sun Microsystems, Inc. +# All rights reserved. +# + +include ../../Makefile.tools + +SUBDIRS = $(MACH) + +all := TARGET= all +install := TARGET= install +clean := TARGET= clean +clobber := TARGET= clobber +lint := TARGET= lint + +.KEEP_STATE: + +install all clean clobber lint: $(SUBDIRS) + +$(SUBDIRS): FRC + @cd $@; pwd; $(MAKE) $(TARGET) + +FRC: diff --git a/usr/src/tools/ctf/ctfmerge/Makefile.com b/usr/src/tools/ctf/ctfmerge/Makefile.com new file mode 100644 index 0000000000..2702fa9d13 --- /dev/null +++ b/usr/src/tools/ctf/ctfmerge/Makefile.com @@ -0,0 +1,46 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +PROG = ctfmerge +SRCS = ctfmerge.c + +include ../../Makefile.ctf + +CFLAGS += $(CCVERBOSE) +LDLIBS += -lctf -lelf + +LDFLAGS += \ + -L$(ROOTONBLDLIBMACH) \ + '-R$$ORIGIN/../../lib/$(MACH)' \ + +CPPFLAGS += -include ../../common/ctf_headers.h +CERRWARN += -_gcc=-Wno-unused-variable +CERRWARN += -_gcc=-Wno-uninitialized + +OBJS = $(SRCS:%.c=%.o) + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: $(SRC)/cmd/ctfmerge/%.c + $(COMPILE.c) $< + +$(ROOTONBLDMACHPROG): $(PROG) + +install: $(ROOTONBLDMACHPROG) + +clean: + $(RM) $(OBJS) $(LINTFILES) + +include $(SRC)/tools/Makefile.targ diff --git a/usr/src/tools/ctf/ctfmerge/i386/Makefile b/usr/src/tools/ctf/ctfmerge/i386/Makefile new file mode 100644 index 0000000000..cd5462bee3 --- /dev/null +++ b/usr/src/tools/ctf/ctfmerge/i386/Makefile @@ -0,0 +1,27 @@ +# +# 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) 2001 by Sun Microsystems, Inc. +# All rights reserved. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/ctfmerge/sparc/Makefile b/usr/src/tools/ctf/ctfmerge/sparc/Makefile new file mode 100644 index 0000000000..cd5462bee3 --- /dev/null +++ b/usr/src/tools/ctf/ctfmerge/sparc/Makefile @@ -0,0 +1,27 @@ +# +# 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) 2001 by Sun Microsystems, Inc. +# All rights reserved. +# + +include ../Makefile.com diff --git a/usr/src/tools/ctf/cvt/Makefile.com b/usr/src/tools/ctf/cvt/Makefile.com index 5cdccf6dfc..052cf02cc4 100644 --- a/usr/src/tools/ctf/cvt/Makefile.com +++ b/usr/src/tools/ctf/cvt/Makefile.com @@ -32,6 +32,7 @@ PROG=ctfconvert ctfmerge GENSRCS= \ alist.c \ + altexec.c \ barrier.c \ ctf.c \ fifo.c \ @@ -71,7 +72,7 @@ DWARFLDFLAGS = \ -L$(ROOTONBLDLIBMACH) \ '-R$$ORIGIN/../../lib/$(MACH)' \ -ldwarf -DWARFCPPFLAGS = -I../../dwarf/common +DWARFCPPFLAGS = -I$(SRC)/lib/libdwarf/common LDFLAGS += -L$(NATIVE_ADJUNCT)/lib LDLIBS += -lz -lelf diff --git a/usr/src/tools/ctf/cvt/altexec.c b/usr/src/tools/ctf/cvt/altexec.c new file mode 100644 index 0000000000..c986c0731a --- /dev/null +++ b/usr/src/tools/ctf/cvt/altexec.c @@ -0,0 +1,45 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright (c) 2015, Joyent, Inc. + */ + +/* + * Alternate execution engine for CTF tools + */ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "ctftools.h" + +void +ctf_altexec(const char *env, int argc, char **argv) +{ + const char *alt; + char *altexec; + + alt = getenv(env); + if (alt == NULL || *alt == '\0') + return; + + altexec = strdup(alt); + if (altexec == NULL) + terminate("failed to allocate memory for altexec\n"); + + if (unsetenv(env) != 0) + aborterr("failed to remove %s from environment", env); + + (void) execv(altexec, argv); + terminate("failed to altexec %s", altexec); +} diff --git a/usr/src/tools/ctf/cvt/ctfconvert.c b/usr/src/tools/ctf/cvt/ctfconvert.c index 36496c5e9d..af005e1934 100644 --- a/usr/src/tools/ctf/cvt/ctfconvert.c +++ b/usr/src/tools/ctf/cvt/ctfconvert.c @@ -146,6 +146,7 @@ main(int argc, char **argv) { tdata_t *filetd, *mstrtd; char *label = NULL; + char *altexec; int verbose = 0; int ignore_non_c = 0; int c; @@ -156,12 +157,21 @@ main(int argc, char **argv) progname = basename(argv[0]); + ctf_altexec("CTFCONVERT_ALTEXEC", argc, argv); + if (getenv("CTFCONVERT_DEBUG_LEVEL")) debug_level = atoi(getenv("CTFCONVERT_DEBUG_LEVEL")); if (getenv("CTFCONVERT_DEBUG_PARSE")) debug_parse = atoi(getenv("CTFCONVERT_DEBUG_PARSE")); - while ((c = getopt(argc, argv, ":l:L:o:ivs")) != EOF) { + if ((altexec = getenv("CTFCONVERT_ALTEXEC")) != NULL) { + (void) unsetenv("CTFCONVERT_ALTEXEC"); + (void) execv(altexec, argv); + (void) fprintf(stderr, "ctfconvert altexec failed to " + "run %s: %s\n", altexec, strerror(errno)); + } + + while ((c = getopt(argc, argv, ":l:L:o:givs")) != EOF) { switch (c) { case 'l': label = optarg; diff --git a/usr/src/tools/ctf/cvt/ctfmerge.c b/usr/src/tools/ctf/cvt/ctfmerge.c index 1d6d751d99..d2db789e5f 100644 --- a/usr/src/tools/ctf/cvt/ctfmerge.c +++ b/usr/src/tools/ctf/cvt/ctfmerge.c @@ -748,6 +748,8 @@ main(int argc, char **argv) progname = basename(argv[0]); + ctf_altexec("CTFMERGE_ALTEXEC", argc, argv); + if (getenv("CTFMERGE_DEBUG_LEVEL")) debug_level = atoi(getenv("CTFMERGE_DEBUG_LEVEL")); diff --git a/usr/src/tools/ctf/cvt/ctftools.h b/usr/src/tools/ctf/cvt/ctftools.h index 79746cba52..7547ce389f 100644 --- a/usr/src/tools/ctf/cvt/ctftools.h +++ b/usr/src/tools/ctf/cvt/ctftools.h @@ -442,6 +442,9 @@ void warning(char *, ...); void vadebug(int, char *, va_list); void debug(int, char *, ...); +/* altexec.c */ +void ctf_altexec(const char *, int argc, char **); + #ifdef __cplusplus } #endif diff --git a/usr/src/tools/ctf/dump/dump.c b/usr/src/tools/ctf/dump/dump.c deleted file mode 100644 index 5579bae596..0000000000 --- a/usr/src/tools/ctf/dump/dump.c +++ /dev/null @@ -1,1028 +0,0 @@ -/* - * 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 <sys/types.h> -#include <sys/sysmacros.h> -#include <sys/stat.h> -#include <sys/mman.h> - -#include <strings.h> -#include <unistd.h> -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <gelf.h> -#include <zlib.h> - -#include "ctf_headers.h" -#include "utils.h" -#include "symbol.h" - -#define WARN(x) { warn(x); return (E_ERROR); } - -/* - * Flags that indicate what data is to be displayed. An explicit `all' value is - * provided to allow the code to distinguish between a request for everything - * (currently requested by invoking ctfdump without flags) and individual - * requests for all of the types of data (an invocation with all flags). In the - * former case, we want to be able to implicitly adjust the definition of `all' - * based on the CTF version of the file being dumped. For example, if a v2 file - * is being dumped, `all' includes F_LABEL - a request to dump the label - * section. If a v1 file is being dumped, `all' does not include F_LABEL, - * because v1 CTF doesn't support labels. We need to be able to distinguish - * between `ctfdump foo', which has an implicit request for labels if `foo' - * supports them, and `ctfdump -l foo', which has an explicity request. In the - * latter case, we exit with an error if `foo' is a v1 CTF file. - */ -static enum { - F_DATA = 0x01, /* show data object section */ - F_FUNC = 0x02, /* show function section */ - F_HDR = 0x04, /* show header */ - F_STR = 0x08, /* show string table */ - F_TYPES = 0x10, /* show type section */ - F_STATS = 0x20, /* show statistics */ - F_LABEL = 0x40, /* show label section */ - F_ALL = 0x80, /* explicit request for `all' */ - F_ALLMSK = 0xff /* show all sections and statistics */ -} flags = 0; - -static struct { - ulong_t s_ndata; /* total number of data objects */ - ulong_t s_nfunc; /* total number of functions */ - ulong_t s_nargs; /* total number of function arguments */ - ulong_t s_argmax; /* longest argument list */ - ulong_t s_ntypes; /* total number of types */ - ulong_t s_types[16]; /* number of types by kind */ - ulong_t s_nsmem; /* total number of struct members */ - ulong_t s_nsbytes; /* total size of all structs */ - ulong_t s_smmax; /* largest struct in terms of members */ - ulong_t s_sbmax; /* largest struct in terms of bytes */ - ulong_t s_numem; /* total number of union members */ - ulong_t s_nubytes; /* total size of all unions */ - ulong_t s_ummax; /* largest union in terms of members */ - ulong_t s_ubmax; /* largest union in terms of bytes */ - ulong_t s_nemem; /* total number of enum members */ - ulong_t s_emmax; /* largest enum in terms of members */ - ulong_t s_nstr; /* total number of strings */ - size_t s_strlen; /* total length of all strings */ - size_t s_strmax; /* longest string length */ -} stats; - -typedef struct ctf_data { - caddr_t cd_ctfdata; /* Pointer to the CTF data */ - size_t cd_ctflen; /* Length of CTF data */ - - /* - * cd_symdata will be non-NULL if the CTF data is being retrieved from - * an ELF file with a symbol table. cd_strdata and cd_nsyms should be - * used only if cd_symdata is non-NULL. - */ - Elf_Data *cd_symdata; /* Symbol table */ - Elf_Data *cd_strdata; /* Symbol table strings */ - int cd_nsyms; /* Number of symbol table entries */ -} ctf_data_t; - -static const char * -ref_to_str(uint_t name, const ctf_header_t *hp, const ctf_data_t *cd) -{ - size_t offset = CTF_NAME_OFFSET(name); - const char *s = cd->cd_ctfdata + hp->cth_stroff + offset; - - if (CTF_NAME_STID(name) != CTF_STRTAB_0) - return ("<< ??? - name in external strtab >>"); - - if (offset >= hp->cth_strlen) - return ("<< ??? - name exceeds strlab len >>"); - - if (hp->cth_stroff + offset >= cd->cd_ctflen) - return ("<< ??? - file truncated >>"); - - if (s[0] == '\0') - return ("(anon)"); - - return (s); -} - -static const char * -int_encoding_to_str(uint_t encoding) -{ - static char buf[32]; - - if (encoding == 0 || (encoding & ~(CTF_INT_SIGNED | CTF_INT_CHAR | - CTF_INT_BOOL | CTF_INT_VARARGS)) != 0) - (void) snprintf(buf, sizeof (buf), " 0x%x", encoding); - else { - buf[0] = '\0'; - if (encoding & CTF_INT_SIGNED) - (void) strcat(buf, " SIGNED"); - if (encoding & CTF_INT_CHAR) - (void) strcat(buf, " CHAR"); - if (encoding & CTF_INT_BOOL) - (void) strcat(buf, " BOOL"); - if (encoding & CTF_INT_VARARGS) - (void) strcat(buf, " VARARGS"); - } - - return (buf + 1); -} - -static const char * -fp_encoding_to_str(uint_t encoding) -{ - static const char *const encs[] = { - NULL, "SINGLE", "DOUBLE", "COMPLEX", "DCOMPLEX", "LDCOMPLEX", - "LDOUBLE", "INTERVAL", "DINTERVAL", "LDINTERVAL", "IMAGINARY", - "DIMAGINARY", "LDIMAGINARY" - }; - - static char buf[16]; - - if (encoding < 1 || encoding >= (sizeof (encs) / sizeof (char *))) { - (void) snprintf(buf, sizeof (buf), "%u", encoding); - return (buf); - } - - return (encs[encoding]); -} - -static void -print_line(const char *s) -{ - static const char line[] = "----------------------------------------" - "----------------------------------------"; - (void) printf("\n%s%.*s\n\n", s, (int)(78 - strlen(s)), line); -} - -static int -print_header(const ctf_header_t *hp, const ctf_data_t *cd) -{ - print_line("- CTF Header "); - - (void) printf(" cth_magic = 0x%04x\n", hp->cth_magic); - (void) printf(" cth_version = %u\n", hp->cth_version); - (void) printf(" cth_flags = 0x%02x\n", hp->cth_flags); - (void) printf(" cth_parlabel = %s\n", - ref_to_str(hp->cth_parlabel, hp, cd)); - (void) printf(" cth_parname = %s\n", - ref_to_str(hp->cth_parname, hp, cd)); - (void) printf(" cth_lbloff = %u\n", hp->cth_lbloff); - (void) printf(" cth_objtoff = %u\n", hp->cth_objtoff); - (void) printf(" cth_funcoff = %u\n", hp->cth_funcoff); - (void) printf(" cth_typeoff = %u\n", hp->cth_typeoff); - (void) printf(" cth_stroff = %u\n", hp->cth_stroff); - (void) printf(" cth_strlen = %u\n", hp->cth_strlen); - - return (E_SUCCESS); -} - -static int -print_labeltable(const ctf_header_t *hp, const ctf_data_t *cd) -{ - /* LINTED - pointer alignment */ - const ctf_lblent_t *ctl = (ctf_lblent_t *)(cd->cd_ctfdata + - hp->cth_lbloff); - ulong_t i, n = (hp->cth_objtoff - hp->cth_lbloff) / sizeof (*ctl); - - print_line("- Label Table "); - - if (hp->cth_lbloff & 3) - WARN("cth_lbloff is not aligned properly\n"); - if (hp->cth_lbloff >= cd->cd_ctflen) - WARN("file is truncated or cth_lbloff is corrupt\n"); - if (hp->cth_objtoff >= cd->cd_ctflen) - WARN("file is truncated or cth_objtoff is corrupt\n"); - if (hp->cth_lbloff > hp->cth_objtoff) - WARN("file is corrupt -- cth_lbloff > cth_objtoff\n"); - - for (i = 0; i < n; i++, ctl++) { - (void) printf(" %5u %s\n", ctl->ctl_typeidx, - ref_to_str(ctl->ctl_label, hp, cd)); - } - - return (E_SUCCESS); -} - -/* - * Given the current symbol index (-1 to start at the beginning of the symbol - * table) and the type of symbol to match, this function returns the index of - * the next matching symbol (if any), and places the name of that symbol in - * *namep. If no symbol is found, -1 is returned. - */ -static int -next_sym(const ctf_data_t *cd, const int symidx, const uchar_t matchtype, - char **namep) -{ - int i; - - for (i = symidx + 1; i < cd->cd_nsyms; i++) { - GElf_Sym sym; - char *name; - int type; - - if (gelf_getsym(cd->cd_symdata, i, &sym) == 0) - return (-1); - - name = (char *)cd->cd_strdata->d_buf + sym.st_name; - type = GELF_ST_TYPE(sym.st_info); - - /* - * Skip various types of symbol table entries. - */ - if (type != matchtype || ignore_symbol(&sym, name)) - continue; - - /* Found one */ - *namep = name; - return (i); - } - - return (-1); -} - -static int -read_data(const ctf_header_t *hp, const ctf_data_t *cd) -{ - /* LINTED - pointer alignment */ - const ushort_t *idp = (ushort_t *)(cd->cd_ctfdata + hp->cth_objtoff); - ulong_t n = (hp->cth_funcoff - hp->cth_objtoff) / sizeof (ushort_t); - - if (flags != F_STATS) - print_line("- Data Objects "); - - if (hp->cth_objtoff & 1) - WARN("cth_objtoff is not aligned properly\n"); - if (hp->cth_objtoff >= cd->cd_ctflen) - WARN("file is truncated or cth_objtoff is corrupt\n"); - if (hp->cth_funcoff >= cd->cd_ctflen) - WARN("file is truncated or cth_funcoff is corrupt\n"); - if (hp->cth_objtoff > hp->cth_funcoff) - WARN("file is corrupt -- cth_objtoff > cth_funcoff\n"); - - if (flags != F_STATS) { - int symidx, len, i; - char *name = NULL; - - for (symidx = -1, i = 0; i < n; i++) { - int nextsym; - - if (cd->cd_symdata == NULL || (nextsym = next_sym(cd, - symidx, STT_OBJECT, &name)) < 0) - name = NULL; - else - symidx = nextsym; - - len = printf(" [%u] %u", i, *idp++); - if (name != NULL) - (void) printf("%*s%s (%u)", (15 - len), "", - name, symidx); - (void) putchar('\n'); - } - } - - stats.s_ndata = n; - return (E_SUCCESS); -} - -static int -read_funcs(const ctf_header_t *hp, const ctf_data_t *cd) -{ - /* LINTED - pointer alignment */ - const ushort_t *fp = (ushort_t *)(cd->cd_ctfdata + hp->cth_funcoff); - - /* LINTED - pointer alignment */ - const ushort_t *end = (ushort_t *)(cd->cd_ctfdata + hp->cth_typeoff); - - ulong_t id; - int symidx; - - if (flags != F_STATS) - print_line("- Functions "); - - if (hp->cth_funcoff & 1) - WARN("cth_funcoff is not aligned properly\n"); - if (hp->cth_funcoff >= cd->cd_ctflen) - WARN("file is truncated or cth_funcoff is corrupt\n"); - if (hp->cth_typeoff >= cd->cd_ctflen) - WARN("file is truncated or cth_typeoff is corrupt\n"); - if (hp->cth_funcoff > hp->cth_typeoff) - WARN("file is corrupt -- cth_funcoff > cth_typeoff\n"); - - for (symidx = -1, id = 0; fp < end; id++) { - ushort_t info = *fp++; - ushort_t kind = CTF_INFO_KIND(info); - ushort_t n = CTF_INFO_VLEN(info); - ushort_t i; - int nextsym; - char *name; - - if (cd->cd_symdata == NULL || (nextsym = next_sym(cd, symidx, - STT_FUNC, &name)) < 0) - name = NULL; - else - symidx = nextsym; - - if (kind == CTF_K_UNKNOWN && n == 0) - continue; /* skip padding */ - - if (kind != CTF_K_FUNCTION) { - (void) printf(" [%lu] unexpected kind -- %u\n", - id, kind); - return (E_ERROR); - } - - if (fp + n > end) { - (void) printf(" [%lu] vlen %u extends past section " - "boundary\n", id, n); - return (E_ERROR); - } - - if (flags != F_STATS) { - (void) printf(" [%lu] FUNC ", id); - if (name != NULL) - (void) printf("(%s) ", name); - (void) printf("returns: %u args: (", *fp++); - - if (n != 0) { - (void) printf("%u", *fp++); - for (i = 1; i < n; i++) - (void) printf(", %u", *fp++); - } - - (void) printf(")\n"); - } else - fp += n + 1; /* skip to next function definition */ - - stats.s_nfunc++; - stats.s_nargs += n; - stats.s_argmax = MAX(stats.s_argmax, n); - } - - return (E_SUCCESS); -} - -static int -read_types(const ctf_header_t *hp, const ctf_data_t *cd) -{ - /* LINTED - pointer alignment */ - const ctf_type_t *tp = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_typeoff); - - /* LINTED - pointer alignment */ - const ctf_type_t *end = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_stroff); - - ulong_t id; - - if (flags != F_STATS) - print_line("- Types "); - - if (hp->cth_typeoff & 3) - WARN("cth_typeoff is not aligned properly\n"); - if (hp->cth_typeoff >= cd->cd_ctflen) - WARN("file is truncated or cth_typeoff is corrupt\n"); - if (hp->cth_stroff >= cd->cd_ctflen) - WARN("file is truncated or cth_stroff is corrupt\n"); - if (hp->cth_typeoff > hp->cth_stroff) - WARN("file is corrupt -- cth_typeoff > cth_stroff\n"); - - id = 1; - if (hp->cth_parlabel || hp->cth_parname) - id += 1 << CTF_PARENT_SHIFT; - - for (/* */; tp < end; id++) { - ulong_t i, n = CTF_INFO_VLEN(tp->ctt_info); - size_t size, increment, vlen = 0; - int kind = CTF_INFO_KIND(tp->ctt_info); - - union { - const void *ptr; - const ctf_array_t *ap; - const ctf_member_t *mp; - const ctf_lmember_t *lmp; - const ctf_enum_t *ep; - const ushort_t *argp; - } u; - - if (flags != F_STATS) { - (void) printf(" %c%lu%c ", - "[<"[CTF_INFO_ISROOT(tp->ctt_info)], id, - "]>"[CTF_INFO_ISROOT(tp->ctt_info)]); - } - - if (tp->ctt_size == CTF_LSIZE_SENT) { - increment = sizeof (ctf_type_t); - size = (size_t)CTF_TYPE_LSIZE(tp); - } else { - increment = sizeof (ctf_stype_t); - size = tp->ctt_size; - } - u.ptr = (caddr_t)tp + increment; - - switch (kind) { - case CTF_K_INTEGER: - if (flags != F_STATS) { - uint_t encoding = *((const uint_t *)u.ptr); - - (void) printf("INTEGER %s encoding=%s offset=%u" - " bits=%u", ref_to_str(tp->ctt_name, hp, - cd), int_encoding_to_str( - CTF_INT_ENCODING(encoding)), - CTF_INT_OFFSET(encoding), - CTF_INT_BITS(encoding)); - } - vlen = sizeof (uint_t); - break; - - case CTF_K_FLOAT: - if (flags != F_STATS) { - uint_t encoding = *((const uint_t *)u.ptr); - - (void) printf("FLOAT %s encoding=%s offset=%u " - "bits=%u", ref_to_str(tp->ctt_name, hp, - cd), fp_encoding_to_str( - CTF_FP_ENCODING(encoding)), - CTF_FP_OFFSET(encoding), - CTF_FP_BITS(encoding)); - } - vlen = sizeof (uint_t); - break; - - case CTF_K_POINTER: - if (flags != F_STATS) { - (void) printf("POINTER %s refers to %u", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - } - break; - - case CTF_K_ARRAY: - if (flags != F_STATS) { - (void) printf("ARRAY %s content: %u index: %u " - "nelems: %u\n", ref_to_str(tp->ctt_name, - hp, cd), u.ap->cta_contents, - u.ap->cta_index, u.ap->cta_nelems); - } - vlen = sizeof (ctf_array_t); - break; - - case CTF_K_FUNCTION: - if (flags != F_STATS) { - (void) printf("FUNCTION %s returns: %u args: (", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - - if (n != 0) { - (void) printf("%u", *u.argp++); - for (i = 1; i < n; i++, u.argp++) - (void) printf(", %u", *u.argp); - } - - (void) printf(")"); - } - - vlen = sizeof (ushort_t) * (n + (n & 1)); - break; - - case CTF_K_STRUCT: - case CTF_K_UNION: - if (kind == CTF_K_STRUCT) { - stats.s_nsmem += n; - stats.s_smmax = MAX(stats.s_smmax, n); - stats.s_nsbytes += size; - stats.s_sbmax = MAX(stats.s_sbmax, size); - - if (flags != F_STATS) - (void) printf("STRUCT"); - } else { - stats.s_numem += n; - stats.s_ummax = MAX(stats.s_ummax, n); - stats.s_nubytes += size; - stats.s_ubmax = MAX(stats.s_ubmax, size); - - if (flags != F_STATS) - (void) printf("UNION"); - } - - if (flags != F_STATS) { - (void) printf(" %s (%d bytes)\n", - ref_to_str(tp->ctt_name, hp, cd), size); - - if (size >= CTF_LSTRUCT_THRESH) { - for (i = 0; i < n; i++, u.lmp++) { - (void) printf( - "\t%s type=%u off=%llu\n", - ref_to_str(u.lmp->ctlm_name, - hp, cd), u.lmp->ctlm_type, - CTF_LMEM_OFFSET(u.lmp)); - } - } else { - for (i = 0; i < n; i++, u.mp++) { - (void) printf( - "\t%s type=%u off=%u\n", - ref_to_str(u.mp->ctm_name, - hp, cd), u.mp->ctm_type, - u.mp->ctm_offset); - } - } - } - - vlen = n * (size >= CTF_LSTRUCT_THRESH ? - sizeof (ctf_lmember_t) : sizeof (ctf_member_t)); - break; - - case CTF_K_ENUM: - if (flags != F_STATS) { - (void) printf("ENUM %s\n", - ref_to_str(tp->ctt_name, hp, cd)); - - for (i = 0; i < n; i++, u.ep++) { - (void) printf("\t%s = %d\n", - ref_to_str(u.ep->cte_name, hp, cd), - u.ep->cte_value); - } - } - - stats.s_nemem += n; - stats.s_emmax = MAX(stats.s_emmax, n); - - vlen = sizeof (ctf_enum_t) * n; - break; - - case CTF_K_FORWARD: - if (flags != F_STATS) { - (void) printf("FORWARD %s", - ref_to_str(tp->ctt_name, hp, cd)); - } - break; - - case CTF_K_TYPEDEF: - if (flags != F_STATS) { - (void) printf("TYPEDEF %s refers to %u", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - } - break; - - case CTF_K_VOLATILE: - if (flags != F_STATS) { - (void) printf("VOLATILE %s refers to %u", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - } - break; - - case CTF_K_CONST: - if (flags != F_STATS) { - (void) printf("CONST %s refers to %u", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - } - break; - - case CTF_K_RESTRICT: - if (flags != F_STATS) { - (void) printf("RESTRICT %s refers to %u", - ref_to_str(tp->ctt_name, hp, cd), - tp->ctt_type); - } - break; - - case CTF_K_UNKNOWN: - break; /* hole in type id space */ - - default: - (void) printf("unexpected kind %u\n", kind); - return (E_ERROR); - } - - if (flags != F_STATS) - (void) printf("\n"); - - stats.s_ntypes++; - stats.s_types[kind]++; - - tp = (ctf_type_t *)((uintptr_t)tp + increment + vlen); - } - - return (E_SUCCESS); -} - -static int -read_strtab(const ctf_header_t *hp, const ctf_data_t *cd) -{ - size_t n, off, len = hp->cth_strlen; - const char *s = cd->cd_ctfdata + hp->cth_stroff; - - if (flags != F_STATS) - print_line("- String Table "); - - if (hp->cth_stroff >= cd->cd_ctflen) - WARN("file is truncated or cth_stroff is corrupt\n"); - if (hp->cth_stroff + hp->cth_strlen > cd->cd_ctflen) - WARN("file is truncated or cth_strlen is corrupt\n"); - - for (off = 0; len != 0; off += n) { - if (flags != F_STATS) { - (void) printf(" [%lu] %s\n", (ulong_t)off, - s[0] == '\0' ? "\\0" : s); - } - n = strlen(s) + 1; - len -= n; - s += n; - - stats.s_nstr++; - stats.s_strlen += n; - stats.s_strmax = MAX(stats.s_strmax, n); - } - - return (E_SUCCESS); -} - -static void -long_stat(const char *name, ulong_t value) -{ - (void) printf(" %-36s= %lu\n", name, value); -} - -static void -fp_stat(const char *name, float value) -{ - (void) printf(" %-36s= %.2f\n", name, value); -} - -static int -print_stats(void) -{ - print_line("- CTF Statistics "); - - long_stat("total number of data objects", stats.s_ndata); - (void) printf("\n"); - - long_stat("total number of functions", stats.s_nfunc); - long_stat("total number of function arguments", stats.s_nargs); - long_stat("maximum argument list length", stats.s_argmax); - - if (stats.s_nfunc != 0) { - fp_stat("average argument list length", - (float)stats.s_nargs / (float)stats.s_nfunc); - } - - (void) printf("\n"); - - long_stat("total number of types", stats.s_ntypes); - long_stat("total number of integers", stats.s_types[CTF_K_INTEGER]); - long_stat("total number of floats", stats.s_types[CTF_K_FLOAT]); - long_stat("total number of pointers", stats.s_types[CTF_K_POINTER]); - long_stat("total number of arrays", stats.s_types[CTF_K_ARRAY]); - long_stat("total number of func types", stats.s_types[CTF_K_FUNCTION]); - long_stat("total number of structs", stats.s_types[CTF_K_STRUCT]); - long_stat("total number of unions", stats.s_types[CTF_K_UNION]); - long_stat("total number of enums", stats.s_types[CTF_K_ENUM]); - long_stat("total number of forward tags", stats.s_types[CTF_K_FORWARD]); - long_stat("total number of typedefs", stats.s_types[CTF_K_TYPEDEF]); - long_stat("total number of volatile types", - stats.s_types[CTF_K_VOLATILE]); - long_stat("total number of const types", stats.s_types[CTF_K_CONST]); - long_stat("total number of restrict types", - stats.s_types[CTF_K_RESTRICT]); - long_stat("total number of unknowns (holes)", - stats.s_types[CTF_K_UNKNOWN]); - - (void) printf("\n"); - - long_stat("total number of struct members", stats.s_nsmem); - long_stat("maximum number of struct members", stats.s_smmax); - long_stat("total size of all structs", stats.s_nsbytes); - long_stat("maximum size of a struct", stats.s_sbmax); - - if (stats.s_types[CTF_K_STRUCT] != 0) { - fp_stat("average number of struct members", - (float)stats.s_nsmem / (float)stats.s_types[CTF_K_STRUCT]); - fp_stat("average size of a struct", (float)stats.s_nsbytes / - (float)stats.s_types[CTF_K_STRUCT]); - } - - (void) printf("\n"); - - long_stat("total number of union members", stats.s_numem); - long_stat("maximum number of union members", stats.s_ummax); - long_stat("total size of all unions", stats.s_nubytes); - long_stat("maximum size of a union", stats.s_ubmax); - - if (stats.s_types[CTF_K_UNION] != 0) { - fp_stat("average number of union members", - (float)stats.s_numem / (float)stats.s_types[CTF_K_UNION]); - fp_stat("average size of a union", (float)stats.s_nubytes / - (float)stats.s_types[CTF_K_UNION]); - } - - (void) printf("\n"); - - long_stat("total number of enum members", stats.s_nemem); - long_stat("maximum number of enum members", stats.s_emmax); - - if (stats.s_types[CTF_K_ENUM] != 0) { - fp_stat("average number of enum members", - (float)stats.s_nemem / (float)stats.s_types[CTF_K_ENUM]); - } - - (void) printf("\n"); - - long_stat("total number of unique strings", stats.s_nstr); - long_stat("bytes of string data", stats.s_strlen); - long_stat("maximum string length", stats.s_strmax); - - if (stats.s_nstr != 0) { - fp_stat("average string length", - (float)stats.s_strlen / (float)stats.s_nstr); - } - - (void) printf("\n"); - return (E_SUCCESS); -} - -static int -print_usage(FILE *fp, int verbose) -{ - (void) fprintf(fp, "Usage: %s [-dfhlsSt] [-u file] file\n", getpname()); - - if (verbose) { - (void) fprintf(fp, - "\t-d dump data object section\n" - "\t-f dump function section\n" - "\t-h dump file header\n" - "\t-l dump label table\n" - "\t-s dump string table\n" - "\t-S dump statistics\n" - "\t-t dump type section\n" - "\t-u save uncompressed CTF to a file\n"); - } - - return (E_USAGE); -} - -static Elf_Scn * -findelfscn(Elf *elf, GElf_Ehdr *ehdr, char *secname) -{ - GElf_Shdr shdr; - Elf_Scn *scn; - char *name; - - for (scn = NULL; (scn = elf_nextscn(elf, scn)) != NULL; ) { - if (gelf_getshdr(scn, &shdr) != NULL && (name = - elf_strptr(elf, ehdr->e_shstrndx, shdr.sh_name)) != NULL && - strcmp(name, secname) == 0) - return (scn); - } - - return (NULL); -} - -int -main(int argc, char *argv[]) -{ - const char *filename = NULL; - const char *ufile = NULL; - int error = 0; - int c, fd, ufd; - - ctf_data_t cd; - const ctf_preamble_t *pp; - ctf_header_t *hp; - Elf *elf; - GElf_Ehdr ehdr; - - (void) elf_version(EV_CURRENT); - - for (opterr = 0; optind < argc; optind++) { - while ((c = getopt(argc, argv, "dfhlsStu:")) != (int)EOF) { - switch (c) { - case 'd': - flags |= F_DATA; - break; - case 'f': - flags |= F_FUNC; - break; - case 'h': - flags |= F_HDR; - break; - case 'l': - flags |= F_LABEL; - break; - case 's': - flags |= F_STR; - break; - case 'S': - flags |= F_STATS; - break; - case 't': - flags |= F_TYPES; - break; - case 'u': - ufile = optarg; - break; - default: - if (optopt == '?') - return (print_usage(stdout, 1)); - warn("illegal option -- %c\n", optopt); - return (print_usage(stderr, 0)); - } - } - - if (optind < argc) { - if (filename != NULL) - return (print_usage(stderr, 0)); - filename = argv[optind]; - } - } - - if (filename == NULL) - return (print_usage(stderr, 0)); - - if (flags == 0 && ufile == NULL) - flags = F_ALLMSK; - - if ((fd = open(filename, O_RDONLY)) == -1) - die("failed to open %s", filename); - - if ((elf = elf_begin(fd, ELF_C_READ, NULL)) != NULL && - gelf_getehdr(elf, &ehdr) != NULL) { - - Elf_Data *dp; - Elf_Scn *ctfscn = findelfscn(elf, &ehdr, ".SUNW_ctf"); - Elf_Scn *symscn; - GElf_Shdr ctfshdr; - - if (ctfscn == NULL || (dp = elf_getdata(ctfscn, NULL)) == NULL) - die("%s does not contain .SUNW_ctf data\n", filename); - - cd.cd_ctfdata = dp->d_buf; - cd.cd_ctflen = dp->d_size; - - /* - * If the sh_link field of the CTF section header is non-zero - * it indicates which section contains the symbol table that - * should be used. We default to the .symtab section if sh_link - * is zero or if there's an error reading the section header. - */ - if (gelf_getshdr(ctfscn, &ctfshdr) != NULL && - ctfshdr.sh_link != 0) { - symscn = elf_getscn(elf, ctfshdr.sh_link); - } else { - symscn = findelfscn(elf, &ehdr, ".symtab"); - } - - /* If we found a symbol table, find the corresponding strings */ - if (symscn != NULL) { - GElf_Shdr shdr; - Elf_Scn *symstrscn; - - if (gelf_getshdr(symscn, &shdr) != NULL) { - symstrscn = elf_getscn(elf, shdr.sh_link); - - cd.cd_nsyms = shdr.sh_size / shdr.sh_entsize; - cd.cd_symdata = elf_getdata(symscn, NULL); - cd.cd_strdata = elf_getdata(symstrscn, NULL); - } - } - } else { - struct stat st; - - if (fstat(fd, &st) == -1) - die("failed to fstat %s", filename); - - cd.cd_ctflen = st.st_size; - cd.cd_ctfdata = mmap(NULL, cd.cd_ctflen, PROT_READ, - MAP_PRIVATE, fd, 0); - if (cd.cd_ctfdata == MAP_FAILED) - die("failed to mmap %s", filename); - } - - /* - * Get a pointer to the CTF data buffer and interpret the first portion - * as a ctf_header_t. Validate the magic number and size. - */ - - if (cd.cd_ctflen < sizeof (ctf_preamble_t)) - die("%s does not contain a CTF preamble\n", filename); - - /* LINTED - pointer alignment */ - pp = (const ctf_preamble_t *)cd.cd_ctfdata; - - if (pp->ctp_magic != CTF_MAGIC) - die("%s does not appear to contain CTF data\n", filename); - - if (pp->ctp_version == CTF_VERSION) { - /* LINTED - pointer alignment */ - hp = (ctf_header_t *)cd.cd_ctfdata; - cd.cd_ctfdata = (caddr_t)cd.cd_ctfdata + sizeof (ctf_header_t); - - if (cd.cd_ctflen < sizeof (ctf_header_t)) { - die("%s does not contain a v%d CTF header\n", filename, - CTF_VERSION); - } - - } else { - die("%s contains unsupported CTF version %d\n", filename, - pp->ctp_version); - } - - /* - * If the data buffer is compressed, then malloc a buffer large enough - * to hold the decompressed data, and use zlib to decompress it. - */ - if (hp->cth_flags & CTF_F_COMPRESS) { - z_stream zstr; - void *buf; - int rc; - - if ((buf = malloc(hp->cth_stroff + hp->cth_strlen)) == NULL) - die("failed to allocate decompression buffer"); - - bzero(&zstr, sizeof (z_stream)); - zstr.next_in = (void *)cd.cd_ctfdata; - zstr.avail_in = cd.cd_ctflen; - zstr.next_out = buf; - zstr.avail_out = hp->cth_stroff + hp->cth_strlen; - - if ((rc = inflateInit(&zstr)) != Z_OK) - die("failed to initialize zlib: %s\n", zError(rc)); - - if ((rc = inflate(&zstr, Z_FINISH)) != Z_STREAM_END) - die("failed to decompress CTF data: %s\n", zError(rc)); - - if ((rc = inflateEnd(&zstr)) != Z_OK) - die("failed to finish decompression: %s\n", zError(rc)); - - if (zstr.total_out != hp->cth_stroff + hp->cth_strlen) - die("CTF data is corrupt -- short decompression\n"); - - cd.cd_ctfdata = buf; - cd.cd_ctflen = hp->cth_stroff + hp->cth_strlen; - } - - if (flags & F_HDR) - error |= print_header(hp, &cd); - if (flags & (F_LABEL)) - error |= print_labeltable(hp, &cd); - if (flags & (F_DATA | F_STATS)) - error |= read_data(hp, &cd); - if (flags & (F_FUNC | F_STATS)) - error |= read_funcs(hp, &cd); - if (flags & (F_TYPES | F_STATS)) - error |= read_types(hp, &cd); - if (flags & (F_STR | F_STATS)) - error |= read_strtab(hp, &cd); - if (flags & F_STATS) - error |= print_stats(); - - /* - * If the -u option is specified, write the uncompressed CTF data to a - * raw CTF file. CTF data can already be extracted compressed by - * applying elfdump -w -N .SUNW_ctf to an ELF file, so we don't bother. - */ - if (ufile != NULL) { - ctf_header_t h; - - bcopy(hp, &h, sizeof (h)); - h.cth_flags &= ~CTF_F_COMPRESS; - - if ((ufd = open(ufile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0 || - write(ufd, &h, sizeof (h)) != sizeof (h) || - write(ufd, cd.cd_ctfdata, cd.cd_ctflen) != cd.cd_ctflen) { - warn("failed to write CTF data to '%s'", ufile); - error |= E_ERROR; - } - - (void) close(ufd); - } - - if (elf != NULL) - (void) elf_end(elf); - - (void) close(fd); - return (error); -} diff --git a/usr/src/tools/ctf/dwarf/Makefile.com b/usr/src/tools/ctf/dwarf/Makefile.com index 2e18b40fe4..67ffd64a62 100644 --- a/usr/src/tools/ctf/dwarf/Makefile.com +++ b/usr/src/tools/ctf/dwarf/Makefile.com @@ -69,11 +69,10 @@ OBJECTS=dwarf_abbrev.o \ include $(SRC)/lib/Makefile.lib -SRCS= $(PICS:%.o=../common/%.c) -FILEMODE = 0755 - -SRCDIR = ../common/ +FILEMODE = 0755 +SRCDIR = $(SRC)/lib/libdwarf/common/ +SRCS = $(PICS:%.o=$(SRCDIR)/%.c) CPPFLAGS += -I$(SRCDIR) -DELF_TARGET_ALL=1 CERRWARN += -_gcc=-Wno-unused diff --git a/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE b/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE deleted file mode 100644 index b9320c2d56..0000000000 --- a/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, - USA. - - Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan diff --git a/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE.descrip b/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE.descrip deleted file mode 100644 index 73abaac973..0000000000 --- a/usr/src/tools/ctf/dwarf/THIRDPARTYLICENSE.descrip +++ /dev/null @@ -1 +0,0 @@ -LIBDWARF LIBRARY THAT SUPPORTS THE DWARF OPEN SOURCE STANDARD diff --git a/usr/src/tools/ctf/dwarf/common/cmplrs/dwarf_addr_finder.h b/usr/src/tools/ctf/dwarf/common/cmplrs/dwarf_addr_finder.h deleted file mode 100644 index 0eda6d1c44..0000000000 --- a/usr/src/tools/ctf/dwarf/common/cmplrs/dwarf_addr_finder.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - dwarf_addr_finder.h - $Source: /plroot/cmplrs.src/v7.4.5m/.RCS/PL/include/cmplrs/RCS/dwarf_addr_finder.h,v $ - $Date: 2002/06/11 17:49:06 $ - - Defines user interface. - -*/ - -/* return codes for functions -*/ -#define DW_DLV_NO_ENTRY -1 -#define DW_DLV_OK 0 -#define DW_DLV_ERROR 1 - - -/* the following are the 'section' number passed to the called-back - function. - The called-back application must translate this to the - appropriate elf section number/pointer. - - Putting this burden on the application avoids having to store - the numbers in the Dwarf_Debug structure (thereby saving space - for most consumers). -*/ -#define DW_SECTION_INFO 0 -#define DW_SECTION_FRAME 1 -#define DW_SECTION_ARANGES 2 -#define DW_SECTION_LINE 3 -#define DW_SECTION_LOC 4 /* .debug_loc */ - -/* section is one of the above codes: it specifies a section. - secoff is the offset in the dwarf section. - existingAddr is the value at the specified offset (so the - called back routine can sanity check the proceedings). - It's up to the caller to know the size of an address (4 or 8) - and update the right number of bytes. -*/ -typedef int (*Dwarf_addr_callback_func) (int /*section*/, - Dwarf_Off /*secoff*/, Dwarf_Addr /*existingAddr*/); - -/* call this to do the work: it calls back thru cb_func - once per each address to be modified. - Once this returns you are done. - Returns DW_DLV_OK if finished ok. - Returns DW_DLV_ERROR if there was some kind of error, in which - the dwarf error number was passed back thu the dwerr ptr. - Returns DW_DLV_NO_ENTRY if there are no relevant dwarf sections, - so there were no addresses to be modified (and none - called back). -*/ -int _dwarf_addr_finder(dwarf_elf_handle elf_file_ptr, - Dwarf_addr_callback_func cb_func, - int *dwerr); - diff --git a/usr/src/tools/ctf/dwarf/common/config.h b/usr/src/tools/ctf/dwarf/common/config.h deleted file mode 100644 index 42b286cfda..0000000000 --- a/usr/src/tools/ctf/dwarf/common/config.h +++ /dev/null @@ -1,143 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.in by autoheader. */ - -/* Define if building universal (internal helper macro) */ -/* #undef AC_APPLE_UNIVERSAL_BUILD */ - -/* Define to 1 if you have the <alloca.h> header file. */ -#define HAVE_ALLOCA_H 1 - -/* Define 1 if want to allow producer to build with 32/64bit section offsets - per dwarf3 */ -#define HAVE_DWARF2_99_EXTENSION 1 - -/* Define to 1 if the elf64_getehdr function is in libelf.a. */ -#define HAVE_ELF64_GETEHDR 1 - -/* Define to 1 if the elf64_getshdr function is in libelf.a. */ -#define HAVE_ELF64_GETSHDR 1 - -/* Define 1 if Elf64_Rela defined. */ -#define HAVE_ELF64_RELA 1 - -/* Define 1 if Elf64_Sym defined. */ -#define HAVE_ELF64_SYM 1 - -/* Define to 1 if you have the <elfaccess.h> header file. */ -/* #undef HAVE_ELFACCESS_H */ - -/* Define to 1 if you have the <elf.h> header file. */ -#define HAVE_ELF_H 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the <libelf.h> header file. */ -#define HAVE_LIBELF_H 1 - -/* Define to 1 if you have the <libelf/libelf.h> header file. */ -/* #undef HAVE_LIBELF_LIBELF_H */ - -/* Define 1 if off64 is defined via libelf with GNU_SOURCE. */ -#define HAVE_LIBELF_OFF64_OK 1 - -/* Define to 1 if you have the <memory.h> header file. */ -#define HAVE_MEMORY_H 1 - -/* Define 1 if need nonstandard printf format for 64bit */ -/* #undef HAVE_NONSTANDARD_PRINTF_64_FORMAT */ - -/* Define 1 to default to old DW_FRAME_CFA_COL */ -/* #undef HAVE_OLD_FRAME_CFA_COL */ - -/* Define 1 if plain libelf builds. */ -#define HAVE_RAW_LIBELF_OK 1 - -/* Define 1 if R_IA_64_DIR32LSB is defined (might be enum value). */ -/* #undef HAVE_R_IA_64_DIR32LSB */ - -/* Define 1 if want producer to build with IRIX offset sizes */ -/* #undef HAVE_SGI_IRIX_OFFSETS */ - -/* Define to 1 if you have the <stdint.h> header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define 1 if want producer to build with only 32bit section offsets */ -/* #undef HAVE_STRICT_DWARF2_32BIT_OFFSET */ - -/* Define to 1 if you have the <strings.h> header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the <sys/ia64/elf.h> header file. */ -/* #undef HAVE_SYS_IA64_ELF_H */ - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H 1 - -/* Define 1 if want to allow Windows full path detection */ -/* #undef HAVE_WINDOWS_PATH */ - -/* See if __uint32_t is predefined in the compiler. */ -/* #undef HAVE___UINT32_T */ - -/* Define 1 if __uint32_t is in sgidefs.h. */ -/* #undef HAVE___UINT32_T_IN_SGIDEFS_H */ - -/* Define 1 if sys/types.h defines __uint32_t. */ -/* #undef HAVE___UINT32_T_IN_SYS_TYPES_H */ - -/* See if __uint64_t is predefined in the compiler. */ -/* #undef HAVE___UINT64_T */ - -/* Define 1 if is in sgidefs.h. */ -/* #undef HAVE___UINT64_T_IN_SGIDEFS_H */ - -/* Define 1 if sys/types.h defines __uint64_t. */ -/* #undef HAVE___UINT64_T_IN_SYS_TYPES_H */ - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# if defined(__sparc) -# define WORDS_BIGENDIAN 1 -# else -# undef WORDS_BIGENDIAN -# endif -#endif diff --git a/usr/src/tools/ctf/dwarf/common/dwarf.h b/usr/src/tools/ctf/dwarf/common/dwarf.h deleted file mode 100644 index b064c4d86b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf.h +++ /dev/null @@ -1,1078 +0,0 @@ -/* - Copyright (C) 2000,2001,2003,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2007-2010 David Anderson. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#ifndef __DWARF_H -#define __DWARF_H -#ifdef __cplusplus -extern "C" { -#endif - -/* - dwarf.h DWARF debugging information values - $Revision: 1.41 $ $Date: 2006/04/17 00:09:56 $ - - The comment "DWARF3" appears where there are - new entries from DWARF3 as of 2004, "DWARF3f" - where there are new entries as of the November 2005 - public review document and other comments apply - where extension entries appear. - - Extensions part of DWARF4 are marked DWARF4. - - A few extension names have omitted the 'vendor id' - (See chapter 7, "Vendor Extensibility"). Please - always use a 'vendor id' string in extension names. - - Vendors should use a vendor string in names and - whereever possible avoid duplicating values used by - other vendor extensions - -*/ - - -#define DW_TAG_array_type 0x01 -#define DW_TAG_class_type 0x02 -#define DW_TAG_entry_point 0x03 -#define DW_TAG_enumeration_type 0x04 -#define DW_TAG_formal_parameter 0x05 -#define DW_TAG_imported_declaration 0x08 -#define DW_TAG_label 0x0a -#define DW_TAG_lexical_block 0x0b -#define DW_TAG_member 0x0d -#define DW_TAG_pointer_type 0x0f -#define DW_TAG_reference_type 0x10 -#define DW_TAG_compile_unit 0x11 -#define DW_TAG_string_type 0x12 -#define DW_TAG_structure_type 0x13 -#define DW_TAG_subroutine_type 0x15 -#define DW_TAG_typedef 0x16 -#define DW_TAG_union_type 0x17 -#define DW_TAG_unspecified_parameters 0x18 -#define DW_TAG_variant 0x19 -#define DW_TAG_common_block 0x1a -#define DW_TAG_common_inclusion 0x1b -#define DW_TAG_inheritance 0x1c -#define DW_TAG_inlined_subroutine 0x1d -#define DW_TAG_module 0x1e -#define DW_TAG_ptr_to_member_type 0x1f -#define DW_TAG_set_type 0x20 -#define DW_TAG_subrange_type 0x21 -#define DW_TAG_with_stmt 0x22 -#define DW_TAG_access_declaration 0x23 -#define DW_TAG_base_type 0x24 -#define DW_TAG_catch_block 0x25 -#define DW_TAG_const_type 0x26 -#define DW_TAG_constant 0x27 -#define DW_TAG_enumerator 0x28 -#define DW_TAG_file_type 0x29 -#define DW_TAG_friend 0x2a -#define DW_TAG_namelist 0x2b - /* Early releases of this header had the following - misspelled with a trailing 's' */ -#define DW_TAG_namelist_item 0x2c /* DWARF3/2 spelling */ -#define DW_TAG_namelist_items 0x2c /* SGI misspelling/typo */ -#define DW_TAG_packed_type 0x2d -#define DW_TAG_subprogram 0x2e - /* The DWARF2 document had two spellings of the following - two TAGs, DWARF3 specifies the longer spelling. */ -#define DW_TAG_template_type_parameter 0x2f /* DWARF3/2 spelling*/ -#define DW_TAG_template_type_param 0x2f /* DWARF2 spelling*/ -#define DW_TAG_template_value_parameter 0x30 /* DWARF3/2 spelling*/ -#define DW_TAG_template_value_param 0x30 /* DWARF2 spelling*/ -#define DW_TAG_thrown_type 0x31 -#define DW_TAG_try_block 0x32 -#define DW_TAG_variant_part 0x33 -#define DW_TAG_variable 0x34 -#define DW_TAG_volatile_type 0x35 -#define DW_TAG_dwarf_procedure 0x36 /* DWARF3 */ -#define DW_TAG_restrict_type 0x37 /* DWARF3 */ -#define DW_TAG_interface_type 0x38 /* DWARF3 */ -#define DW_TAG_namespace 0x39 /* DWARF3 */ -#define DW_TAG_imported_module 0x3a /* DWARF3 */ -#define DW_TAG_unspecified_type 0x3b /* DWARF3 */ -#define DW_TAG_partial_unit 0x3c /* DWARF3 */ -#define DW_TAG_imported_unit 0x3d /* DWARF3 */ - /* Do not use DW_TAG_mutable_type */ -#define DW_TAG_mutable_type 0x3e /* Withdrawn from DWARF3 by DWARF3f. */ -#define DW_TAG_condition 0x3f /* DWARF3f */ -#define DW_TAG_shared_type 0x40 /* DWARF3f */ -#define DW_TAG_type_unit 0x41 /* DWARF4 */ -#define DW_TAG_rvalue_reference_type 0x42 /* DWARF4 */ -#define DW_TAG_template_alias 0x43 /* DWARF4 */ -#define DW_TAG_lo_user 0x4080 - -#define DW_TAG_MIPS_loop 0x4081 - -/* HP extensions: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz */ -#define DW_TAG_HP_array_descriptor 0x4090 /* HP */ - -/* GNU extensions. The first 3 missing the GNU_. */ -#define DW_TAG_format_label 0x4101 /* GNU. Fortran. */ -#define DW_TAG_function_template 0x4102 /* GNU. For C++ */ -#define DW_TAG_class_template 0x4103 /* GNU. For C++ */ -#define DW_TAG_GNU_BINCL 0x4104 /* GNU */ -#define DW_TAG_GNU_EINCL 0x4105 /* GNU */ - - -/* GNU extension. http://gcc.gnu.org/wiki/TemplateParmsDwarf */ -#define DW_TAG_GNU_template_template_parameter 0x4106 /* GNU */ -#define DW_TAG_GNU_template_template_param 0x4106 /* GNU */ -#define DW_TAG_GNU_template_parameter_pack 0x4107 /* GNU */ -#define DW_TAG_GNU_formal_parameter_pack 0x4108 /* GNU */ - -/* ALTIUM extensions */ - /* DSP-C/Starcore __circ qualifier */ -#define DW_TAG_ALTIUM_circ_type 0x5101 /* ALTIUM */ - /* Starcore __mwa_circ qualifier */ -#define DW_TAG_ALTIUM_mwa_circ_type 0x5102 /* ALTIUM */ - /* Starcore __rev_carry qualifier */ -#define DW_TAG_ALTIUM_rev_carry_type 0x5103 /* ALTIUM */ - /* M16 __rom qualifier */ -#define DW_TAG_ALTIUM_rom 0x5111 /* ALTIUM */ - -/* The following 3 are extensions to support UPC */ -#define DW_TAG_upc_shared_type 0x8765 /* UPC */ -#define DW_TAG_upc_strict_type 0x8766 /* UPC */ -#define DW_TAG_upc_relaxed_type 0x8767 /* UPC */ - -/* PGI (STMicroelectronics) extensions. */ -#define DW_TAG_PGI_kanji_type 0xa000 /* PGI */ -#define DW_TAG_PGI_interface_block 0xa020 /* PGI */ -/* The following are SUN extensions */ -#define DW_TAG_SUN_function_template 0x4201 /* SUN */ -#define DW_TAG_SUN_class_template 0x4202 /* SUN */ -#define DW_TAG_SUN_struct_template 0x4203 /* SUN */ -#define DW_TAG_SUN_union_template 0x4204 /* SUN */ -#define DW_TAG_SUN_indirect_inheritance 0x4205 /* SUN */ -#define DW_TAG_SUN_codeflags 0x4206 /* SUN */ -#define DW_TAG_SUN_memop_info 0x4207 /* SUN */ -#define DW_TAG_SUN_omp_child_func 0x4208 /* SUN */ -#define DW_TAG_SUN_rtti_descriptor 0x4209 /* SUN */ -#define DW_TAG_SUN_dtor_info 0x420a /* SUN */ -#define DW_TAG_SUN_dtor 0x420b /* SUN */ -#define DW_TAG_SUN_f90_interface 0x420c /* SUN */ -#define DW_TAG_SUN_fortran_vax_structure 0x420d /* SUN */ -#define DW_TAG_SUN_hi 0x42ff /* SUN */ - - -#define DW_TAG_hi_user 0xffff - -#define DW_children_no 0 -#define DW_children_yes 1 - - - -#define DW_FORM_addr 0x01 -#define DW_FORM_block2 0x03 -#define DW_FORM_block4 0x04 -#define DW_FORM_data2 0x05 -#define DW_FORM_data4 0x06 -#define DW_FORM_data8 0x07 -#define DW_FORM_string 0x08 -#define DW_FORM_block 0x09 -#define DW_FORM_block1 0x0a -#define DW_FORM_data1 0x0b -#define DW_FORM_flag 0x0c -#define DW_FORM_sdata 0x0d -#define DW_FORM_strp 0x0e -#define DW_FORM_udata 0x0f -#define DW_FORM_ref_addr 0x10 -#define DW_FORM_ref1 0x11 -#define DW_FORM_ref2 0x12 -#define DW_FORM_ref4 0x13 -#define DW_FORM_ref8 0x14 -#define DW_FORM_ref_udata 0x15 -#define DW_FORM_indirect 0x16 -#define DW_FORM_sec_offset 0x17 /* DWARF4 */ -#define DW_FORM_exprloc 0x18 /* DWARF4 */ -#define DW_FORM_flag_present 0x19 /* DWARF4 */ -/* 0x1a thru 0x1f were left unused accidentally. Reserved for future use. */ -#define DW_FORM_ref_sig8 0x20 /* DWARF4 */ - -#define DW_AT_sibling 0x01 -#define DW_AT_location 0x02 -#define DW_AT_name 0x03 -#define DW_AT_ordering 0x09 -#define DW_AT_subscr_data 0x0a -#define DW_AT_byte_size 0x0b -#define DW_AT_bit_offset 0x0c -#define DW_AT_bit_size 0x0d -#define DW_AT_element_list 0x0f -#define DW_AT_stmt_list 0x10 -#define DW_AT_low_pc 0x11 -#define DW_AT_high_pc 0x12 -#define DW_AT_language 0x13 -#define DW_AT_member 0x14 -#define DW_AT_discr 0x15 -#define DW_AT_discr_value 0x16 -#define DW_AT_visibility 0x17 -#define DW_AT_import 0x18 -#define DW_AT_string_length 0x19 -#define DW_AT_common_reference 0x1a -#define DW_AT_comp_dir 0x1b -#define DW_AT_const_value 0x1c -#define DW_AT_containing_type 0x1d -#define DW_AT_default_value 0x1e -#define DW_AT_inline 0x20 -#define DW_AT_is_optional 0x21 -#define DW_AT_lower_bound 0x22 -#define DW_AT_producer 0x25 -#define DW_AT_prototyped 0x27 -#define DW_AT_return_addr 0x2a -#define DW_AT_start_scope 0x2c -#define DW_AT_bit_stride 0x2e /* DWARF3 name */ -#define DW_AT_stride_size 0x2e /* DWARF2 name */ -#define DW_AT_upper_bound 0x2f -#define DW_AT_abstract_origin 0x31 -#define DW_AT_accessibility 0x32 -#define DW_AT_address_class 0x33 -#define DW_AT_artificial 0x34 -#define DW_AT_base_types 0x35 -#define DW_AT_calling_convention 0x36 -#define DW_AT_count 0x37 -#define DW_AT_data_member_location 0x38 -#define DW_AT_decl_column 0x39 -#define DW_AT_decl_file 0x3a -#define DW_AT_decl_line 0x3b -#define DW_AT_declaration 0x3c -#define DW_AT_discr_list 0x3d -#define DW_AT_encoding 0x3e -#define DW_AT_external 0x3f -#define DW_AT_frame_base 0x40 -#define DW_AT_friend 0x41 -#define DW_AT_identifier_case 0x42 -#define DW_AT_macro_info 0x43 -#define DW_AT_namelist_item 0x44 -#define DW_AT_priority 0x45 -#define DW_AT_segment 0x46 -#define DW_AT_specification 0x47 -#define DW_AT_static_link 0x48 -#define DW_AT_type 0x49 -#define DW_AT_use_location 0x4a -#define DW_AT_variable_parameter 0x4b -#define DW_AT_virtuality 0x4c -#define DW_AT_vtable_elem_location 0x4d -#define DW_AT_allocated 0x4e /* DWARF3 */ -#define DW_AT_associated 0x4f /* DWARF3 */ -#define DW_AT_data_location 0x50 /* DWARF3 */ -#define DW_AT_byte_stride 0x51 /* DWARF3f */ -#define DW_AT_stride 0x51 /* DWARF3 (do not use) */ -#define DW_AT_entry_pc 0x52 /* DWARF3 */ -#define DW_AT_use_UTF8 0x53 /* DWARF3 */ -#define DW_AT_extension 0x54 /* DWARF3 */ -#define DW_AT_ranges 0x55 /* DWARF3 */ -#define DW_AT_trampoline 0x56 /* DWARF3 */ -#define DW_AT_call_column 0x57 /* DWARF3 */ -#define DW_AT_call_file 0x58 /* DWARF3 */ -#define DW_AT_call_line 0x59 /* DWARF3 */ -#define DW_AT_description 0x5a /* DWARF3 */ -#define DW_AT_binary_scale 0x5b /* DWARF3f */ -#define DW_AT_decimal_scale 0x5c /* DWARF3f */ -#define DW_AT_small 0x5d /* DWARF3f */ -#define DW_AT_decimal_sign 0x5e /* DWARF3f */ -#define DW_AT_digit_count 0x5f /* DWARF3f */ -#define DW_AT_picture_string 0x60 /* DWARF3f */ -#define DW_AT_mutable 0x61 /* DWARF3f */ -#define DW_AT_threads_scaled 0x62 /* DWARF3f */ -#define DW_AT_explicit 0x63 /* DWARF3f */ -#define DW_AT_object_pointer 0x64 /* DWARF3f */ -#define DW_AT_endianity 0x65 /* DWARF3f */ -#define DW_AT_elemental 0x66 /* DWARF3f */ -#define DW_AT_pure 0x67 /* DWARF3f */ -#define DW_AT_recursive 0x68 /* DWARF3f */ -#define DW_AT_signature 0x69 /* DWARF4 */ -#define DW_AT_main_subprogram 0x6a /* DWARF4 */ -#define DW_AT_data_bit_offset 0x6b /* DWARF4 */ -#define DW_AT_const_expr 0x6c /* DWARF4 */ -#define DW_AT_enum_class 0x6d /* DWARF4 */ -#define DW_AT_linkage_name 0x6e /* DWARF4 */ - -/* In extensions, we attempt to include the vendor extension - in the name even when the vendor leaves it out. */ - -/* HP extensions. */ -#define DW_AT_HP_block_index 0x2000 /* HP */ - -/* Follows extension so dwarfdump prints the most-likely-useful name. */ -#define DW_AT_lo_user 0x2000 - -#define DW_AT_MIPS_fde 0x2001 /* MIPS/SGI */ -#define DW_AT_MIPS_loop_begin 0x2002 /* MIPS/SGI */ -#define DW_AT_MIPS_tail_loop_begin 0x2003 /* MIPS/SGI */ -#define DW_AT_MIPS_epilog_begin 0x2004 /* MIPS/SGI */ -#define DW_AT_MIPS_loop_unroll_factor 0x2005 /* MIPS/SGI */ -#define DW_AT_MIPS_software_pipeline_depth 0x2006 /* MIPS/SGI */ -#define DW_AT_MIPS_linkage_name 0x2007 /* MIPS/SGI, GNU, and others.*/ -#define DW_AT_MIPS_stride 0x2008 /* MIPS/SGI */ -#define DW_AT_MIPS_abstract_name 0x2009 /* MIPS/SGI */ -#define DW_AT_MIPS_clone_origin 0x200a /* MIPS/SGI */ -#define DW_AT_MIPS_has_inlines 0x200b /* MIPS/SGI */ -#define DW_AT_MIPS_stride_byte 0x200c /* MIPS/SGI */ -#define DW_AT_MIPS_stride_elem 0x200d /* MIPS/SGI */ -#define DW_AT_MIPS_ptr_dopetype 0x200e /* MIPS/SGI */ -#define DW_AT_MIPS_allocatable_dopetype 0x200f /* MIPS/SGI */ -#define DW_AT_MIPS_assumed_shape_dopetype 0x2010 /* MIPS/SGI */ -#define DW_AT_MIPS_assumed_size 0x2011 /* MIPS/SGI */ - -/* HP extensions. */ -#define DW_AT_HP_unmodifiable 0x2001 /* conflict: MIPS */ -#define DW_AT_HP_actuals_stmt_list 0x2010 /* conflict: MIPS */ -#define DW_AT_HP_proc_per_section 0x2011 /* conflict: MIPS */ -#define DW_AT_HP_raw_data_ptr 0x2012 /* HP */ -#define DW_AT_HP_pass_by_reference 0x2013 /* HP */ -#define DW_AT_HP_opt_level 0x2014 /* HP */ -#define DW_AT_HP_prof_version_id 0x2015 /* HP */ -#define DW_AT_HP_opt_flags 0x2016 /* HP */ -#define DW_AT_HP_cold_region_low_pc 0x2017 /* HP */ -#define DW_AT_HP_cold_region_high_pc 0x2018 /* HP */ -#define DW_AT_HP_all_variables_modifiable 0x2019 /* HP */ -#define DW_AT_HP_linkage_name 0x201a /* HP */ -#define DW_AT_HP_prof_flags 0x201b /* HP */ - -#define DW_AT_CPQ_discontig_ranges 0x2001 /* COMPAQ/HP */ -#define DW_AT_CPQ_semantic_events 0x2002 /* COMPAQ/HP */ -#define DW_AT_CPQ_split_lifetimes_var 0x2003 /* COMPAQ/HP */ -#define DW_AT_CPQ_split_lifetimes_rtn 0x2004 /* COMPAQ/HP */ -#define DW_AT_CPQ_prologue_length 0x2005 /* COMPAQ/HP */ - -#define DW_AT_INTEL_other_endian 0x2026 /* Intel, 1 if byte swapped. */ - -/* GNU extensions. */ -#define DW_AT_sf_names 0x2101 /* GNU */ -#define DW_AT_src_info 0x2102 /* GNU */ -#define DW_AT_mac_info 0x2103 /* GNU */ -#define DW_AT_src_coords 0x2104 /* GNU */ -#define DW_AT_body_begin 0x2105 /* GNU */ -#define DW_AT_body_end 0x2106 /* GNU */ -#define DW_AT_GNU_vector 0x2107 /* GNU */ -#define DW_AT_GNU_template_name 0x2108 /* GNU */ - -/* ALTIUM extension: ALTIUM Compliant location lists (flag) */ -#define DW_AT_ALTIUM_loclist 0x2300 /* ALTIUM */ - -/* Sun extensions */ -#define DW_AT_SUN_template 0x2201 /* SUN */ -#define DW_AT_VMS_rtnbeg_pd_address 0x2201 /* VMS */ -#define DW_AT_SUN_alignment 0x2202 /* SUN */ -#define DW_AT_SUN_vtable 0x2203 /* SUN */ -#define DW_AT_SUN_count_guarantee 0x2204 /* SUN */ -#define DW_AT_SUN_command_line 0x2205 /* SUN */ -#define DW_AT_SUN_vbase 0x2206 /* SUN */ -#define DW_AT_SUN_compile_options 0x2207 /* SUN */ -#define DW_AT_SUN_language 0x2208 /* SUN */ -#define DW_AT_SUN_browser_file 0x2209 /* SUN */ -#define DW_AT_SUN_vtable_abi 0x2210 /* SUN */ -#define DW_AT_SUN_func_offsets 0x2211 /* SUN */ -#define DW_AT_SUN_cf_kind 0x2212 /* SUN */ -#define DW_AT_SUN_vtable_index 0x2213 /* SUN */ -#define DW_AT_SUN_omp_tpriv_addr 0x2214 /* SUN */ -#define DW_AT_SUN_omp_child_func 0x2215 /* SUN */ -#define DW_AT_SUN_func_offset 0x2216 /* SUN */ -#define DW_AT_SUN_memop_type_ref 0x2217 /* SUN */ -#define DW_AT_SUN_profile_id 0x2218 /* SUN */ -#define DW_AT_SUN_memop_signature 0x2219 /* SUN */ -#define DW_AT_SUN_obj_dir 0x2220 /* SUN */ -#define DW_AT_SUN_obj_file 0x2221 /* SUN */ -#define DW_AT_SUN_original_name 0x2222 /* SUN */ -#define DW_AT_SUN_hwcprof_signature 0x2223 /* SUN */ -#define DW_AT_SUN_amd64_parmdump 0x2224 /* SUN */ -#define DW_AT_SUN_part_link_name 0x2225 /* SUN */ -#define DW_AT_SUN_link_name 0x2226 /* SUN */ -#define DW_AT_SUN_pass_with_const 0x2227 /* SUN */ -#define DW_AT_SUN_return_with_const 0x2228 /* SUN */ -#define DW_AT_SUN_import_by_name 0x2229 /* SUN */ -#define DW_AT_SUN_f90_pointer 0x222a /* SUN */ -#define DW_AT_SUN_pass_by_ref 0x222b /* SUN */ -#define DW_AT_SUN_f90_allocatable 0x222c /* SUN */ -#define DW_AT_SUN_f90_assumed_shape_array 0x222d /* SUN */ -#define DW_AT_SUN_c_vla 0x222e /* SUN */ -#define DW_AT_SUN_return_value_ptr 0x2230 /* SUN */ -#define DW_AT_SUN_dtor_start 0x2231 /* SUN */ -#define DW_AT_SUN_dtor_length 0x2232 /* SUN */ -#define DW_AT_SUN_dtor_state_initial 0x2233 /* SUN */ -#define DW_AT_SUN_dtor_state_final 0x2234 /* SUN */ -#define DW_AT_SUN_dtor_state_deltas 0x2235 /* SUN */ -#define DW_AT_SUN_import_by_lname 0x2236 /* SUN */ -#define DW_AT_SUN_f90_use_only 0x2237 /* SUN */ -#define DW_AT_SUN_namelist_spec 0x2238 /* SUN */ -#define DW_AT_SUN_is_omp_child_func 0x2239 /* SUN */ -#define DW_AT_SUN_fortran_main_alias 0x223a /* SUN */ -#define DW_AT_SUN_fortran_based 0x223b /* SUN */ - -/* UPC extension */ -#define DW_AT_upc_threads_scaled 0x3210 /* UPC */ - -/* PGI (STMicroelectronics) extensions. */ -#define DW_AT_PGI_lbase 0x3a00 /* PGI. Block, constant, reference. This attribute is an ASTPLAB extension used to describe the array local base. */ -#define DW_AT_PGI_soffset 0x3a01 /* PGI. Block, constant, reference. ASTPLAB adds this attribute to describe the section offset, or the offset to the first element in the dimension. */ -#define DW_AT_PGI_lstride 0x3a02 /* PGI. Block, constant, reference. ASTPLAB adds this attribute to describe the linear stride or the distance between elements in the dimension. */ - -/* Apple Extensions for closures */ -#define DW_AT_APPLE_closure 0x3fe4 /* Apple */ -/* Apple Extensions for Objective-C runtime info */ -#define DW_AT_APPLE_major_runtime_vers 0x3fe5 /* Apple */ -#define DW_AT_APPLE_runtime_class 0x3fe6 /* Apple */ - - -#define DW_AT_hi_user 0x3fff - -#define DW_OP_addr 0x03 -#define DW_OP_deref 0x06 -#define DW_OP_const1u 0x08 -#define DW_OP_const1s 0x09 -#define DW_OP_const2u 0x0a -#define DW_OP_const2s 0x0b -#define DW_OP_const4u 0x0c -#define DW_OP_const4s 0x0d -#define DW_OP_const8u 0x0e -#define DW_OP_const8s 0x0f -#define DW_OP_constu 0x10 -#define DW_OP_consts 0x11 -#define DW_OP_dup 0x12 -#define DW_OP_drop 0x13 -#define DW_OP_over 0x14 -#define DW_OP_pick 0x15 -#define DW_OP_swap 0x16 -#define DW_OP_rot 0x17 -#define DW_OP_xderef 0x18 -#define DW_OP_abs 0x19 -#define DW_OP_and 0x1a -#define DW_OP_div 0x1b -#define DW_OP_minus 0x1c -#define DW_OP_mod 0x1d -#define DW_OP_mul 0x1e -#define DW_OP_neg 0x1f -#define DW_OP_not 0x20 -#define DW_OP_or 0x21 -#define DW_OP_plus 0x22 -#define DW_OP_plus_uconst 0x23 -#define DW_OP_shl 0x24 -#define DW_OP_shr 0x25 -#define DW_OP_shra 0x26 -#define DW_OP_xor 0x27 -#define DW_OP_bra 0x28 -#define DW_OP_eq 0x29 -#define DW_OP_ge 0x2a -#define DW_OP_gt 0x2b -#define DW_OP_le 0x2c -#define DW_OP_lt 0x2d -#define DW_OP_ne 0x2e -#define DW_OP_skip 0x2f -#define DW_OP_lit0 0x30 -#define DW_OP_lit1 0x31 -#define DW_OP_lit2 0x32 -#define DW_OP_lit3 0x33 -#define DW_OP_lit4 0x34 -#define DW_OP_lit5 0x35 -#define DW_OP_lit6 0x36 -#define DW_OP_lit7 0x37 -#define DW_OP_lit8 0x38 -#define DW_OP_lit9 0x39 -#define DW_OP_lit10 0x3a -#define DW_OP_lit11 0x3b -#define DW_OP_lit12 0x3c -#define DW_OP_lit13 0x3d -#define DW_OP_lit14 0x3e -#define DW_OP_lit15 0x3f -#define DW_OP_lit16 0x40 -#define DW_OP_lit17 0x41 -#define DW_OP_lit18 0x42 -#define DW_OP_lit19 0x43 -#define DW_OP_lit20 0x44 -#define DW_OP_lit21 0x45 -#define DW_OP_lit22 0x46 -#define DW_OP_lit23 0x47 -#define DW_OP_lit24 0x48 -#define DW_OP_lit25 0x49 -#define DW_OP_lit26 0x4a -#define DW_OP_lit27 0x4b -#define DW_OP_lit28 0x4c -#define DW_OP_lit29 0x4d -#define DW_OP_lit30 0x4e -#define DW_OP_lit31 0x4f -#define DW_OP_reg0 0x50 -#define DW_OP_reg1 0x51 -#define DW_OP_reg2 0x52 -#define DW_OP_reg3 0x53 -#define DW_OP_reg4 0x54 -#define DW_OP_reg5 0x55 -#define DW_OP_reg6 0x56 -#define DW_OP_reg7 0x57 -#define DW_OP_reg8 0x58 -#define DW_OP_reg9 0x59 -#define DW_OP_reg10 0x5a -#define DW_OP_reg11 0x5b -#define DW_OP_reg12 0x5c -#define DW_OP_reg13 0x5d -#define DW_OP_reg14 0x5e -#define DW_OP_reg15 0x5f -#define DW_OP_reg16 0x60 -#define DW_OP_reg17 0x61 -#define DW_OP_reg18 0x62 -#define DW_OP_reg19 0x63 -#define DW_OP_reg20 0x64 -#define DW_OP_reg21 0x65 -#define DW_OP_reg22 0x66 -#define DW_OP_reg23 0x67 -#define DW_OP_reg24 0x68 -#define DW_OP_reg25 0x69 -#define DW_OP_reg26 0x6a -#define DW_OP_reg27 0x6b -#define DW_OP_reg28 0x6c -#define DW_OP_reg29 0x6d -#define DW_OP_reg30 0x6e -#define DW_OP_reg31 0x6f -#define DW_OP_breg0 0x70 -#define DW_OP_breg1 0x71 -#define DW_OP_breg2 0x72 -#define DW_OP_breg3 0x73 -#define DW_OP_breg4 0x74 -#define DW_OP_breg5 0x75 -#define DW_OP_breg6 0x76 -#define DW_OP_breg7 0x77 -#define DW_OP_breg8 0x78 -#define DW_OP_breg9 0x79 -#define DW_OP_breg10 0x7a -#define DW_OP_breg11 0x7b -#define DW_OP_breg12 0x7c -#define DW_OP_breg13 0x7d -#define DW_OP_breg14 0x7e -#define DW_OP_breg15 0x7f -#define DW_OP_breg16 0x80 -#define DW_OP_breg17 0x81 -#define DW_OP_breg18 0x82 -#define DW_OP_breg19 0x83 -#define DW_OP_breg20 0x84 -#define DW_OP_breg21 0x85 -#define DW_OP_breg22 0x86 -#define DW_OP_breg23 0x87 -#define DW_OP_breg24 0x88 -#define DW_OP_breg25 0x89 -#define DW_OP_breg26 0x8a -#define DW_OP_breg27 0x8b -#define DW_OP_breg28 0x8c -#define DW_OP_breg29 0x8d -#define DW_OP_breg30 0x8e -#define DW_OP_breg31 0x8f -#define DW_OP_regx 0x90 -#define DW_OP_fbreg 0x91 -#define DW_OP_bregx 0x92 -#define DW_OP_piece 0x93 -#define DW_OP_deref_size 0x94 -#define DW_OP_xderef_size 0x95 -#define DW_OP_nop 0x96 -#define DW_OP_push_object_address 0x97 /* DWARF3 */ -#define DW_OP_call2 0x98 /* DWARF3 */ -#define DW_OP_call4 0x99 /* DWARF3 */ -#define DW_OP_call_ref 0x9a /* DWARF3 */ -#define DW_OP_form_tls_address 0x9b /* DWARF3f */ -#define DW_OP_call_frame_cfa 0x9c /* DWARF3f */ -#define DW_OP_bit_piece 0x9d /* DWARF3f */ -#define DW_OP_implicit_value 0x9e /* DWARF4 */ -#define DW_OP_stack_value 0x9f /* DWARF4 */ - - - /* GNU extensions. */ -#define DW_OP_GNU_push_tls_address 0xe0 /* GNU */ - -/* Follows extension so dwarfdump prints the most-likely-useful name. */ -#define DW_OP_lo_user 0xe0 - - /* HP extensions. */ -#define DW_OP_HP_unknown 0xe0 /* HP conflict: GNU */ -#define DW_OP_HP_is_value 0xe1 /* HP */ -#define DW_OP_HP_fltconst4 0xe2 /* HP */ -#define DW_OP_HP_fltconst8 0xe3 /* HP */ -#define DW_OP_HP_mod_range 0xe4 /* HP */ -#define DW_OP_HP_unmod_range 0xe5 /* HP */ -#define DW_OP_HP_tls 0xe6 /* HP */ - -#define DW_OP_INTEL_bit_piece 0xe8 /* Intel: made obsolete by DW_OP_bit_piece above. */ - - - /* Apple extension. */ -#define DW_OP_APPLE_uninit 0xf0 /* Apple */ - -#define DW_OP_hi_user 0xff - -#define DW_ATE_address 0x1 -#define DW_ATE_boolean 0x2 -#define DW_ATE_complex_float 0x3 -#define DW_ATE_float 0x4 -#define DW_ATE_signed 0x5 -#define DW_ATE_signed_char 0x6 -#define DW_ATE_unsigned 0x7 -#define DW_ATE_unsigned_char 0x8 -#define DW_ATE_imaginary_float 0x9 /* DWARF3 */ -#define DW_ATE_packed_decimal 0xa /* DWARF3f */ -#define DW_ATE_numeric_string 0xb /* DWARF3f */ -#define DW_ATE_edited 0xc /* DWARF3f */ -#define DW_ATE_signed_fixed 0xd /* DWARF3f */ -#define DW_ATE_unsigned_fixed 0xe /* DWARF3f */ -#define DW_ATE_decimal_float 0xf /* DWARF3f */ - - -/* ALTIUM extensions. x80, x81 */ -#define DW_ATE_ALTIUM_fract 0x80 /* ALTIUM __fract type */ - -/* Follows extension so dwarfdump prints the most-likely-useful name. */ -#define DW_ATE_lo_user 0x80 - -/* Shown here to help dwarfdump build script. */ -#define DW_ATE_ALTIUM_accum 0x81 /* ALTIUM __accum type */ - -/* HP Floating point extensions. */ -#define DW_ATE_HP_float80 0x80 /* (80 bit). HP */ - - -#define DW_ATE_HP_complex_float80 0x81 /* Complex (80 bit). HP */ -#define DW_ATE_HP_float128 0x82 /* (128 bit). HP */ -#define DW_ATE_HP_complex_float128 0x83 /* Complex (128 bit). HP */ -#define DW_ATE_HP_floathpintel 0x84 /* (82 bit IA64). HP */ -#define DW_ATE_HP_imaginary_float80 0x85 /* HP */ -#define DW_ATE_HP_imaginary_float128 0x86 /* HP */ - -/* Sun extensions */ -#define DW_ATE_SUN_interval_float 0x91 -#define DW_ATE_SUN_imaginary_float 0x92 /* Obsolete: See DW_ATE_imaginary_float */ - -#define DW_ATE_hi_user 0xff - - -/* Decimal Sign codes. */ -#define DW_DS_unsigned 0x01 /* DWARF3f */ -#define DW_DS_leading_overpunch 0x02 /* DWARF3f */ -#define DW_DS_trailing_overpunch 0x03 /* DWARF3f */ -#define DW_DS_leading_separate 0x04 /* DWARF3f */ - -#define DW_DS_trailing_separate 0x05 /* DWARF3f */ - -/* Endian code name. */ -#define DW_END_default 0x00 /* DWARF3f */ -#define DW_END_big 0x01 /* DWARF3f */ -#define DW_END_little 0x02 /* DWARF3f */ - -#define DW_END_lo_user 0x40 /* DWARF3f */ -#define DW_END_hi_user 0xff /* DWARF3f */ - -/* For use with DW_TAG_SUN_codeflags - * If DW_TAG_SUN_codeflags is accepted as a dwarf standard, then - * standard dwarf ATCF entries start at 0x01 - */ -#define DW_ATCF_lo_user 0x40 /* SUN */ -#define DW_ATCF_SUN_mop_bitfield 0x41 /* SUN */ -#define DW_ATCF_SUN_mop_spill 0x42 /* SUN */ -#define DW_ATCF_SUN_mop_scopy 0x43 /* SUN */ -#define DW_ATCF_SUN_func_start 0x44 /* SUN */ -#define DW_ATCF_SUN_end_ctors 0x45 /* SUN */ -#define DW_ATCF_SUN_branch_target 0x46 /* SUN */ -#define DW_ATCF_SUN_mop_stack_probe 0x47 /* SUN */ -#define DW_ATCF_SUN_func_epilog 0x48 /* SUN */ -#define DW_ATCF_hi_user 0xff /* SUN */ - -/* Accessibility code name. */ -#define DW_ACCESS_public 0x01 -#define DW_ACCESS_protected 0x02 -#define DW_ACCESS_private 0x03 - -/* Visibility code name. */ -#define DW_VIS_local 0x01 -#define DW_VIS_exported 0x02 -#define DW_VIS_qualified 0x03 - -/* Virtuality code name. */ -#define DW_VIRTUALITY_none 0x00 -#define DW_VIRTUALITY_virtual 0x01 -#define DW_VIRTUALITY_pure_virtual 0x02 - -#define DW_LANG_C89 0x0001 -#define DW_LANG_C 0x0002 -#define DW_LANG_Ada83 0x0003 -#define DW_LANG_C_plus_plus 0x0004 -#define DW_LANG_Cobol74 0x0005 -#define DW_LANG_Cobol85 0x0006 -#define DW_LANG_Fortran77 0x0007 -#define DW_LANG_Fortran90 0x0008 -#define DW_LANG_Pascal83 0x0009 -#define DW_LANG_Modula2 0x000a -#define DW_LANG_Java 0x000b /* DWARF3 */ -#define DW_LANG_C99 0x000c /* DWARF3 */ -#define DW_LANG_Ada95 0x000d /* DWARF3 */ -#define DW_LANG_Fortran95 0x000e /* DWARF3 */ -#define DW_LANG_PLI 0x000f /* DWARF3 */ -#define DW_LANG_ObjC 0x0010 /* DWARF3f */ -#define DW_LANG_ObjC_plus_plus 0x0011 /* DWARF3f */ -#define DW_LANG_UPC 0x0012 /* DWARF3f */ -#define DW_LANG_D 0x0013 /* DWARF3f */ -#define DW_LANG_Python 0x0014 /* DWARF4 */ -/* The following 2 are not yet formally approved October 2010, but - it seems extremely likely they will be approved as the committee - chair agrees these should be ok and no one on the committee - has objected. */ -#define DW_LANG_OpenCL 0x0015 /* Provisionally DWARF5 */ -#define DW_LANG_Go 0x0016 /* Provisionally DWARF5 */ -#define DW_LANG_lo_user 0x8000 -#define DW_LANG_Mips_Assembler 0x8001 /* MIPS */ -#define DW_LANG_Upc 0x8765 /* UPC, use - DW_LANG_UPC instead. */ -/* ALTIUM extension */ -#define DW_LANG_ALTIUM_Assembler 0x9101 /* ALTIUM */ - -/* Sun extensions */ -#define DW_LANG_SUN_Assembler 0x9001 /* SUN */ - -#define DW_LANG_hi_user 0xffff - -/* Identifier case name. */ -#define DW_ID_case_sensitive 0x00 -#define DW_ID_up_case 0x01 -#define DW_ID_down_case 0x02 -#define DW_ID_case_insensitive 0x03 - -/* Calling Convention Name. */ -#define DW_CC_normal 0x01 -#define DW_CC_program 0x02 -#define DW_CC_nocall 0x03 -#define DW_CC_lo_user 0x40 - -/* ALTIUM extensions. */ -/* Function is an interrupt handler, return address on system stack. */ -#define DW_CC_ALTIUM_interrupt 0x65 /* ALTIUM*/ - -/* Near function model, return address on system stack. */ -#define DW_CC_ALTIUM_near_system_stack 0x66 /*ALTIUM */ - -/* Near function model, return address on user stack. */ -#define DW_CC_ALTIUM_near_user_stack 0x67 /* ALTIUM */ - -/* Huge function model, return address on user stack. */ -#define DW_CC_ALTIUM_huge_user_stack 0x68 /* ALTIUM */ - - -#define DW_CC_hi_user 0xff - -/* Inline Code Name. */ -#define DW_INL_not_inlined 0x00 -#define DW_INL_inlined 0x01 -#define DW_INL_declared_not_inlined 0x02 -#define DW_INL_declared_inlined 0x03 - -/* Ordering Name. */ -#define DW_ORD_row_major 0x00 -#define DW_ORD_col_major 0x01 - -/* Discriminant Descriptor Name. */ -#define DW_DSC_label 0x00 -#define DW_DSC_range 0x01 - -/* Line number standard opcode name. */ -#define DW_LNS_copy 0x01 -#define DW_LNS_advance_pc 0x02 -#define DW_LNS_advance_line 0x03 -#define DW_LNS_set_file 0x04 -#define DW_LNS_set_column 0x05 -#define DW_LNS_negate_stmt 0x06 -#define DW_LNS_set_basic_block 0x07 -#define DW_LNS_const_add_pc 0x08 -#define DW_LNS_fixed_advance_pc 0x09 -#define DW_LNS_set_prologue_end 0x0a /* DWARF3 */ -#define DW_LNS_set_epilogue_begin 0x0b /* DWARF3 */ -#define DW_LNS_set_isa 0x0c /* DWARF3 */ - -/* Line number extended opcode name. */ -#define DW_LNE_end_sequence 0x01 -#define DW_LNE_set_address 0x02 -#define DW_LNE_define_file 0x03 -#define DW_LNE_set_discriminator 0x04 /* DWARF4 */ - -/* HP extensions. */ -#define DW_LNE_HP_negate_is_UV_update 0x11 /* 17 HP */ -#define DW_LNE_HP_push_context 0x12 /* 18 HP */ -#define DW_LNE_HP_pop_context 0x13 /* 19 HP */ -#define DW_LNE_HP_set_file_line_column 0x14 /* 20 HP */ -#define DW_LNE_HP_set_routine_name 0x15 /* 21 HP */ -#define DW_LNE_HP_set_sequence 0x16 /* 22 HP */ -#define DW_LNE_HP_negate_post_semantics 0x17 /* 23 HP */ -#define DW_LNE_HP_negate_function_exit 0x18 /* 24 HP */ -#define DW_LNE_HP_negate_front_end_logical 0x19 /* 25 HP */ -#define DW_LNE_HP_define_proc 0x20 /* 32 HP */ - -#define DW_LNE_lo_user 0x80 /* DWARF3 */ -#define DW_LNE_hi_user 0xff /* DWARF3 */ - -/* These are known values for DW_LNS_set_isa. */ -#define DW_ISA_UNKNOWN 0 -/* The following two are ARM specific. */ -#define DW_ISA_ARM_thumb 1 /* ARM ISA */ -#define DW_ISA_ARM_arm 2 /* ARM ISA */ - -/* Macro information. */ -#define DW_MACINFO_define 0x01 -#define DW_MACINFO_undef 0x02 -#define DW_MACINFO_start_file 0x03 -#define DW_MACINFO_end_file 0x04 -#define DW_MACINFO_vendor_ext 0xff - -/* CFA operator compaction (a space saving measure, see - the DWARF standard) means DW_CFA_extended and DW_CFA_nop - have the same value here. */ -#define DW_CFA_advance_loc 0x40 -#define DW_CFA_offset 0x80 -#define DW_CFA_restore 0xc0 -#define DW_CFA_extended 0 - -#define DW_CFA_nop 0x00 -#define DW_CFA_set_loc 0x01 -#define DW_CFA_advance_loc1 0x02 -#define DW_CFA_advance_loc2 0x03 -#define DW_CFA_advance_loc4 0x04 -#define DW_CFA_offset_extended 0x05 -#define DW_CFA_restore_extended 0x06 -#define DW_CFA_undefined 0x07 -#define DW_CFA_same_value 0x08 -#define DW_CFA_register 0x09 -#define DW_CFA_remember_state 0x0a -#define DW_CFA_restore_state 0x0b -#define DW_CFA_def_cfa 0x0c -#define DW_CFA_def_cfa_register 0x0d -#define DW_CFA_def_cfa_offset 0x0e -#define DW_CFA_def_cfa_expression 0x0f /* DWARF3 */ -#define DW_CFA_expression 0x10 /* DWARF3 */ -#define DW_CFA_offset_extended_sf 0x11 /* DWARF3 */ -#define DW_CFA_def_cfa_sf 0x12 /* DWARF3 */ -#define DW_CFA_def_cfa_offset_sf 0x13 /* DWARF3 */ -#define DW_CFA_val_offset 0x14 /* DWARF3f */ -#define DW_CFA_val_offset_sf 0x15 /* DWARF3f */ -#define DW_CFA_val_expression 0x16 /* DWARF3f */ - -#define DW_CFA_lo_user 0x1c -#define DW_CFA_low_user 0x1c /* Incorrect spelling, do not use. */ - -/* SGI/MIPS extension. */ -#define DW_CFA_MIPS_advance_loc8 0x1d /* MIPS */ - -/* GNU extensions. */ -#define DW_CFA_GNU_window_save 0x2d /* GNU */ -#define DW_CFA_GNU_args_size 0x2e /* GNU */ -#define DW_CFA_GNU_negative_offset_extended 0x2f /* GNU */ - -#define DW_CFA_high_user 0x3f - -/* GNU exception header encoding. See the Generic - Elf Specification of the Linux Standard Base (LSB). - http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html - The upper 4 bits indicate how the value is to be applied. - The lower 4 bits indicate the format of the data. -*/ -#define DW_EH_PE_absptr 0x00 /* GNU */ -#define DW_EH_PE_uleb128 0x01 /* GNU */ -#define DW_EH_PE_udata2 0x02 /* GNU */ -#define DW_EH_PE_udata4 0x03 /* GNU */ -#define DW_EH_PE_udata8 0x04 /* GNU */ -#define DW_EH_PE_sleb128 0x09 /* GNU */ -#define DW_EH_PE_sdata2 0x0A /* GNU */ -#define DW_EH_PE_sdata4 0x0B /* GNU */ -#define DW_EH_PE_sdata8 0x0C /* GNU */ - -#define DW_EH_PE_pcrel 0x10 /* GNU */ -#define DW_EH_PE_textrel 0x20 /* GNU */ -#define DW_EH_PE_datarel 0x30 /* GNU */ -#define DW_EH_PE_funcrel 0x40 /* GNU */ -#define DW_EH_PE_aligned 0x50 /* GNU */ - -#define DW_EH_PE_omit 0xff /* GNU. Means no value present. */ - - -/* Mapping from machine registers and pseudo-regs into the .debug_frame table. - DW_FRAME entries are machine specific. These describe - MIPS/SGI R3000, R4K, R4400 and all later MIPS/SGI IRIX machines. - They describe a mapping from hardware register number to - the number used in the table to identify that register. - - The CFA (Canonical Frame Address) described in DWARF is called - the Virtual Frame Pointer on MIPS/SGI machines. - - The DW_FRAME* names here are MIPS/SGI specfic. - Libdwarf interfaces defined in 2008 make the - frame definitions - here (and the fixed table sizes they imply) obsolete. - They are left here for compatibility. -*/ -/* Default column used for CFA in the libdwarf reader client. - Assumes reg 0 never appears as - a register in DWARF information. Usable for MIPS, - but never a good idea, really. */ -#define DW_FRAME_CFA_COL 0 - -#define DW_FRAME_REG1 1 /* integer reg 1 */ -#define DW_FRAME_REG2 2 /* integer reg 2 */ -#define DW_FRAME_REG3 3 /* integer reg 3 */ -#define DW_FRAME_REG4 4 /* integer reg 4 */ -#define DW_FRAME_REG5 5 /* integer reg 5 */ -#define DW_FRAME_REG6 6 /* integer reg 6 */ -#define DW_FRAME_REG7 7 /* integer reg 7 */ -#define DW_FRAME_REG8 8 /* integer reg 8 */ -#define DW_FRAME_REG9 9 /* integer reg 9 */ -#define DW_FRAME_REG10 10 /* integer reg 10 */ -#define DW_FRAME_REG11 11 /* integer reg 11 */ -#define DW_FRAME_REG12 12 /* integer reg 12 */ -#define DW_FRAME_REG13 13 /* integer reg 13 */ -#define DW_FRAME_REG14 14 /* integer reg 14 */ -#define DW_FRAME_REG15 15 /* integer reg 15 */ -#define DW_FRAME_REG16 16 /* integer reg 16 */ -#define DW_FRAME_REG17 17 /* integer reg 17 */ -#define DW_FRAME_REG18 18 /* integer reg 18 */ -#define DW_FRAME_REG19 19 /* integer reg 19 */ -#define DW_FRAME_REG20 20 /* integer reg 20 */ -#define DW_FRAME_REG21 21 /* integer reg 21 */ -#define DW_FRAME_REG22 22 /* integer reg 22 */ -#define DW_FRAME_REG23 23 /* integer reg 23 */ -#define DW_FRAME_REG24 24 /* integer reg 24 */ -#define DW_FRAME_REG25 25 /* integer reg 25 */ -#define DW_FRAME_REG26 26 /* integer reg 26 */ -#define DW_FRAME_REG27 27 /* integer reg 27 */ -#define DW_FRAME_REG28 28 /* integer reg 28 */ -#define DW_FRAME_REG29 29 /* integer reg 29 */ -#define DW_FRAME_REG30 30 /* integer reg 30 */ -#define DW_FRAME_REG31 31 /* integer reg 31, aka ra */ - - /* MIPS1, 2 have only some of these 64-bit registers. - ** MIPS1 save/restore takes 2 instructions per 64-bit reg, and - ** in that case, the register is considered stored after the second - ** swc1. - */ -#define DW_FRAME_FREG0 32 /* 64-bit floating point reg 0 */ -#define DW_FRAME_FREG1 33 /* 64-bit floating point reg 1 */ -#define DW_FRAME_FREG2 34 /* 64-bit floating point reg 2 */ -#define DW_FRAME_FREG3 35 /* 64-bit floating point reg 3 */ -#define DW_FRAME_FREG4 36 /* 64-bit floating point reg 4 */ -#define DW_FRAME_FREG5 37 /* 64-bit floating point reg 5 */ -#define DW_FRAME_FREG6 38 /* 64-bit floating point reg 6 */ -#define DW_FRAME_FREG7 39 /* 64-bit floating point reg 7 */ -#define DW_FRAME_FREG8 40 /* 64-bit floating point reg 8 */ -#define DW_FRAME_FREG9 41 /* 64-bit floating point reg 9 */ -#define DW_FRAME_FREG10 42 /* 64-bit floating point reg 10 */ -#define DW_FRAME_FREG11 43 /* 64-bit floating point reg 11 */ -#define DW_FRAME_FREG12 44 /* 64-bit floating point reg 12 */ -#define DW_FRAME_FREG13 45 /* 64-bit floating point reg 13 */ -#define DW_FRAME_FREG14 46 /* 64-bit floating point reg 14 */ -#define DW_FRAME_FREG15 47 /* 64-bit floating point reg 15 */ -#define DW_FRAME_FREG16 48 /* 64-bit floating point reg 16 */ -#define DW_FRAME_FREG17 49 /* 64-bit floating point reg 17 */ -#define DW_FRAME_FREG18 50 /* 64-bit floating point reg 18 */ -#define DW_FRAME_FREG19 51 /* 64-bit floating point reg 19 */ -#define DW_FRAME_FREG20 52 /* 64-bit floating point reg 20 */ -#define DW_FRAME_FREG21 53 /* 64-bit floating point reg 21 */ -#define DW_FRAME_FREG22 54 /* 64-bit floating point reg 22 */ -#define DW_FRAME_FREG23 55 /* 64-bit floating point reg 23 */ -#define DW_FRAME_FREG24 56 /* 64-bit floating point reg 24 */ -#define DW_FRAME_FREG25 57 /* 64-bit floating point reg 25 */ -#define DW_FRAME_FREG26 58 /* 64-bit floating point reg 26 */ -#define DW_FRAME_FREG27 59 /* 64-bit floating point reg 27 */ -#define DW_FRAME_FREG28 60 /* 64-bit floating point reg 28 */ -#define DW_FRAME_FREG29 61 /* 64-bit floating point reg 29 */ -#define DW_FRAME_FREG30 62 /* 64-bit floating point reg 30 */ -#define DW_FRAME_FREG31 63 /* 64-bit floating point reg 31 */ - -/* ***IMPORTANT NOTE, TARGET DEPENDENCY **** - The following 4 #defines are dependent on - the target cpu(s) that you apply libdwarf to. - Ensure that DW_FRAME_UNDEFINED_VAL and DW_FRAME_SAME_VAL - do not conflict with the range [0-DW_FRAME_STATIC_LINK]. - The value 63 works for MIPS cpus at least up to the R16000. - - For a cpu with more than 63 real registers - DW_FRAME_HIGHEST_NORMAL_REGISTER - must be increased for things to work properly! - Also ensure that DW_FRAME_UNDEFINED_VAL DW_FRAME_SAME_VAL - are not in the range [0-DW_FRAME_STATIC_LINK] - - Having DW_FRAME_HIGHEST_NORMAL_REGISTER be higher than - is strictly needed is safe. - -*/ - -#ifndef DW_FRAME_HIGHEST_NORMAL_REGISTER -#define DW_FRAME_HIGHEST_NORMAL_REGISTER 63 -#endif -/* This is the number of columns in the Frame Table. - This constant should - be kept in sync with DW_REG_TABLE_SIZE defined in libdwarf.h - It must also be large enough to be beyond the highest - compiler-defined-register (meaning DW_FRAME_RA_COL DW_FRAME_STATIC_LINK - in the MIPS/IRIX case */ -#ifndef DW_FRAME_LAST_REG_NUM -#define DW_FRAME_LAST_REG_NUM (DW_FRAME_HIGHEST_NORMAL_REGISTER + 3) -#endif - - -/* Column recording ra (return address from a function call). - This is common to many architectures, but as a 'simple register' - is not necessarily adequate for all architectures. - For MIPS/IRIX this register number is actually recorded on disk - in the .debug_frame section. - */ -#define DW_FRAME_RA_COL (DW_FRAME_HIGHEST_NORMAL_REGISTER + 1) - -/* Column recording static link applicable to up-level - addressing, as in IRIX mp code, pascal, etc. - This is common to many architectures but - is not necessarily adequate for all architectures. - For MIPS/IRIX this register number is actually recorded on disk - in the .debug_frame section. -*/ -#define DW_FRAME_STATIC_LINK (DW_FRAME_HIGHEST_NORMAL_REGISTER + 2) - - - -/* - DW_FRAME_UNDEFINED_VAL and DW_FRAME_SAME_VAL are - never on disk, just generated by libdwarf. See libdwarf.h - for their values. -*/ - - - -#define DW_CHILDREN_no 0x00 -#define DW_CHILDREN_yes 0x01 - -#define DW_ADDR_none 0 - -#ifdef __cplusplus -} -#endif -#endif /* __DWARF_H */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.c b/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.c deleted file mode 100644 index c2ae361f33..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the above address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_abbrev.h" - -int -dwarf_get_abbrev(Dwarf_Debug dbg, - Dwarf_Unsigned offset, - Dwarf_Abbrev * returned_abbrev, - Dwarf_Unsigned * length, - Dwarf_Unsigned * abbr_count, Dwarf_Error * error) -{ - Dwarf_Small *abbrev_ptr = 0; - Dwarf_Small *abbrev_section_end = 0; - Dwarf_Half attr = 0; - Dwarf_Half attr_form = 0; - Dwarf_Abbrev ret_abbrev = 0; - Dwarf_Unsigned labbr_count = 0; - Dwarf_Unsigned utmp = 0; - - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - if (dbg->de_debug_abbrev.dss_data == 0) { - /* Loads abbrev section (and .debug_info as we do those - together). */ - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - } - - if (offset >= dbg->de_debug_abbrev.dss_size) { - return (DW_DLV_NO_ENTRY); - } - - - ret_abbrev = (Dwarf_Abbrev) _dwarf_get_alloc(dbg, DW_DLA_ABBREV, 1); - if (ret_abbrev == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - ret_abbrev->ab_dbg = dbg; - if (returned_abbrev == 0 || abbr_count == 0) { - dwarf_dealloc(dbg, ret_abbrev, DW_DLA_ABBREV); - _dwarf_error(dbg, error, DW_DLE_DWARF_ABBREV_NULL); - return (DW_DLV_ERROR); - } - - - *abbr_count = 0; - if (length != NULL) - *length = 1; - - abbrev_ptr = dbg->de_debug_abbrev.dss_data + offset; - abbrev_section_end = - dbg->de_debug_abbrev.dss_data + dbg->de_debug_abbrev.dss_size; - - DECODE_LEB128_UWORD(abbrev_ptr, utmp); - ret_abbrev->ab_code = (Dwarf_Word) utmp; - if (ret_abbrev->ab_code == 0) { - *returned_abbrev = ret_abbrev; - *abbr_count = 0; - if (length) { - *length = 1; - } - return (DW_DLV_OK); - } - - DECODE_LEB128_UWORD(abbrev_ptr, utmp); - ret_abbrev->ab_tag = utmp; - ret_abbrev->ab_has_child = *(abbrev_ptr++); - ret_abbrev->ab_abbrev_ptr = abbrev_ptr; - - do { - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr = (Dwarf_Half) utmp2; - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr_form = (Dwarf_Half) utmp2; - - if (attr != 0) - (labbr_count)++; - - } while (abbrev_ptr < abbrev_section_end && - (attr != 0 || attr_form != 0)); - - if (abbrev_ptr > abbrev_section_end) { - dwarf_dealloc(dbg, ret_abbrev, DW_DLA_ABBREV); - _dwarf_error(dbg, error, DW_DLE_ABBREV_DECODE_ERROR); - return (DW_DLV_ERROR); - } - - if (length != NULL) - *length = abbrev_ptr - dbg->de_debug_abbrev.dss_data - offset; - - *returned_abbrev = ret_abbrev; - *abbr_count = labbr_count; - return (DW_DLV_OK); -} - -int -dwarf_get_abbrev_code(Dwarf_Abbrev abbrev, - Dwarf_Unsigned * returned_code, - Dwarf_Error * error) -{ - if (abbrev == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_ABBREV_NULL); - return (DW_DLV_ERROR); - } - - *returned_code = abbrev->ab_code; - return (DW_DLV_OK); -} - -/* DWARF defines DW_TAG_hi_user as 0xffff so no tag should be - over 16 bits. */ -int -dwarf_get_abbrev_tag(Dwarf_Abbrev abbrev, - Dwarf_Half * returned_tag, Dwarf_Error * error) -{ - if (abbrev == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_ABBREV_NULL); - return (DW_DLV_ERROR); - } - - *returned_tag = abbrev->ab_tag; - return (DW_DLV_OK); -} - - -int -dwarf_get_abbrev_children_flag(Dwarf_Abbrev abbrev, - Dwarf_Signed * returned_flag, - Dwarf_Error * error) -{ - if (abbrev == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_ABBREV_NULL); - return (DW_DLV_ERROR); - } - - *returned_flag = abbrev->ab_has_child; - return (DW_DLV_OK); -} - - -int -dwarf_get_abbrev_entry(Dwarf_Abbrev abbrev, - Dwarf_Signed index, - Dwarf_Half * returned_attr_num, - Dwarf_Signed * form, - Dwarf_Off * offset, Dwarf_Error * error) -{ - Dwarf_Byte_Ptr abbrev_ptr = 0; - Dwarf_Byte_Ptr abbrev_end = 0; - Dwarf_Byte_Ptr mark_abbrev_ptr = 0; - Dwarf_Half attr = 0; - Dwarf_Half attr_form = 0; - - if (index < 0) - return (DW_DLV_NO_ENTRY); - - if (abbrev == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_ABBREV_NULL); - return (DW_DLV_ERROR); - } - - if (abbrev->ab_code == 0) { - return (DW_DLV_NO_ENTRY); - } - - if (abbrev->ab_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - abbrev_ptr = abbrev->ab_abbrev_ptr; - abbrev_end = - abbrev->ab_dbg->de_debug_abbrev.dss_data + - abbrev->ab_dbg->de_debug_abbrev.dss_size; - - for (attr = 1, attr_form = 1; - index >= 0 && abbrev_ptr < abbrev_end && (attr != 0 || - attr_form != 0); - index--) { - Dwarf_Unsigned utmp4; - - mark_abbrev_ptr = abbrev_ptr; - DECODE_LEB128_UWORD(abbrev_ptr, utmp4); - attr = (Dwarf_Half) utmp4; - DECODE_LEB128_UWORD(abbrev_ptr, utmp4); - attr_form = (Dwarf_Half) utmp4; - } - - if (abbrev_ptr >= abbrev_end) { - _dwarf_error(abbrev->ab_dbg, error, DW_DLE_ABBREV_DECODE_ERROR); - return (DW_DLV_ERROR); - } - - if (index >= 0) { - return (DW_DLV_NO_ENTRY); - } - - if (form != NULL) - *form = attr_form; - if (offset != NULL) - *offset = mark_abbrev_ptr - abbrev->ab_dbg->de_debug_abbrev.dss_data; - - *returned_attr_num = (attr); - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.h b/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.h deleted file mode 100644 index b525924c83..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_abbrev.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - - Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -/* In a given CU, one of these is (eventually) set up - for every abbreviation we need to find (and for all. - those ealier in the abbreviations for that CU). - So we don't want elements needlessly big. -*/ -struct Dwarf_Abbrev_s { - /* No TAG should exceed DW_TAG_hi_user, 0xffff, but - we do allow a larger value here. */ - Dwarf_Word ab_tag; - /* Abbreviations are numbered (normally sequentially from - 1 and so 16 bits is not enough! */ - Dwarf_Word ab_code; - Dwarf_Small ab_has_child; - Dwarf_Byte_Ptr ab_abbrev_ptr; - Dwarf_Debug ab_dbg; -}; diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_addr_finder.c b/usr/src/tools/ctf/dwarf/common/dwarf_addr_finder.c deleted file mode 100644 index 2fadefc1ea..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_addr_finder.c +++ /dev/null @@ -1,685 +0,0 @@ -/* - - Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* This code used by SGI-IRIX rqs processing, not needed by - any other system or application. -*/ - -#include "config.h" -#include "libdwarfdefs.h" -#ifdef HAVE_ELF_H -#include <elf.h> -#endif -#include <dwarf.h> -#include <libdwarf.h> -#include "dwarf_base_types.h" -#include "dwarf_alloc.h" -#include "dwarf_opaque.h" -#include "dwarf_arange.h" -#include "dwarf_line.h" -#include "dwarf_frame.h" -#include <cmplrs/dwarf_addr_finder.h> -#include "dwarf_error.h" - -typedef unsigned long long ull; - -static int do_this_die_and_dealloc(Dwarf_Debug dbg, Dwarf_Die die, - int *errval); -static int - handle_debug_info(Dwarf_Debug dbg, int *errval); -static int - handle_debug_frame(Dwarf_Debug dbg, Dwarf_addr_callback_func cb_func, int *errval); -static int - handle_debug_aranges(Dwarf_Debug dbg, Dwarf_addr_callback_func cb_func, int *errval); -static int - handle_debug_line(Dwarf_Debug dbg, Dwarf_Die cu_die, Dwarf_addr_callback_func cb_func, int *errval); -static int - handle_debug_loc(void); - - -static Dwarf_addr_callback_func send_addr_note; - -int -_dwarf_addr_finder(dwarf_elf_handle elf_file_ptr, - Dwarf_addr_callback_func cb_func, int *dwerr) -{ - - Dwarf_Error err = 0; - Dwarf_Debug dbg = 0; - int res = 0; - int errval = 0; - int sections_found = 0; - - res = dwarf_elf_init(elf_file_ptr, DW_DLC_READ, /* errhand */ 0, - /* errarg */ 0, &dbg, &err); - if (res == DW_DLV_ERROR) { - int errv = (int) dwarf_errno(err); - - return errv; - } - if (res == DW_DLV_NO_ENTRY) { - return res; - } - - send_addr_note = cb_func; - - res = handle_debug_info(dbg, &errval); - switch (res) { - case DW_DLV_OK: - ++sections_found; - break; - case DW_DLV_NO_ENTRY: - - break; - default: - case DW_DLV_ERROR: - dwarf_finish(dbg, &err); - *dwerr = errval; - return res; - } - - res = handle_debug_aranges(dbg, cb_func, &errval); - switch (res) { - case DW_DLV_OK: - ++sections_found; - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - dwarf_finish(dbg, &err); - *dwerr = errval; - return res; - } - res = handle_debug_frame(dbg, cb_func, &errval); - switch (res) { - case DW_DLV_OK: - ++sections_found; - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - dwarf_finish(dbg, &err); - *dwerr = errval; - return res; - } - - res = handle_debug_loc(); /* does nothing */ - switch (res) { - case DW_DLV_OK: - ++sections_found; - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - /* IMPOSSIBLE : handle_debug_loc cannot return this */ - dwarf_finish(dbg, &err); - *dwerr = errval; - return res; - } - - - - *dwerr = 0; - res = dwarf_finish(dbg, &err); - if (res == DW_DLV_ERROR) { - *dwerr = (int) dwarf_errno(err); - return DW_DLV_ERROR; - } - if (sections_found == 0) { - return DW_DLV_NO_ENTRY; - } - return DW_DLV_OK; - -} - -/* - Return DW_DLV_OK, ERROR, or NO_ENTRY. -*/ -static int -handle_debug_info(Dwarf_Debug dbg, int *errval) -{ - Dwarf_Unsigned nxtoff = 1; - Dwarf_Unsigned hdr_length; - Dwarf_Half version_stamp; - Dwarf_Unsigned abbrev_offset; - Dwarf_Half addr_size; - Dwarf_Error err; - int terminate_now = 0; - int res = 0; - Dwarf_Die sibdie; - int sibres; - int nres = DW_DLV_OK; - - - for (nres = dwarf_next_cu_header(dbg, &hdr_length, &version_stamp, - &abbrev_offset, - &addr_size, &nxtoff, &err); - terminate_now == 0 && nres == DW_DLV_OK; - nres = dwarf_next_cu_header(dbg, &hdr_length, &version_stamp, - &abbrev_offset, - &addr_size, &nxtoff, &err) - ) { - - Dwarf_Die curdie = 0; - - /* try to get the compilation unit die */ - sibres = dwarf_siblingof(dbg, curdie, &sibdie, &err); - if (sibres == DW_DLV_OK) { - res = do_this_die_and_dealloc(dbg, sibdie, errval); - switch (res) { - case DW_DLV_OK: - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - return DW_DLV_ERROR; - } - } else if (sibres == DW_DLV_ERROR) { - *errval = (int) dwarf_errno(err); - return DW_DLV_ERROR; - } else { - /* NO ENTRY! */ - /* impossible? */ - } - - } - if (nres == DW_DLV_ERROR) { - int localerr = (int) dwarf_errno(err); - - *errval = localerr; - return DW_DLV_ERROR; - } - return DW_DLV_OK; -} - -static int - might_have_addr[] = { - DW_AT_high_pc, - DW_AT_low_pc, -}; -static int - might_have_locdesc[] = { - DW_AT_segment, - DW_AT_return_addr, - DW_AT_frame_base, - DW_AT_static_link, - DW_AT_data_member_location, - DW_AT_string_length, - DW_AT_location, - DW_AT_use_location, - DW_AT_vtable_elem_location, -}; - -/* - Return DW_DLV_OK if handling this went ok. -*/ -static int -handle_attr_addr(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Half attrnum, - Dwarf_Error * perr) -{ - int res = DW_DLV_OK; - Dwarf_Off offset; - Dwarf_Addr addr; - Dwarf_Half form; - int ares; - - Dwarf_Attribute attr; - - ares = dwarf_attr(die, attrnum, &attr, perr); - if (ares == DW_DLV_OK) { - int formres = dwarf_whatform(attr, &form, perr); - - switch (formres) { - case DW_DLV_OK: - break; - case DW_DLV_ERROR: - case DW_DLV_NO_ENTRY: /* impossible. */ - return formres; - - } - - switch (form) { - case DW_FORM_ref_addr: - case DW_FORM_addr: - res = dwarf_attr_offset(die, attr, &offset, perr); - if (res == DW_DLV_OK) { - ares = dwarf_formaddr(attr, &addr, perr); - if (ares == DW_DLV_OK) { - send_addr_note(DW_SECTION_INFO, offset, addr); - } else if (ares == DW_DLV_ERROR) { - return ares; - } /* no entry: ok. */ - } else { - res = DW_DLV_ERROR; /* NO_ENTRY is impossible. */ - } - break; - - default: - /* surprising! An error? */ - - ; /* do nothing */ - } - dwarf_dealloc(dbg, attr, DW_DLA_ATTR); - - } else { - res = ares; - } - return res; -} - -/* - Return DW_DLV_OK if handling this went ok. -*/ -static int -handle_attr_locdesc(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Half attrnum, - Dwarf_Error * perr) -{ - int retval = DW_DLV_OK; - Dwarf_Attribute attr; - Dwarf_Locdesc *llbuf; - Dwarf_Signed i; - Dwarf_Off offset; - Dwarf_Loc *locp; - unsigned int entindx; - int res; - int ares; - - - ares = dwarf_attr(die, attrnum, &attr, perr); - if (ares == DW_DLV_OK) { - Dwarf_Half form; - int fres = dwarf_whatform(attr, &form, perr); - - if (fres == DW_DLV_OK) { - switch (form) { - case DW_FORM_block1: - case DW_FORM_block2: - case DW_FORM_block4: - /* must be location description */ - res = dwarf_attr_offset(die, attr, &offset, perr); - llbuf = 0; - if (res == DW_DLV_OK) { - Dwarf_Signed count; - int lres = dwarf_loclist(attr, &llbuf, &count, perr); - if (lres != DW_DLV_OK) { - return lres; - } - if (count != 1) { - /* this cannot happen! */ - /* perr? */ - _dwarf_error(dbg, perr, - DW_DLE_LOCDESC_COUNT_WRONG); - retval = DW_DLV_ERROR; - return retval; - } - for (i = 0; i < count; ++i) { - unsigned int ents = llbuf[i].ld_cents; - - locp = llbuf[i].ld_s; - for (entindx = 0; entindx < ents; entindx++) { - Dwarf_Loc *llocp; - - llocp = locp + entindx; - if (llocp->lr_atom == DW_OP_addr) { - send_addr_note(DW_SECTION_INFO, offset + - llocp->lr_offset + 1 - /* The offset is the - offset of the atom, - ** and we know the - addr is 1 past it. */ - , llocp->lr_number); - } - } - } - - - if (count > 0) { - for (i = 0; i < count; ++i) { - dwarf_dealloc(dbg, llbuf[i].ld_s, - DW_DLA_LOC_BLOCK); - } - dwarf_dealloc(dbg, llbuf, DW_DLA_LOCDESC); - } - } else { - retval = res; - } - break; - - default: - /* must be a const offset in debug_loc */ - ; /* do nothing */ - } - dwarf_dealloc(dbg, attr, DW_DLA_ATTR); - } /* else error or no entry */ - retval = fres; - } else { - retval = ares; - } - return retval; -} - -/* - Return DW_DLV_OK, or DW_DLV_ERROR - - Handle the addrs in a single die. -*/ -static int -process_this_die_attrs(Dwarf_Debug dbg, Dwarf_Die newdie, int *errval) -{ - Dwarf_Error err; - Dwarf_Half i; - Dwarf_Half newattrnum; - int res; - int tres; - Dwarf_Half ltag; - - Dwarf_Off doff; - int doffres = dwarf_dieoffset(newdie, &doff, &err); - - if (doffres != DW_DLV_OK) { - if (doffres == DW_DLV_ERROR) { - *errval = (int) dwarf_errno(err); - } - return doffres; - } - tres = dwarf_tag(newdie, <ag, &err); - if (tres != DW_DLV_OK) { - return tres; - } - if (DW_TAG_compile_unit == ltag) { - /* because of the way the dwarf_line code works, we do lines - only per compile unit. This may turn out to be wrong if - we have lines left unconnected to a CU. of course such - lines will not, at present, be used by gnome. This is - not ideal as coded due to the dwarf_line.c issue. */ - int lres = handle_debug_line(dbg, newdie, send_addr_note, errval); - if (lres == DW_DLV_ERROR) { - return lres; - } - } - - for (i = 0; i < sizeof(might_have_addr) / sizeof(int); i++) { - int resattr; - Dwarf_Bool hasattr; - - newattrnum = might_have_addr[i]; - err = 0; - resattr = dwarf_hasattr(newdie, newattrnum, &hasattr, &err); - if (DW_DLV_OK == resattr) { - if (hasattr) { - res = handle_attr_addr(dbg, newdie, newattrnum, &err); - if (res != DW_DLV_OK) { - *errval = (int) dwarf_errno(err); - return DW_DLV_ERROR; - } - } - } else { - if (resattr == DW_DLV_ERROR) { - *errval = (int) dwarf_errno(err); - return resattr; - } - } - } - for (i = 0; i < sizeof(might_have_locdesc) / sizeof(int); i++) { - int resattr; - Dwarf_Bool hasattr; - - newattrnum = might_have_locdesc[i]; - err = 0; - resattr = dwarf_hasattr(newdie, newattrnum, &hasattr, &err); - if (DW_DLV_OK == resattr) { - if (hasattr) { - res = - handle_attr_locdesc(dbg, newdie, newattrnum, &err); - if (res != DW_DLV_OK) { - *errval = (int) dwarf_errno(err); - return DW_DLV_ERROR; - } - } - } else { - if (resattr == DW_DLV_ERROR) { - *errval = (int) dwarf_errno(err); - return resattr; - } - } - } - - return DW_DLV_OK; -} - -/* - Handle siblings as a list, - Do children by recursing. - Effectively this is walking the tree preorder. - - This dealloc's any die passed to it, so the - caller should not do that dealloc. - It seems more logical to have the one causing - the alloc to do the dealloc, but that way this - routine became a mess. - -*/ -static int -do_this_die_and_dealloc(Dwarf_Debug dbg, Dwarf_Die die, int *errval) -{ - - Dwarf_Die prevdie = 0; - Dwarf_Die newdie = die; - Dwarf_Error err = 0; - int res = 0; - int sibres = DW_DLV_OK; - int tres = DW_DLV_OK; - Dwarf_Die sibdie; - - while (sibres == DW_DLV_OK) { - Dwarf_Die ch_die; - - - res = process_this_die_attrs(dbg, newdie, errval); - switch (res) { - case DW_DLV_OK: - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - if (prevdie) { - dwarf_dealloc(dbg, prevdie, DW_DLA_DIE); - prevdie = 0; - } - return DW_DLV_ERROR; - } - - tres = dwarf_child(newdie, &ch_die, &err); - - if (tres == DW_DLV_OK) { - res = do_this_die_and_dealloc(dbg, ch_die, errval); - switch (res) { - case DW_DLV_OK: - break; - case DW_DLV_NO_ENTRY: - break; - default: - case DW_DLV_ERROR: - if (prevdie) { - dwarf_dealloc(dbg, prevdie, DW_DLA_DIE); - prevdie = 0; - } - return DW_DLV_ERROR; - } - } else if (tres == DW_DLV_ERROR) { - /* An error! */ - *errval = (int) dwarf_errno(err); - if (prevdie) { - dwarf_dealloc(dbg, prevdie, DW_DLA_DIE); - prevdie = 0; - } - dwarf_dealloc(dbg, err, DW_DLA_ERROR); - return DW_DLV_ERROR; - } /* else was NO ENTRY */ - prevdie = newdie; - sibdie = 0; - sibres = dwarf_siblingof(dbg, newdie, &sibdie, &err); - if (prevdie) { - dwarf_dealloc(dbg, prevdie, DW_DLA_DIE); - prevdie = 0; - } - newdie = sibdie; - - } - if (sibres == DW_DLV_NO_ENTRY) { - return DW_DLV_OK; - } - /* error. */ - *errval = (int) dwarf_errno(err); - if (prevdie) { - dwarf_dealloc(dbg, prevdie, DW_DLA_DIE); - prevdie = 0; - } - dwarf_dealloc(dbg, err, DW_DLA_ERROR); - return DW_DLV_ERROR; - -} - - -static int -handle_debug_frame(Dwarf_Debug dbg, Dwarf_addr_callback_func cb_func, - int *errval) -{ - int retval = DW_DLV_OK; - int res; - Dwarf_Error err; - Dwarf_Addr *addrlist; - Dwarf_Off *offsetlist; - Dwarf_Signed count; - int i; - - res = - _dwarf_frame_address_offsets(dbg, &addrlist, &offsetlist, - &count, &err); - if (res == DW_DLV_OK) { - for (i = 0; i < count; i++) { - cb_func(DW_SECTION_FRAME, offsetlist[i], addrlist[i]); - } - dwarf_dealloc(dbg, offsetlist, DW_DLA_ADDR); - dwarf_dealloc(dbg, addrlist, DW_DLA_ADDR); - } else if (res == DW_DLV_NO_ENTRY) { - retval = res; - } else { - *errval = (int) dwarf_errno(err); - retval = DW_DLV_ERROR; - } - return retval; - -} -static int -handle_debug_aranges(Dwarf_Debug dbg, Dwarf_addr_callback_func cb_func, - int *errval) -{ - int retval = DW_DLV_OK; - Dwarf_Error err; - Dwarf_Addr *aranges; - Dwarf_Signed count; - int indx; - Dwarf_Off *offsets; - - retval = - _dwarf_get_aranges_addr_offsets(dbg, &aranges, &offsets, &count, - &err); - if (retval == DW_DLV_OK) { - if (count == 0) { - retval = DW_DLV_NO_ENTRY; - } else { - for (indx = 0; indx < count; indx++) { - cb_func(DW_SECTION_ARANGES, offsets[indx], - aranges[indx]); - } - } - dwarf_dealloc(dbg, aranges, DW_DLA_ADDR); - dwarf_dealloc(dbg, offsets, DW_DLA_ADDR); - } else if (retval == DW_DLV_NO_ENTRY) { - ; /* do nothing */ - } else { - *errval = (int) dwarf_errno(err); - retval = DW_DLV_ERROR; - } - return retval; -} -static int -handle_debug_line(Dwarf_Debug dbg, Dwarf_Die cu_die, - Dwarf_addr_callback_func cb_func, int *errval) -{ - int retval = DW_DLV_OK; - int res; - Dwarf_Error err; - Dwarf_Addr *addrlist; - Dwarf_Off *offsetlist; - Dwarf_Unsigned count; - Dwarf_Unsigned i; - - res = - _dwarf_line_address_offsets(dbg, cu_die, &addrlist, &offsetlist, - &count, &err); - if (res == DW_DLV_OK) { - for (i = 0; i < count; i++) { - cb_func(DW_SECTION_LINE, offsetlist[i], addrlist[i]); - - } - dwarf_dealloc(dbg, offsetlist, DW_DLA_ADDR); - dwarf_dealloc(dbg, addrlist, DW_DLA_ADDR); - } else if (res == DW_DLV_NO_ENTRY) { - retval = res; - } else { - *errval = (int) dwarf_errno(err); - retval = DW_DLV_ERROR; - } - return retval; -} - -/* - We need to add support for this. Currently we do not - generate this section. - FIX! -*/ -static int -handle_debug_loc(void) -{ - int retval = DW_DLV_NO_ENTRY; - - return retval; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_alloc.c b/usr/src/tools/ctf/dwarf/common/dwarf_alloc.c deleted file mode 100644 index ddb423e841..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_alloc.c +++ /dev/null @@ -1,1258 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - -#undef DEBUG - -#include "config.h" -#include "dwarf_incl.h" -#include <sys/types.h> - -#include <stdlib.h> -#include <stdio.h> -#include "malloc_check.h" - -/* - These files are included to get the sizes - of structs to set the ah_bytes_one_struct field - of the Dwarf_Alloc_Hdr_s structs for each - allocation type. -*/ -#include "dwarf_line.h" -#include "dwarf_global.h" -#include "dwarf_arange.h" -#include "dwarf_abbrev.h" -#include "dwarf_die_deliv.h" -#include "dwarf_frame.h" -#include "dwarf_loc.h" -#include "dwarf_funcs.h" -#include "dwarf_types.h" -#include "dwarf_vars.h" -#include "dwarf_weaks.h" - - -static void _dwarf_free_special_error(Dwarf_Ptr space); - -#ifdef DWARF_SIMPLE_MALLOC -static void _dwarf_simple_malloc_add_to_list(Dwarf_Debug dbg, - Dwarf_Ptr addr, - unsigned long size, - short alloc_type); -static void _dwarf_simple_malloc_delete_from_list(Dwarf_Debug dbg, - Dwarf_Ptr space, - short alloc_type); -void _dwarf_simple_malloc_botch(int err); - -#endif /* DWARF_SIMPLE_MALLOC */ - - - - -/* - This macro adds the size of a pointer to the size of a - struct that is given to it. It rounds up the size to - be a multiple of the size of a pointer. This is done - so that every struct returned by _dwarf_get_alloc() - can be preceded by a pointer to the chunk it came from. - Before allocating, it checks if the size of struct is less than - the size of a pointer. If yes, it returns the size - of 2 pointers. The returned size should be at least - the size of 2 pointers, since the first points to the - chunk the struct was allocated from, and the second - is used to link the free list. - - We want DW_RESERVE to be at least the size of - a long long and at least the size of a pointer because - our struct has a long long and we want that aligned right. - Now Standard C defines long long as 8 bytes, so lets - make that standard. It will become unworkable when - long long or pointer grows beyound 8 bytes. - Unclear what to do with wierd requirements, like - 36 bit pointers. - - -*/ -#define DW_RESERVE 8 - -/* Round size up to the next multiple of DW_RESERVE bytes -*/ -#define ROUND_SIZE(inputsize) \ - (((inputsize) % (DW_RESERVE)) == 0 ? \ - (inputsize): \ - ((inputsize) + \ - (DW_RESERVE) - ((inputsize) % (DW_RESERVE)) )) - -#define ROUND_SIZE_WITH_POINTER(i_size) (ROUND_SIZE(i_size) + DW_RESERVE) - -/* SMALL_ALLOC is for trivia where allocation is a waste. - Things that should be removed, really. */ -#define SMALL_ALLOC 2 - -/* BASE_ALLOC is where a basic allocation makes sense, but 'not too large'. - No thorough evaluation of this value has been done, though - it was found wasteful of memory to have BASE_ALLOC be as large as - BIG_ALLOC. */ -#define BASE_ALLOC 64 - -/* BIG_ALLOC is where a larger-than-BASE_ALLOC - allocation makes sense, but still 'not too large'. - No thorough evaluation of this value has been done. */ -#define BIG_ALLOC 128 - -/* This translates into de_alloc_hdr index -** the 0,1,1 entries are special: they don't use the -** table values at all. -** Rearranging the DW_DLA values would break binary compatibility -** so that is not an option. -*/ -struct ial_s { - int ia_al_num; /* Index into de_alloc_hdr table. */ - - /* In bytes, one struct instance. This does not account for extra - space needed per block, but that (DW_RESERVE) will be added in - later where it is needed (DW_RESERVE space never added in here). - */ - int ia_struct_size; - - - /* Number of instances per alloc block. MUST be > 0. */ - int ia_base_count; - - int (*specialconstructor) (Dwarf_Debug, void *); - void (*specialdestructor) (void *); -}; - -static const -struct ial_s index_into_allocated[ALLOC_AREA_INDEX_TABLE_MAX] = { - {0, 1, 1, 0, 0}, /* none */ - {0, 1, 1, 0, 0}, /* 1 DW_DLA_STRING */ - {1, sizeof(Dwarf_Loc), BASE_ALLOC, 0, 0} - , /* 2 DW_DLA_LOC */ - {2, sizeof(Dwarf_Locdesc), BASE_ALLOC, 0, 0} - , /* 3 DW_DLA_LOCDESC */ - {0, 1, 1, 0, 0} - , /* not used *//* 4 DW_DLA_ELLIST */ - {0, 1, 1, 0, 0} - , /* not used *//* 5 DW_DLA_BOUNDS */ - {3, sizeof(Dwarf_Block), BASE_ALLOC, 0, 0} - , /* 6 DW_DLA_BLOCK */ - {0, 1, 1, 0, 0} - , /* the actual dwarf_debug structure *//* 7 DW_DLA_DEBUG */ - {4, sizeof(struct Dwarf_Die_s), BIG_ALLOC, 0, 0}, /* 8 DW_DLA_DIE - */ - {5, sizeof(struct Dwarf_Line_s), BIG_ALLOC, 0, 0}, /* 9 - DW_DLA_LINE */ - {6, sizeof(struct Dwarf_Attribute_s), BIG_ALLOC * 2, 0, 0}, - /* 10 DW_DLA_ATTR */ - {0, 1, 1, 0, 0}, /* not used *//* 11 DW_DLA_TYPE */ - {0, 1, 1, 0, 0}, /* not used *//* 12 DW_DLA_SUBSCR */ - {7, sizeof(struct Dwarf_Global_s), BASE_ALLOC, 0, 0}, /* 13 - DW_DLA_GLOBAL - */ - {8, sizeof(struct Dwarf_Error_s), BASE_ALLOC, 0, 0}, /* 14 - DW_DLA_ERROR - */ - {0, 1, 1, 0, 0}, /* 15 DW_DLA_LIST */ - {0, 1, 1, 0, 0}, /* not used *//* 16 DW_DLA_LINEBUF */ - {9, sizeof(struct Dwarf_Arange_s), BASE_ALLOC, 0, 0}, /* 17 - DW_DLA_ARANGE - */ - {10, sizeof(struct Dwarf_Abbrev_s), BIG_ALLOC, 0, 0}, /* 18 - DW_DLA_ABBREV - */ - {11, sizeof(Dwarf_Frame_Op), BIG_ALLOC, 0, 0} - , /* 19 DW_DLA_FRAME_OP */ - {12, sizeof(struct Dwarf_Cie_s), BASE_ALLOC, 0, 0}, /* 20 - DW_DLA_CIE */ - {13, sizeof(struct Dwarf_Fde_s), BASE_ALLOC, 0, 0}, /* 21 DW_DLA_FDE */ - {0, 1, 1, 0, 0}, /* 22 DW_DLA_LOC_BLOCK */ - {0, 1, 1, 0, 0}, /* 23 DW_DLA_FRAME_BLOCK */ - {14, sizeof(struct Dwarf_Global_s), BASE_ALLOC, 0, 0}, /* 24 DW_DLA_FUNC - UNUSED */ - {15, sizeof(struct Dwarf_Global_s), BASE_ALLOC, 0, 0}, /* 25 - DW_DLA_TYPENAME - UNUSED */ - {16, sizeof(struct Dwarf_Global_s), BASE_ALLOC, 0, 0}, /* 26 DW_DLA_VAR - UNUSED */ - {17, sizeof(struct Dwarf_Global_s), BASE_ALLOC, 0, 0}, /* 27 DW_DLA_WEAK - UNUSED */ - {0, 1, 1, 0, 0}, /* 28 DW_DLA_ADDR */ - {0, 1,1,0,0 }, /* 29 DW_DLA_RANGES */ - - /* The following DW_DLA data types - are known only inside libdwarf. */ - - {18, sizeof(struct Dwarf_Abbrev_List_s), BIG_ALLOC, 0, 0}, - /* 30 DW_DLA_ABBREV_LIST */ - - {19, sizeof(struct Dwarf_Chain_s), BIG_ALLOC, 0, 0}, /* 31 DW_DLA_CHAIN */ - {20, sizeof(struct Dwarf_CU_Context_s), BASE_ALLOC, 0, 0}, - /* 32 DW_DLA_CU_CONTEXT */ - {21, sizeof(struct Dwarf_Frame_s), BASE_ALLOC, - _dwarf_frame_constructor, - _dwarf_frame_destructor}, /* 33 DW_DLA_FRAME */ - {22, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 34 DW_DLA_GLOBAL_CONTEXT */ - {23, sizeof(struct Dwarf_File_Entry_s), BASE_ALLOC, 0, 0}, /* 34 */ - /* 35 DW_DLA_FILE_ENTRY */ - {24, sizeof(struct Dwarf_Line_Context_s), BASE_ALLOC, 0, 0}, - /* 36 DW_DLA_LINE_CONTEXT */ - {25, sizeof(struct Dwarf_Loc_Chain_s), BASE_ALLOC, 0, 0}, /* 36 */ - /* 37 DW_DLA_LOC_CHAIN */ - - {26, sizeof(struct Dwarf_Hash_Table_s),BASE_ALLOC, 0, 0}, /* 37 */ - /* 38 DW_DLA_HASH_TABLE */ - -/* The following really use Global struct: used to be unique struct - per type, but now merged (11/99). The opaque types - are visible in the interface. The types for - DW_DLA_FUNC, - DW_DLA_TYPENAME, DW_DLA_VAR, DW_DLA_WEAK also use - the global types. - -*/ - {27, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 39 DW_DLA_FUNC_CONTEXT */ - {28, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 40 DW_DLA_TYPENAME_CONTEXT */ - {29, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 41 DW_DLA_VAR_CONTEXT */ - {30, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 42 DW_DLA_WEAK_CONTEXT */ - {31, sizeof(struct Dwarf_Global_Context_s), BASE_ALLOC, 0, 0}, - /* 43 DW_DLA_PUBTYPES_CONTEXT DWARF3 */ - - {0,1,1,0,0 }, - /* 44 DW_DLA_HASH_TABLE_ENTRY */ - - -}; - -#ifndef DWARF_SIMPLE_MALLOC - -/* - This function is given a pointer to the header - structure that is used to allocate 1 struct of - the type given by alloc_type. It first checks - if a struct is available in its free list. If - not, it checks if 1 is available in its blob, - which is a chunk of memory that is reserved for - its use. If not, it malloc's a chunk. The - initial part of it is used to store the end - address of the chunk, and also to keep track - of the number of free structs in that chunk. - This information is used for freeing the chunk - when all the structs in it are free. - - Assume all input arguments have been validated. - - This function can be used only to allocate 1 - struct of the given type. - - It returns a pointer to the struct that the - user can use. It returns NULL only when it - is out of free structs, and cannot malloc - any more. The struct returned is zero-ed. - - A pointer to the chunk that the struct belongs - to is stored in the bytes preceding the - returned address. Since this pointer it - never overwritten, when a struct is allocated - from the free_list this pointer does not - have to be written. In the 2 other cases, - where the struct is allocated from a new - chunk, or the blob, a pointer to the chunk - is written. -*/ -static Dwarf_Ptr -_dwarf_find_memory(Dwarf_Alloc_Hdr alloc_hdr) -{ - /* Pointer to the struct allocated. */ - Dwarf_Small *ret_mem = 0; - - /* Pointer to info about chunks allocated. */ - Dwarf_Alloc_Area alloc_area; - - /* Size of chunk malloc'ed when no free structs left. */ - Dwarf_Signed mem_block_size; - - /* Pointer to block malloc'ed. */ - Dwarf_Small *mem_block; - - /* - Check the alloc_area from which the last allocation was made - (most recent new block). If that is not successful, then search - the list of alloc_area's from alloc_header. */ - alloc_area = alloc_hdr->ah_last_alloc_area; - if (alloc_area == NULL || alloc_area->aa_free_structs_in_chunk == 0) - for (alloc_area = alloc_hdr->ah_alloc_area_head; - alloc_area != NULL; alloc_area = alloc_area->aa_next) { - - if (alloc_area->aa_free_structs_in_chunk > 0) { - break; /* found a free entry! */ - } - - } - - if (alloc_area != NULL) { - alloc_area->aa_free_structs_in_chunk--; - - if (alloc_area->aa_free_list != NULL) { - ret_mem = alloc_area->aa_free_list; - - /* - Update the free list. The initial part of the struct is - used to hold a pointer to the next struct on the free - list. In this way, the free list chain is maintained at - 0 memory cost. */ - alloc_area->aa_free_list = - ((Dwarf_Free_List) ret_mem)->fl_next; - } else if (alloc_area->aa_blob_start < alloc_area->aa_blob_end) { - ret_mem = alloc_area->aa_blob_start; - - /* - Store pointer to chunk this struct belongs to in the - first few bytes. Return pointer to bytes after this - pointer storage. */ - *(Dwarf_Alloc_Area *) ret_mem = alloc_area; - ret_mem += DW_RESERVE; - - alloc_area->aa_blob_start += alloc_hdr->ah_bytes_one_struct; - } else { - /* else fall thru , though it should be impossible to fall - thru. And represents a disastrous programming error if - we get here. */ -#ifdef DEBUG - fprintf(stderr, "libdwarf Internal error start %x end %x\n", - (int) alloc_area->aa_blob_start, - (int) alloc_area->aa_blob_end); -#endif - } - } - - /* New memory has to malloc'ed since there are no free structs. */ - if (ret_mem == 0) { - Dwarf_Word rounded_area_hdr_size; - - alloc_hdr->ah_chunks_allocated++; - - { /* this nonsense avoids a warning */ - /* CONSTCOND would be better */ - unsigned long v = sizeof(struct Dwarf_Alloc_Area_s); - - rounded_area_hdr_size = ROUND_SIZE(v); - } - - /* - Allocate memory to contain the required number of structs - and the Dwarf_Alloc_Area_s to control it. */ - mem_block_size = alloc_hdr->ah_bytes_malloc_per_chunk + - rounded_area_hdr_size; - - mem_block = malloc(mem_block_size); - if (mem_block == NULL) { - return (NULL); - } - - - /* - Attach the Dwarf_Alloc_Area_s struct to the list of chunks - malloc'ed for this struct type. Also initialize the fields - of the Dwarf_Alloc_Area_s. */ - alloc_area = (Dwarf_Alloc_Area) mem_block; - alloc_area->aa_prev = 0; - if (alloc_hdr->ah_alloc_area_head != NULL) { - alloc_hdr->ah_alloc_area_head->aa_prev = alloc_area; - } - alloc_area->aa_free_list = 0; - alloc_area->aa_next = alloc_hdr->ah_alloc_area_head; - alloc_hdr->ah_alloc_area_head = alloc_area; - - alloc_area->aa_alloc_hdr = alloc_hdr; - alloc_area->aa_free_structs_in_chunk = - (Dwarf_Sword) alloc_hdr->ah_structs_per_chunk - 1; - if (alloc_area->aa_free_structs_in_chunk < 1) { - /* If we get here, there is a disastrous programming error - somewhere. */ -#ifdef DEBUG - fprintf(stderr, - "libdwarf Internal error: free structs in chunk %d\n", - (int) alloc_area->aa_free_structs_in_chunk); -#endif - return NULL; - } - - /* - The struct returned begins immediately after the - Dwarf_Alloc_Area_s struct. */ - ret_mem = mem_block + rounded_area_hdr_size; - alloc_area->aa_blob_start = - ret_mem + alloc_hdr->ah_bytes_one_struct; - alloc_area->aa_blob_end = mem_block + mem_block_size; - - /* - Store pointer to chunk this struct belongs to in the first - few bytes. Return pointer to bytes after this pointer - storage. */ - *(Dwarf_Alloc_Area *) ret_mem = alloc_area; - ret_mem += DW_RESERVE; - } - - alloc_hdr->ah_last_alloc_area = alloc_area; - alloc_hdr->ah_struct_user_holds++; - memset(ret_mem, 0, alloc_hdr->ah_bytes_one_struct - DW_RESERVE); - return (ret_mem); -} - -#endif /* ndef DWARF_SIMPLE_MALLOC */ - -/* - This function returns a pointer to a region - of memory. For alloc_types that are not - strings or lists of pointers, only 1 struct - can be requested at a time. This is indicated - by an input count of 1. For strings, count - equals the length of the string it will - contain, i.e it the length of the string - plus 1 for the terminating null. For lists - of pointers, count is equal to the number of - pointers. For DW_DLA_FRAME_BLOCK, DW_DLA_RANGES, and - DW_DLA_LOC_BLOCK allocation types also, count - is the count of the number of structs needed. - - This function cannot be used to allocate a - Dwarf_Debug_s struct. - -*/ -Dwarf_Ptr -_dwarf_get_alloc(Dwarf_Debug dbg, - Dwarf_Small alloc_type, Dwarf_Unsigned count) -{ - Dwarf_Alloc_Hdr alloc_hdr; - - Dwarf_Ptr ret_mem; - - Dwarf_Signed size = 0; - unsigned int index; - unsigned int type = alloc_type; - - if (dbg == NULL) { - return (NULL); - } - - if (type >= ALLOC_AREA_INDEX_TABLE_MAX) { - /* internal error */ - return NULL; - } - index = index_into_allocated[type].ia_al_num; - /* zero also illegal but not tested for */ - - /* If the Dwarf_Debug is not fully set up, we will get index 0 for - any type and must do something. 'Not fully set up' can only - happen for DW_DLA_ERROR, I (davea) believe, and for that we call - special code here.. */ - - if (index == 0) { - if (alloc_type == DW_DLA_STRING) { - size = count; - } else if (alloc_type == DW_DLA_LIST) { - size = count * sizeof(Dwarf_Ptr); - } else if (alloc_type == DW_DLA_FRAME_BLOCK) { - size = count * sizeof(Dwarf_Frame_Op); - } else if (alloc_type == DW_DLA_LOC_BLOCK) { - size = count * sizeof(Dwarf_Loc); - } else if (alloc_type == DW_DLA_HASH_TABLE_ENTRY) { - size = count * sizeof(struct Dwarf_Hash_Table_Entry_s); - } else if (alloc_type == DW_DLA_ADDR) { - size = count * - (sizeof(Dwarf_Addr) > sizeof(Dwarf_Off) ? - sizeof(Dwarf_Addr) : sizeof(Dwarf_Off)); - } else if (alloc_type == DW_DLA_RANGES) { - size = count * sizeof(Dwarf_Ranges); - } else if (alloc_type == DW_DLA_ERROR) { - void *m = _dwarf_special_no_dbg_error_malloc(); - - dwarf_malloc_check_alloc_data(m, DW_DLA_ERROR); - return m; - - } else { - /* If we get here, there is a disastrous programming error - somewhere. */ -#ifdef DEBUG - fprintf(stderr, - "libdwarf Internal error: type %d unexpected\n", - (int) type); -#endif - } - } else { - alloc_hdr = &dbg->de_alloc_hdr[index]; - if (alloc_hdr->ah_bytes_one_struct > 0) { -#ifdef DWARF_SIMPLE_MALLOC - size = alloc_hdr->ah_bytes_one_struct; -#else - { - void *m = _dwarf_find_memory(alloc_hdr); - - dwarf_malloc_check_alloc_data(m, type); - if (index_into_allocated[type].specialconstructor) { - int res = - index_into_allocated[type]. - specialconstructor(dbg, m); - if (res != DW_DLV_OK) { - /* We leak what we allocated in - _dwarf_find_memory when constructor fails. */ - return NULL; - } - } - return m; - } -#endif - - } else { - /* Special case: should not really happen at all. */ - if (type == DW_DLA_ERROR) { - /* dwarf_init failure. Because dbg is incomplete we - won't use it to record the malloc. */ - void *m = _dwarf_special_no_dbg_error_malloc(); - - dwarf_malloc_check_alloc_data(m, DW_DLA_ERROR); - return m; - } else { - /* If we get here, there is a disastrous programming - error somewhere. */ -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_botch(3); -#endif -#ifdef DEBUG - fprintf(stderr, - "libdwarf Internal error: Type %d unexpected\n", - (int) type); -#endif - } - } - } - - ret_mem = malloc(size); -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_add_to_list(dbg, ret_mem, (unsigned long) size, - type); -#endif - if (ret_mem != NULL) - memset(ret_mem, 0, size); - - dwarf_malloc_check_alloc_data(ret_mem, type); - if (index_into_allocated[type].specialconstructor) { - int res = - index_into_allocated[type].specialconstructor(dbg, ret_mem); - if (res != DW_DLV_OK) { - /* We leak what we allocated in _dwarf_find_memory when - constructor fails. */ - return NULL; - } - } - - return (ret_mem); -} - - - -/* - This function is used to deallocate a region of memory - that was obtained by a call to _dwarf_get_alloc. Note - that though dwarf_dealloc() is a public function, - _dwarf_get_alloc() isn't. - - For lists, typically arrays of pointers, it is assumed - that the space was allocated by a direct call to malloc, - and so a straight free() is done. This is also the case - for variable length blocks such as DW_DLA_FRAME_BLOCK - and DW_DLA_LOC_BLOCK and DW_DLA_RANGES. - - For strings, the pointer might point to a string in - .debug_info or .debug_string. After this is checked, - and if found not to be the case, a free() is done, - again on the assumption that a malloc was used to - obtain the space. - - For other types of structs, a pointer to the chunk that - the struct was allocated out of, is present in the bytes - preceding the pointer passed in. For this chunk it is - checked whether all the structs in that chunk are now free. - If so, the entire chunk is free_ed. Otherwise, the space - is added to the free list for that chunk, and the free count - incremented. - - This function does not return anything. -*/ -void -dwarf_dealloc(Dwarf_Debug dbg, - Dwarf_Ptr space, Dwarf_Unsigned alloc_type) -{ - Dwarf_Alloc_Hdr alloc_hdr; - Dwarf_Alloc_Area alloc_area; - unsigned int type = alloc_type; - unsigned int index; - - if (space == NULL) { - return; - } - if (type == DW_DLA_ERROR) { - /* Get pointer to Dwarf_Alloc_Area this struct came from. See - dwarf_alloc.h ROUND_SIZE_WITH_POINTER stuff */ - alloc_area = - *(Dwarf_Alloc_Area *) ((char *) space - DW_RESERVE); - if (alloc_area == 0) { - /* This is the special case of a failed dwarf_init(). Also - (and more signficantly) there are a variety of other - situations where libdwarf does not *know* what dbg is - involved (because of a libdwarf-caller-error) so - libdwarf uses NULL as the dbg. Those too wind up here. */ - _dwarf_free_special_error(space); - dwarf_malloc_check_dealloc_data(space, type); - return; - } - - } - if (dbg == NULL) { - /* App error, or an app that failed to succeed in a - dwarf_init() call. */ - return; - } - if (type >= ALLOC_AREA_INDEX_TABLE_MAX) { - /* internal or user app error */ - return; - } - - index = index_into_allocated[type].ia_al_num; - /* - A string pointer may point into .debug_info or .debug_string. - Otherwise, they are directly malloc'ed. */ - dwarf_malloc_check_dealloc_data(space, type); - if (index == 0) { - if (type == DW_DLA_STRING) { - if ((Dwarf_Small *) space >= dbg->de_debug_info.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_info.dss_data + dbg->de_debug_info.dss_size) - return; - - if (dbg->de_debug_line.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_line.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_line.dss_data + dbg->de_debug_line.dss_size) - return; - - if (dbg->de_debug_pubnames.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_pubnames.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_pubnames.dss_data + - dbg->de_debug_pubnames.dss_size) - return; - - if (dbg->de_debug_frame.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_frame.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_frame.dss_data + dbg->de_debug_frame.dss_size) - return; - - if (dbg->de_debug_str.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_str.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_str.dss_data + dbg->de_debug_str.dss_size) - return; - - if (dbg->de_debug_funcnames.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_funcnames.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_funcnames.dss_data + - dbg->de_debug_funcnames.dss_size) - return; - - if (dbg->de_debug_typenames.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_typenames.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_typenames.dss_data + - dbg->de_debug_typenames.dss_size) - return; - if (dbg->de_debug_pubtypes.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_pubtypes.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_pubtypes.dss_data + - dbg->de_debug_pubtypes.dss_size) - return; - - if (dbg->de_debug_varnames.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_varnames.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_varnames.dss_data + - dbg->de_debug_varnames.dss_size) - return; - - if (dbg->de_debug_weaknames.dss_data != NULL && - (Dwarf_Small *) space >= dbg->de_debug_weaknames.dss_data && - (Dwarf_Small *) space < - dbg->de_debug_weaknames.dss_data + - dbg->de_debug_weaknames.dss_size) - return; - -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_delete_from_list(dbg, space, type); -#endif - free(space); - return; - } - - if (type == DW_DLA_LIST || - type == DW_DLA_FRAME_BLOCK || - type == DW_DLA_LOC_BLOCK || type == DW_DLA_ADDR || - type == DW_DLA_RANGES || - type == DW_DLA_HASH_TABLE_ENTRY) { - -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_delete_from_list(dbg, space, type); -#endif - free(space); - return; - } - /* else is an alloc type that is not used */ - /* app or internal error */ -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_botch(4); -#endif - return; - - } - if (index_into_allocated[type].specialdestructor) { - index_into_allocated[type].specialdestructor(space); - } -#ifdef DWARF_SIMPLE_MALLOC - _dwarf_simple_malloc_delete_from_list(dbg, space, type); - free(space); -#else /* !DWARF_SIMPLE_MALLOC */ - alloc_hdr = &dbg->de_alloc_hdr[index]; - - /* Get pointer to Dwarf_Alloc_Area this struct came from. See - dwarf_alloc.h ROUND_SIZE_WITH_POINTER stuff */ - alloc_area = *(Dwarf_Alloc_Area *) ((char *) space - DW_RESERVE); - - /* ASSERT: alloc_area != NULL If NULL we could abort, let it - coredump below, or return, pretending all is well. We go on, - letting program crash. Is caller error. */ - - /* - Check that the alloc_hdr field of the alloc_area we have is - pointing to the right alloc_hdr. This is used to catch use of - incorrect deallocation code by the user. */ - if (alloc_area->aa_alloc_hdr != alloc_hdr) { - /* If we get here, the user has called dwarf_dealloc wrongly or - there is some other disastrous error. By leaking mem here we - try to be safe... */ -#ifdef DEBUG - fprintf(stderr, - "libdwarf Internal error: type %d hdr mismatch %lx %lx " - "area ptr %lx\n", - (int) type, - (long) alloc_area->aa_alloc_hdr, - (long) alloc_hdr, (long) alloc_area); -#endif - return; - } - - alloc_hdr->ah_struct_user_holds--; - alloc_area->aa_free_structs_in_chunk++; - - /* - Give chunk back to malloc only when every struct is freed */ - if (alloc_area->aa_free_structs_in_chunk == - alloc_hdr->ah_structs_per_chunk) { - if (alloc_area->aa_prev != NULL) { - alloc_area->aa_prev->aa_next = alloc_area->aa_next; - } else { - alloc_hdr->ah_alloc_area_head = alloc_area->aa_next; - } - - if (alloc_area->aa_next != NULL) { - alloc_area->aa_next->aa_prev = alloc_area->aa_prev; - } - - alloc_hdr->ah_chunks_allocated--; - - if (alloc_area == alloc_hdr->ah_last_alloc_area) { - alloc_hdr->ah_last_alloc_area = NULL; - } - memset(alloc_area, 0, sizeof(*alloc_area)); - free(alloc_area); - } - - else { - ((Dwarf_Free_List) space)->fl_next = alloc_area->aa_free_list; - alloc_area->aa_free_list = space; - } -#endif /* !DWARF_SIMPLE_MALLOC */ -} - - -/* - Allocates space for a Dwarf_Debug_s struct, - since one does not exist. -*/ -Dwarf_Debug -_dwarf_get_debug(void - ) -{ - Dwarf_Debug dbg; - - dbg = (Dwarf_Debug) malloc(sizeof(struct Dwarf_Debug_s)); - if (dbg == NULL) - return (NULL); - else - memset(dbg, 0, sizeof(struct Dwarf_Debug_s)); - return (dbg); -} - - -/* - Sets up the Dwarf_Debug_s struct for all the - allocation types currently defined. - Allocation types DW_DLA_STRING, DW_DLA_LIST, - DW_DLA_FRAME_BLOCK, DW_DLA_LOC_BLOCK, DW_DLA_RANGES are - malloc'ed directly. - - This routine should be called after _dwarf_setup(), - so that information about the sizes of the Dwarf - sections can be used to decide the number of - structs of each type malloc'ed. - - Also DW_DLA_ELLIST, DW_DLA_BOUNDS, DW_DLA_TYPE, - DW_DLA_SUBSCR, DW_DLA_LINEBUF allocation types - are currently not used. - The ah_bytes_one_struct and ah_structs_per_chunk fields for - these types have been set to 1 for efficiency - in dwarf_get_alloc(). - - Ah_alloc_num should be greater than 1 for all - types that are currently being used. - - Therefore, for these allocation types the - ah_bytes_one_struct, and ah_structs_per_chunk fields do not - need to be initialized. - - Being an internal routine, assume proper dbg. -*/ - -Dwarf_Debug -_dwarf_setup_debug(Dwarf_Debug dbg) -{ - int i; - - for (i = 1; i <= MAX_DW_DLA; i++) { - const struct ial_s *ialp = &index_into_allocated[i]; - unsigned int hdr_index = ialp->ia_al_num; - Dwarf_Word str_size = ialp->ia_struct_size; - Dwarf_Word str_count = ialp->ia_base_count; - Dwarf_Word rnded_size = ROUND_SIZE_WITH_POINTER(str_size); - - Dwarf_Alloc_Hdr alloc_hdr = &dbg->de_alloc_hdr[hdr_index]; - - alloc_hdr->ah_bytes_one_struct = (Dwarf_Half) rnded_size; - - /* ah_structs_per_chunk must be >0 else we are in trouble */ - alloc_hdr->ah_structs_per_chunk = str_count; - alloc_hdr->ah_bytes_malloc_per_chunk = rnded_size * str_count; - } - return (dbg); -} - -/* - This function prints out the statistics - collected on allocation of memory chunks. -*/ -void -dwarf_print_memory_stats(Dwarf_Debug dbg) -{ - Dwarf_Alloc_Hdr alloc_hdr; - Dwarf_Shalf i; - - /* - Alloc types start at 1, not 0. Hence, the first NULL string, and - also a size of MAX_DW_DLA + 1. */ - char *alloc_type_name[MAX_DW_DLA + 1] = { - "", - "DW_DLA_STRING", - "DW_DLA_LOC", - "DW_DLA_LOCDESC", - "DW_DLA_ELLIST", - "DW_DLA_BOUNDS", - "DW_DLA_BLOCK", - "DW_DLA_DEBUG", - "DW_DLA_DIE", - "DW_DLA_LINE", - "DW_DLA_ATTR", - "DW_DLA_TYPE", - "DW_DLA_SUBSCR", - "DW_DLA_GLOBAL", - "DW_DLA_ERROR", - "DW_DLA_LIST", - "DW_DLA_LINEBUF", - "DW_DLA_ARANGE", - "DW_DLA_ABBREV", - "DW_DLA_FRAME_OP", - "DW_DLA_CIE", - "DW_DLA_FDE", - "DW_DLA_LOC_BLOCK", - "DW_DLA_FRAME_BLOCK", - "DW_DLA_FUNC", - "DW_DLA_TYPENAME", - "DW_DLA_VAR", - "DW_DLA_WEAK", - "DW_DLA_ADDR", - "DW_DLA_RANGES", - "DW_DLA_ABBREV_LIST", - "DW_DLA_CHAIN", - "DW_DLA_CU_CONTEXT", - "DW_DLA_FRAME", - "DW_DLA_GLOBAL_CONTEXT", - "DW_DLA_FILE_ENTRY", - "DW_DLA_LINE_CONTEXT", - "DW_DLA_LOC_CHAIN", - "DW_DLA_HASH_TABLE", - "DW_DLA_FUNC_CONTEXT", - "DW_DLA_TYPENAME_CONTEXT", - "DW_DLA_VAR_CONTEXT", - "DW_DLA_WEAK_CONTEXT", - "DW_DLA_PUBTYPES_CONTEXT", - "DW_DLA_HASH_TABLE_ENTRY", - }; - - if (dbg == NULL) - return; - - printf("Size of Dwarf_Debug %4ld bytes\n", - (long) sizeof(*dbg)); - printf("Size of Dwarf_Alloc_Hdr_s %4ld bytes\n", - (long) sizeof(struct Dwarf_Alloc_Hdr_s)); - printf("size of Dwarf_Alloc_Area_s %4ld bytes\n", - (long) sizeof(struct Dwarf_Alloc_Area_s)); - - printf(" Alloc Type Curr Structs byt str\n"); - printf(" ---------- ---- ------- per per\n"); - for (i = 1; i <= MAX_DW_DLA; i++) { - int indx = index_into_allocated[i].ia_al_num; - - alloc_hdr = &dbg->de_alloc_hdr[indx]; - if (alloc_hdr->ah_bytes_one_struct != 1) { - printf("%2d %-25s %6d %8d %6d %6d\n", - (int) i, - alloc_type_name[i], - (int) alloc_hdr->ah_chunks_allocated, - (int) alloc_hdr->ah_struct_user_holds, - (int) alloc_hdr->ah_bytes_malloc_per_chunk, - (int) alloc_hdr->ah_structs_per_chunk); - } - } -} - - -#ifndef DWARF_SIMPLE_MALLOC -/* - This recursively frees - the chunks still allocated, and - forward chained through the aa_next - pointer. -*/ -static void -_dwarf_recursive_free(Dwarf_Alloc_Area alloc_area) -{ - if (alloc_area->aa_next != NULL) { - _dwarf_recursive_free(alloc_area->aa_next); - } - - alloc_area->aa_next = 0; - alloc_area->aa_prev = 0; - free(alloc_area); -} -#endif - -/* In the 'rela' relocation case we might have malloc'd - space to ensure it is read-write. In that case, free the space. */ -static void -rela_free(struct Dwarf_Section_s * sec) -{ - if (sec->dss_data_was_malloc) { - free(sec->dss_data); - } - sec->dss_data = 0; - sec->dss_data_was_malloc = 0; -} - -/* - Used to free all space allocated for this Dwarf_Debug. - The caller should assume that the Dwarf_Debug pointer - itself is no longer valid upon return from this function. - - In case of difficulty, this function simply returns quietly. -*/ -int -_dwarf_free_all_of_one_debug(Dwarf_Debug dbg) -{ - Dwarf_Alloc_Hdr alloc_hdr; - Dwarf_Shalf i; - Dwarf_CU_Context context = 0; - Dwarf_CU_Context nextcontext = 0; - - if (dbg == NULL) - return (DW_DLV_ERROR); - - /* To do complete validation that we have no surprising missing or - erroneous deallocs it is advisable to do the dwarf_deallocs here - that are not things the user can otherwise request. - Housecleaning. */ - - for (context = dbg->de_cu_context_list; - context; context = nextcontext) { - Dwarf_Hash_Table hash_table = context->cc_abbrev_hash_table; - _dwarf_free_abbrev_hash_table_contents(dbg,hash_table); - nextcontext = context->cc_next; - dwarf_dealloc(dbg, hash_table, DW_DLA_HASH_TABLE); - dwarf_dealloc(dbg, context, DW_DLA_CU_CONTEXT); - } - - /* Housecleaning done. Now really free all the space. */ -#ifdef DWARF_SIMPLE_MALLOC - if (dbg->de_simple_malloc_base) { - struct simple_malloc_record_s *smp = dbg->de_simple_malloc_base; - - while (smp) { - int i; - struct simple_malloc_record_s *prev_smp = 0; - - for (i = 0; i < smp->sr_used; ++i) { - struct simple_malloc_entry_s *cur; - - cur = &smp->sr_entry[i]; - if (cur->se_addr != 0) { - free(cur->se_addr); - cur->se_addr = 0; - } - } - prev_smp = smp; - smp = smp->sr_next; - free(prev_smp); - } - dbg->de_simple_malloc_base = 0; - } -#else - for (i = 1; i < ALLOC_AREA_REAL_TABLE_MAX; i++) { - int indx = i; - - alloc_hdr = &dbg->de_alloc_hdr[indx]; - if (alloc_hdr->ah_alloc_area_head != NULL) { - _dwarf_recursive_free(alloc_hdr->ah_alloc_area_head); - } - } - -#endif - rela_free(&dbg->de_debug_info); - rela_free(&dbg->de_debug_abbrev); - rela_free(&dbg->de_debug_line); - rela_free(&dbg->de_debug_loc); - rela_free(&dbg->de_debug_aranges); - rela_free(&dbg->de_debug_macinfo); - rela_free(&dbg->de_debug_pubnames); - rela_free(&dbg->de_debug_str); - rela_free(&dbg->de_debug_frame); - rela_free(&dbg->de_debug_frame_eh_gnu); - rela_free(&dbg->de_debug_pubtypes); - rela_free(&dbg->de_debug_funcnames); - rela_free(&dbg->de_debug_typenames); - rela_free(&dbg->de_debug_varnames); - rela_free(&dbg->de_debug_weaknames); - rela_free(&dbg->de_debug_ranges); - dwarf_harmless_cleanout(&dbg->de_harmless_errors); - - memset(dbg, 0, sizeof(*dbg)); /* Prevent accidental use later. */ - free(dbg); - return (DW_DLV_OK); -} - -/* A special case: we have no dbg, no alloc header etc. - So create something out of thin air that we can recognize - in dwarf_dealloc. - Something with the prefix (prefix space hidden from caller). - - Only applies to DW_DLA_ERROR, making up an error record. -*/ - -struct Dwarf_Error_s * -_dwarf_special_no_dbg_error_malloc(void) -{ - /* the union unused things are to guarantee proper alignment */ - union u { - Dwarf_Alloc_Area ptr_not_used; - struct Dwarf_Error_s base_not_used; - char data_space[sizeof(struct Dwarf_Error_s) + - (DW_RESERVE * 2)]; - }; - char *mem; - - mem = malloc(sizeof(union u)); - - if (mem == 0) { - return 0; - - } - memset(mem, 0, sizeof(union u)); - mem += DW_RESERVE; - return (struct Dwarf_Error_s *) mem; -} - -/* The free side of _dwarf_special_no_dbg_error_malloc() -*/ -static void -_dwarf_free_special_error(Dwarf_Ptr space) -{ - char *mem = (char *) space; - - mem -= DW_RESERVE; - free(mem); -} - - -#ifdef DWARF_SIMPLE_MALLOC -/* here solely for planting a breakpoint. */ -/* ARGSUSED */ -void -_dwarf_simple_malloc_botch(int err) -{ - fprintf(stderr,"simple malloc botch %d\n",err); -} -static void -_dwarf_simple_malloc_add_to_list(Dwarf_Debug dbg, - Dwarf_Ptr addr, - unsigned long size, short alloc_type) -{ - struct simple_malloc_record_s *cur; - struct simple_malloc_entry_s *newentry; - - if (!dbg->de_simple_malloc_base) { - /* First entry to this routine. */ - dbg->de_simple_malloc_base = - malloc(sizeof(struct simple_malloc_record_s)); - if (!dbg->de_simple_malloc_base) { - _dwarf_simple_malloc_botch(7); - return; /* no memory, give up */ - } - memset(dbg->de_simple_malloc_base, - 0, sizeof(struct simple_malloc_record_s)); - } - cur = dbg->de_simple_malloc_base; - - if (cur->sr_used >= DSM_BLOCK_COUNT) { - /* Better not be > than as that means chaos */ - - /* Create a new block to link at the head. */ - - struct simple_malloc_record_s *newblock = - malloc(sizeof(struct simple_malloc_record_s)); - if (!newblock) { - _dwarf_simple_malloc_botch(8); - return; /* Can do nothing, out of memory */ - } - memset(newblock, 0, sizeof(struct simple_malloc_record_s)); - /* Link the new block at the head of the chain, and make it - 'current' */ - dbg->de_simple_malloc_base = newblock; - newblock->sr_next = cur; - cur = newblock; - } - newentry = &cur->sr_entry[cur->sr_used]; - newentry->se_addr = addr; - newentry->se_size = size; - newentry->se_type = alloc_type; - ++cur->sr_used; -} - -/* - DWARF_SIMPLE_MALLOC: testing the hypothesis that the existing - malloc scheme here (see _dwarf_get_alloc()) is pointless complexity. - - DWARF_SIMPLE_MALLOC also makes it easy for a malloc-tracing - tool to verify libdwarf malloc has no botches (though of course - such does not test the complicated standard-libdwarf-alloc code). - - To properly answer the question, the simple-malloc allocate - and delete should be something other than a simple list. - Perhaps a heap, or perhaps a red-black tree. - -*/ -static void -_dwarf_simple_malloc_delete_from_list(Dwarf_Debug dbg, - Dwarf_Ptr space, short alloc_type) -{ - if (space == 0) { - _dwarf_simple_malloc_botch(6); - } - if (dbg->de_simple_malloc_base) { - struct simple_malloc_record_s *smp = dbg->de_simple_malloc_base; - - while (smp) { - int i; - - for (i = 0; i < smp->sr_used; ++i) { - struct simple_malloc_entry_s *cur; - - cur = &smp->sr_entry[i]; - if (cur->se_addr == space) { - if (cur->se_type != alloc_type) { - _dwarf_simple_malloc_botch(0); - } - cur->se_addr = 0; - return; - } - } - smp = smp->sr_next; - } - } - /* Never found the space. */ - _dwarf_simple_malloc_botch(1); - return; - -} -#endif diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_alloc.h b/usr/src/tools/ctf/dwarf/common/dwarf_alloc.h deleted file mode 100644 index 3a61c692c6..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_alloc.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - - Copyright (C) 2000,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - -/* #define DWARF_SIMPLE_MALLOC 1 */ - -Dwarf_Ptr _dwarf_get_alloc(Dwarf_Debug, Dwarf_Small, Dwarf_Unsigned); -Dwarf_Debug _dwarf_get_debug(void); -Dwarf_Debug _dwarf_setup_debug(Dwarf_Debug); -int _dwarf_free_all_of_one_debug(Dwarf_Debug); - -typedef struct Dwarf_Alloc_Area_s *Dwarf_Alloc_Area; -typedef struct Dwarf_Free_List_s *Dwarf_Free_List; - -/* ALLOC_AREA_INDEX_TABLE_MAX is the size of the - struct ial_s index_into_allocated array in dwarf_alloc.c -*/ -#define ALLOC_AREA_INDEX_TABLE_MAX 45 -/* ALLOC_AREA_REAL_TABLE_MAX is the size of the array needed - to hold pointers to dwarf alloc chunk areas. - It's smaller as some of the index_into_allocated - entries (they look like {0,1,1,0,0} ) - are treated specially and don't use 'chunks'. -*/ -#define ALLOC_AREA_REAL_TABLE_MAX 32 - -/* - This struct is used to chain all the deallocated - structs on the free list of each chain. The structs - are chained internally, by using the memory they - contain. -*/ -struct Dwarf_Free_List_s { - Dwarf_Free_List fl_next; -}; - - -/* - This struct is used to manage all the chunks malloc'ed - for a particular alloc_type. Many of the fields are - initialized by dwarf_init(). -*/ -struct Dwarf_Alloc_Hdr_s { - - /* Count of actual number of structs user app holds pointers to - currently. */ - Dwarf_Sword ah_struct_user_holds; - - /* - Size of each struct that will be allocated for this alloc_type. - Initialized by dwarf_init(). */ - Dwarf_Half ah_bytes_one_struct; - - /* - Number of structs of this alloc_type that will be contained in - each chunk that is malloc'ed. Initialized by dwarf_init(). */ - Dwarf_Word ah_structs_per_chunk; - - /* - Number of bytes malloc'ed per chunk which is basically - (ah_bytes_one_struct+_DWARF_RESERVE) * ah_alloc_num. */ - Dwarf_Word ah_bytes_malloc_per_chunk; - - /* Count of chunks currently allocated for type. */ - Dwarf_Sword ah_chunks_allocated; - - /* - Points to a chain of Dwarf_Alloc_Area_s structs that represent - all the chunks currently allocated for the alloc_type. */ - Dwarf_Alloc_Area ah_alloc_area_head; - - /* Last Alloc Area that was allocated by malloc. The - free-space-search area looks here first and only if it is full - goes thru the list pointed to by ah_alloc_area_head. */ - Dwarf_Alloc_Area ah_last_alloc_area; -}; - - -/* - This struct is used to manage each chunk that is - malloc'ed for a particular alloc_type. For each - allocation type, the allocation header points to - a list of all the chunks malloc'ed for that type. -*/ -struct Dwarf_Alloc_Area_s { - - /* Points to the free list of structs in the chunk. */ - Dwarf_Ptr aa_free_list; - - /* - Count of the number of free structs in the chunk. This includes - both those on the free list, and in the blob. */ - Dwarf_Sword aa_free_structs_in_chunk; - - /* - Points to the first byte of the blob from which struct will be - allocated. A struct is put on the free_list only when it - dwarf_deallocated. Initial allocations are from the blob. */ - Dwarf_Small *aa_blob_start; - - /* Points just past the last byte of the blob. */ - Dwarf_Small *aa_blob_end; - - /* Points to alloc_hdr this alloc_area is linked to: The owner, in - other words. */ - Dwarf_Alloc_Hdr aa_alloc_hdr; - - /* - Used for chaining Dwarf_Alloc_Area_s atructs. Alloc areas are - doubly linked to enable deletion from the list in constant time. */ - Dwarf_Alloc_Area aa_next; - Dwarf_Alloc_Area aa_prev; -}; - -struct Dwarf_Error_s *_dwarf_special_no_dbg_error_malloc(void); - -#ifdef DWARF_SIMPLE_MALLOC -/* - DWARF_SIMPLE_MALLOC is for testing the hypothesis that the existing - complex malloc scheme in libdwarf is pointless complexity. - - DWARF_SIMPLE_MALLOC also makes it easy for a malloc-tracing - tool to verify libdwarf malloc has no botches (though of course - such does not test the complicated standard-libdwarf-alloc code). - -*/ - -struct simple_malloc_entry_s { - Dwarf_Small *se_addr; - unsigned long se_size; - short se_type; -}; -#define DSM_BLOCK_COUNT (1000) -#define DSM_BLOCK_SIZE (sizeof(struct simple_malloc_entry_s)*DSM_BLOCK_COUNT) - -/* we do this so dwarf_dealloc can really free everything */ -struct simple_malloc_record_s { - struct simple_malloc_record_s *sr_next; - int sr_used; - struct simple_malloc_entry_s sr_entry[DSM_BLOCK_COUNT]; -}; - - - -#endif /* DWARF_SIMPLE_MALLOC */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_arange.c b/usr/src/tools/ctf/dwarf/common/dwarf_arange.c deleted file mode 100644 index e7ad8acc5e..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_arange.c +++ /dev/null @@ -1,593 +0,0 @@ -/* - - Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_arange.h" -#include "dwarf_global.h" /* for _dwarf_fixup_* */ - - -/* Common code for two user-visible routines to share. - Errors here result in memory leaks, but errors here - are serious (making aranges unusable) so we assume - callers will not repeat the error often or mind the leaks. -*/ -static int -dwarf_get_aranges_list(Dwarf_Debug dbg, - Dwarf_Chain * chain_out, - Dwarf_Signed * chain_count_out, - Dwarf_Error * error) -{ - /* Sweeps through the arange. */ - Dwarf_Small *arange_ptr = 0; - Dwarf_Small *arange_ptr_start = 0; - - /* Start of arange header. Used for rounding offset of arange_ptr - to twice the tuple size. Libdwarf requirement. */ - Dwarf_Small *header_ptr = 0; - - /* Version of .debug_aranges header. */ - Dwarf_Half version = 0; - - /* Offset of current set of aranges into .debug_info. */ - Dwarf_Off info_offset = 0; - - /* Size in bytes of addresses in target. */ - Dwarf_Small address_size = 0; - - /* Size in bytes of segment offsets in target. */ - Dwarf_Small segment_size = 0; - - /* Count of total number of aranges. */ - Dwarf_Unsigned arange_count = 0; - - Dwarf_Arange arange = 0; - - /* Used to chain Dwarf_Aranges structs. */ - Dwarf_Chain curr_chain = NULL; - Dwarf_Chain prev_chain = NULL; - Dwarf_Chain head_chain = NULL; - - arange_ptr = dbg->de_debug_aranges.dss_data; - arange_ptr_start = arange_ptr; - do { - /* Length of current set of aranges. */ - Dwarf_Unsigned length = 0; - Dwarf_Small remainder = 0; - Dwarf_Small *arange_ptr_past_end = 0; - Dwarf_Unsigned range_entry_size = 0; - - int local_length_size; - - /*REFERENCED*/ /* Not used in this instance of the macro */ - int local_extension_size = 0; - - header_ptr = arange_ptr; - - /* READ_AREA_LENGTH updates arange_ptr for consumed bytes */ - READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned, - arange_ptr, local_length_size, - local_extension_size); - arange_ptr_past_end = arange_ptr + length; - - - READ_UNALIGNED(dbg, version, Dwarf_Half, - arange_ptr, sizeof(Dwarf_Half)); - arange_ptr += sizeof(Dwarf_Half); - length = length - sizeof(Dwarf_Half); - if (version != CURRENT_VERSION_STAMP) { - _dwarf_error(dbg, error, DW_DLE_VERSION_STAMP_ERROR); - return (DW_DLV_ERROR); - } - - READ_UNALIGNED(dbg, info_offset, Dwarf_Off, - arange_ptr, local_length_size); - arange_ptr += local_length_size; - length = length - local_length_size; - if (info_offset >= dbg->de_debug_info.dss_size) { - FIX_UP_OFFSET_IRIX_BUG(dbg, info_offset, - "arange info offset.a"); - if (info_offset >= dbg->de_debug_info.dss_size) { - _dwarf_error(dbg, error, DW_DLE_ARANGE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - } - - address_size = *(Dwarf_Small *) arange_ptr; - /* It is not an error if the sizes differ. - Unusual, but not an error. */ - arange_ptr = arange_ptr + sizeof(Dwarf_Small); - length = length - sizeof(Dwarf_Small); - - segment_size = *(Dwarf_Small *) arange_ptr; - arange_ptr = arange_ptr + sizeof(Dwarf_Small); - length = length - sizeof(Dwarf_Small); - if (segment_size != 0) { - _dwarf_error(dbg, error, DW_DLE_SEGMENT_SIZE_BAD); - return (DW_DLV_ERROR); - } - - range_entry_size = 2*address_size + segment_size; - /* Round arange_ptr offset to next multiple of address_size. */ - remainder = (Dwarf_Unsigned) (arange_ptr - header_ptr) % - (range_entry_size); - if (remainder != 0) { - arange_ptr = arange_ptr + (2 * address_size) - remainder; - length = length - ((2 * address_size) - remainder); - } - do { - Dwarf_Addr range_address = 0; - Dwarf_Unsigned segment_selector = 0; - Dwarf_Unsigned range_length = 0; - /* For segmented address spaces, the first field to - read is a segment selector (new in DWARF4) */ - if(version == 4 && segment_size != 0) { - READ_UNALIGNED(dbg, segment_selector, Dwarf_Unsigned, - arange_ptr, segment_size); - arange_ptr += address_size; - length = length - address_size; - } - - READ_UNALIGNED(dbg, range_address, Dwarf_Addr, - arange_ptr, address_size); - arange_ptr += address_size; - length = length - address_size; - - READ_UNALIGNED(dbg, range_length, Dwarf_Unsigned, - arange_ptr, address_size); - arange_ptr += address_size; - length = length - address_size; - - { /* We used to suppress all-zero entries, but - now we return all aranges entries so we show - the entire content. March 31, 2010. */ - - arange = (Dwarf_Arange) - _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1); - if (arange == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - arange->ar_segment_selector = segment_selector; - arange->ar_segment_selector_size = segment_size; - arange->ar_address = range_address; - arange->ar_length = range_length; - arange->ar_info_offset = info_offset; - arange->ar_dbg = dbg; - arange_count++; - - curr_chain = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_chain->ch_item = arange; - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - } - /* The current set of ranges is terminated by - range_address 0 and range_length 0, but that - does not necessarily terminate the ranges for this CU! - There can be multiple sets in that DWARF - does not explicitly forbid multiple sets. - DWARF2,3,4 section 7.20 - We stop short to avoid overrun of the end of the CU. - */ - - } while (arange_ptr_past_end >= (arange_ptr + range_entry_size)); - - /* A compiler could emit some padding bytes here. dwarf2/3 - (dwarf4 sec 7.20) does not clearly make extra padding - bytes illegal. */ - if (arange_ptr_past_end < arange_ptr) { - char buf[200]; - Dwarf_Unsigned pad_count = arange_ptr - arange_ptr_past_end; - Dwarf_Unsigned offset = arange_ptr - arange_ptr_start; - snprintf(buf,sizeof(buf),"DW_DLE_ARANGE_LENGTH_BAD." - " 0x%" DW_PR_DUx - " pad bytes at offset 0x%" DW_PR_DUx - " in .debug_aranges", - pad_count, offset); - dwarf_insert_harmless_error(dbg,buf); - } - /* For most compilers, arange_ptr == arange_ptr_past_end at - this point. But not if there were padding bytes */ - arange_ptr = arange_ptr_past_end; - } while (arange_ptr < - dbg->de_debug_aranges.dss_data + dbg->de_debug_aranges.dss_size); - - if (arange_ptr != - dbg->de_debug_aranges.dss_data + dbg->de_debug_aranges.dss_size) { - _dwarf_error(dbg, error, DW_DLE_ARANGE_DECODE_ERROR); - return (DW_DLV_ERROR); - } - *chain_out = head_chain; - *chain_count_out = arange_count; - return DW_DLV_OK; -} - -/* - This function returns the count of the number of - aranges in the .debug_aranges section. It sets - aranges to point to a block of Dwarf_Arange's - describing the arange's. It returns DW_DLV_ERROR - on error. - - Must be identical in most aspects to - dwarf_get_aranges_addr_offsets! - -*/ -int -dwarf_get_aranges(Dwarf_Debug dbg, - Dwarf_Arange ** aranges, - Dwarf_Signed * returned_count, Dwarf_Error * error) -{ - /* Count of total number of aranges. */ - Dwarf_Signed arange_count = 0; - - Dwarf_Arange *arange_block = 0; - - /* Used to chain Dwarf_Aranges structs. */ - Dwarf_Chain curr_chain = NULL; - Dwarf_Chain prev_chain = NULL; - Dwarf_Chain head_chain = NULL; - Dwarf_Unsigned i = 0; - int res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_aranges, error); - if (res != DW_DLV_OK) { - return res; - } - - res = dwarf_get_aranges_list(dbg,&head_chain,&arange_count,error); - if(res != DW_DLV_OK) { - return res; - } - - arange_block = (Dwarf_Arange *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, arange_count); - if (arange_block == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_chain = head_chain; - for (i = 0; i < arange_count; i++) { - *(arange_block + i) = curr_chain->ch_item; - prev_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); - } - - *aranges = arange_block; - *returned_count = (arange_count); - return DW_DLV_OK; -} - -/* - This function returns DW_DLV_OK if it succeeds - and DW_DLV_ERR or DW_DLV_OK otherwise. - count is set to the number of addresses in the - .debug_aranges section. - For each address, the corresponding element in - an array is set to the address itself(aranges) and - the section offset (offsets). - Must be identical in most aspects to - dwarf_get_aranges! -*/ -int -_dwarf_get_aranges_addr_offsets(Dwarf_Debug dbg, - Dwarf_Addr ** addrs, - Dwarf_Off ** offsets, - Dwarf_Signed * count, - Dwarf_Error * error) -{ - Dwarf_Unsigned i = 0; - - /* Used to chain Dwarf_Aranges structs. */ - Dwarf_Chain curr_chain = NULL; - Dwarf_Chain prev_chain = NULL; - Dwarf_Chain head_chain = NULL; - - Dwarf_Signed arange_count = 0; - Dwarf_Addr *arange_addrs = 0; - Dwarf_Off *arange_offsets = 0; - - int res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - - if (error != NULL) - *error = NULL; - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_aranges,error); - if (res != DW_DLV_OK) { - return res; - } - - res = dwarf_get_aranges_list(dbg,&head_chain,&arange_count,error); - if(res != DW_DLV_OK) { - return res; - } - - arange_addrs = (Dwarf_Addr *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count); - if (arange_addrs == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - arange_offsets = (Dwarf_Off *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count); - if (arange_offsets == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_chain = head_chain; - for (i = 0; i < arange_count; i++) { - Dwarf_Arange ar = curr_chain->ch_item; - - arange_addrs[i] = ar->ar_address; - arange_offsets[i] = ar->ar_info_offset; - prev_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, ar, DW_DLA_ARANGE); - dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); - } - *count = arange_count; - *offsets = arange_offsets; - *addrs = arange_addrs; - return (DW_DLV_OK); -} - - -/* - This function takes a pointer to a block - of Dwarf_Arange's, and a count of the - length of the block. It checks if the - given address is within the range of an - address range in the block. If yes, it - returns the appropriate Dwarf_Arange. - Otherwise, it returns DW_DLV_ERROR. -*/ -int -dwarf_get_arange(Dwarf_Arange * aranges, - Dwarf_Unsigned arange_count, - Dwarf_Addr address, - Dwarf_Arange * returned_arange, Dwarf_Error * error) -{ - Dwarf_Arange curr_arange = 0; - Dwarf_Unsigned i = 0; - - if (aranges == NULL) { - _dwarf_error(NULL, error, DW_DLE_ARANGES_NULL); - return (DW_DLV_ERROR); - } - for (i = 0; i < arange_count; i++) { - curr_arange = *(aranges + i); - if (address >= curr_arange->ar_address && - address < - curr_arange->ar_address + curr_arange->ar_length) { - *returned_arange = curr_arange; - return (DW_DLV_OK); - } - } - - return (DW_DLV_NO_ENTRY); -} - - -/* - This function takes an Dwarf_Arange, - and returns the offset of the first - die in the compilation-unit that the - arange belongs to. Returns DW_DLV_ERROR - on error. -*/ -int -dwarf_get_cu_die_offset(Dwarf_Arange arange, - Dwarf_Off * returned_offset, - Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Off offset = 0; - - if (arange == NULL) { - _dwarf_error(NULL, error, DW_DLE_ARANGE_NULL); - return (DW_DLV_ERROR); - } - dbg = arange->ar_dbg; - offset = arange->ar_info_offset; - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - } - *returned_offset = offset + _dwarf_length_of_cu_header(dbg, offset); - return DW_DLV_OK; -} - -/* - This function takes an Dwarf_Arange, - and returns the offset of the CU header - in the compilation-unit that the - arange belongs to. Returns DW_DLV_ERROR - on error. - Ensures .debug_info loaded so - the cu_offset is meaningful. -*/ -int -dwarf_get_arange_cu_header_offset(Dwarf_Arange arange, - Dwarf_Off * cu_header_offset_returned, - Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - if (arange == NULL) { - _dwarf_error(NULL, error, DW_DLE_ARANGE_NULL); - return (DW_DLV_ERROR); - } - dbg = arange->ar_dbg; - /* Like dwarf_get_arange_info this ensures debug_info loaded: - the cu_header is in debug_info and will be used else - we would not call dwarf_get_arange_cu_header_offset. */ - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - if (res != DW_DLV_OK) { - return res; - } - } - *cu_header_offset_returned = arange->ar_info_offset; - return DW_DLV_OK; -} - - - - -/* - This function takes a Dwarf_Arange, and returns - true if it is not NULL. It also stores the start - address of the range in *start, the length of the - range in *length, and the offset of the first die - in the compilation-unit in *cu_die_offset. It - returns false on error. - If cu_die_offset returned ensures .debug_info loaded so - the cu_die_offset is meaningful. -*/ -int -dwarf_get_arange_info(Dwarf_Arange arange, - Dwarf_Addr * start, - Dwarf_Unsigned * length, - Dwarf_Off * cu_die_offset, Dwarf_Error * error) -{ - if (arange == NULL) { - _dwarf_error(NULL, error, DW_DLE_ARANGE_NULL); - return (DW_DLV_ERROR); - } - - if (start != NULL) - *start = arange->ar_address; - if (length != NULL) - *length = arange->ar_length; - if (cu_die_offset != NULL) { - Dwarf_Debug dbg = arange->ar_dbg; - Dwarf_Off offset = arange->ar_info_offset; - - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - if (res != DW_DLV_OK) { - return res; - } - } - *cu_die_offset = - offset + _dwarf_length_of_cu_header(dbg, offset); - } - return (DW_DLV_OK); -} - - -/* New for DWARF4, entries may have segment information. - *segment is only meaningful if *segment_entry_size is non-zero. */ -int -dwarf_get_arange_info_b(Dwarf_Arange arange, - Dwarf_Unsigned* segment, - Dwarf_Unsigned* segment_entry_size, - Dwarf_Addr * start, - Dwarf_Unsigned* length, - Dwarf_Off * cu_die_offset, - Dwarf_Error * error) -{ - if (arange == NULL) { - _dwarf_error(NULL, error, DW_DLE_ARANGE_NULL); - return (DW_DLV_ERROR); - } - - if(segment != NULL) { - *segment = arange->ar_segment_selector; - } - if(segment_entry_size != NULL) { - *segment_entry_size = arange->ar_segment_selector_size; - } - if (start != NULL) - *start = arange->ar_address; - if (length != NULL) - *length = arange->ar_length; - if (cu_die_offset != NULL) { - Dwarf_Debug dbg = arange->ar_dbg; - Dwarf_Off offset = arange->ar_info_offset; - - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - if (res != DW_DLV_OK) { - return res; - } - } - *cu_die_offset = - offset + _dwarf_length_of_cu_header(dbg, offset); - } - return (DW_DLV_OK); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_arange.h b/usr/src/tools/ctf/dwarf/common/dwarf_arange.h deleted file mode 100644 index d6c537c452..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_arange.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - - Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* This structure is used to read an arange into. */ -struct Dwarf_Arange_s { - - /* The segment selector. Only non-zero if Dwarf4, only - meaningful if ar_segment_selector_size non-zero */ - Dwarf_Unsigned ar_segment_selector; - - /* Starting address of the arange, ie low-pc. */ - Dwarf_Addr ar_address; - - /* Length of the arange. */ - Dwarf_Unsigned ar_length; - - - /* - Offset into .debug_info of the start of the compilation-unit - containing this set of aranges. */ - Dwarf_Off ar_info_offset; - - /* Corresponding Dwarf_Debug. */ - Dwarf_Debug ar_dbg; - - Dwarf_Half ar_segment_selector_size; -}; - - - -int - _dwarf_get_aranges_addr_offsets(Dwarf_Debug dbg, - Dwarf_Addr ** addrs, - Dwarf_Off ** offsets, - Dwarf_Signed * count, - Dwarf_Error * error); diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_base_types.h b/usr/src/tools/ctf/dwarf/common/dwarf_base_types.h deleted file mode 100644 index 00e2700a81..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_base_types.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - - Copyright (C) 2000,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "libdwarfdefs.h" - -#define true 1 -#define false 0 - -/* to identify a cie */ -#define DW_CIE_ID ~(0x0) -#define DW_CIE_VERSION 1 /* DWARF2 */ -#define DW_CIE_VERSION3 3 /* DWARF3 */ -#define DW_CIE_VERSION4 4 /* DWARF4 */ - -#define DW_CU_VERSION2 2 -#define DW_CU_VERSION3 3 -#define DW_CU_VERSION4 4 - -/* DWARF2,3 and 4 */ -#define DW_ARANGES_VERSION2 2 - -#define DW_LINE_VERSION2 2 -#define DW_LINE_VERSION3 3 -#define DW_LINE_VERSION4 4 - - -/* - These are allocation type codes for structs that - are internal to the Libdwarf Consumer library. -*/ -#define DW_DLA_ABBREV_LIST DW_DLA_RANGES + 1 -#define DW_DLA_CHAIN DW_DLA_RANGES + 2 -#define DW_DLA_CU_CONTEXT DW_DLA_RANGES + 3 -#define DW_DLA_FRAME DW_DLA_RANGES + 4 -#define DW_DLA_GLOBAL_CONTEXT DW_DLA_RANGES + 5 -#define DW_DLA_FILE_ENTRY DW_DLA_RANGES + 6 -#define DW_DLA_LINE_CONTEXT DW_DLA_RANGES + 7 -#define DW_DLA_LOC_CHAIN DW_DLA_RANGES + 8 -#define DW_DLA_HASH_TABLE DW_DLA_RANGES + 9 -#define DW_DLA_FUNC_CONTEXT DW_DLA_RANGES + 10 -#define DW_DLA_TYPENAME_CONTEXT DW_DLA_RANGES + 11 -#define DW_DLA_VAR_CONTEXT DW_DLA_RANGES + 12 -#define DW_DLA_WEAK_CONTEXT DW_DLA_RANGES + 13 -#define DW_DLA_PUBTYPES_CONTEXT DW_DLA_RANGES + 14 /* DWARF3 */ -#define DW_DLA_HASH_TABLE_ENTRY DW_DLA_RANGES + 15 - -/* Maximum number of allocation types for allocation routines. */ -#define MAX_DW_DLA DW_DLA_HASH_TABLE_ENTRY - -/*Dwarf_Word is unsigned word usable for index, count in memory */ -/*Dwarf_Sword is signed word usable for index, count in memory */ -/* The are 32 or 64 bits depending if 64 bit longs or not, which -** fits the ILP32 and LP64 models -** These work equally well with ILP64. -*/ - -typedef unsigned long Dwarf_Word; -typedef signed long Dwarf_Sword; - -typedef signed char Dwarf_Sbyte; -typedef unsigned char Dwarf_Ubyte; -typedef signed short Dwarf_Shalf; -typedef Dwarf_Small *Dwarf_Byte_Ptr; - -/* these 2 are fixed sizes which must not vary with the -** ILP32/LP64 model. Between these two, stay at 32 bit. -*/ -typedef __uint32_t Dwarf_ufixed; -typedef __int32_t Dwarf_sfixed; - -/* - In various places the code mistakenly associates - forms 8 bytes long with Dwarf_Signed or Dwarf_Unsigned - This is not a very portable assumption. - The following should be used instead for 64 bit integers. -*/ -typedef __uint64_t Dwarf_ufixed64; -typedef __int64_t Dwarf_sfixed64; - - -typedef struct Dwarf_Abbrev_List_s *Dwarf_Abbrev_List; -typedef struct Dwarf_File_Entry_s *Dwarf_File_Entry; -typedef struct Dwarf_CU_Context_s *Dwarf_CU_Context; -typedef struct Dwarf_Hash_Table_s *Dwarf_Hash_Table; -typedef struct Dwarf_Hash_Table_Entry_s *Dwarf_Hash_Table_Entry; - - -typedef struct Dwarf_Alloc_Hdr_s *Dwarf_Alloc_Hdr; diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.c b/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.c deleted file mode 100644 index 4ba9f2aded..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.c +++ /dev/null @@ -1,855 +0,0 @@ -/* - - Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#ifdef HAVE_ELF_H -#include <elf.h> -#endif -#include <stdio.h> -#include "dwarf_die_deliv.h" - - -/* - For a given Dwarf_Debug dbg, this function checks - if a CU that includes the given offset has been read - or not. If yes, it returns the Dwarf_CU_Context - for the CU. Otherwise it returns NULL. Being an - internal routine, it is assumed that a valid dbg - is passed. - - **This is a sequential search. May be too slow. - - If debug_info and debug_abbrev not loaded, this will - wind up returning NULL. So no need to load before calling - this. -*/ -static Dwarf_CU_Context -_dwarf_find_CU_Context(Dwarf_Debug dbg, Dwarf_Off offset) -{ - Dwarf_CU_Context cu_context = 0; - - if (offset >= dbg->de_info_last_offset) - return (NULL); - - if (dbg->de_cu_context != NULL && - dbg->de_cu_context->cc_next != NULL && - dbg->de_cu_context->cc_next->cc_debug_info_offset == offset) { - - return (dbg->de_cu_context->cc_next); - } - - if (dbg->de_cu_context != NULL && - dbg->de_cu_context->cc_debug_info_offset <= offset) { - - for (cu_context = dbg->de_cu_context; - cu_context != NULL; cu_context = cu_context->cc_next) { - - if (offset >= cu_context->cc_debug_info_offset && - offset < cu_context->cc_debug_info_offset + - cu_context->cc_length + cu_context->cc_length_size - + cu_context->cc_extension_size) { - - return (cu_context); - } - } - } - - for (cu_context = dbg->de_cu_context_list; - cu_context != NULL; cu_context = cu_context->cc_next) { - - if (offset >= cu_context->cc_debug_info_offset && - offset < cu_context->cc_debug_info_offset + - cu_context->cc_length + cu_context->cc_length_size - + cu_context->cc_extension_size) { - - return (cu_context); - } - } - - return (NULL); -} - - -/* - This routine checks the dwarf_offdie() list of - CU contexts for the right CU context. -*/ -static Dwarf_CU_Context -_dwarf_find_offdie_CU_Context(Dwarf_Debug dbg, Dwarf_Off offset) -{ - Dwarf_CU_Context cu_context = 0; - - for (cu_context = dbg->de_offdie_cu_context; - cu_context != NULL; cu_context = cu_context->cc_next) - - if (offset >= cu_context->cc_debug_info_offset && - offset < cu_context->cc_debug_info_offset + - cu_context->cc_length + cu_context->cc_length_size - + cu_context->cc_extension_size) - - return (cu_context); - - return (NULL); -} - - -/* - This function is used to create a CU Context for - a compilation-unit that begins at offset in - .debug_info. The CU Context is attached to the - list of CU Contexts for this dbg. It is assumed - that the CU at offset has not been read before, - and so do not call this routine before making - sure of this with _dwarf_find_CU_Context(). - Returns NULL on error. As always, being an - internal routine, assumes a good dbg. - - This function must always set a dwarf error code - before returning NULL. Always. -*/ -static Dwarf_CU_Context -_dwarf_make_CU_Context(Dwarf_Debug dbg, - Dwarf_Off offset, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - Dwarf_Unsigned length = 0; - Dwarf_Signed abbrev_offset = 0; - Dwarf_Byte_Ptr cu_ptr = 0; - int local_extension_size = 0; - int local_length_size = 0; - - cu_context = - (Dwarf_CU_Context) _dwarf_get_alloc(dbg, DW_DLA_CU_CONTEXT, 1); - if (cu_context == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - cu_context->cc_dbg = dbg; - - cu_ptr = (Dwarf_Byte_Ptr) (dbg->de_debug_info.dss_data + offset); - - /* READ_AREA_LENGTH updates cu_ptr for consumed bytes */ - READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned, - cu_ptr, local_length_size, local_extension_size); - cu_context->cc_length_size = local_length_size; - cu_context->cc_extension_size = local_extension_size; - - - cu_context->cc_length = (Dwarf_Word) length; - - READ_UNALIGNED(dbg, cu_context->cc_version_stamp, Dwarf_Half, - cu_ptr, sizeof(Dwarf_Half)); - cu_ptr += sizeof(Dwarf_Half); - - READ_UNALIGNED(dbg, abbrev_offset, Dwarf_Signed, - cu_ptr, local_length_size); - cu_ptr += local_length_size; - cu_context->cc_abbrev_offset = (Dwarf_Sword) abbrev_offset; - - cu_context->cc_address_size = *(Dwarf_Small *) cu_ptr; - - if ((length < CU_VERSION_STAMP_SIZE + local_length_size + - CU_ADDRESS_SIZE_SIZE) || - (offset + length + local_length_size + - local_extension_size > dbg->de_debug_info.dss_size)) { - - dwarf_dealloc(dbg, cu_context, DW_DLA_CU_CONTEXT); - _dwarf_error(dbg, error, DW_DLE_CU_LENGTH_ERROR); - return (NULL); - } - - if (cu_context->cc_version_stamp != CURRENT_VERSION_STAMP - && cu_context->cc_version_stamp != CURRENT_VERSION_STAMP3 - && cu_context->cc_version_stamp != CURRENT_VERSION_STAMP4) { - dwarf_dealloc(dbg, cu_context, DW_DLA_CU_CONTEXT); - _dwarf_error(dbg, error, DW_DLE_VERSION_STAMP_ERROR); - return (NULL); - } - - if (abbrev_offset >= dbg->de_debug_abbrev.dss_size) { - dwarf_dealloc(dbg, cu_context, DW_DLA_CU_CONTEXT); - _dwarf_error(dbg, error, DW_DLE_ABBREV_OFFSET_ERROR); - return (NULL); - } - - cu_context->cc_abbrev_hash_table = - (Dwarf_Hash_Table) _dwarf_get_alloc(dbg, DW_DLA_HASH_TABLE, 1); - if (cu_context->cc_abbrev_hash_table == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - - cu_context->cc_debug_info_offset = (Dwarf_Word) offset; - dbg->de_info_last_offset = - (Dwarf_Word) (offset + length + - local_extension_size + local_length_size); - - if (dbg->de_cu_context_list == NULL) { - dbg->de_cu_context_list = cu_context; - dbg->de_cu_context_list_end = cu_context; - } else { - dbg->de_cu_context_list_end->cc_next = cu_context; - dbg->de_cu_context_list_end = cu_context; - } - - return (cu_context); -} - - -/* - Returns offset of next compilation-unit thru next_cu_offset - pointer. - It basically sequentially moves from one - cu to the next. The current cu is recorded - internally by libdwarf. - - The _b form is new for DWARF4 adding new returned fields. -*/ -int -dwarf_next_cu_header(Dwarf_Debug dbg, - Dwarf_Unsigned * cu_header_length, - Dwarf_Half * version_stamp, - Dwarf_Unsigned * abbrev_offset, - Dwarf_Half * address_size, - Dwarf_Unsigned * next_cu_offset, - Dwarf_Error * error) -{ - return dwarf_next_cu_header_b(dbg, - cu_header_length, - version_stamp, - abbrev_offset, - address_size, - 0,0, - next_cu_offset, - error); -} -int -dwarf_next_cu_header_b(Dwarf_Debug dbg, - Dwarf_Unsigned * cu_header_length, - Dwarf_Half * version_stamp, - Dwarf_Unsigned * abbrev_offset, - Dwarf_Half * address_size, - Dwarf_Half * offset_size, - Dwarf_Half * extension_size, - Dwarf_Unsigned * next_cu_offset, - Dwarf_Error * error) -{ - /* Offset for current and new CU. */ - Dwarf_Unsigned new_offset = 0; - - /* CU Context for current CU. */ - Dwarf_CU_Context cu_context = 0; - - /* ***** BEGIN CODE ***** */ - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - /* - Get offset into .debug_info of next CU. If dbg has no context, - this has to be the first one. */ - if (dbg->de_cu_context == NULL) { - new_offset = 0; - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - } - - } else { - new_offset = dbg->de_cu_context->cc_debug_info_offset + - dbg->de_cu_context->cc_length + - dbg->de_cu_context->cc_length_size + - dbg->de_cu_context->cc_extension_size; - } - - /* - Check that there is room in .debug_info beyond the new offset - for at least a new cu header. If not, return 0 to indicate end - of debug_info section, and reset de_cu_debug_info_offset to - enable looping back through the cu's. */ - if ((new_offset + _dwarf_length_of_cu_header_simple(dbg)) >= - dbg->de_debug_info.dss_size) { - dbg->de_cu_context = NULL; - return (DW_DLV_NO_ENTRY); - } - - /* Check if this CU has been read before. */ - cu_context = _dwarf_find_CU_Context(dbg, new_offset); - - /* If not, make CU Context for it. */ - if (cu_context == NULL) { - cu_context = _dwarf_make_CU_Context(dbg, new_offset, error); - if (cu_context == NULL) { - /* Error if CU Context could not be made. Since - _dwarf_make_CU_Context has already registered an error - we do not do that here: we let the lower error pass - thru. */ - return (DW_DLV_ERROR); - } - } - - dbg->de_cu_context = cu_context; - - if (cu_header_length != NULL) - *cu_header_length = cu_context->cc_length; - - if (version_stamp != NULL) - *version_stamp = cu_context->cc_version_stamp; - - if (abbrev_offset != NULL) - *abbrev_offset = cu_context->cc_abbrev_offset; - - if (address_size != NULL) - *address_size = cu_context->cc_address_size; - if (offset_size != NULL) - *offset_size = cu_context->cc_length_size; - if (extension_size != NULL) - *extension_size = cu_context->cc_extension_size; - - new_offset = new_offset + cu_context->cc_length + - cu_context->cc_length_size + cu_context->cc_extension_size; - *next_cu_offset = new_offset; - return (DW_DLV_OK); -} - - -/* - This function does two slightly different things - depending on the input flag want_AT_sibling. If - this flag is true, it checks if the input die has - a DW_AT_sibling attribute. If it does it returns - a pointer to the start of the sibling die in the - .debug_info section. Otherwise it behaves the - same as the want_AT_sibling false case. - - If the want_AT_sibling flag is false, it returns - a pointer to the immediately adjacent die in the - .debug_info section. - - Die_info_end points to the end of the .debug_info - portion for the cu the die belongs to. It is used - to check that the search for the next die does not - cross the end of the current cu. Cu_info_start points - to the start of the .debug_info portion for the - current cu, and is used to add to the offset for - DW_AT_sibling attributes. Finally, has_die_child - is a pointer to a Dwarf_Bool that is set true if - the present die has children, false otherwise. - However, in case want_AT_child is true and the die - has a DW_AT_sibling attribute *has_die_child is set - false to indicate that the children are being skipped. - - die_info_end points to the last byte+1 of the cu. - -*/ -static Dwarf_Byte_Ptr -_dwarf_next_die_info_ptr(Dwarf_Byte_Ptr die_info_ptr, - Dwarf_CU_Context cu_context, - Dwarf_Byte_Ptr die_info_end, - Dwarf_Byte_Ptr cu_info_start, - Dwarf_Bool want_AT_sibling, - Dwarf_Bool * has_die_child) -{ - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Byte_Ptr abbrev_ptr = 0; - Dwarf_Word abbrev_code = 0; - Dwarf_Abbrev_List abbrev_list; - Dwarf_Half attr = 0; - Dwarf_Half attr_form = 0; - Dwarf_Unsigned offset = 0; - Dwarf_Word leb128_length = 0; - Dwarf_Unsigned utmp = 0; - Dwarf_Debug dbg = 0; - - info_ptr = die_info_ptr; - DECODE_LEB128_UWORD(info_ptr, utmp); - abbrev_code = (Dwarf_Word) utmp; - if (abbrev_code == 0) { - return NULL; - } - - - abbrev_list = _dwarf_get_abbrev_for_code(cu_context, abbrev_code); - if (abbrev_list == NULL) { - return (NULL); - } - dbg = cu_context->cc_dbg; - - *has_die_child = abbrev_list->ab_has_child; - - abbrev_ptr = abbrev_list->ab_abbrev_ptr; - do { - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr = (Dwarf_Half) utmp2; - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr_form = (Dwarf_Half) utmp2; - if (attr_form == DW_FORM_indirect) { - Dwarf_Unsigned utmp6; - - /* DECODE_LEB128_UWORD updates info_ptr */ - DECODE_LEB128_UWORD(info_ptr, utmp6); - attr_form = (Dwarf_Half) utmp6; - - } - - if (want_AT_sibling && attr == DW_AT_sibling) { - switch (attr_form) { - case DW_FORM_ref1: - offset = *(Dwarf_Small *) info_ptr; - break; - case DW_FORM_ref2: - /* READ_UNALIGNED does not update info_ptr */ - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_Half)); - break; - case DW_FORM_ref4: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_ufixed)); - break; - case DW_FORM_ref8: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_Unsigned)); - break; - case DW_FORM_ref_udata: - offset = - _dwarf_decode_u_leb128(info_ptr, &leb128_length); - break; - case DW_FORM_ref_addr: - /* Very unusual. The FORM is intended to refer to - a different CU, but a different CU cannot - be a sibling, can it? - We could ignore this and treat as if no DW_AT_sibling - present. Or derive the offset from it and if - it is in the same CU use it directly. - The offset here is *supposed* to be a global offset, - so adding cu_info_start is wrong to any offset - we find here unless cu_info_start - is zero! Lets pretend there is no DW_AT_sibling - attribute. */ - goto no_sibling_attr; - default: - return (NULL); - } - - /* Reset *has_die_child to indicate children skipped. */ - *has_die_child = false; - - /* A value beyond die_info_end indicates an error. Exactly - at die_info_end means 1-past-cu-end and simply means we - are at the end, do not return NULL. Higher level code - will detect that we are at the end. */ - if (cu_info_start + offset > die_info_end) { - /* Error case, bad DWARF. */ - return (NULL); - } - /* At or before end-of-cu */ - return (cu_info_start + offset); - } - - no_sibling_attr: - if (attr_form != 0) { - info_ptr += _dwarf_get_size_of_val(cu_context->cc_dbg, - attr_form, - cu_context->cc_address_size, - info_ptr, - cu_context->cc_length_size); - /* It is ok for info_ptr == die_info_end, as we will test - later before using a too-large info_ptr */ - if (info_ptr > die_info_end) { - /* More than one-past-end indicates a bug somewhere, - likely bad dwarf generation. */ - return (NULL); - } - } - } while (attr != 0 || attr_form != 0); - - return (info_ptr); -} - - -/* - Given a Dwarf_Debug dbg, and a Dwarf_Die die, it returns - a Dwarf_Die for the sibling of die. In case die is NULL, - it returns (thru ptr) a Dwarf_Die for the first die in the current - cu in dbg. Returns DW_DLV_ERROR on error. - - It is assumed that every sibling chain including those with - only one element is terminated with a NULL die, except a - chain with only a NULL die. - - The algorithm moves from one die to the adjacent one. It - returns when the depth of children it sees equals the number - of sibling chain terminations. A single count, child_depth - is used to track the depth of children and sibling terminations - encountered. Child_depth is incremented when a die has the - Has-Child flag set unless the child happens to be a NULL die. - Child_depth is decremented when a die has Has-Child false, - and the adjacent die is NULL. Algorithm returns when - child_depth is 0. - - **NOTE: Do not modify input die, since it is used at the end. -*/ -int -dwarf_siblingof(Dwarf_Debug dbg, - Dwarf_Die die, - Dwarf_Die * caller_ret_die, Dwarf_Error * error) -{ - Dwarf_Die ret_die = 0; - Dwarf_Byte_Ptr die_info_ptr = 0; - Dwarf_Byte_Ptr cu_info_start = 0; - - /* die_info_end points 1-past end of die (once set) */ - Dwarf_Byte_Ptr die_info_end = 0; - Dwarf_Word abbrev_code = 0; - Dwarf_Unsigned utmp = 0; - - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - if (die == NULL) { - /* Find root die of cu */ - /* die_info_end is untouched here, need not be set in this - branch. */ - Dwarf_Off off2; - - /* If we've not loaded debug_info, de_cu_context will be NULL, - so no need to laod */ - - if (dbg->de_cu_context == NULL) { - _dwarf_error(dbg, error, DW_DLE_DBG_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - off2 = dbg->de_cu_context->cc_debug_info_offset; - die_info_ptr = dbg->de_debug_info.dss_data + - off2 + _dwarf_length_of_cu_header(dbg, off2); - } else { - /* Find sibling die. */ - Dwarf_Bool has_child = false; - Dwarf_Sword child_depth = 0; - - /* We cannot have a legal die unless debug_info was loaded, so - no need to load debug_info here. */ - CHECK_DIE(die, DW_DLV_ERROR); - - die_info_ptr = die->di_debug_info_ptr; - if (*die_info_ptr == 0) { - return (DW_DLV_NO_ENTRY); - } - cu_info_start = dbg->de_debug_info.dss_data + - die->di_cu_context->cc_debug_info_offset; - die_info_end = cu_info_start + die->di_cu_context->cc_length + - die->di_cu_context->cc_length_size + - die->di_cu_context->cc_extension_size; - - if ((*die_info_ptr) == 0) { - return (DW_DLV_NO_ENTRY); - } - child_depth = 0; - do { - die_info_ptr = _dwarf_next_die_info_ptr(die_info_ptr, - die->di_cu_context, - die_info_end, - cu_info_start, true, - &has_child); - if (die_info_ptr == NULL) { - _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PTR_NULL); - return (DW_DLV_ERROR); - } - - /* die_info_end is one past end. Do not read it! - A test for ``!= die_info_end'' would work as well, - but perhaps < reads more like the meaning. */ - if(die_info_ptr < die_info_end) { - if ((*die_info_ptr) == 0 && has_child) { - die_info_ptr++; - has_child = false; - } - } - - /* die_info_ptr can be one-past-end. */ - if ((die_info_ptr == die_info_end) || - ((*die_info_ptr) == 0)) { - for (; child_depth > 0 && *die_info_ptr == 0; - child_depth--, die_info_ptr++); - } else { - child_depth = has_child ? child_depth + 1 : child_depth; - } - - } while (child_depth != 0); - } - - /* die_info_ptr > die_info_end is really a bug (possibly in dwarf - generation)(but we are past end, no more DIEs here), whereas - die_info_ptr == die_info_end means 'one past end, no more DIEs - here'. */ - if (die != NULL && die_info_ptr >= die_info_end) { - return (DW_DLV_NO_ENTRY); - } - - if ((*die_info_ptr) == 0) { - return (DW_DLV_NO_ENTRY); - } - - ret_die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1); - if (ret_die == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - ret_die->di_debug_info_ptr = die_info_ptr; - ret_die->di_cu_context = - die == NULL ? dbg->de_cu_context : die->di_cu_context; - - DECODE_LEB128_UWORD(die_info_ptr, utmp); - abbrev_code = (Dwarf_Word) utmp; - if (abbrev_code == 0) { - /* Zero means a null DIE */ - dwarf_dealloc(dbg, ret_die, DW_DLA_DIE); - return (DW_DLV_NO_ENTRY); - } - ret_die->di_abbrev_code = abbrev_code; - ret_die->di_abbrev_list = - _dwarf_get_abbrev_for_code(ret_die->di_cu_context, abbrev_code); - if (ret_die->di_abbrev_list == NULL || (die == NULL && - ret_die->di_abbrev_list-> - ab_tag != - DW_TAG_compile_unit)) { - dwarf_dealloc(dbg, ret_die, DW_DLA_DIE); - _dwarf_error(dbg, error, DW_DLE_FIRST_DIE_NOT_CU); - return (DW_DLV_ERROR); - } - - *caller_ret_die = ret_die; - return (DW_DLV_OK); -} - - -int -dwarf_child(Dwarf_Die die, - Dwarf_Die * caller_ret_die, Dwarf_Error * error) -{ - Dwarf_Byte_Ptr die_info_ptr = 0; - - /* die_info_end points one-past-end of die area. */ - Dwarf_Byte_Ptr die_info_end = 0; - Dwarf_Die ret_die = 0; - Dwarf_Bool has_die_child = 0; - Dwarf_Debug dbg; - Dwarf_Word abbrev_code = 0; - Dwarf_Unsigned utmp = 0; - - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - die_info_ptr = die->di_debug_info_ptr; - - /* NULL die has no child. */ - if ((*die_info_ptr) == 0) - return (DW_DLV_NO_ENTRY); - - die_info_end = dbg->de_debug_info.dss_data + - die->di_cu_context->cc_debug_info_offset + - die->di_cu_context->cc_length + - die->di_cu_context->cc_length_size + - die->di_cu_context->cc_extension_size; - - die_info_ptr = - _dwarf_next_die_info_ptr(die_info_ptr, die->di_cu_context, - die_info_end, NULL, false, - &has_die_child); - if (die_info_ptr == NULL) { - _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PTR_NULL); - return (DW_DLV_ERROR); - } - - if (!has_die_child) - return (DW_DLV_NO_ENTRY); - - ret_die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1); - if (ret_die == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - ret_die->di_debug_info_ptr = die_info_ptr; - ret_die->di_cu_context = die->di_cu_context; - - DECODE_LEB128_UWORD(die_info_ptr, utmp); - abbrev_code = (Dwarf_Word) utmp; - if (abbrev_code == 0) { - /* We have arrived at a null DIE, at the end of a CU or the end - of a list of siblings. */ - *caller_ret_die = 0; - dwarf_dealloc(dbg, ret_die, DW_DLA_DIE); - return DW_DLV_NO_ENTRY; - } - ret_die->di_abbrev_code = abbrev_code; - ret_die->di_abbrev_list = - _dwarf_get_abbrev_for_code(die->di_cu_context, abbrev_code); - if (ret_die->di_abbrev_list == NULL) { - dwarf_dealloc(dbg, ret_die, DW_DLA_DIE); - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - - *caller_ret_die = ret_die; - return (DW_DLV_OK); -} - -/* - Given a (global, not cu_relative) die offset, this returns - a pointer to a DIE thru *new_die. - It is up to the caller to do a - dwarf_dealloc(dbg,*new_die,DW_DLE_DIE); -*/ -int -dwarf_offdie(Dwarf_Debug dbg, - Dwarf_Off offset, Dwarf_Die * new_die, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - Dwarf_Off new_cu_offset = 0; - Dwarf_Die die = 0; - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Unsigned abbrev_code = 0; - Dwarf_Unsigned utmp = 0; - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - cu_context = _dwarf_find_CU_Context(dbg, offset); - if (cu_context == NULL) - cu_context = _dwarf_find_offdie_CU_Context(dbg, offset); - - if (cu_context == NULL) { - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - - if (dbg->de_offdie_cu_context_end != NULL) { - Dwarf_CU_Context lcu_context = - dbg->de_offdie_cu_context_end; - new_cu_offset = - lcu_context->cc_debug_info_offset + - lcu_context->cc_length + - lcu_context->cc_length_size + - lcu_context->cc_extension_size; - } - - - do { - if ((new_cu_offset + - _dwarf_length_of_cu_header_simple(dbg)) >= - dbg->de_debug_info.dss_size) { - _dwarf_error(dbg, error, DW_DLE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - cu_context = - _dwarf_make_CU_Context(dbg, new_cu_offset, error); - if (cu_context == NULL) { - /* Error if CU Context could not be made. Since - _dwarf_make_CU_Context has already registered an - error we do not do that here: we let the lower error - pass thru. */ - - return (DW_DLV_ERROR); - } - - if (dbg->de_offdie_cu_context == NULL) { - dbg->de_offdie_cu_context = cu_context; - dbg->de_offdie_cu_context_end = cu_context; - } else { - dbg->de_offdie_cu_context_end->cc_next = cu_context; - dbg->de_offdie_cu_context_end = cu_context; - } - - new_cu_offset = new_cu_offset + cu_context->cc_length + - cu_context->cc_length_size; - - } while (offset >= new_cu_offset); - } - - die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1); - if (die == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - die->di_cu_context = cu_context; - - info_ptr = dbg->de_debug_info.dss_data + offset; - die->di_debug_info_ptr = info_ptr; - DECODE_LEB128_UWORD(info_ptr, utmp); - abbrev_code = utmp; - if (abbrev_code == 0) { - /* we are at a null DIE (or there is a bug). */ - *new_die = 0; - dwarf_dealloc(dbg, die, DW_DLA_DIE); - return DW_DLV_NO_ENTRY; - } - die->di_abbrev_code = abbrev_code; - die->di_abbrev_list = - _dwarf_get_abbrev_for_code(cu_context, abbrev_code); - if (die->di_abbrev_list == NULL) { - dwarf_dealloc(dbg, die, DW_DLA_DIE); - _dwarf_error(dbg, error, DW_DLE_DIE_ABBREV_LIST_NULL); - return (DW_DLV_ERROR); - } - - *new_die = die; - return (DW_DLV_OK); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.h b/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.h deleted file mode 100644 index f1ecb153ba..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_die_deliv.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - - Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -/* - This struct holds information about a abbreviation. - It is put in the hash table for abbreviations for - a compile-unit. -*/ -struct Dwarf_Abbrev_List_s { - - Dwarf_Unsigned ab_code; - Dwarf_Half ab_tag; - Dwarf_Half ab_has_child; - - /* - Points to start of attribute and form pairs in the .debug_abbrev - section for the abbrev. */ - Dwarf_Byte_Ptr ab_abbrev_ptr; - - struct Dwarf_Abbrev_List_s *ab_next; -}; diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.c b/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.c deleted file mode 100644 index 6caa64a758..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.c +++ /dev/null @@ -1,976 +0,0 @@ -/* - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 Arxan Technologies, Inc. All Rights Reserved. - Portions Copyright 2009-2010 David Anderson. All rights reserved. - Portions Copyright 2009-2010 Novell Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - -#include "config.h" -#include "dwarf_incl.h" -#include "dwarf_elf_access.h" - -#ifdef HAVE_ELF_H -#include <elf.h> -#endif -#ifdef HAVE_LIBELF_H -#include <libelf.h> -#else -#ifdef HAVE_LIBELF_LIBELF_H -#include <libelf/libelf.h> -#endif -#endif - -#include <stdio.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <string.h> -#include <stdlib.h> - -#define FALSE 0 -#define TRUE 1 - -#ifndef EM_MIPS -/* This is the standard elf value EM_MIPS. */ -#define EM_MIPS 8 -#endif - - -#ifdef HAVE_ELF64_GETEHDR -extern Elf64_Ehdr *elf64_getehdr(Elf *); -#endif -#ifdef HAVE_ELF64_GETSHDR -extern Elf64_Shdr *elf64_getshdr(Elf_Scn *); -#endif -#ifdef WORDS_BIGENDIAN -#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ - { \ - dbg->de_copy_word(dest, \ - ((char *)source) +srclength-len_out, \ - len_out) ; \ - } - - -#else /* LITTLE ENDIAN */ - -#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ - { \ - dbg->de_copy_word( (dest) , \ - ((char *)source) , \ - len_out) ; \ - } -#endif - - - -typedef struct { - dwarf_elf_handle elf; - int is_64bit; - Dwarf_Small length_size; - Dwarf_Small pointer_size; - Dwarf_Unsigned section_count; - Dwarf_Endianness endianness; - Dwarf_Small machine; - int libdwarf_owns_elf; - Elf32_Ehdr *ehdr32; - -#ifdef HAVE_ELF64_GETEHDR - Elf64_Ehdr *ehdr64; -#endif - /* Elf symtab and its strtab. Initialized at first - call to do relocations, the actual data is in the Dwarf_Debug - struct, not allocated locally here. */ - struct Dwarf_Section_s *symtab; - struct Dwarf_Section_s *strtab; - -} dwarf_elf_object_access_internals_t; - -struct Dwarf_Elf_Rela { - Dwarf_ufixed64 r_offset; - /*Dwarf_ufixed64 r_info; */ - Dwarf_ufixed64 r_type; - Dwarf_ufixed64 r_symidx; - Dwarf_ufixed64 r_addend; -}; - - -static int dwarf_elf_object_access_load_section(void* obj_in, - Dwarf_Half section_index, - Dwarf_Small** section_data, - int* error); - -/* - dwarf_elf_object_access_internals_init() - */ -static int -dwarf_elf_object_access_internals_init(void* obj_in, - dwarf_elf_handle elf, - int* error) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - char *ehdr_ident = 0; - Dwarf_Half machine = 0; - obj->elf = elf; - - if ((ehdr_ident = elf_getident(elf, NULL)) == NULL) { - *error = DW_DLE_ELF_GETIDENT_ERROR; - return DW_DLV_ERROR; - } - - obj->is_64bit = (ehdr_ident[EI_CLASS] == ELFCLASS64); - - - if(ehdr_ident[EI_DATA] == ELFDATA2LSB){ - obj->endianness = DW_OBJECT_LSB; - } - else if(ehdr_ident[EI_DATA] == ELFDATA2MSB){ - obj->endianness = DW_OBJECT_MSB; - } - - if (obj->is_64bit) { -#ifdef HAVE_ELF64_GETEHDR - obj->ehdr64 = elf64_getehdr(elf); - if (obj->ehdr64 == NULL) { - *error = DW_DLE_ELF_GETEHDR_ERROR; - return DW_DLV_ERROR; - } - obj->section_count = obj->ehdr64->e_shnum; - machine = obj->ehdr64->e_machine; - obj->machine = machine; -#else - *error = DW_DLE_NO_ELF64_SUPPORT; - return DW_DLV_ERROR; -#endif - } - else { - obj->ehdr32 = elf32_getehdr(elf); - if (obj->ehdr32 == NULL) { - *error = DW_DLE_ELF_GETEHDR_ERROR; - return DW_DLV_ERROR; - } - obj->section_count = obj->ehdr32->e_shnum; - machine = obj->ehdr32->e_machine; - obj->machine = machine; - } - - /* The following length_size is Not Too Significant. Only used - one calculation, and an approximate one at that. */ - obj->length_size = obj->is_64bit ? 8 : 4; - obj->pointer_size = obj->is_64bit ? 8 : 4; - - if (obj->is_64bit && machine != EM_MIPS) { - /* MIPS/IRIX makes pointer size and length size 8 for -64. - Other platforms make length 4 always. */ - /* 4 here supports 32bit-offset dwarf2, as emitted by cygnus - tools, and the dwarfv2.1 64bit extension setting. - This is not the same as the size-of-an-offset, which - is 4 in 32bit dwarf and 8 in 64bit dwarf. */ - obj->length_size = 4; - } - return DW_DLV_OK; -} - -/* - dwarf_elf_object_access_get_byte_order - */ -static -Dwarf_Endianness -dwarf_elf_object_access_get_byte_order(void* obj_in) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - return obj->endianness; -} - -/* - dwarf_elf_object_access_get_section_count() - */ -static -Dwarf_Unsigned -dwarf_elf_object_access_get_section_count(void * obj_in) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - return obj->section_count; -} - - -/* - dwarf_elf_object_access_get_section() - */ -static -int -dwarf_elf_object_access_get_section_info( - void* obj_in, - Dwarf_Half section_index, - Dwarf_Obj_Access_Section* ret_scn, - int* error) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - - Elf32_Shdr *shdr32 = 0; - -#ifdef HAVE_ELF64_GETSHDR - Elf64_Shdr *shdr64 = 0; -#endif - Elf_Scn *scn = 0; - - - scn = elf_getscn(obj->elf, section_index); - if (scn == NULL) { - *error = DW_DLE_MDE; - return DW_DLV_ERROR; - } - if (obj->is_64bit) { -#ifdef HAVE_ELF64_GETSHDR - shdr64 = elf64_getshdr(scn); - if (shdr64 == NULL) { - *error = DW_DLE_ELF_GETSHDR_ERROR; - return DW_DLV_ERROR; - } - - ret_scn->size = shdr64->sh_size; - ret_scn->addr = shdr64->sh_addr; - ret_scn->link = shdr64->sh_link; - - ret_scn->name = elf_strptr(obj->elf, obj->ehdr64->e_shstrndx, - shdr64->sh_name); - if(ret_scn->name == NULL) { - *error = DW_DLE_ELF_STRPTR_ERROR; - return DW_DLV_ERROR; - } - return DW_DLV_OK; -#else - *error = DW_DLE_MISSING_ELF64_SUPPORT; - return DW_DLV_ERROR; -#endif /* HAVE_ELF64_GETSHDR */ - } - if ((shdr32 = elf32_getshdr(scn)) == NULL) { - *error = DW_DLE_ELF_GETSHDR_ERROR; - return DW_DLV_ERROR; - } - - ret_scn->size = shdr32->sh_size; - ret_scn->addr = shdr32->sh_addr; - ret_scn->link = shdr32->sh_link; - - ret_scn->name = elf_strptr(obj->elf, obj->ehdr32->e_shstrndx, - shdr32->sh_name); - if (ret_scn->name == NULL) { - *error = DW_DLE_ELF_STRPTR_ERROR; - return DW_DLV_ERROR; - } - return DW_DLV_OK; -} - -/* - dwarf_elf_object_access_get_length_size - */ -static -Dwarf_Small -dwarf_elf_object_access_get_length_size(void* obj_in) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - return obj->length_size; -} - -/* - dwarf_elf_object_access_get_pointer_size - */ -static -Dwarf_Small -dwarf_elf_object_access_get_pointer_size(void* obj_in) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - return obj->pointer_size; -} - -#define MATCH_REL_SEC(i_,s_,r_) \ -if(i_ == s_.dss_index) { \ - *r_ = &s_; \ - return DW_DLV_OK; \ -} - -static int -find_section_to_relocate(Dwarf_Debug dbg,Dwarf_Half section_index, - struct Dwarf_Section_s **relocatablesec, int *error) -{ - MATCH_REL_SEC(section_index,dbg->de_debug_info,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_abbrev,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_line,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_loc,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_aranges,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_macinfo,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_pubnames,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_ranges,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_frame,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_frame_eh_gnu,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_pubtypes,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_funcnames,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_typenames,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_varnames,relocatablesec); - MATCH_REL_SEC(section_index,dbg->de_debug_weaknames,relocatablesec); - /* dbg-> de_debug_str,syms); */ - /* de_elf_symtab,syms); */ - /* de_elf_strtab,syms); */ - *error = DW_DLE_RELOC_SECTION_MISMATCH; - return DW_DLV_ERROR; - -} -#undef MATCH_REL_SEC - -static void -get_rela_elf32(Dwarf_Small *data, unsigned int i, - int endianness, - int machine, struct Dwarf_Elf_Rela *relap) -{ - Elf32_Rela *relp = (Elf32_Rela*)(data + (i * sizeof(Elf32_Rela))); - relap->r_offset = relp->r_offset; - /* - relap->r_info = relp->r_info; - */ - relap->r_type = ELF32_R_TYPE(relp->r_info); - relap->r_symidx = ELF32_R_SYM(relp->r_info); - relap->r_addend = relp->r_addend; -} - -static void -get_rela_elf64(Dwarf_Small *data, unsigned int i, - int endianness, - int machine,struct Dwarf_Elf_Rela *relap) -{ -#ifdef HAVE_ELF64_RELA - Elf64_Rela * relp = (Elf64_Rela*)(data + (i * sizeof(Elf64_Rela))); - relap->r_offset = relp->r_offset; - /* - relap->r_info = relp->r_info; - */ - if(machine == EM_MIPS && endianness == DW_OBJECT_LSB ) { - /* This is really wierd. Treat this very specially. - The Elf64 LE MIPS object used for - testing (that has rela) wants the - values as sym ssym type3 type2 type, treating - each value as independent value. But libelf xlate - treats it as something else so we fudge here. - It is unclear - how to precisely characterize where these relocations - were used. - SGI MIPS on IRIX never used .rela relocations. - The BE 64bit elf MIPS test object with rela uses traditional - elf relocation layouts, not this special case. */ -#define ELF64MIPS_REL_SYM(i) ((i) & 0xffffffff) -#define ELF64MIPS_REL_TYPE(i) ((i >> 56) &0xff) - /* We ignore the special TYPE2 and TYPE3, they should be - value R_MIPS_NONE in rela. */ - relap->r_type = ELF64MIPS_REL_TYPE(relp->r_info); - relap->r_symidx = ELF64MIPS_REL_SYM(relp->r_info); -#undef MIPS64SYM -#undef MIPS64TYPE - } else - { - relap->r_type = ELF64_R_TYPE(relp->r_info); - relap->r_symidx = ELF64_R_SYM(relp->r_info); - } - relap->r_addend = relp->r_addend; -#endif -} - -static void -get_relocations_array(Dwarf_Bool is_64bit, - int endianness, - int machine, - Dwarf_Small *data, - unsigned int num_relocations, - struct Dwarf_Elf_Rela *relap) -{ - unsigned int i = 0; - void (*get_relocations)(Dwarf_Small *data, unsigned int i, - int endianness, - int machine, - struct Dwarf_Elf_Rela *relap); - - /* Handle 32/64 bit issue - */ - if (is_64bit) { - get_relocations = get_rela_elf64; - } else { - get_relocations = get_rela_elf32; - } - - for (i=0; i < num_relocations; i++) { - get_relocations(data, i,endianness,machine, &(relap[i])); - } - -} - -static int -get_relocation_entries(Dwarf_Bool is_64bit, - int endianness, - int machine, - Dwarf_Small *relocation_section, - Dwarf_Unsigned relocation_section_size, - struct Dwarf_Elf_Rela **relas, - unsigned int *nrelas, - int *error) -{ - unsigned int relocation_size = 0; - - if (is_64bit) { -#ifdef HAVE_ELF64_RELA - relocation_size = sizeof(Elf64_Rela); -#else - *error = DW_DLE_MISSING_ELF64_SUPPORT; - return DW_DLV_ERROR; -#endif - } else { - relocation_size = sizeof(Elf32_Rela); - } - - if (relocation_section == NULL) { - *error = DW_DLE_RELOC_SECTION_PTR_NULL; - return(DW_DLV_ERROR); - } - - if ((relocation_section_size != 0)) { - size_t bytescount = 0; - if(relocation_section_size%relocation_size) { - *error = DW_DLE_RELOC_SECTION_LENGTH_ODD; - return DW_DLV_ERROR; - } - *nrelas = relocation_section_size/relocation_size; - bytescount = (*nrelas) * sizeof(struct Dwarf_Elf_Rela); - *relas = malloc(bytescount); - if (!*relas) { - *error = DW_DLE_MAF; - return(DW_DLV_ERROR); - } - memset(*relas,0,bytescount); - get_relocations_array(is_64bit,endianness,machine, relocation_section, - *nrelas, *relas); - } - return(DW_DLV_OK); -} - -static Dwarf_Bool -is_32bit_abs_reloc(unsigned int type, Dwarf_Half machine) -{ - Dwarf_Bool r = 0; - switch (machine) { -#if defined(EM_MIPS) && defined (R_MIPS_32) - case EM_MIPS: - r = (type == R_MIPS_32); - break; -#endif -#if defined(EM_SPARC32PLUS) && defined (R_SPARC_UA32) - case EM_SPARC32PLUS: - r = (type == R_SPARC_UA32); - break; -#endif -#if defined(EM_SPARCV9) && defined (R_SPARC_UA32) - case EM_SPARCV9: - r = (type == R_SPARC_UA32); - break; -#endif -#if defined(EM_SPARC) && defined (R_SPARC_UA32) - case EM_SPARC: - r = (type == R_SPARC_UA32); - break; -#endif -#if defined(EM_386) && defined (R_386_32) - case EM_386: - r = (type == R_386_32); - break; -#endif -#if defined(EM_IA_64) && defined (R_IA64_SECREL32LSB) - case EM_IA_64: - r = (type == R_IA64_SECREL32LSB); - break; -#endif -#if defined(EM_PPC64) && defined (R_PPC64_ADDR32) - case EM_PPC64: - r = (type == R_PPC64_ADDR32); - break; -#endif -#if defined(EM_PPC) && defined (R_PPC_ADDR32) - case EM_PPC: - r = (type == R_PPC_ADDR32); - break; -#endif -#if defined(EM_S390) && defined (R_390_32) - case EM_S390: - r = (type == R_390_32); - break; -#endif -#if defined(EM_X86_64) && defined (R_X86_64_32) - case EM_X86_64: - r = (type == R_X86_64_32); - break; -#endif - } - return r; -} - -static Dwarf_Bool -is_64bit_abs_reloc(unsigned int type, Dwarf_Half machine) -{ - Dwarf_Bool r = 0; - switch (machine) { -#if defined(EM_MIPS) && defined (R_MIPS_64) - case EM_MIPS: - r = (type == R_MIPS_64); - break; -#endif -#if defined(EM_SPARC32PLUS) && defined (R_SPARC_UA64) - case EM_SPARC32PLUS: - r = (type == R_SPARC_UA64); - break; -#endif -#if defined(EM_SPARCV9) && defined (R_SPARC_UA64) - case EM_SPARCV9: - r = (type == R_SPARC_UA64); - break; -#endif -#if defined(EM_SPARC) && defined (R_SPARC_UA64) - case EM_SPARC: - r = (type == R_SPARC_UA64); - break; -#endif -#if defined(EM_IA_64) && defined (R_IA64_SECREL32LSB) - case EM_IA_64: - r = (type == R_IA64_DIR64LSB); - break; -#endif -#if defined(EM_PPC64) && defined (R_PPC64_ADDR64) - case EM_PPC64: - r = (type == R_PPC64_ADDR64); - break; -#endif -#if defined(EM_S390) && defined (R_390_64) - case EM_S390: - r = (type == R_390_64); - break; -#endif -#if defined(EM_X86_64) && defined (R_X86_64_64) - case EM_X86_64: - r = (type == R_X86_64_64); - break; -#endif - } - return r; -} - - -static void -update_entry(Dwarf_Debug dbg, - Dwarf_Bool is_64bit, Dwarf_Endianness endianess, - Dwarf_Half machine, struct Dwarf_Elf_Rela *rela, - Dwarf_Small *target_section, Dwarf_Small *section_data) -{ - unsigned int type = 0; - unsigned int sym_idx = 0; -#ifdef HAVE_ELF64_SYM - Elf64_Sym sym_buf; - Elf64_Sym *sym = 0; -#else - Elf32_Sym sym_buf; - Elf32_Sym *sym = 0; -#endif - Elf32_Sym *sym32 = 0; - Dwarf_ufixed64 offset = 0; - Dwarf_sfixed64 addend = 0; - Dwarf_Unsigned reloc_size = 0; - - - /* Dwarf_Elf_Rela dereferencing */ - offset = rela->r_offset; - addend = rela->r_addend; - type = rela->r_type; - sym_idx = rela->r_symidx; - - if (is_64bit) { -#ifdef HAVE_ELF64_SYM - sym = &((Elf64_Sym*)section_data)[sym_idx]; -#endif - } else { - sym32 = &((Elf32_Sym*)section_data)[sym_idx]; - - /* Convert Elf32_Sym struct to Elf64_Sym struct. We point at - * an Elf64_Sym local variable (sym_buf) to allow us to use the - * same pointer (sym) for both 32-bit and 64-bit instances. - */ - sym = &sym_buf; - sym->st_name = sym32->st_name; - sym->st_info = sym32->st_info; - sym->st_other = sym32->st_other; - sym->st_shndx = sym32->st_shndx; - sym->st_value = sym32->st_value; - sym->st_size = sym32->st_size; - } - - /* Determine relocation size */ - if (is_32bit_abs_reloc(type, machine)) { - reloc_size = 4; - } else if (is_64bit_abs_reloc(type, machine)) { - reloc_size = 8; - } else { - return; - } - - - { - /* Assuming we do not need to do a READ_UNALIGNED here - at target_section + offset and add its value to - outval. Some ABIs say no read (for example MIPS), - but if some do then which ones? */ - Dwarf_Unsigned outval = sym->st_value + addend; - WRITE_UNALIGNED(dbg,target_section + offset, - &outval,sizeof(outval),reloc_size); - } -} - - - -static int -apply_rela_entries(Dwarf_Debug dbg, - Dwarf_Bool is_64bit, - Dwarf_Endianness endianess, - Dwarf_Half machine, - Dwarf_Small *target_section, - Dwarf_Small *symtab_section, - struct Dwarf_Elf_Rela *relas, unsigned int nrelas, - int *error) -{ - if ((target_section != NULL) && (relas != NULL)) { - unsigned int i; - for (i = 0; i < nrelas; i++) { - update_entry(dbg, is_64bit, - endianess, - machine, - &(relas)[i], - target_section, - symtab_section); - } - } - return DW_DLV_OK; -} - - -static int -loop_through_relocations( - Dwarf_Debug dbg, - dwarf_elf_object_access_internals_t* obj, - struct Dwarf_Section_s *relocatablesec, - int *error) -{ - Dwarf_Small *target_section = 0; - Dwarf_Small *symtab_section = obj->symtab->dss_data; - Dwarf_Small *relocation_section = relocatablesec->dss_reloc_data; - Dwarf_Unsigned relocation_section_size = - relocatablesec->dss_reloc_size; - int ret = DW_DLV_ERROR; - struct Dwarf_Elf_Rela *relas = 0; - unsigned int nrelas = 0; - Dwarf_Small *mspace = 0; - - ret = get_relocation_entries(obj->is_64bit, - obj->endianness, - obj->machine, - relocation_section, - relocation_section_size, - &relas, &nrelas, error); - if(ret != DW_DLV_OK) { - free(relas); - return ret; - } - - /* Some systems read Elf in read-only memory via mmap or the like. - So the only safe thing is to copy the current data into - malloc space and refer to the malloc space instead of the - space returned by the elf library */ - mspace = malloc(relocatablesec->dss_size); - if(!mspace) { - *error = DW_DLE_RELOC_SECTION_MALLOC_FAIL; - return DW_DLV_ERROR; - } - memcpy(mspace,relocatablesec->dss_data,relocatablesec->dss_size); - relocatablesec->dss_data = mspace; - target_section = relocatablesec->dss_data; - relocatablesec->dss_data_was_malloc = 1; - - ret = apply_rela_entries( - dbg, - obj->is_64bit, - obj->endianness, obj->machine, - target_section, - symtab_section, - relas, nrelas, error); - - free(relas); - - return ret; -} - -/* - Find the section data in dbg and find all the relevant - sections. Then do relocations. -*/ -static int -dwarf_elf_object_relocate_a_section(void* obj_in, - Dwarf_Half section_index, - Dwarf_Debug dbg, - int* error) -{ - int res = DW_DLV_ERROR; - dwarf_elf_object_access_internals_t*obj = 0; - struct Dwarf_Section_s * relocatablesec = 0; - if (section_index == 0) { - return DW_DLV_NO_ENTRY; - } - obj = (dwarf_elf_object_access_internals_t*)obj_in; - - /* The section to relocate must already be loaded into memory. */ - res = find_section_to_relocate(dbg, section_index,&relocatablesec,error); - if(res != DW_DLV_OK) { - return res; - } - - /* Sun and possibly others do not always set sh_link in .debug_* sections. - So we cannot do full consistency checks. */ - if(relocatablesec->dss_reloc_index == 0 ) { - /* Something is wrong. */ - *error = DW_DLE_RELOC_SECTION_MISSING_INDEX; - return DW_DLV_ERROR; - } - /* Now load the relocations themselves. */ - res = dwarf_elf_object_access_load_section(obj_in, - relocatablesec->dss_reloc_index, - &relocatablesec->dss_reloc_data, error); - if(res != DW_DLV_OK) { - return res; - } - - /* Now get the symtab. */ - if (!obj->symtab) { - obj->symtab = &dbg->de_elf_symtab; - obj->strtab = &dbg->de_elf_strtab; - } - if( obj->symtab->dss_index != relocatablesec->dss_reloc_link) { - /* Something is wrong. */ - *error = DW_DLE_RELOC_MISMATCH_RELOC_INDEX; - return DW_DLV_ERROR; - } - if( obj->strtab->dss_index != obj->symtab->dss_link) { - /* Something is wrong. */ - *error = DW_DLE_RELOC_MISMATCH_STRTAB_INDEX; - return DW_DLV_ERROR; - } - if(!obj->symtab->dss_data) { - /* Now load the symtab */ - res = dwarf_elf_object_access_load_section(obj_in, - obj->symtab->dss_index, - &obj->symtab->dss_data, error); - if(res != DW_DLV_OK) { - return res; - } - } - if(! obj->strtab->dss_data) { - /* Now load the strtab */ - res = dwarf_elf_object_access_load_section(obj_in, - obj->strtab->dss_index, - &obj->strtab->dss_data,error); - if(res != DW_DLV_OK){ - return res; - } - } - - /* We have all the data we need in memory. */ - res = loop_through_relocations(dbg,obj,relocatablesec,error); - - return res; -} - -/* - dwarf_elf_object_access_load_section - */ -static int -dwarf_elf_object_access_load_section(void* obj_in, - Dwarf_Half section_index, - Dwarf_Small** section_data, - int* error) -{ - dwarf_elf_object_access_internals_t*obj = - (dwarf_elf_object_access_internals_t*)obj_in; - if (section_index == 0) { - return DW_DLV_NO_ENTRY; - } - - { - Elf_Scn *scn = 0; - Elf_Data *data = 0; - - scn = elf_getscn(obj->elf, section_index); - if (scn == NULL) { - *error = DW_DLE_MDE; - return DW_DLV_ERROR; - } - - /* - When using libelf as a producer, section data may be stored - in multiple buffers. In libdwarf however, we only use libelf - as a consumer (there is a dwarf producer API, but it doesn't - use libelf). Because of this, this single call to elf_getdata - will retrieve the entire section in a single contiguous - buffer. */ - data = elf_getdata(scn, NULL); - if (data == NULL) { - *error = DW_DLE_MDE; - return DW_DLV_ERROR; - } - *section_data = data->d_buf; - } - return DW_DLV_OK; -} - - -/* dwarf_elf_access method table. */ -static const struct Dwarf_Obj_Access_Methods_s dwarf_elf_object_access_methods = -{ - dwarf_elf_object_access_get_section_info, - dwarf_elf_object_access_get_byte_order, - dwarf_elf_object_access_get_length_size, - dwarf_elf_object_access_get_pointer_size, - dwarf_elf_object_access_get_section_count, - dwarf_elf_object_access_load_section, - dwarf_elf_object_relocate_a_section -}; - - -/* - Interface for the ELF object file implementation. - */ -int -dwarf_elf_object_access_init(dwarf_elf_handle elf, - int libdwarf_owns_elf, - Dwarf_Obj_Access_Interface** ret_obj, - int *err) -{ - int res = 0; - dwarf_elf_object_access_internals_t *internals = 0; - Dwarf_Obj_Access_Interface *intfc = 0; - - internals = malloc(sizeof(dwarf_elf_object_access_internals_t)); - if(!internals) { - /* Impossible case, we hope. Give up. */ - return DW_DLV_ERROR; - } - memset(internals,0,sizeof(*internals)); - res = dwarf_elf_object_access_internals_init(internals, elf, err); - if(res != DW_DLV_OK){ - free(internals); - return DW_DLV_ERROR; - } - internals->libdwarf_owns_elf = libdwarf_owns_elf; - - intfc = malloc(sizeof(Dwarf_Obj_Access_Interface)); - if(!intfc) { - /* Impossible case, we hope. Give up. */ - free(internals); - return DW_DLV_ERROR; - } - /* Initialize the interface struct */ - intfc->object = internals; - intfc->methods = &dwarf_elf_object_access_methods; - - *ret_obj = intfc; - return DW_DLV_OK; -} - - - -/* - Clean up the Dwarf_Obj_Access_Interface returned by elf_access_init. - */ -void -dwarf_elf_object_access_finish(Dwarf_Obj_Access_Interface* obj) -{ - if(!obj) { - return; - } - if(obj->object) { - dwarf_elf_object_access_internals_t *internals = - (dwarf_elf_object_access_internals_t *)obj->object; - if(internals->libdwarf_owns_elf){ - elf_end(internals->elf); - } - } - free(obj->object); - free(obj); -} - -/* - This function returns the Elf * pointer - associated with a Dwarf_Debug. - - This function only makes sense if ELF is implied. - */ -int -dwarf_get_elf(Dwarf_Debug dbg, dwarf_elf_handle * elf, - Dwarf_Error * error) -{ - struct Dwarf_Obj_Access_Interface_s * obj = 0; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - obj = dbg->de_obj_file; - if(obj) { - dwarf_elf_object_access_internals_t *internals = - (dwarf_elf_object_access_internals_t*)obj->object; - if(internals->elf == NULL) { - _dwarf_error(dbg, error, DW_DLE_FNO); - return (DW_DLV_ERROR); - } - *elf = internals->elf; - return DW_DLV_OK; - - } - _dwarf_error(dbg, error, DW_DLE_FNO); - return DW_DLV_ERROR; -} - - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.h b/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.h deleted file mode 100644 index fd52c17938..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_elf_access.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef _DWARF_ELF_PORT_H -#define _DWARF_ELF_PORT_H -/* - - Copyright (C) 2008-2010 David Anderson. All rights reserved. - Portions Copyright 2008-2010 Arxan Technologies, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* ELF (usually libelf) object access for the generic object file interface */ - -int -dwarf_elf_object_access_init(dwarf_elf_handle elf , - int libdwarf_owns_elf, - Dwarf_Obj_Access_Interface** ret_obj, - int *err ); - -void -dwarf_elf_object_access_finish(Dwarf_Obj_Access_Interface* obj ); - -/* End ELF object access for the generic object file interface */ - - -#endif diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_error.c b/usr/src/tools/ctf/dwarf/common/dwarf_error.c deleted file mode 100644 index 7327529820..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_error.c +++ /dev/null @@ -1,410 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#ifdef HAVE_ELF_H -#include <elf.h> -#endif - -#include <stdio.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <stdlib.h> - -/* Array to hold string representation of errors. Any time a - define is added to the list in libdwarf.h, a string should be - added to this Array -*/ - -const char *_dwarf_errmsgs[] = { - - "No error (0)\n", - "DW_DLE_VMM 1 dwarf format/library version mismatch", - "DW_DLE_MAP 2 memory map failure", - "DW_DLE_LEE 3 libelf error", - "DW_DLE_NDS 4 no debug section", - "DW_DLE_NLS 5 no line section ", - "DW_DLE_ID 6 invalid descriptor for query ", - "DW_DLE_IOF 7 I/O failure ", - "DW_DLE_MAF 8 memory allocation failure ", - "DW_DLE_IA 9 invalid argument ", - "DW_DLE_MDE 10 mangled debugging entry ", - "DW_DLE_MLE 11 mangled line number entry ", - "DW_DLE_FNO 12 file not open ", - "DW_DLE_FNR 13 file not a regular file ", - "DW_DLE_FWA 14 file open with wrong access ", - "DW_DLE_NOB 15 not an object file ", - "DW_DLE_MOF 16 mangled object file header ", - "DW_DLE_EOLL 17 end of location list entries ", - "DW_DLE_NOLL 18 no location list section ", - "DW_DLE_BADOFF 19 Invalid offset ", - "DW_DLE_EOS 20 end of section ", - "DW_DLE_ATRUNC 21 abbreviations section appears truncated", - "DW_DLE_BADBITC 22 Address size passed to dwarf bad", - - "DW_DLE_DBG_ALLOC 23 Unable to malloc a Dwarf_Debug structure", - "DW_DLE_FSTAT_ERROR 24 The file fd passed to dwarf_init " - "cannot be fstat()ed", - "DW_DLE_FSTAT_MODE_ERROR 25 The file mode bits do not " - "indicate that the file being opened via " - "dwarf_init() is a normal file", - "DW_DLE_INIT_ACCESS_WRONG 26 A call to dwarf_init had an " - "access of other than DW_DLC_READ", - "DW_DLE_ELF_BEGIN_ERROR 27 a call to " - "elf_begin(... ELF_C_READ_MMAP... ) failed", - "DW_DLE_ELF_GETEHDR_ERROR 28 a call to " - "elf32_getehdr() or elf64_getehdr() failed", - "DW_DLE_ELF_GETSHDR_ERROR 29 a call to " - "elf32_getshdr() or elf64_getshdr() failed", - "DW_DLE_ELF_STRPTR_ERROR 30 a call to " - "elf_strptr() failed trying to get a section name", - "DW_DLE_DEBUG_INFO_DUPLICATE 31 Only one .debug_info " - "section is allowed", - "DW_DLE_DEBUG_INFO_NULL 32 .debug_info section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_ABBREV_DUPLICATE 33 Only one .debug_abbrev " - "section is allowed", - "DW_DLE_DEBUG_ABBREV_NULL 34 .debug_abbrev section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_ARANGES_DUPLICATE 35 Only one .debug_aranges " - "section is allowed", - "DW_DLE_DEBUG_ARANGES_NULL 36 .debug_aranges section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_LINE_DUPLICATE 37 Only one .debug_line " - "section is allowed", - "DW_DLE_DEBUG_LINE_NULL (38) .debug_line section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_LOC_DUPLICATE (39) Only one .debug_loc " - "section is allowed", - "DW_DLE_DEBUG_LOC_NULL (40) .debug_loc section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_MACINFO_DUPLICATE (41) Only one .debug_macinfo " - "section is allowed", - "DW_DLE_DEBUG_MACINFO_NULL (42) .debug_macinfo section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_PUBNAMES_DUPLICATE (43) Only one .debug_pubnames " - "section is allowed", - "DW_DLE_DEBUG_PUBNAMES_NULL (44) .debug_pubnames section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_STR_DUPLICATE (45) Only one .debug_str " - "section is allowed", - "DW_DLE_DEBUG_STR_NULL (46) .debug_str section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_CU_LENGTH_ERROR (47)", - "DW_DLE_VERSION_STAMP_ERROR (48)", - "DW_DLE_ABBREV_OFFSET_ERROR (49)", - "DW_DLE_ADDRESS_SIZE_ERROR (50)", - "DW_DLE_DEBUG_INFO_PTR_NULL (51)", - "DW_DLE_DIE_NULL (52)", - "DW_DLE_STRING_OFFSET_BAD (53)", - "DW_DLE_DEBUG_LINE_LENGTH_BAD (54)", - "DW_DLE_LINE_PROLOG_LENGTH_BAD (55)", - "DW_DLE_LINE_NUM_OPERANDS_BAD", - "DW_DLE_LINE_SET_ADDR_ERROR", - "DW_DLE_LINE_EXT_OPCODE_BAD", - "DW_DLE_DWARF_LINE_NULL", - "DW_DLE_INCL_DIR_NUM_BAD", - "DW_DLE_LINE_FILE_NUM_BAD", - "DW_DLE_ALLOC_FAIL", - "DW_DLE_NO_CALLBACK_FUNC", - "DW_DLE_SECT_ALLOC", - "DW_DLE_FILE_ENTRY_ALLOC", - "DW_DLE_LINE_ALLOC", - "DW_DLE_FPGM_ALLOC", - "DW_DLE_INCDIR_ALLOC", - "DW_DLE_STRING_ALLOC", - "DW_DLE_CHUNK_ALLOC", - "DW_DLE_BYTEOFF_ERR", - "DW_DLE_CIE_ALLOC", - "DW_DLE_FDE_ALLOC", - "DW_DLE_REGNO_OVFL", - "DW_DLE_CIE_OFFS_ALLOC", - "DW_DLE_WRONG_ADDRESS", - "DW_DLE_EXTRA_NEIGHBORS", - "DW_DLE_WRONG_TAG", - "DW_DLE_DIE_ALLOC", - "DW_DLE_PARENT_EXISTS", - "DW_DLE_DBG_NULL", - "DW_DLE_DEBUGLINE_ERROR", - "DW_DLE_DEBUGFRAME_ERROR", - "DW_DLE_DEBUGINFO_ERROR", - "DW_DLE_ATTR_ALLOC", - "DW_DLE_ABBREV_ALLOC", - "DW_DLE_OFFSET_UFLW", - "DW_DLE_ELF_SECT_ERR", - "DW_DLE_DEBUG_FRAME_LENGTH_BAD", - "DW_DLE_FRAME_VERSION_BAD", - "DW_DLE_CIE_RET_ADDR_REG_ERROR", - "DW_DLE_FDE_NULL", - "DW_DLE_FDE_DBG_NULL", - "DW_DLE_CIE_NULL", - "DW_DLE_CIE_DBG_NULL", - "DW_DLE_FRAME_TABLE_COL_BAD", - "DW_DLE_PC_NOT_IN_FDE_RANGE", - "DW_DLE_CIE_INSTR_EXEC_ERROR", - "DW_DLE_FRAME_INSTR_EXEC_ERROR", - "DW_DLE_FDE_PTR_NULL", - "DW_DLE_RET_OP_LIST_NULL", - "DW_DLE_LINE_CONTEXT_NULL", - "DW_DLE_DBG_NO_CU_CONTEXT", - "DW_DLE_DIE_NO_CU_CONTEXT", - "DW_DLE_FIRST_DIE_NOT_CU", - "DW_DLE_NEXT_DIE_PTR_NULL", - "DW_DLE_DEBUG_FRAME_DUPLICATE Only one .debug_frame " - "section is allowed", - "DW_DLE_DEBUG_FRAME_NULL .debug_frame section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_ABBREV_DECODE_ERROR", - "DW_DLE_DWARF_ABBREV_NULL", - "DW_DLE_ATTR_NULL", - "DW_DLE_DIE_BAD", - "DW_DLE_DIE_ABBREV_BAD", - "DW_DLE_ATTR_FORM_BAD", - "DW_DLE_ATTR_NO_CU_CONTEXT", - "DW_DLE_ATTR_FORM_SIZE_BAD", - "DW_DLE_ATTR_DBG_NULL", - "DW_DLE_BAD_REF_FORM", - "DW_DLE_ATTR_FORM_OFFSET_BAD", - "DW_DLE_LINE_OFFSET_BAD", - "DW_DLE_DEBUG_STR_OFFSET_BAD", - "DW_DLE_STRING_PTR_NULL", - "DW_DLE_PUBNAMES_VERSION_ERROR", - "DW_DLE_PUBNAMES_LENGTH_BAD", - "DW_DLE_GLOBAL_NULL", - "DW_DLE_GLOBAL_CONTEXT_NULL", - "DW_DLE_DIR_INDEX_BAD", - "DW_DLE_LOC_EXPR_BAD", - "DW_DLE_DIE_LOC_EXPR_BAD", - "DW_DLE_ADDR_ALLOC", - "DW_DLE_OFFSET_BAD", - "DW_DLE_MAKE_CU_CONTEXT_FAIL", - "DW_DLE_REL_ALLOC", - "DW_DLE_ARANGE_OFFSET_BAD", - "DW_DLE_SEGMENT_SIZE_BAD", - "DW_DLE_ARANGE_LENGTH_BAD", - "DW_DLE_ARANGE_DECODE_ERROR", - "DW_DLE_ARANGES_NULL", - "DW_DLE_ARANGE_NULL", - "DW_DLE_NO_FILE_NAME", - "DW_DLE_NO_COMP_DIR", - "DW_DLE_CU_ADDRESS_SIZE_BAD", - "DW_DLE_INPUT_ATTR_BAD", - "DW_DLE_EXPR_NULL", - "DW_DLE_BAD_EXPR_OPCODE", - "DW_DLE_EXPR_LENGTH_BAD", - "DW_DLE_MULTIPLE_RELOC_IN_EXPR", - "DW_DLE_ELF_GETIDENT_ERROR", - "DW_DLE_NO_AT_MIPS_FDE", - "DW_DLE_NO_CIE_FOR_FDE", - "DW_DLE_DIE_ABBREV_LIST_NULL", - "DW_DLE_DEBUG_FUNCNAMES_DUPLICATE", - "DW_DLE_DEBUG_FUNCNAMES_NULL .debug_funcnames section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR", - "DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD", - "DW_DLE_FUNC_NULL", - "DW_DLE_FUNC_CONTEXT_NULL", - "DW_DLE_DEBUG_TYPENAMES_DUPLICATE", - "DW_DLE_DEBUG_TYPENAMES_NULL .debug_typenames section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR", - "DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD", - "DW_DLE_TYPE_NULL", - "DW_DLE_TYPE_CONTEXT_NULL", - "DW_DLE_DEBUG_VARNAMES_DUPLICATE", - "DW_DLE_DEBUG_VARNAMES_NULL .debug_varnames section present but " - "elf_getdata() failed or section is zero-length", - "DW_DLE_DEBUG_VARNAMES_VERSION_ERROR", - "DW_DLE_DEBUG_VARNAMES_LENGTH_BAD", - "DW_DLE_VAR_NULL", - "DW_DLE_VAR_CONTEXT_NULL", - "DW_DLE_DEBUG_WEAKNAMES_DUPLICATE", - "DW_DLE_DEBUG_WEAKNAMES_NULL .debug_weaknames section present but " - "elf_getdata() failed or section is zero-length", - - "DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR", - "DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD", - "DW_DLE_WEAK_NULL", - "DW_DLE_WEAK_CONTEXT_NULL (175)", - "DW_DLE_LOCDESC_COUNT_WRONG (176)", - "DW_DLE_MACINFO_STRING_NULL (177)", - "DW_DLE_MACINFO_STRING_EMPTY (178)", - "DW_DLE_MACINFO_INTERNAL_ERROR_SPACE (179)", - "DW_DLE_MACINFO_MALLOC_FAIL (180)", - "DW_DLE_DEBUGMACINFO_ERROR (181)", - "DW_DLE_DEBUG_MACRO_LENGTH_BAD (182)", - "DW_DLE_DEBUG_MACRO_MAX_BAD (183)", - "DW_DLE_DEBUG_MACRO_INTERNAL_ERR (184)", - "DW_DLE_DEBUG_MACRO_MALLOC_SPACE (185)", - "DW_DLE_DEBUG_MACRO_INCONSISTENT (186)", - "DW_DLE_DF_NO_CIE_AUGMENTATION(187)", - "DW_DLE_DF_REG_NUM_TOO_HIGH(188)", - "DW_DLE_DF_MAKE_INSTR_NO_INIT(189)", - "DW_DLE_DF_NEW_LOC_LESS_OLD_LOC(190)", - "DW_DLE_DF_POP_EMPTY_STACK(191)", - "DW_DLE_DF_ALLOC_FAIL(192)", - "DW_DLE_DF_FRAME_DECODING_ERROR(193)", - "DW_DLE_DEBUG_LOC_SECTION_SHORT(194)", - "DW_DLE_FRAME_AUGMENTATION_UNKNOWN(195)", - "DW_DLE_PUBTYPE_CONTEXT(196)", - "DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD(197)", - "DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR(198)", - "DW_DLE_DEBUG_PUBTYPES_DUPLICATE(199)", - "DW_DLE_FRAME_CIE_DECODE_ERROR(200)", - "DW_DLE_FRAME_REGISTER_UNREPRESENTABLE(201)", - "DW_DLE_FRAME_REGISTER_COUNT_MISMATCH(202)", - "DW_DLE_LINK_LOOP(203)", - "DW_DLE_STRP_OFFSET_BAD(204)", - "DW_DLE_DEBUG_RANGES_DUPLICATE(205)", - "DW_DLE_DEBUG_RANGES_OFFSET_BAD(206)", - "DW_DLE_DEBUG_RANGES_MISSING_END(207)", - "DW_DLE_DEBUG_RANGES_OUT_OF_MEM(208)", - "DW_DLE_DEBUG_SYMTAB_ERR(209)", - "DW_DLE_DEBUG_STRTAB_ERR(210)", - "DW_DLE_RELOC_MISMATCH_INDEX(211)", - "DW_DLE_RELOC_MISMATCH_RELOC_INDEX(212)", - "DW_DLE_RELOC_MISMATCH_STRTAB_INDEX(213)", - "DW_DLE_RELOC_SECTION_MISMATCH(214)", - "DW_DLE_RELOC_SECTION_MISSING_INDEX(215)", - "DW_DLE_RELOC_SECTION_LENGTH_ODD(216)", - "DW_DLE_RELOC_SECTION_PTR_NULL(217)", - "DW_DLE_RELOC_SECTION_MALLOC_FAIL(218)", - "DW_DLE_NO_ELF64_SUPPORT(219)", - "DW_DLE_MISSING_ELF64_SUPPORT(220)", - "DW_DLE_ORPHAN_FDE(221)", - "DW_DLE_DUPLICATE_INST_BLOCK(222)", - "DW_DLE_BAD_REF_SIG8_FORM(223)", - "DW_DLE_ATTR_EXPRLOC_FORM_BAD(224)", - "DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD(225)", - "DW_DLE_NOT_REF_FORM(226)", - "DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE(227)" -}; - - - - -/* - This function performs error handling as described in the - libdwarf consumer document section 3. Dbg is the Dwarf_debug - structure being processed. Error is a pointer to the pointer - to the error descriptor that will be returned. Errval is an - error code listed in dwarf_error.h. -*/ -void -_dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error, Dwarf_Sword errval) -{ - Dwarf_Error errptr; - - /* - Allow NULL dbg on entry, since sometimes that can happen and we - want to report the upper-level error, not this one. */ - if (error != NULL) { - - /* - If dbg is NULL, use the alternate error struct. However, - this will overwrite the earlier error. */ - if (dbg != NULL) { - errptr = - (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); - if (errptr == NULL) { - fprintf(stderr, - "Could not allocate Dwarf_Error structure, " - "abort() in libdwarf.\n"); - abort(); - } - } else { - /* We have no dbg to work with. dwarf_init failed. We hack - up a special area. */ - errptr = _dwarf_special_no_dbg_error_malloc(); - if (errptr == NULL) { - fprintf(stderr, - "Could not allocate Dwarf_Error structure, " - "abort() in libdwarf..\n"); - abort(); - } - } - - errptr->er_errval = errval; - *error = errptr; - return; - } - - if (dbg != NULL && dbg->de_errhand != NULL) { - errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); - if (errptr == NULL) { - fprintf(stderr, "Could not allocate Dwarf_Error structure," - " abort() in libdwarf.\n"); - abort(); - } - errptr->er_errval = errval; - dbg->de_errhand(errptr, dbg->de_errarg); - return; - } - fprintf(stderr, - "abort() in libdwarf. No error argument, no handler.\n"); - abort(); -} - - -Dwarf_Unsigned -dwarf_errno(Dwarf_Error error) -{ - if (error == NULL) { - return (0); - } - - return (error->er_errval); -} - - -/* -*/ -char * -dwarf_errmsg(Dwarf_Error error) -{ - if (error == NULL) { - return "Dwarf_Error is NULL"; - } - - if (error->er_errval > (sizeof(_dwarf_errmsgs) / sizeof(char *))) { - return "Dwarf_Error value out of range"; - } - - return ((char *) _dwarf_errmsgs[error->er_errval]); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_error.h b/usr/src/tools/ctf/dwarf/common/dwarf_error.h deleted file mode 100644 index 27acf70db0..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_error.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - - Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -void _dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error, - Dwarf_Sword errval); - -struct Dwarf_Error_s { - Dwarf_Sword er_errval; -}; diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_form.c b/usr/src/tools/ctf/dwarf/common/dwarf_form.c deleted file mode 100644 index fcdd64230c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_form.c +++ /dev/null @@ -1,963 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 David Anderson. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include "dwarf_die_deliv.h" - -int -dwarf_hasform(Dwarf_Attribute attr, - Dwarf_Half form, - Dwarf_Bool * return_bool, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - *return_bool = (attr->ar_attribute_form == form); - return DW_DLV_OK; -} - -/* Not often called, we do not worry about efficiency here. - The dwarf_whatform() call does the sanity checks for us. -*/ -int -dwarf_whatform_direct(Dwarf_Attribute attr, - Dwarf_Half * return_form, Dwarf_Error * error) -{ - int res = dwarf_whatform(attr, return_form, error); - - if (res != DW_DLV_OK) { - return res; - } - - *return_form = attr->ar_attribute_form_direct; - return (DW_DLV_OK); -} -void * -dwarf_uncompress_integer_block( - Dwarf_Debug dbg, - Dwarf_Bool unit_is_signed, - Dwarf_Small unit_length_in_bits, - void* input_block, - Dwarf_Unsigned input_length_in_bytes, - Dwarf_Unsigned* output_length_in_units_ptr, - Dwarf_Error* error -) -{ - Dwarf_Unsigned output_length_in_units = 0; - void * output_block = 0; - int i = 0; - char * ptr = 0; - int remain = 0; - Dwarf_sfixed * array = 0; - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return((void *)DW_DLV_BADADDR); - } - - if (unit_is_signed == false || - unit_length_in_bits != 32 || - input_block == NULL || - input_length_in_bytes == 0 || - output_length_in_units_ptr == NULL) { - - _dwarf_error(NULL, error, DW_DLE_BADBITC); - return ((void *) DW_DLV_BADADDR); - } - - /* At this point we assume the format is: signed 32 bit */ - - /* first uncompress everything to find the total size. */ - - output_length_in_units = 0; - remain = input_length_in_bytes; - ptr = input_block; - while (remain > 0) { - Dwarf_Signed num; - Dwarf_Word len; - num = _dwarf_decode_s_leb128((unsigned char *)ptr, &len); - ptr += len; - remain -= len; - output_length_in_units++; - } - - if (remain != 0) { - _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); - return((void *)DW_DLV_BADADDR); - } - - /* then alloc */ - - output_block = (void *) - _dwarf_get_alloc(dbg, - DW_DLA_STRING, - output_length_in_units * (unit_length_in_bits / 8)); - if (output_block == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((void*)DW_DLV_BADADDR); - } - - /* then uncompress again and copy into new buffer */ - - array = (Dwarf_sfixed *) output_block; - remain = input_length_in_bytes; - ptr = input_block; - for (i=0; i<output_length_in_units && remain>0; i++) { - Dwarf_Signed num; - Dwarf_Word len; - num = _dwarf_decode_s_leb128((unsigned char *)ptr, &len); - ptr += len; - remain -= len; - array[i] = num; - } - - if (remain != 0) { - dwarf_dealloc(dbg, (unsigned char *)output_block, DW_DLA_STRING); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - *output_length_in_units_ptr = output_length_in_units; - return output_block; -} - -void -dwarf_dealloc_uncompressed_block(Dwarf_Debug dbg, void * space) -{ - dwarf_dealloc(dbg, space, DW_DLA_STRING); -} - - -int -dwarf_whatform(Dwarf_Attribute attr, - Dwarf_Half * return_form, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - *return_form = attr->ar_attribute_form; - return (DW_DLV_OK); -} - - -/* - This function is analogous to dwarf_whatform. - It returns the attribute in attr instead of - the form. -*/ -int -dwarf_whatattr(Dwarf_Attribute attr, - Dwarf_Half * return_attr, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - *return_attr = (attr->ar_attribute); - return DW_DLV_OK; -} - - -/* - A global offset cannot be returned by this interface: - see dwarf_global_formref(). - - DW_FORM_ref_addr is considered an incorrect form - for this call because DW_FORM_ref_addr is a global-offset into - the debug_info section. - - For the same reason DW_FORM_data4/data8 are not returned - from this function. - - For the same reason DW_FORM_sec_offset is not returned - from this function, DW_FORM_sec_offset is a global offset - (to various sections, not a CU relative offset. - - DW_FORM_ref_addr has a value which was documented in - DWARF2 as address-size but which was always an offset - so should have always been offset size (wording - corrected in DWARF3). - - -*/ -int -dwarf_formref(Dwarf_Attribute attr, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Unsigned offset = 0; - Dwarf_CU_Context cu_context = 0; - - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - switch (attr->ar_attribute_form) { - - case DW_FORM_ref1: - offset = *(Dwarf_Small *) attr->ar_debug_info_ptr; - break; - - case DW_FORM_ref2: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Half)); - break; - - case DW_FORM_ref4: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed)); - break; - - case DW_FORM_ref8: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned)); - break; - - case DW_FORM_ref_udata: - offset = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL); - break; - - default: - _dwarf_error(dbg, error, DW_DLE_BAD_REF_FORM); - return (DW_DLV_ERROR); - } - - /* Check that offset is within current cu portion of .debug_info. */ - if (offset >= cu_context->cc_length + - cu_context->cc_length_size + cu_context->cc_extension_size) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - *ret_offset = (offset); - return DW_DLV_OK; -} - -/* dwarf_formsig8 returns in the caller-provided 8 byte area - the 8 bytes of a DW_FORM_ref_sig8 (copying the bytes - directly to the caller). Not a string, an 8 byte - MD5 hash. This function is new in DWARF4 libdwarf. -*/ -int dwarf_formsig8(Dwarf_Attribute attr, - Dwarf_Sig8 * returned_sig_bytes, - Dwarf_Error* error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Unsigned field_end_offset = 0; - Dwarf_CU_Context cu_context = 0; - - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - if(attr->ar_attribute_form != DW_FORM_ref_sig8 ) { - _dwarf_error(dbg, error, DW_DLE_BAD_REF_SIG8_FORM); - return (DW_DLV_ERROR); - } - - field_end_offset = attr->ar_debug_info_ptr + sizeof(Dwarf_Sig8) - - (dbg->de_debug_info.dss_data + cu_context->cc_debug_info_offset); - /* Check that offset is within current cu portion of .debug_info. */ - if (field_end_offset > cu_context->cc_length + - cu_context->cc_length_size + cu_context->cc_extension_size) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - memcpy(returned_sig_bytes, attr->ar_debug_info_ptr, - sizeof(Dwarf_Sig8)); - return DW_DLV_OK; -} - - -/* - Since this returns section-relative debug_info offsets, - this can represent all REFERENCE forms correctly - and allows all applicable forms. - - DW_FORM_ref_addr has a value which was documented in - DWARF2 as address-size but which was always an offset - so should have always been offset size (wording - corrected in DWARF3). - - See the DWARF4 document for the 3 cases fitting - reference forms. The caller must determine which section the - reference 'points' to. The function added in November 2009, - dwarf_get_form_class(), helps in this regard. - -*/ -int -dwarf_global_formref(Dwarf_Attribute attr, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Unsigned offset = 0; - Dwarf_Addr ref_addr = 0; - Dwarf_CU_Context cu_context = 0; - Dwarf_Half context_version = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - context_version = cu_context->cc_version_stamp; - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - switch (attr->ar_attribute_form) { - - case DW_FORM_ref1: - offset = *(Dwarf_Small *) attr->ar_debug_info_ptr; - goto fixoffset; - - case DW_FORM_ref2: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Half)); - goto fixoffset; - - case DW_FORM_ref4: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed)); - goto fixoffset; - - case DW_FORM_ref8: - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned)); - goto fixoffset; - - case DW_FORM_ref_udata: - offset = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL); - - fixoffset: /* we have a local offset, make it - global */ - - /* check legality of offset */ - if (offset >= cu_context->cc_length + - cu_context->cc_length_size + - cu_context->cc_extension_size) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - /* globalize the offset */ - offset += cu_context->cc_debug_info_offset; - break; - /* The DWARF2 document did not make clear that - DW_FORM_data4( and 8) were references with - global offsets to some section. - That was first clearly documented in DWARF3. - In DWARF4 these two forms are no longer references. */ - case DW_FORM_data4: - if(context_version == DW_CU_VERSION4) { - _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM); - return (DW_DLV_ERROR); - } - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed)); - /* The offset is global. */ - break; - case DW_FORM_data8: - if(context_version == DW_CU_VERSION4) { - _dwarf_error(dbg, error, DW_DLE_NOT_REF_FORM); - return (DW_DLV_ERROR); - } - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned)); - /* The offset is global. */ - break; - case DW_FORM_ref_addr: - case DW_FORM_sec_offset: - { - /* DW_FORM_sec_offset first exists in DWARF4.*/ - /* It is up to the caller to know what the offset - of DW_FORM_sec_offset refers to, - the offset is not going to refer to .debug_info! */ - unsigned length_size = cu_context->cc_length_size; - if(length_size == 4) { - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed)); - } else if (length_size == 8) { - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Unsigned)); - } else { - _dwarf_error(dbg, error, DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD); - return (DW_DLV_ERROR); - } - } - break; - - default: - _dwarf_error(dbg, error, DW_DLE_BAD_REF_FORM); - return (DW_DLV_ERROR); - } - - /* We do not know what section the offset refers to, so - we have no way to check it for correctness. */ - *ret_offset = offset; - return DW_DLV_OK; -} - - -int -dwarf_formaddr(Dwarf_Attribute attr, - Dwarf_Addr * return_addr, Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Addr ret_addr = 0; - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - if (attr->ar_attribute_form == DW_FORM_addr - /* || attr->ar_attribute_form == DW_FORM_ref_addr Allowance of - DW_FORM_ref_addr was a mistake. The value returned in that - case is NOT an address it is a global debug_info offset (ie, - not CU-relative offset within the CU in debug_info). The - Dwarf document refers to it as an address (misleadingly) in - sec 6.5.4 where it describes the reference form. It is - address-sized so that the linker can easily update it, but - it is a reference inside the debug_info section. No longer - allowed. */ - ) { - - READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr, - attr->ar_debug_info_ptr, - cu_context->cc_address_size); - *return_addr = ret_addr; - return (DW_DLV_OK); - } - - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); -} - - -int -dwarf_formflag(Dwarf_Attribute attr, - Dwarf_Bool * ret_bool, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - if (attr->ar_attribute_form == DW_FORM_flag_present) { - /* Implicit means we don't read any data at all. Just - the existence of the Form does it. DWARF4. */ - *ret_bool = 1; - return (DW_DLV_OK); - } - - if (attr->ar_attribute_form == DW_FORM_flag) { - *ret_bool = (*(Dwarf_Small *) attr->ar_debug_info_ptr != 0); - return (DW_DLV_OK); - } - _dwarf_error(cu_context->cc_dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); -} - - -int -dwarf_formudata(Dwarf_Attribute attr, - Dwarf_Unsigned * return_uval, Dwarf_Error * error) -{ - Dwarf_Unsigned ret_value = 0; - Dwarf_Debug dbg = 0; - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - dbg = cu_context->cc_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - switch (attr->ar_attribute_form) { - - case DW_FORM_data1: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Small)); - *return_uval = ret_value; - return DW_DLV_OK; - - /* READ_UNALIGNED does the right thing as it reads - the right number bits and generates host order. - So we can just assign to *return_uval. */ - case DW_FORM_data2:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Half)); - *return_uval = ret_value; - return DW_DLV_OK; - } - - case DW_FORM_data4:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - attr->ar_debug_info_ptr, - sizeof(Dwarf_ufixed)); - *return_uval = ret_value; - return DW_DLV_OK; - } - - case DW_FORM_data8:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - attr->ar_debug_info_ptr, - sizeof(Dwarf_Unsigned)); - *return_uval = ret_value; - return DW_DLV_OK; - } - break; - case DW_FORM_udata: - ret_value = - (_dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL)); - *return_uval = ret_value; - return DW_DLV_OK; - - - /* see bug 583450. We do not allow reading sdata from a udata - value. Caller can retry, calling sdata */ - - - default: - break; - } - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); -} - - -int -dwarf_formsdata(Dwarf_Attribute attr, - Dwarf_Signed * return_sval, Dwarf_Error * error) -{ - Dwarf_Signed ret_value = 0; - Dwarf_Debug dbg = 0; - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - dbg = cu_context->cc_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - switch (attr->ar_attribute_form) { - - case DW_FORM_data1: - *return_sval = (*(Dwarf_Sbyte *) attr->ar_debug_info_ptr); - return DW_DLV_OK; - - /* READ_UNALIGNED does not sign extend. - So we have to use a cast to get the - value sign extended in the right way for each case. */ - case DW_FORM_data2:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Signed, - attr->ar_debug_info_ptr, - sizeof(Dwarf_Shalf)); - *return_sval = (Dwarf_Shalf) ret_value; - return DW_DLV_OK; - - } - - case DW_FORM_data4:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Signed, - attr->ar_debug_info_ptr, - sizeof(Dwarf_sfixed)); - *return_sval = (Dwarf_sfixed) ret_value; - return DW_DLV_OK; - } - - case DW_FORM_data8:{ - READ_UNALIGNED(dbg, ret_value, Dwarf_Signed, - attr->ar_debug_info_ptr, - sizeof(Dwarf_Signed)); - *return_sval = (Dwarf_Signed) ret_value; - return DW_DLV_OK; - } - - case DW_FORM_sdata: - ret_value = - (_dwarf_decode_s_leb128(attr->ar_debug_info_ptr, NULL)); - *return_sval = ret_value; - return DW_DLV_OK; - - - /* see bug 583450. We do not allow reading sdata from a udata - value. Caller can retry, calling sdata */ - - - default: - break; - } - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); -} - - -int -dwarf_formblock(Dwarf_Attribute attr, - Dwarf_Block ** return_block, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - Dwarf_Debug dbg = 0; - Dwarf_Unsigned length = 0; - Dwarf_Small *data = 0; - Dwarf_Word leb128_length = 0; - Dwarf_Block *ret_block = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - switch (attr->ar_attribute_form) { - - case DW_FORM_block1: - length = *(Dwarf_Small *) attr->ar_debug_info_ptr; - data = attr->ar_debug_info_ptr + sizeof(Dwarf_Small); - break; - - case DW_FORM_block2: - READ_UNALIGNED(dbg, length, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_Half)); - data = attr->ar_debug_info_ptr + sizeof(Dwarf_Half); - break; - - case DW_FORM_block4: - READ_UNALIGNED(dbg, length, Dwarf_Unsigned, - attr->ar_debug_info_ptr, sizeof(Dwarf_ufixed)); - data = attr->ar_debug_info_ptr + sizeof(Dwarf_ufixed); - break; - - case DW_FORM_block: - length = _dwarf_decode_u_leb128(attr->ar_debug_info_ptr, - &leb128_length); - data = attr->ar_debug_info_ptr + leb128_length; - break; - - default: - _dwarf_error(cu_context->cc_dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); - } - - /* Check that block lies within current cu in .debug_info. */ - if (attr->ar_debug_info_ptr + length >= - dbg->de_debug_info.dss_data + cu_context->cc_debug_info_offset + - cu_context->cc_length + cu_context->cc_length_size + - cu_context->cc_extension_size) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD); - return (DW_DLV_ERROR); - } - - ret_block = (Dwarf_Block *) _dwarf_get_alloc(dbg, DW_DLA_BLOCK, 1); - if (ret_block == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - ret_block->bl_len = length; - ret_block->bl_data = (Dwarf_Ptr) data; - ret_block->bl_from_loclist = 0; - ret_block->bl_section_offset = data - dbg->de_debug_info.dss_data; - - - *return_block = ret_block; - return (DW_DLV_OK); -} - - -/* Contrary to long standing documentation, - The string pointer returned thru return_str must - never have dwarf_dealloc() applied to it. - Documentation fixed July 2005. -*/ -int -dwarf_formstring(Dwarf_Attribute attr, - char **return_str, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - Dwarf_Debug dbg = 0; - Dwarf_Unsigned offset = 0; - int res = DW_DLV_ERROR; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - if (cu_context->cc_dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cu_context->cc_dbg; - - if (attr->ar_attribute_form == DW_FORM_string) { - - void *begin = attr->ar_debug_info_ptr; - - if (0 == dbg->de_assume_string_in_bounds) { - /* Check that string lies within current cu in .debug_info. - */ - void *end = dbg->de_debug_info.dss_data + - cu_context->cc_debug_info_offset + - cu_context->cc_length + cu_context->cc_length_size + - cu_context->cc_extension_size; - if (0 == _dwarf_string_valid(begin, end)) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD); - return (DW_DLV_ERROR); - } - } - *return_str = (char *) (begin); - return DW_DLV_OK; - } - - if (attr->ar_attribute_form == DW_FORM_strp) { - READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, - attr->ar_debug_info_ptr, - cu_context->cc_length_size); - - res = _dwarf_load_section(dbg, &dbg->de_debug_str,error); - if (res != DW_DLV_OK) { - return res; - } - if (0 == dbg->de_assume_string_in_bounds) { - /* Check that string lies within current cu in .debug_info. - */ - void *end = dbg->de_debug_str.dss_data + - dbg->de_debug_str.dss_size; - void*begin = dbg->de_debug_str.dss_data + offset; - if (0 == _dwarf_string_valid(begin, end)) { - _dwarf_error(dbg, error, DW_DLE_STRP_OFFSET_BAD); - return (DW_DLV_ERROR); - } - } - *return_str = (char *) (dbg->de_debug_str.dss_data + offset); - return DW_DLV_OK; - } - - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); -} - -int -dwarf_formexprloc(Dwarf_Attribute attr, - Dwarf_Unsigned * return_exprlen, - Dwarf_Ptr * block_ptr, - Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_CU_Context cu_context = 0; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - - cu_context = attr->ar_cu_context; - if (cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - - dbg = cu_context->cc_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - - if (attr->ar_attribute_form == DW_FORM_exprloc ) { - Dwarf_Unsigned exprlen = - (_dwarf_decode_u_leb128(attr->ar_debug_info_ptr, NULL)); - Dwarf_Small * addr = attr->ar_debug_info_ptr; - *return_exprlen = exprlen; - *block_ptr = addr + exprlen; - return DW_DLV_OK; - - } - _dwarf_error(dbg, error, DW_DLE_ATTR_EXPRLOC_FORM_BAD); - return (DW_DLV_ERROR); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_frame.c b/usr/src/tools/ctf/dwarf/common/dwarf_frame.c deleted file mode 100644 index 3a825ee925..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_frame.c +++ /dev/null @@ -1,2442 +0,0 @@ -/* - - Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include "dwarf_frame.h" -#include "dwarf_arange.h" /* Using Arange as a way to build a - list */ - -#define FDE_NULL_CHECKS_AND_SET_DBG(fde,dbg ) \ - do { \ - if ((fde) == NULL) { \ - _dwarf_error(NULL, error, DW_DLE_FDE_NULL); \ - return (DW_DLV_ERROR); \ - } \ - (dbg)= (fde)->fd_dbg; \ - if ((dbg) == NULL) { \ - _dwarf_error(NULL, error, DW_DLE_FDE_DBG_NULL);\ - return (DW_DLV_ERROR); \ - } } while (0) - - -#define MIN(a,b) (((a) < (b))? a:b) - -static void _dwarf_init_regrule_table(struct Dwarf_Reg_Rule_s *t1reg, - int last_reg_num, - int initial_value); -static int dwarf_initialize_fde_table(Dwarf_Debug dbg, - struct Dwarf_Frame_s *fde_table, - unsigned table_real_data_size, - Dwarf_Error * error); -static void dwarf_free_fde_table(struct Dwarf_Frame_s *fde_table); - -#if 0 -/* Only used for debugging libdwarf. */ -static void dump_frame_rule(char *msg, - struct Dwarf_Reg_Rule_s *reg_rule); -#endif - - - -/* - This function is the heart of the debug_frame stuff. Don't even - think of reading this without reading both the Libdwarf and - consumer API carefully first. This function basically executes - frame instructions contained in a Cie or an Fde, but does in a - number of different ways depending on the information sought. - Start_instr_ptr points to the first byte of the frame instruction - stream, and final_instr_ptr to the to the first byte after the - last. - - The offsets returned in the frame instructions are factored. That - is they need to be multiplied by either the code_alignment_factor - or the data_alignment_factor, as appropriate to obtain the actual - offset. This makes it possible to expand an instruction stream - without the corresponding Cie. However, when an Fde frame instr - sequence is being expanded there must be a valid Cie with a pointer - to an initial table row. - - - If successful, returns DW_DLV_OK - And sets returned_count thru the pointer - if make_instr is true. - If make_instr is false returned_count - should NOT be used by the caller (returned_count - is set to 0 thru the pointer by this routine...) - If unsuccessful, returns DW_DLV_ERROR - and sets returned_error to the error code - - It does not do a whole lot of input validation being a private - function. Please make sure inputs are valid. - - (1) If make_instr is true, it makes a list of pointers to - Dwarf_Frame_Op structures containing the frame instructions - executed. A pointer to this list is returned in ret_frame_instr. - Make_instr is true only when a list of frame instructions is to be - returned. In this case since we are not interested in the contents - of the table, the input Cie can be NULL. This is the only case - where the inpute Cie can be NULL. - - (2) If search_pc is true, frame instructions are executed till - either a location is reached that is greater than the search_pc_val - provided, or all instructions are executed. At this point the - last row of the table generated is returned in a structure. - A pointer to this structure is supplied in table. - - (3) This function is also used to create the initial table row - defined by a Cie. In this case, the Dwarf_Cie pointer cie, is - NULL. For an FDE, however, cie points to the associated Cie. - - make_instr - make list of frame instr? 0/1 - ret_frame_instr - Ptr to list of ptrs to frame instrs - search_pc - Search for a pc value? 0/1 - search_pc_val - Search for this pc value - initial_loc - Initial code location value. - start_instr_ptr - Ptr to start of frame instrs. - final_instr_ptr - Ptr just past frame instrs. - table - Ptr to struct with last row. - cie - Ptr to Cie used by the Fde. - Different cies may have distinct address-sizes, so the cie - is used, not de_pointer_size. - -*/ - -int -_dwarf_exec_frame_instr(Dwarf_Bool make_instr, - Dwarf_Frame_Op ** ret_frame_instr, - Dwarf_Bool search_pc, - Dwarf_Addr search_pc_val, - Dwarf_Addr initial_loc, - Dwarf_Small * start_instr_ptr, - Dwarf_Small * final_instr_ptr, - Dwarf_Frame table, - Dwarf_Cie cie, - Dwarf_Debug dbg, - Dwarf_Half reg_num_of_cfa, - Dwarf_Sword * returned_count, - int *returned_error) -{ -#define ERROR_IF_REG_NUM_TOO_HIGH(macreg,machigh_reg) \ - do { \ - if ((macreg) >= (machigh_reg) || (macreg) < 0) { \ - SIMPLE_ERROR_RETURN(DW_DLE_DF_REG_NUM_TOO_HIGH); \ - } \ - } /*CONSTCOND */ while(0) -#define SIMPLE_ERROR_RETURN(code) \ - free(localregtab); \ - *returned_error = code; \ - return DW_DLV_ERROR - - /* Sweeps the frame instructions. */ - Dwarf_Small *instr_ptr; - - /* Register numbers not limited to just 255, thus not using - Dwarf_Small. */ - typedef int reg_num_type; - - Dwarf_Unsigned factored_N_value; - Dwarf_Signed signed_factored_N_value; - Dwarf_Addr current_loc = initial_loc; /* code location/ - pc-value - corresponding to the - frame instructions. - Starts at zero when - the caller has no - value to pass in. */ - - /* Must be min de_pointer_size bytes and must be at least sizeof - Dwarf_ufixed */ - Dwarf_Unsigned adv_loc = 0; - - int reg_count = dbg->de_frame_reg_rules_entry_count; - struct Dwarf_Reg_Rule_s *localregtab = calloc(reg_count, - sizeof(struct - Dwarf_Reg_Rule_s)); - - struct Dwarf_Reg_Rule_s cfa_reg; - - - /* This is used to end executing frame instructions. */ - /* Becomes true when search_pc is true and current_loc */ - /* is greater than search_pc_val. */ - Dwarf_Bool search_over = false; - - /* Used by the DW_FRAME_advance_loc instr */ - /* to hold the increment in pc value. */ - Dwarf_Addr adv_pc; - - /* Contains the length in bytes of */ - /* an leb128 encoded number. */ - Dwarf_Word leb128_length; - - Dwarf_Half address_size = (cie)? cie->ci_address_size: - dbg->de_pointer_size; - - /* Counts the number of frame instructions executed. */ - Dwarf_Word instr_count = 0; - - /* - These contain the current fields of the current frame - instruction. */ - Dwarf_Small fp_base_op = 0; - Dwarf_Small fp_extended_op; - reg_num_type fp_register; - - /* The value in fp_offset may be signed, though we call it - unsigned. This works ok for 2-s complement arithmetic. */ - Dwarf_Unsigned fp_offset; - Dwarf_Off fp_instr_offset; - - /* - Stack_table points to the row (Dwarf_Frame ie) being pushed or - popped by a remember or restore instruction. Top_stack points to - the top of the stack of rows. */ - Dwarf_Frame stack_table = NULL; - Dwarf_Frame top_stack = NULL; - - /* - These are used only when make_instr is true. Curr_instr is a - pointer to the current frame instruction executed. - Curr_instr_ptr, head_instr_list, and curr_instr_list are used to - form a chain of Dwarf_Frame_Op structs. Dealloc_instr_ptr is - used to deallocate the structs used to form the chain. - Head_instr_block points to a contiguous list of pointers to the - Dwarf_Frame_Op structs executed. */ - Dwarf_Frame_Op *curr_instr; - Dwarf_Chain curr_instr_item, dealloc_instr_item; - Dwarf_Chain head_instr_chain = NULL; - Dwarf_Chain tail_instr_chain = NULL; - Dwarf_Frame_Op *head_instr_block; - - /* - These are the alignment_factors taken from the Cie provided. - When no input Cie is provided they are set to 1, because only - factored offsets are required. */ - Dwarf_Sword code_alignment_factor = 1; - Dwarf_Sword data_alignment_factor = 1; - - /* - This flag indicates when an actual alignment factor is needed. - So if a frame instruction that computes an offset using an - alignment factor is encountered when this flag is set, an error - is returned because the Cie did not have a valid augmentation. */ - Dwarf_Bool need_augmentation = false; - - Dwarf_Word i; - - /* Initialize first row from associated Cie. Using temp regs - explicity */ - - if (localregtab == 0) { - SIMPLE_ERROR_RETURN(DW_DLE_ALLOC_FAIL); - } - { - struct Dwarf_Reg_Rule_s *t1reg = localregtab; - struct Dwarf_Reg_Rule_s *t1end = t1reg + reg_count; - - if (cie != NULL && cie->ci_initial_table != NULL) { - struct Dwarf_Reg_Rule_s *t2reg = - cie->ci_initial_table->fr_reg; - - if (reg_count != cie->ci_initial_table->fr_reg_count) { - /* Should never happen, it makes no sense to have the - table sizes change. There is no real allowance for - the set of registers to change dynamically in a - single Dwarf_Debug (except the size can be set near - initial Dwarf_Debug creation time). */ - SIMPLE_ERROR_RETURN - (DW_DLE_FRAME_REGISTER_COUNT_MISMATCH); - } - - for (; t1reg < t1end; t1reg++, t2reg++) { - *t1reg = *t2reg; - } - cfa_reg = cie->ci_initial_table->fr_cfa_rule; - } else { - _dwarf_init_regrule_table(t1reg, - reg_count, - dbg->de_frame_rule_initial_value); - _dwarf_init_regrule_table(&cfa_reg, 1, - dbg->de_frame_rule_initial_value); - } - } - - /* - The idea here is that the code_alignment_factor and - data_alignment_factor which are needed for certain instructions - are valid only when the Cie has a proper augmentation string. So - if the augmentation is not right, only Frame instruction can be - read. */ - if (cie != NULL && cie->ci_augmentation != NULL) { - code_alignment_factor = cie->ci_code_alignment_factor; - data_alignment_factor = cie->ci_data_alignment_factor; - } else { - need_augmentation = !make_instr; - } - - instr_ptr = start_instr_ptr; - while ((instr_ptr < final_instr_ptr) && (!search_over)) { - Dwarf_Small instr = 0; - Dwarf_Small opcode = 0; - reg_num_type reg_no = 0; - - fp_instr_offset = instr_ptr - start_instr_ptr; - instr = *(Dwarf_Small *) instr_ptr; - instr_ptr += sizeof(Dwarf_Small); - - fp_base_op = (instr & 0xc0) >> 6; - if ((instr & 0xc0) == 0x00) { - opcode = instr; /* is really extended op */ - fp_extended_op = (instr & (~(0xc0))) & 0xff; - } else { - opcode = instr & 0xc0; /* is base op */ - fp_extended_op = 0; - } - - fp_register = 0; - fp_offset = 0; - switch (opcode) { - case DW_CFA_advance_loc: - { - /* base op */ - fp_offset = adv_pc = instr & DW_FRAME_INSTR_OFFSET_MASK; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - adv_pc = adv_pc * code_alignment_factor; - - search_over = search_pc && - (current_loc + adv_pc > search_pc_val); - /* If gone past pc needed, retain old pc. */ - if (!search_over) { - current_loc = current_loc + adv_pc; - } - break; - } - - case DW_CFA_offset: - { /* base op */ - reg_no = - (reg_num_type) (instr & DW_FRAME_INSTR_OFFSET_MASK); - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - factored_N_value = - _dwarf_decode_u_leb128(instr_ptr, &leb128_length); - instr_ptr = instr_ptr + leb128_length; - - fp_register = reg_no; - fp_offset = factored_N_value; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - - localregtab[reg_no].ru_is_off = 1; - localregtab[reg_no].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_no].ru_register = reg_num_of_cfa; - localregtab[reg_no].ru_offset_or_block_len = - factored_N_value * data_alignment_factor; - - break; - } - - case DW_CFA_restore: - { /* base op */ - reg_no = (instr & DW_FRAME_INSTR_OFFSET_MASK); - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - fp_register = reg_no; - - if (cie != NULL && cie->ci_initial_table != NULL) - localregtab[reg_no] = - cie->ci_initial_table->fr_reg[reg_no]; - else if (!make_instr) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_MAKE_INSTR_NO_INIT); - } - - break; - } - case DW_CFA_set_loc: - { - Dwarf_Addr new_loc = 0; - - READ_UNALIGNED(dbg, new_loc, Dwarf_Addr, - instr_ptr, address_size); - instr_ptr += address_size; - if (new_loc != 0 && current_loc != 0) { - /* Pre-relocation or before current_loc is set the - test comparing new_loc and current_loc makes no - sense. Testing for non-zero (above) is a way - (fallible) to check that current_loc, new_loc - are already relocated. */ - if (new_loc <= current_loc) { - /* Within a frame, address must increase. - Seemingly it has not. Seems to be an error. */ - - SIMPLE_ERROR_RETURN - (DW_DLE_DF_NEW_LOC_LESS_OLD_LOC); - } - } - - search_over = search_pc && (new_loc > search_pc_val); - - /* If gone past pc needed, retain old pc. */ - if (!search_over) { - current_loc = new_loc; - } - fp_offset = new_loc; - break; - } - - case DW_CFA_advance_loc1: - { - fp_offset = adv_loc = *(Dwarf_Small *) instr_ptr; - instr_ptr += sizeof(Dwarf_Small); - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - adv_loc *= code_alignment_factor; - - search_over = search_pc && - (current_loc + adv_loc > search_pc_val); - - /* If gone past pc needed, retain old pc. */ - if (!search_over) { - current_loc = current_loc + adv_loc; - } - break; - } - - case DW_CFA_advance_loc2: - { - READ_UNALIGNED(dbg, adv_loc, Dwarf_Unsigned, - instr_ptr, sizeof(Dwarf_Half)); - instr_ptr += sizeof(Dwarf_Half); - fp_offset = adv_loc; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - adv_loc *= code_alignment_factor; - - search_over = search_pc && - (current_loc + adv_loc > search_pc_val); - - /* If gone past pc needed, retain old pc. */ - if (!search_over) { - current_loc = current_loc + adv_loc; - } - break; - } - - case DW_CFA_advance_loc4: - { - READ_UNALIGNED(dbg, adv_loc, Dwarf_Unsigned, - instr_ptr, sizeof(Dwarf_ufixed)); - instr_ptr += sizeof(Dwarf_ufixed); - fp_offset = adv_loc; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - adv_loc *= code_alignment_factor; - - search_over = search_pc && - (current_loc + adv_loc > search_pc_val); - - /* If gone past pc needed, retain old pc. */ - if (!search_over) { - current_loc = current_loc + adv_loc; - } - break; - } - - case DW_CFA_offset_extended: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count);; - factored_N_value = - _dwarf_decode_u_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - localregtab[reg_no].ru_is_off = 1; - localregtab[reg_no].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_no].ru_register = reg_num_of_cfa; - localregtab[reg_no].ru_offset_or_block_len = factored_N_value * - data_alignment_factor; - - fp_register = reg_no; - fp_offset = factored_N_value; - break; - } - - case DW_CFA_restore_extended: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - if (cie != NULL && cie->ci_initial_table != NULL) { - localregtab[reg_no] = cie->ci_initial_table->fr_reg[reg_no]; - } else { - if (!make_instr) { - SIMPLE_ERROR_RETURN - (DW_DLE_DF_MAKE_INSTR_NO_INIT); - } - } - - fp_register = reg_no; - break; - } - - case DW_CFA_undefined: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - localregtab[reg_no].ru_is_off = 0; - localregtab[reg_no].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_no].ru_register = - dbg->de_frame_undefined_value_number; - localregtab[reg_no].ru_offset_or_block_len = 0; - - fp_register = reg_no; - break; - } - - case DW_CFA_same_value: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - localregtab[reg_no].ru_is_off = 0; - localregtab[reg_no].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_no].ru_register = - dbg->de_frame_same_value_number; - localregtab[reg_no].ru_offset_or_block_len = 0; - fp_register = reg_no; - break; - } - - case DW_CFA_register: - { - Dwarf_Unsigned lreg; - reg_num_type reg_noA = 0; - reg_num_type reg_noB = 0; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_noA = (reg_num_type) lreg; - - ERROR_IF_REG_NUM_TOO_HIGH(reg_noA, reg_count); - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_noB = (reg_num_type) lreg; - - if (reg_noB > reg_count) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_REG_NUM_TOO_HIGH); - } - - - localregtab[reg_noA].ru_is_off = 0; - localregtab[reg_noA].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_noA].ru_register = reg_noB; - localregtab[reg_noA].ru_offset_or_block_len = 0; - - fp_register = reg_noA; - fp_offset = reg_noB; - break; - } - - case DW_CFA_remember_state: - { - stack_table = (Dwarf_Frame) - _dwarf_get_alloc(dbg, DW_DLA_FRAME, 1); - if (stack_table == NULL) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_ALLOC_FAIL); - } - - for (i = 0; i < reg_count; i++) - stack_table->fr_reg[i] = localregtab[i]; - stack_table->fr_cfa_rule = cfa_reg; - - if (top_stack != NULL) - stack_table->fr_next = top_stack; - top_stack = stack_table; - - break; - } - - case DW_CFA_restore_state: - { - if (top_stack == NULL) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_POP_EMPTY_STACK); - } - stack_table = top_stack; - top_stack = stack_table->fr_next; - - for (i = 0; i < reg_count; i++) - localregtab[i] = stack_table->fr_reg[i]; - cfa_reg = stack_table->fr_cfa_rule; - - dwarf_dealloc(dbg, stack_table, DW_DLA_FRAME); - break; - } - - case DW_CFA_def_cfa: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - factored_N_value = - _dwarf_decode_u_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - cfa_reg.ru_is_off = 1; - cfa_reg.ru_value_type = DW_EXPR_OFFSET; - cfa_reg.ru_register = reg_no; - cfa_reg.ru_offset_or_block_len = factored_N_value; - - fp_register = reg_no; - fp_offset = factored_N_value; - break; - } - - case DW_CFA_def_cfa_register: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - cfa_reg.ru_register = reg_no; - /* Do NOT set ru_offset_or_block_len or ru_is_off here. - See dwarf2/3 spec. */ - fp_register = reg_no; - break; - } - - case DW_CFA_def_cfa_offset: - { - factored_N_value = - _dwarf_decode_u_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - /* Do set ru_is_off here, as here factored_N_value - counts. */ - cfa_reg.ru_is_off = 1; - cfa_reg.ru_value_type = DW_EXPR_OFFSET; - cfa_reg.ru_offset_or_block_len = factored_N_value; - - fp_offset = factored_N_value; - break; - } - case DW_CFA_nop: - { - break; - } - /* DWARF3 ops begin here. */ - case DW_CFA_def_cfa_expression: - { - /* A single DW_FORM_block representing a dwarf - expression. The form block establishes the way to - compute the CFA. */ - Dwarf_Unsigned block_len = 0; - - DECODE_LEB128_UWORD(instr_ptr, block_len); - cfa_reg.ru_is_off = 0; /* arbitrary */ - cfa_reg.ru_value_type = DW_EXPR_EXPRESSION; - cfa_reg.ru_offset_or_block_len = block_len; - cfa_reg.ru_block = instr_ptr; - fp_offset = (Dwarf_Unsigned)(uintptr_t)instr_ptr; - instr_ptr += block_len; - } - break; - case DW_CFA_expression: - { - /* An unsigned leb128 value is the first operand (a - register number). The second operand is single - DW_FORM_block representing a dwarf expression. The - evaluator pushes the CFA on the evaluation stack - then evaluates the expression to compute the value - of the register contents. */ - Dwarf_Unsigned lreg = 0; - Dwarf_Unsigned block_len = 0; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - DECODE_LEB128_UWORD(instr_ptr, block_len); - localregtab[lreg].ru_is_off = 0; /* arbitrary */ - localregtab[lreg].ru_value_type = DW_EXPR_EXPRESSION; - localregtab[lreg].ru_offset_or_block_len = block_len; - localregtab[lreg].ru_block = instr_ptr; - fp_offset = (Dwarf_Unsigned)(uintptr_t)instr_ptr; - fp_register = reg_no; - instr_ptr += block_len; - } - break; - case DW_CFA_offset_extended_sf: - { - /* The first operand is an unsigned leb128 register - number. The second is a signed factored offset. - Identical to DW_CFA_offset_extended except the - secondoperand is signed */ - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - signed_factored_N_value = - _dwarf_decode_s_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - localregtab[reg_no].ru_is_off = 1; - localregtab[reg_no].ru_value_type = DW_EXPR_OFFSET; - localregtab[reg_no].ru_register = reg_num_of_cfa; - localregtab[reg_no].ru_offset_or_block_len = - signed_factored_N_value * data_alignment_factor; - - fp_register = reg_no; - fp_offset = signed_factored_N_value; - } - break; - case DW_CFA_def_cfa_sf: - { - /* The first operand is an unsigned leb128 register - number. The second is a signed leb128 factored - offset. Identical to DW_CFA_def_cfa except that the - second operand is signed and factored. */ - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - signed_factored_N_value = - _dwarf_decode_s_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - cfa_reg.ru_is_off = 1; - cfa_reg.ru_value_type = DW_EXPR_OFFSET; - cfa_reg.ru_register = reg_no; - cfa_reg.ru_offset_or_block_len = - signed_factored_N_value * data_alignment_factor; - - fp_register = reg_no; - fp_offset = signed_factored_N_value; - } - break; - case DW_CFA_def_cfa_offset_sf: - { - /* The operand is a signed leb128 operand representing - a factored offset. Identical to - DW_CFA_def_cfa_offset excep the operand is signed - and factored. */ - - signed_factored_N_value = - _dwarf_decode_s_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - /* Do set ru_is_off here, as here factored_N_value - counts. */ - cfa_reg.ru_is_off = 1; - cfa_reg.ru_value_type = DW_EXPR_OFFSET; - cfa_reg.ru_offset_or_block_len = - signed_factored_N_value * data_alignment_factor; - - fp_offset = signed_factored_N_value; - } - break; - case DW_CFA_val_offset: - { - /* The first operand is an unsigned leb128 register - number. The second is a factored unsigned offset. - Makes the register be a val_offset(N) rule with N = - factored_offset*data_alignment_factor. */ - - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - - factored_N_value = - _dwarf_decode_u_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - /* Do set ru_is_off here, as here factored_N_value - counts. */ - localregtab[reg_no].ru_is_off = 1; - localregtab[reg_no].ru_register = reg_num_of_cfa; - localregtab[reg_no].ru_value_type = DW_EXPR_VAL_OFFSET; - localregtab[reg_no].ru_offset_or_block_len = - factored_N_value * data_alignment_factor; - - fp_offset = factored_N_value; - break; - } - case DW_CFA_val_offset_sf: - { - /* The first operand is an unsigned leb128 register - number. The second is a factored signed offset. - Makes the register be a val_offset(N) rule with N = - factored_offset*data_alignment_factor. */ - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - signed_factored_N_value = - _dwarf_decode_s_leb128(instr_ptr, &leb128_length); - instr_ptr += leb128_length; - - if (need_augmentation) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_NO_CIE_AUGMENTATION); - } - /* Do set ru_is_off here, as here factored_N_value - counts. */ - localregtab[reg_no].ru_is_off = 1; - localregtab[reg_no].ru_value_type = DW_EXPR_VAL_OFFSET; - localregtab[reg_no].ru_offset_or_block_len = - signed_factored_N_value * data_alignment_factor; - - fp_offset = signed_factored_N_value; - - } - break; - case DW_CFA_val_expression: - { - /* The first operand is an unsigned leb128 register - number. The second is a DW_FORM_block representing a - DWARF expression. The rule for the register number - becomes a val_expression(E) rule. */ - Dwarf_Unsigned lreg = 0; - Dwarf_Unsigned block_len = 0; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - ERROR_IF_REG_NUM_TOO_HIGH(reg_no, reg_count); - DECODE_LEB128_UWORD(instr_ptr, block_len); - localregtab[lreg].ru_is_off = 0; /* arbitrary */ - localregtab[lreg].ru_value_type = DW_EXPR_VAL_EXPRESSION; - localregtab[lreg].ru_offset_or_block_len = block_len; - localregtab[lreg].ru_block = instr_ptr; - fp_offset = (Dwarf_Unsigned)(uintptr_t)instr_ptr; - - instr_ptr += block_len; - fp_register = reg_no; - - } - break; - - /* END DWARF3 new ops. */ - - -#ifdef DW_CFA_GNU_window_save - case DW_CFA_GNU_window_save: - { - /* no information: this just tells unwinder to restore - the window registers from the previous frame's - window save area */ - break; - } -#endif -#ifdef DW_CFA_GNU_args_size - /* single uleb128 is the current arg area size in bytes. No - register exists yet to save this in */ - case DW_CFA_GNU_args_size: - { - Dwarf_Unsigned lreg; - - DECODE_LEB128_UWORD(instr_ptr, lreg); - reg_no = (reg_num_type) lreg; - - break; - } -#endif - default: - /* ERROR, we have an opcode we know nothing about. Memory - leak here, but an error like this is not supposed to - happen so we ignore the leak. These used to be ignored, - now we notice and report. */ - SIMPLE_ERROR_RETURN(DW_DLE_DF_FRAME_DECODING_ERROR); - - } - - if (make_instr) { - instr_count++; - - curr_instr = (Dwarf_Frame_Op *) - _dwarf_get_alloc(dbg, DW_DLA_FRAME_OP, 1); - if (curr_instr == NULL) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_ALLOC_FAIL); - } - - curr_instr->fp_base_op = fp_base_op; - curr_instr->fp_extended_op = fp_extended_op; - curr_instr->fp_register = fp_register; - curr_instr->fp_offset = fp_offset; - curr_instr->fp_instr_offset = fp_instr_offset; - - curr_instr_item = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_instr_item == NULL) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_ALLOC_FAIL); - } - - curr_instr_item->ch_item = curr_instr; - if (head_instr_chain == NULL) - head_instr_chain = tail_instr_chain = curr_instr_item; - else { - tail_instr_chain->ch_next = curr_instr_item; - tail_instr_chain = curr_instr_item; - } - } - } - - /* - If frame instruction decoding was right we would stop exactly at - final_instr_ptr. */ - if (instr_ptr > final_instr_ptr) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_FRAME_DECODING_ERROR); - } - - /* Fill in the actual output table, the space the caller passed in. */ - if (table != NULL) { - - struct Dwarf_Reg_Rule_s *t2reg = table->fr_reg; - struct Dwarf_Reg_Rule_s *t3reg = localregtab; - struct Dwarf_Reg_Rule_s *t3end = t3reg + reg_count; - - table->fr_loc = current_loc; - for (; t3reg < t3end; t3reg++, t2reg++) { - *t2reg = *t3reg; - } - - /* CONSTCOND */ - /* Do not update the main table with the cfa_reg. - Just leave cfa_reg as cfa_reg. */ - table->fr_cfa_rule = cfa_reg; - } - - /* Dealloc anything remaining on stack. */ - for (; top_stack != NULL;) { - stack_table = top_stack; - top_stack = top_stack->fr_next; - dwarf_dealloc(dbg, stack_table, DW_DLA_FRAME); - } - - if (make_instr) { - /* Allocate list of pointers to Dwarf_Frame_Op's. */ - head_instr_block = (Dwarf_Frame_Op *) - _dwarf_get_alloc(dbg, DW_DLA_FRAME_BLOCK, instr_count); - if (head_instr_block == NULL) { - SIMPLE_ERROR_RETURN(DW_DLE_DF_ALLOC_FAIL); - } - - /* - Store pointers to Dwarf_Frame_Op's in this list and - deallocate the structs that chain the Dwarf_Frame_Op's. */ - curr_instr_item = head_instr_chain; - for (i = 0; i < instr_count; i++) { - *(head_instr_block + i) = - *(Dwarf_Frame_Op *) curr_instr_item->ch_item; - dealloc_instr_item = curr_instr_item; - curr_instr_item = curr_instr_item->ch_next; - dwarf_dealloc(dbg, dealloc_instr_item->ch_item, - DW_DLA_FRAME_OP); - dwarf_dealloc(dbg, dealloc_instr_item, DW_DLA_CHAIN); - } - *ret_frame_instr = head_instr_block; - - *returned_count = (Dwarf_Sword) instr_count; - } else { - *returned_count = 0; - } - free(localregtab); - return DW_DLV_OK; -#undef ERROR_IF_REG_NUM_TOO_HIGH -#undef SIMPLE_ERROR_RETURN -} - -/* Depending on version, either read the return address register - as a ubyte or as an leb number. - The form of this value changed for DWARF3. -*/ -Dwarf_Unsigned -_dwarf_get_return_address_reg(Dwarf_Small * frame_ptr, - int version, unsigned long *size) -{ - Dwarf_Unsigned uvalue = 0; - Dwarf_Word leb128_length = 0; - - if (version == 1) { - *size = 1; - uvalue = *(unsigned char *) frame_ptr; - return uvalue; - } - uvalue = _dwarf_decode_u_leb128(frame_ptr, &leb128_length); - *size = leb128_length; - return uvalue; -} - - -/* Trivial consumer function. -*/ -int -dwarf_get_cie_of_fde(Dwarf_Fde fde, - Dwarf_Cie * cie_returned, Dwarf_Error * error) -{ - if (fde == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_NULL); - return (DW_DLV_ERROR); - } - - *cie_returned = fde->fd_cie; - return DW_DLV_OK; - -} - -int dwarf_get_cie_index( - Dwarf_Cie cie, - Dwarf_Signed* index, - Dwarf_Error* error ) -{ - if( cie == NULL ) - { - _dwarf_error(NULL, error, DW_DLE_CIE_NULL); - return (DW_DLV_ERROR); - } - - *index = cie->ci_index; - return (DW_DLV_OK); -} - - -/* - For g++ .eh_frame fde and cie. - the cie id is different as the - definition of the cie_id in an fde - is the distance back from the address of the - value to the cie. - Or 0 if this is a true cie. - Non standard dwarf, designed this way to be - convenient at run time for an allocated - (mapped into memory as part of the running image) section. -*/ -int -dwarf_get_fde_list_eh(Dwarf_Debug dbg, - Dwarf_Cie ** cie_data, - Dwarf_Signed * cie_element_count, - Dwarf_Fde ** fde_data, - Dwarf_Signed * fde_element_count, - Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_frame_eh_gnu,error); - if (res != DW_DLV_OK) { - return res; - } - - res = _dwarf_get_fde_list_internal(dbg, - cie_data, - cie_element_count, - fde_data, - fde_element_count, - dbg->de_debug_frame_eh_gnu.dss_data, - dbg->de_debug_frame_eh_gnu.dss_index, - dbg->de_debug_frame_eh_gnu.dss_size, - /* cie_id_value */ 0, - /* use_gnu_cie_calc= */ 1, - error); - return res; -} - - - -/* - For standard dwarf .debug_frame - cie_id is -1 in a cie, and - is the section offset in the .debug_frame section - of the cie otherwise. Standard dwarf -*/ -int -dwarf_get_fde_list(Dwarf_Debug dbg, - Dwarf_Cie ** cie_data, - Dwarf_Signed * cie_element_count, - Dwarf_Fde ** fde_data, - Dwarf_Signed * fde_element_count, - Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_frame,error); - if (res != DW_DLV_OK) { - return res; - } - - res = _dwarf_get_fde_list_internal(dbg, cie_data, - cie_element_count, - fde_data, - fde_element_count, - dbg->de_debug_frame.dss_data, - dbg->de_debug_frame.dss_index, - dbg->de_debug_frame.dss_size, - DW_CIE_ID, - /* use_gnu_cie_calc= */ 0, - error); - - return res; -} - - -/* - Only works on dwarf sections, not eh_frame - Given a Dwarf_Die, see if it has a - DW_AT_MIPS_fde attribute and if so use that - to get an fde offset. - Then create a Dwarf_Fde to return thru the ret_fde pointer. - Also creates a cie (pointed at from the Dwarf_Fde). -*/ -int -dwarf_get_fde_for_die(Dwarf_Debug dbg, - Dwarf_Die die, - Dwarf_Fde * ret_fde, Dwarf_Error * error) -{ - Dwarf_Attribute attr; - Dwarf_Unsigned fde_offset = 0; - Dwarf_Signed signdval = 0; - Dwarf_Fde new_fde = 0; - unsigned char *fde_ptr = 0; - unsigned char *cie_ptr = 0; - Dwarf_Unsigned cie_id = 0; - - /* Fields for the current Cie being read. */ - int res = 0; - int resattr = 0; - int sdatares = 0; - - struct cie_fde_prefix_s prefix; - struct cie_fde_prefix_s prefix_c; - - if (die == NULL) { - _dwarf_error(NULL, error, DW_DLE_DIE_NULL); - return (DW_DLV_ERROR); - } - - resattr = dwarf_attr(die, DW_AT_MIPS_fde, &attr, error); - if (resattr != DW_DLV_OK) { - return resattr; - } - - /* why is this formsdata? FIX */ - sdatares = dwarf_formsdata(attr, &signdval, error); - if (sdatares != DW_DLV_OK) { - return sdatares; - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_frame,error); - if (res != DW_DLV_OK) { - return res; - } - - fde_offset = signdval; - fde_ptr = (dbg->de_debug_frame.dss_data + fde_offset); - - - /* First read in the 'common prefix' to figure out what * we are to - do with this entry. */ - memset(&prefix_c, 0, sizeof(prefix_c)); - memset(&prefix, 0, sizeof(prefix)); - res = dwarf_read_cie_fde_prefix(dbg, fde_ptr, - dbg->de_debug_frame.dss_data, - dbg->de_debug_frame.dss_index, - dbg->de_debug_frame.dss_size, - &prefix, - error); - if (res == DW_DLV_ERROR) { - return res; - } - if (res == DW_DLV_NO_ENTRY) - return res; - fde_ptr = prefix.cf_addr_after_prefix; - cie_id = prefix.cf_cie_id; - /* Pass NULL, not section pointer, for 3rd argument. - de_debug_frame.dss_data has no eh_frame relevance. */ - res = dwarf_create_fde_from_after_start(dbg, &prefix, - (Dwarf_Small *) NULL, - fde_ptr, - /* use_gnu_cie_calc= */ 0, - /* Dwarf_Cie = */ 0, - &new_fde, error); - if (res == DW_DLV_ERROR) { - return res; - } else if (res == DW_DLV_NO_ENTRY) { - return res; - } - /* DW_DLV_OK */ - - /* now read the cie corresponding to the fde */ - cie_ptr = new_fde->fd_section_ptr + cie_id; - res = dwarf_read_cie_fde_prefix(dbg, cie_ptr, - dbg->de_debug_frame.dss_data, - dbg->de_debug_frame.dss_index, - dbg->de_debug_frame.dss_size, - &prefix_c, error); - if (res == DW_DLV_ERROR) { - return res; - } - if (res == DW_DLV_NO_ENTRY) - return res; - - cie_ptr = prefix_c.cf_addr_after_prefix; - cie_id = prefix_c.cf_cie_id; - - if (cie_id == DW_CIE_ID) { - int res2 = 0; - Dwarf_Cie new_cie = 0; - - /* Pass NULL, not section pointer, for 3rd argument. - de_debug_frame.dss_data has no eh_frame relevance. */ - res2 = dwarf_create_cie_from_after_start(dbg, - &prefix_c, - (Dwarf_Small *) NULL, - cie_ptr, - /* cie_count= */ 0, - /* use_gnu_cie_calc= */ - 0, &new_cie, error); - if (res2 == DW_DLV_ERROR) { - dwarf_dealloc(dbg, new_fde, DW_DLA_FDE); - return res; - } else if (res2 == DW_DLV_NO_ENTRY) { - dwarf_dealloc(dbg, new_fde, DW_DLA_FDE); - return res; - } - new_fde->fd_cie = new_cie; - } else { - _dwarf_error(dbg, error, DW_DLE_NO_CIE_FOR_FDE); - return (DW_DLV_ERROR); - } - - *ret_fde = new_fde; - return DW_DLV_OK; -} - -/* A dwarf consumer operation, see the consumer library documentation. -*/ -int -dwarf_get_fde_range(Dwarf_Fde fde, - Dwarf_Addr * low_pc, - Dwarf_Unsigned * func_length, - Dwarf_Ptr * fde_bytes, - Dwarf_Unsigned * fde_byte_length, - Dwarf_Off * cie_offset, - Dwarf_Signed * cie_index, - Dwarf_Off * fde_offset, Dwarf_Error * error) -{ - Dwarf_Debug dbg; - - if (fde == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_NULL); - return (DW_DLV_ERROR); - } - - dbg = fde->fd_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_DBG_NULL); - return (DW_DLV_ERROR); - } - - - /* We have always already done the section load here, so no need to - load the section. We did the section load in order to create the - Dwarf_Fde pointer passed in here. */ - - - if (low_pc != NULL) - *low_pc = fde->fd_initial_location; - if (func_length != NULL) - *func_length = fde->fd_address_range; - if (fde_bytes != NULL) - *fde_bytes = fde->fd_fde_start; - if (fde_byte_length != NULL) - *fde_byte_length = fde->fd_length; - if (cie_offset != NULL) - *cie_offset = fde->fd_cie_offset; - if (cie_index != NULL) - *cie_index = fde->fd_cie_index; - if (fde_offset != NULL) - *fde_offset = fde->fd_fde_start - fde->fd_section_ptr; - - return DW_DLV_OK; -} - -/* IRIX specific function. The exception tables - have C++ destructor information and are - at present undocumented. */ -int -dwarf_get_fde_exception_info(Dwarf_Fde fde, - Dwarf_Signed * - offset_into_exception_tables, - Dwarf_Error * error) -{ - Dwarf_Debug dbg; - - dbg = fde->fd_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_DBG_NULL); - return (DW_DLV_ERROR); - } - *offset_into_exception_tables = - fde->fd_offset_into_exception_tables; - return DW_DLV_OK; -} - - -/* A consumer code function. - Given a CIE pointer, return the normal CIE data thru - pointers. - Special augmentation data is not returned here. -*/ -int -dwarf_get_cie_info(Dwarf_Cie cie, - Dwarf_Unsigned * bytes_in_cie, - Dwarf_Small * ptr_to_version, - char **augmenter, - Dwarf_Unsigned * code_alignment_factor, - Dwarf_Signed * data_alignment_factor, - Dwarf_Half * return_address_register, - Dwarf_Ptr * initial_instructions, - Dwarf_Unsigned * initial_instructions_length, - Dwarf_Error * error) -{ - Dwarf_Debug dbg; - - if (cie == NULL) { - _dwarf_error(NULL, error, DW_DLE_CIE_NULL); - return (DW_DLV_ERROR); - } - - dbg = cie->ci_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_CIE_DBG_NULL); - return (DW_DLV_ERROR); - } - - if (ptr_to_version != NULL) - *ptr_to_version = cie->ci_cie_version_number; - if (augmenter != NULL) - *augmenter = cie->ci_augmentation; - if (code_alignment_factor != NULL) - *code_alignment_factor = cie->ci_code_alignment_factor; - if (data_alignment_factor != NULL) - *data_alignment_factor = cie->ci_data_alignment_factor; - if (return_address_register != NULL) - *return_address_register = cie->ci_return_address_register; - if (initial_instructions != NULL) - *initial_instructions = cie->ci_cie_instr_start; - if (initial_instructions_length != NULL) { - *initial_instructions_length = cie->ci_length + - cie->ci_length_size + - cie->ci_extension_size - - (cie->ci_cie_instr_start - cie->ci_cie_start); - - } - *bytes_in_cie = (cie->ci_length); - return (DW_DLV_OK); -} - -/* Return the register rules for all registers at a given pc. -*/ -static int -_dwarf_get_fde_info_for_a_pc_row(Dwarf_Fde fde, - Dwarf_Addr pc_requested, - Dwarf_Frame table, - Dwarf_Half cfa_reg_col_num, - Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Cie cie = 0; - int dw_err = 0; - Dwarf_Sword icount = 0; - int res = 0; - - if (fde == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_NULL); - return (DW_DLV_ERROR); - } - - dbg = fde->fd_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_DBG_NULL); - return (DW_DLV_ERROR); - } - - if (pc_requested < fde->fd_initial_location || - pc_requested >= - fde->fd_initial_location + fde->fd_address_range) { - _dwarf_error(dbg, error, DW_DLE_PC_NOT_IN_FDE_RANGE); - return (DW_DLV_ERROR); - } - - cie = fde->fd_cie; - if (cie->ci_initial_table == NULL) { - cie->ci_initial_table = _dwarf_get_alloc(dbg, DW_DLA_FRAME, 1); - - if (cie->ci_initial_table == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - _dwarf_init_regrule_table(cie->ci_initial_table->fr_reg, - dbg->de_frame_reg_rules_entry_count, - dbg->de_frame_rule_initial_value); - _dwarf_init_regrule_table(&cie->ci_initial_table->fr_cfa_rule, - 1, dbg->de_frame_rule_initial_value); - res = _dwarf_exec_frame_instr( /* make_instr= */ false, - /* ret_frame_instr= */ NULL, - /* search_pc */ false, - /* search_pc_val */ 0, - /* location */ 0, - cie->ci_cie_instr_start, - cie->ci_cie_instr_start + (cie->ci_length + - cie->ci_length_size + - cie->ci_extension_size - - (cie->ci_cie_instr_start - - cie->ci_cie_start)), - cie->ci_initial_table, cie, dbg, - cfa_reg_col_num, &icount, - &dw_err); - if (res == DW_DLV_ERROR) { - _dwarf_error(dbg, error, dw_err); - return (res); - } else if (res == DW_DLV_NO_ENTRY) { - return res; - } - } - - { - Dwarf_Small *instr_end = fde->fd_fde_instr_start + - fde->fd_length + - fde->fd_length_size + - fde->fd_extension_size - (fde->fd_fde_instr_start - - fde->fd_fde_start); - - res = _dwarf_exec_frame_instr( /* make_instr= */ false, - /* ret_frame_instr= */ NULL, - /* search_pc */ true, - /* search_pc_val */ pc_requested, - fde->fd_initial_location, - fde->fd_fde_instr_start, - instr_end, - table, - cie, dbg, - cfa_reg_col_num, &icount, - &dw_err); - } - if (res == DW_DLV_ERROR) { - _dwarf_error(dbg, error, dw_err); - return (res); - } else if (res == DW_DLV_NO_ENTRY) { - return res; - } - - return DW_DLV_OK; -} - -/* A consumer call for efficiently getting the register info - for all registers in one call. - - The output table rules array is size DW_REG_TABLE_SIZE. - The frame info rules array in fde_table is of size - DW_REG_TABLE_SIZE too. - - This interface really only works well with MIPS/IRIX - where DW_FRAME_CFA_COL is zero (in that case it's safe). - - It is also restricted to the case where - DW_REG_TABLE_SIZE == DW_FRAME_LAST_REG_NUM == - dbg->de_frame_reg_rules_entry_count (true for MIPS/IRIX). - If this condition is not met calling this routine can result in - incorrect output or in memory corruption. - - It is much better to use dwarf_get_fde_info_for_all_regs3() - instead of this interface. -*/ -int -dwarf_get_fde_info_for_all_regs(Dwarf_Fde fde, - Dwarf_Addr pc_requested, - Dwarf_Regtable * reg_table, - Dwarf_Addr * row_pc, - Dwarf_Error * error) -{ - - /* Table size: DW_REG_TABLE_SIZE */ - struct Dwarf_Frame_s fde_table; - Dwarf_Sword i = 0; - struct Dwarf_Reg_Rule_s *rule = NULL; - struct Dwarf_Regtable_Entry_s *out_rule = NULL; - int res = 0; - Dwarf_Debug dbg = 0; - - /* For this interface the size is fixed at compile time. */ - int output_table_real_data_size = DW_REG_TABLE_SIZE; - - FDE_NULL_CHECKS_AND_SET_DBG(fde, dbg); - - res = dwarf_initialize_fde_table(dbg, &fde_table, - output_table_real_data_size, - error); - if (res != DW_DLV_OK) - return res; - - /* _dwarf_get_fde_info_for_a_pc_row will perform more sanity checks - */ - res = _dwarf_get_fde_info_for_a_pc_row(fde, pc_requested, - &fde_table, dbg->de_frame_cfa_col_number, error); - if (res != DW_DLV_OK) { - dwarf_free_fde_table(&fde_table); - return res; - } - - out_rule = ®_table->rules[0]; - rule = &fde_table.fr_reg[0]; - for (i = 0; i < output_table_real_data_size; - i++, ++out_rule, ++rule) { - out_rule->dw_offset_relevant = rule->ru_is_off; - out_rule->dw_value_type = rule->ru_value_type; - out_rule->dw_regnum = rule->ru_register; - out_rule->dw_offset = rule->ru_offset_or_block_len; - } - for (; i < DW_REG_TABLE_SIZE; ++i, ++out_rule) { - out_rule->dw_offset_relevant = 0; - out_rule->dw_value_type = DW_EXPR_OFFSET; - out_rule->dw_regnum = dbg->de_frame_undefined_value_number; - out_rule->dw_offset = 0; - } - - /* The test is just in case it's not inside the table. For non-MIPS - it could be outside the table and that is just fine, it was - really a mistake to put it in the table in 1993. */ - /* CONSTCOND */ - if (dbg->de_frame_cfa_col_number < DW_REG_TABLE_SIZE) { - out_rule = ®_table->rules[dbg->de_frame_cfa_col_number]; - out_rule->dw_offset_relevant = fde_table.fr_cfa_rule.ru_is_off; - out_rule->dw_value_type = fde_table.fr_cfa_rule.ru_value_type; - out_rule->dw_regnum = fde_table.fr_cfa_rule.ru_register; - out_rule->dw_offset = - fde_table.fr_cfa_rule.ru_offset_or_block_len; - } - - if (row_pc != NULL) - *row_pc = fde_table.fr_loc; - dwarf_free_fde_table(&fde_table); - return DW_DLV_OK; -} - -/* A consumer call for efficiently getting the register info - for all registers in one call. - - The output table rules array is size output_table_real_data_size. - (normally DW_REG_TABLE_SIZE). - The frame info rules array in fde_table is normally of size - DW_FRAME_LAST_REG_NUM. -*/ -int -dwarf_get_fde_info_for_all_regs3(Dwarf_Fde fde, - Dwarf_Addr pc_requested, - Dwarf_Regtable3 * reg_table, - Dwarf_Addr * row_pc, - Dwarf_Error * error) -{ - - struct Dwarf_Frame_s fde_table; - Dwarf_Sword i = 0; - int res = 0; - struct Dwarf_Reg_Rule_s *rule = NULL; - struct Dwarf_Regtable_Entry3_s *out_rule = NULL; - Dwarf_Debug dbg = 0; - int output_table_real_data_size = reg_table->rt3_reg_table_size; - - FDE_NULL_CHECKS_AND_SET_DBG(fde, dbg); - - output_table_real_data_size = - MIN(output_table_real_data_size, - dbg->de_frame_reg_rules_entry_count); - - res = dwarf_initialize_fde_table(dbg, &fde_table, - output_table_real_data_size, - error); - - /* _dwarf_get_fde_info_for_a_pc_row will perform more sanity checks - */ - res = _dwarf_get_fde_info_for_a_pc_row(fde, pc_requested, - &fde_table, - dbg->de_frame_cfa_col_number, - error); - if (res != DW_DLV_OK) { - dwarf_free_fde_table(&fde_table); - return res; - } - - out_rule = ®_table->rt3_rules[0]; - rule = &fde_table.fr_reg[0]; - for (i = 0; i < output_table_real_data_size; - i++, ++out_rule, ++rule) { - out_rule->dw_offset_relevant = rule->ru_is_off; - out_rule->dw_value_type = rule->ru_value_type; - out_rule->dw_regnum = rule->ru_register; - out_rule->dw_offset_or_block_len = rule->ru_offset_or_block_len; - out_rule->dw_block_ptr = rule->ru_block; - } - for (; i < reg_table->rt3_reg_table_size; i++, ++out_rule) { - out_rule->dw_offset_relevant = 0; - out_rule->dw_value_type = DW_EXPR_OFFSET; - out_rule->dw_regnum = dbg->de_frame_undefined_value_number; - out_rule->dw_offset_or_block_len = 0; - out_rule->dw_block_ptr = 0; - } - reg_table->rt3_cfa_rule.dw_offset_relevant = - fde_table.fr_cfa_rule.ru_is_off; - reg_table->rt3_cfa_rule.dw_value_type = - fde_table.fr_cfa_rule.ru_value_type; - reg_table->rt3_cfa_rule.dw_regnum = - fde_table.fr_cfa_rule.ru_register; - reg_table->rt3_cfa_rule.dw_offset_or_block_len = - fde_table.fr_cfa_rule.ru_offset_or_block_len; - reg_table->rt3_cfa_rule.dw_block_ptr = - fde_table.fr_cfa_rule.ru_block; - - if (row_pc != NULL) - *row_pc = fde_table.fr_loc; - - dwarf_free_fde_table(&fde_table); - return DW_DLV_OK; -} - - -/* Gets the register info for a single register at a given PC value - for the FDE specified. - - This is the old MIPS interface and should no longer be used. - Use dwarf_get_fde_info_for_reg3() instead. -*/ -int -dwarf_get_fde_info_for_reg(Dwarf_Fde fde, - Dwarf_Half table_column, - Dwarf_Addr pc_requested, - Dwarf_Signed * offset_relevant, - Dwarf_Signed * register_num, - Dwarf_Signed * offset, - Dwarf_Addr * row_pc, Dwarf_Error * error) -{ - struct Dwarf_Frame_s fde_table; - int res = DW_DLV_ERROR; - Dwarf_Debug dbg = 0; - int output_table_real_data_size = 0; - - FDE_NULL_CHECKS_AND_SET_DBG(fde, dbg); - output_table_real_data_size = dbg->de_frame_reg_rules_entry_count; - - res = dwarf_initialize_fde_table(dbg, &fde_table, - output_table_real_data_size, - error); - if (res != DW_DLV_OK) - return res; - - if (table_column >= output_table_real_data_size) { - dwarf_free_fde_table(&fde_table); - _dwarf_error(dbg, error, DW_DLE_FRAME_TABLE_COL_BAD); - return (DW_DLV_ERROR); - } - - /* _dwarf_get_fde_info_for_a_pc_row will perform more sanity checks - */ - res = - _dwarf_get_fde_info_for_a_pc_row(fde, pc_requested, &fde_table, - dbg->de_frame_cfa_col_number, error); - if (res != DW_DLV_OK) { - dwarf_free_fde_table(&fde_table); - return res; - } - - if (fde_table.fr_reg[table_column].ru_value_type != DW_EXPR_OFFSET) { - /* The problem here is that this interface cannot deal with - other sorts of (newer) dwarf frame values. Code must - use dwarf_get_fde_info_for_reg3() to get these - values correctly. We error rather than return - misleading incomplete data. */ - dwarf_free_fde_table(&fde_table); - _dwarf_error(NULL, error, - DW_DLE_FRAME_REGISTER_UNREPRESENTABLE); - return (DW_DLV_ERROR); - } - if(table_column == dbg->de_frame_cfa_col_number) { - if (register_num != NULL) - *register_num = fde_table.fr_cfa_rule.ru_register; - if (offset != NULL) - *offset = fde_table.fr_cfa_rule.ru_offset_or_block_len; - if (row_pc != NULL) - *row_pc = fde_table.fr_loc; - *offset_relevant = fde_table.fr_cfa_rule.ru_is_off; - - } else { - if (register_num != NULL) - *register_num = fde_table.fr_reg[table_column].ru_register; - if (offset != NULL) - *offset = fde_table.fr_reg[table_column].ru_offset_or_block_len; - if (row_pc != NULL) - *row_pc = fde_table.fr_loc; - - *offset_relevant = fde_table.fr_reg[table_column].ru_is_off; - } - dwarf_free_fde_table(&fde_table); - return DW_DLV_OK; -} - -/* In this interface, table_column of DW_FRAME_CFA_COL - is not meaningful. - Use dwarf_get_fde_info_for_cfa_reg3() to get the CFA. - Call dwarf_set_frame_cfa_value() to set the correct column - after calling dwarf_init() - (DW_FRAME_CFA_COL3 is a sensible column to use). -*/ -int -dwarf_get_fde_info_for_reg3(Dwarf_Fde fde, - Dwarf_Half table_column, - Dwarf_Addr pc_requested, - Dwarf_Small * value_type, - Dwarf_Signed * offset_relevant, - Dwarf_Signed * register_num, - Dwarf_Signed * offset_or_block_len, - Dwarf_Ptr * block_ptr, - Dwarf_Addr * row_pc_out, - Dwarf_Error * error) -{ - struct Dwarf_Frame_s fde_table; - int res = DW_DLV_ERROR; - - Dwarf_Debug dbg = 0; - int table_real_data_size = 0; - - FDE_NULL_CHECKS_AND_SET_DBG(fde, dbg); - table_real_data_size = dbg->de_frame_reg_rules_entry_count; - res = dwarf_initialize_fde_table(dbg, &fde_table, - table_real_data_size, error); - if (res != DW_DLV_OK) - return res; - if (table_column >= table_real_data_size) { - dwarf_free_fde_table(&fde_table); - _dwarf_error(dbg, error, DW_DLE_FRAME_TABLE_COL_BAD); - return (DW_DLV_ERROR); - } - - /* _dwarf_get_fde_info_for_a_pc_row will perform more sanity checks - */ - res = _dwarf_get_fde_info_for_a_pc_row(fde, pc_requested, &fde_table, - dbg->de_frame_cfa_col_number, - error); - if (res != DW_DLV_OK) { - dwarf_free_fde_table(&fde_table); - return res; - } - - if (register_num != NULL) - *register_num = fde_table.fr_reg[table_column].ru_register; - if (offset_or_block_len != NULL) - *offset_or_block_len = - fde_table.fr_reg[table_column].ru_offset_or_block_len; - if (row_pc_out != NULL) - *row_pc_out = fde_table.fr_loc; - if (block_ptr) - *block_ptr = fde_table.fr_reg[table_column].ru_block; - - /* Without value_type the data cannot be understood, so we insist - on it being present, we don't test it. */ - *value_type = fde_table.fr_reg[table_column].ru_value_type; - *offset_relevant = (fde_table.fr_reg[table_column].ru_is_off); - dwarf_free_fde_table(&fde_table); - return DW_DLV_OK; - -} - -/* For latest DWARF, this is the preferred interface. - It more portably deals with the CFA by not - making the CFA a column number, which means - DW_FRAME_CFA_COL3 becomes, like DW_CFA_SAME_VALUE, - a special value, not something one uses as an index. - - Call dwarf_set_frame_cfa_value() to set the correct column - after calling dwarf_init() - (DW_FRAME_CFA_COL3 is a sensible column to use, and - is the default unless '--enable-oldframecol' - is used to configure libdwarf). */ -int -dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde fde, - Dwarf_Addr pc_requested, - Dwarf_Small * value_type, - Dwarf_Signed * offset_relevant, - Dwarf_Signed * register_num, - Dwarf_Signed * offset_or_block_len, - Dwarf_Ptr * block_ptr, - Dwarf_Addr * row_pc_out, - Dwarf_Error * error) -{ - struct Dwarf_Frame_s fde_table; - int res = DW_DLV_ERROR; - Dwarf_Debug dbg = 0; - - int table_real_data_size = 0; - - FDE_NULL_CHECKS_AND_SET_DBG(fde, dbg); - - table_real_data_size = dbg->de_frame_reg_rules_entry_count; - res = dwarf_initialize_fde_table(dbg, &fde_table, - table_real_data_size, error); - if (res != DW_DLV_OK) - return res; - res = _dwarf_get_fde_info_for_a_pc_row(fde, pc_requested, &fde_table, - dbg->de_frame_cfa_col_number,error); - if (res != DW_DLV_OK) { - dwarf_free_fde_table(&fde_table); - return res; - } - - if (register_num != NULL) - *register_num = fde_table.fr_cfa_rule.ru_register; - if (offset_or_block_len != NULL) - *offset_or_block_len = - fde_table.fr_cfa_rule.ru_offset_or_block_len; - if (row_pc_out != NULL) - *row_pc_out = fde_table.fr_loc; - if (block_ptr) - *block_ptr = fde_table.fr_cfa_rule.ru_block; - - /* Without value_type the data cannot be understood, so we insist - on it being present, we don't test it. */ - *value_type = fde_table.fr_cfa_rule.ru_value_type; - *offset_relevant = fde_table.fr_cfa_rule.ru_is_off; - dwarf_free_fde_table(&fde_table); - return DW_DLV_OK; -} - - - -/* - Return pointer to the instructions in the dwarf - fde. -*/ -int -dwarf_get_fde_instr_bytes(Dwarf_Fde inFde, Dwarf_Ptr * outinstraddr, - Dwarf_Unsigned * outaddrlen, - Dwarf_Error * error) -{ - Dwarf_Unsigned len = 0; - unsigned char *instrs = 0; - Dwarf_Debug dbg = 0; - - if (inFde == NULL) { - _dwarf_error(dbg, error, DW_DLE_FDE_NULL); - return (DW_DLV_ERROR); - } - - dbg = inFde->fd_dbg; - if (dbg == NULL) { - _dwarf_error(dbg, error, DW_DLE_FDE_DBG_NULL); - return (DW_DLV_ERROR); - } - - instrs = inFde->fd_fde_instr_start; - - len = (inFde->fd_fde_start + inFde->fd_length + - inFde->fd_length_size + inFde->fd_extension_size) - instrs; - - *outinstraddr = instrs; - *outaddrlen = len; - return DW_DLV_OK; -} - -/* Allows getting an fde from its table via an index. - With more error checking than simply indexing oneself. -*/ -int -dwarf_get_fde_n(Dwarf_Fde * fde_data, - Dwarf_Unsigned fde_index, - Dwarf_Fde * returned_fde, Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Signed fdecount = 0; - - if (fde_data == NULL) { - _dwarf_error(dbg, error, DW_DLE_FDE_PTR_NULL); - return (DW_DLV_ERROR); - } - - FDE_NULL_CHECKS_AND_SET_DBG(*fde_data, dbg); - /* Assumes fde_data table has at least one entry. */ - fdecount = fde_data[0]->fd_is_eh? - dbg->de_fde_count_eh:dbg->de_fde_count; - if (fde_index >= fdecount) { - return (DW_DLV_NO_ENTRY); - } - *returned_fde = (*(fde_data + fde_index)); - return DW_DLV_OK; -} - - -/* - Lopc and hipc are extensions to the interface to - return the range of addresses that are described - by the returned fde. -*/ -int -dwarf_get_fde_at_pc(Dwarf_Fde * fde_data, - Dwarf_Addr pc_of_interest, - Dwarf_Fde * returned_fde, - Dwarf_Addr * lopc, - Dwarf_Addr * hipc, Dwarf_Error * error) -{ - Dwarf_Debug dbg = NULL; - Dwarf_Fde fde = NULL; - Dwarf_Fde entryfde = NULL; - Dwarf_Signed fdecount = 0; - - if (fde_data == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_PTR_NULL); - return (DW_DLV_ERROR); - } - - /* Assumes fde_data table has at least one entry. */ - entryfde = *fde_data; - FDE_NULL_CHECKS_AND_SET_DBG(entryfde, dbg); - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_DBG_NULL); - return (DW_DLV_ERROR); - } - fdecount = entryfde->fd_is_eh? - dbg->de_fde_count_eh:dbg->de_fde_count; - { - /* The fde's are sorted by their addresses. Binary search to - find correct fde. */ - Dwarf_Signed low = 0; - Dwarf_Signed high = fdecount - 1L; - Dwarf_Signed middle = 0; - Dwarf_Fde cur_fde; - - while (low <= high) { - middle = (low + high) / 2; - cur_fde = fde_data[middle]; - if (pc_of_interest < cur_fde->fd_initial_location) { - high = middle - 1; - } else if (pc_of_interest >= - (cur_fde->fd_initial_location + - cur_fde->fd_address_range)) { - low = middle + 1; - } else { - fde = fde_data[middle]; - break; - } - } - } - - if (fde) { - if (lopc != NULL) - *lopc = fde->fd_initial_location; - if (hipc != NULL) - *hipc = - fde->fd_initial_location + fde->fd_address_range - 1; - *returned_fde = fde; - return (DW_DLV_OK); - } - - return (DW_DLV_NO_ENTRY); -} - - -/* Expands a single frame instruction block - from a specific cie - into a n array of Dwarf_Frame_Op-s. - This depends on having the cfa column set sensibly. - - Call dwarf_set_frame_cfa_value() to set the correct column - after calling dwarf_init() unless you are using - the old MIPS frame interfaces (in which case the default - will be ok). (DW_FRAME_CFA_COL3 is a sensible column to use ). -*/ -int -dwarf_expand_frame_instructions(Dwarf_Cie cie, - Dwarf_Ptr instruction, - Dwarf_Unsigned i_length, - Dwarf_Frame_Op ** returned_op_list, - Dwarf_Signed * returned_op_count, - Dwarf_Error * error) -{ - Dwarf_Sword instr_count; - int res = DW_DLV_ERROR; - int dw_err; - Dwarf_Debug dbg = 0; - - if (cie == 0) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - dbg = cie->ci_dbg; - - if (returned_op_list == 0 || returned_op_count == 0) { - _dwarf_error(dbg, error, DW_DLE_RET_OP_LIST_NULL); - return (DW_DLV_ERROR); - } - - /* The cast to Dwarf_Ptr may get a compiler warning, but it is safe - as it is just an i_length offset from 'instruction' itself. A - caller has made a big mistake if the result is not a valid - pointer. */ - res = _dwarf_exec_frame_instr( /* make_instr= */ true, - returned_op_list, - /* search_pc */ false, - /* search_pc_val */ 0, - /* location */ 0, - instruction, - (Dwarf_Ptr)((char *)instruction + i_length), - /* Dwarf_Frame */ NULL, - cie, - dbg, - dbg->de_frame_cfa_col_number, &instr_count, - &dw_err); - if (res != DW_DLV_OK) { - if (res == DW_DLV_ERROR) { - _dwarf_error(dbg, error, dw_err); - } - return (res); - } - - *returned_op_count = instr_count; - return DW_DLV_OK; -} - - -/* Used by dwarfdump -v to print offsets, for debugging - dwarf info. - The dwarf_ version is preferred over the obsolete _dwarf version. - _dwarf version kept for compatibility. -*/ -/* ARGSUSED 4 */ -int -_dwarf_fde_section_offset(Dwarf_Debug dbg, Dwarf_Fde in_fde, - Dwarf_Off * fde_off, Dwarf_Off * cie_off, - Dwarf_Error * err) -{ - return dwarf_fde_section_offset(dbg,in_fde,fde_off, - cie_off,err); -} -/* ARGSUSED 4 */ -int -dwarf_fde_section_offset(Dwarf_Debug dbg, Dwarf_Fde in_fde, - Dwarf_Off * fde_off, Dwarf_Off * cie_off, - Dwarf_Error * err) -{ - char *start = 0; - char *loc = 0; - - - - start = (char *) in_fde->fd_section_ptr; - loc = (char *) in_fde->fd_fde_start; - - *fde_off = (loc - start); - *cie_off = in_fde->fd_cie_offset; - return DW_DLV_OK; -} - -/* Used by dwarfdump -v to print offsets, for debugging - dwarf info. - The dwarf_ version is preferred over the obsolete _dwarf version. - _dwarf version kept for compatibility. -*/ -/* ARGSUSED 4 */ -int -_dwarf_cie_section_offset(Dwarf_Debug dbg, Dwarf_Cie in_cie, - Dwarf_Off * cie_off, Dwarf_Error * err) -{ - return dwarf_cie_section_offset(dbg,in_cie,cie_off,err); -} -/* ARGSUSED 4 */ -int -dwarf_cie_section_offset(Dwarf_Debug dbg, Dwarf_Cie in_cie, - Dwarf_Off * cie_off, Dwarf_Error * err) -{ - char *start = 0; - char *loc = 0; - - start = (char *) in_cie->ci_section_ptr; - loc = (char *) in_cie->ci_cie_start; - - *cie_off = (loc - start); - return DW_DLV_OK; -} - -/* Returns a pointer to target-specific augmentation data thru augdata - and returns the length of the data thru augdata_len. - - It's up to the consumer code to know how to interpret the bytes - of target-specific data (endian issues apply too, these - are just raw bytes pointed to). - See Linux Standard Base Core Specification version 3.0 for - the details on .eh_frame info. - - Returns DW_DLV_ERROR if fde is NULL or some other serious - error. - Returns DW_DLV_NO_ENTRY if there is no target-specific - augmentation data. - - The bytes pointed to are in the Dwarf_Cie, and as long as that - is valid the bytes are there. No 'dealloc' call is needed - for the bytes. -*/ -int -dwarf_get_cie_augmentation_data(Dwarf_Cie cie, - Dwarf_Small ** augdata, - Dwarf_Unsigned * augdata_len, - Dwarf_Error * error) -{ - if (cie == NULL) { - _dwarf_error(NULL, error, DW_DLE_CIE_NULL); - return (DW_DLV_ERROR); - } - if (cie->ci_gnu_eh_augmentation_len == 0) { - return DW_DLV_NO_ENTRY; - } - *augdata = (Dwarf_Small *) (cie->ci_gnu_eh_augmentation_bytes); - *augdata_len = cie->ci_gnu_eh_augmentation_len; - return DW_DLV_OK; -} - - -/* Returns a pointer to target-specific augmentation data thru augdata - and returns the length of the data thru augdata_len. - - It's up to the consumer code to know how to interpret the bytes - of target-specific data (endian issues apply too, these - are just raw bytes pointed to). - See Linux Standard Base Core Specification version 3.0 for - the details on .eh_frame info. - - Returns DW_DLV_ERROR if fde is NULL or some other serious - error. - Returns DW_DLV_NO_ENTRY if there is no target-specific - augmentation data. - - The bytes pointed to are in the Dwarf_Fde, and as long as that - is valid the bytes are there. No 'dealloc' call is needed - for the bytes. - -*/ -int -dwarf_get_fde_augmentation_data(Dwarf_Fde fde, - Dwarf_Small * *augdata, - Dwarf_Unsigned * augdata_len, - Dwarf_Error * error) -{ - Dwarf_Cie cie = 0; - - if (fde == NULL) { - _dwarf_error(NULL, error, DW_DLE_FDE_NULL); - return (DW_DLV_ERROR); - } - cie = fde->fd_cie; - if (cie == NULL) { - _dwarf_error(NULL, error, DW_DLE_CIE_NULL); - return (DW_DLV_ERROR); - } - if (cie->ci_gnu_eh_augmentation_len == 0) { - return DW_DLV_NO_ENTRY; - } - *augdata = (Dwarf_Small *) fde->fd_gnu_eh_augmentation_bytes; - *augdata_len = fde->fd_gnu_eh_augmentation_len; - return DW_DLV_OK; -} - - -/* Initialize with same_value , a value which makes sense - for IRIX/MIPS. - The correct value to use is ABI dependent. - For register-windows machines most - or all registers should get DW_FRAME_UNDEFINED_VAL as the - correct initial value. - Some think DW_FRAME_UNDEFINED_VAL is always the - right value. - - For some ABIs a setting which varies by register - would be more appropriate. - - FIXME. */ - -static void -_dwarf_init_regrule_table(struct Dwarf_Reg_Rule_s *t1reg, - int last_reg_num, int initial_value) -{ - struct Dwarf_Reg_Rule_s *t1end = t1reg + last_reg_num; - - for (; t1reg < t1end; t1reg++) { - t1reg->ru_is_off = 0; - t1reg->ru_value_type = DW_EXPR_OFFSET; - t1reg->ru_register = initial_value; - t1reg->ru_offset_or_block_len = 0; - t1reg->ru_block = 0; - } -} - -#if 0 -/* Used solely for debugging libdwarf. */ -static void -dump_frame_rule(char *msg, struct Dwarf_Reg_Rule_s *reg_rule) -{ - printf - ("%s type %s (" DW_PR_DUx "), is_off " - DW_PR_DUu " reg " DW_PR_DUu " offset " DW_PR_DUx " blockp " - DW_PR_DUx "\n", - msg, - (reg_rule->ru_value_type == DW_EXPR_OFFSET) ? - "DW_EXPR_OFFSET" : - (reg_rule->ru_value_type == DW_EXPR_VAL_OFFSET) ? - "DW_EXPR_VAL_OFFSET" : - (reg_rule->ru_value_type == DW_EXPR_VAL_EXPRESSION) ? - "DW_EXPR_VAL_EXPRESSION" : - (reg_rule->ru_value_type == DW_EXPR_EXPRESSION) ? - "DW_EXPR_EXPRESSION" : "Unknown", - (Dwarf_Unsigned) reg_rule->ru_value_type, - (Dwarf_Unsigned) reg_rule->ru_is_off, - (Dwarf_Unsigned) reg_rule->ru_register, - (Dwarf_Unsigned) reg_rule->ru_offset_or_block_len, - (Dwarf_Unsigned) reg_rule->ru_block); - return; -} -#endif - -/* This allows consumers to set the 'initial value' so that - an ISA/ABI specific default can be used, dynamically, - at run time. Useful for dwarfdump and non-MIPS architectures.. - The value defaults to one of - DW_FRAME_SAME_VALUE or DW_FRAME_UNKNOWN_VALUE - but dwarfdump can dump multiple ISA/ABI objects so - we may want to get this set to what the ABI says is correct. - - Returns the value that was present before we changed it here. -*/ -Dwarf_Half -dwarf_set_frame_rule_initial_value(Dwarf_Debug dbg, Dwarf_Half value) -{ - Dwarf_Half orig = dbg->de_frame_rule_initial_value; - dbg->de_frame_rule_initial_value = value; - return orig; -} - -/* The following spelling for backwards compatibility. */ -Dwarf_Half -dwarf_set_frame_rule_inital_value(Dwarf_Debug dbg, Dwarf_Half value) -{ - return dwarf_set_frame_rule_initial_value(dbg,value); -} - -/* This allows consumers to set the array size of the reg rules - table so that - an ISA/ABI specific value can be used, dynamically, - at run time. Useful for non-MIPS archtectures. - The value defaults to DW_FRAME_LAST_REG_NUM. - but dwarfdump can dump multiple ISA/ABI objects so - consumers want to get this set to what the ABI says is correct. - - Returns the value that was present before we changed it here. -*/ - -Dwarf_Half -dwarf_set_frame_rule_table_size(Dwarf_Debug dbg, Dwarf_Half value) -{ - Dwarf_Half orig = dbg->de_frame_reg_rules_entry_count; - dbg->de_frame_reg_rules_entry_count = value; - return orig; -} -/* This allows consumers to set the CFA register value - * so that an ISA/ABI specific value can be used, dynamically, - * at run time. Useful for non-MIPS archtectures. - * The value defaults to DW_FRAME_CFA_COL3 and should be - * higher than any real register in the ABI. - * Dwarfdump can dump multiple ISA/ABI objects so - * consumers want to get this set to what the ABI says is correct. - - * Returns the value that was present before we changed it here. - * */ - -Dwarf_Half -dwarf_set_frame_cfa_value(Dwarf_Debug dbg, Dwarf_Half value) -{ - Dwarf_Half orig = dbg->de_frame_cfa_col_number; - dbg->de_frame_cfa_col_number = value; - return orig; -} -/* Similar to above, but for the other crucial fields for frames. */ -Dwarf_Half -dwarf_set_frame_same_value(Dwarf_Debug dbg, Dwarf_Half value) -{ - Dwarf_Half orig = dbg->de_frame_same_value_number; - dbg->de_frame_same_value_number = value; - return orig; -} -Dwarf_Half -dwarf_set_frame_undefined_value(Dwarf_Debug dbg, Dwarf_Half value) -{ - Dwarf_Half orig = dbg->de_frame_same_value_number; - dbg->de_frame_undefined_value_number = value; - return orig; -} - - - - - -static int -dwarf_initialize_fde_table(Dwarf_Debug dbg, - struct Dwarf_Frame_s *fde_table, - unsigned table_real_data_size, - Dwarf_Error * error) -{ - unsigned entry_size = sizeof(struct Dwarf_Frame_s); - - fde_table->fr_loc = 0; - fde_table->fr_reg_count = table_real_data_size; - fde_table->fr_next = 0; - - fde_table->fr_reg = (struct Dwarf_Reg_Rule_s *) - calloc(entry_size, table_real_data_size); - if (fde_table->fr_reg == 0) { - _dwarf_error(dbg, error, DW_DLE_DF_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; - -} -static void -dwarf_free_fde_table(struct Dwarf_Frame_s *fde_table) -{ - free(fde_table->fr_reg); - fde_table->fr_reg_count = 0; - fde_table->fr_reg = 0; -} - - -/* Return DW_DLV_OK if we succeed. else return DW_DLV_ERROR. -*/ -int -_dwarf_frame_constructor(Dwarf_Debug dbg, void *frame) -{ - struct Dwarf_Frame_s *fp = frame; - - if (!dbg) { - return DW_DLV_ERROR; - } - - fp->fr_reg = calloc(dbg->de_frame_reg_rules_entry_count, - sizeof(struct Dwarf_Reg_Rule_s)); - if (!fp->fr_reg) { - return DW_DLV_ERROR; - } - fp->fr_reg_count = dbg->de_frame_reg_rules_entry_count; - return DW_DLV_OK; -} - -void -_dwarf_frame_destructor(void *frame) -{ - struct Dwarf_Frame_s *fp = frame; - - if (fp->fr_reg) { - free(fp->fr_reg); - } - fp->fr_reg = 0; - fp->fr_reg_count = 0; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_frame.h b/usr/src/tools/ctf/dwarf/common/dwarf_frame.h deleted file mode 100644 index ceb686335b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_frame.h +++ /dev/null @@ -1,421 +0,0 @@ -/* - - Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* The dwarf 2.0 standard dictates that only the following - * fields can be read when an unexpected augmentation string - * (in the cie) is encountered: CIE length, CIE_id, version and - * augmentation; FDE: length, CIE pointer, initial location and - * address range. Unfortunately, with the above restrictions, it - * is impossible to read the instruction table from a CIE or a FDE - * when a new augmentation string is encountered. - * To fix this problem, the following layout is used, if the - * augmentation string starts with the string "z". - * CIE FDE - * length length - * CIE_id CIE_pointer - * version initial_location - * augmentation address_range - * length_of_augmented_fields (*NEW*) - * code_alignment_factor Any new fields as necessary - * data_alignment_factor instruction_table - * return_address - * length_of_augmented fields - * Any new fields as necessary - * initial_instructions - * - * The type of all the old data items are the same as what is - * described in dwarf 2.0 standard. The length_of_augmented_fields - * is an LEB128 data item that denotes the size (in bytes) of - * the augmented fields (not including the size of - * "length_of_augmented_fields" itself). - - * Handling of cie augmentation strings is necessarly a heuristic. - * See dwarf_frame.c for the currently known augmentation strings. - - - ---START SGI-ONLY COMMENT: - * SGI-IRIX versions of cie or fde were intended to use "z1", "z2" as the - * augmenter strings if required for new augmentation. - * However, that never happened (as of March 2005). - * - * The fde's augmented by the string "z" have a new field - * (signed constant, 4 byte field) - * called offset_into_exception_tables, following the - * length_of_augmented field. This field contains an offset - * into the "_MIPS_eh_region", which describes - * the IRIX CC exception handling tables. - ---END SGI-ONLY COMMENT - - - * GNU .eh_frame has an augmentation string of z[RLP]* (gcc 3.4) - * The similarity to IRIX 'z' (and proposed but never - * implemented IRIX z1, z2 etc) was confusing things. - * If the section is .eh_frame then 'z' means GNU exception - * information 'Augmentation Data' not IRIX 'z'. - * See The Linux Standard Base Core Specification version 3.0 - */ - -#define DW_DEBUG_FRAME_VERSION 1 /* DWARF2 */ -#define DW_DEBUG_FRAME_VERSION3 3 /* DWARF3 */ -#define DW_DEBUG_FRAME_VERSION4 4 /* DWARF4 */ -/* The following is SGI/IRIX specific, and probably no longer - in use anywhere. */ -#define DW_DEBUG_FRAME_AUGMENTER_STRING "mti v1" - -/* The value of the offset field for Cie's. */ -#define DW_CIE_OFFSET ~(0x0) - -/* The augmentation string may be NULL. */ -#define DW_EMPTY_STRING "" - -#define DW_FRAME_INSTR_OPCODE_SHIFT 6 -#define DW_FRAME_INSTR_OFFSET_MASK 0x3f - -/* - This struct denotes the rule for a register in a row of - the frame table. In other words, it is one element of - the table. -*/ -struct Dwarf_Reg_Rule_s { - - /* - Is a flag indicating whether the rule includes the offset - field, ie whether the ru_offset field is valid or not. - Applies only if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. - It is important, since reg+offset (offset of 0) is different from - just 'register' since the former means 'read memory at address - given by the sum of register contents plus offset to get the - value'. whereas the latter means 'the value is in the register'. - - The 'register' numbers are either real registers (ie, table - columns defined as real registers) or defined entries that are - not really hardware registers, such as DW_FRAME_SAME_VAL or - DW_FRAME_CFA_COL. - - */ - Dwarf_Sbyte ru_is_off; - - /* DW_EXPR_OFFSET (0, DWARF2) - DW_EXPR_VAL_OFFSET 1 (dwarf2/3) - DW_EXPR_EXPRESSION 2 (dwarf2/3) - DW_EXPR_VAL_EXPRESSION 3 (dwarf2/3) - See dwarf_frame.h. */ - Dwarf_Sbyte ru_value_type; - - /* Register involved in this rule. */ - Dwarf_Half ru_register; - - /* Offset to add to register, if indicated by ru_is_offset - and if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. - If DW_EXPR_EXPRESSION or DW_EXPR_VAL_EXPRESSION - this is DW_FORM_block block-length, not offset. */ - Dwarf_Unsigned ru_offset_or_block_len; - - /* For DW_EXPR_EXPRESSION DW_EXPR_VAL_EXPRESSION these is set, - else 0. */ - Dwarf_Small *ru_block; -}; - -typedef struct Dwarf_Frame_s *Dwarf_Frame; - -/* - This structure represents a row of the frame table. - Fr_loc is the pc value for this row, and Fr_reg - contains the rule for each column. - - Entry DW_FRAME_CFA_COL of fr_reg was the tradional MIPS - way of setting CFA. cfa_rule is the new one. -*/ -struct Dwarf_Frame_s { - - /* Pc value corresponding to this row of the frame table. */ - Dwarf_Addr fr_loc; - - /* Rules for all the registers in this row. */ - struct Dwarf_Reg_Rule_s fr_cfa_rule; - - /* fr_reg_count is the the number of - entries of the fr_reg array. */ - unsigned long fr_reg_count; - struct Dwarf_Reg_Rule_s *fr_reg; - - Dwarf_Frame fr_next; -}; - -typedef struct Dwarf_Frame_Op_List_s *Dwarf_Frame_Op_List; - -/* This is used to chain together Dwarf_Frame_Op structures. */ -struct Dwarf_Frame_Op_List_s { - Dwarf_Frame_Op *fl_frame_instr; - Dwarf_Frame_Op_List fl_next; -}; - -/* See dwarf_frame.c for the heuristics used to set the - Dwarf_Cie ci_augmentation_type. - - This succinctly helps interpret the size and meaning of .debug_frame - and (for gcc) .eh_frame. - - In the case of gcc .eh_frame (gcc 3.3, 3.4) - z may be followed by one or more of - L R P. - -*/ -enum Dwarf_augmentation_type { - aug_empty_string, /* Default empty augmentation string. */ - aug_irix_exception_table, /* IRIX plain "z", - for exception handling, IRIX CC compiler. - Proposed z1 z2 ... never implemented. */ - aug_gcc_eh_z, /* gcc z augmentation, (including - L R P variations). gcc 3.3 3.4 exception - handling in eh_frame. */ - aug_irix_mti_v1, /* IRIX "mti v1" augmentation string. Probably - never in any released SGI-IRIX compiler. */ - aug_eh, /* For gcc .eh_frame, "eh" is the string., - gcc 1,2, egcs. Older values. */ - aug_armcc, /* "armcc+" meaning the cfa calculation - is corrected to be standard (output by - Arm C RVCT 3.0 SP1 and later). See - http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html - for details. */ - aug_unknown, /* Unknown augmentation, we cannot do much. */ - aug_past_last -}; - - -/* - This structure contains all the pertinent info for a Cie. Most - of the fields are taken straight from the definition of a Cie. - Ci_cie_start points to the address (in .debug_frame) where this - Cie begins. Ci_cie_instr_start points to the first byte of the - frame instructions for this Cie. Ci_dbg points to the associated - Dwarf_Debug structure. Ci_initial_table is a pointer to the table - row generated by the instructions for this Cie. -*/ -struct Dwarf_Cie_s { - Dwarf_Unsigned ci_length; - char *ci_augmentation; - Dwarf_Small ci_code_alignment_factor; - Dwarf_Sbyte ci_data_alignment_factor; - Dwarf_Small ci_return_address_register; - Dwarf_Small *ci_cie_start; - Dwarf_Small *ci_cie_instr_start; - Dwarf_Debug ci_dbg; - Dwarf_Frame ci_initial_table; - Dwarf_Cie ci_next; - Dwarf_Small ci_length_size; - Dwarf_Small ci_extension_size; - Dwarf_Half ci_cie_version_number; - enum Dwarf_augmentation_type ci_augmentation_type; - - /* The following 2 for GNU .eh_frame exception handling - Augmentation Data. Set if ci_augmentation_type - is aug_gcc_eh_z. Zero if unused. */ - Dwarf_Unsigned ci_gnu_eh_augmentation_len; - Dwarf_Ptr ci_gnu_eh_augmentation_bytes; - - /* These are extracted from the gnu eh_frame - augmentation if the - augmentation begins with 'z'. See Linux LSB documents. - Otherwize these are zero. */ - unsigned char ci_gnu_personality_handler_encoding; - unsigned char ci_gnu_lsda_encoding; - unsigned char ci_gnu_fde_begin_encoding; - - /* If 'P' augmentation present, is handler addr. Else - is zero. */ - Dwarf_Addr ci_gnu_personality_handler_addr; - - - /* In creating list of cie's (which will become an array) - record the position so fde can get it on fde creation. */ - Dwarf_Unsigned ci_index; - Dwarf_Small * ci_section_ptr; - /* DWARF4 adds address size and segment size to the CIE: the .debug_info - section may not always be present to allow libdwarf to - find address_size from the compilation-unit. */ - Dwarf_Half ci_address_size; - Dwarf_Half ci_segment_size; - -}; - -/* - This structure contains all the pertinent info for a Fde. - Most of the fields are taken straight from the definition. - fd_cie_index is the index of the Cie associated with this - Fde in the list of Cie's for this debug_frame. Fd_cie - points to the corresponsing Dwarf_Cie structure. Fd_fde_start - points to the start address of the Fde. Fd_fde_instr_start - points to the start of the instructions for this Fde. Fd_dbg - points to the associated Dwarf_Debug structure. -*/ -struct Dwarf_Fde_s { - Dwarf_Unsigned fd_length; - Dwarf_Addr fd_cie_offset; - Dwarf_Unsigned fd_cie_index; - Dwarf_Cie fd_cie; - Dwarf_Addr fd_initial_location; - Dwarf_Small *fd_initial_loc_pos; - Dwarf_Addr fd_address_range; - Dwarf_Small *fd_fde_start; - Dwarf_Small *fd_fde_instr_start; - Dwarf_Debug fd_dbg; - - /* fd_offset_into_exception_tables is SGI/IRIX exception table - offset. Unused and zero if not IRIX .debug_frame. */ - Dwarf_Signed fd_offset_into_exception_tables; - - Dwarf_Fde fd_next; - Dwarf_Small fd_length_size; - Dwarf_Small fd_extension_size; - /* So we know from an fde which 'count' of fde-s in - Dwarf_Debug applies: eh or standard. */ - Dwarf_Small fd_is_eh; - /* The following 2 for GNU .eh_frame exception handling - Augmentation Data. Set if CIE ci_augmentation_type - is aug_gcc_eh_z. Zero if unused. */ - Dwarf_Unsigned fd_gnu_eh_augmentation_len; - Dwarf_Ptr fd_gnu_eh_augmentation_bytes; - Dwarf_Addr fd_gnu_eh_lsda; /* If 'L' augmentation letter - present: is address of the - Language Specific Data Area (LSDA). If not 'L" is zero. */ - - /* The following 3 are about the Elf section the FDEs come from. */ - Dwarf_Small * fd_section_ptr; - Dwarf_Unsigned fd_section_length; - Dwarf_Unsigned fd_section_index; - -}; - - -int - _dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist, - Dwarf_Off ** offsetlist, - Dwarf_Signed * returncount, - Dwarf_Error * err); - -int -_dwarf_get_fde_list_internal(Dwarf_Debug dbg, - Dwarf_Cie ** cie_data, - Dwarf_Signed * cie_element_count, - Dwarf_Fde ** fde_data, - Dwarf_Signed * fde_element_count, - Dwarf_Small * section_ptr, - Dwarf_Unsigned section_index, - Dwarf_Unsigned section_length, - Dwarf_Unsigned cie_id_value, - int use_gnu_cie_calc, /* If non-zero, - this is gcc eh_frame. */ - Dwarf_Error * error); - -enum Dwarf_augmentation_type -_dwarf_get_augmentation_type(Dwarf_Debug dbg, - Dwarf_Small *augmentation_string, - int is_gcc_eh_frame); - -Dwarf_Unsigned _dwarf_get_return_address_reg(Dwarf_Small *frame_ptr, - int version, - unsigned long *size); - -/* Temporary recording of crucial cie/fde prefix data. - * Vastly simplifies some argument lists. - */ -struct cie_fde_prefix_s { - /* cf_start_addr is a pointer to the first byte of this fde/cie - we are reading now. */ - Dwarf_Small * cf_start_addr; - Dwarf_Small * cf_addr_after_prefix; - Dwarf_Unsigned cf_length; - int cf_local_length_size; - int cf_local_extension_size; - Dwarf_Unsigned cf_cie_id; - Dwarf_Small * cf_cie_id_addr; /* used for eh_frame calculations. */ - - /* Simplifies passing around these values to create fde having - these here. */ - /* cf_section_ptr is a pointer to the first byte - of the object section the prefix is read from. */ - Dwarf_Small * cf_section_ptr; - Dwarf_Unsigned cf_section_index; - Dwarf_Unsigned cf_section_length; -}; - -int -_dwarf_exec_frame_instr(Dwarf_Bool make_instr, - Dwarf_Frame_Op ** ret_frame_instr, - Dwarf_Bool search_pc, - Dwarf_Addr search_pc_val, - Dwarf_Addr initial_loc, - Dwarf_Small * start_instr_ptr, - Dwarf_Small * final_instr_ptr, - Dwarf_Frame table, - Dwarf_Cie cie, - Dwarf_Debug dbg, - Dwarf_Half reg_num_of_cfa, - Dwarf_Sword * returned_count, - int *returned_error); - - -int dwarf_read_cie_fde_prefix(Dwarf_Debug dbg, - Dwarf_Small *frame_ptr_in, - Dwarf_Small *section_ptr_in, - Dwarf_Unsigned section_index_in, - Dwarf_Unsigned section_length_in, - struct cie_fde_prefix_s *prefix_out, - Dwarf_Error *error); - -int dwarf_create_fde_from_after_start(Dwarf_Debug dbg, - struct cie_fde_prefix_s * prefix, - Dwarf_Small *section_pointer, - Dwarf_Small *frame_ptr, - int use_gnu_cie_calc, - Dwarf_Cie cie_ptr_in, - Dwarf_Fde *fde_ptr_out, - Dwarf_Error *error); - -int dwarf_create_cie_from_after_start(Dwarf_Debug dbg, - struct cie_fde_prefix_s *prefix, - Dwarf_Small* section_pointer, - Dwarf_Small* frame_ptr, - Dwarf_Unsigned cie_count, - int use_gnu_cie_calc, - Dwarf_Cie *cie_ptr_out, - Dwarf_Error *error); - - -int _dwarf_frame_constructor(Dwarf_Debug dbg,void * ); -void _dwarf_frame_destructor (void *); diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_frame2.c b/usr/src/tools/ctf/dwarf/common/dwarf_frame2.c deleted file mode 100644 index 01b9ec497b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_frame2.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* - - Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - -/* - This implements _dwarf_get_fde_list_internal() - and related helper functions for reading cie/fde data. -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include "dwarf_frame.h" -#include "dwarf_arange.h" /* using Arange as a way to build a - list */ - - -static int dwarf_find_existing_cie_ptr(Dwarf_Small * cie_ptr, - Dwarf_Cie cur_cie_ptr, - Dwarf_Cie * cie_ptr_to_use_out, - Dwarf_Cie head_cie_ptr); -static void dealloc_fde_cie_list_internal(Dwarf_Fde head_fde_ptr, - Dwarf_Cie head_cie_ptr); -static int dwarf_create_cie_from_start(Dwarf_Debug dbg, - Dwarf_Small * cie_ptr_val, - Dwarf_Small * section_ptr, - Dwarf_Unsigned section_index, - Dwarf_Unsigned section_length, - Dwarf_Small * frame_ptr_end, - Dwarf_Unsigned cie_id_value, - Dwarf_Unsigned cie_count, - int use_gnu_cie_calc, - Dwarf_Cie * cie_ptr_to_use_out, - Dwarf_Error * error); - -static Dwarf_Small *get_cieptr_given_offset(Dwarf_Unsigned cie_id_value, - int use_gnu_cie_calc, - Dwarf_Small * section_ptr, - Dwarf_Small * cie_id_addr); -static int get_gcc_eh_augmentation(Dwarf_Debug dbg, - Dwarf_Small * frame_ptr, - unsigned long - *size_of_augmentation_data, - enum Dwarf_augmentation_type augtype, - Dwarf_Small * section_pointer, - Dwarf_Small * fde_eh_encoding_out, - char *augmentation); - -static int - gnu_aug_encodings(Dwarf_Debug dbg, char *augmentation, - Dwarf_Small * aug_data, Dwarf_Unsigned aug_data_len, - Dwarf_Half address_size, - unsigned char *pers_hand_enc_out, - unsigned char *lsda_enc_out, - unsigned char *fde_begin_enc_out, - Dwarf_Addr * gnu_pers_addr_out); - - -static int read_encoded_ptr(Dwarf_Debug dbg, - Dwarf_Small * section_pointer, - Dwarf_Small * input_field, - int gnu_encoding, - Dwarf_Half address_size, - Dwarf_Unsigned * addr, - Dwarf_Small ** input_field_out); - - - -static int qsort_compare(const void *elem1, const void *elem2); - - -/* Adds 'newone' to the end of the list starting at 'head' - and makes the new one 'cur'rent. */ -static void -chain_up_fde(Dwarf_Fde newone, Dwarf_Fde * head, Dwarf_Fde * cur) -{ - if (*head == NULL) - *head = newone; - else { - (*cur)->fd_next = newone; - } - *cur = newone; - -} - -/* Adds 'newone' to the end of the list starting at 'head' - and makes the new one 'cur'rent. */ -static void -chain_up_cie(Dwarf_Cie newone, Dwarf_Cie * head, Dwarf_Cie * cur) -{ - if (*head == NULL) { - *head = newone; - } else { - (*cur)->ci_next = newone; - } - *cur = newone; -} - -/* The size of the length field plus the - value of length must be an integral - multiple of the address size. Dwarf4 standard. - - A constant that gives the number of bytes of the CIE - structure, not including the length field itself - (where length mod <size of an address> == 0) - (see Section 7.2.2). Dwarf3 standard. - - A uword constant that gives the number of bytes of - the CIE structure, not including the - length field, itself (length mod <addressing unit size> == 0). - Dwarf2 standard.*/ -static void -validate_length(Dwarf_Debug dbg, - Dwarf_Cie cieptr, Dwarf_Unsigned length, - Dwarf_Unsigned length_size, - Dwarf_Unsigned extension_size, - Dwarf_Small * section_ptr, - Dwarf_Small * ciefde_start, - const char * cieorfde) -{ - Dwarf_Unsigned address_size = cieptr->ci_address_size; - Dwarf_Unsigned length_field_summed = length_size + extension_size; - Dwarf_Unsigned total_len = length + length_field_summed; - Dwarf_Unsigned mod = total_len % address_size; - - if (mod != 0) { - char msg[DW_HARMLESS_ERROR_MSG_STRING_SIZE]; - Dwarf_Unsigned sectionoffset = ciefde_start - section_ptr; - snprintf(msg,sizeof(msg), - "DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE" - " len=0x%" DW_PR_DUx - ", len size=0x%" DW_PR_DUx - ", extn size=0x%" DW_PR_DUx - ", totl length=0x%" DW_PR_DUx - ", addr size=0x%" DW_PR_DUx - ", mod=0x%" DW_PR_DUx " must be zero" - " in %s" - ", offset 0x%" DW_PR_DUx ".", - length, - length_size, - extension_size, - total_len,address_size, mod, - cieorfde, - sectionoffset); - dwarf_insert_harmless_error(dbg,msg); - } - return; -} - - -#if 0 -/* For debugging only. */ -static void -print_prefix(struct cie_fde_prefix_s *prefix, int line) -{ - printf("prefix-print, prefix at 0x%lx, line %d\n", - (long) prefix, line); - printf(" start addr 0x%lx after prefix 0x%lx\n", - (long) prefix->cf_start_addr, - (long) prefix->cf_addr_after_prefix); - printf(" length 0x%" DW_PR_DUx ", len size %d ext size %d\n", - (Dwarf_Unsigned) prefix->cf_length, - prefix->cf_local_length_size, - prefix->cf_local_extension_size); - printf(" cie_id 0x%" DW_PR_DUx " cie_id cie_id_addr 0x%lx\n", - (Dwarf_Unsigned) prefix->cf_cie_id, - (long) prefix->cf_cie_id_addr); - printf - (" sec ptr 0x%lx sec index %" DW_PR_DSd " sec len 0x%" DW_PR_DUx " sec past end 0x%lx\n", - (long) prefix->cf_section_ptr, - (Dwarf_Signed) prefix->cf_section_index, - (Dwarf_Unsigned) prefix->cf_section_length, - (long) prefix->cf_section_ptr + prefix->cf_section_length); -} -#endif - - - -/* Internal function called from various places to create - lists of CIEs and FDEs. Not directly called - by consumer code */ -int -_dwarf_get_fde_list_internal(Dwarf_Debug dbg, Dwarf_Cie ** cie_data, - Dwarf_Signed * cie_element_count, - Dwarf_Fde ** fde_data, - Dwarf_Signed * fde_element_count, - Dwarf_Small * section_ptr, - Dwarf_Unsigned section_index, - Dwarf_Unsigned section_length, - Dwarf_Unsigned cie_id_value, - int use_gnu_cie_calc, Dwarf_Error * error) -{ - /* Scans the debug_frame section. */ - Dwarf_Small *frame_ptr = section_ptr; - Dwarf_Small *frame_ptr_end = section_ptr + section_length; - - - - /* - New_cie points to the Cie being read, and head_cie_ptr and - cur_cie_ptr are used for chaining them up in sequence. - In case cie's are reused aggressively we need tail_cie_ptr - to add to the chain. If we re-use an early cie - later on, that does not mean we chain a new cie to the early one, - we always chain it to the tail. */ - Dwarf_Cie head_cie_ptr = NULL; - Dwarf_Cie cur_cie_ptr = NULL; - Dwarf_Cie tail_cie_ptr = NULL; - Dwarf_Word cie_count = 0; - - /* - Points to a list of contiguous pointers to Dwarf_Cie structures. - */ - Dwarf_Cie *cie_list_ptr = 0; - - - /* - New_fde points to the Fde being created, and head_fde_ptr and - cur_fde_ptr are used to chain them up. */ - Dwarf_Fde head_fde_ptr = NULL; - Dwarf_Fde cur_fde_ptr = NULL; - Dwarf_Word fde_count = 0; - - /* - Points to a list of contiguous pointers to Dwarf_Fde structures. - */ - Dwarf_Fde *fde_list_ptr = NULL; - - Dwarf_Word i = 0; - int res = DW_DLV_ERROR; - - if (frame_ptr == 0) { - return DW_DLV_NO_ENTRY; - } - - /* We create the fde and cie arrays. Processing each CIE as we come - to it or as an FDE refers to it. We cannot process 'late' CIEs - late as GNU .eh_frame complexities mean we need the whole CIE - before we can process the FDE correctly. */ - while (frame_ptr < frame_ptr_end) { - - struct cie_fde_prefix_s prefix; - - /* First read in the 'common prefix' to figure out what we are - to do with this entry. */ - memset(&prefix, 0, sizeof(prefix)); - res = dwarf_read_cie_fde_prefix(dbg, - frame_ptr, section_ptr, - section_index, - section_length, &prefix, error); - if (res == DW_DLV_ERROR) { - dealloc_fde_cie_list_internal(head_fde_ptr, head_cie_ptr); - return res; - } - if (res == DW_DLV_NO_ENTRY) - break; - frame_ptr = prefix.cf_addr_after_prefix; - if (frame_ptr >= frame_ptr_end) { - dealloc_fde_cie_list_internal(head_fde_ptr, head_cie_ptr); - _dwarf_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD); - return DW_DLV_ERROR; - - } - - if (prefix.cf_cie_id == cie_id_value) { - /* This is a CIE. */ - Dwarf_Cie cie_ptr_to_use = 0; - - int res = dwarf_find_existing_cie_ptr(prefix.cf_start_addr, - cur_cie_ptr, - &cie_ptr_to_use, - head_cie_ptr); - - if (res == DW_DLV_OK) { - cur_cie_ptr = cie_ptr_to_use; - /* Ok. Seen already. */ - } else if (res == DW_DLV_NO_ENTRY) { - /* CIE before its FDE in this case. */ - res = dwarf_create_cie_from_after_start(dbg, - &prefix, - section_ptr, - frame_ptr, - cie_count, - use_gnu_cie_calc, - &cie_ptr_to_use, - error); - /* ASSERT: res==DW_DLV_NO_ENTRY impossible. */ - if (res == DW_DLV_ERROR) { - dealloc_fde_cie_list_internal(head_fde_ptr, - head_cie_ptr); - return res; - } - /* ASSERT res != DW_DLV_NO_ENTRY */ - cie_count++; - chain_up_cie(cie_ptr_to_use, &head_cie_ptr, - &tail_cie_ptr); - cur_cie_ptr = tail_cie_ptr; - } else { /* res == DW_DLV_ERROR */ - - dealloc_fde_cie_list_internal(head_fde_ptr, - head_cie_ptr); - return res; - } - frame_ptr = cie_ptr_to_use->ci_cie_start + - cie_ptr_to_use->ci_length + - cie_ptr_to_use->ci_length_size + - cie_ptr_to_use->ci_extension_size; - continue; - } else { - /* this is an FDE, Frame Description Entry, see the Dwarf - Spec, section 6.4.1 */ - int res = DW_DLV_ERROR; - Dwarf_Cie cie_ptr_to_use = 0; - Dwarf_Fde fde_ptr_to_use = 0; - - /* Do not call this twice on one prefix, as - prefix.cf_cie_id_addr is altered as a side effect. */ - Dwarf_Small *cieptr_val = - get_cieptr_given_offset(prefix.cf_cie_id, - use_gnu_cie_calc, - section_ptr, - prefix.cf_cie_id_addr); - - res = dwarf_find_existing_cie_ptr(cieptr_val, - cur_cie_ptr, - &cie_ptr_to_use, - head_cie_ptr); - if (res == DW_DLV_OK) { - cur_cie_ptr = cie_ptr_to_use; - /* Ok. Seen CIE already. */ - } else if (res == DW_DLV_NO_ENTRY) { - res = dwarf_create_cie_from_start(dbg, - cieptr_val, - section_ptr, - section_index, - section_length, - frame_ptr_end, - cie_id_value, - cie_count, - use_gnu_cie_calc, - &cie_ptr_to_use, - error); - if (res == DW_DLV_ERROR) { - dealloc_fde_cie_list_internal(head_fde_ptr, - head_cie_ptr); - return res; - } else if (res == DW_DLV_NO_ENTRY) { - return res; - } - ++cie_count; - chain_up_cie(cie_ptr_to_use, &head_cie_ptr, - &tail_cie_ptr); - cur_cie_ptr = tail_cie_ptr; - - } else { - /* DW_DLV_ERROR */ - return res; - } - - res = dwarf_create_fde_from_after_start(dbg, - &prefix, - section_ptr, - frame_ptr, - use_gnu_cie_calc, - cie_ptr_to_use, - &fde_ptr_to_use, - error); - if (res == DW_DLV_ERROR) { - return res; - } - chain_up_fde(fde_ptr_to_use, &head_fde_ptr, &cur_fde_ptr); - fde_count++; - /* ASSERT: DW_DLV_OK. */ - frame_ptr = fde_ptr_to_use->fd_fde_start + - fde_ptr_to_use->fd_length + - fde_ptr_to_use->fd_length_size + - fde_ptr_to_use->fd_extension_size; - continue; - - } - - } - - /* Now build list of CIEs from the list. If there are no CIEs - there should be no FDEs. */ - if (cie_count > 0) { - cie_list_ptr = (Dwarf_Cie *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, cie_count); - } else { - if(fde_count > 0) { - dealloc_fde_cie_list_internal(head_fde_ptr, head_cie_ptr); - _dwarf_error(dbg, error, DW_DLE_ORPHAN_FDE); - return DW_DLV_ERROR; - } - dealloc_fde_cie_list_internal(head_fde_ptr, head_cie_ptr); - return DW_DLV_NO_ENTRY; - } - if (cie_list_ptr == NULL) { - dealloc_fde_cie_list_internal(head_fde_ptr, head_cie_ptr); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return DW_DLV_ERROR; - } - cur_cie_ptr = head_cie_ptr; - for (i = 0; i < cie_count; i++) { - *(cie_list_ptr + i) = cur_cie_ptr; - cur_cie_ptr = cur_cie_ptr->ci_next; - } - - - - /* Now build array of FDEs from the list. - With orphan CIEs (meaning no FDEs) lets not return DW_DLV_NO_ENTRY */ - if (fde_count > 0) { - fde_list_ptr = (Dwarf_Fde *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, fde_count); - } - - /* It is ok if fde_list_ptr is NULL, we just have no fdes. */ - cur_fde_ptr = head_fde_ptr; - for (i = 0; i < fde_count; i++) { - *(fde_list_ptr + i) = cur_fde_ptr; - cur_fde_ptr = cur_fde_ptr->fd_next; - } - - - /* Return arguments. */ - *cie_data = cie_list_ptr; - *cie_element_count = cie_count; - - *fde_data = fde_list_ptr; - *fde_element_count = fde_count; - if(use_gnu_cie_calc) { - dbg->de_fde_data_eh = fde_list_ptr; - dbg->de_fde_count_eh = fde_count; - dbg->de_cie_data_eh = cie_list_ptr; - dbg->de_cie_count_eh = cie_count; - } else { - dbg->de_fde_data = fde_list_ptr; - dbg->de_fde_count = fde_count; - dbg->de_cie_data = cie_list_ptr; - dbg->de_cie_count = cie_count; - } - - /* Sort the list by the address so that dwarf_get_fde_at_pc() can - binary search this list. */ - if(fde_count > 0) { - qsort((void *) fde_list_ptr, fde_count, sizeof(Dwarf_Ptr), - qsort_compare); - } - - return (DW_DLV_OK); -} - -/* Internal function, not called by consumer code. - 'prefix' has accumulated the info up thru the cie-id - and now we consume the rest and build a Dwarf_Cie_s structure. -*/ -int -dwarf_create_cie_from_after_start(Dwarf_Debug dbg, - struct cie_fde_prefix_s *prefix, - Dwarf_Small * section_pointer, - Dwarf_Small * frame_ptr, - Dwarf_Unsigned cie_count, - int use_gnu_cie_calc, - Dwarf_Cie * cie_ptr_out, - Dwarf_Error * error) -{ - Dwarf_Cie new_cie = 0; - - /* egcs-1.1.2 .eh_frame uses 0 as the distinguishing id. sgi uses - -1 (in .debug_frame). .eh_frame not quite identical to - .debug_frame */ - /* We here default the address size as it is not present - in DWARF2 or DWARF3 cie data, below we set it right if - it is present. */ - Dwarf_Half address_size = dbg->de_pointer_size; - Dwarf_Small eh_fde_encoding = 0; - Dwarf_Small *augmentation = 0; - Dwarf_Half segment_size = 0; - Dwarf_Sword data_alignment_factor = -1; - Dwarf_Word code_alignment_factor = 4; - Dwarf_Unsigned return_address_register = 31; - int local_length_size = 0; - Dwarf_Word leb128_length = 0; - Dwarf_Unsigned cie_aug_data_len = 0; - Dwarf_Small *cie_aug_data = 0; - Dwarf_Addr gnu_personality_handler_addr = 0; - unsigned char gnu_personality_handler_encoding = 0; - unsigned char gnu_lsda_encoding = 0; - unsigned char gnu_fde_begin_encoding = 0; - - - enum Dwarf_augmentation_type augt = aug_unknown; - - - /* this is a CIE, Common Information Entry: See the dwarf spec, - section 6.4.1 */ - Dwarf_Small version = *(Dwarf_Small *) frame_ptr; - - frame_ptr++; - if (version != DW_CIE_VERSION && version != DW_CIE_VERSION3 && - version != DW_CIE_VERSION4) { - _dwarf_error(dbg, error, DW_DLE_FRAME_VERSION_BAD); - return (DW_DLV_ERROR); - } - - augmentation = frame_ptr; - frame_ptr = frame_ptr + strlen((char *) frame_ptr) + 1; - augt = _dwarf_get_augmentation_type(dbg, - augmentation, use_gnu_cie_calc); - if (augt == aug_eh) { - /* REFERENCED *//* Not used in this instance */ - Dwarf_Unsigned exception_table_addr; - - /* this is per egcs-1.1.2 as on RH 6.0 */ - READ_UNALIGNED(dbg, exception_table_addr, - Dwarf_Unsigned, frame_ptr, local_length_size); - frame_ptr += local_length_size; - } - { - Dwarf_Unsigned lreg = 0; - unsigned long size = 0; - - if( version == DW_CIE_VERSION4) { - address_size = *((unsigned char *)frame_ptr); - ++frame_ptr; - segment_size = *((unsigned char *)frame_ptr); - ++frame_ptr; - } - - DECODE_LEB128_UWORD(frame_ptr, lreg); - code_alignment_factor = (Dwarf_Word) lreg; - - data_alignment_factor = - (Dwarf_Sword) _dwarf_decode_s_leb128(frame_ptr, - &leb128_length); - - frame_ptr = frame_ptr + leb128_length; - - return_address_register = - _dwarf_get_return_address_reg(frame_ptr, version, &size); - if (return_address_register > dbg->de_frame_reg_rules_entry_count) { - _dwarf_error(dbg, error, DW_DLE_CIE_RET_ADDR_REG_ERROR); - return (DW_DLV_ERROR); - } - frame_ptr += size; - } - switch (augt) { - case aug_empty_string: - break; - case aug_irix_mti_v1: - break; - case aug_irix_exception_table:{ - Dwarf_Unsigned lreg = 0; - Dwarf_Word length_of_augmented_fields; - - /* Decode the length of augmented fields. */ - DECODE_LEB128_UWORD(frame_ptr, lreg); - length_of_augmented_fields = (Dwarf_Word) lreg; - - - /* set the frame_ptr to point at the instruction start. */ - frame_ptr += length_of_augmented_fields; - } - break; - - case aug_eh:{ - - int err = 0; - unsigned long increment = 0; - - if (!use_gnu_cie_calc) { - /* This should be impossible. */ - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } - - err = get_gcc_eh_augmentation(dbg, frame_ptr, &increment, - augt, - prefix->cf_section_ptr, - &eh_fde_encoding, - (char *) augmentation); - if (err == DW_DLV_ERROR) { - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } - frame_ptr += increment; - break; - } - case aug_gcc_eh_z:{ - /* Here we have Augmentation Data Length (uleb128) followed - by Augmentation Data bytes. */ - int res = DW_DLV_ERROR; - Dwarf_Unsigned adlen = 0; - - DECODE_LEB128_UWORD(frame_ptr, adlen); - cie_aug_data_len = adlen; - cie_aug_data = frame_ptr; - res = gnu_aug_encodings(dbg, - (char *) augmentation, - cie_aug_data, - cie_aug_data_len, - address_size, - &gnu_personality_handler_encoding, - &gnu_lsda_encoding, - &gnu_fde_begin_encoding, - &gnu_personality_handler_addr); - if (res != DW_DLV_OK) { - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return res; - } - - - frame_ptr += adlen; - break; - } - case aug_armcc: - break; - default:{ - /* We do not understand the augmentation string. No - assumption can be made about any fields other than what - we have already read. */ - frame_ptr = prefix->cf_start_addr + - prefix->cf_length + prefix->cf_local_length_size - + prefix->cf_local_extension_size; - /* FIX -- What are the values of data_alignment_factor, - code_alignement_factor, return_address_register and - instruction start? They were clearly uninitalized in the - previous version and I am leaving them the same way. */ - break; - } - } /* End switch on augmentation type. */ - - new_cie = (Dwarf_Cie) _dwarf_get_alloc(dbg, DW_DLA_CIE, 1); - if (new_cie == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - new_cie->ci_cie_version_number = version; - new_cie->ci_initial_table = NULL; - new_cie->ci_length = (Dwarf_Word) prefix->cf_length; - new_cie->ci_length_size = prefix->cf_local_length_size; - new_cie->ci_extension_size = prefix->cf_local_extension_size; - new_cie->ci_augmentation = (char *) augmentation; - - new_cie->ci_data_alignment_factor = - (Dwarf_Sbyte) data_alignment_factor; - new_cie->ci_code_alignment_factor = - (Dwarf_Small) code_alignment_factor; - new_cie->ci_return_address_register = return_address_register; - new_cie->ci_cie_start = prefix->cf_start_addr; - new_cie->ci_cie_instr_start = frame_ptr; - new_cie->ci_dbg = dbg; - new_cie->ci_augmentation_type = augt; - new_cie->ci_gnu_eh_augmentation_len = cie_aug_data_len; - new_cie->ci_gnu_eh_augmentation_bytes = cie_aug_data; - new_cie->ci_gnu_personality_handler_encoding = - gnu_personality_handler_encoding; - new_cie->ci_gnu_personality_handler_addr = - gnu_personality_handler_addr; - new_cie->ci_gnu_lsda_encoding = gnu_lsda_encoding; - new_cie->ci_gnu_fde_begin_encoding = gnu_fde_begin_encoding; - - new_cie->ci_index = cie_count; - new_cie->ci_section_ptr = prefix->cf_section_ptr; - /* The Following new in DWARF4 */ - new_cie->ci_address_size = address_size; - new_cie->ci_segment_size = segment_size; - validate_length(dbg,new_cie,new_cie->ci_length, - new_cie->ci_length_size, new_cie->ci_extension_size, - new_cie->ci_section_ptr, - new_cie->ci_cie_start,"cie"); - - *cie_ptr_out = new_cie; - return DW_DLV_OK; - -} - - -/* Internal function, not called by consumer code. - 'prefix' has accumulated the info up thru the cie-id - and now we consume the rest and build a Dwarf_Fde_s structure. -*/ - -int -dwarf_create_fde_from_after_start(Dwarf_Debug dbg, - struct cie_fde_prefix_s *prefix, - Dwarf_Small * section_pointer, - Dwarf_Small * frame_ptr, - int use_gnu_cie_calc, - Dwarf_Cie cie_ptr_in, - Dwarf_Fde * fde_ptr_out, - Dwarf_Error * error) -{ - Dwarf_Fde new_fde = 0; - Dwarf_Cie cieptr = cie_ptr_in; - Dwarf_Small *saved_frame_ptr = 0; - - Dwarf_Small *initloc = frame_ptr; - Dwarf_Signed offset_into_exception_tables - /* must be min dwarf_sfixed in size */ - = (Dwarf_Signed) DW_DLX_NO_EH_OFFSET; - Dwarf_Small *fde_aug_data = 0; - Dwarf_Unsigned fde_aug_data_len = 0; - Dwarf_Addr cie_base_offset = prefix->cf_cie_id; - Dwarf_Addr initial_location = 0; /* must be min de_pointer_size - bytes in size */ - Dwarf_Addr address_range = 0; /* must be min de_pointer_size - bytes in size */ - Dwarf_Half address_size = cie_ptr_in->ci_address_size; - - enum Dwarf_augmentation_type augt = cieptr->ci_augmentation_type; - - if (augt == aug_gcc_eh_z) { - /* If z augmentation this is eh_frame, and initial_location and - address_range in the FDE are read according to the CIE - augmentation string instructions. */ - - { - Dwarf_Small *fp_updated = 0; - int res = read_encoded_ptr(dbg, - section_pointer, - frame_ptr, - cieptr-> ci_gnu_fde_begin_encoding, - address_size, - &initial_location, - &fp_updated); - if (res != DW_DLV_OK) { - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } - frame_ptr = fp_updated; - /* For the address-range it makes no sense to be - pc-relative, so we turn it off with a section_pointer of - NULL. Masking off DW_EH_PE_pcrel from the - ci_gnu_fde_begin_encoding in this call would also work - to turn off DW_EH_PE_pcrel. */ - res = read_encoded_ptr(dbg, (Dwarf_Small *) NULL, - frame_ptr, - cieptr->ci_gnu_fde_begin_encoding, - address_size, - &address_range, &fp_updated); - if (res != DW_DLV_OK) { - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } - frame_ptr = fp_updated; - } - { - Dwarf_Unsigned adlen = 0; - - DECODE_LEB128_UWORD(frame_ptr, adlen); - fde_aug_data_len = adlen; - fde_aug_data = frame_ptr; - frame_ptr += adlen; - } - - } else { - READ_UNALIGNED(dbg, initial_location, Dwarf_Addr, - frame_ptr, address_size); - frame_ptr += address_size; - - READ_UNALIGNED(dbg, address_range, Dwarf_Addr, - frame_ptr, address_size); - frame_ptr += address_size; - } - - - - - - switch (augt) { - case aug_irix_mti_v1: - case aug_empty_string: - break; - case aug_irix_exception_table:{ - Dwarf_Unsigned lreg = 0; - Dwarf_Word length_of_augmented_fields = 0; - - DECODE_LEB128_UWORD(frame_ptr, lreg); - length_of_augmented_fields = (Dwarf_Word) lreg; - - saved_frame_ptr = frame_ptr; - /* The first word is an offset into exception tables. - Defined as a 32bit offset even for CC -64. */ - READ_UNALIGNED(dbg, offset_into_exception_tables, - Dwarf_Addr, frame_ptr, sizeof(Dwarf_sfixed)); - SIGN_EXTEND(offset_into_exception_tables, - sizeof(Dwarf_sfixed)); - frame_ptr = saved_frame_ptr + length_of_augmented_fields; - } - break; - case aug_eh:{ - Dwarf_Unsigned eh_table_value = 0; - - if (!use_gnu_cie_calc) { - /* This should be impossible. */ - _dwarf_error(dbg, error, - DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } - - /* gnu eh fde case. we do not need to do anything */ - /*REFERENCED*/ /* Not used in this instance of the - macro */ - READ_UNALIGNED(dbg, eh_table_value, - Dwarf_Unsigned, frame_ptr, - address_size); - frame_ptr += address_size; - } - break; - - case aug_gcc_eh_z:{ - /* The Augmentation Data Length is here, followed by the - Augmentation Data bytes themselves. */ - } - break; - case aug_armcc: - break; - case aug_past_last: - break; - case aug_unknown: - _dwarf_error(dbg, error, DW_DLE_FRAME_AUGMENTATION_UNKNOWN); - return DW_DLV_ERROR; - } /* End switch on augmentation type */ - new_fde = (Dwarf_Fde) _dwarf_get_alloc(dbg, DW_DLA_FDE, 1); - if (new_fde == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - new_fde->fd_length = prefix->cf_length; - new_fde->fd_length_size = prefix->cf_local_length_size; - new_fde->fd_extension_size = prefix->cf_local_extension_size; - new_fde->fd_is_eh = use_gnu_cie_calc; - new_fde->fd_cie_offset = cie_base_offset; - new_fde->fd_cie_index = cieptr->ci_index; - new_fde->fd_cie = cieptr; - new_fde->fd_initial_location = initial_location; - new_fde->fd_initial_loc_pos = initloc; - new_fde->fd_address_range = address_range; - new_fde->fd_fde_start = prefix->cf_start_addr; - new_fde->fd_fde_instr_start = frame_ptr; - new_fde->fd_dbg = dbg; - new_fde->fd_offset_into_exception_tables = - offset_into_exception_tables; - - new_fde->fd_section_ptr = prefix->cf_section_ptr; - new_fde->fd_section_index = prefix->cf_section_index; - new_fde->fd_section_length = prefix->cf_section_length; - - new_fde->fd_gnu_eh_augmentation_bytes = fde_aug_data; - new_fde->fd_gnu_eh_augmentation_len = fde_aug_data_len; - validate_length(dbg,cieptr,new_fde->fd_length, - new_fde->fd_length_size, new_fde->fd_extension_size, - new_fde->fd_section_ptr,new_fde->fd_fde_start,"fde"); - - - *fde_ptr_out = new_fde; - return DW_DLV_OK; -} - -/* called by qsort to compare FDE entries. - Consumer code expects the array of FDE pointers to be in address order. -*/ -static int -qsort_compare(const void *elem1, const void *elem2) -{ - Dwarf_Fde fde1 = *(Dwarf_Fde *) elem1; - Dwarf_Fde fde2 = *(Dwarf_Fde *) elem2; - Dwarf_Addr addr1 = fde1->fd_initial_location; - Dwarf_Addr addr2 = fde2->fd_initial_location; - - if (addr1 < addr2) { - return -1; - } else if (addr1 > addr2) { - return 1; - } - return 0; -} - - -/* Read in the common cie/fde prefix, including reading - * the cie-value which shows which this is: cie or fde. - * */ -int -dwarf_read_cie_fde_prefix(Dwarf_Debug dbg, - Dwarf_Small * frame_ptr_in, - Dwarf_Small * section_ptr_in, - Dwarf_Unsigned section_index_in, - Dwarf_Unsigned section_length_in, - struct cie_fde_prefix_s *data_out, - Dwarf_Error * error) -{ - Dwarf_Unsigned length = 0; - int local_length_size = 0; - int local_extension_size = 0; - Dwarf_Small *frame_ptr = frame_ptr_in; - Dwarf_Small *cie_ptr_addr = 0; - Dwarf_Unsigned cie_id = 0; - - /* READ_AREA_LENGTH updates frame_ptr for consumed bytes */ - READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned, - frame_ptr, local_length_size, - local_extension_size); - - if (length == 0) { - /* nul bytes at end of section, seen at end of egcs eh_frame - sections (in a.out). Take this as meaning no more CIE/FDE - data. We should be very close to end of section. */ - return DW_DLV_NO_ENTRY; - } - - cie_ptr_addr = frame_ptr; - READ_UNALIGNED(dbg, cie_id, Dwarf_Unsigned, - frame_ptr, local_length_size); - SIGN_EXTEND(cie_id, local_length_size); - frame_ptr += local_length_size; - - data_out->cf_start_addr = frame_ptr_in; - data_out->cf_addr_after_prefix = frame_ptr; - - data_out->cf_length = length; - data_out->cf_local_length_size = local_length_size; - data_out->cf_local_extension_size = local_extension_size; - data_out->cf_cie_id = cie_id; - data_out->cf_cie_id_addr = cie_ptr_addr; - data_out->cf_section_ptr = section_ptr_in; - data_out->cf_section_index = section_index_in; - data_out->cf_section_length = section_length_in; - return DW_DLV_OK; -} - -/* On various errors previously-allocated CIEs and FDEs - must be cleaned up. - This helps avoid leaks in case of errors. -*/ -static void -dealloc_fde_cie_list_internal(Dwarf_Fde head_fde_ptr, - Dwarf_Cie head_cie_ptr) -{ - Dwarf_Fde curfde = 0; - Dwarf_Cie curcie = 0; - Dwarf_Fde nextfde = 0; - Dwarf_Cie nextcie = 0; - - for (curfde = head_fde_ptr; curfde; curfde = nextfde) { - nextfde = curfde->fd_next; - dwarf_dealloc(curfde->fd_dbg, curfde, DW_DLA_FDE); - } - for (curcie = head_cie_ptr; curcie; curcie = nextcie) { - Dwarf_Frame frame = curcie->ci_initial_table; - - nextcie = curcie->ci_next; - if (frame) - dwarf_dealloc(curcie->ci_dbg, frame, DW_DLA_FRAME); - dwarf_dealloc(curcie->ci_dbg, curcie, DW_DLA_CIE); - } -} - -/* Find the cie whose id value is given: the id - * value is, per DWARF2/3, an offset in the section. - * For .debug_frame, zero is a legal offset. For - * GNU .eh_frame it is not a legal offset. - * 'cie_ptr' is a pointer into our section, not an offset. */ -static int -dwarf_find_existing_cie_ptr(Dwarf_Small * cie_ptr, - Dwarf_Cie cur_cie_ptr, - Dwarf_Cie * cie_ptr_to_use_out, - Dwarf_Cie head_cie_ptr) -{ - Dwarf_Cie next = 0; - - if (cur_cie_ptr && cie_ptr == cur_cie_ptr->ci_cie_start) { - /* Usually, we use the same cie again and again. */ - *cie_ptr_to_use_out = cur_cie_ptr; - return DW_DLV_OK; - } - for (next = head_cie_ptr; next; next = next->ci_next) { - if (cie_ptr == next->ci_cie_start) { - *cie_ptr_to_use_out = next; - return DW_DLV_OK; - } - } - return DW_DLV_NO_ENTRY; -} - - -/* We have a valid cie_ptr_val that has not been - * turned into an internal Cie yet. Do so now. - * Returns DW_DLV_OK or DW_DLV_ERROR, never - * DW_DLV_NO_ENTRY. - - 'section_ptr' - Points to first byte of section data. - 'section_length' - Length of the section, in bytes. - 'frame_ptr_end' - Points 1-past last byte of section data. - * */ -static int -dwarf_create_cie_from_start(Dwarf_Debug dbg, - Dwarf_Small * cie_ptr_val, - Dwarf_Small * section_ptr, - Dwarf_Unsigned section_index, - Dwarf_Unsigned section_length, - Dwarf_Small * frame_ptr_end, - Dwarf_Unsigned cie_id_value, - Dwarf_Unsigned cie_count, - int use_gnu_cie_calc, - Dwarf_Cie * cie_ptr_to_use_out, - Dwarf_Error * error) -{ - struct cie_fde_prefix_s prefix; - int res = DW_DLV_ERROR; - Dwarf_Small *frame_ptr = cie_ptr_val; - - if (frame_ptr < section_ptr || frame_ptr > frame_ptr_end) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_FRAME_LENGTH_BAD); - return DW_DLV_ERROR; - } - /* First read in the 'common prefix' to figure out what * we are to - do with this entry. If it is not a cie * we are in big trouble. */ - memset(&prefix, 0, sizeof(prefix)); - res = dwarf_read_cie_fde_prefix(dbg, frame_ptr, section_ptr, - section_index, section_length, - &prefix, error); - if (res == DW_DLV_ERROR) { - return res; - } - if (res == DW_DLV_NO_ENTRY) { - /* error. */ - _dwarf_error(dbg, error, DW_DLE_FRAME_CIE_DECODE_ERROR); - return DW_DLV_ERROR; - - } - - if (prefix.cf_cie_id != cie_id_value) { - _dwarf_error(dbg, error, DW_DLE_FRAME_CIE_DECODE_ERROR); - return DW_DLV_ERROR; - } - frame_ptr = prefix.cf_addr_after_prefix; - res = dwarf_create_cie_from_after_start(dbg, - &prefix, - section_ptr, - frame_ptr, - cie_count, - use_gnu_cie_calc, - cie_ptr_to_use_out, error); - return res; - -} - - -/* This is for gnu eh frames, the 'z' case. - We find the letter involved - Return the augmentation character and, if applicable, - the personality routine address. - - personality_routine_out - - if 'P' is augchar, is personality handler addr. - Otherwise is not set. - aug_data - if 'P' points to data space of the - aug_data_len - length of areas aug_data points to. - -*/ -#if 0 -/* For debugging only. */ -void -dump_bytes(Dwarf_Small * start, long len) -{ - Dwarf_Small *end = start + len; - Dwarf_Small *cur = start; - - for (; cur < end; cur++) { - printf(" byte %d, data %02x\n", (int) (cur - start), *cur); - } - -} -#endif -static int -gnu_aug_encodings(Dwarf_Debug dbg, char *augmentation, - Dwarf_Small * aug_data, Dwarf_Unsigned aug_data_len, - Dwarf_Half address_size, - unsigned char *pers_hand_enc_out, - unsigned char *lsda_enc_out, - unsigned char *fde_begin_enc_out, - Dwarf_Addr * gnu_pers_addr_out) -{ - char *nc = 0; - Dwarf_Small *cur_aug_p = aug_data; - Dwarf_Small *end_aug_p = aug_data + aug_data_len; - - for (nc = augmentation; *nc; ++nc) { - char c = *nc; - - switch (c) { - case 'z': - /* Means that the augmentation data is present. */ - continue; - - case 'S': - /* Indicates this is a signal stack frame. Debuggers have to do - special handling. We don't need to do more than print this flag at - the right time, though (see dwarfdump where it prints the augmentation - string). - A signal stack frame (in some OS's) can only be - unwound (backtraced) by knowing it is a signal stack frame - (perhaps by noticing the name of the function for the stack frame - if the name can be found somehow) and figuring - out (or knowing) how the kernel and libc pushed a structure - onto the stack and loading registers from that structure. - Totally different from normal stack unwinding. - This flag gives an unwinder a big leg up by decoupling the - 'hint: this is a stack frame' from knowledge like - the function name (the name might be unavailable at unwind time). - */ - break; - - case 'L': - if (cur_aug_p > end_aug_p) { - return DW_DLV_ERROR; - } - *lsda_enc_out = *(unsigned char *) cur_aug_p; - ++cur_aug_p; - break; - case 'R': - /* Followed by a one byte argument giving the - pointer encoding for the address pointers in the fde. */ - if (cur_aug_p >= end_aug_p) { - return DW_DLV_ERROR; - } - *fde_begin_enc_out = *(unsigned char *) cur_aug_p; - ++cur_aug_p; - break; - case 'P':{ - int res = DW_DLV_ERROR; - Dwarf_Small *updated_aug_p = 0; - unsigned char encoding = 0; - - if (cur_aug_p >= end_aug_p) { - return DW_DLV_ERROR; - } - encoding = *(unsigned char *) cur_aug_p; - *pers_hand_enc_out = encoding; - ++cur_aug_p; - if (cur_aug_p > end_aug_p) { - return DW_DLV_ERROR; - } - /* DW_EH_PE_pcrel makes no sense here, so we turn it - off via a section pointer of NULL. */ - res = read_encoded_ptr(dbg, - (Dwarf_Small *) NULL, - cur_aug_p, - encoding, - address_size, - gnu_pers_addr_out, - &updated_aug_p); - if (res != DW_DLV_OK) { - return res; - } - cur_aug_p = updated_aug_p; - if (cur_aug_p > end_aug_p) { - return DW_DLV_ERROR; - } - } - break; - default: - return DW_DLV_ERROR; - - } - } - - return DW_DLV_OK; -} - -/* Given augmentation character (the encoding) giving the -address format, read the address from input_field -and return an incremented value 1 past the input bytes of the -address. -Push the address read back thru the *addr pointer. -See LSB (Linux Standar Base) exception handling documents. -*/ -static int -read_encoded_ptr(Dwarf_Debug dbg, - Dwarf_Small * section_pointer, - Dwarf_Small * input_field, - int gnu_encoding, - Dwarf_Half address_size, - Dwarf_Unsigned * addr, - Dwarf_Small ** input_field_updated) -{ - Dwarf_Word length = 0; - int value_type = gnu_encoding & 0xf; - Dwarf_Small *input_field_original = input_field; - - if (gnu_encoding == 0xff) { - /* There is no data here. */ - - *addr = 0; - *input_field_updated = input_field; - /* Should we return DW_DLV_NO_ENTRY? */ - return DW_DLV_OK; - } - switch (value_type) { - case DW_EH_PE_absptr:{ - /* value_type is zero. Treat as pointer size of the object. - */ - Dwarf_Unsigned ret_value = 0; - - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - input_field, address_size); - *addr = ret_value; - *input_field_updated = input_field + address_size; - } - break; - case DW_EH_PE_uleb128:{ - Dwarf_Unsigned val = _dwarf_decode_u_leb128(input_field, - &length); - - *addr = val; - *input_field_updated = input_field + length; - } - break; - case DW_EH_PE_udata2:{ - Dwarf_Unsigned ret_value = 0; - - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - input_field, 2); - *addr = ret_value; - *input_field_updated = input_field + 2; - } - break; - - case DW_EH_PE_udata4:{ - - Dwarf_Unsigned ret_value = 0; - - /* ASSERT: sizeof(Dwarf_ufixed) == 4 */ - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - input_field, sizeof(Dwarf_ufixed)); - *addr = ret_value; - *input_field_updated = input_field + sizeof(Dwarf_ufixed); - } - break; - - case DW_EH_PE_udata8:{ - Dwarf_Unsigned ret_value = 0; - - /* ASSERT: sizeof(Dwarf_Unsigned) == 8 */ - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - input_field, sizeof(Dwarf_Unsigned)); - *addr = ret_value; - *input_field_updated = input_field + sizeof(Dwarf_Unsigned); - } - break; - - case DW_EH_PE_sleb128:{ - Dwarf_Signed val = _dwarf_decode_s_leb128(input_field, - &length); - - *addr = (Dwarf_Unsigned) val; - *input_field_updated = input_field + length; - } - break; - case DW_EH_PE_sdata2:{ - Dwarf_Unsigned val = 0; - - READ_UNALIGNED(dbg, val, Dwarf_Unsigned, input_field, 2); - SIGN_EXTEND(val, 2); - *addr = (Dwarf_Unsigned) val; - *input_field_updated = input_field + 2; - } - break; - - case DW_EH_PE_sdata4:{ - Dwarf_Unsigned val = 0; - - /* ASSERT: sizeof(Dwarf_ufixed) == 4 */ - READ_UNALIGNED(dbg, val, - Dwarf_Unsigned, input_field, - sizeof(Dwarf_ufixed)); - SIGN_EXTEND(val, sizeof(Dwarf_ufixed)); - *addr = (Dwarf_Unsigned) val; - *input_field_updated = input_field + sizeof(Dwarf_ufixed); - } - break; - case DW_EH_PE_sdata8:{ - Dwarf_Unsigned val = 0; - - /* ASSERT: sizeof(Dwarf_Unsigned) == 8 */ - READ_UNALIGNED(dbg, val, - Dwarf_Unsigned, input_field, - sizeof(Dwarf_Unsigned)); - *addr = (Dwarf_Unsigned) val; - *input_field_updated = input_field + sizeof(Dwarf_Unsigned); - } - break; - default: - return DW_DLV_ERROR; - - }; - /* The ELF ABI for gnu does not document the meaning of - DW_EH_PE_pcrel, which is awkward. It apparently means the value - we got above is pc-relative (meaning section-relative), so we - adjust the value. Section_pointer may be null if it is known - DW_EH_PE_pcrel cannot apply, such as for .debug_frame or for an - address-range value. */ - if (section_pointer && ((gnu_encoding & 0x70) == DW_EH_PE_pcrel)) { - /* Address (*addr) above is pc relative with respect to a - section. Add to the offset the base address (from elf) of - section and the distance of the field we are reading from - the section-beginning to get the actual address. */ - /* ASSERT: input_field_original >= section_pointer */ - Dwarf_Unsigned distance = - input_field_original - section_pointer; - *addr += dbg->de_debug_frame_eh_gnu.dss_addr + distance; - } - - return DW_DLV_OK; -} - - - - -/* - All augmentation string checking done here now. - - For .eh_frame, gcc from 3.3 uses the z style, earlier used - only "eh" as augmentation. We don't yet handle - decoding .eh_frame with the z style extensions like L P. - - These are nasty heuristics, but then that's life - as augmentations are implementation specific. -*/ -/* ARGSUSED */ -enum Dwarf_augmentation_type -_dwarf_get_augmentation_type(Dwarf_Debug dbg, - Dwarf_Small * augmentation_string, - int is_gcc_eh_frame) -{ - enum Dwarf_augmentation_type t = aug_unknown; - char *ag_string = (char *) augmentation_string; - - if (ag_string[0] == 0) { - /* Empty string. We'll just guess that we know what this means: - standard dwarf2/3 with no implementation-defined fields. */ - t = aug_empty_string; - } else if (strcmp(ag_string, DW_DEBUG_FRAME_AUGMENTER_STRING) == 0) { - /* The string is "mti v1". Used internally at SGI, probably - never shipped. Replaced by "z". Treat like 'nothing - special'. */ - t = aug_irix_mti_v1; - } else if (ag_string[0] == 'z') { - /* If it's IRIX cc, z means aug_irix_exception_table. z1 z2 - were designed as for IRIX CC, but never implemented */ - /* If it's gcc, z may be any of several things. "z" or z - followed optionally followed by one or more of L R P, each - of which means a value may be present. Should be in eh_frame - only, I think. */ - if (is_gcc_eh_frame) { - t = aug_gcc_eh_z; - } else if (ag_string[1] == 0) { - /* This is the normal IRIX C++ case, where there is an - offset into a table in each fde. The table being for - IRIX CC exception handling. */ - /* DW_CIE_AUGMENTER_STRING_V0 "z" */ - t = aug_irix_exception_table; - } /* Else unknown. */ - } else if (strncmp(ag_string, "eh", 2) == 0) { - /* gcc .eh_frame augmentation for egcs and gcc 2.x, at least - for x86. */ - t = aug_eh; - } else if (strcmp(ag_string, "armcc+") == 0) { - /* Arm uses this string to mean a bug in - in Arm compilers was fixed, changing to the standard - calculation of the CFA. See - http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html - for details. */ - t = aug_armcc; - } else { - - } - return t; -} - -/* Using augmentation, and version - read in the augmentation data for GNU eh. - - Return DW_DLV_OK if we succeeded, - DW_DLV_ERR if we fail. - - On success, update 'size_of_augmentation_data' with - the length of the fields that are part of augmentation (so the - caller can increment frame_ptr appropriately). - - 'frame_ptr' points within section. - 'section_pointer' points to section base address in memory. -*/ -/* ARGSUSED */ -static int -get_gcc_eh_augmentation(Dwarf_Debug dbg, Dwarf_Small * frame_ptr, - unsigned long *size_of_augmentation_data, - enum Dwarf_augmentation_type augtype, - Dwarf_Small * section_pointer, - Dwarf_Small * fde_eh_encoding_out, - char *augmentation) -{ - char *suffix = 0; - unsigned long augdata_size = 0; - - if (augtype == aug_gcc_eh_z) { - /* Has leading 'z'. */ - Dwarf_Word leb128_length = 0; - - /* Dwarf_Unsigned eh_value = */ - _dwarf_decode_u_leb128(frame_ptr, &leb128_length); - augdata_size += leb128_length; - frame_ptr += leb128_length; - suffix = augmentation + 1; - } else { - /* Prefix is 'eh'. As in gcc 3.2. No suffix present - apparently. */ - suffix = augmentation + 2; - } - for (; *suffix; ++suffix) { - /* We have no idea what this is as yet. Some extensions beyond - dwarf exist which we do not yet handle. */ - return DW_DLV_ERROR; - - } - - *size_of_augmentation_data = augdata_size; - return DW_DLV_OK; -} - - -/* Make the 'cie_id_addr' consistent across .debug_frame and .eh_frame. - Calculate a pointer into section bytes given a cie_id, which is - trivial for .debug_frame, but a bit more work for .eh_frame. -*/ -static Dwarf_Small * -get_cieptr_given_offset(Dwarf_Unsigned cie_id_value, - int use_gnu_cie_calc, - Dwarf_Small * section_ptr, - Dwarf_Small * cie_id_addr) -{ - Dwarf_Small *cieptr = 0; - - if (use_gnu_cie_calc) { - /* cie_id value is offset, in section, of the cie_id itself, to - use vm ptr of the value, less the value, to get to the cie - itself. In addition, munge *cie_id_addr to look *as if* it - was from real dwarf. */ - cieptr = (Dwarf_Small *)(uintptr_t) - ((Dwarf_Unsigned)(uintptr_t)cie_id_addr) - - ((Dwarf_Unsigned) cie_id_value); - } else { - /* Traditional dwarf section offset is in cie_id */ - cieptr = (section_ptr + cie_id_value); - } - return cieptr; -} - -/* To properly release all spaced used. - Earlier approaches (before July 15, 2005) - letting client do the dealloc directly left - some data allocated. - This is directly called by consumer code. -*/ -void -dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg, - Dwarf_Cie * cie_data, - Dwarf_Signed cie_element_count, - Dwarf_Fde * fde_data, - Dwarf_Signed fde_element_count) -{ - Dwarf_Signed i = 0; - - for (i = 0; i < cie_element_count; ++i) { - Dwarf_Frame frame = cie_data[i]->ci_initial_table; - - if (frame) - dwarf_dealloc(dbg, frame, DW_DLA_FRAME); - dwarf_dealloc(dbg, cie_data[i], DW_DLA_CIE); - } - for (i = 0; i < fde_element_count; ++i) { - dwarf_dealloc(dbg, fde_data[i], DW_DLA_FDE); - } - if (cie_data) - dwarf_dealloc(dbg, cie_data, DW_DLA_LIST); - if (fde_data) - dwarf_dealloc(dbg, fde_data, DW_DLA_LIST); - -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_frame3.c b/usr/src/tools/ctf/dwarf/common/dwarf_frame3.c deleted file mode 100644 index 7bd8ec86d5..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_frame3.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - - Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include "dwarf_frame.h" -#include "dwarf_arange.h" /* using Arange as a way to build a list */ - -/* - Used by rqs (an IRIX application). - Not needed except for that one application. - Should be moved to its own source file since - it is so rarely needed. - Returns DW_DLV_OK if returns the arrays. - Returns DW_DLV_NO_ENTRY if no section. ?? (How do I tell?) - Returns DW_DLV_ERROR if there is an error. - - Uses DW_FRAME_CFA_COL because IRIX is only DWARF2 - and that is what IRIX compilers and compatible - compilers support on IRIX. -*/ -int -_dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist, - Dwarf_Off ** offsetlist, - Dwarf_Signed * returncount, - Dwarf_Error * err) -{ - int retval = DW_DLV_OK; - int res = DW_DLV_ERROR; - Dwarf_Cie *cie_data; - Dwarf_Signed cie_count; - Dwarf_Fde *fde_data; - Dwarf_Signed fde_count; - Dwarf_Signed i; - Dwarf_Frame_Op *frame_inst; - Dwarf_Fde fdep; - Dwarf_Cie ciep; - Dwarf_Chain curr_chain = 0; - Dwarf_Chain head_chain = 0; - Dwarf_Chain prev_chain = 0; - Dwarf_Arange arange; - Dwarf_Unsigned arange_count = 0; - Dwarf_Addr *arange_addrs = 0; - Dwarf_Off *arange_offsets = 0; - - res = dwarf_get_fde_list(dbg, &cie_data, &cie_count, - &fde_data, &fde_count, err); - if (res != DW_DLV_OK) { - return res; - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_frame, err); - if (res != DW_DLV_OK) { - return res; - } - - for (i = 0; i < cie_count; i++) { - Dwarf_Off instoff = 0; - Dwarf_Signed initial_instructions_length = 0; - Dwarf_Small *instr_end = 0; - Dwarf_Sword icount = 0; - int j = 0; - int dw_err; - - ciep = cie_data[i]; - instoff = ciep->ci_cie_instr_start - dbg->de_debug_frame.dss_data; - initial_instructions_length = ciep->ci_length + - ciep->ci_length_size + ciep->ci_extension_size - - (ciep->ci_cie_instr_start - ciep->ci_cie_start); - instr_end = ciep->ci_cie_instr_start + - initial_instructions_length; - res = _dwarf_exec_frame_instr( /* make_instr */ true, - &frame_inst, - /* search_pc= */ false, - /* search_pc_val= */ 0, - /* location */ 0, - ciep->ci_cie_instr_start, - instr_end, - /* Dwarf_frame= */ 0, - /* cie= */ 0, - dbg, - DW_FRAME_CFA_COL, - &icount, &dw_err); - if (res == DW_DLV_ERROR) { - _dwarf_error(dbg, err, dw_err); - return (res); - } else if (res == DW_DLV_NO_ENTRY) { - continue; - } - - for (j = 0; j < icount; ++j) { - Dwarf_Frame_Op *finst = frame_inst + j; - - if (finst->fp_base_op == 0 && finst->fp_extended_op == 1) { - /* is DW_CFA_set_loc */ - Dwarf_Addr add = (Dwarf_Addr) finst->fp_offset; - Dwarf_Off off = finst->fp_instr_offset + instoff; - - arange = (Dwarf_Arange) - _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1); - if (arange == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - arange->ar_address = add; - arange->ar_info_offset = off; - arange_count++; - curr_chain = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - curr_chain->ch_item = arange; - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - } - } - dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK); - - } - for (i = 0; i < fde_count; i++) { - Dwarf_Small *instr_end = 0; - Dwarf_Sword icount = 0; - Dwarf_Signed instructions_length = 0; - Dwarf_Off instoff = 0; - Dwarf_Off off = 0; - Dwarf_Addr addr = 0; - int j = 0; - int dw_err; - - fdep = fde_data[i]; - off = fdep->fd_initial_loc_pos - dbg->de_debug_frame.dss_data; - addr = fdep->fd_initial_location; - arange = (Dwarf_Arange) - _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1); - if (arange == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - arange->ar_address = addr; - arange->ar_info_offset = off; - arange_count++; - curr_chain = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - curr_chain->ch_item = arange; - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - - - instoff = fdep->fd_fde_instr_start - dbg->de_debug_frame.dss_data; - instructions_length = fdep->fd_length + - fdep->fd_length_size + fdep->fd_extension_size - - (fdep->fd_fde_instr_start - fdep->fd_fde_start); - instr_end = fdep->fd_fde_instr_start + instructions_length; - res = _dwarf_exec_frame_instr( /* make_instr */ true, - &frame_inst, - /* search_pc= */ false, - /* search_pc_val= */ 0, - /* location */ 0, - fdep->fd_fde_instr_start, - instr_end, - /* Dwarf_frame= */ 0, - /* cie= */ 0, - dbg, - DW_FRAME_CFA_COL, - &icount, &dw_err); - if (res == DW_DLV_ERROR) { - _dwarf_error(dbg, err, dw_err); - return (res); - } else if (res == DW_DLV_NO_ENTRY) { - continue; - } - - for (j = 0; j < icount; ++j) { - Dwarf_Frame_Op *finst2 = frame_inst + j; - - if (finst2->fp_base_op == 0 && finst2->fp_extended_op == 1) { - /* is DW_CFA_set_loc */ - Dwarf_Addr add = (Dwarf_Addr) finst2->fp_offset; - Dwarf_Off off = finst2->fp_instr_offset + instoff; - - arange = (Dwarf_Arange) - _dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1); - if (arange == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - arange->ar_address = add; - arange->ar_info_offset = off; - arange_count++; - curr_chain = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - curr_chain->ch_item = arange; - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - - } - } - dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK); - - } - dwarf_dealloc(dbg, fde_data, DW_DLA_LIST); - dwarf_dealloc(dbg, cie_data, DW_DLA_LIST); - arange_addrs = (Dwarf_Addr *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count); - if (arange_addrs == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - arange_offsets = (Dwarf_Off *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count); - if (arange_offsets == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_chain = head_chain; - for (i = 0; i < arange_count; i++) { - Dwarf_Arange ar = curr_chain->ch_item; - - arange_addrs[i] = ar->ar_address; - arange_offsets[i] = ar->ar_info_offset; - prev_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, ar, DW_DLA_ARANGE); - dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); - } - *returncount = arange_count; - *offsetlist = arange_offsets; - *addrlist = arange_addrs; - return retval; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_funcs.c b/usr/src/tools/ctf/dwarf/common/dwarf_funcs.c deleted file mode 100644 index 8d725ae33f..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_funcs.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_funcs.h" -#include "dwarf_global.h" - -int -dwarf_get_funcs(Dwarf_Debug dbg, - Dwarf_Func ** funcs, - Dwarf_Signed * ret_func_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_funcnames,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_funcnames.dss_data, - dbg->de_debug_funcnames.dss_size, - (Dwarf_Global **) funcs, /* Type punning for sections with identical format. */ - ret_func_count, - error, - DW_DLA_FUNC_CONTEXT, - DW_DLA_FUNC, - DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD, - DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR); -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_funcs_dealloc(Dwarf_Debug dbg, Dwarf_Func * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl, - count, - DW_DLA_FUNC_CONTEXT, - DW_DLA_FUNC, DW_DLA_LIST); - return; -} - - - -int -dwarf_funcname(Dwarf_Func func_in, char **ret_name, Dwarf_Error * error) -{ - Dwarf_Global func = (Dwarf_Global) func_in; - - if (func == NULL) { - _dwarf_error(NULL, error, DW_DLE_FUNC_NULL); - return (DW_DLV_ERROR); - } - - *ret_name = (char *) (func->gl_name); - return DW_DLV_OK; -} - -int -dwarf_func_die_offset(Dwarf_Func func_in, - Dwarf_Off * return_offset, Dwarf_Error * error) -{ - Dwarf_Global func = (Dwarf_Global) func_in; - - return dwarf_global_die_offset(func, return_offset, error); -} - - -int -dwarf_func_cu_offset(Dwarf_Func func_in, - Dwarf_Off * return_offset, Dwarf_Error * error) -{ - Dwarf_Global func = (Dwarf_Global) func_in; - - return dwarf_global_cu_offset(func, return_offset, error); -} - - -int -dwarf_func_name_offsets(Dwarf_Func func_in, - char **ret_func_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_die_offset, Dwarf_Error * error) -{ - Dwarf_Global func = (Dwarf_Global) func_in; - - return dwarf_global_name_offsets(func, - ret_func_name, - die_offset, cu_die_offset, error); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_funcs.h b/usr/src/tools/ctf/dwarf/common/dwarf_funcs.h deleted file mode 100644 index bf91c32157..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_funcs.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - - Copyright (C) 2000, 2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -typedef struct Dwarf_Func_Context_s *Dwarf_Func_Context; - - -/* struct never completed: see dwarf_global.h */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_global.c b/usr/src/tools/ctf/dwarf/common/dwarf_global.c deleted file mode 100644 index d1c090fa43..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_global.c +++ /dev/null @@ -1,607 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_global.h" - - -#ifdef __sgi /* __sgi should only be defined for IRIX/MIPS. */ -/* The 'fixup' here intended for IRIX targets only. - With a 2+GB Elf64 IRIX executable (under 4GB in size), - some DIE offsets wrongly - got the 32bit upper bit sign extended. For the cu-header - offset in the .debug_pubnames section and in the - .debug_aranges section. - the 'varp' here is a pointer to an offset into .debug_info. - We fix up the offset here if it seems advisable.. - - As of June 2005 we have identified a series of mistakes - in ldx64 that can cause this (64 bit values getting passed - thru 32-bit signed knothole). -*/ -void -_dwarf_fix_up_offset_irix(Dwarf_Debug dbg, - Dwarf_Unsigned * varp, char *caller_site_name) -{ - - Dwarf_Unsigned var = *varp; - -#define UPPER33 0xffffffff80000000LL -#define LOWER32 0xffffffffLL - /* Restrict the hack to the known case. Upper 32 bits erroneously - sign extended from lower 32 upper bit. */ - if ((var & UPPER33) == UPPER33) { - var &= LOWER32; - /* Apply the fix. Dreadful hack. */ - *varp = var; - } -#undef UPPER33 -#undef LOWER32 - return; -} -#endif - - -int -dwarf_get_globals(Dwarf_Debug dbg, - Dwarf_Global ** globals, - Dwarf_Signed * return_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_pubnames,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_pubnames.dss_data, - dbg->de_debug_pubnames.dss_size, - globals, - return_count, - error, - DW_DLA_GLOBAL_CONTEXT, - DW_DLA_GLOBAL, - DW_DLE_PUBNAMES_LENGTH_BAD, - DW_DLE_PUBNAMES_VERSION_ERROR); - -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_globals_dealloc(Dwarf_Debug dbg, Dwarf_Global * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, dwgl, - count, - DW_DLA_GLOBAL_CONTEXT, - DW_DLA_GLOBAL, DW_DLA_LIST); - return; -} - -void -_dwarf_internal_globals_dealloc(Dwarf_Debug dbg, Dwarf_Global * dwgl, - Dwarf_Signed count, - int context_code, - int global_code, int list_code) -{ - Dwarf_Signed i; - struct Dwarf_Global_Context_s *gcp = 0; - struct Dwarf_Global_Context_s *lastgcp = 0; - - for (i = 0; i < count; i++) { - Dwarf_Global dgb = dwgl[i]; - - gcp = dgb->gl_context; - - if (lastgcp != gcp) { - lastgcp = gcp; - dwarf_dealloc(dbg, gcp, context_code); - } - dwarf_dealloc(dbg, dgb, global_code); - } - dwarf_dealloc(dbg, dwgl, list_code); - return; -} - - -/* Sweeps the complete section. -*/ -int -_dwarf_internal_get_pubnames_like_data(Dwarf_Debug dbg, - Dwarf_Small * section_data_ptr, - Dwarf_Unsigned section_length, - Dwarf_Global ** globals, - Dwarf_Signed * return_count, - Dwarf_Error * error, - int context_code, - int global_code, - int length_err_num, - int version_err_num) -{ - - - Dwarf_Small *pubnames_like_ptr = 0; - - - - /* Points to the context for the current set of global names, and - contains information to identify the compilation-unit that the - set refers to. */ - Dwarf_Global_Context pubnames_context = 0; - - Dwarf_Half version = 0; - - /* - Offset from the start of compilation-unit for the current - global. */ - Dwarf_Off die_offset_in_cu = 0; - - Dwarf_Unsigned global_count = 0; - - /* Points to the current global read. */ - Dwarf_Global global = 0; - - /* Used to chain the Dwarf_Global_s structs for creating contiguous - list of pointers to the structs. */ - Dwarf_Chain curr_chain = 0; - Dwarf_Chain prev_chain = 0; - Dwarf_Chain head_chain = 0; - - /* Points to contiguous block of Dwarf_Global's to be returned. */ - Dwarf_Global *ret_globals = 0; - - /* Temporary counter. */ - Dwarf_Unsigned i = 0; - - - - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - /* We will eventually need the .debug_info data. Load it now. */ - if (!dbg->de_debug_info.dss_data) { - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - } - - if (section_data_ptr == NULL) { - return (DW_DLV_NO_ENTRY); - } - - pubnames_like_ptr = section_data_ptr; - do { - Dwarf_Unsigned length = 0; - int local_extension_size = 0; - int local_length_size = 0; - - /* Some compilers emit padding at the end of each cu's area. - pubnames_ptr_past_end_cu records the true area end for this - cu's data. Essentially the length in the header and the 0 - terminator of the data are redundant information. The - dwarf2/3 spec does not mention what to do if the length is - past the 0 terminator. So we take any bytes left after the 0 - as padding and ignore them. */ - Dwarf_Small *pubnames_ptr_past_end_cu = 0; - - - pubnames_context = (Dwarf_Global_Context) - _dwarf_get_alloc(dbg, context_code, 1); - if (pubnames_context == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - /* READ_AREA_LENGTH updates pubnames_like_ptr for consumed - bytes. */ - READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned, - pubnames_like_ptr, local_length_size, - local_extension_size); - pubnames_context->pu_length_size = local_length_size; - pubnames_context->pu_extension_size = local_extension_size; - pubnames_context->pu_dbg = dbg; - - pubnames_ptr_past_end_cu = pubnames_like_ptr + length; - - READ_UNALIGNED(dbg, version, Dwarf_Half, - pubnames_like_ptr, sizeof(Dwarf_Half)); - pubnames_like_ptr += sizeof(Dwarf_Half); - if (version != CURRENT_VERSION_STAMP) { - _dwarf_error(dbg, error, version_err_num); - return (DW_DLV_ERROR); - } - - /* Offset of CU header in debug section. */ - READ_UNALIGNED(dbg, pubnames_context->pu_offset_of_cu_header, - Dwarf_Off, pubnames_like_ptr, - pubnames_context->pu_length_size); - pubnames_like_ptr += pubnames_context->pu_length_size; - - FIX_UP_OFFSET_IRIX_BUG(dbg, - pubnames_context->pu_offset_of_cu_header, - "pubnames cu header offset"); - - - READ_UNALIGNED(dbg, pubnames_context->pu_info_length, - Dwarf_Unsigned, pubnames_like_ptr, - pubnames_context->pu_length_size); - pubnames_like_ptr += pubnames_context->pu_length_size; - - if (pubnames_like_ptr > (section_data_ptr + section_length)) { - _dwarf_error(dbg, error, length_err_num); - return (DW_DLV_ERROR); - } - - /* Read initial offset (of DIE within CU) of a pubname, final - entry is not a pair, just a zero offset. */ - READ_UNALIGNED(dbg, die_offset_in_cu, Dwarf_Off, - pubnames_like_ptr, - pubnames_context->pu_length_size); - pubnames_like_ptr += pubnames_context->pu_length_size; - FIX_UP_OFFSET_IRIX_BUG(dbg, - die_offset_in_cu, "offset of die in cu"); - - /* Loop thru pairs. DIE off with CU followed by string. */ - while (die_offset_in_cu != 0) { - - /* Already read offset, pubnames_like_ptr now points to the - string. */ - global = - (Dwarf_Global) _dwarf_get_alloc(dbg, global_code, 1); - if (global == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - global_count++; - - global->gl_context = pubnames_context; - - global->gl_named_die_offset_within_cu = die_offset_in_cu; - - global->gl_name = pubnames_like_ptr; - - pubnames_like_ptr = pubnames_like_ptr + - strlen((char *) pubnames_like_ptr) + 1; - - - /* finish off current entry chain */ - curr_chain = - (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - /* Put current global on singly_linked list. */ - curr_chain->ch_item = (Dwarf_Global) global; - - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - - /* read offset for the *next* entry */ - READ_UNALIGNED(dbg, die_offset_in_cu, Dwarf_Off, - pubnames_like_ptr, - pubnames_context->pu_length_size); - - pubnames_like_ptr += pubnames_context->pu_length_size; - FIX_UP_OFFSET_IRIX_BUG(dbg, - die_offset_in_cu, - "offset of next die in cu"); - - if (pubnames_like_ptr > (section_data_ptr + section_length)) { - _dwarf_error(dbg, error, length_err_num); - return (DW_DLV_ERROR); - } - } - /* ASSERT: die_offset_in_cu == 0 */ - if (pubnames_like_ptr > pubnames_ptr_past_end_cu) { - /* This is some kind of error. This simply cannot happen. - The encoding is wrong or the length in the header for - this cu's contribution is wrong. */ - _dwarf_error(dbg, error, length_err_num); - return (DW_DLV_ERROR); - } - /* If there is some kind of padding at the end of the section, - as emitted by some compilers, skip over that padding and - simply ignore the bytes thus passed-over. With most - compilers, pubnames_like_ptr == pubnames_ptr_past_end_cu at - this point */ - pubnames_like_ptr = pubnames_ptr_past_end_cu; - - } while (pubnames_like_ptr < (section_data_ptr + section_length)); - - /* Points to contiguous block of Dwarf_Global's. */ - ret_globals = (Dwarf_Global *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, global_count); - if (ret_globals == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - /* - Store pointers to Dwarf_Global_s structs in contiguous block, - and deallocate the chain. */ - curr_chain = head_chain; - for (i = 0; i < global_count; i++) { - *(ret_globals + i) = curr_chain->ch_item; - prev_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); - } - - *globals = ret_globals; - *return_count = (Dwarf_Signed) global_count; - return DW_DLV_OK; -} - - -/* - Given a pubnames entry (or other like section entry) - return thru the ret_name pointer - a pointer to the string which is the entry name. - -*/ -int -dwarf_globname(Dwarf_Global glob, char **ret_name, Dwarf_Error * error) -{ - if (glob == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_NULL); - return (DW_DLV_ERROR); - } - - *ret_name = (char *) (glob->gl_name); - return DW_DLV_OK; -} - - -/* - Given a pubnames entry (or other like section entry) - return thru the ret_off pointer the - global offset of the DIE for this entry. - The global offset is the offset within the .debug_info - section as a whole. -*/ -int -dwarf_global_die_offset(Dwarf_Global global, - Dwarf_Off * ret_off, Dwarf_Error * error) -{ - if (global == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_NULL); - return (DW_DLV_ERROR); - } - - if (global->gl_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_CONTEXT_NULL); - return (DW_DLV_ERROR); - } - - *ret_off = (global->gl_named_die_offset_within_cu + - global->gl_context->pu_offset_of_cu_header); - return DW_DLV_OK; -} - -/* - Given a pubnames entry (or other like section entry) - return thru the ret_off pointer the - offset of the compilation unit header of the - compilation unit the global is part of. - - In early versions of this, the value returned was - the offset of the compilation unit die, and - other cu-local die offsets were faked so adding this to - such a cu-local offset got a true section offset. - Now things do as they say (adding *cu_header_offset to - a cu-local offset gets the section offset). - -*/ -int -dwarf_global_cu_offset(Dwarf_Global global, - Dwarf_Off * cu_header_offset, - Dwarf_Error * error) -{ - Dwarf_Global_Context con = 0; - - if (global == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_NULL); - return (DW_DLV_ERROR); - } - - con = global->gl_context; - - if (con == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_CONTEXT_NULL); - return (DW_DLV_ERROR); - } - - /* In early libdwarf, this incorrectly returned the offset of the - CU DIE. Now correctly returns the header offset. */ - *cu_header_offset = con->pu_offset_of_cu_header; - - return DW_DLV_OK; -} - -/* - Give back the pubnames entry (or any other like section) - name, symbol DIE offset, and the cu-DIE offset. - - Various errors are possible. - - The string pointer returned thru ret_name is not - dwarf_get_alloc()ed, so no dwarf_dealloc() - DW_DLA_STRING should be applied to it. - -*/ -int -dwarf_global_name_offsets(Dwarf_Global global, - char **ret_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_die_offset, - Dwarf_Error * error) -{ - Dwarf_Global_Context con = 0; - Dwarf_Debug dbg = 0; - Dwarf_Off off = 0; - - if (global == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_NULL); - return (DW_DLV_ERROR); - } - - con = global->gl_context; - - if (con == NULL) { - _dwarf_error(NULL, error, DW_DLE_GLOBAL_CONTEXT_NULL); - return (DW_DLV_ERROR); - } - - off = con->pu_offset_of_cu_header; - /* The offset had better not be too close to the end. If it is, - _dwarf_length_of_cu_header() will step off the end and therefore - must not be used. 10 is a meaningless heuristic, but no CU - header is that small so it is safe. An erroneous offset is due - to a bug in the tool chain. A bug like this has been seen on - IRIX with MIPSpro 7.3.1.3 and an executable > 2GB in size and - with 2 million pubnames entries. */ -#define MIN_CU_HDR_SIZE 10 - dbg = con->pu_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - if (dbg->de_debug_info.dss_size && - ((off + MIN_CU_HDR_SIZE) >= dbg->de_debug_info.dss_size)) { - _dwarf_error(NULL, error, DW_DLE_OFFSET_BAD); - return (DW_DLV_ERROR); - } -#undef MIN_CU_HDR_SIZE - if (die_offset != NULL) { - *die_offset = global->gl_named_die_offset_within_cu + off; - } - - *ret_name = (char *) global->gl_name; - - if (cu_die_offset != NULL) { - int res = _dwarf_load_debug_info(dbg, error); - - if (res != DW_DLV_OK) { - return res; - } - /* The offset had better not be too close to the end. If it is, - _dwarf_length_of_cu_header() will step off the end and - therefore must not be used. 10 is a meaningless heuristic, - but no CU header is that small so it is safe. */ - if ((off + 10) >= dbg->de_debug_info.dss_size) { - _dwarf_error(NULL, error, DW_DLE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - *cu_die_offset = off + _dwarf_length_of_cu_header(dbg, off); - } - - - return DW_DLV_OK; -} - -/* - We have the offset to a CU header. - Return thru outFileOffset the offset of the CU DIE. - - New June, 2001. - Used by SGI debuggers. - No error is possible. - - See also dwarf_CU_dieoffset_given_die(). -*/ - -/* ARGSUSED */ -int -dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg, - Dwarf_Off in_cu_header_offset, - Dwarf_Off * out_cu_die_offset, - Dwarf_Error * err) -{ - Dwarf_Off len = - _dwarf_length_of_cu_header(dbg, in_cu_header_offset); - - Dwarf_Off newoff = in_cu_header_offset + len; - - *out_cu_die_offset = newoff; - return DW_DLV_OK; -} -/* dwarf_CU_dieoffset_given_die returns - the global debug_info section offset of the CU die - that is the CU containing the given (passed-in) die. - This information makes it possible for a consumer to - find and print context information for any die. - - Use dwarf_offdie() passing in the offset this returns - to get a die pointer to the CU die. - */ -int -dwarf_CU_dieoffset_given_die(Dwarf_Die die, - Dwarf_Off* return_offset, - Dwarf_Error* error) -{ - Dwarf_Off dieoff = 0; - Dwarf_CU_Context cucontext = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - cucontext = die->di_cu_context; - dieoff = cucontext->cc_debug_info_offset; - /* The following call cannot fail, so no error check. */ - dwarf_get_cu_die_offset_given_cu_header_offset( - cucontext->cc_dbg, dieoff, return_offset,error); - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_global.h b/usr/src/tools/ctf/dwarf/common/dwarf_global.h deleted file mode 100644 index c2bc2cdcc3..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_global.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - - Copyright (C) 2000,2004,2005 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -typedef struct Dwarf_Global_Context_s *Dwarf_Global_Context; - -/* - This struct contains header information for a set of pubnames. - Essentially, they contain the context for a set of pubnames - belonging to a compilation-unit. - - This is also used for the sgi-specific - weaknames, typenames, varnames, funcnames data: - the structs for those are incomplete and - instances of this are used instead. - - Also used for DWARF3 .debug_pubtypes. - -*/ -struct Dwarf_Global_Context_s { - - /* Length in .debug_pubnames (etc) of a set of names for a - compilation-unit. Dwarf_Word pu_length; The value is not made - available outside libdwarf and not used inside, so no need to - record it. */ - - /* For this context, size of a length. 4 or 8 */ - unsigned char pu_length_size; - - /* For this CU, size of the extension 0 except for dwarf2 extension - 64bit, in which case is 4. */ - unsigned char pu_extension_size; - - /* - Offset into .debug_info of the compilation-unit header (not DIE) - for this set of pubnames. */ - Dwarf_Off pu_offset_of_cu_header; - - /* Size of compilation-unit that these pubnames are in. */ - Dwarf_Unsigned pu_info_length; - - Dwarf_Debug pu_dbg; -}; - - -/* This struct contains information for a single pubname. */ -struct Dwarf_Global_s { - - /* - Offset from the start of the corresponding compilation-unit of - the DIE for the given pubname CU. */ - Dwarf_Off gl_named_die_offset_within_cu; - - /* Points to the given pubname. */ - Dwarf_Small *gl_name; - - /* Context for this pubname. */ - Dwarf_Global_Context gl_context; -}; - -int _dwarf_internal_get_pubnames_like_data(Dwarf_Debug dbg, - Dwarf_Small * - section_data_ptr, - Dwarf_Unsigned - section_length, - Dwarf_Global ** globals, - Dwarf_Signed * return_count, - Dwarf_Error * error, - int context_code, - int global_code, - int length_err_num, - int version_err_num); - -void -_dwarf_internal_globals_dealloc( Dwarf_Debug dbg, Dwarf_Global *dwgl, - Dwarf_Signed count, - int context_code, - int global_code, - int list_code); - - -#ifdef __sgi /* __sgi should only be defined for IRIX/MIPS. */ -void _dwarf_fix_up_offset_irix(Dwarf_Debug dbg, - Dwarf_Unsigned *varp, - char *caller_site_name); -#define FIX_UP_OFFSET_IRIX_BUG(ldbg,var,name) _dwarf_fix_up_offset_irix(ldbg,&var,name) -#else -#define FIX_UP_OFFSET_IRIX_BUG(ldbg,var,name) -#endif - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_harmless.c b/usr/src/tools/ctf/dwarf/common/dwarf_harmless.c deleted file mode 100644 index 16dbe4bc97..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_harmless.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - - Copyright (C) 2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - -*/ - -/* - This implements _dwarf_insert_harmless_error - and related helper functions for recording - compiler errors that need not make the input - unusable. - - Applications can use dwarf_get_harmless_error_list to - find (and possibly print) a warning about such errors. - - The initial error reported here is - DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE which was a - bug in a specific compiler. - - It is a fixed length circular list to constrain - the space used for errors. - - The assumption is that these errors are exceedingly - rare, and indicate a broken compiler (the one that - produced the object getting the error(s)). - - dh_maxcount is recorded internally as 1 greater than - requested. Hiding the fact we always leave one - slot unused (at least). So a user request for - N slots really gives the user N usable slots. -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include "dwarf_frame.h" -#include "dwarf_harmless.h" - - -/* The pointers returned here through errmsg_ptrs_array - become invalidated by any call to libdwarf. Any call. -*/ -int dwarf_get_harmless_error_list(Dwarf_Debug dbg, - unsigned count, - const char ** errmsg_ptrs_array, - unsigned * errs_count) -{ - struct Dwarf_Harmless_s *dhp = &dbg->de_harmless_errors; - if(!dhp->dh_errors) { - dhp->dh_errs_count = 0; - return DW_DLV_NO_ENTRY; - } - if(dhp->dh_errs_count == 0) { - return DW_DLV_NO_ENTRY; - } - if(errs_count) { - *errs_count = dhp->dh_errs_count; - } - if(count) { - /* NULL terminate the array of pointers */ - --count; - errmsg_ptrs_array[count] = 0; - - if(dhp->dh_next_to_use != dhp->dh_first) { - unsigned i = 0; - unsigned cur = dhp->dh_first; - for(i = 0; cur != dhp->dh_next_to_use; ++i) { - if(i >= count ) { - /* All output spaces are used. */ - break; - } - errmsg_ptrs_array[i] = dhp->dh_errors[cur]; - cur = (cur +1) % dhp->dh_maxcount; - } - errmsg_ptrs_array[i] = 0; - } - } - dhp->dh_next_to_use = 0; - dhp->dh_first = 0; - dhp->dh_errs_count = 0; - return DW_DLV_OK; -} - -/* strncpy does not null-terminate, this does it. */ -static void -safe_strncpy(char *targ, char *src, unsigned spaceavail) -{ - unsigned goodcount = spaceavail-1; - if(spaceavail < 1) { - return; /* impossible */ - } - strncpy(targ,src,goodcount); - targ[goodcount] = 0; -} - -/* Insertion made public is only for testing the harmless error code, - it is not necessarily useful for libdwarf client code aside - from code testing libdwarf. */ -void dwarf_insert_harmless_error(Dwarf_Debug dbg, - char *newerror) -{ - struct Dwarf_Harmless_s *dhp = &dbg->de_harmless_errors; - unsigned next = 0; - unsigned cur = dhp->dh_next_to_use; - char *msgspace; - if(!dhp->dh_errors) { - dhp->dh_errs_count++; - return; - } - msgspace = dhp->dh_errors[cur]; - safe_strncpy(msgspace, newerror,DW_HARMLESS_ERROR_MSG_STRING_SIZE); - next = (cur+1) % dhp->dh_maxcount; - dhp->dh_errs_count++; - dhp->dh_next_to_use = next; - if (dhp->dh_next_to_use == dhp->dh_first) { - /* Array is full set full invariant. */ - dhp->dh_first = (dhp->dh_first+1) % dhp->dh_maxcount; - } -} - -/* The size of the circular list of strings may be set - and reset as desired. Returns the previous size of - the list. If the list is shortened excess error entries - are simply dropped. - If the reallocation fails the list size is left unchanged. - Do not make this a long list! - - Remember the maxcount we record is 1 > the user count, - so we adjust it so it looks like the user count. -*/ -unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug dbg, - unsigned maxcount ) -{ - struct Dwarf_Harmless_s *dhp = &dbg->de_harmless_errors; - unsigned prevcount = dhp->dh_maxcount; - if(maxcount != 0) { - ++maxcount; - if(maxcount != dhp->dh_maxcount) { - /* Assign transfers 'ownership' of the malloc areas - to oldarray. */ - struct Dwarf_Harmless_s oldarray = *dhp; - /* Do not double increment the max, the init() func - increments it too. */ - dwarf_harmless_init(dhp,maxcount-1); - if(oldarray.dh_next_to_use != oldarray.dh_first) { - unsigned i = 0; - for(i = oldarray.dh_first; i != oldarray.dh_next_to_use; - i = (i+1)%oldarray.dh_maxcount) { - dwarf_insert_harmless_error(dbg,oldarray.dh_errors[i]); - } - if( oldarray.dh_errs_count > dhp->dh_errs_count) { - dhp->dh_errs_count = oldarray.dh_errs_count; - } - } - dwarf_harmless_cleanout(&oldarray); - } - } - return prevcount-1; -} - -void -dwarf_harmless_init(struct Dwarf_Harmless_s *dhp,unsigned size) -{ - unsigned i = 0; - memset(dhp,0,sizeof(*dhp)); - dhp->dh_maxcount = size +1; - dhp->dh_errors = (char **)malloc(sizeof( char *) *dhp->dh_maxcount); - if (!dhp->dh_errors) { - dhp->dh_maxcount = 0; - return; - } - - for(i = 0; i < dhp->dh_maxcount; ++i) { - char *newstr = - (char *)malloc(DW_HARMLESS_ERROR_MSG_STRING_SIZE); - dhp->dh_errors[i] = newstr; - if(!newstr) { - dhp->dh_maxcount = 0; - /* Let it leak, the leak is a constrained amount. */ - dhp->dh_errors = 0; - return; - } - /* We make the string content well-defined by an initial - NUL byte, but this is not really necessary. */ - newstr[0] = 0; - } -} - -void -dwarf_harmless_cleanout(struct Dwarf_Harmless_s *dhp) -{ - unsigned i = 0; - if(!dhp->dh_errors) { - return; - } - for(i = 0; i < dhp->dh_maxcount; ++i) { - free(dhp->dh_errors[i]); - } - free(dhp->dh_errors); - dhp->dh_errors = 0; - dhp->dh_maxcount = 0; -} - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_harmless.h b/usr/src/tools/ctf/dwarf/common/dwarf_harmless.h deleted file mode 100644 index 3d4d910ce9..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_harmless.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - - Copyright (C) 2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - -*/ - - - -void dwarf_harmless_init(struct Dwarf_Harmless_s *dhp,unsigned size); -void dwarf_harmless_cleanout(struct Dwarf_Harmless_s *dhp); - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_incl.h b/usr/src/tools/ctf/dwarf/common/dwarf_incl.h deleted file mode 100644 index df2fbf334c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_incl.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - - Copyright (C) 2000, 2002, 2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2008-2010 David Anderson. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#ifndef DWARF_INCL_H -#define DWARF_INCL_H -#if (!defined(HAVE_RAW_LIBELF_OK) && defined(HAVE_LIBELF_OFF64_OK) ) -/* At a certain point libelf.h requires _GNU_SOURCE. - here we assume the criteria in configure determine that - usefully. -*/ -#define _GNU_SOURCE 1 -#endif - - -#include "libdwarfdefs.h" -#include <string.h> - -#ifdef HAVE_ELF_H -#include <elf.h> -#endif - -#include <limits.h> -#include <dwarf.h> -#include <libdwarf.h> - -#include "dwarf_base_types.h" -#include "dwarf_alloc.h" -#include "dwarf_opaque.h" -#include "dwarf_error.h" -#include "dwarf_util.h" -#endif /* DWARF_INCL_H */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_init_finish.c b/usr/src/tools/ctf/dwarf/common/dwarf_init_finish.c deleted file mode 100644 index 1ab9d5fd38..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_init_finish.c +++ /dev/null @@ -1,577 +0,0 @@ -/* - - Copyright (C) 2000,2002,2003,2004,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - -#include "config.h" -#include "dwarf_incl.h" - -#include <stdio.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <string.h> -#include <stdlib.h> - -#include "dwarf_incl.h" -#include "malloc_check.h" - -#define DWARF_DBG_ERROR(dbg,errval,retval) \ - _dwarf_error(dbg, error, errval); return(retval); - -#define FALSE 0 -#define TRUE 1 - - - -/* This static is copied to the dbg on dbg init - so that the static need not be referenced at - run time, preserving better locality of - reference. - Value is 0 means do the string check. - Value non-zero means do not do the check. -*/ -static Dwarf_Small _dwarf_assume_string_bad; -static Dwarf_Small _dwarf_apply_relocs = 1; - -/* Call this after calling dwarf_init but before doing anything else. - * It applies to all objects, not just the current object. - */ -int -dwarf_set_reloc_application(int apply) -{ - int oldval = _dwarf_apply_relocs; - _dwarf_apply_relocs = apply; - return oldval; -} - -int -dwarf_set_stringcheck(int newval) -{ - int oldval = _dwarf_assume_string_bad; - - _dwarf_assume_string_bad = newval; - return oldval; -} - -/* Unifies the basic duplicate/empty testing and section - * data setting to one place. */ -static int -get_basic_section_data(Dwarf_Debug dbg, - struct Dwarf_Section_s *secdata, - struct Dwarf_Obj_Access_Section_s *doas, - Dwarf_Half section_index, - Dwarf_Error* error, - int duperr, int emptyerr ) -{ - if (secdata->dss_index != 0) { - DWARF_DBG_ERROR(dbg, duperr, DW_DLV_ERROR); - } - if (doas->size == 0) { - if (emptyerr == 0 ) { - /* Allow empty section. */ - return DW_DLV_OK; - } - /* Know no reason to allow section */ - DWARF_DBG_ERROR(dbg, emptyerr, DW_DLV_ERROR); - } - secdata->dss_index = section_index; - secdata->dss_size = doas->size; - secdata->dss_addr = doas->addr; - secdata->dss_link = doas->link; - return DW_DLV_OK; -} - - -static void -add_rela_data( struct Dwarf_Section_s *secdata, - struct Dwarf_Obj_Access_Section_s *doas, - Dwarf_Half section_index) -{ - secdata->dss_reloc_index = section_index; - secdata->dss_reloc_size = doas->size; - secdata->dss_reloc_addr = doas->addr; - secdata->dss_reloc_symtab = doas->link; - secdata->dss_reloc_link = doas->link; -} - -/* - Given an Elf ptr, set up dbg with pointers - to all the Dwarf data sections. - Return NULL on error. - - This function is also responsible for determining - whether the given object contains Dwarf information - or not. The test currently used is that it contains - either a .debug_info or a .debug_frame section. If - not, it returns DW_DLV_NO_ENTRY causing dwarf_init() also to - return DW_DLV_NO_ENTRY. Earlier, we had thought of using only - the presence/absence of .debug_info to test, but we - added .debug_frame since there could be stripped objects - that have only a .debug_frame section for exception - processing. - DW_DLV_NO_ENTRY or DW_DLV_OK or DW_DLV_ERROR -*/ -static int -_dwarf_setup(Dwarf_Debug dbg, Dwarf_Error * error) -{ - const char *scn_name = 0; - int foundDwarf = 0; - struct Dwarf_Obj_Access_Interface_s * obj = 0; - - Dwarf_Endianness endianness; - - Dwarf_Unsigned section_size = 0; - Dwarf_Unsigned section_count = 0; - Dwarf_Half section_index = 0; - Dwarf_Addr section_addr = 0; - - foundDwarf = FALSE; - - dbg->de_assume_string_in_bounds = _dwarf_assume_string_bad; - - dbg->de_same_endian = 1; - dbg->de_copy_word = memcpy; - obj = dbg->de_obj_file; - endianness = obj->methods->get_byte_order(obj->object); -#ifdef WORDS_BIGENDIAN - dbg->de_big_endian_object = 1; - if (endianness == DW_OBJECT_LSB ) { - dbg->de_same_endian = 0; - dbg->de_big_endian_object = 0; - dbg->de_copy_word = _dwarf_memcpy_swap_bytes; - } -#else /* little endian */ - dbg->de_big_endian_object = 0; - if (endianness == DW_OBJECT_MSB ) { - dbg->de_same_endian = 0; - dbg->de_big_endian_object = 1; - dbg->de_copy_word = _dwarf_memcpy_swap_bytes; - } -#endif /* !WORDS_BIGENDIAN */ - - - /* The following de_length_size is Not Too Significant. Only used - one calculation, and an approximate one at that. */ - dbg->de_length_size = obj->methods->get_length_size(obj->object); - dbg->de_pointer_size = obj->methods->get_pointer_size(obj->object); - - section_count = obj->methods->get_section_count(obj->object); - - /* We can skip index 0 when considering ELF files, but not other - object types. */ - for (section_index = 0; section_index < section_count; - ++section_index) { - - struct Dwarf_Obj_Access_Section_s doas; - int res = DW_DLV_ERROR; - int err; - - res = obj->methods->get_section_info(obj->object, - section_index, - &doas, &err); - if(res == DW_DLV_ERROR){ - DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR); - } - - section_addr = doas.addr; - section_size = doas.size; - scn_name = doas.name; - - if (strncmp(scn_name, ".debug_", 7) - && strcmp(scn_name, ".eh_frame") - && strcmp(scn_name, ".symtab") - && strcmp(scn_name, ".strtab") - && strncmp(scn_name, ".rela.",6)) { - continue; - } - else if (strcmp(scn_name, ".debug_info") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_info, &doas, - section_index,error, - DW_DLE_DEBUG_INFO_DUPLICATE,DW_DLE_DEBUG_INFO_NULL); - if(res != DW_DLV_OK) { - return res; - } - foundDwarf = TRUE; - } - else if (strcmp(scn_name, ".debug_abbrev") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_abbrev, &doas, - section_index,error, - DW_DLE_DEBUG_ABBREV_DUPLICATE,DW_DLE_DEBUG_ABBREV_NULL); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_aranges") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_aranges, &doas, - section_index,error, - DW_DLE_DEBUG_ARANGES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - - else if (strcmp(scn_name, ".debug_line") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_line, &doas, - section_index,error, - DW_DLE_DEBUG_LINE_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_frame") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_frame, &doas, - section_index,error, - DW_DLE_DEBUG_FRAME_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - foundDwarf = TRUE; - } else if (strcmp(scn_name, ".eh_frame") == 0) { - /* gnu egcs-1.1.2 data */ - res = get_basic_section_data(dbg,&dbg->de_debug_frame_eh_gnu, &doas, - section_index,error, - DW_DLE_DEBUG_FRAME_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - foundDwarf = TRUE; - } - else if (strcmp(scn_name, ".debug_loc") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_loc, &doas, - section_index,error, - DW_DLE_DEBUG_LOC_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_pubnames") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_pubnames, &doas, - section_index,error, - DW_DLE_DEBUG_PUBNAMES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - - else if (strcmp(scn_name, ".debug_str") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_str, &doas, - section_index,error, - DW_DLE_DEBUG_STR_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_funcnames") == 0) { - /* SGI IRIX-only. */ - res = get_basic_section_data(dbg,&dbg->de_debug_funcnames, &doas, - section_index,error, - DW_DLE_DEBUG_FUNCNAMES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_typenames") == 0) { - /* SGI IRIX-only, created years before DWARF3. Content - essentially identical to .debug_pubtypes. */ - res = get_basic_section_data(dbg,&dbg->de_debug_typenames, &doas, - section_index,error, - DW_DLE_DEBUG_TYPENAMES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } else if (strcmp(scn_name, ".debug_pubtypes") == 0) { - /* Section new in DWARF3. */ - res = get_basic_section_data(dbg,&dbg->de_debug_pubtypes, &doas, - section_index,error, - DW_DLE_DEBUG_PUBTYPES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_varnames") == 0) { - /* SGI IRIX-only. */ - res = get_basic_section_data(dbg,&dbg->de_debug_varnames, &doas, - section_index,error, - DW_DLE_DEBUG_VARNAMES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_weaknames") == 0) { - /* SGI IRIX-only. */ - res = get_basic_section_data(dbg,&dbg->de_debug_weaknames, &doas, - section_index,error, - DW_DLE_DEBUG_WEAKNAMES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } else if (strcmp(scn_name, ".debug_macinfo") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_macinfo, &doas, - section_index,error, - DW_DLE_DEBUG_MACINFO_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".debug_ranges") == 0) { - res = get_basic_section_data(dbg,&dbg->de_debug_ranges, &doas, - section_index,error, - DW_DLE_DEBUG_RANGES_DUPLICATE,0); - if(res != DW_DLV_OK) { - return res; - } - foundDwarf = TRUE; - } - else if (strcmp(scn_name, ".symtab") == 0) { - res = get_basic_section_data(dbg,&dbg->de_elf_symtab, &doas, - section_index,error, - DW_DLE_DEBUG_SYMTAB_ERR,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strcmp(scn_name, ".strtab") == 0) { - res = get_basic_section_data(dbg,&dbg->de_elf_strtab, &doas, - section_index,error, - DW_DLE_DEBUG_STRTAB_ERR,0); - if(res != DW_DLV_OK) { - return res; - } - } - else if (strncmp(scn_name, ".rela.debug_",12) == 0) { - const char *rcn_name = scn_name + 5; - if (strcmp(rcn_name, ".debug_info") == 0) { - add_rela_data(&dbg->de_debug_info,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_abbrev") == 0) { - add_rela_data(&dbg->de_debug_abbrev,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_aranges") == 0) { - add_rela_data(&dbg->de_debug_aranges,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_line") == 0) { - add_rela_data(&dbg->de_debug_line,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_frame") == 0) { - add_rela_data(&dbg->de_debug_frame,&doas,section_index); - } else if (strcmp(rcn_name, ".eh_frame") == 0) { - add_rela_data(&dbg->de_debug_frame_eh_gnu,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_loc") == 0) { - add_rela_data(&dbg->de_debug_loc,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_pubnames") == 0) { - add_rela_data(&dbg->de_debug_pubnames,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_str") == 0) { - add_rela_data(&dbg->de_debug_str,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_funcnames") == 0) { - add_rela_data(&dbg->de_debug_funcnames,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_typenames") == 0) { - add_rela_data(&dbg->de_debug_typenames,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_pubtypes") == 0) { - add_rela_data(&dbg->de_debug_pubtypes,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_varnames") == 0) { - add_rela_data(&dbg->de_debug_varnames,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_weaknames") == 0) { - add_rela_data(&dbg->de_debug_weaknames,&doas,section_index); - } else if (strcmp(rcn_name, ".debug_macinfo") == 0) { - add_rela_data(&dbg->de_debug_macinfo,&doas,section_index); - } - } - } - if (foundDwarf) { - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} - - -/* - Use a Dwarf_Obj_Access_Interface to kick things off. All other - init routines eventually use this one. - The returned Dwarf_Debug contains a copy of *obj - the callers copy of *obj may be freed whenever the caller - wishes. -*/ -int -dwarf_object_init(Dwarf_Obj_Access_Interface* obj, Dwarf_Handler errhand, - Dwarf_Ptr errarg, Dwarf_Debug* ret_dbg, - Dwarf_Error* error) -{ - Dwarf_Debug dbg = 0; - int setup_result = DW_DLV_OK; - - dbg = _dwarf_get_debug(); - if (dbg == NULL) { - DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR); - } - dbg->de_errhand = errhand; - dbg->de_errarg = errarg; - dbg->de_frame_rule_initial_value = DW_FRAME_REG_INITIAL_VALUE; - dbg->de_frame_reg_rules_entry_count = DW_FRAME_LAST_REG_NUM; -#ifdef HAVE_OLD_FRAME_CFA_COL - /* DW_FRAME_CFA_COL is really only suitable for old libdwarf frame - interfaces and its value of 0 there is only usable where - (as in MIPS) register 0 has no value other than 0 so - we can use the frame table column 0 for the CFA value - (and rely on client software to know when 'register 0' - is the cfa and when to just use a value 0 for register 0). - */ - dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL; -#else - dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL3; -#endif - dbg->de_frame_same_value_number = DW_FRAME_SAME_VAL; - dbg->de_frame_undefined_value_number = DW_FRAME_UNDEFINED_VAL; - - dbg->de_obj_file = obj; - - setup_result = _dwarf_setup(dbg, error); - if (setup_result != DW_DLV_OK) { - /* The status we want to return here is of _dwarf_setup, - not of the _dwarf_free_all_of_one_debug(dbg) call. - So use a local status variable for the free. */ - int freeresult = _dwarf_free_all_of_one_debug(dbg); - if (freeresult == DW_DLV_ERROR) { - DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR); - } - dwarf_malloc_check_complete("After Final free"); - return setup_result; - } - - dwarf_harmless_init(&dbg->de_harmless_errors, - DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE); - - /* This call cannot fail: allocates nothing, releases nothing */ - _dwarf_setup_debug(dbg); - - - *ret_dbg = dbg; - return DW_DLV_OK; -} - - -/* - A finish routine that is completely unaware of ELF. - - Frees all memory that was not previously freed by - dwarf_dealloc. - Aside frmo certain categories. - */ -int -dwarf_object_finish(Dwarf_Debug dbg, Dwarf_Error * error) -{ - int res = DW_DLV_OK; - - res = _dwarf_free_all_of_one_debug(dbg); - if (res == DW_DLV_ERROR) { - DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR); - } - dwarf_malloc_check_complete("After Final free"); - - return res; -} - - -/* - Load the ELF section with the specified index and set the - pointer pointed to by section_data to the memory where it - was loaded. - */ -int -_dwarf_load_section(Dwarf_Debug dbg, - struct Dwarf_Section_s *section, - Dwarf_Error * error) -{ - int res = DW_DLV_ERROR; - int err = 0; - struct Dwarf_Obj_Access_Interface_s *o = 0; - - /* check to see if the section is already loaded */ - if (section->dss_data != NULL) { - return DW_DLV_OK; - } - o = dbg->de_obj_file; - res = o->methods->load_section( - o->object, section->dss_index, - §ion->dss_data, &err); - if(res == DW_DLV_ERROR){ - DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR); - } - if(_dwarf_apply_relocs == 0) { - return res; - } - if(section->dss_reloc_size == 0) { - return res; - } - if(!o->methods->relocate_a_section) { - return res; - } - /*apply relocations */ - res = o->methods->relocate_a_section( o->object, section->dss_index, - dbg, &err); - if(res == DW_DLV_ERROR) { - DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR); - } - return res; -} - -/* This is a hack so clients can verify offsets. - Added April 2005 so that debugger can detect broken offsets - (which happened in an IRIX -64 executable larger than 2GB - using MIPSpro 7.3.1.3 compilers. A couple .debug_pubnames - offsets were wrong.). -*/ -int -dwarf_get_section_max_offsets(Dwarf_Debug dbg, - Dwarf_Unsigned * debug_info_size, - Dwarf_Unsigned * debug_abbrev_size, - Dwarf_Unsigned * debug_line_size, - Dwarf_Unsigned * debug_loc_size, - Dwarf_Unsigned * debug_aranges_size, - Dwarf_Unsigned * debug_macinfo_size, - Dwarf_Unsigned * debug_pubnames_size, - Dwarf_Unsigned * debug_str_size, - Dwarf_Unsigned * debug_frame_size, - Dwarf_Unsigned * debug_ranges_size, - Dwarf_Unsigned * debug_typenames_size) -{ - *debug_info_size = dbg->de_debug_info.dss_size; - *debug_abbrev_size = dbg->de_debug_abbrev.dss_size; - *debug_line_size = dbg->de_debug_line.dss_size; - *debug_loc_size = dbg->de_debug_loc.dss_size; - *debug_aranges_size = dbg->de_debug_aranges.dss_size; - *debug_macinfo_size = dbg->de_debug_macinfo.dss_size; - *debug_pubnames_size = dbg->de_debug_pubnames.dss_size; - *debug_str_size = dbg->de_debug_str.dss_size; - *debug_frame_size = dbg->de_debug_frame.dss_size; - *debug_ranges_size = dbg->de_debug_ranges.dss_size; - *debug_typenames_size = dbg->de_debug_typenames.dss_size; - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_leb.c b/usr/src/tools/ctf/dwarf/common/dwarf_leb.c deleted file mode 100644 index b3b5d262f5..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_leb.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> - - -/* - decode ULEB -*/ -Dwarf_Unsigned -_dwarf_decode_u_leb128(Dwarf_Small * leb128, Dwarf_Word * leb128_length) -{ - unsigned char byte; - Dwarf_Word word_number; - Dwarf_Unsigned number; - Dwarf_Sword shift; - Dwarf_Sword byte_length; - - /* The following unrolls-the-loop for the first few bytes and - unpacks into 32 bits to make this as fast as possible. - word_number is assumed big enough that the shift has a defined - result. */ - if ((*leb128 & 0x80) == 0) { - if (leb128_length != NULL) - *leb128_length = 1; - return (*leb128); - } else if ((*(leb128 + 1) & 0x80) == 0) { - if (leb128_length != NULL) - *leb128_length = 2; - - word_number = *leb128 & 0x7f; - word_number |= (*(leb128 + 1) & 0x7f) << 7; - return (word_number); - } else if ((*(leb128 + 2) & 0x80) == 0) { - if (leb128_length != NULL) - *leb128_length = 3; - - word_number = *leb128 & 0x7f; - word_number |= (*(leb128 + 1) & 0x7f) << 7; - word_number |= (*(leb128 + 2) & 0x7f) << 14; - return (word_number); - } else if ((*(leb128 + 3) & 0x80) == 0) { - if (leb128_length != NULL) - *leb128_length = 4; - - word_number = *leb128 & 0x7f; - word_number |= (*(leb128 + 1) & 0x7f) << 7; - word_number |= (*(leb128 + 2) & 0x7f) << 14; - word_number |= (*(leb128 + 3) & 0x7f) << 21; - return (word_number); - } - - /* The rest handles long numbers Because the 'number' may be larger - than the default int/unsigned, we must cast the 'byte' before - the shift for the shift to have a defined result. */ - number = 0; - shift = 0; - byte_length = 1; - byte = *(leb128); - for (;;) { - number |= ((Dwarf_Unsigned) (byte & 0x7f)) << shift; - - if ((byte & 0x80) == 0) { - if (leb128_length != NULL) - *leb128_length = byte_length; - return (number); - } - shift += 7; - - byte_length++; - ++leb128; - byte = *leb128; - } -} - -#define BITSINBYTE 8 - -/* - decode SLEB -*/ -Dwarf_Signed -_dwarf_decode_s_leb128(Dwarf_Small * leb128, Dwarf_Word * leb128_length) -{ - Dwarf_Signed number = 0; - Dwarf_Bool sign = 0; - Dwarf_Sword shift = 0; - unsigned char byte = *leb128; - Dwarf_Sword byte_length = 1; - - /* byte_length being the number of bytes of data absorbed so far in - turning the leb into a Dwarf_Signed. */ - - for (;;) { - sign = byte & 0x40; - number |= ((Dwarf_Signed) ((byte & 0x7f))) << shift; - shift += 7; - - if ((byte & 0x80) == 0) { - break; - } - ++leb128; - byte = *leb128; - byte_length++; - } - - if ((shift < sizeof(Dwarf_Signed) * BITSINBYTE) && sign) { - number |= -((Dwarf_Signed) 1 << shift); - } - - if (leb128_length != NULL) - *leb128_length = byte_length; - return (number); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_line.c b/usr/src/tools/ctf/dwarf/common/dwarf_line.c deleted file mode 100644 index e7e15e7c1a..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_line.c +++ /dev/null @@ -1,1951 +0,0 @@ -/* - Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include "dwarf_line.h" - -static int -is_path_separator(Dwarf_Small s) -{ - if(s == '/') { - return 1; - } -#ifdef HAVE_WINDOWS_PATH - if(s == '\\') { - return 1; - } -#endif - return 0; -} - -/* Return 0 if false, 1 if true. - If HAVE_WINDOWS_PATH is defined we - attempt to handle windows full paths: - \\something or C:cwdpath.c -*/ -static int -file_name_is_full_path(Dwarf_Small *fname) -{ - Dwarf_Small firstc = *fname; - if(is_path_separator(firstc)) { - /* Full path. */ - return 1; - } - if(!firstc) { - return 0; - } -#ifdef HAVE_WINDOWS_PATH - if((firstc >= 'A' && firstc <= 'Z') || - (firstc >= 'a' && firstc <= 'z')) { - Dwarf_Small secondc = fname[1]; - if (secondc == ':') { - return 1; - } - } -#endif - return 0; -} - -/* - Although source files is supposed to return the - source files in the compilation-unit, it does - not look for any in the statement program. In - other words, it ignores those defined using the - extended opcode DW_LNE_define_file. -*/ -int -dwarf_srcfiles(Dwarf_Die die, - char ***srcfiles, - Dwarf_Signed * srcfilecount, Dwarf_Error * error) -{ - /* This pointer is used to scan the portion of the .debug_line - section for the current cu. */ - Dwarf_Small *line_ptr; - - /* Pointer to a DW_AT_stmt_list attribute in case it exists in the - die. */ - Dwarf_Attribute stmt_list_attr; - - /* Pointer to DW_AT_comp_dir attribute in die. */ - Dwarf_Attribute comp_dir_attr; - - /* Pointer to name of compilation directory. */ - Dwarf_Small *comp_dir = 0; - - /* Offset into .debug_line specified by a DW_AT_stmt_list - attribute. */ - Dwarf_Unsigned line_offset = 0; - - /* This points to a block of char *'s, each of which points to a - file name. */ - char **ret_files = 0; - - /* The Dwarf_Debug this die belongs to. */ - Dwarf_Debug dbg = 0; - - /* Used to chain the file names. */ - Dwarf_Chain curr_chain = NULL; - Dwarf_Chain prev_chain = NULL; - Dwarf_Chain head_chain = NULL; - Dwarf_Half attrform = 0; - int resattr = DW_DLV_ERROR; - int lres = DW_DLV_ERROR; - struct Line_Table_Prefix_s line_prefix; - int i = 0; - int res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - /* Reset error. */ - if (error != NULL) - *error = NULL; - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - - resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); - if (resattr != DW_DLV_OK) { - return resattr; - } - - if (dbg->de_debug_line.dss_index == 0) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); - if (res != DW_DLV_OK) { - return res; - } - - lres = dwarf_whatform(stmt_list_attr,&attrform,error); - if (lres != DW_DLV_OK) { - return lres; - } - if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 && - attrform != DW_FORM_sec_offset ) { - _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - lres = dwarf_global_formref(stmt_list_attr, &line_offset, error); - if (lres != DW_DLV_OK) { - return lres; - } - if (line_offset >= dbg->de_debug_line.dss_size) { - _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - line_ptr = dbg->de_debug_line.dss_data + line_offset; - dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); - - /* - If die has DW_AT_comp_dir attribute, get the string that names - the compilation directory. */ - resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); - if (resattr == DW_DLV_ERROR) { - return resattr; - } - if (resattr == DW_DLV_OK) { - int cres = DW_DLV_ERROR; - char *cdir = 0; - - cres = dwarf_formstring(comp_dir_attr, &cdir, error); - if (cres == DW_DLV_ERROR) { - return cres; - } else if (cres == DW_DLV_OK) { - comp_dir = (Dwarf_Small *) cdir; - } - } - if (resattr == DW_DLV_OK) { - dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); - } - dwarf_init_line_table_prefix(&line_prefix); - { - Dwarf_Small *line_ptr_out = 0; - int dres = dwarf_read_line_table_prefix(dbg, - line_ptr, - dbg->de_debug_line.dss_size, - &line_ptr_out, - &line_prefix, - NULL, NULL,error, - 0); - - if (dres == DW_DLV_ERROR) { - dwarf_free_line_table_prefix(&line_prefix); - return dres; - } - if (dres == DW_DLV_NO_ENTRY) { - dwarf_free_line_table_prefix(&line_prefix); - return dres; - } - - line_ptr = line_ptr_out; - } - - for (i = 0; i < line_prefix.pf_files_count; ++i) { - struct Line_Table_File_Entry_s *fe = - line_prefix.pf_line_table_file_entries + i; - char *file_name = (char *) fe->lte_filename; - char *dir_name = 0; - char *full_name = 0; - Dwarf_Unsigned dir_index = fe->lte_directory_index; - - if (dir_index == 0) { - dir_name = (char *) comp_dir; - } else { - dir_name = - (char *) line_prefix.pf_include_directories[ - fe->lte_directory_index - 1]; - } - - /* dir_name can be NULL if there is no DW_AT_comp_dir */ - if(dir_name == 0 || file_name_is_full_path((unsigned char *)file_name)) { - /* This is safe because dwarf_dealloc is careful to not - dealloc strings which are part of the raw .debug_* data. - */ - full_name = file_name; - } else { - full_name = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING, - strlen(dir_name) + 1 + - strlen(file_name) + - 1); - if (full_name == NULL) { - dwarf_free_line_table_prefix(&line_prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - /* This is not careful to avoid // in the output, Nothing - forces a 'canonical' name format here. Unclear if this - needs to be fixed. */ - strcpy(full_name, dir_name); - strcat(full_name, "/"); - strcat(full_name, file_name); - } - curr_chain = - (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - dwarf_free_line_table_prefix(&line_prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - curr_chain->ch_item = full_name; - if (head_chain == NULL) - head_chain = prev_chain = curr_chain; - else { - prev_chain->ch_next = curr_chain; - prev_chain = curr_chain; - } - } - - curr_chain = (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (curr_chain == NULL) { - dwarf_free_line_table_prefix(&line_prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - - - - if (line_prefix.pf_files_count == 0) { - *srcfiles = NULL; - *srcfilecount = 0; - dwarf_free_line_table_prefix(&line_prefix); - return (DW_DLV_NO_ENTRY); - } - - ret_files = (char **) - _dwarf_get_alloc(dbg, DW_DLA_LIST, line_prefix.pf_files_count); - if (ret_files == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - dwarf_free_line_table_prefix(&line_prefix); - return (DW_DLV_ERROR); - } - - curr_chain = head_chain; - for (i = 0; i < line_prefix.pf_files_count; i++) { - *(ret_files + i) = curr_chain->ch_item; - prev_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN); - } - - *srcfiles = ret_files; - *srcfilecount = line_prefix.pf_files_count; - dwarf_free_line_table_prefix(&line_prefix); - return (DW_DLV_OK); -} - - -/* - return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR -*/ -int -_dwarf_internal_srclines(Dwarf_Die die, - Dwarf_Line ** linebuf, - Dwarf_Signed * count, - Dwarf_Bool doaddrs, - Dwarf_Bool dolines, Dwarf_Error * error) -{ - /* This pointer is used to scan the portion of the .debug_line - section for the current cu. */ - Dwarf_Small *line_ptr = 0; - - /* This points to the last byte of the .debug_line portion for the - current cu. */ - Dwarf_Small *line_ptr_end = 0; - - /* Pointer to a DW_AT_stmt_list attribute in case it exists in the - die. */ - Dwarf_Attribute stmt_list_attr = 0; - - /* Pointer to DW_AT_comp_dir attribute in die. */ - Dwarf_Attribute comp_dir_attr = 0; - - /* Pointer to name of compilation directory. */ - Dwarf_Small *comp_dir = NULL; - - /* Offset into .debug_line specified by a DW_AT_stmt_list - attribute. */ - Dwarf_Unsigned line_offset = 0; - - Dwarf_File_Entry file_entries = 0; - - /* These are the state machine state variables. */ - Dwarf_Addr address = 0; - Dwarf_Word file = 1; - Dwarf_Word line = 1; - Dwarf_Word column = 0; - - /* Phony init. See below for true initialization. */ - Dwarf_Bool is_stmt = false; - - Dwarf_Bool basic_block = false; - Dwarf_Bool prologue_end = false; - Dwarf_Bool epilogue_begin = false; - Dwarf_Small isa = 0; - Dwarf_Bool end_sequence = false; - - /* These pointers are used to build the list of files names by this - cu. cur_file_entry points to the file name being added, and - prev_file_entry to the previous one. */ - Dwarf_File_Entry cur_file_entry, prev_file_entry; - - Dwarf_Sword i = 0; - Dwarf_Sword file_entry_count = 0; - - /* This is the current opcode read from the statement program. */ - Dwarf_Small opcode = 0; - - /* Pointer to a Dwarf_Line_Context_s structure that contains the - context such as file names and include directories for the set - of lines being generated. */ - Dwarf_Line_Context line_context = 0; - - /* This is a pointer to the current line being added to the line - matrix. */ - Dwarf_Line curr_line = 0; - - /* These variables are used to decode leb128 numbers. Leb128_num - holds the decoded number, and leb128_length is its length in - bytes. */ - Dwarf_Word leb128_num = 0; - Dwarf_Word leb128_length = 0; - Dwarf_Sword advance_line = 0; - - /* This is the operand of the latest fixed_advance_pc extended - opcode. */ - Dwarf_Half fixed_advance_pc = 0; - - /* Counts the number of lines in the line matrix. */ - Dwarf_Sword line_count = 0; - - /* This is the length of an extended opcode instr. */ - Dwarf_Word instr_length = 0; - Dwarf_Small ext_opcode = 0; - struct Line_Table_Prefix_s prefix; - - /* Used to chain together pointers to line table entries that are - later used to create a block of Dwarf_Line entries. */ - Dwarf_Chain chain_line = NULL; - Dwarf_Chain head_chain = NULL; - Dwarf_Chain curr_chain = NULL; - - /* This points to a block of Dwarf_Lines, a pointer to which is - returned in linebuf. */ - Dwarf_Line *block_line = 0; - - /* The Dwarf_Debug this die belongs to. */ - Dwarf_Debug dbg = 0; - int resattr = DW_DLV_ERROR; - int lres = DW_DLV_ERROR; - Dwarf_Half address_size = 0; - - int res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - if (error != NULL) - *error = NULL; - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - - res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); - if (res != DW_DLV_OK) { - return res; - } - address_size = _dwarf_get_address_size(dbg, die); - resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); - if (resattr != DW_DLV_OK) { - return resattr; - } - - lres = dwarf_formudata(stmt_list_attr, &line_offset, error); - if (lres != DW_DLV_OK) { - return lres; - } - - if (line_offset >= dbg->de_debug_line.dss_size) { - _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - line_ptr = dbg->de_debug_line.dss_data + line_offset; - dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); - - /* If die has DW_AT_comp_dir attribute, get the string that names - the compilation directory. */ - resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); - if (resattr == DW_DLV_ERROR) { - return resattr; - } - if (resattr == DW_DLV_OK) { - int cres = DW_DLV_ERROR; - char *cdir = 0; - - cres = dwarf_formstring(comp_dir_attr, &cdir, error); - if (cres == DW_DLV_ERROR) { - return cres; - } else if (cres == DW_DLV_OK) { - comp_dir = (Dwarf_Small *) cdir; - } - } - if (resattr == DW_DLV_OK) { - dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); - } - dwarf_init_line_table_prefix(&prefix); - - { - Dwarf_Small *newlinep = 0; - int res = dwarf_read_line_table_prefix(dbg, - line_ptr, - dbg->de_debug_line.dss_size, - &newlinep, - &prefix, - NULL,NULL, - error, - 0); - - if (res == DW_DLV_ERROR) { - dwarf_free_line_table_prefix(&prefix); - return res; - } - if (res == DW_DLV_NO_ENTRY) { - dwarf_free_line_table_prefix(&prefix); - return res; - } - line_ptr_end = prefix.pf_line_ptr_end; - line_ptr = newlinep; - } - - - /* Set up context structure for this set of lines. */ - line_context = (Dwarf_Line_Context) - _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1); - if (line_context == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - /* Fill out a Dwarf_File_Entry list as we use that to implement the - define_file operation. */ - file_entries = prev_file_entry = NULL; - for (i = 0; i < prefix.pf_files_count; ++i) { - struct Line_Table_File_Entry_s *pfxfile = - prefix.pf_line_table_file_entries + i; - - cur_file_entry = (Dwarf_File_Entry) - _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1); - if (cur_file_entry == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - cur_file_entry->fi_file_name = pfxfile->lte_filename; - cur_file_entry->fi_dir_index = pfxfile->lte_directory_index; - cur_file_entry->fi_time_last_mod = - pfxfile->lte_last_modification_time; - - cur_file_entry->fi_file_length = pfxfile->lte_length_of_file; - - if (file_entries == NULL) - file_entries = cur_file_entry; - else - prev_file_entry->fi_next = cur_file_entry; - prev_file_entry = cur_file_entry; - - file_entry_count++; - } - - - /* Initialize the one state machine variable that depends on the - prefix. */ - is_stmt = prefix.pf_default_is_stmt; - - - /* Start of statement program. */ - while (line_ptr < line_ptr_end) { - int type; - - opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - - - /* 'type' is the output */ - WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base, - prefix.pf_opcode_length_table, line_ptr, - prefix.pf_std_op_count); - - if (type == LOP_DISCARD) { - int oc; - int opcnt = prefix.pf_opcode_length_table[opcode]; - - for (oc = 0; oc < opcnt; oc++) { - /* - ** Read and discard operands we don't - ** understand. - ** arbitrary choice of unsigned read. - ** signed read would work as well. - */ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - } - } else if (type == LOP_SPECIAL) { - /* This op code is a special op in the object, no matter - that it might fall into the standard op range in this - compile. That is, these are special opcodes between - opcode_base and MAX_LINE_OP_CODE. (including - opcode_base and MAX_LINE_OP_CODE) */ - - opcode = opcode - prefix.pf_opcode_base; - address = address + prefix.pf_minimum_instruction_length * - (opcode / prefix.pf_line_range); - line = - line + prefix.pf_line_base + - opcode % prefix.pf_line_range; - - if (dolines) { - curr_line = - (Dwarf_Line) _dwarf_get_alloc(dbg, DW_DLA_LINE, 1); - if (curr_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_line->li_address = address; - curr_line->li_addr_line.li_l_data.li_file = - (Dwarf_Sword) file; - curr_line->li_addr_line.li_l_data.li_line = - (Dwarf_Sword) line; - curr_line->li_addr_line.li_l_data.li_column = - (Dwarf_Half) column; - curr_line->li_addr_line.li_l_data.li_is_stmt = is_stmt; - curr_line->li_addr_line.li_l_data.li_basic_block = - basic_block; - curr_line->li_addr_line.li_l_data.li_end_sequence = - curr_line->li_addr_line.li_l_data. - li_epilogue_begin = epilogue_begin; - curr_line->li_addr_line.li_l_data.li_prologue_end = - prologue_end; - curr_line->li_addr_line.li_l_data.li_isa = isa; - curr_line->li_context = line_context; - line_count++; - - chain_line = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - chain_line->ch_item = curr_line; - - if (head_chain == NULL) - head_chain = curr_chain = chain_line; - else { - curr_chain->ch_next = chain_line; - curr_chain = chain_line; - } - } - - basic_block = false; - } else if (type == LOP_STANDARD) { - switch (opcode) { - - case DW_LNS_copy:{ - if (dolines) { - - curr_line = - (Dwarf_Line) _dwarf_get_alloc(dbg, - DW_DLA_LINE, - 1); - if (curr_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_line->li_address = address; - curr_line->li_addr_line.li_l_data.li_file = - (Dwarf_Sword) file; - curr_line->li_addr_line.li_l_data.li_line = - (Dwarf_Sword) line; - curr_line->li_addr_line.li_l_data.li_column = - (Dwarf_Half) column; - curr_line->li_addr_line.li_l_data.li_is_stmt = - is_stmt; - curr_line->li_addr_line.li_l_data. - li_basic_block = basic_block; - curr_line->li_addr_line.li_l_data. - li_end_sequence = end_sequence; - curr_line->li_context = line_context; - curr_line->li_addr_line.li_l_data. - li_epilogue_begin = epilogue_begin; - curr_line->li_addr_line.li_l_data. - li_prologue_end = prologue_end; - curr_line->li_addr_line.li_l_data.li_isa = isa; - line_count++; - - chain_line = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - chain_line->ch_item = curr_line; - if (head_chain == NULL) - head_chain = curr_chain = chain_line; - else { - curr_chain->ch_next = chain_line; - curr_chain = chain_line; - } - } - - basic_block = false; - prologue_end = false; - epilogue_begin = false; - break; - } - - case DW_LNS_advance_pc:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - leb128_num = (Dwarf_Word) utmp2; - address = - address + - prefix.pf_minimum_instruction_length * - leb128_num; - break; - } - - case DW_LNS_advance_line:{ - Dwarf_Signed stmp; - - DECODE_LEB128_SWORD(line_ptr, stmp); - advance_line = (Dwarf_Sword) stmp; - line = line + advance_line; - break; - } - - case DW_LNS_set_file:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - file = (Dwarf_Word) utmp2; - break; - } - - case DW_LNS_set_column:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - column = (Dwarf_Word) utmp2; - break; - } - - case DW_LNS_negate_stmt:{ - - is_stmt = !is_stmt; - break; - } - - case DW_LNS_set_basic_block:{ - - basic_block = true; - break; - } - - case DW_LNS_const_add_pc:{ - opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base; - address = address + - prefix.pf_minimum_instruction_length * (opcode / - prefix. - pf_line_range); - break; - } - - case DW_LNS_fixed_advance_pc:{ - - READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half, - line_ptr, sizeof(Dwarf_Half)); - line_ptr += sizeof(Dwarf_Half); - address = address + fixed_advance_pc; - break; - } - - /* New in DWARF3 */ - case DW_LNS_set_prologue_end:{ - - prologue_end = true; - break; - - - } - /* New in DWARF3 */ - case DW_LNS_set_epilogue_begin:{ - epilogue_begin = true; - break; - } - - /* New in DWARF3 */ - case DW_LNS_set_isa:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - isa = utmp2; - if (isa != utmp2) { - /* The value of the isa did not fit in our - local so we record it wrong. declare an - error. */ - dwarf_free_line_table_prefix(&prefix); - - _dwarf_error(dbg, error, - DW_DLE_LINE_NUM_OPERANDS_BAD); - return (DW_DLV_ERROR); - } - break; - } - } - - } else if (type == LOP_EXTENDED) { - Dwarf_Unsigned utmp3; - - DECODE_LEB128_UWORD(line_ptr, utmp3); - instr_length = (Dwarf_Word) utmp3; - /* Dwarf_Small is a ubyte and the extended opcode is a - ubyte, though not stated as clearly in the 2.0.0 spec as - one might hope. */ - ext_opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - switch (ext_opcode) { - - case DW_LNE_end_sequence:{ - end_sequence = true; - - if (dolines) { - curr_line = (Dwarf_Line) - _dwarf_get_alloc(dbg, DW_DLA_LINE, 1); - if (curr_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_line->li_address = address; - curr_line->li_addr_line.li_l_data.li_file = - (Dwarf_Sword) file; - curr_line->li_addr_line.li_l_data.li_line = - (Dwarf_Sword) line; - curr_line->li_addr_line.li_l_data.li_column = - (Dwarf_Half) column; - curr_line->li_addr_line.li_l_data.li_is_stmt = - prefix.pf_default_is_stmt; - curr_line->li_addr_line.li_l_data. - li_basic_block = basic_block; - curr_line->li_addr_line.li_l_data. - li_end_sequence = end_sequence; - curr_line->li_context = line_context; - curr_line->li_addr_line.li_l_data. - li_epilogue_begin = epilogue_begin; - curr_line->li_addr_line.li_l_data. - li_prologue_end = prologue_end; - curr_line->li_addr_line.li_l_data.li_isa = isa; - line_count++; - - chain_line = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - chain_line->ch_item = curr_line; - - if (head_chain == NULL) - head_chain = curr_chain = chain_line; - else { - curr_chain->ch_next = chain_line; - curr_chain = chain_line; - } - } - - address = 0; - file = 1; - line = 1; - column = 0; - is_stmt = prefix.pf_default_is_stmt; - basic_block = false; - end_sequence = false; - prologue_end = false; - epilogue_begin = false; - - - break; - } - - case DW_LNE_set_address:{ - { - READ_UNALIGNED(dbg, address, Dwarf_Addr, - line_ptr, address_size); - if (doaddrs) { - curr_line = - (Dwarf_Line) _dwarf_get_alloc(dbg, - DW_DLA_LINE, - 1); - if (curr_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, - DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_line->li_address = address; - curr_line->li_addr_line.li_offset = - line_ptr - dbg->de_debug_line.dss_data; - - line_count++; - - chain_line = (Dwarf_Chain) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, - DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - chain_line->ch_item = curr_line; - - if (head_chain == NULL) - head_chain = curr_chain = chain_line; - else { - curr_chain->ch_next = chain_line; - curr_chain = chain_line; - } - } - - line_ptr += address_size; - } - - break; - } - - case DW_LNE_define_file:{ - - if (dolines) { - cur_file_entry = (Dwarf_File_Entry) - _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1); - if (cur_file_entry == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - cur_file_entry->fi_file_name = - (Dwarf_Small *) line_ptr; - line_ptr = - line_ptr + strlen((char *) line_ptr) + 1; - - cur_file_entry->fi_dir_index = (Dwarf_Sword) - _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - cur_file_entry->fi_time_last_mod = - _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - cur_file_entry->fi_file_length = - _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - if (file_entries == NULL) - file_entries = cur_file_entry; - else - prev_file_entry->fi_next = cur_file_entry; - prev_file_entry = cur_file_entry; - - file_entry_count++; - } - break; - } - - default:{ - /* This is an extended op code we do not know about, - other than we know now many bytes it is - and the op code and the bytes of operand. */ - Dwarf_Unsigned remaining_bytes = instr_length -1; - if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, - DW_DLE_LINE_EXT_OPCODE_BAD); - return (DW_DLV_ERROR); - } - line_ptr += remaining_bytes; - break; - } - } - - } - } - - block_line = (Dwarf_Line *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, line_count); - if (block_line == NULL) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_chain = head_chain; - for (i = 0; i < line_count; i++) { - *(block_line + i) = curr_chain->ch_item; - head_chain = curr_chain; - curr_chain = curr_chain->ch_next; - dwarf_dealloc(dbg, head_chain, DW_DLA_CHAIN); - } - - line_context->lc_file_entries = file_entries; - line_context->lc_file_entry_count = file_entry_count; - line_context->lc_include_directories_count = - prefix.pf_include_directories_count; - if (prefix.pf_include_directories_count > 0) { - /* This gets a pointer to the *first* include dir. The others - follow directly with the standard DWARF2/3 NUL byte - following the last. */ - line_context->lc_include_directories = - prefix.pf_include_directories[0]; - } - - line_context->lc_line_count = line_count; - line_context->lc_compilation_directory = comp_dir; - line_context->lc_version_number = prefix.pf_version; - line_context->lc_dbg = dbg; - *count = line_count; - - *linebuf = block_line; - dwarf_free_line_table_prefix(&prefix); - return (DW_DLV_OK); -} - -int -dwarf_srclines(Dwarf_Die die, - Dwarf_Line ** linebuf, - Dwarf_Signed * linecount, Dwarf_Error * error) -{ - Dwarf_Signed count = 0; - int res = _dwarf_internal_srclines(die, linebuf, &count, - /* addrlist= */ false, - /* linelist= */ true, error); - if (res != DW_DLV_OK) { - return res; - } - *linecount = count; - return res; -} - - - -/* Every line table entry (except DW_DLE_end_sequence, - which is returned using dwarf_lineendsequence()) - potentially has the begin-statement - flag marked 'on'. This returns thru *return_bool, - the begin-statement flag. -*/ - -int -dwarf_linebeginstatement(Dwarf_Line line, - Dwarf_Bool * return_bool, Dwarf_Error * error) -{ - if (line == NULL || return_bool == 0) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - *return_bool = (line->li_addr_line.li_l_data.li_is_stmt); - return DW_DLV_OK; -} - -/* At the end of any contiguous line-table there may be - a DW_LNE_end_sequence operator. - This returns non-zero thru *return_bool - if and only if this 'line' entry was a DW_LNE_end_sequence. - - Within a compilation unit or function there may be multiple - line tables, each ending with a DW_LNE_end_sequence. - Each table describes a contiguous region. - Because compilers may split function code up in arbitrary ways - compilers may need to emit multiple contigous regions (ie - line tables) for a single function. - See the DWARF3 spec section 6.2. -*/ -int -dwarf_lineendsequence(Dwarf_Line line, - Dwarf_Bool * return_bool, Dwarf_Error * error) -{ - if (line == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - *return_bool = (line->li_addr_line.li_l_data.li_end_sequence); - return DW_DLV_OK; -} - - -/* Each 'line' entry has a line-number. - If the entry is a DW_LNE_end_sequence the line-number is - meaningless (see dwarf_lineendsequence(), just above). -*/ -int -dwarf_lineno(Dwarf_Line line, - Dwarf_Unsigned * ret_lineno, Dwarf_Error * error) -{ - if (line == NULL || ret_lineno == 0) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - *ret_lineno = (line->li_addr_line.li_l_data.li_line); - return DW_DLV_OK; -} - -/* Each 'line' entry has a file-number, and index into the file table. - If the entry is a DW_LNE_end_sequence the index is - meaningless (see dwarf_lineendsequence(), just above). - The file number returned is an index into the file table - produced by dwarf_srcfiles(), but care is required: the - li_file begins with 1 for real files, so that the li_file returned here - is 1 greater than its index into the dwarf_srcfiles() output array. - And entries from DW_LNE_define_file don't appear in - the dwarf_srcfiles() output so file indexes from here may exceed - the size of the dwarf_srcfiles() output array size. -*/ -int -dwarf_line_srcfileno(Dwarf_Line line, - Dwarf_Unsigned * ret_fileno, Dwarf_Error * error) -{ - if (line == NULL || ret_fileno == 0) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - /* li_file must be <= line->li_context->lc_file_entry_count else it - is trash. li_file 0 means not attributable to any source file - per dwarf2/3 spec. */ - - *ret_fileno = (line->li_addr_line.li_l_data.li_file); - return DW_DLV_OK; -} - - -/* Each 'line' entry has a line-address. - If the entry is a DW_LNE_end_sequence the adddress - is one-beyond the last address this contigous region - covers, so the address is not inside the region, - but is just outside it. -*/ -int -dwarf_lineaddr(Dwarf_Line line, - Dwarf_Addr * ret_lineaddr, Dwarf_Error * error) -{ - if (line == NULL || ret_lineaddr == 0) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - *ret_lineaddr = (line->li_address); - return DW_DLV_OK; -} - - -/* Each 'line' entry has a column-within-line (offset - within the line) where the - source text begins. - If the entry is a DW_LNE_end_sequence the line-number is - meaningless (see dwarf_lineendsequence(), just above). - Lines of text begin at column 1. The value 0 - means the line begins at the left edge of the line. - (See the DWARF3 spec, section 6.2.2). -*/ -int -dwarf_lineoff(Dwarf_Line line, - Dwarf_Signed * ret_lineoff, Dwarf_Error * error) -{ - if (line == NULL || ret_lineoff == 0) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - *ret_lineoff = - (line->li_addr_line.li_l_data.li_column == - 0 ? -1 : line->li_addr_line.li_l_data.li_column); - return DW_DLV_OK; -} - - -int -dwarf_linesrc(Dwarf_Line line, char **ret_linesrc, Dwarf_Error * error) -{ - Dwarf_Signed i = 0; - Dwarf_File_Entry file_entry; - Dwarf_Small *name_buffer = 0; - Dwarf_Small *include_directories = 0; - Dwarf_Small include_direc_full_path = 0; - Dwarf_Small file_name_full_path = 0; - Dwarf_Debug dbg = 0; - unsigned int comp_dir_len = 0; - - if (line == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - - if (line->li_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL); - return (DW_DLV_ERROR); - } - dbg = line->li_context->lc_dbg; - - if (line->li_addr_line.li_l_data.li_file > - line->li_context->lc_file_entry_count) { - _dwarf_error(dbg, error, DW_DLE_LINE_FILE_NUM_BAD); - return (DW_DLV_ERROR); - } - - if (line->li_addr_line.li_l_data.li_file == 0) { - /* No file name known: see dwarf2/3 spec. */ - _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME); - return (DW_DLV_ERROR); - } - file_entry = line->li_context->lc_file_entries; - /* ASSERT: li_file > 0, dwarf correctness issue, see line table - definition of dwarf2/3 spec. */ - /* Example: if li_file is 2 and lc_file_entry_count is 3, - file_entry is file 3 (1 based), aka 2( 0 based) file_entry->next - is file 2 (1 based), aka 1( 0 based) file_entry->next->next is - file 1 (1 based), aka 0( 0 based) file_entry->next->next->next - is NULL. - - and this loop finds the file_entry we need (2 (1 based) in this - case). Because lc_file_entries are in reverse order and - effectively zero based as a count whereas li_file is 1 based. */ - for (i = line->li_addr_line.li_l_data.li_file - 1; i > 0; i--) - file_entry = file_entry->fi_next; - - if (file_entry->fi_file_name == NULL) { - _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME); - return (DW_DLV_ERROR); - } - - file_name_full_path = file_name_is_full_path(file_entry->fi_file_name); - if (file_name_full_path) { - *ret_linesrc = ((char *) file_entry->fi_file_name); - return DW_DLV_OK; - } - - if (file_entry->fi_dir_index == 0) { - - /* dir_index of 0 means that the compilation was in the - 'current directory of compilation' */ - if (line->li_context->lc_compilation_directory == NULL) { - /* we don't actually *have* a current directory of - compilation: DW_AT_comp_dir was not present Rather than - emitting DW_DLE_NO_COMP_DIR lets just make an empty name - here. In other words, do the best we can with what we do - have instead of reporting an error. _dwarf_error(dbg, - error, DW_DLE_NO_COMP_DIR); return(DW_DLV_ERROR); */ - comp_dir_len = 0; - } else { - comp_dir_len = strlen((char *) - (line->li_context-> - lc_compilation_directory)); - } - - name_buffer = - _dwarf_get_alloc(line->li_context->lc_dbg, DW_DLA_STRING, - comp_dir_len + 1 + - strlen((char *) file_entry->fi_file_name) + - 1); - if (name_buffer == NULL) { - _dwarf_error(line->li_context->lc_dbg, error, - DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - if (comp_dir_len > 0) { - /* if comp_dir_len is 0 we do not want to put a / in front - of the fi_file_name as we just don't know anything. */ - strcpy((char *) name_buffer, - (char *) (line->li_context-> - lc_compilation_directory)); - strcat((char *) name_buffer, "/"); - } - strcat((char *) name_buffer, (char *) file_entry->fi_file_name); - *ret_linesrc = ((char *) name_buffer); - return DW_DLV_OK; - } - - if (file_entry->fi_dir_index > - line->li_context->lc_include_directories_count) { - _dwarf_error(dbg, error, DW_DLE_INCL_DIR_NUM_BAD); - return (DW_DLV_ERROR); - } - - include_directories = line->li_context->lc_include_directories; - for (i = file_entry->fi_dir_index - 1; i > 0; i--) - include_directories += strlen((char *) include_directories) + 1; - - if (line->li_context->lc_compilation_directory) { - comp_dir_len = strlen((char *) - (line->li_context->lc_compilation_directory)); - } else { - /* No DW_AT_comp_dir present. Do the best we can without it. */ - comp_dir_len = 0; - } - - include_direc_full_path = file_name_is_full_path(include_directories); - name_buffer = _dwarf_get_alloc(dbg, DW_DLA_STRING, - (include_direc_full_path ? 0 : comp_dir_len + 1) + - strlen((char *)include_directories) + 1 + - strlen((char *)file_entry->fi_file_name) + 1); - if (name_buffer == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - if (!include_direc_full_path) { - if (comp_dir_len > 0) { - strcpy((char *)name_buffer, - (char *)line->li_context->lc_compilation_directory); - /* Who provides the / needed after the compilation - directory? */ - if (!is_path_separator(name_buffer[comp_dir_len - 1])) { - /* Here we provide the / separator. It - should work ok for Windows */ - /* Overwrite previous nul terminator with needed / */ - name_buffer[comp_dir_len] = '/'; - name_buffer[comp_dir_len + 1] = 0; - } - } - } else { - strcpy((char *) name_buffer, ""); - } - strcat((char *) name_buffer, (char *) include_directories); - strcat((char *) name_buffer, "/"); - strcat((char *) name_buffer, (char *) file_entry->fi_file_name); - *ret_linesrc = ((char *) name_buffer); - return DW_DLV_OK; -} - -/* Every line table entry potentially has the basic-block-start - flag marked 'on'. This returns thru *return_bool, - the basic-block-start flag. -*/ -int -dwarf_lineblock(Dwarf_Line line, - Dwarf_Bool * return_bool, Dwarf_Error * error) -{ - if (line == NULL) { - _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL); - return (DW_DLV_ERROR); - } - *return_bool = (line->li_addr_line.li_l_data.li_basic_block); - return DW_DLV_OK; -} - - -#if 0 /* Ignore this. This needs major - re-work. */ -/* - This routine works by looking for exact matches between - the current line address and pc, and crossovers from - from less than pc value to greater than. At each line - that satisfies the above, it records a pointer to the - line, and the difference between the address and pc. - It then scans these pointers and picks out those with - the smallest difference between pc and address. -*/ -int -dwarf_pclines(Dwarf_Debug dbg, - Dwarf_Addr pc, - Dwarf_Line ** linebuf, - Dwarf_Signed slide, - Dwarf_Signed * linecount, Dwarf_Error * error) -{ - /* - Scans the line matrix for the current cu to which a pointer - exists in dbg. */ - Dwarf_Line line; - Dwarf_Line prev_line; - - /* - These flags are for efficiency reasons. Check_line is true - initially, but set false when the address of the current line is - greater than pc. It is set true only when the address of the - current line falls below pc. This assumes that addresses within - the same segment increase, and we are only interested in the - switch from a less than pc address to a greater than. First_line - is set true initially, but set false after the first line is - scanned. This is to prevent looking at the address of previous - line when slide is DW_DLS_BACKWARD, and the first line is being - scanned. */ - Dwarf_Bool check_line, first_line; - - /* - Diff tracks the smallest difference a line address and the input - pc value. */ - Dwarf_Signed diff, i; - - /* - For the slide = DW_DLS_BACKWARD case, pc_less is the value of - the address of the line immediately preceding the first line - that has value greater than pc. For the slide = DW_DLS_FORWARD - case, pc_more is the values of address for the first line that - is greater than pc. Diff is the difference between either of the - these values and pc. */ - Dwarf_Addr pc_less, pc_more; - - /* - Pc_line_buf points to a chain of pointers to lines of which - those with a diff equal to the smallest difference will be - returned. */ - Dwarf_Line *pc_line_buf, *pc_line; - - /* - Chain_count counts the number of lines in the above chain for - which the diff is equal to the smallest difference This is the - number returned by this routine. */ - Dwarf_Signed chain_count; - - chain_head = NULL; - - check_line = true; - first_line = true; - diff = MAX_LINE_DIFF; - - for (i = 0; i < dbg->de_cu_line_count; i++) { - - line = *(dbg->de_cu_line_ptr + i); - prev_line = first_line ? NULL : *(dbg->de_cu_line_ptr + i - 1); - - if (line->li_address == pc) { - chain_ptr = (struct chain *) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_ptr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - chain_ptr->line = line; - chain_ptr->diff = diff = 0; - chain_ptr->next = chain_head; - chain_head = chain_ptr; - } else - /* - Look for crossover from less than pc address to greater - than. */ - if (check_line && line->li_address > pc && - (first_line ? 0 : prev_line->li_address) < pc) - - if (slide == DW_DLS_BACKWARD && !first_line) { - pc_less = prev_line->li_address; - if (pc - pc_less <= diff) { - chain_ptr = (struct chain *) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_ptr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - chain_ptr->line = prev_line; - chain_ptr->diff = diff = pc - pc_less; - chain_ptr->next = chain_head; - chain_head = chain_ptr; - } - check_line = false; - } else if (slide == DW_DLS_FORWARD) { - pc_more = line->li_address; - if (pc_more - pc <= diff) { - chain_ptr = (struct chain *) - _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1); - if (chain_ptr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - chain_ptr->line = line; - chain_ptr->diff = diff = pc_more - pc; - chain_ptr->next = chain_head; - chain_head = chain_ptr; - } - check_line = false; - } else - /* Check addresses only when they go */ - /* below pc. */ - if (line->li_address < pc) - check_line = true; - - first_line = false; - } - - chain_count = 0; - for (chain_ptr = chain_head; chain_ptr != NULL; - chain_ptr = chain_ptr->next) - if (chain_ptr->diff == diff) - chain_count++; - - pc_line_buf = pc_line = (Dwarf_Line) - _dwarf_get_alloc(dbg, DW_DLA_LIST, chain_count); - for (chain_ptr = chain_head; chain_ptr != NULL; - chain_ptr = chain_ptr->next) - if (chain_ptr->diff == diff) { - *pc_line = chain_ptr->line; - pc_line++; - } - - for (chain_ptr = chain_head; chain_ptr != NULL;) { - chain_head = chain_ptr; - chain_ptr = chain_ptr->next; - dwarf_dealloc(dbg, chain_head, DW_DLA_CHAIN); - } - - *linebuf = pc_line_buf; - return (chain_count); -} -#endif - - - -/* - It's impossible for callers of dwarf_srclines() to get to and - free all the resources (in particular, the li_context and its - lc_file_entries). - So this function, new July 2005, does it. -*/ - -void -dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf, - Dwarf_Signed count) -{ - - Dwarf_Signed i = 0; - struct Dwarf_Line_Context_s *context = 0; - - if (count > 0) { - /* All these entries share a single context */ - context = linebuf[0]->li_context; - } - for (i = 0; i < count; ++i) { - dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE); - } - dwarf_dealloc(dbg, linebuf, DW_DLA_LIST); - - if (context) { - Dwarf_File_Entry fe = context->lc_file_entries; - - while (fe) { - Dwarf_File_Entry fenext = fe->fi_next; - - dwarf_dealloc(dbg, fe, DW_DLA_FILE_ENTRY); - fe = fenext; - } - dwarf_dealloc(dbg, context, DW_DLA_LINE_CONTEXT); - } - - return; -} - -/* Operand counts per standard operand. - The initial zero is for DW_LNS_copy. - This is an economical way to verify we understand the table - of standard-opcode-lengths in the line table prologue. */ -#define STANDARD_OPERAND_COUNT_DWARF2 9 -#define STANDARD_OPERAND_COUNT_DWARF3 12 -static unsigned char - dwarf_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = { - /* DWARF2 */ - 0, - 1, 1, 1, 1, - 0, 0, 0, - 1, - /* Following are new for DWARF3. */ - 0, 0, 1 -}; - -/* We have a normal standard opcode base, but - an arm compiler emitted a non-standard table! - This could lead to problems... - ARM C/C++ Compiler, RVCT4.0 [Build 4 - 00] seems to get the table wrong . */ -static unsigned char -dwarf_arm_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = { - /* DWARF2 */ - 0, - 1, 1, 1, 1, - 0, 0, 0, - 0, /* <<< --- this is wrong */ - /* Following are new for DWARF3. */ - 0, 0, 1 -}; - -static void -print_header_issue(Dwarf_Debug dbg, - char *specific_msg, - Dwarf_Small *data_start, - int *err_count_out) -{ - if(!err_count_out) - return; - printf("*** DWARF CHECK: " - "line table header: %s", - specific_msg); - if( data_start >= dbg->de_debug_line.dss_data && - (data_start < (dbg->de_debug_line.dss_data + - dbg->de_debug_line.dss_size))) { - Dwarf_Unsigned off = data_start - dbg->de_debug_line.dss_data; - printf(" at .debug_line section offset 0x%" DW_PR_DUx - " ( %" DW_PR_DUu " ) ", - off,off); - } else { - printf(" (unknown section location) "); - } - printf("***\n"); - *err_count_out += 1; -} - - - -/* Common line table prefix reading code. - Returns DW_DLV_OK, DW_DLV_ERROR. - DW_DLV_NO_ENTRY cannot be returned, but callers should - assume it is possible. - - The prefix_out area must be initialized properly before calling this. - - Has the side effect of allocating arrays which - must be freed (see the Line_Table_Prefix_s struct which - holds the pointers to space we allocate here). - - bogus_bytes_ptr and bogus_bytes are output values which - let a print-program notify the user of some surprising bytes - after a line table header and before the line table instructions. - These can be ignored unless one is printing. - And are ignored if NULL passed as the pointer. -*/ - -/* err_count_out may be NULL, in which case we - make no attempt to count checking-type errors. - Checking-type errors do not stop us, we just report them. -*/ -int -dwarf_read_line_table_prefix(Dwarf_Debug dbg, - Dwarf_Small * data_start, - Dwarf_Unsigned data_length, - Dwarf_Small ** updated_data_start_out, - struct Line_Table_Prefix_s *prefix_out, - Dwarf_Small ** bogus_bytes_ptr, - Dwarf_Unsigned *bogus_bytes, - Dwarf_Error * err, - int *err_count_out) -{ - Dwarf_Small *line_ptr = data_start; - Dwarf_Unsigned total_length = 0; - int local_length_size = 0; - int local_extension_size = 0; - Dwarf_Unsigned prologue_length = 0; - Dwarf_Half version = 0; - Dwarf_Unsigned directories_count = 0; - Dwarf_Unsigned directories_malloc = 0; - Dwarf_Unsigned files_count = 0; - Dwarf_Unsigned files_malloc = 0; - Dwarf_Small *line_ptr_end = 0; - Dwarf_Small *lp_begin = 0; - if(bogus_bytes_ptr) *bogus_bytes_ptr = 0; - if(bogus_bytes) *bogus_bytes= 0; - - prefix_out->pf_line_ptr_start = line_ptr; - /* READ_AREA_LENGTH updates line_ptr for consumed bytes */ - READ_AREA_LENGTH(dbg, total_length, Dwarf_Unsigned, - line_ptr, local_length_size, local_extension_size); - - - line_ptr_end = line_ptr + total_length; - prefix_out->pf_line_ptr_end = line_ptr_end; - prefix_out->pf_length_field_length = local_length_size + - local_extension_size; - /* ASSERT: prefix_out->pf_length_field_length == line_ptr - -prefix_out->pf_line_ptr_start; */ - if (line_ptr_end > dbg->de_debug_line.dss_data + - dbg->de_debug_line.dss_size) { - _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD); - return (DW_DLV_ERROR); - } - if (line_ptr_end > data_start + data_length) { - _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD); - return (DW_DLV_ERROR); - } - prefix_out->pf_total_length = total_length; - - READ_UNALIGNED(dbg, version, Dwarf_Half, - line_ptr, sizeof(Dwarf_Half)); - prefix_out->pf_version = version; - line_ptr += sizeof(Dwarf_Half); - if (version != CURRENT_VERSION_STAMP && - version != CURRENT_VERSION_STAMP3) { - _dwarf_error(dbg, err, DW_DLE_VERSION_STAMP_ERROR); - return (DW_DLV_ERROR); - } - - READ_UNALIGNED(dbg, prologue_length, Dwarf_Unsigned, - line_ptr, local_length_size); - prefix_out->pf_prologue_length = prologue_length; - line_ptr += local_length_size; - prefix_out->pf_line_prologue_start = line_ptr; - - prefix_out->pf_minimum_instruction_length = - *(unsigned char *) line_ptr; - line_ptr = line_ptr + sizeof(Dwarf_Small); - - prefix_out->pf_default_is_stmt = *(unsigned char *) line_ptr; - line_ptr = line_ptr + sizeof(Dwarf_Small); - - prefix_out->pf_line_base = *(signed char *) line_ptr; - line_ptr = line_ptr + sizeof(Dwarf_Sbyte); - - prefix_out->pf_line_range = *(unsigned char *) line_ptr; - line_ptr = line_ptr + sizeof(Dwarf_Small); - - prefix_out->pf_opcode_base = *(unsigned char *) line_ptr; - line_ptr = line_ptr + sizeof(Dwarf_Small); - - /* Set up the array of standard opcode lengths. */ - /* We think this works ok even for cross-endian processing of - objects. It might be wrong, we might need to specially process - the array of ubyte into host order. */ - prefix_out->pf_opcode_length_table = line_ptr; - - /* pf_opcode_base is one greater than the size of the array. */ - line_ptr += prefix_out->pf_opcode_base - 1; - - { - /* Determine (as best we can) whether the - pf_opcode_length_table holds 9 or 12 standard-conforming - entries. gcc4 upped to DWARF3's 12 without updating the - version number. */ - int operand_ck_fail = true; - - if (prefix_out->pf_opcode_base >= STANDARD_OPERAND_COUNT_DWARF3) { - int mismatch = memcmp(dwarf_standard_opcode_operand_count, - prefix_out->pf_opcode_length_table, - STANDARD_OPERAND_COUNT_DWARF3); - if(mismatch) { - if(err_count_out) { - print_header_issue(dbg,"standard-operands did not match", - data_start,err_count_out); - } - mismatch = memcmp(dwarf_arm_standard_opcode_operand_count, - prefix_out->pf_opcode_length_table, - STANDARD_OPERAND_COUNT_DWARF3); - if(!mismatch && err_count_out) { - print_header_issue(dbg,"arm (incorrect) operands in use", - data_start,err_count_out); - } - } - if (!mismatch) { - if (version == 2) { - if(err_count_out) { - print_header_issue(dbg, - "standard DWARF3 operands matched, but is DWARF2 linetable", - data_start,err_count_out); - } - } - operand_ck_fail = false; - prefix_out->pf_std_op_count = - STANDARD_OPERAND_COUNT_DWARF3; - } - } - if (operand_ck_fail) { - if (prefix_out->pf_opcode_base >= - STANDARD_OPERAND_COUNT_DWARF2) { - - int mismatch = - memcmp(dwarf_standard_opcode_operand_count, - prefix_out->pf_opcode_length_table, - STANDARD_OPERAND_COUNT_DWARF2); - if(mismatch) { - if(err_count_out) { - print_header_issue(dbg,"standard-operands-lengths did not match", - data_start,err_count_out); - } - mismatch = memcmp(dwarf_arm_standard_opcode_operand_count, - prefix_out->pf_opcode_length_table, - STANDARD_OPERAND_COUNT_DWARF2); - if(!mismatch && err_count_out) { - print_header_issue(dbg,"arm (incorrect) operand in use", - data_start,err_count_out); - } - } - - if (!mismatch) { - operand_ck_fail = false; - prefix_out->pf_std_op_count = - STANDARD_OPERAND_COUNT_DWARF2; - } - } - } - if (operand_ck_fail) { - /* Here we are not sure what the pf_std_op_count is. */ - _dwarf_error(dbg, err, DW_DLE_LINE_NUM_OPERANDS_BAD); - return (DW_DLV_ERROR); - } - } - /* At this point we no longer need to check operand counts. */ - - - directories_count = 0; - directories_malloc = 5; - prefix_out->pf_include_directories = malloc(sizeof(Dwarf_Small *) * - directories_malloc); - if (prefix_out->pf_include_directories == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - memset(prefix_out->pf_include_directories, 0, - sizeof(Dwarf_Small *) * directories_malloc); - - while ((*(char *) line_ptr) != '\0') { - if (directories_count >= directories_malloc) { - Dwarf_Unsigned expand = 2 * directories_malloc; - Dwarf_Unsigned bytesalloc = sizeof(Dwarf_Small *) * expand; - Dwarf_Small **newdirs = - realloc(prefix_out->pf_include_directories, - bytesalloc); - - if (!newdirs) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - /* Doubled size, zero out second half. */ - memset(newdirs + directories_malloc, 0, - sizeof(Dwarf_Small *) * directories_malloc); - directories_malloc = expand; - prefix_out->pf_include_directories = newdirs; - } - prefix_out->pf_include_directories[directories_count] = - line_ptr; - line_ptr = line_ptr + strlen((char *) line_ptr) + 1; - directories_count++; - } - prefix_out->pf_include_directories_count = directories_count; - line_ptr++; - - files_count = 0; - files_malloc = 5; - prefix_out->pf_line_table_file_entries = - malloc(sizeof(struct Line_Table_File_Entry_s) * files_malloc); - if (prefix_out->pf_line_table_file_entries == NULL) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - memset(prefix_out->pf_line_table_file_entries, 0, - sizeof(struct Line_Table_File_Entry_s) * files_malloc); - - while (*(char *) line_ptr != '\0') { - Dwarf_Unsigned utmp; - Dwarf_Unsigned dir_index = 0; - Dwarf_Unsigned lastmod = 0; - Dwarf_Unsigned file_length = 0; - struct Line_Table_File_Entry_s *curline; - Dwarf_Word leb128_length = 0; - - - if (files_count >= files_malloc) { - Dwarf_Unsigned expand = 2 * files_malloc; - struct Line_Table_File_Entry_s *newfiles = - realloc(prefix_out->pf_line_table_file_entries, - sizeof(struct Line_Table_File_Entry_s) * - expand); - if (!newfiles) { - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - memset(newfiles + files_malloc, 0, - sizeof(struct Line_Table_File_Entry_s) * - files_malloc); - files_malloc = expand; - prefix_out->pf_line_table_file_entries = newfiles; - } - curline = prefix_out->pf_line_table_file_entries + files_count; - - curline->lte_filename = line_ptr; - line_ptr = line_ptr + strlen((char *) line_ptr) + 1; - - DECODE_LEB128_UWORD(line_ptr, utmp); - dir_index = (Dwarf_Sword) utmp; - if (dir_index > directories_count) { - _dwarf_error(dbg, err, DW_DLE_DIR_INDEX_BAD); - return (DW_DLV_ERROR); - } - curline->lte_directory_index = dir_index; - - lastmod = _dwarf_decode_u_leb128(line_ptr, &leb128_length); - line_ptr = line_ptr + leb128_length; - curline->lte_last_modification_time = lastmod; - - /* Skip over file length. */ - file_length = _dwarf_decode_u_leb128(line_ptr, &leb128_length); - line_ptr = line_ptr + leb128_length; - curline->lte_length_of_file = file_length; - - ++files_count; - - } - prefix_out->pf_files_count = files_count; - /* Skip trailing nul byte */ - ++line_ptr; - - - lp_begin = prefix_out->pf_line_prologue_start + - prefix_out->pf_prologue_length; - if (line_ptr != lp_begin) { - if(line_ptr > lp_begin) { - _dwarf_error(dbg, err, DW_DLE_LINE_PROLOG_LENGTH_BAD); - return (DW_DLV_ERROR); - } else { - /* Bug in compiler. These - * bytes are really part of the instruction - * stream. The prefix_out->pf_prologue_length is - * wrong (12 too high). */ - if(bogus_bytes_ptr) { - *bogus_bytes_ptr = line_ptr; - } - if(bogus_bytes) { - /* How far off things are. We expect the - value 12 ! */ - *bogus_bytes = (lp_begin - line_ptr); - } - } - /* Ignore the lp_begin calc. Assume line_ptr right. - Making up for compiler bug. */ - lp_begin = line_ptr; - - } - - *updated_data_start_out = lp_begin; - return DW_DLV_OK; -} - - -/* Initialize the Line_Table_Prefix_s struct. - memset is not guaranteed a portable initializer, but works - fine for current architectures. AFAIK. -*/ -void -dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf) -{ - memset(pf, 0, sizeof(*pf)); -} - -/* Free any malloc'd area. of the Line_Table_Prefix_s struct. */ -void -dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf) -{ - if (pf->pf_include_directories) { - free(pf->pf_include_directories); - pf->pf_include_directories = 0; - } - if (pf->pf_line_table_file_entries) { - free(pf->pf_line_table_file_entries); - pf->pf_line_table_file_entries = 0; - } - return; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_line.h b/usr/src/tools/ctf/dwarf/common/dwarf_line.h deleted file mode 100644 index 66d6062754..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_line.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - - Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#define DW_EXTENDED_OPCODE 0 - -/* - This is used as the starting value for an algorithm - to get the minimum difference between 2 values. - UINT_MAX is used as our approximation to infinity. -*/ -#define MAX_LINE_DIFF UINT_MAX - -/* This is for a sanity check on line - table extended opcodes. - It is entirely arbitrary, and 100 is surely too small if - someone was inserting strings in the opcode. */ -#define DW_LNE_LEN_MAX 100 - - -/* - This structure is used to build a list of all the - files that are used in the current compilation unit. - All of the fields execpt fi_next have meanings that - are obvious from section 6.2.4 of the Libdwarf Doc. -*/ -struct Dwarf_File_Entry_s { - /* Points to string naming the file. */ - Dwarf_Small *fi_file_name; - - /* - Index into the list of directories of the directory in which - this file exits. */ - Dwarf_Sword fi_dir_index; - - /* Time of last modification of the file. */ - Dwarf_Unsigned fi_time_last_mod; - - /* Length in bytes of the file. */ - Dwarf_Unsigned fi_file_length; - - /* Pointer for chaining file entries. */ - Dwarf_File_Entry fi_next; -}; - - -typedef struct Dwarf_Line_Context_s *Dwarf_Line_Context; - -/* - This structure provides the context in which the fields of - a Dwarf_Line structure are interpreted. They come from the - statement program prologue. **Updated by dwarf_srclines in - dwarf_line.c. -*/ -struct Dwarf_Line_Context_s { - /* - Points to a chain of entries providing info about source files - for the current set of Dwarf_Line structures. File number - 'li_file 1' is last on the list, the first list entry is the - file numbered lc_file_entry_count. The numbering of the file - names matches the dwarf2/3 line table specification file table - and DW_LNE_define_file numbering rules. */ - Dwarf_File_Entry lc_file_entries; - /* - Count of number of source files for this set of Dwarf_Line - structures. */ - Dwarf_Sword lc_file_entry_count; - /* - Points to the portion of .debug_line section that contains a - list of strings naming the included directories. */ - Dwarf_Small *lc_include_directories; - - /* Count of the number of included directories. */ - Dwarf_Sword lc_include_directories_count; - - /* Count of the number of lines for this cu. */ - Dwarf_Sword lc_line_count; - - /* Points to name of compilation directory. */ - Dwarf_Small *lc_compilation_directory; - - Dwarf_Debug lc_dbg; - - Dwarf_Half lc_version_number; /* DWARF2/3 version number, 2 - for DWARF2, 3 for DWARF3. */ -}; - - -/* - This structure defines a row of the line table. - All of the fields except li_offset have the exact - same meaning that is defined in Section 6.2.2 - of the Libdwarf Document. - - li_offset is used by _dwarf_addr_finder() which is called - by rqs(1), an sgi utility for 'moving' shared libraries - as if the static linker (ld) had linked the shared library - at the newly-specified address. Most libdwarf-using - apps will ignore li_offset and _dwarf_addr_finder(). - -*/ -struct Dwarf_Line_s { - Dwarf_Addr li_address; /* pc value of machine instr */ - union addr_or_line_s { - struct li_inner_s { - Dwarf_Sword li_file; /* int identifying src file */ - /* li_file is a number 1-N, indexing into a conceptual - source file table as described in dwarf2/3 spec line - table doc. (see Dwarf_File_Entry lc_file_entries; and - Dwarf_Sword lc_file_entry_count;) */ - - Dwarf_Sword li_line; /* source file line number. */ - Dwarf_Half li_column; /* source file column number */ - Dwarf_Small li_isa; - - /* To save space, use bit flags. */ - /* indicate start of stmt */ - unsigned char li_is_stmt:1; - - /* indicate start basic block */ - unsigned char li_basic_block:1; - - /* first post sequence instr */ - unsigned char li_end_sequence:1; - - unsigned char li_prologue_end:1; - unsigned char li_epilogue_begin:1; - } li_l_data; - Dwarf_Off li_offset; /* for rqs */ - } li_addr_line; - Dwarf_Line_Context li_context; /* assoc Dwarf_Line_Context_s */ -}; - - -int _dwarf_line_address_offsets(Dwarf_Debug dbg, - Dwarf_Die die, - Dwarf_Addr ** addrs, - Dwarf_Off ** offs, - Dwarf_Unsigned * returncount, - Dwarf_Error * err); -int _dwarf_internal_srclines(Dwarf_Die die, - Dwarf_Line ** linebuf, - Dwarf_Signed * count, - Dwarf_Bool doaddrs, - Dwarf_Bool dolines, Dwarf_Error * error); - - - -/* The LOP, WHAT_IS_OPCODE stuff is here so it can - be reused in 3 places. Seemed hard to keep - the 3 places the same without an inline func or - a macro. - - Handling the line section where the header and the - file being processed do not match (unusual, but - planned for in the design of .debug_line) - is too tricky to recode this several times and keep - it right. - - As it is the code starting up line-reading is duplicated - and that is just wrong to do. FIXME! -*/ -#define LOP_EXTENDED 1 -#define LOP_DISCARD 2 -#define LOP_STANDARD 3 -#define LOP_SPECIAL 4 - -#define WHAT_IS_OPCODE(type,opcode,base,opcode_length,line_ptr,highest_std) \ - if( (opcode) < (base) ) { \ - /* we know we must treat as a standard op \ - or a special case. \ - */ \ - if((opcode) == DW_EXTENDED_OPCODE) { \ - type = LOP_EXTENDED; \ - } else if( ((highest_std)+1) >= (base)) { \ - /* == Standard case: compile of \ - dwarf_line.c and object \ - have same standard op codes set. \ - \ - > Special case: compile of dwarf_line.c\ - has things in standard op codes list \ - in dwarf.h header not \ - in the object: handle this as a standard\ - op code in switch below. \ - The header special ops overlap the \ - object standard ops. \ - The new standard op codes will not \ - appear in the object. \ - */ \ - type = LOP_STANDARD; \ - } else { \ - /* These are standard opcodes in the object\ - ** that were not defined in the header \ - ** at the time dwarf_line.c \ - ** was compiled. Provides the ability of \ - ** out-of-date dwarf reader to read newer \ - ** line table data transparently. \ - */ \ - type = LOP_DISCARD; \ - } \ - \ - } else { \ - /* Is a special op code. \ - */ \ - type = LOP_SPECIAL; \ - } - -/* The following is from the dwarf definition of 'ubyte' - and is specifically mentioned in section 6.2.5.1, page 54 - of the Rev 2.0.0 dwarf specification. -*/ - -#define MAX_LINE_OP_CODE 255 - - -/* The following structs (Line_Table_File_Entry_s,Line_Table_Prefix_s) - and functions allow refactoring common code into a single - reader routine. -*/ -/* There can be zero of more of these needed for 1 line prologue. */ -struct Line_Table_File_Entry_s { - Dwarf_Small *lte_filename; - Dwarf_Unsigned lte_directory_index; - Dwarf_Unsigned lte_last_modification_time; - Dwarf_Unsigned lte_length_of_file; -}; - -/* Data picked up from the line table prologue for a single -CU. */ -struct Line_Table_Prefix_s { - - /* pf_total_length is the value of the length field for the line - table of this CU. So it does not count the length of itself (the - length value) for consistency with the say lenghts recorded in - DWARF2/3. */ - Dwarf_Unsigned pf_total_length; - - /* Length of the initial length field itself. */ - Dwarf_Half pf_length_field_length; - - /* The version is 2 for DWARF2, 3 for DWARF3 */ - Dwarf_Half pf_version; - - Dwarf_Unsigned pf_prologue_length; - Dwarf_Small pf_minimum_instruction_length; - - /* Start and end of this CU line area. pf_line_ptr_start + - pf_total_length + pf_length_field_length == pf_line_ptr_end. - Meaning pf_line_ptr_start is before the length info. */ - Dwarf_Small *pf_line_ptr_start; - Dwarf_Small *pf_line_ptr_end; - - /* Used to check that decoding of the line prologue is done right. */ - Dwarf_Small *pf_line_prologue_start; - - Dwarf_Small pf_default_is_stmt; - Dwarf_Sbyte pf_line_base; - Dwarf_Small pf_line_range; - - /* Highest std opcode (+1). */ - Dwarf_Small pf_opcode_base; - - /* pf_opcode_base -1 entries (each a count, normally the value of - each entry is 0 or 1). */ - Dwarf_Small *pf_opcode_length_table; - - Dwarf_Unsigned pf_include_directories_count; - /* Array of pointers to dir strings. pf_include_directories_count - entriesin the array. */ - Dwarf_Small **pf_include_directories; - - /* Count of entries in line_table_file_entries array. */ - Dwarf_Unsigned pf_files_count; - struct Line_Table_File_Entry_s *pf_line_table_file_entries; - - /* The number to treat as standard ops. This is a special - accomodation of gcc using the new standard opcodes but not - updating the version number. It's legal dwarf2, but much better - for the user to understand as dwarf3 when 'it looks ok'. */ - Dwarf_Bool pf_std_op_count; - -}; - -void dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf); -void dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf); - -int dwarf_read_line_table_prefix(Dwarf_Debug dbg, - Dwarf_Small * data_start, - Dwarf_Unsigned data_length, - Dwarf_Small ** updated_data_start_out, - struct Line_Table_Prefix_s *prefix_out, - /* The following 2 arguments are solely for warning users - * when there is a surprising 'gap' in the .debug_line info. */ - Dwarf_Small ** bogus_bytes_ptr, - Dwarf_Unsigned * bogus_bytes_count, - Dwarf_Error * err, - int * err_count_out); diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_line2.c b/usr/src/tools/ctf/dwarf/common/dwarf_line2.c deleted file mode 100644 index 634b848167..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_line2.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2008-2010 David Anderson, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - -/* This source file used for SGI-IRIX rqs processing. - Unused otherwise. -*/ - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_line.h" - -/* - Return DW_DLV_OK or, if error, - DW_DLV_ERROR. - - Thru pointers, return 2 arrays and a count - for rqs. -*/ -int -_dwarf_line_address_offsets(Dwarf_Debug dbg, - Dwarf_Die die, - Dwarf_Addr ** addrs, - Dwarf_Off ** offs, - Dwarf_Unsigned * returncount, - Dwarf_Error * err) -{ - Dwarf_Addr *laddrs; - Dwarf_Off *loffsets; - Dwarf_Signed lcount; - Dwarf_Signed i; - int res; - Dwarf_Line *linebuf; - - res = _dwarf_internal_srclines(die, &linebuf, &lcount, /* addrlist= - */ true, - /* linelist= */ false, err); - if (res != DW_DLV_OK) { - return res; - } - laddrs = (Dwarf_Addr *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, lcount); - if (laddrs == NULL) { - dwarf_srclines_dealloc(dbg, linebuf, lcount); - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - loffsets = (Dwarf_Off *) - _dwarf_get_alloc(dbg, DW_DLA_ADDR, lcount); - if (loffsets == NULL) { - dwarf_srclines_dealloc(dbg, linebuf, lcount); - /* We already allocated what laddrs points at, so we'e better - deallocate that space since we are not going to return the - pointer to the caller. */ - dwarf_dealloc(dbg, laddrs, DW_DLA_ADDR); - _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - for (i = 0; i < lcount; i++) { - laddrs[i] = linebuf[i]->li_address; - loffsets[i] = linebuf[i]->li_addr_line.li_offset; - } - dwarf_srclines_dealloc(dbg, linebuf, lcount); - *returncount = lcount; - *offs = loffsets; - *addrs = laddrs; - return DW_DLV_OK; -} - -/* - It's impossible for callers of dwarf_srclines() to get to and - free all the resources (in particular, the li_context and its - lc_file_entries). - So this function, new July 2005, does it. -*/ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_loc.c b/usr/src/tools/ctf/dwarf/common/dwarf_loc.c deleted file mode 100644 index f28b27b630..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_loc.c +++ /dev/null @@ -1,1073 +0,0 @@ -/* - - Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include "dwarf_loc.h" -#include <stdio.h> /* for debugging only. */ -#include <sys/types.h> - -/* - Given a Dwarf_Block that represents a location expression, - this function returns a pointer to a Dwarf_Locdesc struct - that has its ld_cents field set to the number of location - operators in the block, and its ld_s field pointing to a - contiguous block of Dwarf_Loc structs. However, the - ld_lopc and ld_hipc values are uninitialized. Returns - NULL on error. This function assumes that the length of - the block is greater than 0. Zero length location expressions - to represent variables that have been optimized away are - handled in the calling function. -*/ -static Dwarf_Locdesc * -_dwarf_get_locdesc(Dwarf_Debug dbg, - Dwarf_Block * loc_block, - Dwarf_Half address_size, - Dwarf_Addr lowpc, - Dwarf_Addr highpc, - Dwarf_Error * error) -{ - /* Size of the block containing the location expression. */ - Dwarf_Unsigned loc_len = 0; - - /* Sweeps the block containing the location expression. */ - Dwarf_Small *loc_ptr = 0; - - /* Current location operator. */ - Dwarf_Small atom = 0; - - /* Offset of current operator from start of block. */ - Dwarf_Unsigned offset = 0; - - /* Operands of current location operator. */ - Dwarf_Unsigned operand1, operand2; - - /* Used to chain the Dwarf_Loc_Chain_s structs. */ - Dwarf_Loc_Chain curr_loc = NULL; - Dwarf_Loc_Chain prev_loc = NULL; - Dwarf_Loc_Chain head_loc = NULL; - - /* Count of the number of location operators. */ - Dwarf_Unsigned op_count = 0; - - /* Contiguous block of Dwarf_Loc's for Dwarf_Locdesc. */ - Dwarf_Loc *block_loc = 0; - - /* Dwarf_Locdesc pointer to be returned. */ - Dwarf_Locdesc *locdesc = 0; - - Dwarf_Word leb128_length = 0; - Dwarf_Unsigned i = 0; - - /* ***** BEGIN CODE ***** */ - - loc_len = loc_block->bl_len; - loc_ptr = loc_block->bl_data; - - offset = 0; - op_count = 0; - while (offset < loc_len) { - - operand1 = 0; - operand2 = 0; - op_count++; - - atom = *(Dwarf_Small *) loc_ptr; - loc_ptr++; - offset++; - - curr_loc = - (Dwarf_Loc_Chain) _dwarf_get_alloc(dbg, DW_DLA_LOC_CHAIN, - 1); - if (curr_loc == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - curr_loc->lc_offset = offset; - curr_loc->lc_atom = atom; - switch (atom) { - - case DW_OP_reg0: - case DW_OP_reg1: - case DW_OP_reg2: - case DW_OP_reg3: - case DW_OP_reg4: - case DW_OP_reg5: - case DW_OP_reg6: - case DW_OP_reg7: - case DW_OP_reg8: - case DW_OP_reg9: - case DW_OP_reg10: - case DW_OP_reg11: - case DW_OP_reg12: - case DW_OP_reg13: - case DW_OP_reg14: - case DW_OP_reg15: - case DW_OP_reg16: - case DW_OP_reg17: - case DW_OP_reg18: - case DW_OP_reg19: - case DW_OP_reg20: - case DW_OP_reg21: - case DW_OP_reg22: - case DW_OP_reg23: - case DW_OP_reg24: - case DW_OP_reg25: - case DW_OP_reg26: - case DW_OP_reg27: - case DW_OP_reg28: - case DW_OP_reg29: - case DW_OP_reg30: - case DW_OP_reg31: - break; - - case DW_OP_regx: - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_lit0: - case DW_OP_lit1: - case DW_OP_lit2: - case DW_OP_lit3: - case DW_OP_lit4: - case DW_OP_lit5: - case DW_OP_lit6: - case DW_OP_lit7: - case DW_OP_lit8: - case DW_OP_lit9: - case DW_OP_lit10: - case DW_OP_lit11: - case DW_OP_lit12: - case DW_OP_lit13: - case DW_OP_lit14: - case DW_OP_lit15: - case DW_OP_lit16: - case DW_OP_lit17: - case DW_OP_lit18: - case DW_OP_lit19: - case DW_OP_lit20: - case DW_OP_lit21: - case DW_OP_lit22: - case DW_OP_lit23: - case DW_OP_lit24: - case DW_OP_lit25: - case DW_OP_lit26: - case DW_OP_lit27: - case DW_OP_lit28: - case DW_OP_lit29: - case DW_OP_lit30: - case DW_OP_lit31: - operand1 = atom - DW_OP_lit0; - break; - - case DW_OP_addr: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, - loc_ptr, address_size); - loc_ptr += address_size; - offset += address_size; - break; - - case DW_OP_const1u: - operand1 = *(Dwarf_Small *) loc_ptr; - loc_ptr = loc_ptr + 1; - offset = offset + 1; - break; - - case DW_OP_const1s: - operand1 = *(Dwarf_Sbyte *) loc_ptr; - SIGN_EXTEND(operand1,1); - loc_ptr = loc_ptr + 1; - offset = offset + 1; - break; - - case DW_OP_const2u: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2); - loc_ptr = loc_ptr + 2; - offset = offset + 2; - break; - - case DW_OP_const2s: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2); - SIGN_EXTEND(operand1,2); - loc_ptr = loc_ptr + 2; - offset = offset + 2; - break; - - case DW_OP_const4u: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4); - loc_ptr = loc_ptr + 4; - offset = offset + 4; - break; - - case DW_OP_const4s: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4); - SIGN_EXTEND(operand1,4); - loc_ptr = loc_ptr + 4; - offset = offset + 4; - break; - - case DW_OP_const8u: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 8); - loc_ptr = loc_ptr + 8; - offset = offset + 8; - break; - - case DW_OP_const8s: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 8); - loc_ptr = loc_ptr + 8; - offset = offset + 8; - break; - - case DW_OP_constu: - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_consts: - operand1 = _dwarf_decode_s_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_fbreg: - operand1 = _dwarf_decode_s_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_breg0: - case DW_OP_breg1: - case DW_OP_breg2: - case DW_OP_breg3: - case DW_OP_breg4: - case DW_OP_breg5: - case DW_OP_breg6: - case DW_OP_breg7: - case DW_OP_breg8: - case DW_OP_breg9: - case DW_OP_breg10: - case DW_OP_breg11: - case DW_OP_breg12: - case DW_OP_breg13: - case DW_OP_breg14: - case DW_OP_breg15: - case DW_OP_breg16: - case DW_OP_breg17: - case DW_OP_breg18: - case DW_OP_breg19: - case DW_OP_breg20: - case DW_OP_breg21: - case DW_OP_breg22: - case DW_OP_breg23: - case DW_OP_breg24: - case DW_OP_breg25: - case DW_OP_breg26: - case DW_OP_breg27: - case DW_OP_breg28: - case DW_OP_breg29: - case DW_OP_breg30: - case DW_OP_breg31: - operand1 = _dwarf_decode_s_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_bregx: - /* uleb reg num followed by sleb offset */ - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - - operand2 = _dwarf_decode_s_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_dup: - case DW_OP_drop: - break; - - case DW_OP_pick: - operand1 = *(Dwarf_Small *) loc_ptr; - loc_ptr = loc_ptr + 1; - offset = offset + 1; - break; - - case DW_OP_over: - case DW_OP_swap: - case DW_OP_rot: - case DW_OP_deref: - break; - - case DW_OP_deref_size: - operand1 = *(Dwarf_Small *) loc_ptr; - loc_ptr = loc_ptr + 1; - offset = offset + 1; - break; - - case DW_OP_xderef: - break; - - case DW_OP_xderef_size: - operand1 = *(Dwarf_Small *) loc_ptr; - loc_ptr = loc_ptr + 1; - offset = offset + 1; - break; - - case DW_OP_abs: - case DW_OP_and: - case DW_OP_div: - case DW_OP_minus: - case DW_OP_mod: - case DW_OP_mul: - case DW_OP_neg: - case DW_OP_not: - case DW_OP_or: - case DW_OP_plus: - break; - - case DW_OP_plus_uconst: - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_shl: - case DW_OP_shr: - case DW_OP_shra: - case DW_OP_xor: - break; - - case DW_OP_le: - case DW_OP_ge: - case DW_OP_eq: - case DW_OP_lt: - case DW_OP_gt: - case DW_OP_ne: - break; - - case DW_OP_skip: - case DW_OP_bra: - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2); - loc_ptr = loc_ptr + 2; - offset = offset + 2; - break; - - case DW_OP_piece: - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - - case DW_OP_nop: - break; - case DW_OP_push_object_address: /* DWARF3 */ - break; - case DW_OP_call2: /* DWARF3 */ - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2); - loc_ptr = loc_ptr + 2; - offset = offset + 2; - break; - - case DW_OP_call4: /* DWARF3 */ - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4); - loc_ptr = loc_ptr + 4; - offset = offset + 4; - break; - case DW_OP_call_ref: /* DWARF3 */ - READ_UNALIGNED(dbg, operand1, Dwarf_Unsigned, loc_ptr, - dbg->de_length_size); - loc_ptr = loc_ptr + dbg->de_length_size; - offset = offset + dbg->de_length_size; - break; - - case DW_OP_form_tls_address: /* DWARF3f */ - break; - case DW_OP_call_frame_cfa: /* DWARF3f */ - break; - case DW_OP_bit_piece: /* DWARF3f */ - /* uleb size in bits followed by uleb offset in bits */ - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - - operand2 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - break; - case DW_OP_implicit_value: /* DWARF4 */ - /* uleb length of value bytes followed by that - number of bytes of the value. */ - operand1 = _dwarf_decode_u_leb128(loc_ptr, &leb128_length); - loc_ptr = loc_ptr + leb128_length; - offset = offset + leb128_length; - - /* Second operand is block of 'operand1' bytes of stuff. */ - /* This using the second operand as a pointer - is quite ugly. */ - /* This gets an ugly compiler warning. Sorry. */ - operand2 = (Dwarf_Unsigned)(uintptr_t)loc_ptr; - offset = offset + operand1; - loc_ptr = loc_ptr + operand1; - break; - case DW_OP_stack_value: /* DWARF4 */ - break; - - - default: - _dwarf_error(dbg, error, DW_DLE_LOC_EXPR_BAD); - return (NULL); - } - - - curr_loc->lc_number = operand1; - curr_loc->lc_number2 = operand2; - - if (head_loc == NULL) - head_loc = prev_loc = curr_loc; - else { - prev_loc->lc_next = curr_loc; - prev_loc = curr_loc; - } - } - - block_loc = - (Dwarf_Loc *) _dwarf_get_alloc(dbg, DW_DLA_LOC_BLOCK, op_count); - if (block_loc == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - - curr_loc = head_loc; - for (i = 0; i < op_count; i++) { - (block_loc + i)->lr_atom = curr_loc->lc_atom; - (block_loc + i)->lr_number = curr_loc->lc_number; - (block_loc + i)->lr_number2 = curr_loc->lc_number2; - (block_loc + i)->lr_offset = curr_loc->lc_offset; - - prev_loc = curr_loc; - curr_loc = curr_loc->lc_next; - dwarf_dealloc(dbg, prev_loc, DW_DLA_LOC_CHAIN); - } - - locdesc = - (Dwarf_Locdesc *) _dwarf_get_alloc(dbg, DW_DLA_LOCDESC, 1); - if (locdesc == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - - locdesc->ld_cents = op_count; - locdesc->ld_s = block_loc; - locdesc->ld_from_loclist = loc_block->bl_from_loclist; - locdesc->ld_section_offset = loc_block->bl_section_offset; - locdesc->ld_lopc = lowpc; - locdesc->ld_hipc = highpc; - - return (locdesc); -} - -/* Using a loclist offset to get the in-memory - address of .debug_loc data to read, returns the loclist - 'header' info in return_block. -*/ - -#define MAX_ADDR ((address_size == 8)?0xffffffffffffffffULL:0xffffffff) - -static int -_dwarf_read_loc_section(Dwarf_Debug dbg, - Dwarf_Block * return_block, - Dwarf_Addr * lowpc, Dwarf_Addr * hipc, - Dwarf_Off sec_offset, - Dwarf_Half address_size, - Dwarf_Error * error) -{ - Dwarf_Small *beg = dbg->de_debug_loc.dss_data + sec_offset; - - Dwarf_Addr start_addr = 0; - Dwarf_Addr end_addr = 0; - Dwarf_Half exprblock_size = 0; - Dwarf_Unsigned exprblock_off = - 2 * address_size + sizeof(Dwarf_Half); - - if (sec_offset >= dbg->de_debug_loc.dss_size) { - /* We're at the end. No more present. */ - return DW_DLV_NO_ENTRY; - } - - /* If it goes past end, error */ - if (exprblock_off > dbg->de_debug_loc.dss_size) { - _dwarf_error(NULL, error, DW_DLE_DEBUG_LOC_SECTION_SHORT); - return DW_DLV_ERROR; - } - - READ_UNALIGNED(dbg, start_addr, Dwarf_Addr, beg, address_size); - READ_UNALIGNED(dbg, end_addr, Dwarf_Addr, - beg + address_size, address_size); - if (start_addr == 0 && end_addr == 0) { - /* If start_addr and end_addr are 0, it's the end and no - exprblock_size field follows. */ - exprblock_size = 0; - exprblock_off -= sizeof(Dwarf_Half); - } else if (start_addr == MAX_ADDR) { - /* end address is a base address, no exprblock_size field here - either */ - exprblock_size = 0; - exprblock_off -= sizeof(Dwarf_Half); - } else { - - READ_UNALIGNED(dbg, exprblock_size, Dwarf_Half, - beg + 2 * address_size, sizeof(Dwarf_Half)); - /* exprblock_size can be zero, means no expression */ - if ((exprblock_off + exprblock_size) > dbg->de_debug_loc.dss_size) { - _dwarf_error(NULL, error, DW_DLE_DEBUG_LOC_SECTION_SHORT); - return DW_DLV_ERROR; - } - } -#undef MAX_ADDR - *lowpc = start_addr; - *hipc = end_addr; - - return_block->bl_len = exprblock_size; - return_block->bl_from_loclist = 1; - return_block->bl_data = beg + exprblock_off; - return_block->bl_section_offset = - ((Dwarf_Small *) return_block->bl_data) - dbg->de_debug_loc.dss_data; - - return DW_DLV_OK; - -} -static int -_dwarf_get_loclist_count(Dwarf_Debug dbg, - Dwarf_Off loclist_offset, - Dwarf_Half address_size, - int *loclist_count, Dwarf_Error * error) -{ - int count = 0; - Dwarf_Off offset = loclist_offset; - - - for (;;) { - Dwarf_Block b; - Dwarf_Addr lowpc; - Dwarf_Addr highpc; - int res = _dwarf_read_loc_section(dbg, &b, - &lowpc, &highpc, - offset, address_size,error); - - if (res != DW_DLV_OK) { - return res; - } - offset = b.bl_len + b.bl_section_offset; - if (lowpc == 0 && highpc == 0) { - break; - } - count++; - } - *loclist_count = count; - return DW_DLV_OK; -} - -/* Helper routine to avoid code duplication. -*/ -static int -_dwarf_setup_loc(Dwarf_Attribute attr, - Dwarf_Debug * dbg_ret, - Dwarf_CU_Context *cucontext_ret, - Dwarf_Half * form_ret, Dwarf_Error * error) -{ - Dwarf_Debug dbg = 0; - Dwarf_Half form = 0; - int blkres = DW_DLV_ERROR; - - if (attr == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); - return (DW_DLV_ERROR); - } - if (attr->ar_cu_context == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); - return (DW_DLV_ERROR); - } - *cucontext_ret = attr->ar_cu_context; - - dbg = attr->ar_cu_context->cc_dbg; - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); - return (DW_DLV_ERROR); - } - *dbg_ret = dbg; - blkres = dwarf_whatform(attr, &form, error); - if (blkres != DW_DLV_OK) { - _dwarf_error(dbg, error, DW_DLE_LOC_EXPR_BAD); - return blkres; - } - *form_ret = form; - return DW_DLV_OK; -} - -/* Helper routine to avoid code duplication. -*/ -static int -_dwarf_get_loclist_header_start(Dwarf_Debug dbg, - Dwarf_Attribute attr, - Dwarf_Unsigned * loclist_offset, - Dwarf_Error * error) -{ - int blkres = dwarf_formudata(attr, loclist_offset, error); - if (blkres != DW_DLV_OK) { - return (blkres); - } - - if (!dbg->de_debug_loc.dss_data) { - int secload = _dwarf_load_section(dbg, &dbg->de_debug_loc,error); - if (secload != DW_DLV_OK) { - return secload; - } - } - return DW_DLV_OK; -} - -/* When llbuf (see dwarf_loclist_n) is partially set up - and an error is encountered, tear it down as it - won't be used. -*/ -static void -_dwarf_cleanup_llbuf(Dwarf_Debug dbg, Dwarf_Locdesc ** llbuf, int count) -{ - int i; - for (i = 0; i < count; ++i) { - dwarf_dealloc(dbg, llbuf[i]->ld_s, DW_DLA_LOC_BLOCK); - dwarf_dealloc(dbg, llbuf[i], DW_DLA_LOCDESC); - } - dwarf_dealloc(dbg, llbuf, DW_DLA_LIST); -} - -/* - Handles simple location entries and loclists. - Returns all the Locdesc's thru llbuf. - -*/ -int -dwarf_loclist_n(Dwarf_Attribute attr, - Dwarf_Locdesc *** llbuf_out, - Dwarf_Signed * listlen_out, Dwarf_Error * error) -{ - Dwarf_Debug dbg; - - /* - Dwarf_Attribute that describes the DW_AT_location in die, if - present. */ - Dwarf_Attribute loc_attr = attr; - - /* Dwarf_Block that describes a single location expression. */ - Dwarf_Block loc_block; - - /* A pointer to the current Dwarf_Locdesc read. */ - Dwarf_Locdesc *locdesc = 0; - - Dwarf_Half form = 0; - Dwarf_Addr lowpc = 0; - Dwarf_Addr highpc = 0; - Dwarf_Signed listlen = 0; - Dwarf_Locdesc **llbuf = 0; - Dwarf_CU_Context cucontext = 0; - unsigned address_size = 0; - - int blkres = DW_DLV_ERROR; - int setup_res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - setup_res = _dwarf_setup_loc(attr, &dbg,&cucontext, &form, error); - if (setup_res != DW_DLV_OK) { - return setup_res; - } - address_size = cucontext->cc_address_size; - /* If this is a form_block then it's a location expression. If it's - DW_FORM_data4 or DW_FORM_data8 it's a loclist offset */ - if (((cucontext->cc_version_stamp == CURRENT_VERSION_STAMP || - cucontext->cc_version_stamp == CURRENT_VERSION_STAMP3) && - (form == DW_FORM_data4 || form == DW_FORM_data8)) || - (cucontext->cc_version_stamp == CURRENT_VERSION_STAMP4 && - form == DW_FORM_sec_offset)) - { - - - /* A reference to .debug_loc, with an offset in .debug_loc of a - loclist */ - Dwarf_Unsigned loclist_offset = 0; - int off_res = DW_DLV_ERROR; - int count_res = DW_DLV_ERROR; - int loclist_count; - int lli; - - off_res = _dwarf_get_loclist_header_start(dbg, - attr, &loclist_offset, - error); - if (off_res != DW_DLV_OK) { - return off_res; - } - count_res = _dwarf_get_loclist_count(dbg, loclist_offset, - address_size, - &loclist_count, error); - listlen = loclist_count; - if (count_res != DW_DLV_OK) { - return count_res; - } - if (loclist_count == 0) { - return DW_DLV_NO_ENTRY; - } - - llbuf = (Dwarf_Locdesc **) - _dwarf_get_alloc(dbg, DW_DLA_LIST, loclist_count); - if (!llbuf) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - for (lli = 0; lli < loclist_count; ++lli) { - blkres = _dwarf_read_loc_section(dbg, &loc_block, - &lowpc, - &highpc, - loclist_offset, - address_size, - error); - if (blkres != DW_DLV_OK) { - _dwarf_cleanup_llbuf(dbg, llbuf, lli); - return (blkres); - } - locdesc = _dwarf_get_locdesc(dbg, &loc_block, - address_size, - lowpc, highpc, error); - if (locdesc == NULL) { - _dwarf_cleanup_llbuf(dbg, llbuf, lli); - /* low level error already set: let it be passed back */ - return (DW_DLV_ERROR); - } - llbuf[lli] = locdesc; - - /* Now get to next loclist entry offset. */ - loclist_offset = loc_block.bl_section_offset + - loc_block.bl_len; - } - - - } else { - Dwarf_Block *tblock = 0; - - blkres = dwarf_formblock(loc_attr, &tblock, error); - if (blkres != DW_DLV_OK) { - return (blkres); - } - loc_block = *tblock; - /* We copied tblock contents to the stack var, so can dealloc - tblock now. Avoids leaks. */ - dwarf_dealloc(dbg, tblock, DW_DLA_BLOCK); - listlen = 1; /* One by definition of a location entry. */ - lowpc = 0; /* HACK */ - highpc = (Dwarf_Unsigned) (-1LL); /* HACK */ - - /* An empty location description (block length 0) means the - code generator emitted no variable, the variable was not - generated, it was unused or perhaps never tested after being - set. Dwarf2, section 2.4.1 In other words, it is not an - error, and we don't test for block length 0 specially here. */ - locdesc = _dwarf_get_locdesc(dbg, &loc_block, - address_size, - lowpc, highpc, error); - if (locdesc == NULL) { - /* low level error already set: let it be passed back */ - return (DW_DLV_ERROR); - } - llbuf = (Dwarf_Locdesc **) - _dwarf_get_alloc(dbg, DW_DLA_LIST, listlen); - if (!llbuf) { - /* Free the locdesc we allocated but won't use. */ - dwarf_dealloc(dbg, locdesc, DW_DLA_LOCDESC); - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - llbuf[0] = locdesc; - } - - *llbuf_out = llbuf; - *listlen_out = listlen; - return (DW_DLV_OK); -} - - -/* - Handles only a location expression. - If called on a loclist, just returns one of those. - Cannot not handle a real loclist. - It returns the location expression as a loclist with - a single entry. - See dwarf_loclist_n() which handles any number - of location list entries. - - This is the original definition, and it simply - does not work for loclists. Kept for compatibility. -*/ -int -dwarf_loclist(Dwarf_Attribute attr, - Dwarf_Locdesc ** llbuf, - Dwarf_Signed * listlen, Dwarf_Error * error) -{ - Dwarf_Debug dbg; - - /* Dwarf_Attribute that describes the DW_AT_location in die, if - present. */ - Dwarf_Attribute loc_attr = attr; - - /* Dwarf_Block that describes a single location expression. */ - Dwarf_Block loc_block; - - /* A pointer to the current Dwarf_Locdesc read. */ - Dwarf_Locdesc *locdesc = 0; - - Dwarf_Half form = 0; - Dwarf_Addr lowpc = 0; - Dwarf_Addr highpc = 0; - Dwarf_CU_Context cucontext = 0; - unsigned address_size = 0; - - int blkres = DW_DLV_ERROR; - int setup_res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - setup_res = _dwarf_setup_loc(attr, &dbg, &cucontext, &form, error); - if (setup_res != DW_DLV_OK) { - return setup_res; - } - address_size = cucontext->cc_address_size; - /* If this is a form_block then it's a location expression. If it's - DW_FORM_data4 or DW_FORM_data8 it's a loclist offset */ - if (((cucontext->cc_version_stamp == CURRENT_VERSION_STAMP || - cucontext->cc_version_stamp == CURRENT_VERSION_STAMP3) && - (form == DW_FORM_data4 || form == DW_FORM_data8)) || - (cucontext->cc_version_stamp == CURRENT_VERSION_STAMP4 && - form == DW_FORM_sec_offset)) - { - - /* A reference to .debug_loc, with an offset in .debug_loc of a - loclist */ - Dwarf_Unsigned loclist_offset = 0; - int off_res = DW_DLV_ERROR; - - off_res = _dwarf_get_loclist_header_start(dbg, - attr, &loclist_offset, - error); - if (off_res != DW_DLV_OK) { - return off_res; - } - - /* With dwarf_loclist, just read a single entry */ - blkres = _dwarf_read_loc_section(dbg, &loc_block, - &lowpc, - &highpc, - loclist_offset, - address_size, - error); - if (blkres != DW_DLV_OK) { - return (blkres); - } - } else { - Dwarf_Block *tblock = 0; - - blkres = dwarf_formblock(loc_attr, &tblock, error); - if (blkres != DW_DLV_OK) { - return (blkres); - } - loc_block = *tblock; - /* We copied tblock contents to the stack var, so can dealloc - tblock now. Avoids leaks. */ - dwarf_dealloc(dbg, tblock, DW_DLA_BLOCK); - lowpc = 0; /* HACK */ - highpc = (Dwarf_Unsigned) (-1LL); /* HACK */ - } - - /* An empty location description (block length 0) means the code - generator emitted no variable, the variable was not generated, - it was unused or perhaps never tested after being set. Dwarf2, - section 2.4.1 In other words, it is not an error, and we don't - test for block length 0 specially here. - See *dwarf_loclist_n() which handles the general case, this case - handles only a single location expression. */ - locdesc = _dwarf_get_locdesc(dbg, &loc_block, - address_size, - lowpc, highpc, error); - if (locdesc == NULL) { - /* low level error already set: let it be passed back */ - return (DW_DLV_ERROR); - } - - *llbuf = locdesc; - *listlen = 1; - return (DW_DLV_OK); -} - - - -/* - Handles only a location expression. - It returns the location expression as a loclist with - a single entry. - - Usable to access dwarf expressions from any source, but - specifically from - DW_CFA_def_cfa_expression - DW_CFA_expression - DW_CFA_val_expression - - expression_in must point to a valid dwarf expression - set of bytes of length expression_length. Not - a DW_FORM_block*, just the expression bytes. - - If the address_size != de_pointer_size this will not work - right. FIXME. -*/ -int -dwarf_loclist_from_expr(Dwarf_Debug dbg, - Dwarf_Ptr expression_in, - Dwarf_Unsigned expression_length, - Dwarf_Locdesc ** llbuf, - Dwarf_Signed * listlen, Dwarf_Error * error) -{ - int res = 0; - Dwarf_Half addr_size = dbg->de_pointer_size; - res = dwarf_loclist_from_expr_a(dbg,expression_in, - expression_length, addr_size,llbuf,listlen,error); - return res; -} -/* New April 27 2009. Adding addr_size argument for the rare - * cases where an object has CUs with a different address_size. */ -int -dwarf_loclist_from_expr_a(Dwarf_Debug dbg, - Dwarf_Ptr expression_in, - Dwarf_Unsigned expression_length, - Dwarf_Half addr_size, - Dwarf_Locdesc ** llbuf, - Dwarf_Signed * listlen, Dwarf_Error * error) -{ - /* Dwarf_Block that describes a single location expression. */ - Dwarf_Block loc_block; - - /* A pointer to the current Dwarf_Locdesc read. */ - Dwarf_Locdesc *locdesc = 0; - Dwarf_Addr lowpc = 0; - Dwarf_Addr highpc = (Dwarf_Unsigned) (-1LL); - - memset(&loc_block,0,sizeof(loc_block)); - loc_block.bl_len = expression_length; - loc_block.bl_data = expression_in; - loc_block.bl_from_loclist = 0; /* Not from loclist. */ - loc_block.bl_section_offset = 0; /* Fake. Not meaningful. */ - - /* An empty location description (block length 0) means the code - generator emitted no variable, the variable was not generated, - it was unused or perhaps never tested after being set. Dwarf2, - section 2.4.1 In other words, it is not an error, and we don't - test for block length 0 specially here. */ - locdesc = _dwarf_get_locdesc(dbg, &loc_block, - addr_size,lowpc, highpc, error); - if (locdesc == NULL) { - /* low level error already set: let it be passed back */ - return (DW_DLV_ERROR); - } - - *llbuf = locdesc; - *listlen = 1; - return (DW_DLV_OK); -} - -/* Usable to read a single loclist or to read a block of them - or to read an entire section's loclists. - - It's broken because it's not safe to read a loclist entry - when we do not know the address size (in any object where - address size can vary by compilation unit). -*/ - - /*ARGSUSED*/ int -dwarf_get_loclist_entry(Dwarf_Debug dbg, - Dwarf_Unsigned offset, - Dwarf_Addr * hipc_offset, - Dwarf_Addr * lopc_offset, - Dwarf_Ptr * data, - Dwarf_Unsigned * entry_len, - Dwarf_Unsigned * next_entry, - Dwarf_Error * error) -{ - Dwarf_Block b; - Dwarf_Addr lowpc = 0; - Dwarf_Addr highpc = 0; - Dwarf_Half address_size = 0; - int res = DW_DLV_ERROR; - - if (!dbg->de_debug_loc.dss_data) { - int secload = _dwarf_load_section(dbg, &dbg->de_debug_loc,error); - if (secload != DW_DLV_OK) { - return secload; - } - } - - /* FIXME: address_size is not necessarily the same in every frame. */ - address_size = dbg->de_pointer_size; - res = _dwarf_read_loc_section(dbg, - &b, &lowpc, &highpc, offset, - address_size,error); - if (res != DW_DLV_OK) { - return res; - } - *hipc_offset = highpc; - *lopc_offset = lowpc; - *entry_len = b.bl_len; - *data = b.bl_data; - *next_entry = b.bl_len + b.bl_section_offset; - return DW_DLV_OK; -} - - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_loc.h b/usr/src/tools/ctf/dwarf/common/dwarf_loc.h deleted file mode 100644 index 685d199f29..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_loc.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - - Copyright (C) 2000, 2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -typedef struct Dwarf_Loc_Chain_s *Dwarf_Loc_Chain; - -struct Dwarf_Loc_Chain_s { - Dwarf_Small lc_atom; - Dwarf_Unsigned lc_number; - Dwarf_Unsigned lc_number2; - Dwarf_Unsigned lc_offset; - Dwarf_Loc_Chain lc_next; -}; diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_macro.c b/usr/src/tools/ctf/dwarf/common/dwarf_macro.c deleted file mode 100644 index e1ff976d8c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_macro.c +++ /dev/null @@ -1,467 +0,0 @@ -/* - - Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <limits.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif /* HAVE_STDLIB_H */ -#include "dwarf_macro.h" - - -#define LEFTPAREN '(' -#define RIGHTPAREN ')' -#define SPACE ' ' - -/* - Given the dwarf macro string, return a pointer to - the value. Returns pointer to 0 byte at end of string - if no value found (meaning the value is the empty string). - - Only understands well-formed dwarf macinfo strings. -*/ -char * -dwarf_find_macro_value_start(char *str) -{ - char *lcp; - int funclike = 0; - - for (lcp = str; *lcp; ++lcp) { - switch (*lcp) { - case LEFTPAREN: - funclike = 1; - break; - case RIGHTPAREN: - /* lcp+1 must be a space, and following char is the value */ - return lcp + 2; - case SPACE: - /* we allow extraneous spaces inside macro parameter ** - list, just in case... This is not really needed. */ - if (!funclike) { - return lcp + 1; - } - break; - } - } - /* never found value: returns pointer to the 0 byte at end of - string */ - return lcp; - -} - - -/* - Try to keep fileindex correct in every Macro_Details - record by tracking file starts and ends. - Uses high water mark: space reused, not freed. - Presumption is that this makes sense for most uses. - STARTERMAX is set so that the array need not be expanded for - most files: it is the initial include file depth. -*/ -struct macro_stack_s { - Dwarf_Signed *st_base; - long max; - long next_to_use; - int was_fault; -}; - -static void _dwarf_reset_index_macro_stack(struct macro_stack_s *ms); -static void -free_macro_stack(Dwarf_Debug dbg, struct macro_stack_s *ms) -{ - dwarf_dealloc(dbg,ms->st_base,DW_DLA_STRING); - _dwarf_reset_index_macro_stack(ms); -} - -#define STARTERMAX 10 -static void -_dwarf_reset_index_macro_stack(struct macro_stack_s *ms) -{ - ms->st_base = 0; - ms->max = 0; - ms->next_to_use = 0; - ms->was_fault = 0; -} -static int -_dwarf_macro_stack_push_index(Dwarf_Debug dbg, Dwarf_Signed indx, - struct macro_stack_s *ms) -{ - Dwarf_Signed *newbase; - - if (ms->next_to_use >= ms->max) { - long new_size; - - if (ms->max == 0) { - ms->max = STARTERMAX; - } - new_size = ms->max * 2; - newbase = - _dwarf_get_alloc(dbg, DW_DLA_STRING, - new_size * sizeof(Dwarf_Signed)); - if (newbase == 0) { - /* just leave the old array in place */ - ms->was_fault = 1; - return DW_DLV_ERROR; - } - if(ms->st_base) { - memcpy(newbase, ms->st_base, - ms->next_to_use * sizeof(Dwarf_Signed)); - dwarf_dealloc(dbg, ms->st_base, DW_DLA_STRING); - } - ms->st_base = newbase; - ms->max = new_size; - } - ms->st_base[ms->next_to_use] = indx; - ++ms->next_to_use; - return DW_DLV_OK; -} - -static Dwarf_Signed -_dwarf_macro_stack_pop_index(struct macro_stack_s *ms) -{ - if (ms->was_fault) { - return -1; - } - if (ms->next_to_use > 0) { - ms->next_to_use--; - return (ms->st_base[ms->next_to_use]); - } else { - ms->was_fault = 1; - } - return -1; -} - -/* starting at macro_offset in .debug_macinfo, - if maximum_count is 0, treat as if it is infinite. - get macro data up thru - maximum_count entries or the end of a compilation - unit's entries (whichever comes first). -*/ - -int -dwarf_get_macro_details(Dwarf_Debug dbg, - Dwarf_Off macro_offset, - Dwarf_Unsigned maximum_count, - Dwarf_Signed * entry_count, - Dwarf_Macro_Details ** details, - Dwarf_Error * error) -{ - Dwarf_Small *macro_base = 0; - Dwarf_Small *pnext = 0; - Dwarf_Unsigned endloc = 0; - unsigned char uc = 0; - unsigned long depth = 0; - /* By section 6.3.2 Dwarf3 draft 8/9, - the base file should appear as - DW_MACINFO_start_file. See - http://gcc.gnu.org/ml/gcc-bugs/2005-02/msg03442.html - on "[Bug debug/20253] New: [3.4/4.0 regression]: - Macro debug info broken due to lexer change" for how - gcc is broken in some versions. We no longer use - depth as a stopping point, it's not needed as a - stopping point anyway. */ - int res = 0; - /* count space used by strings */ - unsigned long str_space = 0; - int done = 0; - unsigned long space_needed = 0; - unsigned long string_offset = 0; - Dwarf_Small *return_data = 0; - Dwarf_Small *pdata = 0; - unsigned long final_count = 0; - Dwarf_Signed fileindex = -1; - Dwarf_Small *latest_str_loc = 0; - struct macro_stack_s msdata; - - unsigned long count = 0; - unsigned long max_count = (unsigned long) maximum_count; - - _dwarf_reset_index_macro_stack(&msdata); - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - free_macro_stack(dbg,&msdata); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_macinfo,error); - if (res != DW_DLV_OK) { - free_macro_stack(dbg,&msdata); - return res; - } - - macro_base = dbg->de_debug_macinfo.dss_data; - if (macro_base == NULL) { - free_macro_stack(dbg,&msdata); - return (DW_DLV_NO_ENTRY); - } - if (macro_offset >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - return (DW_DLV_NO_ENTRY); - } - - pnext = macro_base + macro_offset; - if (maximum_count == 0) { - max_count = ULONG_MAX; - } - - - /* how many entries and how much space will they take? */ - - endloc = (pnext - macro_base); - if (endloc >= dbg->de_debug_macinfo.dss_size) { - if (endloc == dbg->de_debug_macinfo.dss_size) { - /* normal: found last entry */ - free_macro_stack(dbg,&msdata); - return DW_DLV_NO_ENTRY; - } - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD); - free_macro_stack(dbg,&msdata); - return (DW_DLV_ERROR); - } - for (count = 0; !done && count < max_count; ++count) { - unsigned long slen; - Dwarf_Word len; - - uc = *pnext; - ++pnext; /* get past the type code */ - switch (uc) { - case DW_MACINFO_define: - case DW_MACINFO_undef: - /* line, string */ - case DW_MACINFO_vendor_ext: - /* number, string */ - (void) _dwarf_decode_u_leb128(pnext, &len); - - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - slen = strlen((char *) pnext) + 1; - pnext += slen; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - str_space += slen; - break; - case DW_MACINFO_start_file: - /* line, file index */ - (void) _dwarf_decode_u_leb128(pnext, &len); - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - (void) _dwarf_decode_u_leb128(pnext, &len); - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - ++depth; - break; - - case DW_MACINFO_end_file: - if (--depth == 0) { - /* done = 1; no, do not stop here, at least one gcc had - the wrong depth settings in the gcc 3.4 timeframe. */ - } - break; /* no string or number here */ - case 0: - /* end of cu's entries */ - done = 1; - break; - default: - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - /* bogus macinfo! */ - } - - endloc = (pnext - macro_base); - if (endloc == dbg->de_debug_macinfo.dss_size) { - done = 1; - } else if (endloc > dbg->de_debug_macinfo.dss_size) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD); - free_macro_stack(dbg,&msdata); - return (DW_DLV_ERROR); - } - } - if (count == 0) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INTERNAL_ERR); - return (DW_DLV_ERROR); - } - - /* we have 'count' array entries to allocate and str_space bytes of - string space to provide for. */ - - string_offset = count * sizeof(Dwarf_Macro_Details); - - /* extra 2 not really needed */ - space_needed = string_offset + str_space + 2; - return_data = pdata = - _dwarf_get_alloc(dbg, DW_DLA_STRING, space_needed); - latest_str_loc = pdata + string_offset; - if (pdata == 0) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_MALLOC_SPACE); - return (DW_DLV_ERROR); - } - pnext = macro_base + macro_offset; - - done = 0; - - /* A series ends with a type code of 0. */ - - for (final_count = 0; !done && final_count < count; ++final_count) { - unsigned long slen; - Dwarf_Word len; - Dwarf_Unsigned v1; - Dwarf_Macro_Details *pdmd = (Dwarf_Macro_Details *) (pdata + - (final_count * sizeof (Dwarf_Macro_Details))); - - endloc = (pnext - macro_base); - if (endloc > dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_LENGTH_BAD); - return (DW_DLV_ERROR); - } - uc = *pnext; - pdmd->dmd_offset = (pnext - macro_base); - pdmd->dmd_type = uc; - pdmd->dmd_fileindex = fileindex; - pdmd->dmd_lineno = 0; - pdmd->dmd_macro = 0; - ++pnext; /* get past the type code */ - switch (uc) { - case DW_MACINFO_define: - case DW_MACINFO_undef: - /* line, string */ - case DW_MACINFO_vendor_ext: - /* number, string */ - v1 = _dwarf_decode_u_leb128(pnext, &len); - pdmd->dmd_lineno = v1; - - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - dwarf_dealloc(dbg, return_data, DW_DLA_STRING); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - slen = strlen((char *) pnext) + 1; - strcpy((char *) latest_str_loc, (char *) pnext); - pdmd->dmd_macro = (char *) latest_str_loc; - latest_str_loc += slen; - pnext += slen; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - dwarf_dealloc(dbg, return_data, DW_DLA_STRING); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - break; - case DW_MACINFO_start_file: - /* Line, file index */ - v1 = _dwarf_decode_u_leb128(pnext, &len); - pdmd->dmd_lineno = v1; - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - dwarf_dealloc(dbg, return_data, DW_DLA_STRING); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - v1 = _dwarf_decode_u_leb128(pnext, &len); - pdmd->dmd_fileindex = v1; - (void) _dwarf_macro_stack_push_index(dbg, fileindex, - &msdata); - /* We ignore the error, we just let fileindex ** be -1 when - we pop this one. */ - fileindex = v1; - pnext += len; - if (((pnext - macro_base)) >= dbg->de_debug_macinfo.dss_size) { - free_macro_stack(dbg,&msdata); - dwarf_dealloc(dbg, return_data, DW_DLA_STRING); - _dwarf_error(dbg, error, - DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - break; - - case DW_MACINFO_end_file: - fileindex = _dwarf_macro_stack_pop_index(&msdata); - break; /* no string or number here */ - case 0: - /* Type code of 0 means the end of cu's entries. */ - done = 1; - break; - default: - /* Bogus macinfo! */ - dwarf_dealloc(dbg, return_data, DW_DLA_STRING); - free_macro_stack(dbg,&msdata); - _dwarf_error(dbg, error, DW_DLE_DEBUG_MACRO_INCONSISTENT); - return (DW_DLV_ERROR); - } - } - *entry_count = count; - *details = (Dwarf_Macro_Details *) return_data; - free_macro_stack(dbg,&msdata); - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_macro.h b/usr/src/tools/ctf/dwarf/common/dwarf_macro.h deleted file mode 100644 index 31ea2e6e67..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_macro.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - - Copyright (C) 2000, 2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -/* - - - dwarf_macro.h - - $Revision: 1.4 $ $Date: 2004/10/28 22:19:14 $ - -*/ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_names.c b/usr/src/tools/ctf/dwarf/common/dwarf_names.c deleted file mode 100644 index 417e025690..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_names.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated routines, do not edit. */ -/* Generated on May 22 2011 03:05:33 */ - -/* BEGIN FILE */ - -#include "dwarf.h" - -#include "libdwarf.h" - -/* ARGSUSED */ -int -dwarf_get_TAG_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_TAG_array_type: - *s_out = "DW_TAG_array_type"; - return DW_DLV_OK; - case DW_TAG_class_type: - *s_out = "DW_TAG_class_type"; - return DW_DLV_OK; - case DW_TAG_entry_point: - *s_out = "DW_TAG_entry_point"; - return DW_DLV_OK; - case DW_TAG_enumeration_type: - *s_out = "DW_TAG_enumeration_type"; - return DW_DLV_OK; - case DW_TAG_formal_parameter: - *s_out = "DW_TAG_formal_parameter"; - return DW_DLV_OK; - case DW_TAG_imported_declaration: - *s_out = "DW_TAG_imported_declaration"; - return DW_DLV_OK; - case DW_TAG_label: - *s_out = "DW_TAG_label"; - return DW_DLV_OK; - case DW_TAG_lexical_block: - *s_out = "DW_TAG_lexical_block"; - return DW_DLV_OK; - case DW_TAG_member: - *s_out = "DW_TAG_member"; - return DW_DLV_OK; - case DW_TAG_pointer_type: - *s_out = "DW_TAG_pointer_type"; - return DW_DLV_OK; - case DW_TAG_reference_type: - *s_out = "DW_TAG_reference_type"; - return DW_DLV_OK; - case DW_TAG_compile_unit: - *s_out = "DW_TAG_compile_unit"; - return DW_DLV_OK; - case DW_TAG_string_type: - *s_out = "DW_TAG_string_type"; - return DW_DLV_OK; - case DW_TAG_structure_type: - *s_out = "DW_TAG_structure_type"; - return DW_DLV_OK; - case DW_TAG_subroutine_type: - *s_out = "DW_TAG_subroutine_type"; - return DW_DLV_OK; - case DW_TAG_typedef: - *s_out = "DW_TAG_typedef"; - return DW_DLV_OK; - case DW_TAG_union_type: - *s_out = "DW_TAG_union_type"; - return DW_DLV_OK; - case DW_TAG_unspecified_parameters: - *s_out = "DW_TAG_unspecified_parameters"; - return DW_DLV_OK; - case DW_TAG_variant: - *s_out = "DW_TAG_variant"; - return DW_DLV_OK; - case DW_TAG_common_block: - *s_out = "DW_TAG_common_block"; - return DW_DLV_OK; - case DW_TAG_common_inclusion: - *s_out = "DW_TAG_common_inclusion"; - return DW_DLV_OK; - case DW_TAG_inheritance: - *s_out = "DW_TAG_inheritance"; - return DW_DLV_OK; - case DW_TAG_inlined_subroutine: - *s_out = "DW_TAG_inlined_subroutine"; - return DW_DLV_OK; - case DW_TAG_module: - *s_out = "DW_TAG_module"; - return DW_DLV_OK; - case DW_TAG_ptr_to_member_type: - *s_out = "DW_TAG_ptr_to_member_type"; - return DW_DLV_OK; - case DW_TAG_set_type: - *s_out = "DW_TAG_set_type"; - return DW_DLV_OK; - case DW_TAG_subrange_type: - *s_out = "DW_TAG_subrange_type"; - return DW_DLV_OK; - case DW_TAG_with_stmt: - *s_out = "DW_TAG_with_stmt"; - return DW_DLV_OK; - case DW_TAG_access_declaration: - *s_out = "DW_TAG_access_declaration"; - return DW_DLV_OK; - case DW_TAG_base_type: - *s_out = "DW_TAG_base_type"; - return DW_DLV_OK; - case DW_TAG_catch_block: - *s_out = "DW_TAG_catch_block"; - return DW_DLV_OK; - case DW_TAG_const_type: - *s_out = "DW_TAG_const_type"; - return DW_DLV_OK; - case DW_TAG_constant: - *s_out = "DW_TAG_constant"; - return DW_DLV_OK; - case DW_TAG_enumerator: - *s_out = "DW_TAG_enumerator"; - return DW_DLV_OK; - case DW_TAG_file_type: - *s_out = "DW_TAG_file_type"; - return DW_DLV_OK; - case DW_TAG_friend: - *s_out = "DW_TAG_friend"; - return DW_DLV_OK; - case DW_TAG_namelist: - *s_out = "DW_TAG_namelist"; - return DW_DLV_OK; - case DW_TAG_namelist_item: - *s_out = "DW_TAG_namelist_item"; - return DW_DLV_OK; - case DW_TAG_packed_type: - *s_out = "DW_TAG_packed_type"; - return DW_DLV_OK; - case DW_TAG_subprogram: - *s_out = "DW_TAG_subprogram"; - return DW_DLV_OK; - case DW_TAG_template_type_parameter: - *s_out = "DW_TAG_template_type_parameter"; - return DW_DLV_OK; - case DW_TAG_template_value_parameter: - *s_out = "DW_TAG_template_value_parameter"; - return DW_DLV_OK; - case DW_TAG_thrown_type: - *s_out = "DW_TAG_thrown_type"; - return DW_DLV_OK; - case DW_TAG_try_block: - *s_out = "DW_TAG_try_block"; - return DW_DLV_OK; - case DW_TAG_variant_part: - *s_out = "DW_TAG_variant_part"; - return DW_DLV_OK; - case DW_TAG_variable: - *s_out = "DW_TAG_variable"; - return DW_DLV_OK; - case DW_TAG_volatile_type: - *s_out = "DW_TAG_volatile_type"; - return DW_DLV_OK; - case DW_TAG_dwarf_procedure: - *s_out = "DW_TAG_dwarf_procedure"; - return DW_DLV_OK; - case DW_TAG_restrict_type: - *s_out = "DW_TAG_restrict_type"; - return DW_DLV_OK; - case DW_TAG_interface_type: - *s_out = "DW_TAG_interface_type"; - return DW_DLV_OK; - case DW_TAG_namespace: - *s_out = "DW_TAG_namespace"; - return DW_DLV_OK; - case DW_TAG_imported_module: - *s_out = "DW_TAG_imported_module"; - return DW_DLV_OK; - case DW_TAG_unspecified_type: - *s_out = "DW_TAG_unspecified_type"; - return DW_DLV_OK; - case DW_TAG_partial_unit: - *s_out = "DW_TAG_partial_unit"; - return DW_DLV_OK; - case DW_TAG_imported_unit: - *s_out = "DW_TAG_imported_unit"; - return DW_DLV_OK; - case DW_TAG_mutable_type: - *s_out = "DW_TAG_mutable_type"; - return DW_DLV_OK; - case DW_TAG_condition: - *s_out = "DW_TAG_condition"; - return DW_DLV_OK; - case DW_TAG_shared_type: - *s_out = "DW_TAG_shared_type"; - return DW_DLV_OK; - case DW_TAG_type_unit: - *s_out = "DW_TAG_type_unit"; - return DW_DLV_OK; - case DW_TAG_rvalue_reference_type: - *s_out = "DW_TAG_rvalue_reference_type"; - return DW_DLV_OK; - case DW_TAG_template_alias: - *s_out = "DW_TAG_template_alias"; - return DW_DLV_OK; - case DW_TAG_lo_user: - *s_out = "DW_TAG_lo_user"; - return DW_DLV_OK; - case DW_TAG_MIPS_loop: - *s_out = "DW_TAG_MIPS_loop"; - return DW_DLV_OK; - case DW_TAG_HP_array_descriptor: - *s_out = "DW_TAG_HP_array_descriptor"; - return DW_DLV_OK; - case DW_TAG_format_label: - *s_out = "DW_TAG_format_label"; - return DW_DLV_OK; - case DW_TAG_function_template: - *s_out = "DW_TAG_function_template"; - return DW_DLV_OK; - case DW_TAG_class_template: - *s_out = "DW_TAG_class_template"; - return DW_DLV_OK; - case DW_TAG_GNU_BINCL: - *s_out = "DW_TAG_GNU_BINCL"; - return DW_DLV_OK; - case DW_TAG_GNU_EINCL: - *s_out = "DW_TAG_GNU_EINCL"; - return DW_DLV_OK; - case DW_TAG_GNU_template_template_parameter: - *s_out = "DW_TAG_GNU_template_template_parameter"; - return DW_DLV_OK; - case DW_TAG_GNU_template_parameter_pack: - *s_out = "DW_TAG_GNU_template_parameter_pack"; - return DW_DLV_OK; - case DW_TAG_GNU_formal_parameter_pack: - *s_out = "DW_TAG_GNU_formal_parameter_pack"; - return DW_DLV_OK; - case DW_TAG_SUN_function_template: - *s_out = "DW_TAG_SUN_function_template"; - return DW_DLV_OK; - case DW_TAG_SUN_class_template: - *s_out = "DW_TAG_SUN_class_template"; - return DW_DLV_OK; - case DW_TAG_SUN_struct_template: - *s_out = "DW_TAG_SUN_struct_template"; - return DW_DLV_OK; - case DW_TAG_SUN_union_template: - *s_out = "DW_TAG_SUN_union_template"; - return DW_DLV_OK; - case DW_TAG_SUN_indirect_inheritance: - *s_out = "DW_TAG_SUN_indirect_inheritance"; - return DW_DLV_OK; - case DW_TAG_SUN_codeflags: - *s_out = "DW_TAG_SUN_codeflags"; - return DW_DLV_OK; - case DW_TAG_SUN_memop_info: - *s_out = "DW_TAG_SUN_memop_info"; - return DW_DLV_OK; - case DW_TAG_SUN_omp_child_func: - *s_out = "DW_TAG_SUN_omp_child_func"; - return DW_DLV_OK; - case DW_TAG_SUN_rtti_descriptor: - *s_out = "DW_TAG_SUN_rtti_descriptor"; - return DW_DLV_OK; - case DW_TAG_SUN_dtor_info: - *s_out = "DW_TAG_SUN_dtor_info"; - return DW_DLV_OK; - case DW_TAG_SUN_dtor: - *s_out = "DW_TAG_SUN_dtor"; - return DW_DLV_OK; - case DW_TAG_SUN_f90_interface: - *s_out = "DW_TAG_SUN_f90_interface"; - return DW_DLV_OK; - case DW_TAG_SUN_fortran_vax_structure: - *s_out = "DW_TAG_SUN_fortran_vax_structure"; - return DW_DLV_OK; - case DW_TAG_SUN_hi: - *s_out = "DW_TAG_SUN_hi"; - return DW_DLV_OK; - case DW_TAG_ALTIUM_circ_type: - *s_out = "DW_TAG_ALTIUM_circ_type"; - return DW_DLV_OK; - case DW_TAG_ALTIUM_mwa_circ_type: - *s_out = "DW_TAG_ALTIUM_mwa_circ_type"; - return DW_DLV_OK; - case DW_TAG_ALTIUM_rev_carry_type: - *s_out = "DW_TAG_ALTIUM_rev_carry_type"; - return DW_DLV_OK; - case DW_TAG_ALTIUM_rom: - *s_out = "DW_TAG_ALTIUM_rom"; - return DW_DLV_OK; - case DW_TAG_upc_shared_type: - *s_out = "DW_TAG_upc_shared_type"; - return DW_DLV_OK; - case DW_TAG_upc_strict_type: - *s_out = "DW_TAG_upc_strict_type"; - return DW_DLV_OK; - case DW_TAG_upc_relaxed_type: - *s_out = "DW_TAG_upc_relaxed_type"; - return DW_DLV_OK; - case DW_TAG_PGI_kanji_type: - *s_out = "DW_TAG_PGI_kanji_type"; - return DW_DLV_OK; - case DW_TAG_PGI_interface_block: - *s_out = "DW_TAG_PGI_interface_block"; - return DW_DLV_OK; - case DW_TAG_hi_user: - *s_out = "DW_TAG_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_children_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_children_no: - *s_out = "DW_children_no"; - return DW_DLV_OK; - case DW_children_yes: - *s_out = "DW_children_yes"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_FORM_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_FORM_addr: - *s_out = "DW_FORM_addr"; - return DW_DLV_OK; - case DW_FORM_block2: - *s_out = "DW_FORM_block2"; - return DW_DLV_OK; - case DW_FORM_block4: - *s_out = "DW_FORM_block4"; - return DW_DLV_OK; - case DW_FORM_data2: - *s_out = "DW_FORM_data2"; - return DW_DLV_OK; - case DW_FORM_data4: - *s_out = "DW_FORM_data4"; - return DW_DLV_OK; - case DW_FORM_data8: - *s_out = "DW_FORM_data8"; - return DW_DLV_OK; - case DW_FORM_string: - *s_out = "DW_FORM_string"; - return DW_DLV_OK; - case DW_FORM_block: - *s_out = "DW_FORM_block"; - return DW_DLV_OK; - case DW_FORM_block1: - *s_out = "DW_FORM_block1"; - return DW_DLV_OK; - case DW_FORM_data1: - *s_out = "DW_FORM_data1"; - return DW_DLV_OK; - case DW_FORM_flag: - *s_out = "DW_FORM_flag"; - return DW_DLV_OK; - case DW_FORM_sdata: - *s_out = "DW_FORM_sdata"; - return DW_DLV_OK; - case DW_FORM_strp: - *s_out = "DW_FORM_strp"; - return DW_DLV_OK; - case DW_FORM_udata: - *s_out = "DW_FORM_udata"; - return DW_DLV_OK; - case DW_FORM_ref_addr: - *s_out = "DW_FORM_ref_addr"; - return DW_DLV_OK; - case DW_FORM_ref1: - *s_out = "DW_FORM_ref1"; - return DW_DLV_OK; - case DW_FORM_ref2: - *s_out = "DW_FORM_ref2"; - return DW_DLV_OK; - case DW_FORM_ref4: - *s_out = "DW_FORM_ref4"; - return DW_DLV_OK; - case DW_FORM_ref8: - *s_out = "DW_FORM_ref8"; - return DW_DLV_OK; - case DW_FORM_ref_udata: - *s_out = "DW_FORM_ref_udata"; - return DW_DLV_OK; - case DW_FORM_indirect: - *s_out = "DW_FORM_indirect"; - return DW_DLV_OK; - case DW_FORM_sec_offset: - *s_out = "DW_FORM_sec_offset"; - return DW_DLV_OK; - case DW_FORM_exprloc: - *s_out = "DW_FORM_exprloc"; - return DW_DLV_OK; - case DW_FORM_flag_present: - *s_out = "DW_FORM_flag_present"; - return DW_DLV_OK; - case DW_FORM_ref_sig8: - *s_out = "DW_FORM_ref_sig8"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_AT_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_AT_sibling: - *s_out = "DW_AT_sibling"; - return DW_DLV_OK; - case DW_AT_location: - *s_out = "DW_AT_location"; - return DW_DLV_OK; - case DW_AT_name: - *s_out = "DW_AT_name"; - return DW_DLV_OK; - case DW_AT_ordering: - *s_out = "DW_AT_ordering"; - return DW_DLV_OK; - case DW_AT_subscr_data: - *s_out = "DW_AT_subscr_data"; - return DW_DLV_OK; - case DW_AT_byte_size: - *s_out = "DW_AT_byte_size"; - return DW_DLV_OK; - case DW_AT_bit_offset: - *s_out = "DW_AT_bit_offset"; - return DW_DLV_OK; - case DW_AT_bit_size: - *s_out = "DW_AT_bit_size"; - return DW_DLV_OK; - case DW_AT_element_list: - *s_out = "DW_AT_element_list"; - return DW_DLV_OK; - case DW_AT_stmt_list: - *s_out = "DW_AT_stmt_list"; - return DW_DLV_OK; - case DW_AT_low_pc: - *s_out = "DW_AT_low_pc"; - return DW_DLV_OK; - case DW_AT_high_pc: - *s_out = "DW_AT_high_pc"; - return DW_DLV_OK; - case DW_AT_language: - *s_out = "DW_AT_language"; - return DW_DLV_OK; - case DW_AT_member: - *s_out = "DW_AT_member"; - return DW_DLV_OK; - case DW_AT_discr: - *s_out = "DW_AT_discr"; - return DW_DLV_OK; - case DW_AT_discr_value: - *s_out = "DW_AT_discr_value"; - return DW_DLV_OK; - case DW_AT_visibility: - *s_out = "DW_AT_visibility"; - return DW_DLV_OK; - case DW_AT_import: - *s_out = "DW_AT_import"; - return DW_DLV_OK; - case DW_AT_string_length: - *s_out = "DW_AT_string_length"; - return DW_DLV_OK; - case DW_AT_common_reference: - *s_out = "DW_AT_common_reference"; - return DW_DLV_OK; - case DW_AT_comp_dir: - *s_out = "DW_AT_comp_dir"; - return DW_DLV_OK; - case DW_AT_const_value: - *s_out = "DW_AT_const_value"; - return DW_DLV_OK; - case DW_AT_containing_type: - *s_out = "DW_AT_containing_type"; - return DW_DLV_OK; - case DW_AT_default_value: - *s_out = "DW_AT_default_value"; - return DW_DLV_OK; - case DW_AT_inline: - *s_out = "DW_AT_inline"; - return DW_DLV_OK; - case DW_AT_is_optional: - *s_out = "DW_AT_is_optional"; - return DW_DLV_OK; - case DW_AT_lower_bound: - *s_out = "DW_AT_lower_bound"; - return DW_DLV_OK; - case DW_AT_producer: - *s_out = "DW_AT_producer"; - return DW_DLV_OK; - case DW_AT_prototyped: - *s_out = "DW_AT_prototyped"; - return DW_DLV_OK; - case DW_AT_return_addr: - *s_out = "DW_AT_return_addr"; - return DW_DLV_OK; - case DW_AT_start_scope: - *s_out = "DW_AT_start_scope"; - return DW_DLV_OK; - case DW_AT_bit_stride: - *s_out = "DW_AT_bit_stride"; - return DW_DLV_OK; - case DW_AT_upper_bound: - *s_out = "DW_AT_upper_bound"; - return DW_DLV_OK; - case DW_AT_abstract_origin: - *s_out = "DW_AT_abstract_origin"; - return DW_DLV_OK; - case DW_AT_accessibility: - *s_out = "DW_AT_accessibility"; - return DW_DLV_OK; - case DW_AT_address_class: - *s_out = "DW_AT_address_class"; - return DW_DLV_OK; - case DW_AT_artificial: - *s_out = "DW_AT_artificial"; - return DW_DLV_OK; - case DW_AT_base_types: - *s_out = "DW_AT_base_types"; - return DW_DLV_OK; - case DW_AT_calling_convention: - *s_out = "DW_AT_calling_convention"; - return DW_DLV_OK; - case DW_AT_count: - *s_out = "DW_AT_count"; - return DW_DLV_OK; - case DW_AT_data_member_location: - *s_out = "DW_AT_data_member_location"; - return DW_DLV_OK; - case DW_AT_decl_column: - *s_out = "DW_AT_decl_column"; - return DW_DLV_OK; - case DW_AT_decl_file: - *s_out = "DW_AT_decl_file"; - return DW_DLV_OK; - case DW_AT_decl_line: - *s_out = "DW_AT_decl_line"; - return DW_DLV_OK; - case DW_AT_declaration: - *s_out = "DW_AT_declaration"; - return DW_DLV_OK; - case DW_AT_discr_list: - *s_out = "DW_AT_discr_list"; - return DW_DLV_OK; - case DW_AT_encoding: - *s_out = "DW_AT_encoding"; - return DW_DLV_OK; - case DW_AT_external: - *s_out = "DW_AT_external"; - return DW_DLV_OK; - case DW_AT_frame_base: - *s_out = "DW_AT_frame_base"; - return DW_DLV_OK; - case DW_AT_friend: - *s_out = "DW_AT_friend"; - return DW_DLV_OK; - case DW_AT_identifier_case: - *s_out = "DW_AT_identifier_case"; - return DW_DLV_OK; - case DW_AT_macro_info: - *s_out = "DW_AT_macro_info"; - return DW_DLV_OK; - case DW_AT_namelist_item: - *s_out = "DW_AT_namelist_item"; - return DW_DLV_OK; - case DW_AT_priority: - *s_out = "DW_AT_priority"; - return DW_DLV_OK; - case DW_AT_segment: - *s_out = "DW_AT_segment"; - return DW_DLV_OK; - case DW_AT_specification: - *s_out = "DW_AT_specification"; - return DW_DLV_OK; - case DW_AT_static_link: - *s_out = "DW_AT_static_link"; - return DW_DLV_OK; - case DW_AT_type: - *s_out = "DW_AT_type"; - return DW_DLV_OK; - case DW_AT_use_location: - *s_out = "DW_AT_use_location"; - return DW_DLV_OK; - case DW_AT_variable_parameter: - *s_out = "DW_AT_variable_parameter"; - return DW_DLV_OK; - case DW_AT_virtuality: - *s_out = "DW_AT_virtuality"; - return DW_DLV_OK; - case DW_AT_vtable_elem_location: - *s_out = "DW_AT_vtable_elem_location"; - return DW_DLV_OK; - case DW_AT_allocated: - *s_out = "DW_AT_allocated"; - return DW_DLV_OK; - case DW_AT_associated: - *s_out = "DW_AT_associated"; - return DW_DLV_OK; - case DW_AT_data_location: - *s_out = "DW_AT_data_location"; - return DW_DLV_OK; - case DW_AT_stride: - *s_out = "DW_AT_stride"; - return DW_DLV_OK; - case DW_AT_entry_pc: - *s_out = "DW_AT_entry_pc"; - return DW_DLV_OK; - case DW_AT_use_UTF8: - *s_out = "DW_AT_use_UTF8"; - return DW_DLV_OK; - case DW_AT_extension: - *s_out = "DW_AT_extension"; - return DW_DLV_OK; - case DW_AT_ranges: - *s_out = "DW_AT_ranges"; - return DW_DLV_OK; - case DW_AT_trampoline: - *s_out = "DW_AT_trampoline"; - return DW_DLV_OK; - case DW_AT_call_column: - *s_out = "DW_AT_call_column"; - return DW_DLV_OK; - case DW_AT_call_file: - *s_out = "DW_AT_call_file"; - return DW_DLV_OK; - case DW_AT_call_line: - *s_out = "DW_AT_call_line"; - return DW_DLV_OK; - case DW_AT_description: - *s_out = "DW_AT_description"; - return DW_DLV_OK; - case DW_AT_binary_scale: - *s_out = "DW_AT_binary_scale"; - return DW_DLV_OK; - case DW_AT_decimal_scale: - *s_out = "DW_AT_decimal_scale"; - return DW_DLV_OK; - case DW_AT_small: - *s_out = "DW_AT_small"; - return DW_DLV_OK; - case DW_AT_decimal_sign: - *s_out = "DW_AT_decimal_sign"; - return DW_DLV_OK; - case DW_AT_digit_count: - *s_out = "DW_AT_digit_count"; - return DW_DLV_OK; - case DW_AT_picture_string: - *s_out = "DW_AT_picture_string"; - return DW_DLV_OK; - case DW_AT_mutable: - *s_out = "DW_AT_mutable"; - return DW_DLV_OK; - case DW_AT_threads_scaled: - *s_out = "DW_AT_threads_scaled"; - return DW_DLV_OK; - case DW_AT_explicit: - *s_out = "DW_AT_explicit"; - return DW_DLV_OK; - case DW_AT_object_pointer: - *s_out = "DW_AT_object_pointer"; - return DW_DLV_OK; - case DW_AT_endianity: - *s_out = "DW_AT_endianity"; - return DW_DLV_OK; - case DW_AT_elemental: - *s_out = "DW_AT_elemental"; - return DW_DLV_OK; - case DW_AT_pure: - *s_out = "DW_AT_pure"; - return DW_DLV_OK; - case DW_AT_recursive: - *s_out = "DW_AT_recursive"; - return DW_DLV_OK; - case DW_AT_signature: - *s_out = "DW_AT_signature"; - return DW_DLV_OK; - case DW_AT_main_subprogram: - *s_out = "DW_AT_main_subprogram"; - return DW_DLV_OK; - case DW_AT_data_bit_offset: - *s_out = "DW_AT_data_bit_offset"; - return DW_DLV_OK; - case DW_AT_const_expr: - *s_out = "DW_AT_const_expr"; - return DW_DLV_OK; - case DW_AT_enum_class: - *s_out = "DW_AT_enum_class"; - return DW_DLV_OK; - case DW_AT_linkage_name: - *s_out = "DW_AT_linkage_name"; - return DW_DLV_OK; - case DW_AT_lo_user: - *s_out = "DW_AT_lo_user"; - return DW_DLV_OK; - case DW_AT_HP_unmodifiable: - *s_out = "DW_AT_HP_unmodifiable"; - return DW_DLV_OK; - case DW_AT_MIPS_loop_begin: - *s_out = "DW_AT_MIPS_loop_begin"; - return DW_DLV_OK; - case DW_AT_CPQ_split_lifetimes_var: - *s_out = "DW_AT_CPQ_split_lifetimes_var"; - return DW_DLV_OK; - case DW_AT_MIPS_epilog_begin: - *s_out = "DW_AT_MIPS_epilog_begin"; - return DW_DLV_OK; - case DW_AT_CPQ_prologue_length: - *s_out = "DW_AT_CPQ_prologue_length"; - return DW_DLV_OK; - case DW_AT_MIPS_software_pipeline_depth: - *s_out = "DW_AT_MIPS_software_pipeline_depth"; - return DW_DLV_OK; - case DW_AT_MIPS_linkage_name: - *s_out = "DW_AT_MIPS_linkage_name"; - return DW_DLV_OK; - case DW_AT_MIPS_stride: - *s_out = "DW_AT_MIPS_stride"; - return DW_DLV_OK; - case DW_AT_MIPS_abstract_name: - *s_out = "DW_AT_MIPS_abstract_name"; - return DW_DLV_OK; - case DW_AT_MIPS_clone_origin: - *s_out = "DW_AT_MIPS_clone_origin"; - return DW_DLV_OK; - case DW_AT_MIPS_has_inlines: - *s_out = "DW_AT_MIPS_has_inlines"; - return DW_DLV_OK; - case DW_AT_MIPS_stride_byte: - *s_out = "DW_AT_MIPS_stride_byte"; - return DW_DLV_OK; - case DW_AT_MIPS_stride_elem: - *s_out = "DW_AT_MIPS_stride_elem"; - return DW_DLV_OK; - case DW_AT_MIPS_ptr_dopetype: - *s_out = "DW_AT_MIPS_ptr_dopetype"; - return DW_DLV_OK; - case DW_AT_MIPS_allocatable_dopetype: - *s_out = "DW_AT_MIPS_allocatable_dopetype"; - return DW_DLV_OK; - case DW_AT_MIPS_assumed_shape_dopetype: - *s_out = "DW_AT_MIPS_assumed_shape_dopetype"; - return DW_DLV_OK; - case DW_AT_HP_proc_per_section: - *s_out = "DW_AT_HP_proc_per_section"; - return DW_DLV_OK; - case DW_AT_HP_raw_data_ptr: - *s_out = "DW_AT_HP_raw_data_ptr"; - return DW_DLV_OK; - case DW_AT_HP_pass_by_reference: - *s_out = "DW_AT_HP_pass_by_reference"; - return DW_DLV_OK; - case DW_AT_HP_opt_level: - *s_out = "DW_AT_HP_opt_level"; - return DW_DLV_OK; - case DW_AT_HP_prof_version_id: - *s_out = "DW_AT_HP_prof_version_id"; - return DW_DLV_OK; - case DW_AT_HP_opt_flags: - *s_out = "DW_AT_HP_opt_flags"; - return DW_DLV_OK; - case DW_AT_HP_cold_region_low_pc: - *s_out = "DW_AT_HP_cold_region_low_pc"; - return DW_DLV_OK; - case DW_AT_HP_cold_region_high_pc: - *s_out = "DW_AT_HP_cold_region_high_pc"; - return DW_DLV_OK; - case DW_AT_HP_all_variables_modifiable: - *s_out = "DW_AT_HP_all_variables_modifiable"; - return DW_DLV_OK; - case DW_AT_HP_linkage_name: - *s_out = "DW_AT_HP_linkage_name"; - return DW_DLV_OK; - case DW_AT_HP_prof_flags: - *s_out = "DW_AT_HP_prof_flags"; - return DW_DLV_OK; - case DW_AT_INTEL_other_endian: - *s_out = "DW_AT_INTEL_other_endian"; - return DW_DLV_OK; - case DW_AT_sf_names: - *s_out = "DW_AT_sf_names"; - return DW_DLV_OK; - case DW_AT_src_info: - *s_out = "DW_AT_src_info"; - return DW_DLV_OK; - case DW_AT_mac_info: - *s_out = "DW_AT_mac_info"; - return DW_DLV_OK; - case DW_AT_src_coords: - *s_out = "DW_AT_src_coords"; - return DW_DLV_OK; - case DW_AT_body_begin: - *s_out = "DW_AT_body_begin"; - return DW_DLV_OK; - case DW_AT_body_end: - *s_out = "DW_AT_body_end"; - return DW_DLV_OK; - case DW_AT_GNU_vector: - *s_out = "DW_AT_GNU_vector"; - return DW_DLV_OK; - case DW_AT_GNU_template_name: - *s_out = "DW_AT_GNU_template_name"; - return DW_DLV_OK; - case DW_AT_VMS_rtnbeg_pd_address: - *s_out = "DW_AT_VMS_rtnbeg_pd_address"; - return DW_DLV_OK; - case DW_AT_SUN_alignment: - *s_out = "DW_AT_SUN_alignment"; - return DW_DLV_OK; - case DW_AT_SUN_vtable: - *s_out = "DW_AT_SUN_vtable"; - return DW_DLV_OK; - case DW_AT_SUN_count_guarantee: - *s_out = "DW_AT_SUN_count_guarantee"; - return DW_DLV_OK; - case DW_AT_SUN_command_line: - *s_out = "DW_AT_SUN_command_line"; - return DW_DLV_OK; - case DW_AT_SUN_vbase: - *s_out = "DW_AT_SUN_vbase"; - return DW_DLV_OK; - case DW_AT_SUN_compile_options: - *s_out = "DW_AT_SUN_compile_options"; - return DW_DLV_OK; - case DW_AT_SUN_language: - *s_out = "DW_AT_SUN_language"; - return DW_DLV_OK; - case DW_AT_SUN_browser_file: - *s_out = "DW_AT_SUN_browser_file"; - return DW_DLV_OK; - case DW_AT_SUN_vtable_abi: - *s_out = "DW_AT_SUN_vtable_abi"; - return DW_DLV_OK; - case DW_AT_SUN_func_offsets: - *s_out = "DW_AT_SUN_func_offsets"; - return DW_DLV_OK; - case DW_AT_SUN_cf_kind: - *s_out = "DW_AT_SUN_cf_kind"; - return DW_DLV_OK; - case DW_AT_SUN_vtable_index: - *s_out = "DW_AT_SUN_vtable_index"; - return DW_DLV_OK; - case DW_AT_SUN_omp_tpriv_addr: - *s_out = "DW_AT_SUN_omp_tpriv_addr"; - return DW_DLV_OK; - case DW_AT_SUN_omp_child_func: - *s_out = "DW_AT_SUN_omp_child_func"; - return DW_DLV_OK; - case DW_AT_SUN_func_offset: - *s_out = "DW_AT_SUN_func_offset"; - return DW_DLV_OK; - case DW_AT_SUN_memop_type_ref: - *s_out = "DW_AT_SUN_memop_type_ref"; - return DW_DLV_OK; - case DW_AT_SUN_profile_id: - *s_out = "DW_AT_SUN_profile_id"; - return DW_DLV_OK; - case DW_AT_SUN_memop_signature: - *s_out = "DW_AT_SUN_memop_signature"; - return DW_DLV_OK; - case DW_AT_SUN_obj_dir: - *s_out = "DW_AT_SUN_obj_dir"; - return DW_DLV_OK; - case DW_AT_SUN_obj_file: - *s_out = "DW_AT_SUN_obj_file"; - return DW_DLV_OK; - case DW_AT_SUN_original_name: - *s_out = "DW_AT_SUN_original_name"; - return DW_DLV_OK; - case DW_AT_SUN_hwcprof_signature: - *s_out = "DW_AT_SUN_hwcprof_signature"; - return DW_DLV_OK; - case DW_AT_SUN_amd64_parmdump: - *s_out = "DW_AT_SUN_amd64_parmdump"; - return DW_DLV_OK; - case DW_AT_SUN_part_link_name: - *s_out = "DW_AT_SUN_part_link_name"; - return DW_DLV_OK; - case DW_AT_SUN_link_name: - *s_out = "DW_AT_SUN_link_name"; - return DW_DLV_OK; - case DW_AT_SUN_pass_with_const: - *s_out = "DW_AT_SUN_pass_with_const"; - return DW_DLV_OK; - case DW_AT_SUN_return_with_const: - *s_out = "DW_AT_SUN_return_with_const"; - return DW_DLV_OK; - case DW_AT_SUN_import_by_name: - *s_out = "DW_AT_SUN_import_by_name"; - return DW_DLV_OK; - case DW_AT_SUN_f90_pointer: - *s_out = "DW_AT_SUN_f90_pointer"; - return DW_DLV_OK; - case DW_AT_SUN_pass_by_ref: - *s_out = "DW_AT_SUN_pass_by_ref"; - return DW_DLV_OK; - case DW_AT_SUN_f90_allocatable: - *s_out = "DW_AT_SUN_f90_allocatable"; - return DW_DLV_OK; - case DW_AT_SUN_f90_assumed_shape_array: - *s_out = "DW_AT_SUN_f90_assumed_shape_array"; - return DW_DLV_OK; - case DW_AT_SUN_c_vla: - *s_out = "DW_AT_SUN_c_vla"; - return DW_DLV_OK; - case DW_AT_SUN_return_value_ptr: - *s_out = "DW_AT_SUN_return_value_ptr"; - return DW_DLV_OK; - case DW_AT_SUN_dtor_start: - *s_out = "DW_AT_SUN_dtor_start"; - return DW_DLV_OK; - case DW_AT_SUN_dtor_length: - *s_out = "DW_AT_SUN_dtor_length"; - return DW_DLV_OK; - case DW_AT_SUN_dtor_state_initial: - *s_out = "DW_AT_SUN_dtor_state_initial"; - return DW_DLV_OK; - case DW_AT_SUN_dtor_state_final: - *s_out = "DW_AT_SUN_dtor_state_final"; - return DW_DLV_OK; - case DW_AT_SUN_dtor_state_deltas: - *s_out = "DW_AT_SUN_dtor_state_deltas"; - return DW_DLV_OK; - case DW_AT_SUN_import_by_lname: - *s_out = "DW_AT_SUN_import_by_lname"; - return DW_DLV_OK; - case DW_AT_SUN_f90_use_only: - *s_out = "DW_AT_SUN_f90_use_only"; - return DW_DLV_OK; - case DW_AT_SUN_namelist_spec: - *s_out = "DW_AT_SUN_namelist_spec"; - return DW_DLV_OK; - case DW_AT_SUN_is_omp_child_func: - *s_out = "DW_AT_SUN_is_omp_child_func"; - return DW_DLV_OK; - case DW_AT_SUN_fortran_main_alias: - *s_out = "DW_AT_SUN_fortran_main_alias"; - return DW_DLV_OK; - case DW_AT_SUN_fortran_based: - *s_out = "DW_AT_SUN_fortran_based"; - return DW_DLV_OK; - case DW_AT_ALTIUM_loclist: - *s_out = "DW_AT_ALTIUM_loclist"; - return DW_DLV_OK; - case DW_AT_upc_threads_scaled: - *s_out = "DW_AT_upc_threads_scaled"; - return DW_DLV_OK; - case DW_AT_PGI_lbase: - *s_out = "DW_AT_PGI_lbase"; - return DW_DLV_OK; - case DW_AT_PGI_soffset: - *s_out = "DW_AT_PGI_soffset"; - return DW_DLV_OK; - case DW_AT_PGI_lstride: - *s_out = "DW_AT_PGI_lstride"; - return DW_DLV_OK; - case DW_AT_APPLE_closure: - *s_out = "DW_AT_APPLE_closure"; - return DW_DLV_OK; - case DW_AT_APPLE_major_runtime_vers: - *s_out = "DW_AT_APPLE_major_runtime_vers"; - return DW_DLV_OK; - case DW_AT_APPLE_runtime_class: - *s_out = "DW_AT_APPLE_runtime_class"; - return DW_DLV_OK; - case DW_AT_hi_user: - *s_out = "DW_AT_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_OP_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_OP_addr: - *s_out = "DW_OP_addr"; - return DW_DLV_OK; - case DW_OP_deref: - *s_out = "DW_OP_deref"; - return DW_DLV_OK; - case DW_OP_const1u: - *s_out = "DW_OP_const1u"; - return DW_DLV_OK; - case DW_OP_const1s: - *s_out = "DW_OP_const1s"; - return DW_DLV_OK; - case DW_OP_const2u: - *s_out = "DW_OP_const2u"; - return DW_DLV_OK; - case DW_OP_const2s: - *s_out = "DW_OP_const2s"; - return DW_DLV_OK; - case DW_OP_const4u: - *s_out = "DW_OP_const4u"; - return DW_DLV_OK; - case DW_OP_const4s: - *s_out = "DW_OP_const4s"; - return DW_DLV_OK; - case DW_OP_const8u: - *s_out = "DW_OP_const8u"; - return DW_DLV_OK; - case DW_OP_const8s: - *s_out = "DW_OP_const8s"; - return DW_DLV_OK; - case DW_OP_constu: - *s_out = "DW_OP_constu"; - return DW_DLV_OK; - case DW_OP_consts: - *s_out = "DW_OP_consts"; - return DW_DLV_OK; - case DW_OP_dup: - *s_out = "DW_OP_dup"; - return DW_DLV_OK; - case DW_OP_drop: - *s_out = "DW_OP_drop"; - return DW_DLV_OK; - case DW_OP_over: - *s_out = "DW_OP_over"; - return DW_DLV_OK; - case DW_OP_pick: - *s_out = "DW_OP_pick"; - return DW_DLV_OK; - case DW_OP_swap: - *s_out = "DW_OP_swap"; - return DW_DLV_OK; - case DW_OP_rot: - *s_out = "DW_OP_rot"; - return DW_DLV_OK; - case DW_OP_xderef: - *s_out = "DW_OP_xderef"; - return DW_DLV_OK; - case DW_OP_abs: - *s_out = "DW_OP_abs"; - return DW_DLV_OK; - case DW_OP_and: - *s_out = "DW_OP_and"; - return DW_DLV_OK; - case DW_OP_div: - *s_out = "DW_OP_div"; - return DW_DLV_OK; - case DW_OP_minus: - *s_out = "DW_OP_minus"; - return DW_DLV_OK; - case DW_OP_mod: - *s_out = "DW_OP_mod"; - return DW_DLV_OK; - case DW_OP_mul: - *s_out = "DW_OP_mul"; - return DW_DLV_OK; - case DW_OP_neg: - *s_out = "DW_OP_neg"; - return DW_DLV_OK; - case DW_OP_not: - *s_out = "DW_OP_not"; - return DW_DLV_OK; - case DW_OP_or: - *s_out = "DW_OP_or"; - return DW_DLV_OK; - case DW_OP_plus: - *s_out = "DW_OP_plus"; - return DW_DLV_OK; - case DW_OP_plus_uconst: - *s_out = "DW_OP_plus_uconst"; - return DW_DLV_OK; - case DW_OP_shl: - *s_out = "DW_OP_shl"; - return DW_DLV_OK; - case DW_OP_shr: - *s_out = "DW_OP_shr"; - return DW_DLV_OK; - case DW_OP_shra: - *s_out = "DW_OP_shra"; - return DW_DLV_OK; - case DW_OP_xor: - *s_out = "DW_OP_xor"; - return DW_DLV_OK; - case DW_OP_bra: - *s_out = "DW_OP_bra"; - return DW_DLV_OK; - case DW_OP_eq: - *s_out = "DW_OP_eq"; - return DW_DLV_OK; - case DW_OP_ge: - *s_out = "DW_OP_ge"; - return DW_DLV_OK; - case DW_OP_gt: - *s_out = "DW_OP_gt"; - return DW_DLV_OK; - case DW_OP_le: - *s_out = "DW_OP_le"; - return DW_DLV_OK; - case DW_OP_lt: - *s_out = "DW_OP_lt"; - return DW_DLV_OK; - case DW_OP_ne: - *s_out = "DW_OP_ne"; - return DW_DLV_OK; - case DW_OP_skip: - *s_out = "DW_OP_skip"; - return DW_DLV_OK; - case DW_OP_lit0: - *s_out = "DW_OP_lit0"; - return DW_DLV_OK; - case DW_OP_lit1: - *s_out = "DW_OP_lit1"; - return DW_DLV_OK; - case DW_OP_lit2: - *s_out = "DW_OP_lit2"; - return DW_DLV_OK; - case DW_OP_lit3: - *s_out = "DW_OP_lit3"; - return DW_DLV_OK; - case DW_OP_lit4: - *s_out = "DW_OP_lit4"; - return DW_DLV_OK; - case DW_OP_lit5: - *s_out = "DW_OP_lit5"; - return DW_DLV_OK; - case DW_OP_lit6: - *s_out = "DW_OP_lit6"; - return DW_DLV_OK; - case DW_OP_lit7: - *s_out = "DW_OP_lit7"; - return DW_DLV_OK; - case DW_OP_lit8: - *s_out = "DW_OP_lit8"; - return DW_DLV_OK; - case DW_OP_lit9: - *s_out = "DW_OP_lit9"; - return DW_DLV_OK; - case DW_OP_lit10: - *s_out = "DW_OP_lit10"; - return DW_DLV_OK; - case DW_OP_lit11: - *s_out = "DW_OP_lit11"; - return DW_DLV_OK; - case DW_OP_lit12: - *s_out = "DW_OP_lit12"; - return DW_DLV_OK; - case DW_OP_lit13: - *s_out = "DW_OP_lit13"; - return DW_DLV_OK; - case DW_OP_lit14: - *s_out = "DW_OP_lit14"; - return DW_DLV_OK; - case DW_OP_lit15: - *s_out = "DW_OP_lit15"; - return DW_DLV_OK; - case DW_OP_lit16: - *s_out = "DW_OP_lit16"; - return DW_DLV_OK; - case DW_OP_lit17: - *s_out = "DW_OP_lit17"; - return DW_DLV_OK; - case DW_OP_lit18: - *s_out = "DW_OP_lit18"; - return DW_DLV_OK; - case DW_OP_lit19: - *s_out = "DW_OP_lit19"; - return DW_DLV_OK; - case DW_OP_lit20: - *s_out = "DW_OP_lit20"; - return DW_DLV_OK; - case DW_OP_lit21: - *s_out = "DW_OP_lit21"; - return DW_DLV_OK; - case DW_OP_lit22: - *s_out = "DW_OP_lit22"; - return DW_DLV_OK; - case DW_OP_lit23: - *s_out = "DW_OP_lit23"; - return DW_DLV_OK; - case DW_OP_lit24: - *s_out = "DW_OP_lit24"; - return DW_DLV_OK; - case DW_OP_lit25: - *s_out = "DW_OP_lit25"; - return DW_DLV_OK; - case DW_OP_lit26: - *s_out = "DW_OP_lit26"; - return DW_DLV_OK; - case DW_OP_lit27: - *s_out = "DW_OP_lit27"; - return DW_DLV_OK; - case DW_OP_lit28: - *s_out = "DW_OP_lit28"; - return DW_DLV_OK; - case DW_OP_lit29: - *s_out = "DW_OP_lit29"; - return DW_DLV_OK; - case DW_OP_lit30: - *s_out = "DW_OP_lit30"; - return DW_DLV_OK; - case DW_OP_lit31: - *s_out = "DW_OP_lit31"; - return DW_DLV_OK; - case DW_OP_reg0: - *s_out = "DW_OP_reg0"; - return DW_DLV_OK; - case DW_OP_reg1: - *s_out = "DW_OP_reg1"; - return DW_DLV_OK; - case DW_OP_reg2: - *s_out = "DW_OP_reg2"; - return DW_DLV_OK; - case DW_OP_reg3: - *s_out = "DW_OP_reg3"; - return DW_DLV_OK; - case DW_OP_reg4: - *s_out = "DW_OP_reg4"; - return DW_DLV_OK; - case DW_OP_reg5: - *s_out = "DW_OP_reg5"; - return DW_DLV_OK; - case DW_OP_reg6: - *s_out = "DW_OP_reg6"; - return DW_DLV_OK; - case DW_OP_reg7: - *s_out = "DW_OP_reg7"; - return DW_DLV_OK; - case DW_OP_reg8: - *s_out = "DW_OP_reg8"; - return DW_DLV_OK; - case DW_OP_reg9: - *s_out = "DW_OP_reg9"; - return DW_DLV_OK; - case DW_OP_reg10: - *s_out = "DW_OP_reg10"; - return DW_DLV_OK; - case DW_OP_reg11: - *s_out = "DW_OP_reg11"; - return DW_DLV_OK; - case DW_OP_reg12: - *s_out = "DW_OP_reg12"; - return DW_DLV_OK; - case DW_OP_reg13: - *s_out = "DW_OP_reg13"; - return DW_DLV_OK; - case DW_OP_reg14: - *s_out = "DW_OP_reg14"; - return DW_DLV_OK; - case DW_OP_reg15: - *s_out = "DW_OP_reg15"; - return DW_DLV_OK; - case DW_OP_reg16: - *s_out = "DW_OP_reg16"; - return DW_DLV_OK; - case DW_OP_reg17: - *s_out = "DW_OP_reg17"; - return DW_DLV_OK; - case DW_OP_reg18: - *s_out = "DW_OP_reg18"; - return DW_DLV_OK; - case DW_OP_reg19: - *s_out = "DW_OP_reg19"; - return DW_DLV_OK; - case DW_OP_reg20: - *s_out = "DW_OP_reg20"; - return DW_DLV_OK; - case DW_OP_reg21: - *s_out = "DW_OP_reg21"; - return DW_DLV_OK; - case DW_OP_reg22: - *s_out = "DW_OP_reg22"; - return DW_DLV_OK; - case DW_OP_reg23: - *s_out = "DW_OP_reg23"; - return DW_DLV_OK; - case DW_OP_reg24: - *s_out = "DW_OP_reg24"; - return DW_DLV_OK; - case DW_OP_reg25: - *s_out = "DW_OP_reg25"; - return DW_DLV_OK; - case DW_OP_reg26: - *s_out = "DW_OP_reg26"; - return DW_DLV_OK; - case DW_OP_reg27: - *s_out = "DW_OP_reg27"; - return DW_DLV_OK; - case DW_OP_reg28: - *s_out = "DW_OP_reg28"; - return DW_DLV_OK; - case DW_OP_reg29: - *s_out = "DW_OP_reg29"; - return DW_DLV_OK; - case DW_OP_reg30: - *s_out = "DW_OP_reg30"; - return DW_DLV_OK; - case DW_OP_reg31: - *s_out = "DW_OP_reg31"; - return DW_DLV_OK; - case DW_OP_breg0: - *s_out = "DW_OP_breg0"; - return DW_DLV_OK; - case DW_OP_breg1: - *s_out = "DW_OP_breg1"; - return DW_DLV_OK; - case DW_OP_breg2: - *s_out = "DW_OP_breg2"; - return DW_DLV_OK; - case DW_OP_breg3: - *s_out = "DW_OP_breg3"; - return DW_DLV_OK; - case DW_OP_breg4: - *s_out = "DW_OP_breg4"; - return DW_DLV_OK; - case DW_OP_breg5: - *s_out = "DW_OP_breg5"; - return DW_DLV_OK; - case DW_OP_breg6: - *s_out = "DW_OP_breg6"; - return DW_DLV_OK; - case DW_OP_breg7: - *s_out = "DW_OP_breg7"; - return DW_DLV_OK; - case DW_OP_breg8: - *s_out = "DW_OP_breg8"; - return DW_DLV_OK; - case DW_OP_breg9: - *s_out = "DW_OP_breg9"; - return DW_DLV_OK; - case DW_OP_breg10: - *s_out = "DW_OP_breg10"; - return DW_DLV_OK; - case DW_OP_breg11: - *s_out = "DW_OP_breg11"; - return DW_DLV_OK; - case DW_OP_breg12: - *s_out = "DW_OP_breg12"; - return DW_DLV_OK; - case DW_OP_breg13: - *s_out = "DW_OP_breg13"; - return DW_DLV_OK; - case DW_OP_breg14: - *s_out = "DW_OP_breg14"; - return DW_DLV_OK; - case DW_OP_breg15: - *s_out = "DW_OP_breg15"; - return DW_DLV_OK; - case DW_OP_breg16: - *s_out = "DW_OP_breg16"; - return DW_DLV_OK; - case DW_OP_breg17: - *s_out = "DW_OP_breg17"; - return DW_DLV_OK; - case DW_OP_breg18: - *s_out = "DW_OP_breg18"; - return DW_DLV_OK; - case DW_OP_breg19: - *s_out = "DW_OP_breg19"; - return DW_DLV_OK; - case DW_OP_breg20: - *s_out = "DW_OP_breg20"; - return DW_DLV_OK; - case DW_OP_breg21: - *s_out = "DW_OP_breg21"; - return DW_DLV_OK; - case DW_OP_breg22: - *s_out = "DW_OP_breg22"; - return DW_DLV_OK; - case DW_OP_breg23: - *s_out = "DW_OP_breg23"; - return DW_DLV_OK; - case DW_OP_breg24: - *s_out = "DW_OP_breg24"; - return DW_DLV_OK; - case DW_OP_breg25: - *s_out = "DW_OP_breg25"; - return DW_DLV_OK; - case DW_OP_breg26: - *s_out = "DW_OP_breg26"; - return DW_DLV_OK; - case DW_OP_breg27: - *s_out = "DW_OP_breg27"; - return DW_DLV_OK; - case DW_OP_breg28: - *s_out = "DW_OP_breg28"; - return DW_DLV_OK; - case DW_OP_breg29: - *s_out = "DW_OP_breg29"; - return DW_DLV_OK; - case DW_OP_breg30: - *s_out = "DW_OP_breg30"; - return DW_DLV_OK; - case DW_OP_breg31: - *s_out = "DW_OP_breg31"; - return DW_DLV_OK; - case DW_OP_regx: - *s_out = "DW_OP_regx"; - return DW_DLV_OK; - case DW_OP_fbreg: - *s_out = "DW_OP_fbreg"; - return DW_DLV_OK; - case DW_OP_bregx: - *s_out = "DW_OP_bregx"; - return DW_DLV_OK; - case DW_OP_piece: - *s_out = "DW_OP_piece"; - return DW_DLV_OK; - case DW_OP_deref_size: - *s_out = "DW_OP_deref_size"; - return DW_DLV_OK; - case DW_OP_xderef_size: - *s_out = "DW_OP_xderef_size"; - return DW_DLV_OK; - case DW_OP_nop: - *s_out = "DW_OP_nop"; - return DW_DLV_OK; - case DW_OP_push_object_address: - *s_out = "DW_OP_push_object_address"; - return DW_DLV_OK; - case DW_OP_call2: - *s_out = "DW_OP_call2"; - return DW_DLV_OK; - case DW_OP_call4: - *s_out = "DW_OP_call4"; - return DW_DLV_OK; - case DW_OP_call_ref: - *s_out = "DW_OP_call_ref"; - return DW_DLV_OK; - case DW_OP_form_tls_address: - *s_out = "DW_OP_form_tls_address"; - return DW_DLV_OK; - case DW_OP_call_frame_cfa: - *s_out = "DW_OP_call_frame_cfa"; - return DW_DLV_OK; - case DW_OP_bit_piece: - *s_out = "DW_OP_bit_piece"; - return DW_DLV_OK; - case DW_OP_implicit_value: - *s_out = "DW_OP_implicit_value"; - return DW_DLV_OK; - case DW_OP_stack_value: - *s_out = "DW_OP_stack_value"; - return DW_DLV_OK; - case DW_OP_lo_user: - *s_out = "DW_OP_lo_user"; - return DW_DLV_OK; - case DW_OP_HP_is_value: - *s_out = "DW_OP_HP_is_value"; - return DW_DLV_OK; - case DW_OP_HP_fltconst4: - *s_out = "DW_OP_HP_fltconst4"; - return DW_DLV_OK; - case DW_OP_HP_fltconst8: - *s_out = "DW_OP_HP_fltconst8"; - return DW_DLV_OK; - case DW_OP_HP_mod_range: - *s_out = "DW_OP_HP_mod_range"; - return DW_DLV_OK; - case DW_OP_HP_unmod_range: - *s_out = "DW_OP_HP_unmod_range"; - return DW_DLV_OK; - case DW_OP_HP_tls: - *s_out = "DW_OP_HP_tls"; - return DW_DLV_OK; - case DW_OP_INTEL_bit_piece: - *s_out = "DW_OP_INTEL_bit_piece"; - return DW_DLV_OK; - case DW_OP_APPLE_uninit: - *s_out = "DW_OP_APPLE_uninit"; - return DW_DLV_OK; - case DW_OP_hi_user: - *s_out = "DW_OP_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ATE_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ATE_address: - *s_out = "DW_ATE_address"; - return DW_DLV_OK; - case DW_ATE_boolean: - *s_out = "DW_ATE_boolean"; - return DW_DLV_OK; - case DW_ATE_complex_float: - *s_out = "DW_ATE_complex_float"; - return DW_DLV_OK; - case DW_ATE_float: - *s_out = "DW_ATE_float"; - return DW_DLV_OK; - case DW_ATE_signed: - *s_out = "DW_ATE_signed"; - return DW_DLV_OK; - case DW_ATE_signed_char: - *s_out = "DW_ATE_signed_char"; - return DW_DLV_OK; - case DW_ATE_unsigned: - *s_out = "DW_ATE_unsigned"; - return DW_DLV_OK; - case DW_ATE_unsigned_char: - *s_out = "DW_ATE_unsigned_char"; - return DW_DLV_OK; - case DW_ATE_imaginary_float: - *s_out = "DW_ATE_imaginary_float"; - return DW_DLV_OK; - case DW_ATE_packed_decimal: - *s_out = "DW_ATE_packed_decimal"; - return DW_DLV_OK; - case DW_ATE_numeric_string: - *s_out = "DW_ATE_numeric_string"; - return DW_DLV_OK; - case DW_ATE_edited: - *s_out = "DW_ATE_edited"; - return DW_DLV_OK; - case DW_ATE_signed_fixed: - *s_out = "DW_ATE_signed_fixed"; - return DW_DLV_OK; - case DW_ATE_unsigned_fixed: - *s_out = "DW_ATE_unsigned_fixed"; - return DW_DLV_OK; - case DW_ATE_decimal_float: - *s_out = "DW_ATE_decimal_float"; - return DW_DLV_OK; - case DW_ATE_HP_float80: - *s_out = "DW_ATE_HP_float80"; - return DW_DLV_OK; - case DW_ATE_HP_complex_float80: - *s_out = "DW_ATE_HP_complex_float80"; - return DW_DLV_OK; - case DW_ATE_HP_float128: - *s_out = "DW_ATE_HP_float128"; - return DW_DLV_OK; - case DW_ATE_HP_complex_float128: - *s_out = "DW_ATE_HP_complex_float128"; - return DW_DLV_OK; - case DW_ATE_HP_floathpintel: - *s_out = "DW_ATE_HP_floathpintel"; - return DW_DLV_OK; - case DW_ATE_HP_imaginary_float80: - *s_out = "DW_ATE_HP_imaginary_float80"; - return DW_DLV_OK; - case DW_ATE_HP_imaginary_float128: - *s_out = "DW_ATE_HP_imaginary_float128"; - return DW_DLV_OK; - case DW_ATE_SUN_interval_float: - *s_out = "DW_ATE_SUN_interval_float"; - return DW_DLV_OK; - case DW_ATE_SUN_imaginary_float: - *s_out = "DW_ATE_SUN_imaginary_float"; - return DW_DLV_OK; - case DW_ATE_hi_user: - *s_out = "DW_ATE_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_DS_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_DS_unsigned: - *s_out = "DW_DS_unsigned"; - return DW_DLV_OK; - case DW_DS_leading_overpunch: - *s_out = "DW_DS_leading_overpunch"; - return DW_DLV_OK; - case DW_DS_trailing_overpunch: - *s_out = "DW_DS_trailing_overpunch"; - return DW_DLV_OK; - case DW_DS_leading_separate: - *s_out = "DW_DS_leading_separate"; - return DW_DLV_OK; - case DW_DS_trailing_separate: - *s_out = "DW_DS_trailing_separate"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_END_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_END_default: - *s_out = "DW_END_default"; - return DW_DLV_OK; - case DW_END_big: - *s_out = "DW_END_big"; - return DW_DLV_OK; - case DW_END_little: - *s_out = "DW_END_little"; - return DW_DLV_OK; - case DW_END_lo_user: - *s_out = "DW_END_lo_user"; - return DW_DLV_OK; - case DW_END_hi_user: - *s_out = "DW_END_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ATCF_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ATCF_lo_user: - *s_out = "DW_ATCF_lo_user"; - return DW_DLV_OK; - case DW_ATCF_SUN_mop_bitfield: - *s_out = "DW_ATCF_SUN_mop_bitfield"; - return DW_DLV_OK; - case DW_ATCF_SUN_mop_spill: - *s_out = "DW_ATCF_SUN_mop_spill"; - return DW_DLV_OK; - case DW_ATCF_SUN_mop_scopy: - *s_out = "DW_ATCF_SUN_mop_scopy"; - return DW_DLV_OK; - case DW_ATCF_SUN_func_start: - *s_out = "DW_ATCF_SUN_func_start"; - return DW_DLV_OK; - case DW_ATCF_SUN_end_ctors: - *s_out = "DW_ATCF_SUN_end_ctors"; - return DW_DLV_OK; - case DW_ATCF_SUN_branch_target: - *s_out = "DW_ATCF_SUN_branch_target"; - return DW_DLV_OK; - case DW_ATCF_SUN_mop_stack_probe: - *s_out = "DW_ATCF_SUN_mop_stack_probe"; - return DW_DLV_OK; - case DW_ATCF_SUN_func_epilog: - *s_out = "DW_ATCF_SUN_func_epilog"; - return DW_DLV_OK; - case DW_ATCF_hi_user: - *s_out = "DW_ATCF_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ACCESS_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ACCESS_public: - *s_out = "DW_ACCESS_public"; - return DW_DLV_OK; - case DW_ACCESS_protected: - *s_out = "DW_ACCESS_protected"; - return DW_DLV_OK; - case DW_ACCESS_private: - *s_out = "DW_ACCESS_private"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_VIS_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_VIS_local: - *s_out = "DW_VIS_local"; - return DW_DLV_OK; - case DW_VIS_exported: - *s_out = "DW_VIS_exported"; - return DW_DLV_OK; - case DW_VIS_qualified: - *s_out = "DW_VIS_qualified"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_VIRTUALITY_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_VIRTUALITY_none: - *s_out = "DW_VIRTUALITY_none"; - return DW_DLV_OK; - case DW_VIRTUALITY_virtual: - *s_out = "DW_VIRTUALITY_virtual"; - return DW_DLV_OK; - case DW_VIRTUALITY_pure_virtual: - *s_out = "DW_VIRTUALITY_pure_virtual"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_LANG_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_LANG_C89: - *s_out = "DW_LANG_C89"; - return DW_DLV_OK; - case DW_LANG_C: - *s_out = "DW_LANG_C"; - return DW_DLV_OK; - case DW_LANG_Ada83: - *s_out = "DW_LANG_Ada83"; - return DW_DLV_OK; - case DW_LANG_C_plus_plus: - *s_out = "DW_LANG_C_plus_plus"; - return DW_DLV_OK; - case DW_LANG_Cobol74: - *s_out = "DW_LANG_Cobol74"; - return DW_DLV_OK; - case DW_LANG_Cobol85: - *s_out = "DW_LANG_Cobol85"; - return DW_DLV_OK; - case DW_LANG_Fortran77: - *s_out = "DW_LANG_Fortran77"; - return DW_DLV_OK; - case DW_LANG_Fortran90: - *s_out = "DW_LANG_Fortran90"; - return DW_DLV_OK; - case DW_LANG_Pascal83: - *s_out = "DW_LANG_Pascal83"; - return DW_DLV_OK; - case DW_LANG_Modula2: - *s_out = "DW_LANG_Modula2"; - return DW_DLV_OK; - case DW_LANG_Java: - *s_out = "DW_LANG_Java"; - return DW_DLV_OK; - case DW_LANG_C99: - *s_out = "DW_LANG_C99"; - return DW_DLV_OK; - case DW_LANG_Ada95: - *s_out = "DW_LANG_Ada95"; - return DW_DLV_OK; - case DW_LANG_Fortran95: - *s_out = "DW_LANG_Fortran95"; - return DW_DLV_OK; - case DW_LANG_PLI: - *s_out = "DW_LANG_PLI"; - return DW_DLV_OK; - case DW_LANG_ObjC: - *s_out = "DW_LANG_ObjC"; - return DW_DLV_OK; - case DW_LANG_ObjC_plus_plus: - *s_out = "DW_LANG_ObjC_plus_plus"; - return DW_DLV_OK; - case DW_LANG_UPC: - *s_out = "DW_LANG_UPC"; - return DW_DLV_OK; - case DW_LANG_D: - *s_out = "DW_LANG_D"; - return DW_DLV_OK; - case DW_LANG_Python: - *s_out = "DW_LANG_Python"; - return DW_DLV_OK; - case DW_LANG_OpenCL: - *s_out = "DW_LANG_OpenCL"; - return DW_DLV_OK; - case DW_LANG_Go: - *s_out = "DW_LANG_Go"; - return DW_DLV_OK; - case DW_LANG_lo_user: - *s_out = "DW_LANG_lo_user"; - return DW_DLV_OK; - case DW_LANG_Mips_Assembler: - *s_out = "DW_LANG_Mips_Assembler"; - return DW_DLV_OK; - case DW_LANG_Upc: - *s_out = "DW_LANG_Upc"; - return DW_DLV_OK; - case DW_LANG_SUN_Assembler: - *s_out = "DW_LANG_SUN_Assembler"; - return DW_DLV_OK; - case DW_LANG_ALTIUM_Assembler: - *s_out = "DW_LANG_ALTIUM_Assembler"; - return DW_DLV_OK; - case DW_LANG_hi_user: - *s_out = "DW_LANG_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ID_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ID_case_sensitive: - *s_out = "DW_ID_case_sensitive"; - return DW_DLV_OK; - case DW_ID_up_case: - *s_out = "DW_ID_up_case"; - return DW_DLV_OK; - case DW_ID_down_case: - *s_out = "DW_ID_down_case"; - return DW_DLV_OK; - case DW_ID_case_insensitive: - *s_out = "DW_ID_case_insensitive"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_CC_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_CC_normal: - *s_out = "DW_CC_normal"; - return DW_DLV_OK; - case DW_CC_program: - *s_out = "DW_CC_program"; - return DW_DLV_OK; - case DW_CC_nocall: - *s_out = "DW_CC_nocall"; - return DW_DLV_OK; - case DW_CC_lo_user: - *s_out = "DW_CC_lo_user"; - return DW_DLV_OK; - case DW_CC_ALTIUM_interrupt: - *s_out = "DW_CC_ALTIUM_interrupt"; - return DW_DLV_OK; - case DW_CC_ALTIUM_near_system_stack: - *s_out = "DW_CC_ALTIUM_near_system_stack"; - return DW_DLV_OK; - case DW_CC_ALTIUM_near_user_stack: - *s_out = "DW_CC_ALTIUM_near_user_stack"; - return DW_DLV_OK; - case DW_CC_ALTIUM_huge_user_stack: - *s_out = "DW_CC_ALTIUM_huge_user_stack"; - return DW_DLV_OK; - case DW_CC_hi_user: - *s_out = "DW_CC_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_INL_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_INL_not_inlined: - *s_out = "DW_INL_not_inlined"; - return DW_DLV_OK; - case DW_INL_inlined: - *s_out = "DW_INL_inlined"; - return DW_DLV_OK; - case DW_INL_declared_not_inlined: - *s_out = "DW_INL_declared_not_inlined"; - return DW_DLV_OK; - case DW_INL_declared_inlined: - *s_out = "DW_INL_declared_inlined"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ORD_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ORD_row_major: - *s_out = "DW_ORD_row_major"; - return DW_DLV_OK; - case DW_ORD_col_major: - *s_out = "DW_ORD_col_major"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_DSC_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_DSC_label: - *s_out = "DW_DSC_label"; - return DW_DLV_OK; - case DW_DSC_range: - *s_out = "DW_DSC_range"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_LNS_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_LNS_copy: - *s_out = "DW_LNS_copy"; - return DW_DLV_OK; - case DW_LNS_advance_pc: - *s_out = "DW_LNS_advance_pc"; - return DW_DLV_OK; - case DW_LNS_advance_line: - *s_out = "DW_LNS_advance_line"; - return DW_DLV_OK; - case DW_LNS_set_file: - *s_out = "DW_LNS_set_file"; - return DW_DLV_OK; - case DW_LNS_set_column: - *s_out = "DW_LNS_set_column"; - return DW_DLV_OK; - case DW_LNS_negate_stmt: - *s_out = "DW_LNS_negate_stmt"; - return DW_DLV_OK; - case DW_LNS_set_basic_block: - *s_out = "DW_LNS_set_basic_block"; - return DW_DLV_OK; - case DW_LNS_const_add_pc: - *s_out = "DW_LNS_const_add_pc"; - return DW_DLV_OK; - case DW_LNS_fixed_advance_pc: - *s_out = "DW_LNS_fixed_advance_pc"; - return DW_DLV_OK; - case DW_LNS_set_prologue_end: - *s_out = "DW_LNS_set_prologue_end"; - return DW_DLV_OK; - case DW_LNS_set_epilogue_begin: - *s_out = "DW_LNS_set_epilogue_begin"; - return DW_DLV_OK; - case DW_LNS_set_isa: - *s_out = "DW_LNS_set_isa"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_LNE_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_LNE_end_sequence: - *s_out = "DW_LNE_end_sequence"; - return DW_DLV_OK; - case DW_LNE_set_address: - *s_out = "DW_LNE_set_address"; - return DW_DLV_OK; - case DW_LNE_define_file: - *s_out = "DW_LNE_define_file"; - return DW_DLV_OK; - case DW_LNE_set_discriminator: - *s_out = "DW_LNE_set_discriminator"; - return DW_DLV_OK; - case DW_LNE_HP_negate_is_UV_update: - *s_out = "DW_LNE_HP_negate_is_UV_update"; - return DW_DLV_OK; - case DW_LNE_HP_push_context: - *s_out = "DW_LNE_HP_push_context"; - return DW_DLV_OK; - case DW_LNE_HP_pop_context: - *s_out = "DW_LNE_HP_pop_context"; - return DW_DLV_OK; - case DW_LNE_HP_set_file_line_column: - *s_out = "DW_LNE_HP_set_file_line_column"; - return DW_DLV_OK; - case DW_LNE_HP_set_routine_name: - *s_out = "DW_LNE_HP_set_routine_name"; - return DW_DLV_OK; - case DW_LNE_HP_set_sequence: - *s_out = "DW_LNE_HP_set_sequence"; - return DW_DLV_OK; - case DW_LNE_HP_negate_post_semantics: - *s_out = "DW_LNE_HP_negate_post_semantics"; - return DW_DLV_OK; - case DW_LNE_HP_negate_function_exit: - *s_out = "DW_LNE_HP_negate_function_exit"; - return DW_DLV_OK; - case DW_LNE_HP_negate_front_end_logical: - *s_out = "DW_LNE_HP_negate_front_end_logical"; - return DW_DLV_OK; - case DW_LNE_HP_define_proc: - *s_out = "DW_LNE_HP_define_proc"; - return DW_DLV_OK; - case DW_LNE_lo_user: - *s_out = "DW_LNE_lo_user"; - return DW_DLV_OK; - case DW_LNE_hi_user: - *s_out = "DW_LNE_hi_user"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ISA_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ISA_UNKNOWN: - *s_out = "DW_ISA_UNKNOWN"; - return DW_DLV_OK; - case DW_ISA_ARM_thumb: - *s_out = "DW_ISA_ARM_thumb"; - return DW_DLV_OK; - case DW_ISA_ARM_arm: - *s_out = "DW_ISA_ARM_arm"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_MACINFO_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_MACINFO_define: - *s_out = "DW_MACINFO_define"; - return DW_DLV_OK; - case DW_MACINFO_undef: - *s_out = "DW_MACINFO_undef"; - return DW_DLV_OK; - case DW_MACINFO_start_file: - *s_out = "DW_MACINFO_start_file"; - return DW_DLV_OK; - case DW_MACINFO_end_file: - *s_out = "DW_MACINFO_end_file"; - return DW_DLV_OK; - case DW_MACINFO_vendor_ext: - *s_out = "DW_MACINFO_vendor_ext"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_CFA_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_CFA_extended: - *s_out = "DW_CFA_extended"; - return DW_DLV_OK; - case DW_CFA_set_loc: - *s_out = "DW_CFA_set_loc"; - return DW_DLV_OK; - case DW_CFA_advance_loc1: - *s_out = "DW_CFA_advance_loc1"; - return DW_DLV_OK; - case DW_CFA_advance_loc2: - *s_out = "DW_CFA_advance_loc2"; - return DW_DLV_OK; - case DW_CFA_advance_loc4: - *s_out = "DW_CFA_advance_loc4"; - return DW_DLV_OK; - case DW_CFA_offset_extended: - *s_out = "DW_CFA_offset_extended"; - return DW_DLV_OK; - case DW_CFA_restore_extended: - *s_out = "DW_CFA_restore_extended"; - return DW_DLV_OK; - case DW_CFA_undefined: - *s_out = "DW_CFA_undefined"; - return DW_DLV_OK; - case DW_CFA_same_value: - *s_out = "DW_CFA_same_value"; - return DW_DLV_OK; - case DW_CFA_register: - *s_out = "DW_CFA_register"; - return DW_DLV_OK; - case DW_CFA_remember_state: - *s_out = "DW_CFA_remember_state"; - return DW_DLV_OK; - case DW_CFA_restore_state: - *s_out = "DW_CFA_restore_state"; - return DW_DLV_OK; - case DW_CFA_def_cfa: - *s_out = "DW_CFA_def_cfa"; - return DW_DLV_OK; - case DW_CFA_def_cfa_register: - *s_out = "DW_CFA_def_cfa_register"; - return DW_DLV_OK; - case DW_CFA_def_cfa_offset: - *s_out = "DW_CFA_def_cfa_offset"; - return DW_DLV_OK; - case DW_CFA_def_cfa_expression: - *s_out = "DW_CFA_def_cfa_expression"; - return DW_DLV_OK; - case DW_CFA_expression: - *s_out = "DW_CFA_expression"; - return DW_DLV_OK; - case DW_CFA_offset_extended_sf: - *s_out = "DW_CFA_offset_extended_sf"; - return DW_DLV_OK; - case DW_CFA_def_cfa_sf: - *s_out = "DW_CFA_def_cfa_sf"; - return DW_DLV_OK; - case DW_CFA_def_cfa_offset_sf: - *s_out = "DW_CFA_def_cfa_offset_sf"; - return DW_DLV_OK; - case DW_CFA_val_offset: - *s_out = "DW_CFA_val_offset"; - return DW_DLV_OK; - case DW_CFA_val_offset_sf: - *s_out = "DW_CFA_val_offset_sf"; - return DW_DLV_OK; - case DW_CFA_val_expression: - *s_out = "DW_CFA_val_expression"; - return DW_DLV_OK; - case DW_CFA_lo_user: - *s_out = "DW_CFA_lo_user"; - return DW_DLV_OK; - case DW_CFA_MIPS_advance_loc8: - *s_out = "DW_CFA_MIPS_advance_loc8"; - return DW_DLV_OK; - case DW_CFA_GNU_window_save: - *s_out = "DW_CFA_GNU_window_save"; - return DW_DLV_OK; - case DW_CFA_GNU_args_size: - *s_out = "DW_CFA_GNU_args_size"; - return DW_DLV_OK; - case DW_CFA_GNU_negative_offset_extended: - *s_out = "DW_CFA_GNU_negative_offset_extended"; - return DW_DLV_OK; - case DW_CFA_high_user: - *s_out = "DW_CFA_high_user"; - return DW_DLV_OK; - case DW_CFA_advance_loc: - *s_out = "DW_CFA_advance_loc"; - return DW_DLV_OK; - case DW_CFA_offset: - *s_out = "DW_CFA_offset"; - return DW_DLV_OK; - case DW_CFA_restore: - *s_out = "DW_CFA_restore"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_EH_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_EH_PE_absptr: - *s_out = "DW_EH_PE_absptr"; - return DW_DLV_OK; - case DW_EH_PE_uleb128: - *s_out = "DW_EH_PE_uleb128"; - return DW_DLV_OK; - case DW_EH_PE_udata2: - *s_out = "DW_EH_PE_udata2"; - return DW_DLV_OK; - case DW_EH_PE_udata4: - *s_out = "DW_EH_PE_udata4"; - return DW_DLV_OK; - case DW_EH_PE_udata8: - *s_out = "DW_EH_PE_udata8"; - return DW_DLV_OK; - case DW_EH_PE_sleb128: - *s_out = "DW_EH_PE_sleb128"; - return DW_DLV_OK; - case DW_EH_PE_sdata2: - *s_out = "DW_EH_PE_sdata2"; - return DW_DLV_OK; - case DW_EH_PE_sdata4: - *s_out = "DW_EH_PE_sdata4"; - return DW_DLV_OK; - case DW_EH_PE_sdata8: - *s_out = "DW_EH_PE_sdata8"; - return DW_DLV_OK; - case DW_EH_PE_pcrel: - *s_out = "DW_EH_PE_pcrel"; - return DW_DLV_OK; - case DW_EH_PE_textrel: - *s_out = "DW_EH_PE_textrel"; - return DW_DLV_OK; - case DW_EH_PE_datarel: - *s_out = "DW_EH_PE_datarel"; - return DW_DLV_OK; - case DW_EH_PE_funcrel: - *s_out = "DW_EH_PE_funcrel"; - return DW_DLV_OK; - case DW_EH_PE_aligned: - *s_out = "DW_EH_PE_aligned"; - return DW_DLV_OK; - case DW_EH_PE_omit: - *s_out = "DW_EH_PE_omit"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_FRAME_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_FRAME_CFA_COL: - *s_out = "DW_FRAME_CFA_COL"; - return DW_DLV_OK; - case DW_FRAME_REG1: - *s_out = "DW_FRAME_REG1"; - return DW_DLV_OK; - case DW_FRAME_REG2: - *s_out = "DW_FRAME_REG2"; - return DW_DLV_OK; - case DW_FRAME_REG3: - *s_out = "DW_FRAME_REG3"; - return DW_DLV_OK; - case DW_FRAME_REG4: - *s_out = "DW_FRAME_REG4"; - return DW_DLV_OK; - case DW_FRAME_REG5: - *s_out = "DW_FRAME_REG5"; - return DW_DLV_OK; - case DW_FRAME_REG6: - *s_out = "DW_FRAME_REG6"; - return DW_DLV_OK; - case DW_FRAME_REG7: - *s_out = "DW_FRAME_REG7"; - return DW_DLV_OK; - case DW_FRAME_REG8: - *s_out = "DW_FRAME_REG8"; - return DW_DLV_OK; - case DW_FRAME_REG9: - *s_out = "DW_FRAME_REG9"; - return DW_DLV_OK; - case DW_FRAME_REG10: - *s_out = "DW_FRAME_REG10"; - return DW_DLV_OK; - case DW_FRAME_REG11: - *s_out = "DW_FRAME_REG11"; - return DW_DLV_OK; - case DW_FRAME_REG12: - *s_out = "DW_FRAME_REG12"; - return DW_DLV_OK; - case DW_FRAME_REG13: - *s_out = "DW_FRAME_REG13"; - return DW_DLV_OK; - case DW_FRAME_REG14: - *s_out = "DW_FRAME_REG14"; - return DW_DLV_OK; - case DW_FRAME_REG15: - *s_out = "DW_FRAME_REG15"; - return DW_DLV_OK; - case DW_FRAME_REG16: - *s_out = "DW_FRAME_REG16"; - return DW_DLV_OK; - case DW_FRAME_REG17: - *s_out = "DW_FRAME_REG17"; - return DW_DLV_OK; - case DW_FRAME_REG18: - *s_out = "DW_FRAME_REG18"; - return DW_DLV_OK; - case DW_FRAME_REG19: - *s_out = "DW_FRAME_REG19"; - return DW_DLV_OK; - case DW_FRAME_REG20: - *s_out = "DW_FRAME_REG20"; - return DW_DLV_OK; - case DW_FRAME_REG21: - *s_out = "DW_FRAME_REG21"; - return DW_DLV_OK; - case DW_FRAME_REG22: - *s_out = "DW_FRAME_REG22"; - return DW_DLV_OK; - case DW_FRAME_REG23: - *s_out = "DW_FRAME_REG23"; - return DW_DLV_OK; - case DW_FRAME_REG24: - *s_out = "DW_FRAME_REG24"; - return DW_DLV_OK; - case DW_FRAME_REG25: - *s_out = "DW_FRAME_REG25"; - return DW_DLV_OK; - case DW_FRAME_REG26: - *s_out = "DW_FRAME_REG26"; - return DW_DLV_OK; - case DW_FRAME_REG27: - *s_out = "DW_FRAME_REG27"; - return DW_DLV_OK; - case DW_FRAME_REG28: - *s_out = "DW_FRAME_REG28"; - return DW_DLV_OK; - case DW_FRAME_REG29: - *s_out = "DW_FRAME_REG29"; - return DW_DLV_OK; - case DW_FRAME_REG30: - *s_out = "DW_FRAME_REG30"; - return DW_DLV_OK; - case DW_FRAME_REG31: - *s_out = "DW_FRAME_REG31"; - return DW_DLV_OK; - case DW_FRAME_FREG0: - *s_out = "DW_FRAME_FREG0"; - return DW_DLV_OK; - case DW_FRAME_FREG1: - *s_out = "DW_FRAME_FREG1"; - return DW_DLV_OK; - case DW_FRAME_FREG2: - *s_out = "DW_FRAME_FREG2"; - return DW_DLV_OK; - case DW_FRAME_FREG3: - *s_out = "DW_FRAME_FREG3"; - return DW_DLV_OK; - case DW_FRAME_FREG4: - *s_out = "DW_FRAME_FREG4"; - return DW_DLV_OK; - case DW_FRAME_FREG5: - *s_out = "DW_FRAME_FREG5"; - return DW_DLV_OK; - case DW_FRAME_FREG6: - *s_out = "DW_FRAME_FREG6"; - return DW_DLV_OK; - case DW_FRAME_FREG7: - *s_out = "DW_FRAME_FREG7"; - return DW_DLV_OK; - case DW_FRAME_FREG8: - *s_out = "DW_FRAME_FREG8"; - return DW_DLV_OK; - case DW_FRAME_FREG9: - *s_out = "DW_FRAME_FREG9"; - return DW_DLV_OK; - case DW_FRAME_FREG10: - *s_out = "DW_FRAME_FREG10"; - return DW_DLV_OK; - case DW_FRAME_FREG11: - *s_out = "DW_FRAME_FREG11"; - return DW_DLV_OK; - case DW_FRAME_FREG12: - *s_out = "DW_FRAME_FREG12"; - return DW_DLV_OK; - case DW_FRAME_FREG13: - *s_out = "DW_FRAME_FREG13"; - return DW_DLV_OK; - case DW_FRAME_FREG14: - *s_out = "DW_FRAME_FREG14"; - return DW_DLV_OK; - case DW_FRAME_FREG15: - *s_out = "DW_FRAME_FREG15"; - return DW_DLV_OK; - case DW_FRAME_FREG16: - *s_out = "DW_FRAME_FREG16"; - return DW_DLV_OK; - case DW_FRAME_FREG17: - *s_out = "DW_FRAME_FREG17"; - return DW_DLV_OK; - case DW_FRAME_FREG18: - *s_out = "DW_FRAME_FREG18"; - return DW_DLV_OK; - case DW_FRAME_FREG19: - *s_out = "DW_FRAME_FREG19"; - return DW_DLV_OK; - case DW_FRAME_FREG20: - *s_out = "DW_FRAME_FREG20"; - return DW_DLV_OK; - case DW_FRAME_FREG21: - *s_out = "DW_FRAME_FREG21"; - return DW_DLV_OK; - case DW_FRAME_FREG22: - *s_out = "DW_FRAME_FREG22"; - return DW_DLV_OK; - case DW_FRAME_FREG23: - *s_out = "DW_FRAME_FREG23"; - return DW_DLV_OK; - case DW_FRAME_FREG24: - *s_out = "DW_FRAME_FREG24"; - return DW_DLV_OK; - case DW_FRAME_FREG25: - *s_out = "DW_FRAME_FREG25"; - return DW_DLV_OK; - case DW_FRAME_FREG26: - *s_out = "DW_FRAME_FREG26"; - return DW_DLV_OK; - case DW_FRAME_FREG27: - *s_out = "DW_FRAME_FREG27"; - return DW_DLV_OK; - case DW_FRAME_FREG28: - *s_out = "DW_FRAME_FREG28"; - return DW_DLV_OK; - case DW_FRAME_FREG29: - *s_out = "DW_FRAME_FREG29"; - return DW_DLV_OK; - case DW_FRAME_FREG30: - *s_out = "DW_FRAME_FREG30"; - return DW_DLV_OK; - case DW_FRAME_HIGHEST_NORMAL_REGISTER: - *s_out = "DW_FRAME_HIGHEST_NORMAL_REGISTER"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_CHILDREN_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_CHILDREN_no: - *s_out = "DW_CHILDREN_no"; - return DW_DLV_OK; - case DW_CHILDREN_yes: - *s_out = "DW_CHILDREN_yes"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} -/* ARGSUSED */ -int -dwarf_get_ADDR_name (unsigned int val,const char ** s_out) -{ - switch (val) { - case DW_ADDR_none: - *s_out = "DW_ADDR_none"; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} - -/* END FILE */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_names.h b/usr/src/tools/ctf/dwarf/common/dwarf_names.h deleted file mode 100644 index 6edafa5fdd..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_names.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Generated routines, do not edit. */ -/* Generated on May 22 2011 03:05:33 */ - -/* BEGIN FILE */ - -extern int dwarf_get_TAG_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_children_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_FORM_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_AT_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_OP_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ATE_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_DS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_END_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ATCF_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ACCESS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_VIS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_VIRTUALITY_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LANG_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ID_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CC_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_INL_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ORD_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_DSC_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LNS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LNE_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ISA_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_MACINFO_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CFA_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_EH_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_FRAME_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CHILDREN_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ADDR_name(unsigned int /*val_in*/, const char ** /*s_out */); - -/* END FILE */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_opaque.h b/usr/src/tools/ctf/dwarf/common/dwarf_opaque.h deleted file mode 100644 index b235a9c7b4..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_opaque.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The versions applicable by section are: - DWARF2 DWARF3 DWARF4 - .debug_abbrev - - - - .debug_aranges 2 2 2 - .debug_frame 1 3 4 - .debug_info 2 3 4 - .debug_line 2 3 4 - .debug_loc - - - - .debug_macinfo - - - - .debug_pubtypes x 2 2 - .debug_pubnames 2 2 2 - .debug_ranges x - - - .debug_str - - - - .debug_types x x 4 -*/ - -#include <stddef.h> - - -struct Dwarf_Die_s { - Dwarf_Byte_Ptr di_debug_info_ptr; - Dwarf_Abbrev_List di_abbrev_list; - Dwarf_CU_Context di_cu_context; - int di_abbrev_code; -}; - -struct Dwarf_Attribute_s { - Dwarf_Half ar_attribute; /* Attribute Value. */ - Dwarf_Half ar_attribute_form; /* Attribute Form. */ - Dwarf_Half ar_attribute_form_direct; - /* Identical to ar_attribute_form except that if - the original form uleb was DW_FORM_indirect, - ar_attribute_form_direct contains DW_FORM_indirect - but ar_attribute_form contains the true form. */ - - Dwarf_CU_Context ar_cu_context; - Dwarf_Small *ar_debug_info_ptr; - Dwarf_Attribute ar_next; -}; - -/* - This structure provides the context for a compilation unit. - Thus, it contains the Dwarf_Debug, cc_dbg, that this cu - belongs to. It contains the information in the compilation - unit header, cc_length, cc_version_stamp, cc_abbrev_offset, - and cc_address_size, in the .debug_info section for that cu. - In addition, it contains the count, cc_count_cu, of the cu - number of that cu in the list of cu's in the .debug_info. - The count starts at 1, ie cc_count_cu is 1 for the first cu, - 2 for the second and so on. This struct also contains a - pointer, cc_abbrev_table, to a list of pairs of abbrev code - and a pointer to the start of that abbrev - in the .debug_abbrev section. - - Each die will also contain a pointer to such a struct to - record the context for that die. - - Notice that a pointer to the CU DIE itself is - Dwarf_Off off2 = cu_context->cc_debug_info_offset; - cu_die_info_ptr = dbg->de_debug_info.dss_data + - off2 + _dwarf_length_of_cu_header(dbg, off2); - - **Updated by dwarf_next_cu_header in dwarf_die_deliv.c -*/ -struct Dwarf_CU_Context_s { - Dwarf_Debug cc_dbg; - /* The sum of cc_length, cc_length_size, and cc_extension_size - is the total length of the CU including its header. */ - Dwarf_Word cc_length; - /* cc_length_size is the size in bytes of an offset. - 4 for 32bit dwarf, 8 for 64bit dwarf (whether MIPS/IRIX - 64bit dwarf or standard 64bit dwarf using the extension - mechanism). */ - Dwarf_Small cc_length_size; - /* cc_extension_size is zero unless this is standard - DWARF3 and later 64bit dwarf using the extension mechanism. - If it is the DWARF3 and later 64bit dwarf cc_extension - size is 4. So for 32bit dwarf and MIPS/IRIX 64bit dwarf - cc_extension_size is zero. */ - Dwarf_Small cc_extension_size; - Dwarf_Half cc_version_stamp; - Dwarf_Sword cc_abbrev_offset; - Dwarf_Small cc_address_size; - /* cc_debug_info_offset is the offset in the section - of the CU header of this CU. Dwarf_Word - should be large enough. */ - Dwarf_Word cc_debug_info_offset; - Dwarf_Byte_Ptr cc_last_abbrev_ptr; - Dwarf_Hash_Table cc_abbrev_hash_table; - Dwarf_CU_Context cc_next; - /*unsigned char cc_offset_length; */ -}; - -/* Consolidates section-specific data in one place. - Section is an Elf specific term, intended as a general - term (for non-Elf objects some code must synthesize the - values somehow). - Makes adding more section-data much simpler. */ -struct Dwarf_Section_s { - Dwarf_Small * dss_data; - Dwarf_Unsigned dss_size; - Dwarf_Word dss_index; - /* dss_addr is the 'section address' which is only - non-zero for a GNU eh section. - Purpose: to handle DW_EH_PE_pcrel encoding. Leaving - it zero is fine for non-elf. */ - Dwarf_Addr dss_addr; - Dwarf_Small dss_data_was_malloc; - - /* For non-elf, leaving the following fields zero - will mean they are ignored. */ - /* dss_link should be zero unless a section has a link - to another (sh_link). Used to access relocation data for - a section (and for symtab section, access its strtab). */ - Dwarf_Word dss_link; - /* The following is used when reading .rela sections - (such sections appear in some .o files). */ - Dwarf_Half dss_reloc_index; /* Zero means ignore the reloc fields. */ - Dwarf_Small * dss_reloc_data; - Dwarf_Unsigned dss_reloc_size; - Dwarf_Addr dss_reloc_addr; - /* dss_reloc_symtab is the sh_link of a .rela to its .symtab, leave - it 0 if non-meaningful. */ - Dwarf_Addr dss_reloc_symtab; - /* dss_reloc_link should be zero unless a reloc section has a link - to another (sh_link). Used to access the symtab for relocations - a section. */ - Dwarf_Word dss_reloc_link; - /* Pointer to the elf symtab, used for elf .rela. Leave it 0 - if not relevant. */ - struct Dwarf_Section_s *dss_symtab; -}; - -/* Overview: if next_to_use== first, no error slots are used. - If next_to_use+1 (mod maxcount) == first the slots are all used -*/ -struct Dwarf_Harmless_s { - unsigned dh_maxcount; - unsigned dh_next_to_use; - unsigned dh_first; - unsigned dh_errs_count; - char ** dh_errors; -}; - -struct Dwarf_Debug_s { - /* All file access methods and support data - are hidden in this structure. - We get a pointer, callers control the lifetime of the - structure and contents. */ - struct Dwarf_Obj_Access_Interface_s *de_obj_file; - - Dwarf_Handler de_errhand; - Dwarf_Ptr de_errarg; - - /* - Context for the compilation_unit just read by a call to - dwarf_next_cu_header. **Updated by dwarf_next_cu_header in - dwarf_die_deliv.c */ - Dwarf_CU_Context de_cu_context; - - /* - Points to linked list of CU Contexts for the CU's already read. - These are only CU's read by dwarf_next_cu_header(). */ - Dwarf_CU_Context de_cu_context_list; - - /* - Points to the last CU Context added to the list by - dwarf_next_cu_header(). */ - Dwarf_CU_Context de_cu_context_list_end; - - /* - This is the list of CU contexts read for dwarf_offdie(). These - may read ahead of dwarf_next_cu_header(). */ - Dwarf_CU_Context de_offdie_cu_context; - Dwarf_CU_Context de_offdie_cu_context_end; - - /* Offset of last byte of last CU read. */ - Dwarf_Word de_info_last_offset; - - /* - Number of bytes in the length, and offset field in various - .debug_* sections. It's not very meaningful, and is - only used in one 'approximate' calculation. */ - Dwarf_Small de_length_size; - - /* number of bytes in a pointer of the target in various .debug_ - sections. 4 in 32bit, 8 in MIPS 64, ia64. */ - Dwarf_Small de_pointer_size; - - /* set at creation of a Dwarf_Debug to say if form_string should be - checked for valid length at every call. 0 means do the check. - non-zero means do not do the check. */ - Dwarf_Small de_assume_string_in_bounds; - - /* - Dwarf_Alloc_Hdr_s structs used to manage chunks that are - malloc'ed for each allocation type for structs. */ - struct Dwarf_Alloc_Hdr_s de_alloc_hdr[ALLOC_AREA_REAL_TABLE_MAX]; -#ifdef DWARF_SIMPLE_MALLOC - struct simple_malloc_record_s * de_simple_malloc_base; -#endif - - - /* - These fields are used to process debug_frame section. **Updated - by dwarf_get_fde_list in dwarf_frame.h */ - /* - Points to contiguous block of pointers to Dwarf_Cie_s structs. */ - Dwarf_Cie *de_cie_data; - /* Count of number of Dwarf_Cie_s structs. */ - Dwarf_Signed de_cie_count; - /* Keep eh (GNU) separate!. */ - Dwarf_Cie *de_cie_data_eh; - Dwarf_Signed de_cie_count_eh; - /* - Points to contiguous block of pointers to Dwarf_Fde_s structs. */ - Dwarf_Fde *de_fde_data; - /* Count of number of Dwarf_Fde_s structs. */ - Dwarf_Signed de_fde_count; - /* Keep eh (GNU) separate!. */ - Dwarf_Fde *de_fde_data_eh; - Dwarf_Signed de_fde_count_eh; - - struct Dwarf_Section_s de_debug_info; - struct Dwarf_Section_s de_debug_abbrev; - struct Dwarf_Section_s de_debug_line; - struct Dwarf_Section_s de_debug_loc; - struct Dwarf_Section_s de_debug_aranges; - struct Dwarf_Section_s de_debug_macinfo; - struct Dwarf_Section_s de_debug_pubnames; - struct Dwarf_Section_s de_debug_str; - struct Dwarf_Section_s de_debug_frame; - - /* gnu: the g++ eh_frame section */ - struct Dwarf_Section_s de_debug_frame_eh_gnu; - - struct Dwarf_Section_s de_debug_pubtypes; /* DWARF3 .debug_pubtypes */ - - struct Dwarf_Section_s de_debug_funcnames; - struct Dwarf_Section_s de_debug_typenames; /* SGI IRIX extension essentially - identical to DWARF3 .debug_pubtypes. */ - struct Dwarf_Section_s de_debug_varnames; - struct Dwarf_Section_s de_debug_weaknames; - struct Dwarf_Section_s de_debug_ranges; - - /* For non-elf, simply leave the following two structs zeroed and - they will be ignored. */ - struct Dwarf_Section_s de_elf_symtab; - struct Dwarf_Section_s de_elf_strtab; - - - void *(*de_copy_word) (void *, const void *, size_t); - unsigned char de_same_endian; - unsigned char de_elf_must_close; /* if non-zero, then - it was dwarf_init (not dwarf_elf_init) - so must elf_end() */ - - /* Default is DW_FRAME_INITIAL_VALUE from header. */ - Dwarf_Half de_frame_rule_initial_value; - - /* Default is DW_FRAME_LAST_REG_NUM. */ - Dwarf_Half de_frame_reg_rules_entry_count; - - Dwarf_Half de_frame_cfa_col_number; - Dwarf_Half de_frame_same_value_number; - Dwarf_Half de_frame_undefined_value_number; - - unsigned char de_big_endian_object; /* non-zero if big-endian - object opened. */ - - struct Dwarf_Harmless_s de_harmless_errors; -}; - -typedef struct Dwarf_Chain_s *Dwarf_Chain; -struct Dwarf_Chain_s { - void *ch_item; - Dwarf_Chain ch_next; -}; - - -#define CURRENT_VERSION_STAMP 2 /* DWARF2 */ -#define CURRENT_VERSION_STAMP3 3 /* DWARF3 */ -#define CURRENT_VERSION_STAMP4 4 /* DWARF4 */ - - /* Size of cu header version stamp field. */ -#define CU_VERSION_STAMP_SIZE sizeof(Dwarf_Half) - - /* Size of cu header address size field. */ -#define CU_ADDRESS_SIZE_SIZE sizeof(Dwarf_Small) - -void *_dwarf_memcpy_swap_bytes(void *s1, const void *s2, size_t len); - -#define ORIGINAL_DWARF_OFFSET_SIZE 4 -#define DISTINGUISHED_VALUE 0xffffffff -#define DISTINGUISHED_VALUE_OFFSET_SIZE 8 - -/* - We don't load the sections until they are needed. This function is - used to load the section. - */ -int _dwarf_load_section(Dwarf_Debug, - struct Dwarf_Section_s *, - Dwarf_Error *); diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_original_elf_init.c b/usr/src/tools/ctf/dwarf/common/dwarf_original_elf_init.c deleted file mode 100644 index a6d943da0a..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_original_elf_init.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - - Copyright (C) 2000,2001,2002,2005,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 Arxan Technologies, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#include "config.h" -#include "dwarf_incl.h" -#include "dwarf_elf_access.h" - -#ifdef HAVE_ELF_H -#include <elf.h> -#endif -#ifdef HAVE_LIBELF_H -#include <libelf.h> -#else -#ifdef HAVE_LIBELF_LIBELF_H -#include <libelf/libelf.h> -#endif -#endif - -#include <stdio.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <string.h> -#include <stdlib.h> - -#define DWARF_DBG_ERROR(dbg,errval,retval) \ - _dwarf_error(dbg, error, errval); return(retval); - -#define FALSE 0 -#define TRUE 1 - -static int -dwarf_elf_init_file_ownership(dwarf_elf_handle elf_file_pointer, - int libdwarf_owns_elf, - Dwarf_Unsigned access, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, - Dwarf_Debug * ret_dbg, - Dwarf_Error * error); - - -/* - The basic dwarf initializer function for consumers using - libelf. - Return a libdwarf error code on error, return DW_DLV_OK - if this succeeds. -*/ -int -dwarf_init(int fd, - Dwarf_Unsigned access, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, Dwarf_Debug * ret_dbg, Dwarf_Error * error) -{ - struct stat fstat_buf; - dwarf_elf_handle elf_file_pointer = 0; - /* ELF_C_READ is a portable value */ - Elf_Cmd what_kind_of_elf_read = ELF_C_READ; - -#if !defined(S_ISREG) -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#endif - if (fstat(fd, &fstat_buf) != 0) { - DWARF_DBG_ERROR(NULL, DW_DLE_FSTAT_ERROR, DW_DLV_ERROR); - } - if (!S_ISREG(fstat_buf.st_mode)) { - DWARF_DBG_ERROR(NULL, DW_DLE_FSTAT_MODE_ERROR, DW_DLV_ERROR); - } - - if (access != DW_DLC_READ) { - DWARF_DBG_ERROR(NULL, DW_DLE_INIT_ACCESS_WRONG, DW_DLV_ERROR); - } - - elf_version(EV_CURRENT); - /* changed to mmap request per bug 281217. 6/95 */ -#ifdef HAVE_ELF_C_READ_MMAP - /* ELF_C_READ_MMAP is an SGI IRIX specific enum value from IRIX - libelf.h meaning read but use mmap */ - what_kind_of_elf_read = ELF_C_READ_MMAP; -#endif /* !HAVE_ELF_C_READ_MMAP */ - - elf_file_pointer = elf_begin(fd, what_kind_of_elf_read, 0); - if (elf_file_pointer == NULL) { - DWARF_DBG_ERROR(NULL, DW_DLE_ELF_BEGIN_ERROR, DW_DLV_ERROR); - } - - return dwarf_elf_init_file_ownership(elf_file_pointer, - TRUE, - access, - errhand, - errarg, - ret_dbg, - error); -} - -/* - An alternate dwarf setup call for consumers using - libelf. - When the caller has opened libelf already, so the - caller must free libelf. -*/ -int -dwarf_elf_init(dwarf_elf_handle elf_file_pointer, - Dwarf_Unsigned access, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, - Dwarf_Debug * ret_dbg, Dwarf_Error * error) -{ - return dwarf_elf_init_file_ownership(elf_file_pointer, - FALSE, - access, - errhand, - errarg, - ret_dbg, - error); -} - - -/* - Initialize the ELF object access for libdwarf. - */ -static int -dwarf_elf_init_file_ownership(dwarf_elf_handle elf_file_pointer, - int libdwarf_owns_elf, - Dwarf_Unsigned access, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, - Dwarf_Debug * ret_dbg, - Dwarf_Error * error) -{ - /* ELF is no longer tied to libdwarf. */ - Dwarf_Obj_Access_Interface *binary_interface = 0; - int res = DW_DLV_OK; - int err = 0; - - if (access != DW_DLC_READ) { - DWARF_DBG_ERROR(NULL, DW_DLE_INIT_ACCESS_WRONG, DW_DLV_ERROR); - } - - /* This allocates and fills in *binary_interface. */ - res = dwarf_elf_object_access_init( - elf_file_pointer, - libdwarf_owns_elf, - &binary_interface, - &err); - if(res != DW_DLV_OK){ - DWARF_DBG_ERROR(NULL, err, DW_DLV_ERROR); - } - - /* This mallocs space and returns pointer thru ret_dbg, - saving the binary interface in 'ret-dbg' */ - res = dwarf_object_init(binary_interface, errhand, errarg, - ret_dbg, error); - if(res != DW_DLV_OK){ - dwarf_elf_object_access_finish(binary_interface); - } - return res; -} - - -/* - Frees all memory that was not previously freed - by dwarf_dealloc. - Aside from certain categories. - - This is only applicable when dwarf_init() or dwarf_elf_init() - was used to init 'dbg'. -*/ -int -dwarf_finish(Dwarf_Debug dbg, Dwarf_Error * error) -{ - dwarf_elf_object_access_finish(dbg->de_obj_file); - - return dwarf_object_finish(dbg, error); -} - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_print_lines.c b/usr/src/tools/ctf/dwarf/common/dwarf_print_lines.c deleted file mode 100644 index 30c4889ee5..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_print_lines.c +++ /dev/null @@ -1,737 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004,2005,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <time.h> -#include "dwarf_line.h" - -/* FIXME Need to add prologue_end epilogue_begin isa fields. */ -static void -print_line_header(void) -{ - printf - (" s b e\n" - " t l s\n" - " m c e\n" - " section op col t k q\n" - " offset code address file line umn ? ? ?\n"); -} - -/* FIXME: print new line values: prologue_end epilogue_begin isa */ -static void -print_line_detail(char *prefix, - int opcode, - Dwarf_Unsigned address, - unsigned long file, - unsigned long line, - unsigned long column, - int is_stmt, int basic_block, int end_sequence, - int prologue_end, int epilogue_begin, int isa) -{ - printf("%-15s %2d 0x%08" DW_PR_DUx " " - "%2lu %4lu %2lu %1d %1d %1d\n", - prefix, - (int) opcode, - (Dwarf_Unsigned) address, - (unsigned long) file, - (unsigned long) line, - (unsigned long) column, - (int) is_stmt, (int) basic_block, (int) end_sequence); - -} - - -/* - return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR - If err_count_out is non-NULL, this is a special 'check' - call. -*/ -int -_dwarf_internal_printlines(Dwarf_Die die, Dwarf_Error * error, - int * err_count_out, int only_line_header) -{ - /* - This pointer is used to scan the portion of the .debug_line - section for the current cu. */ - Dwarf_Small *line_ptr = 0; - Dwarf_Small *orig_line_ptr = 0; - - /* - This points to the last byte of the .debug_line portion for the - current cu. */ - Dwarf_Small *line_ptr_end = 0; - - /* - Pointer to a DW_AT_stmt_list attribute in case it exists in the - die. */ - Dwarf_Attribute stmt_list_attr = 0; - - /* Pointer to DW_AT_comp_dir attribute in die. */ - Dwarf_Attribute comp_dir_attr = 0; - - /* Pointer to name of compilation directory. */ - Dwarf_Small *comp_dir = NULL; - - /* - Offset into .debug_line specified by a DW_AT_stmt_list - attribute. */ - Dwarf_Unsigned line_offset = 0; - - struct Line_Table_Prefix_s prefix; - - - /* These are the state machine state variables. */ - Dwarf_Addr address = 0; - Dwarf_Word file = 1; - Dwarf_Word line = 1; - Dwarf_Word column = 0; - Dwarf_Bool is_stmt = false; - Dwarf_Bool basic_block = false; - Dwarf_Bool end_sequence = false; - Dwarf_Bool prologue_end = false; - Dwarf_Bool epilogue_begin = false; - Dwarf_Small isa = 0; - - - Dwarf_Sword i=0; - - /* - This is the current opcode read from the statement program. */ - Dwarf_Small opcode=0; - - - /* - These variables are used to decode leb128 numbers. Leb128_num - holds the decoded number, and leb128_length is its length in - bytes. */ - Dwarf_Word leb128_num=0; - Dwarf_Word leb128_length=0; - Dwarf_Sword advance_line=0; - Dwarf_Half attrform = 0; - /* - This is the operand of the latest fixed_advance_pc extended - opcode. */ - Dwarf_Half fixed_advance_pc=0; - - /* In case there are wierd bytes 'after' the line table - * prologue this lets us print something. This is a gcc - * compiler bug and we expect the bytes count to be 12. - */ - Dwarf_Small* bogus_bytes_ptr = 0; - Dwarf_Unsigned bogus_bytes_count = 0; - - - /* The Dwarf_Debug this die belongs to. */ - Dwarf_Debug dbg=0; - int resattr = DW_DLV_ERROR; - int lres = DW_DLV_ERROR; - int res = DW_DLV_ERROR; - - /* ***** BEGIN CODE ***** */ - - if (error != NULL) { - *error = NULL; - } - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - - res = _dwarf_load_section(dbg, &dbg->de_debug_line,error); - if (res != DW_DLV_OK) { - return res; - } - - resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error); - if (resattr != DW_DLV_OK) { - return resattr; - } - - - /* The list of relevant FORMs is small. - DW_FORM_data4, DW_FORM_data8, DW_FORM_sec_offset - */ - lres = dwarf_whatform(stmt_list_attr,&attrform,error); - if (lres != DW_DLV_OK) { - return lres; - } - if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 && - attrform != DW_FORM_sec_offset ) { - _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - lres = dwarf_global_formref(stmt_list_attr, &line_offset, error); - if (lres != DW_DLV_OK) { - return lres; - } - - if (line_offset >= dbg->de_debug_line.dss_size) { - _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD); - return (DW_DLV_ERROR); - } - orig_line_ptr = dbg->de_debug_line.dss_data; - line_ptr = dbg->de_debug_line.dss_data + line_offset; - dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR); - - /* - If die has DW_AT_comp_dir attribute, get the string that names - the compilation directory. */ - resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error); - if (resattr == DW_DLV_ERROR) { - return resattr; - } - if (resattr == DW_DLV_OK) { - int cres = DW_DLV_ERROR; - char *cdir = 0; - - cres = dwarf_formstring(comp_dir_attr, &cdir, error); - if (cres == DW_DLV_ERROR) { - return cres; - } else if (cres == DW_DLV_OK) { - comp_dir = (Dwarf_Small *) cdir; - } - } - if (resattr == DW_DLV_OK) { - dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR); - } - - dwarf_init_line_table_prefix(&prefix); - { - Dwarf_Small *line_ptr_out = 0; - int dres = dwarf_read_line_table_prefix(dbg, - line_ptr,dbg->de_debug_line.dss_size - line_offset, - &line_ptr_out, - &prefix, - &bogus_bytes_ptr, - &bogus_bytes_count, - error, - err_count_out); - if (dres == DW_DLV_ERROR) { - dwarf_free_line_table_prefix(&prefix); - return dres; - } - if (dres == DW_DLV_NO_ENTRY) { - dwarf_free_line_table_prefix(&prefix); - return dres; - } - line_ptr_end = prefix.pf_line_ptr_end; - line_ptr = line_ptr_out; - } - if(only_line_header) { - /* Just checking for header errors, nothing more here.*/ - dwarf_free_line_table_prefix(&prefix); - return DW_DLV_OK; - } - - - printf("total line info length %ld bytes, " - "line offset 0x%" DW_PR_DUx " %" DW_PR_DSd "\n", - (long) prefix.pf_total_length, - (Dwarf_Unsigned) line_offset, - (Dwarf_Signed) line_offset); - printf("line table version %d\n",(int) prefix.pf_version); - printf("line table length field length %d prologue length %d\n", - (int)prefix.pf_length_field_length, - (int)prefix.pf_prologue_length); - printf("compilation_directory %s\n", - comp_dir ? ((char *) comp_dir) : ""); - - printf(" min instruction length %d\n", - (int) prefix.pf_minimum_instruction_length); - printf(" default is stmt %d\n", (int) - prefix.pf_default_is_stmt); - printf(" line base %d\n", (int) - prefix.pf_line_base); - printf(" line_range %d\n", (int) - prefix.pf_line_range); - printf(" opcode base %d\n", (int) - prefix.pf_opcode_base); - printf(" standard opcode count %d\n", (int) - prefix.pf_std_op_count); - - for (i = 1; i < prefix.pf_opcode_base; i++) { - printf(" opcode[%2d] length %d\n", (int) i, - (int) prefix.pf_opcode_length_table[i - 1]); - } - printf(" include directories count %d\n", (int) - prefix.pf_include_directories_count); - - - for (i = 0; i < prefix.pf_include_directories_count; ++i) { - printf(" include dir[%d] %s\n", - (int) i, prefix.pf_include_directories[i]); - } - printf(" files count %d\n", (int) - prefix.pf_files_count); - - for (i = 0; i < prefix.pf_files_count; ++i) { - struct Line_Table_File_Entry_s *lfile = - prefix.pf_line_table_file_entries + i; - - Dwarf_Unsigned tlm2 = lfile->lte_last_modification_time; - Dwarf_Unsigned di = lfile->lte_directory_index; - Dwarf_Unsigned fl = lfile->lte_length_of_file; - - printf(" file[%d] %s (file-number: %d) \n", - (int) i, (char *) lfile->lte_filename, - (int)(i+1)); - - printf(" dir index %d\n", (int) di); - { - time_t tt = (time_t) tlm2; - - printf(" last time 0x%x %s", /* ctime supplies - newline */ - (unsigned) tlm2, ctime(&tt)); - } - printf(" file length %ld 0x%lx\n", - (long) fl, (unsigned long) fl); - - - } - - - { - Dwarf_Unsigned offset = 0; - if(bogus_bytes_count > 0) { - Dwarf_Unsigned wcount = bogus_bytes_count; - Dwarf_Unsigned boffset = bogus_bytes_ptr - orig_line_ptr; - printf("*** DWARF CHECK: the line table prologue header_length " - " is %" DW_PR_DUu " too high, we pretend it is smaller." - "Section offset: %" DW_PR_DUu " (0x%" DW_PR_DUx ") ***\n", - wcount, boffset,boffset); - *err_count_out += 1; - } - offset = line_ptr - orig_line_ptr; - - printf(" statement prog offset in section: %" DW_PR_DUu " 0x%" DW_PR_DUx "\n", - offset, offset); - } - - /* Initialize the part of the state machine dependent on the - prefix. */ - is_stmt = prefix.pf_default_is_stmt; - - - print_line_header(); - /* Start of statement program. */ - while (line_ptr < line_ptr_end) { - int type = 0; - - printf(" [0x%06" DW_PR_DSx "] ", - (Dwarf_Signed) (line_ptr - orig_line_ptr)); - opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - /* 'type' is the output */ - WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base, - prefix.pf_opcode_length_table, line_ptr, - prefix.pf_std_op_count); - - if (type == LOP_DISCARD) { - int oc; - int opcnt = prefix.pf_opcode_length_table[opcode]; - - printf("*** DWARF CHECK: DISCARD standard opcode %d " - "with %d operands: " - "not understood.", opcode, opcnt); - *err_count_out += 1; - for (oc = 0; oc < opcnt; oc++) { - /* - * Read and discard operands we don't - * understand. - * Arbitrary choice of unsigned read. - * Signed read would work as well. - */ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - printf(" %" DW_PR_DUu " (0x%" DW_PR_DUx ")", - (Dwarf_Unsigned) utmp2, - (Dwarf_Unsigned) utmp2); - } - - printf("***\n"); - /* do nothing, necessary ops done */ - } else if (type == LOP_SPECIAL) { - /* This op code is a special op in the object, no matter - that it might fall into the standard op range in this - compile Thatis, these are special opcodes between - special_opcode_base and MAX_LINE_OP_CODE. (including - special_opcode_base and MAX_LINE_OP_CODE) */ - char special[50]; - unsigned origop = opcode; - - opcode = opcode - prefix.pf_opcode_base; - address = address + prefix.pf_minimum_instruction_length * - (opcode / prefix.pf_line_range); - line = - line + prefix.pf_line_base + - opcode % prefix.pf_line_range; - - sprintf(special, "Specialop %3u", origop); - print_line_detail(special, - opcode, address, (int) file, line, column, - is_stmt, basic_block, end_sequence, - prologue_end, epilogue_begin, isa); - - basic_block = false; - - } else if (type == LOP_STANDARD) { - switch (opcode) { - - case DW_LNS_copy:{ - - print_line_detail("DW_LNS_copy", - opcode, address, file, line, - column, is_stmt, basic_block, - end_sequence, prologue_end, - epilogue_begin, isa); - - basic_block = false; - break; - } - - case DW_LNS_advance_pc:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - printf("DW_LNS_advance_pc val %" DW_PR_DSd " 0x%" DW_PR_DUx "\n", - (Dwarf_Signed) (Dwarf_Word) utmp2, - (Dwarf_Unsigned) (Dwarf_Word) utmp2); - leb128_num = (Dwarf_Word) utmp2; - address = - address + - prefix.pf_minimum_instruction_length * - leb128_num; - break; - } - - case DW_LNS_advance_line:{ - Dwarf_Signed stmp; - - - DECODE_LEB128_SWORD(line_ptr, stmp); - advance_line = (Dwarf_Sword) stmp; - printf("DW_LNS_advance_line val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n", - (Dwarf_Signed) advance_line, - (Dwarf_Signed) advance_line); - line = line + advance_line; - break; - } - - case DW_LNS_set_file:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - file = (Dwarf_Word) utmp2; - printf("DW_LNS_set_file %ld\n", (long) file); - break; - } - - case DW_LNS_set_column:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - column = (Dwarf_Word) utmp2; - printf("DW_LNS_set_column val %" DW_PR_DSd " 0x%" DW_PR_DSx "\n", - (Dwarf_Signed) column, (Dwarf_Signed) column); - break; - } - - case DW_LNS_negate_stmt:{ - is_stmt = !is_stmt; - printf("DW_LNS_negate_stmt\n"); - break; - } - - case DW_LNS_set_basic_block:{ - - printf("DW_LNS_set_basic_block\n"); - basic_block = true; - break; - } - - case DW_LNS_const_add_pc:{ - opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base; - address = - address + - prefix.pf_minimum_instruction_length * (opcode / - prefix. - pf_line_range); - - printf("DW_LNS_const_add_pc new address 0x%" DW_PR_DSx "\n", - (Dwarf_Signed) address); - break; - } - - case DW_LNS_fixed_advance_pc:{ - - READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half, - line_ptr, sizeof(Dwarf_Half)); - line_ptr += sizeof(Dwarf_Half); - address = address + fixed_advance_pc; - printf("DW_LNS_fixed_advance_pc val %" DW_PR_DSd - " 0x%" DW_PR_DSx " new address 0x%" DW_PR_DSx "\n", - (Dwarf_Signed) fixed_advance_pc, - (Dwarf_Signed) fixed_advance_pc, - (Dwarf_Signed) address); - break; - } - case DW_LNS_set_prologue_end:{ - - prologue_end = true; - printf("DW_LNS_set_prologue_end set true.\n"); - break; - - - } - /* New in DWARF3 */ - case DW_LNS_set_epilogue_begin:{ - epilogue_begin = true; - printf("DW_LNS_set_epilogue_begin set true.\n"); - break; - } - - /* New in DWARF3 */ - case DW_LNS_set_isa:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - isa = utmp2; - printf("DW_LNS_set_isa new value 0x%" DW_PR_DUx ".\n", - (Dwarf_Unsigned) utmp2); - if (isa != utmp2) { - /* The value of the isa did not fit in our - local so we record it wrong. declare an - error. */ - dwarf_free_line_table_prefix(&prefix); - - _dwarf_error(dbg, error, - DW_DLE_LINE_NUM_OPERANDS_BAD); - return (DW_DLV_ERROR); - } - break; - } - } - - - } else if (type == LOP_EXTENDED) { - Dwarf_Unsigned utmp3 = 0; - Dwarf_Word instr_length = 0; - Dwarf_Small ext_opcode = 0; - - DECODE_LEB128_UWORD(line_ptr, utmp3); - instr_length = (Dwarf_Word) utmp3; - ext_opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - switch (ext_opcode) { - - case DW_LNE_end_sequence:{ - end_sequence = true; - - print_line_detail("DW_LNE_end_sequence extended", - opcode, address, file, line, - column, is_stmt, basic_block, - end_sequence, prologue_end, - epilogue_begin, isa); - - address = 0; - file = 1; - line = 1; - column = 0; - is_stmt = prefix.pf_default_is_stmt; - basic_block = false; - end_sequence = false; - prologue_end = false; - epilogue_begin = false; - - - break; - } - - case DW_LNE_set_address:{ - { - READ_UNALIGNED(dbg, address, Dwarf_Addr, - line_ptr, - die->di_cu_context->cc_address_size); - - line_ptr += die->di_cu_context->cc_address_size; - printf("DW_LNE_set_address address 0x%" DW_PR_DUx "\n", - (Dwarf_Unsigned) address); - } - - break; - } - - case DW_LNE_define_file:{ - Dwarf_Unsigned di = 0; - Dwarf_Unsigned tlm = 0; - Dwarf_Unsigned fl = 0; - - Dwarf_Small *fn = (Dwarf_Small *) line_ptr; - line_ptr = line_ptr + strlen((char *) line_ptr) + 1; - - di = _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - tlm = _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - fl = _dwarf_decode_u_leb128(line_ptr, - &leb128_length); - line_ptr = line_ptr + leb128_length; - - - printf("DW_LNE_define_file %s \n", fn); - printf(" dir index %d\n", (int) di); - { - time_t tt3 = (time_t) tlm; - - /* ctime supplies newline */ - printf(" last time 0x%x %s", - (unsigned) tlm, ctime(&tt3)); - } - printf(" file length %ld 0x%lx\n", - (long) fl, (unsigned long) fl); - - break; - } - - default:{ - /* This is an extended op code we do not know about, - other than we know now many bytes it is - (and the op code and the bytes of operand). */ - - Dwarf_Unsigned remaining_bytes = instr_length -1; - if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) { - dwarf_free_line_table_prefix(&prefix); - _dwarf_error(dbg, error, - DW_DLE_LINE_EXT_OPCODE_BAD); - return (DW_DLV_ERROR); - } - printf("DW_LNE extended op 0x%x ",ext_opcode); - printf("Bytecount: " DW_PR_DUu , instr_length); - if(remaining_bytes > 0) { - printf(" linedata: 0x"); - while (remaining_bytes > 0) { - printf("%02x",(unsigned char)(*(line_ptr))); - line_ptr++; - remaining_bytes--; - } - } - printf("\n"); - } - break; - } - - } - } - - dwarf_free_line_table_prefix(&prefix); - return (DW_DLV_OK); -} - -/* - This is support for dwarfdump: making it possible - for clients wanting line detail info on stdout - to get that detail without including internal libdwarf - header information. - Caller passes in compilation unit DIE. - The _dwarf_ version is obsolete (though supported for - compatibility). - The dwarf_ version is preferred. - The functions are intentionally identical: having - _dwarf_print_lines call dwarf_print_lines might - better emphasize they are intentionally identical, but - that seemed slightly silly given how short the functions are. - Interface adds error_count (output value) February 2009. -*/ -int -dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error,int *error_count) -{ - int only_line_header = 0; - int res = _dwarf_internal_printlines(die, error, - error_count, - only_line_header); - if (res != DW_DLV_OK) { - return res; - } - return res; -} -int -_dwarf_print_lines(Dwarf_Die die, Dwarf_Error * error) -{ - int only_line_header = 0; - int err_count = 0; - int res = _dwarf_internal_printlines(die, error, - &err_count, - only_line_header); - /* No way to get error count back in this interface */ - if (res != DW_DLV_OK) { - return res; - } - return res; -} - -/* The check is in case we are not printing full line data, - this gets some of the issues noted with .debug_line, - but not all. Call dwarf_print_lines() to get all issues. - Intended for apps like dwarfdump. -*/ -void -dwarf_check_lineheader(Dwarf_Die die, int *err_count_out) -{ - Dwarf_Error err; - int only_line_header = 1; - _dwarf_internal_printlines(die, &err,err_count_out, - only_line_header); - return; -} - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_pubtypes.c b/usr/src/tools/ctf/dwarf/common/dwarf_pubtypes.c deleted file mode 100644 index 330c1c6adc..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_pubtypes.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - -/* Reads DWARF3 .debug_pubtypes section. */ - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_types.h" -#include "dwarf_global.h" - -int -dwarf_get_pubtypes(Dwarf_Debug dbg, - Dwarf_Type ** types, - Dwarf_Signed * ret_type_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_pubtypes,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_pubtypes.dss_data, - dbg->de_debug_pubtypes.dss_size, - (Dwarf_Global **) types, /* Type punning for sections - with identical format. */ - ret_type_count, error, - DW_DLA_PUBTYPES_CONTEXT, - DW_DLA_GLOBAL, /* We don't have DW_DLA_PUBTYPES, - so use DW_DLA_GLOBAL. */ - DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD, - DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR); -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_pubtypes_dealloc(Dwarf_Debug dbg, Dwarf_Type * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, - (Dwarf_Global *) dwgl, - count, - DW_DLA_PUBTYPES_CONTEXT, - DW_DLA_GLOBAL, /* We don't have DW_DLA_PUBTYPES, - so use DW_DLA_GLOBAL. */ - DW_DLA_LIST); - return; -} - - - -int -dwarf_pubtypename(Dwarf_Type type_in, char **ret_name, - Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - if (type == NULL) { - _dwarf_error(NULL, error, DW_DLE_TYPE_NULL); - return (DW_DLV_ERROR); - } - *ret_name = (char *) (type->gl_name); - return DW_DLV_OK; -} - - -int -dwarf_pubtype_type_die_offset(Dwarf_Type type_in, - Dwarf_Off * ret_offset, - Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - return dwarf_global_die_offset(type, ret_offset, error); -} - - -int -dwarf_pubtype_cu_offset(Dwarf_Type type_in, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - return dwarf_global_cu_offset(type, ret_offset, error); - -} - - -int -dwarf_pubtype_name_offsets(Dwarf_Type type_in, - char **returned_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_die_offset, - Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - return dwarf_global_name_offsets(type, - returned_name, - die_offset, cu_die_offset, error); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_query.c b/usr/src/tools/ctf/dwarf/common/dwarf_query.c deleted file mode 100644 index 3f21abd039..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_query.c +++ /dev/null @@ -1,789 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_die_deliv.h" - -/* This is normally reliable. -But not always. -If different compilation -units have different address sizes -this may not give the correct value in all contexts. -If the Elf offset size != address_size -(for example if address_size = 4 but recorded in elf64 object) -this may not give the correct value in all contexts. -*/ -int -dwarf_get_address_size(Dwarf_Debug dbg, - Dwarf_Half * ret_addr_size, Dwarf_Error * error) -{ - Dwarf_Half address_size = 0; - - if (dbg == 0) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - address_size = dbg->de_pointer_size; - *ret_addr_size = address_size; - return DW_DLV_OK; -} - -/* This will be correct in all contexts where the - CU context of a DIE is known. -*/ -int -dwarf_get_die_address_size(Dwarf_Die die, - Dwarf_Half * ret_addr_size, Dwarf_Error * error) -{ - Dwarf_Half address_size = 0; - CHECK_DIE(die, DW_DLV_ERROR); - address_size = die->di_cu_context->cc_address_size; - *ret_addr_size = address_size; - return DW_DLV_OK; -} - -int -dwarf_dieoffset(Dwarf_Die die, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - CHECK_DIE(die, DW_DLV_ERROR); - - *ret_offset = (die->di_debug_info_ptr - - die->di_cu_context->cc_dbg->de_debug_info.dss_data); - return DW_DLV_OK; -} - - -/* - This function returns the offset of - the die relative to the start of its - compilation-unit rather than .debug_info. - Returns DW_DLV_ERROR on error. -*/ -int -dwarf_die_CU_offset(Dwarf_Die die, - Dwarf_Off * cu_off, Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - cu_context = die->di_cu_context; - - *cu_off = - (die->di_debug_info_ptr - cu_context->cc_dbg->de_debug_info.dss_data - - cu_context->cc_debug_info_offset); - return DW_DLV_OK; -} - -/* - This function returns the global offset - (meaning the section offset) and length of - the CU that this die is a part of. - Used for correctness checking by dwarfdump. -*/ -int -dwarf_die_CU_offset_range(Dwarf_Die die, - Dwarf_Off * cu_off, - Dwarf_Off * cu_length, - Dwarf_Error * error) -{ - Dwarf_CU_Context cu_context = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - cu_context = die->di_cu_context; - - *cu_off = cu_context->cc_debug_info_offset; - *cu_length = cu_context->cc_length + cu_context->cc_length_size - + cu_context->cc_extension_size; - return DW_DLV_OK; -} - - - -int -dwarf_tag(Dwarf_Die die, Dwarf_Half * tag, Dwarf_Error * error) -{ - CHECK_DIE(die, DW_DLV_ERROR); - *tag = (die->di_abbrev_list->ab_tag); - return DW_DLV_OK; -} - - -int -dwarf_attrlist(Dwarf_Die die, - Dwarf_Attribute ** attrbuf, - Dwarf_Signed * attrcnt, Dwarf_Error * error) -{ - Dwarf_Word attr_count = 0; - Dwarf_Word i = 0; - Dwarf_Half attr = 0; - Dwarf_Half attr_form = 0; - Dwarf_Byte_Ptr abbrev_ptr = 0; - Dwarf_Abbrev_List abbrev_list = 0; - Dwarf_Attribute new_attr = 0; - Dwarf_Attribute head_attr = NULL; - Dwarf_Attribute curr_attr = NULL; - Dwarf_Attribute *attr_ptr = 0; - Dwarf_Debug dbg = 0; - Dwarf_Byte_Ptr info_ptr = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - - abbrev_list = _dwarf_get_abbrev_for_code(die->di_cu_context, - die->di_abbrev_list-> - ab_code); - if (abbrev_list == NULL) { - _dwarf_error(dbg, error, DW_DLE_DIE_ABBREV_BAD); - return (DW_DLV_ERROR); - } - abbrev_ptr = abbrev_list->ab_abbrev_ptr; - - info_ptr = die->di_debug_info_ptr; - SKIP_LEB128_WORD(info_ptr); - - do { - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr = (Dwarf_Half) utmp2; - DECODE_LEB128_UWORD(abbrev_ptr, utmp2); - attr_form = (Dwarf_Half) utmp2; - - if (attr != 0) { - new_attr = - (Dwarf_Attribute) _dwarf_get_alloc(dbg, DW_DLA_ATTR, 1); - if (new_attr == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form_direct = attr_form; - new_attr->ar_attribute_form = attr_form; - if (attr_form == DW_FORM_indirect) { - Dwarf_Unsigned utmp6; - - /* DECODE_LEB128_UWORD does info_ptr update */ - DECODE_LEB128_UWORD(info_ptr, utmp6); - attr_form = (Dwarf_Half) utmp6; - new_attr->ar_attribute_form = attr_form; - } - new_attr->ar_cu_context = die->di_cu_context; - new_attr->ar_debug_info_ptr = info_ptr; - - { - Dwarf_Unsigned sov = _dwarf_get_size_of_val(dbg, - attr_form, - die->di_cu_context->cc_address_size, - info_ptr, - die->di_cu_context->cc_length_size); - info_ptr += sov; - } - - - if (head_attr == NULL) - head_attr = curr_attr = new_attr; - else { - curr_attr->ar_next = new_attr; - curr_attr = new_attr; - } - attr_count++; - } - } while (attr != 0 || attr_form != 0); - - if (attr_count == 0) { - *attrbuf = NULL; - *attrcnt = 0; - return (DW_DLV_NO_ENTRY); - } - - attr_ptr = (Dwarf_Attribute *) - _dwarf_get_alloc(dbg, DW_DLA_LIST, attr_count); - if (attr_ptr == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - curr_attr = head_attr; - for (i = 0; i < attr_count; i++) { - *(attr_ptr + i) = curr_attr; - curr_attr = curr_attr->ar_next; - } - - *attrbuf = attr_ptr; - *attrcnt = attr_count; - return (DW_DLV_OK); -} - - -/* - This function takes a die, and an attr, and returns - a pointer to the start of the value of that attr in - the given die in the .debug_info section. The form - is returned in *attr_form. - - Returns NULL on error, or if attr is not found. - However, *attr_form is 0 on error, and positive - otherwise. -*/ -static Dwarf_Byte_Ptr -_dwarf_get_value_ptr(Dwarf_Die die, - Dwarf_Half attr, Dwarf_Half * attr_form) -{ - Dwarf_Byte_Ptr abbrev_ptr = 0; - Dwarf_Abbrev_List abbrev_list; - Dwarf_Half curr_attr = 0; - Dwarf_Half curr_attr_form = 0; - Dwarf_Byte_Ptr info_ptr = 0; - - abbrev_list = _dwarf_get_abbrev_for_code(die->di_cu_context, - die->di_abbrev_list->ab_code); - if (abbrev_list == NULL) { - *attr_form = 0; - return (NULL); - } - abbrev_ptr = abbrev_list->ab_abbrev_ptr; - - info_ptr = die->di_debug_info_ptr; - SKIP_LEB128_WORD(info_ptr); - - do { - Dwarf_Unsigned utmp3; - - DECODE_LEB128_UWORD(abbrev_ptr, utmp3); - curr_attr = (Dwarf_Half) utmp3; - DECODE_LEB128_UWORD(abbrev_ptr, utmp3); - curr_attr_form = (Dwarf_Half) utmp3; - if (curr_attr_form == DW_FORM_indirect) { - Dwarf_Unsigned utmp6; - - /* DECODE_LEB128_UWORD updates info_ptr */ - DECODE_LEB128_UWORD(info_ptr, utmp6); - curr_attr_form = (Dwarf_Half) utmp6; - } - - if (curr_attr == attr) { - *attr_form = curr_attr_form; - return (info_ptr); - } - - info_ptr += _dwarf_get_size_of_val(die->di_cu_context->cc_dbg, - curr_attr_form, - die->di_cu_context->cc_address_size, - info_ptr, - die->di_cu_context->cc_length_size); - } while (curr_attr != 0 || curr_attr_form != 0); - - *attr_form = 1; - return (NULL); -} - - -int -dwarf_diename(Dwarf_Die die, char **ret_name, Dwarf_Error * error) -{ - Dwarf_Half attr_form = 0; - Dwarf_Debug dbg = 0; - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Unsigned string_offset = 0; - int res = DW_DLV_ERROR; - - CHECK_DIE(die, DW_DLV_ERROR); - - info_ptr = _dwarf_get_value_ptr(die, DW_AT_name, &attr_form); - if (info_ptr == NULL) { - if (attr_form == 0) { - _dwarf_error(die->di_cu_context->cc_dbg, error, - DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - return DW_DLV_NO_ENTRY; - } - - if (attr_form == DW_FORM_string) { - *ret_name = (char *) (info_ptr); - return DW_DLV_OK; - } - - dbg = die->di_cu_context->cc_dbg; - if (attr_form != DW_FORM_strp) { - _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); - } - - READ_UNALIGNED(dbg, string_offset, Dwarf_Unsigned, - info_ptr, die->di_cu_context->cc_length_size); - - if (string_offset >= dbg->de_debug_str.dss_size) { - _dwarf_error(dbg, error, DW_DLE_STRING_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_str,error); - if (res != DW_DLV_OK) { - return res; - } - - *ret_name = (char *) (dbg->de_debug_str.dss_data + string_offset); - return DW_DLV_OK; -} - - -int -dwarf_hasattr(Dwarf_Die die, - Dwarf_Half attr, - Dwarf_Bool * return_bool, Dwarf_Error * error) -{ - Dwarf_Half attr_form = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - - if (_dwarf_get_value_ptr(die, attr, &attr_form) == NULL) { - if (attr_form == 0) { - _dwarf_error(die->di_cu_context->cc_dbg, error, - DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - *return_bool = false; - return DW_DLV_OK; - } - - *return_bool = (true); - return DW_DLV_OK; -} - - -int -dwarf_attr(Dwarf_Die die, - Dwarf_Half attr, - Dwarf_Attribute * ret_attr, Dwarf_Error * error) -{ - Dwarf_Half attr_form = 0; - Dwarf_Attribute attrib = 0; - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Debug dbg = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - - info_ptr = _dwarf_get_value_ptr(die, attr, &attr_form); - if (info_ptr == NULL) { - if (attr_form == 0) { - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - return DW_DLV_NO_ENTRY; - } - - attrib = (Dwarf_Attribute) _dwarf_get_alloc(dbg, DW_DLA_ATTR, 1); - if (attrib == NULL) { - _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (DW_DLV_ERROR); - } - - attrib->ar_attribute = attr; - attrib->ar_attribute_form = attr_form; - attrib->ar_attribute_form_direct = attr_form; - attrib->ar_cu_context = die->di_cu_context; - attrib->ar_debug_info_ptr = info_ptr; - *ret_attr = (attrib); - return DW_DLV_OK; -} - - -int -dwarf_lowpc(Dwarf_Die die, - Dwarf_Addr * return_addr, Dwarf_Error * error) -{ - Dwarf_Addr ret_addr = 0; - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Half attr_form = 0; - Dwarf_Debug dbg = 0; - Dwarf_Half address_size = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - - dbg = die->di_cu_context->cc_dbg; - address_size = die->di_cu_context->cc_address_size; - info_ptr = _dwarf_get_value_ptr(die, DW_AT_low_pc, &attr_form); - if ((info_ptr == NULL && attr_form == 0) || - (info_ptr != NULL && attr_form != DW_FORM_addr)) { - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - if (info_ptr == NULL) { - return (DW_DLV_NO_ENTRY); - } - - - READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr, - info_ptr, address_size); - - *return_addr = ret_addr; - return (DW_DLV_OK); -} - - -int -dwarf_highpc(Dwarf_Die die, - Dwarf_Addr * return_addr, Dwarf_Error * error) -{ - Dwarf_Addr ret_addr = 0; - Dwarf_Byte_Ptr info_ptr = 0; - Dwarf_Half attr_form = 0; - Dwarf_Debug dbg = 0; - Dwarf_Half address_size = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - dbg = die->di_cu_context->cc_dbg; - address_size = die->di_cu_context->cc_address_size; - info_ptr = _dwarf_get_value_ptr(die, DW_AT_high_pc, &attr_form); - if ((info_ptr == NULL && attr_form == 0) || - (info_ptr != NULL && attr_form != DW_FORM_addr)) { - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - if (info_ptr == NULL) { - return (DW_DLV_NO_ENTRY); - } - - READ_UNALIGNED(dbg, ret_addr, Dwarf_Addr, - info_ptr, address_size); - - *return_addr = ret_addr; - return (DW_DLV_OK); -} - - -/* - Takes a die, an attribute attr, and checks if attr - occurs in die. Attr is required to be an attribute - whose form is in the "constant" class. If attr occurs - in die, the value is returned. - Returns DW_DLV_OK, DW_DLV_ERROR, or DW_DLV_NO_ENTRY as - appropriate. Sets the value thru the pointer return_val. - This function is meant to do all the - processing for dwarf_bytesize, dwarf_bitsize, dwarf_bitoffset, - and dwarf_srclang. -*/ -static int -_dwarf_die_attr_unsigned_constant(Dwarf_Die die, - Dwarf_Half attr, - Dwarf_Unsigned * return_val, - Dwarf_Error * error) -{ - Dwarf_Byte_Ptr info_ptr; - Dwarf_Half attr_form; - Dwarf_Unsigned ret_value; - Dwarf_Debug dbg; - - CHECK_DIE(die, DW_DLV_ERROR); - - dbg = die->di_cu_context->cc_dbg; - info_ptr = _dwarf_get_value_ptr(die, attr, &attr_form); - if (info_ptr != NULL) { - switch (attr_form) { - - case DW_FORM_data1: - *return_val = (*(Dwarf_Small *) info_ptr); - return (DW_DLV_OK); - - case DW_FORM_data2: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_Shalf)); - *return_val = ret_value; - return (DW_DLV_OK); - - case DW_FORM_data4: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_sfixed)); - *return_val = ret_value; - return (DW_DLV_OK); - - case DW_FORM_data8: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - info_ptr, sizeof(Dwarf_Unsigned)); - *return_val = ret_value; - return (DW_DLV_OK); - - case DW_FORM_udata: - *return_val = (_dwarf_decode_u_leb128(info_ptr, NULL)); - return (DW_DLV_OK); - - default: - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - } - if (attr_form == 0) { - _dwarf_error(dbg, error, DW_DLE_DIE_BAD); - return (DW_DLV_ERROR); - } - return DW_DLV_NO_ENTRY; -} - - -int -dwarf_bytesize(Dwarf_Die die, - Dwarf_Unsigned * ret_size, Dwarf_Error * error) -{ - Dwarf_Unsigned luns = 0; - int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_byte_size, - &luns, error); - *ret_size = luns; - return res; -} - - -int -dwarf_bitsize(Dwarf_Die die, - Dwarf_Unsigned * ret_size, Dwarf_Error * error) -{ - Dwarf_Unsigned luns = 0; - int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_bit_size, - &luns, error); - *ret_size = luns; - return res; -} - - -int -dwarf_bitoffset(Dwarf_Die die, - Dwarf_Unsigned * ret_size, Dwarf_Error * error) -{ - Dwarf_Unsigned luns = 0; - int res = _dwarf_die_attr_unsigned_constant(die, - DW_AT_bit_offset, &luns, error); - *ret_size = luns; - return res; -} - - -/* Refer section 3.1, page 21 in Dwarf Definition. */ -int -dwarf_srclang(Dwarf_Die die, - Dwarf_Unsigned * ret_size, Dwarf_Error * error) -{ - Dwarf_Unsigned luns = 0; - int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_language, - &luns, error); - *ret_size = luns; - return res; -} - - -/* Refer section 5.4, page 37 in Dwarf Definition. */ -int -dwarf_arrayorder(Dwarf_Die die, - Dwarf_Unsigned * ret_size, Dwarf_Error * error) -{ - Dwarf_Unsigned luns = 0; - int res = _dwarf_die_attr_unsigned_constant(die, DW_AT_ordering, - &luns, error); - *ret_size = luns; - return res; -} - -/* - Return DW_DLV_OK if ok - DW_DLV_ERROR if failure. - - If the die and the attr are not related the result is - meaningless. -*/ -int -dwarf_attr_offset(Dwarf_Die die, Dwarf_Attribute attr, - Dwarf_Off * offset /* return offset thru this ptr */, - Dwarf_Error * error) -{ - Dwarf_Off attroff = 0; - - CHECK_DIE(die, DW_DLV_ERROR); - - attroff = (attr->ar_debug_info_ptr - - die->di_cu_context->cc_dbg->de_debug_info.dss_data); - *offset = attroff; - return DW_DLV_OK; -} - -int -dwarf_die_abbrev_code(Dwarf_Die die) -{ - return die->di_abbrev_code; -} - -/* Helper function for finding form class. */ -static enum Dwarf_Form_Class -dw_get_special_offset(Dwarf_Half attrnum) -{ - switch(attrnum) { - case DW_AT_stmt_list: - return DW_FORM_CLASS_LINEPTR; - case DW_AT_macro_info: - return DW_FORM_CLASS_MACPTR; - case DW_AT_ranges: - return DW_FORM_CLASS_RANGELISTPTR; - case DW_AT_location: - case DW_AT_string_length: - case DW_AT_return_addr: - case DW_AT_data_member_location: - case DW_AT_frame_base: - case DW_AT_segment: - case DW_AT_static_link: - case DW_AT_use_location: - case DW_AT_vtable_elem_location: - return DW_FORM_CLASS_LOCLISTPTR; - case DW_AT_sibling: - case DW_AT_byte_size : - case DW_AT_bit_offset : - case DW_AT_bit_size : - case DW_AT_discr : - case DW_AT_import : - case DW_AT_common_reference: - case DW_AT_containing_type: - case DW_AT_default_value: - case DW_AT_lower_bound: - case DW_AT_bit_stride: - case DW_AT_upper_bound: - case DW_AT_abstract_origin: - case DW_AT_base_types: - case DW_AT_count: - case DW_AT_friend: - case DW_AT_namelist_item: - case DW_AT_priority: - case DW_AT_specification: - case DW_AT_type: - case DW_AT_allocated: - case DW_AT_associated: - case DW_AT_byte_stride: - case DW_AT_extension: - case DW_AT_trampoline: - case DW_AT_small: - case DW_AT_object_pointer: - case DW_AT_signature: - return DW_FORM_CLASS_REFERENCE; - case DW_AT_MIPS_fde: /* SGI/IRIX extension */ - return DW_FORM_CLASS_FRAMEPTR; - } - return DW_FORM_CLASS_UNKNOWN; -} - -/* It takes 4 pieces of data (including the FORM) - to accurately determine the form 'class' as documented - in the DWARF spec. This is per DWARF4, but will work - for DWARF2 or 3 as well. */ -enum Dwarf_Form_Class dwarf_get_form_class( - Dwarf_Half dwversion, - Dwarf_Half attrnum, - Dwarf_Half offset_size, - Dwarf_Half form) -{ - switch(form) { - case DW_FORM_addr: return DW_FORM_CLASS_ADDRESS; - - case DW_FORM_data2: return DW_FORM_CLASS_CONSTANT; - - case DW_FORM_data4: - if(dwversion <= 3 && offset_size == 4) { - enum Dwarf_Form_Class class = dw_get_special_offset(attrnum); - if(class != DW_FORM_CLASS_UNKNOWN) { - return class; - } - } - return DW_FORM_CLASS_CONSTANT; - case DW_FORM_data8: - if(dwversion <= 3 && offset_size == 8) { - enum Dwarf_Form_Class class = dw_get_special_offset(attrnum); - if(class != DW_FORM_CLASS_UNKNOWN) { - return class; - } - } - return DW_FORM_CLASS_CONSTANT; - - case DW_FORM_sec_offset: - { - enum Dwarf_Form_Class class = dw_get_special_offset(attrnum); - if(class != DW_FORM_CLASS_UNKNOWN) { - return class; - } - } - /* We do not know what this is. */ - break; - - case DW_FORM_string: return DW_FORM_CLASS_STRING; - case DW_FORM_strp: return DW_FORM_CLASS_STRING; - - case DW_FORM_block: return DW_FORM_CLASS_BLOCK; - case DW_FORM_block1: return DW_FORM_CLASS_BLOCK; - case DW_FORM_block2: return DW_FORM_CLASS_BLOCK; - case DW_FORM_block4: return DW_FORM_CLASS_BLOCK; - - case DW_FORM_data1: return DW_FORM_CLASS_CONSTANT; - case DW_FORM_sdata: return DW_FORM_CLASS_CONSTANT; - case DW_FORM_udata: return DW_FORM_CLASS_CONSTANT; - - case DW_FORM_ref_addr: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref1: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref2: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref4: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref8: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref_udata: return DW_FORM_CLASS_REFERENCE; - case DW_FORM_ref_sig8: return DW_FORM_CLASS_REFERENCE; - - case DW_FORM_exprloc: return DW_FORM_CLASS_EXPRLOC; - - case DW_FORM_flag: return DW_FORM_CLASS_FLAG; - case DW_FORM_flag_present: return DW_FORM_CLASS_FLAG; - - - case DW_FORM_indirect: - default: - break; - }; - return DW_FORM_CLASS_UNKNOWN; -} - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_ranges.c b/usr/src/tools/ctf/dwarf/common/dwarf_ranges.c deleted file mode 100644 index ae6d5cf9b5..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_ranges.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - - Copyright (C) 2008-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - -#include "config.h" -#include <stdlib.h> -#include "dwarf_incl.h" - -struct ranges_entry { - struct ranges_entry *next; - Dwarf_Ranges cur; -}; - - -#define MAX_ADDR ((address_size == 8)?0xffffffffffffffffULL:0xffffffff) -int dwarf_get_ranges_a(Dwarf_Debug dbg, - Dwarf_Off rangesoffset, - Dwarf_Die die, - Dwarf_Ranges ** rangesbuf, - Dwarf_Signed * listlen, - Dwarf_Unsigned * bytecount, - Dwarf_Error * error) -{ - Dwarf_Small *rangeptr = 0; - Dwarf_Small *beginrangeptr = 0; - Dwarf_Small *section_end = 0; - unsigned entry_count = 0; - struct ranges_entry *base = 0; - struct ranges_entry *last = 0; - struct ranges_entry *curre = 0; - Dwarf_Ranges * ranges_data_out = 0; - unsigned copyindex = 0; - Dwarf_Half address_size = 0; - int res = DW_DLV_ERROR; - - res = _dwarf_load_section(dbg, &dbg->de_debug_ranges,error); - if (res != DW_DLV_OK) { - return res; - } - if(rangesoffset >= dbg->de_debug_ranges.dss_size) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_RANGES_OFFSET_BAD); - return (DW_DLV_ERROR); - - } - address_size = _dwarf_get_address_size(dbg, die); - section_end = dbg->de_debug_ranges.dss_data + - dbg->de_debug_ranges.dss_size; - rangeptr = dbg->de_debug_ranges.dss_data + rangesoffset; - beginrangeptr = rangeptr; - - for(;;) { - struct ranges_entry * re = calloc(sizeof(struct ranges_entry),1); - if(!re) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_RANGES_OUT_OF_MEM); - return (DW_DLV_ERROR); - } - if(rangeptr >= section_end) { - return (DW_DLV_NO_ENTRY); - } - if((rangeptr + (2*address_size)) > section_end) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_RANGES_OFFSET_BAD); - return (DW_DLV_ERROR); - } - entry_count++; - READ_UNALIGNED(dbg,re->cur.dwr_addr1, - Dwarf_Addr, rangeptr, - address_size); - rangeptr += address_size; - READ_UNALIGNED(dbg,re->cur.dwr_addr2 , - Dwarf_Addr, rangeptr, - address_size); - rangeptr += address_size; - if(!base) { - base = re; - last = re; - } else { - last->next = re; - last = re; - } - if(re->cur.dwr_addr1 == 0 && re->cur.dwr_addr2 == 0) { - re->cur.dwr_type = DW_RANGES_END; - break; - } else if ( re->cur.dwr_addr1 == MAX_ADDR) { - re->cur.dwr_type = DW_RANGES_ADDRESS_SELECTION; - } else { - re->cur.dwr_type = DW_RANGES_ENTRY; - } - } - - ranges_data_out = (Dwarf_Ranges *) - _dwarf_get_alloc(dbg,DW_DLA_RANGES,entry_count); - if(!ranges_data_out) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_RANGES_OUT_OF_MEM); - return (DW_DLV_ERROR); - } - curre = base; - *rangesbuf = ranges_data_out; - *listlen = entry_count; - for( copyindex = 0; curre && (copyindex < entry_count); - ++copyindex,++ranges_data_out) { - - struct ranges_entry *r = curre; - *ranges_data_out = curre->cur; - curre = curre->next; - free(r); - } - /* Callers will often not care about the bytes used. */ - if(bytecount) { - *bytecount = rangeptr - beginrangeptr; - } - return DW_DLV_OK; -} -int dwarf_get_ranges(Dwarf_Debug dbg, - Dwarf_Off rangesoffset, - Dwarf_Ranges ** rangesbuf, - Dwarf_Signed * listlen, - Dwarf_Unsigned * bytecount, - Dwarf_Error * error) -{ - Dwarf_Die die = 0; - int res = dwarf_get_ranges_a(dbg,rangesoffset,die, - rangesbuf,listlen,bytecount,error); - return res; -} - -void -dwarf_ranges_dealloc(Dwarf_Debug dbg, Dwarf_Ranges * rangesbuf, - Dwarf_Signed rangecount) -{ - dwarf_dealloc(dbg,rangesbuf, DW_DLA_RANGES); - -} - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_sort_line.c b/usr/src/tools/ctf/dwarf/common/dwarf_sort_line.c deleted file mode 100644 index 3576614129..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_sort_line.c +++ /dev/null @@ -1,733 +0,0 @@ -/* - Copyright (C) 2000,2002,2004,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - -/* This file was designed for SGI IRIX compiler use. - The static linker can rearrange the order of functions - in the layout in memory - and provided each has the right form - this will (when called by the SGI IRIX - static linker) rearrange the table so the line table - is arranged in the same order as the memory layout. */ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include <stdlib.h> -#include "dwarf_line.h" -#ifdef HAVE_ALLOCA_H -#include <alloca.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#define MINIMUM_POSSIBLE_PROLOG_LEN 10 /* 10 is based on */ - /* the definition of the DWARF2/3 line table prolog. The value - here should be >8 (accounting for a 64 bit read) and <= the - length of a legal DWARF2/3 line prolog, which is at least 10 - bytes long (but can be longer). What this constant helps - avoid is reading past the end of a malloc'd buffer in - _dwarf_update_line_sec(). */ - -static int - _dwarf_update_line_sec(Dwarf_Small * line_ptr, - unsigned long remaining_bytes, - int *any_change, - int length_size, - int *err_code, Dwarf_Small ** new_line_ptr); - -/* Used to construct - a linked list of so we can sort and reorder the line info. -*/ -struct a_line_area { - Dwarf_Addr ala_address; /* from DW_LNE_set_address */ - Dwarf_Unsigned ala_offset; /* byte offset in buffer */ - Dwarf_Unsigned ala_length; /* byte length in buffer */ - long ala_entry_num; /* to guarantee stable sort */ - struct a_line_area *ala_next; -}; - - -/* - Written to support the SGI IRIX static linker. - It helps SGI IRIX ld - rearrange lines in .debug_line in a .o created with a text - section per function. The SGI IRIX linker option is: - -OPT:procedure_reorder=ON - where ld-cord (cord(1)ing by ld, - not by cord(1)) may have changed the function order. - - Returns - DW_DLV_OK if nothing went wrong. - DW_DLV_ERROR if could not do anything due to - error. the original buffer is unchanged. - - is_64_bit must be passed in by caller and tells - if this is a 32 or 64bit pointer object section - being processed. - - err_code must be a non-null pointer to integer. - If DW_DLV_ERROR is returned that integer is set - to a dwarf error code so the caller may - print it for diagnostic purposes. - - *any_change is set here - set 0 if no sorting (movement) done. - set 1 if some sorting (movement) done. - on all returns. On error return sets to 0. - - The _dwarf name form is now obsolete, - the dwarf_ name for is preferred. - Both names supported. - -*/ -int -_dwarf_ld_sort_lines(void *orig_buffer, - unsigned long buffer_len, - int is_64_bit, int *any_change, int *err_code) -{ - return dwarf_ld_sort_lines(orig_buffer,buffer_len, - is_64_bit,any_change,err_code); -} -int -dwarf_ld_sort_lines(void *orig_buffer, - unsigned long buffer_len, - int is_64_bit, int *any_change, int *err_code) -{ - - int length_size = 4; - Dwarf_Small *orig_line_ptr; /* our local copy of the user's input - buffer */ - Dwarf_Small *line_ptr; /* starts at orig_line_ptr, gets - incremented thru to end of our copy - of the input buffer */ - Dwarf_Small *new_line_ptr; /* output of _dwarf_update_line_sec(), - used to update line_ptr as we pass - thru compilation units in a .o - .debug_line */ - - unsigned long remaining_bytes = buffer_len; /* total length of - original area left - to be processed. - Changes as we pass - thru compilation - units in a .o - .debug_line */ - - int sec_res; - int lany_change = 0; - int did_change = 0; - - if (is_64_bit) - length_size = 8; - - *any_change = 0; - line_ptr = malloc(buffer_len); - if (!line_ptr) { - *err_code = DW_DLE_ALLOC_FAIL; - return DW_DLV_ERROR; - } - orig_line_ptr = line_ptr; - memcpy(line_ptr, orig_buffer, buffer_len); - - - /* - We must iterate thru each of a set of prologues and line data. - We process each set in turn. If all pass, we update the - passed-in buffer. */ - sec_res = DW_DLV_OK; - - for (sec_res = _dwarf_update_line_sec(line_ptr, - remaining_bytes, - &lany_change, - length_size, - err_code, - &new_line_ptr); - (sec_res == DW_DLV_OK) && (remaining_bytes > 0); - sec_res = _dwarf_update_line_sec(line_ptr, - remaining_bytes, - &lany_change, - length_size, - err_code, &new_line_ptr)) { - long bytes_used = new_line_ptr - line_ptr; - - line_ptr = new_line_ptr; - remaining_bytes -= bytes_used; - if (lany_change) { - did_change = 1; - } - if (remaining_bytes > 0) { - continue; - } - break; - } - if (sec_res == DW_DLV_ERROR) { - free(orig_line_ptr); - return sec_res; - } - - - /* all passed */ - if (did_change) { - /* So update the passed in buffer orig_buffer is caller's input - area. orig_line_ptr is our modified copy of input area. */ - memcpy(orig_buffer, orig_line_ptr, buffer_len); - *any_change = 1; - } - free(orig_line_ptr); - - return sec_res; -} - - -/* By setting ala_entry_num we guarantee a stable sort, - no duplicates - Sorting in address order. -*/ -static int -cmpr(const void *lin, const void *rin) -{ - const struct a_line_area *l = lin; - const struct a_line_area *r = rin; - - if (l->ala_address < r->ala_address) { - return -1; - } - if (l->ala_address > r->ala_address) { - return 1; - } - if (l->ala_entry_num < r->ala_entry_num) { - return -1; - } - if (l->ala_entry_num > r->ala_entry_num) { - return 1; - } - return 0; /* should never happen. */ -} - -/* The list of line area records is no longer needed. - Free the data allocated. */ -static void -free_area_data(struct a_line_area *arp) -{ - while(arp) { - struct a_line_area *next = arp->ala_next; - free(arp); - arp = next; - } -} - -/* - On entry: - line_ptr must point to first - byte of a line group for one (original) .o - - remaining_bytes is the size of the area pointed to - by line_ptr: may be larger than the - current original compilation unit . - - length size is 4 for 32bit pointers, 8 for 64bit pointers - in the data pointed to. - - - On return: - return DW_DLV_OK if all ok. (ignore - *err_code in this case) - - return DW_DLV_ERROR and set *err_code if an error. - - If some line data was moved around, set *any_change to 1. - If error or no movement, set *any_change to 0; - - Set *new_line_ptr to one-byte-past the end of the - current original compilation unit (not necessary - if returning DW_DLV_ERROR, but not harmful). - - - This copies the entire array to a malloc area, then - mallocs pieces of it (another malloc) for sorting a CU entries - and copying back. Then at end the whole new thing copied in. - The result is that on error, the input is not touched. - - An alternative would be to just update a piece at a time - and on error stop updating but leave what was done, done. - This alternative would save some temporary malloc space. - - -*/ -static int -_dwarf_update_line_sec(Dwarf_Small * line_ptr, - unsigned long remaining_bytes, - int *any_change, - int length_size, - int *err_code, Dwarf_Small ** new_line_ptr) -{ - - - /* - This points to the last byte of the .debug_line portion for the - current cu. */ - Dwarf_Small *line_ptr_end = 0; - - /* - This points to the end of the statement program prologue for the - current cu, and serves to check that the prologue was correctly - decoded. */ - - Dwarf_Small *orig_line_ptr = 0; - - /* These are the fields of the statement program header. */ - struct Dwarf_Debug_s dbg_data; - Dwarf_Debug dbg = &dbg_data; - - /* These are the state machine state variables. */ - Dwarf_Addr address = 0; - Dwarf_Word line = 1; - Dwarf_Bool is_stmt = false; - - /* Dwarf_Bool prologue_end; Dwarf_Bool epilogue_begin; */ - Dwarf_Small isa = 0; - - - struct a_line_area *area_base = 0; - struct a_line_area *area_current = 0; - long area_count = 0; - - Dwarf_Addr last_address = 0; - int need_to_sort = 0; - - /* - This is the current opcode read from the statement program. */ - Dwarf_Small opcode = 0; - - - /* - These variables are used to decode leb128 numbers. Leb128_num - holds the decoded number, and leb128_length is its length in - bytes. */ - Dwarf_Word leb128_num = 0; - Dwarf_Sword advance_line = 0; - - /* - This is the operand of the latest fixed_advance_pc extended - opcode. */ - Dwarf_Half fixed_advance_pc = 0; - - /* This is the length of an extended opcode instr. */ - Dwarf_Word instr_length = 0; - Dwarf_Small ext_opcode = 0; - struct Line_Table_Prefix_s prefix; - - - - memset(dbg, 0, sizeof(struct Dwarf_Debug_s)); - dbg->de_copy_word = memcpy; - /* - Following is a straightforward decoding of the statement program - prologue information. */ - *any_change = 0; - - - orig_line_ptr = line_ptr; - if (remaining_bytes < MINIMUM_POSSIBLE_PROLOG_LEN) { - /* We are at the end. Remaining should be zero bytes, padding. - This is really just 'end of CU buffer' not an error. The is - no 'entry' left so report there is none. We don't want to - READ_UNALIGNED the total_length below and then belatedly - discover that we read off the end already. */ - return (DW_DLV_NO_ENTRY); - } - - dwarf_init_line_table_prefix(&prefix); - { - Dwarf_Small *line_ptr_out = 0; - Dwarf_Error error; - int dres = dwarf_read_line_table_prefix(dbg, - line_ptr, - remaining_bytes, - &line_ptr_out, - &prefix, - NULL, NULL,&error, - NULL); - - if (dres == DW_DLV_ERROR) { - dwarf_free_line_table_prefix(&prefix); - *err_code = dwarf_errno(error); - dwarf_dealloc(dbg, error, DW_DLA_ERROR); - free_area_data(area_base); - return dres; - } - if (dres == DW_DLV_NO_ENTRY) { - dwarf_free_line_table_prefix(&prefix); - return dres; - } - line_ptr_end = prefix.pf_line_ptr_end; - - line_ptr = line_ptr_out; - } - - - /* Initialize the state machine. */ - /* file = 1; */ - /* column = 0; */ - is_stmt = prefix.pf_default_is_stmt; - /* basic_block = false; */ - /* end_sequence = false; */ - /* prologue_end = false; */ - /* epilogue_begin = false; */ - isa = 0; - - - /* Start of statement program. */ - while (line_ptr < line_ptr_end) { - int type; - - Dwarf_Small *stmt_prog_entry_start = line_ptr; - - opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - /* 'type' is the output */ - WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base, - prefix.pf_opcode_length_table, line_ptr, - prefix.pf_std_op_count); - - if (type == LOP_DISCARD) { - int oc; - int opcnt = prefix.pf_opcode_length_table[opcode]; - - for (oc = 0; oc < opcnt; oc++) { - /* - ** Read and discard operands we don't - ** understand. - ** arbitrary choice of unsigned read. - ** signed read would work as well. - */ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - } - - } else if (type == LOP_SPECIAL) { - opcode = opcode - prefix.pf_opcode_base; - address = address + prefix.pf_minimum_instruction_length * - (opcode / prefix.pf_line_range); - line = - line + prefix.pf_line_base + - opcode % prefix.pf_line_range; - - /* basic_block = false; */ - - - } else if (type == LOP_STANDARD) { - - - switch (opcode) { - - - case DW_LNS_copy:{ - - /* basic_block = false; */ - break; - } - - case DW_LNS_advance_pc:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - leb128_num = (Dwarf_Word) utmp2; - address = - address + - prefix.pf_minimum_instruction_length * - leb128_num; - break; - } - - case DW_LNS_advance_line:{ - Dwarf_Signed stmp; - - - DECODE_LEB128_SWORD(line_ptr, stmp); - advance_line = (Dwarf_Sword) stmp; - line = line + advance_line; - break; - } - - case DW_LNS_set_file:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - /* file = (Dwarf_Word)utmp2; */ - break; - } - - case DW_LNS_set_column:{ - Dwarf_Unsigned utmp2; - - - DECODE_LEB128_UWORD(line_ptr, utmp2); - /* column = (Dwarf_Word)utmp2; */ - break; - } - - case DW_LNS_negate_stmt:{ - - is_stmt = !is_stmt; - break; - } - - case DW_LNS_set_basic_block:{ - - /* basic_block = true; */ - break; - } - - case DW_LNS_const_add_pc:{ - opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base; - address = - address + - prefix.pf_minimum_instruction_length * (opcode / - prefix. - pf_line_range); - - break; - } - - case DW_LNS_fixed_advance_pc:{ - - READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half, - line_ptr, sizeof(Dwarf_Half)); - line_ptr += sizeof(Dwarf_Half); - address = address + fixed_advance_pc; - break; - } - /* New in DWARF3 */ - case DW_LNS_set_prologue_end:{ - - /* prologue_end = true; */ - break; - - - } - /* New in DWARF3 */ - case DW_LNS_set_epilogue_begin:{ - /* epilogue_begin = true; */ - break; - } - - /* New in DWARF3 */ - case DW_LNS_set_isa:{ - Dwarf_Unsigned utmp2; - - DECODE_LEB128_UWORD(line_ptr, utmp2); - isa = utmp2; - if (isa != utmp2) { - /* The value of the isa did not fit in our - local so we record it wrong. declare an - error. */ - dwarf_free_line_table_prefix(&prefix); - *err_code = DW_DLE_LINE_NUM_OPERANDS_BAD; - free_area_data(area_base); - return (DW_DLV_ERROR); - } - break; - } - - } - } else if (type == LOP_EXTENDED) { - - Dwarf_Unsigned utmp3; - - DECODE_LEB128_UWORD(line_ptr, utmp3); - instr_length = (Dwarf_Word) utmp3; - ext_opcode = *(Dwarf_Small *) line_ptr; - line_ptr++; - switch (ext_opcode) { - - case DW_LNE_end_sequence:{ - /* end_sequence = true; */ - - address = 0; - /* file = 1; */ - line = 1; - /* column = 0; */ - is_stmt = prefix.pf_default_is_stmt; - /* basic_block = false; */ - /* end_sequence = false; */ - /* prologue_end = false; */ - /* epilogue_begin = false; */ - break; - } - - case DW_LNE_set_address:{ - { - struct a_line_area *area; - - READ_UNALIGNED(dbg, address, Dwarf_Addr, - line_ptr, length_size); - /* Here we need to remember the offset into the - buffer and check to see if address went - down. */ - if (address < last_address) { - need_to_sort = 1; - } - last_address = address; - - area = malloc(sizeof(struct a_line_area)); - area->ala_address = address; - area->ala_offset = stmt_prog_entry_start - - orig_line_ptr; - area->ala_entry_num = area_count; - area->ala_next = 0; - area->ala_length = 0; - if (area_current) { - area_current->ala_next = area; - area_current->ala_length = - area->ala_offset - - area_current->ala_offset; - } - ++area_count; - area_current = area; - if (area_base == 0) { - area_base = area; - } - - line_ptr += length_size; - } - break; - } - - case DW_LNE_define_file:{ - break; - } - - default:{ - Dwarf_Unsigned remaining_bytes = instr_length -1; - line_ptr += remaining_bytes; - break; - } - } - - } - } - - - *new_line_ptr = line_ptr; - if (!need_to_sort) { - dwarf_free_line_table_prefix(&prefix); - free_area_data(area_base); - return (DW_DLV_OK); - } - - /* So now we have something to sort. First, finish off the last - area record: */ - area_current->ala_length = (line_ptr - orig_line_ptr) - -area_current->ala_offset; - - /* Build and sort a simple array of sections. Forcing a stable sort - by comparing on sequence number. We will use the sorted list to - move sections of this part of the line table. Each 'section' - starting with a DW_LNE_set_address opcode, on the assumption - that such only get out of order where there was an ld-cord - function rearrangement and that it is meaningful to restart the - line info there. */ - { - struct a_line_area *ala_array; - struct a_line_area *local; - long start_len; - Dwarf_Small *new_area; - long i; - - ala_array = malloc(area_count * sizeof(struct a_line_area)); - if (!ala_array) { - dwarf_free_line_table_prefix(&prefix); - *err_code = DW_DLE_ALLOC_FAIL; - free_area_data(area_base); - return DW_DLV_ERROR; - } - - for (local = area_base, i = 0; local; - local = local->ala_next, ++i) { - - ala_array[i] = *local; - } - free_area_data(area_base); - /* Zero the stale pointers so we don't use them accidentally. */ - area_base = 0; - area_current = 0; - - qsort(ala_array, area_count, sizeof(struct a_line_area), cmpr); - - /* Now we must rearrange the pieces of the line table. */ - - start_len = - (prefix.pf_line_prologue_start + - prefix.pf_prologue_length) - orig_line_ptr; - new_area = malloc(remaining_bytes); - if (!new_area) { - free(ala_array); - *err_code = DW_DLE_ALLOC_FAIL; - dwarf_free_line_table_prefix(&prefix); - return DW_DLV_ERROR; - } - memcpy(new_area, orig_line_ptr, start_len); - line_ptr = new_area + start_len; - for (i = 0; i < area_count; ++i) { - memcpy(line_ptr, orig_line_ptr + - ala_array[i].ala_offset, ala_array[i].ala_length); - line_ptr += ala_array[i].ala_length; - } - - memcpy(orig_line_ptr, new_area, remaining_bytes); - - free(new_area); - free(ala_array); - ala_array = 0; - new_area = 0; - } - - *any_change = 1; - dwarf_free_line_table_prefix(&prefix); - return (DW_DLV_OK); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_string.c b/usr/src/tools/ctf/dwarf/common/dwarf_string.c deleted file mode 100644 index fafa5a097c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_string.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - - Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" - -int -dwarf_get_str(Dwarf_Debug dbg, - Dwarf_Off offset, - char **string, - Dwarf_Signed * returned_str_len, Dwarf_Error * error) -{ - int res = DW_DLV_ERROR; - - if (dbg == NULL) { - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - - if (offset == dbg->de_debug_str.dss_size) { - /* Normal (if we've iterated thru the set of strings using - dwarf_get_str and are at the end). */ - return DW_DLV_NO_ENTRY; - } - if (offset > dbg->de_debug_str.dss_size) { - _dwarf_error(dbg, error, DW_DLE_DEBUG_STR_OFFSET_BAD); - return (DW_DLV_ERROR); - } - - if (string == NULL) { - _dwarf_error(dbg, error, DW_DLE_STRING_PTR_NULL); - return (DW_DLV_ERROR); - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_str,error); - if (res != DW_DLV_OK) { - return res; - } - - *string = (char *) dbg->de_debug_str.dss_data + offset; - - *returned_str_len = (strlen(*string)); - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_stubs.c b/usr/src/tools/ctf/dwarf/common/dwarf_stubs.c deleted file mode 100644 index f2c1f7fd45..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_stubs.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> - - - - /*ARGSUSED*/ int -dwarf_nextglob(Dwarf_Debug dbg, - Dwarf_Global glob, - Dwarf_Global * returned_nextglob, Dwarf_Error * error) -{ - return (DW_DLV_NO_ENTRY); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_types.c b/usr/src/tools/ctf/dwarf/common/dwarf_types.c deleted file mode 100644 index d547805289..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_types.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_types.h" -#include "dwarf_global.h" - -int -dwarf_get_types(Dwarf_Debug dbg, - Dwarf_Type ** types, - Dwarf_Signed * ret_type_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_typenames,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_typenames.dss_data, - dbg->de_debug_typenames.dss_size, - (Dwarf_Global **) types, /* type punning, Dwarf_Type is - never a completed type */ - ret_type_count, - error, - DW_DLA_TYPENAME_CONTEXT, - DW_DLA_TYPENAME, - DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD, - DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR); -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_types_dealloc(Dwarf_Debug dbg, Dwarf_Type * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl, - count, - DW_DLA_TYPENAME_CONTEXT, - DW_DLA_TYPENAME, DW_DLA_LIST); - return; -} - - -int -dwarf_typename(Dwarf_Type type_in, char **ret_name, Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - if (type == NULL) { - _dwarf_error(NULL, error, DW_DLE_TYPE_NULL); - return (DW_DLV_ERROR); - } - - *ret_name = (char *) (type->gl_name); - return DW_DLV_OK; -} - - -int -dwarf_type_die_offset(Dwarf_Type type_in, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - return dwarf_global_die_offset(type, ret_offset, error); -} - - -int -dwarf_type_cu_offset(Dwarf_Type type_in, - Dwarf_Off * ret_offset, Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - - return dwarf_global_cu_offset(type, ret_offset, error); -} - - -int -dwarf_type_name_offsets(Dwarf_Type type_in, - char **returned_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_die_offset, Dwarf_Error * error) -{ - Dwarf_Global type = (Dwarf_Global) type_in; - return dwarf_global_name_offsets(type, - returned_name, - die_offset, cu_die_offset, error); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_types.h b/usr/src/tools/ctf/dwarf/common/dwarf_types.h deleted file mode 100644 index ebd31c6c79..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_types.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -typedef struct Dwarf_Type_Context_s *Dwarf_Type_Context; - -/* type never completed see dwarf_global.h */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_util.c b/usr/src/tools/ctf/dwarf/common/dwarf_util.c deleted file mode 100644 index 01e0dd755d..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_util.c +++ /dev/null @@ -1,547 +0,0 @@ -/* - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_die_deliv.h" - - - -/* - Given a form, and a pointer to the bytes encoding - a value of that form, val_ptr, this function returns - the length, in bytes, of a value of that form. - When using this function, check for a return of 0 - a recursive DW_FORM_INDIRECT value. -*/ -Dwarf_Unsigned -_dwarf_get_size_of_val(Dwarf_Debug dbg, - Dwarf_Unsigned form, - Dwarf_Half address_size, - Dwarf_Small * val_ptr, int v_length_size) -{ - Dwarf_Unsigned length = 0; - Dwarf_Word leb128_length = 0; - Dwarf_Unsigned form_indirect = 0; - Dwarf_Unsigned ret_value = 0; - - switch (form) { - - default: /* Handles form = 0. */ - return (form); - - case DW_FORM_addr: - if(address_size) { - return address_size; - } - /* This should never happen, address_size should be set. */ - return (dbg->de_pointer_size); - - /* DWARF2 was wrong on the size of the attribute for - DW_FORM_ref_addr. We assume compilers are using the - corrected DWARF3 text (for 32bit pointer target objects pointer and - offsets are the same size anyway). */ - case DW_FORM_ref_addr: - return (v_length_size); - - case DW_FORM_block1: - return (*(Dwarf_Small *) val_ptr + 1); - - case DW_FORM_block2: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - val_ptr, sizeof(Dwarf_Half)); - return (ret_value + sizeof(Dwarf_Half)); - - case DW_FORM_block4: - READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned, - val_ptr, sizeof(Dwarf_ufixed)); - return (ret_value + sizeof(Dwarf_ufixed)); - - - case DW_FORM_data1: - return (1); - - case DW_FORM_data2: - return (2); - - case DW_FORM_data4: - return (4); - - case DW_FORM_data8: - return (8); - - case DW_FORM_string: - return (strlen((char *) val_ptr) + 1); - - case DW_FORM_block: - case DW_FORM_exprloc: - length = _dwarf_decode_u_leb128(val_ptr, &leb128_length); - return (length + leb128_length); - - case DW_FORM_flag_present: - return (0); - case DW_FORM_flag: - return (1); - - case DW_FORM_sec_offset: - /* If 32bit dwarf, is 4. Else is 64bit dwarf and is 8. */ - return (v_length_size); - - case DW_FORM_ref_udata: - length = _dwarf_decode_u_leb128(val_ptr, &leb128_length); - return (leb128_length); - - case DW_FORM_indirect: - { - Dwarf_Word indir_len = 0; - - form_indirect = _dwarf_decode_u_leb128(val_ptr, &indir_len); - if (form_indirect == DW_FORM_indirect) { - return (0); /* We are in big trouble: The true form - of DW_FORM_indirect is - DW_FORM_indirect? Nonsense. Should - never happen. */ - } - return (indir_len + _dwarf_get_size_of_val(dbg, - form_indirect, - address_size, - val_ptr + indir_len, - v_length_size)); - } - - case DW_FORM_ref1: - return (1); - - case DW_FORM_ref2: - return (2); - - case DW_FORM_ref4: - return (4); - - case DW_FORM_ref8: - return (8); - - case DW_FORM_sdata: - _dwarf_decode_s_leb128(val_ptr, &leb128_length); - return (leb128_length); - - case DW_FORM_strp: - return (v_length_size); - - case DW_FORM_udata: - _dwarf_decode_u_leb128(val_ptr, &leb128_length); - return (leb128_length); - } -} - -/* We allow an arbitrary number of HT_MULTIPLE entries - before resizing. It seems up to 20 or 30 - would work nearly as well. - We could have a different resize multiple than 'resize now' - test multiple, but for now we don't do that. -*/ -#define HT_MULTIPLE 8 - -/* Copy the old entries, updating each to be in - a new list. Don't delete anything. Leave the - htin with stale data. */ -static void -copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin, - Dwarf_Hash_Table htout) -{ - Dwarf_Hash_Table_Entry entry_in = htin->tb_entries; - unsigned entry_in_count = htin->tb_table_entry_count; - Dwarf_Hash_Table_Entry entry_out = htout->tb_entries; - unsigned entry_out_count = htout->tb_table_entry_count; - unsigned k = 0; - for ( ; k < entry_in_count; ++k,++entry_in) { - Dwarf_Abbrev_List listent = entry_in->at_head; - Dwarf_Abbrev_List nextlistent = 0; - - for ( ; listent ; listent = nextlistent) { - unsigned newtmp = listent->ab_code; - unsigned newhash = newtmp%entry_out_count; - Dwarf_Hash_Table_Entry e; - nextlistent = listent->ab_next; - e = entry_out+newhash; - /* Move_entry_to_new_hash. This reverses the - order of the entries, effectively, but - that does not seem significant. */ - listent->ab_next = e->at_head; - e->at_head = listent; - - htout->tb_total_abbrev_count++; - } - } -} - -/* - This function returns a pointer to a Dwarf_Abbrev_List_s - struct for the abbrev with the given code. It puts the - struct on the appropriate hash table. It also adds all - the abbrev between the last abbrev added and this one to - the hash table. In other words, the .debug_abbrev section - is scanned sequentially from the top for an abbrev with - the given code. All intervening abbrevs are also put - into the hash table. - - This function hashes the given code, and checks the chain - at that hash table entry to see if a Dwarf_Abbrev_List_s - with the given code exists. If yes, it returns a pointer - to that struct. Otherwise, it scans the .debug_abbrev - section from the last byte scanned for that CU till either - an abbrev with the given code is found, or an abbrev code - of 0 is read. It puts Dwarf_Abbrev_List_s entries for all - abbrev's read till that point into the hash table. The - hash table contains both a head pointer and a tail pointer - for each entry. - - While the lists can move and entries can be moved between - lists on reallocation, any given Dwarf_Abbrev_list entry - never moves once allocated, so the pointer is safe to return. - - Returns NULL on error. -*/ -Dwarf_Abbrev_List -_dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context, Dwarf_Unsigned code) -{ - Dwarf_Debug dbg = cu_context->cc_dbg; - Dwarf_Hash_Table hash_table_base = cu_context->cc_abbrev_hash_table; - Dwarf_Hash_Table_Entry entry_base = 0; - Dwarf_Hash_Table_Entry entry_cur = 0; - Dwarf_Word hash_num = 0; - Dwarf_Unsigned abbrev_code = 0; - Dwarf_Unsigned abbrev_tag = 0; - Dwarf_Unsigned attr_name = 0; - Dwarf_Unsigned attr_form = 0; - - Dwarf_Abbrev_List hash_abbrev_entry = 0; - - Dwarf_Abbrev_List inner_list_entry = 0; - Dwarf_Hash_Table_Entry inner_hash_entry = 0; - - Dwarf_Byte_Ptr abbrev_ptr = 0; - unsigned hashable_val; - - if ( !hash_table_base->tb_entries ) { - hash_table_base->tb_table_entry_count = HT_MULTIPLE; - hash_table_base->tb_total_abbrev_count= 0; - hash_table_base->tb_entries = _dwarf_get_alloc(dbg, - DW_DLA_HASH_TABLE_ENTRY, - hash_table_base->tb_table_entry_count); - if(! hash_table_base->tb_entries) { - return NULL; - } - - } else if (hash_table_base->tb_total_abbrev_count > - ( hash_table_base->tb_table_entry_count * HT_MULTIPLE) ) { - struct Dwarf_Hash_Table_s newht; - /* Effectively multiplies by >= HT_MULTIPLE */ - newht.tb_table_entry_count = hash_table_base->tb_total_abbrev_count; - newht.tb_total_abbrev_count = 0; - newht.tb_entries = _dwarf_get_alloc(dbg, - DW_DLA_HASH_TABLE_ENTRY, - newht.tb_table_entry_count); - - if(! newht.tb_entries) { - return NULL; - } - /* Copy the existing entries to the new table, - rehashing each. - */ - copy_abbrev_table_to_new_table(hash_table_base, &newht); - /* Dealloc only the entries hash table array, not the lists - of things pointed to by a hash table entry array. */ - dwarf_dealloc(dbg, hash_table_base->tb_entries,DW_DLA_HASH_TABLE_ENTRY); - hash_table_base->tb_entries = 0; - /* Now overwrite the existing table descriptor with - the new, newly valid, contents. */ - *hash_table_base = newht; - } /* Else is ok as is, add entry */ - - - hashable_val = code; - hash_num = hashable_val % - hash_table_base->tb_table_entry_count; - entry_base = hash_table_base->tb_entries; - entry_cur = entry_base + hash_num; - - /* Determine if the 'code' is the list of synonyms already. */ - for (hash_abbrev_entry = entry_cur->at_head; - hash_abbrev_entry != NULL && hash_abbrev_entry->ab_code != code; - hash_abbrev_entry = hash_abbrev_entry->ab_next); - if (hash_abbrev_entry != NULL) { - /* This returns a pointer to an abbrev list entry, not - the list itself. */ - return (hash_abbrev_entry); - } - - abbrev_ptr = cu_context->cc_last_abbrev_ptr != NULL ? - cu_context->cc_last_abbrev_ptr : - dbg->de_debug_abbrev.dss_data + cu_context->cc_abbrev_offset; - - /* End of abbrev's for this cu, since abbrev code is 0. */ - if (*abbrev_ptr == 0) { - return (NULL); - } - - do { - unsigned new_hashable_val; - DECODE_LEB128_UWORD(abbrev_ptr, abbrev_code); - DECODE_LEB128_UWORD(abbrev_ptr, abbrev_tag); - - inner_list_entry = (Dwarf_Abbrev_List) - _dwarf_get_alloc(cu_context->cc_dbg, DW_DLA_ABBREV_LIST, 1); - if (inner_list_entry == NULL) - return (NULL); - - new_hashable_val = abbrev_code; - hash_num = new_hashable_val % - hash_table_base->tb_table_entry_count; - inner_hash_entry = entry_base + hash_num; - /* Move_entry_to_new_hash */ - inner_list_entry->ab_next = inner_hash_entry->at_head; - inner_hash_entry->at_head = inner_list_entry; - - hash_table_base->tb_total_abbrev_count++; - - inner_list_entry->ab_code = abbrev_code; - inner_list_entry->ab_tag = abbrev_tag; - inner_list_entry->ab_has_child = *(abbrev_ptr++); - inner_list_entry->ab_abbrev_ptr = abbrev_ptr; - - /* Cycle thru the abbrev content, ignoring the content except - to find the end of the content. */ - do { - DECODE_LEB128_UWORD(abbrev_ptr, attr_name); - DECODE_LEB128_UWORD(abbrev_ptr, attr_form); - } while (attr_name != 0 && attr_form != 0); - - } while (*abbrev_ptr != 0 && abbrev_code != code); - - cu_context->cc_last_abbrev_ptr = abbrev_ptr; - return (abbrev_code == code ? inner_list_entry : NULL); -} - - -/* return 1 if string ends before 'endptr' else -** return 0 meaning string is not properly terminated. -** Presumption is the 'endptr' pts to end of some dwarf section data. -*/ -int -_dwarf_string_valid(void *startptr, void *endptr) -{ - - char *start = startptr; - char *end = endptr; - - while (start < end) { - if (*start == 0) { - return 1; /* OK! */ - } - ++start; - ++end; - } - return 0; /* FAIL! bad string! */ -} - -/* - A byte-swapping version of memcpy - for cross-endian use. - Only 2,4,8 should be lengths passed in. -*/ -void * -_dwarf_memcpy_swap_bytes(void *s1, const void *s2, size_t len) -{ - void *orig_s1 = s1; - unsigned char *targ = (unsigned char *) s1; - unsigned char *src = (unsigned char *) s2; - - if (len == 4) { - targ[3] = src[0]; - targ[2] = src[1]; - targ[1] = src[2]; - targ[0] = src[3]; - } else if (len == 8) { - targ[7] = src[0]; - targ[6] = src[1]; - targ[5] = src[2]; - targ[4] = src[3]; - targ[3] = src[4]; - targ[2] = src[5]; - targ[1] = src[6]; - targ[0] = src[7]; - } else if (len == 2) { - targ[1] = src[0]; - targ[0] = src[1]; - } -/* should NOT get below here: is not the intended use */ - else if (len == 1) { - targ[0] = src[0]; - } else { - memcpy(s1, s2, len); - } - - return orig_s1; -} - - -/* - This calculation used to be sprinkled all over. - Now brought to one place. - - We try to accurately compute the size of a cu header - given a known cu header location ( an offset in .debug_info). - -*/ -/* ARGSUSED */ -Dwarf_Unsigned -_dwarf_length_of_cu_header(Dwarf_Debug dbg, Dwarf_Unsigned offset) -{ - int local_length_size = 0; - int local_extension_size = 0; - Dwarf_Unsigned length = 0; - Dwarf_Small *cuptr = dbg->de_debug_info.dss_data + offset; - - READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned, - cuptr, local_length_size, local_extension_size); - - return local_extension_size + /* initial extesion, if present - */ - local_length_size + /* Size of cu length field. */ - sizeof(Dwarf_Half) + /* Size of version stamp field. */ - local_length_size + /* Size of abbrev offset field. */ - sizeof(Dwarf_Small); /* Size of address size field. */ - -} - -/* - Pretend we know nothing about the CU - and just roughly compute the result. -*/ -Dwarf_Unsigned -_dwarf_length_of_cu_header_simple(Dwarf_Debug dbg) -{ - return dbg->de_length_size + /* Size of cu length field. */ - sizeof(Dwarf_Half) + /* Size of version stamp field. */ - dbg->de_length_size + /* Size of abbrev offset field. */ - sizeof(Dwarf_Small); /* Size of address size field. */ -} - -/* Now that we delay loading .debug_info, we need to do the - load in more places. So putting the load - code in one place now instead of replicating it in multiple - places. - -*/ -int -_dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error * error) -{ - int res = DW_DLV_ERROR; - - /* Testing de_debug_info.dss_data allows us to avoid testing - de_debug_abbrev.dss_data. - One test instead of 2. .debug_info is useless - without .debug_abbrev. */ - if (dbg->de_debug_info.dss_data) { - return DW_DLV_OK; - } - - res = _dwarf_load_section(dbg, &dbg->de_debug_abbrev,error); - if (res != DW_DLV_OK) { - return res; - } - res = _dwarf_load_section(dbg, &dbg->de_debug_info, error); - return res; - -} -void -_dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg,Dwarf_Hash_Table hash_table) -{ - /* A Hash Table is an array with tb_table_entry_count struct - Dwarf_Hash_Table_s entries in the array. */ - int hashnum = 0; - for (; hashnum < hash_table->tb_table_entry_count; ++hashnum) { - struct Dwarf_Abbrev_List_s *abbrev = 0; - struct Dwarf_Abbrev_List_s *nextabbrev = 0; - struct Dwarf_Hash_Table_Entry_s *tb = &hash_table->tb_entries[hashnum]; - - abbrev = tb->at_head; - for (; abbrev; abbrev = nextabbrev) { - nextabbrev = abbrev->ab_next; - dwarf_dealloc(dbg, abbrev, DW_DLA_ABBREV_LIST); - } - } - /* Frees all the entries at once: an array. */ - dwarf_dealloc(dbg,hash_table->tb_entries,DW_DLA_HASH_TABLE_ENTRY); -} - -/* - If no die provided the size value returned might be wrong. - If different compilation units have different address sizes - this may not give the correct value in all contexts if the die - pointer is NULL. - If the Elf offset size != address_size - (for example if address_size = 4 but recorded in elf64 object) - this may not give the correct value in all contexts if the die - pointer is NULL. - If the die pointer is non-NULL (in which case it must point to - a valid DIE) this will return the correct size. -*/ -int -_dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die) -{ - Dwarf_CU_Context context = 0; - Dwarf_Half addrsize = 0; - if(!die) { - return dbg->de_pointer_size; - } - context = die->di_cu_context; - addrsize = context->cc_address_size; - return addrsize; -} - - - diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_util.h b/usr/src/tools/ctf/dwarf/common/dwarf_util.h deleted file mode 100644 index 4046bb2478..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_util.h +++ /dev/null @@ -1,311 +0,0 @@ -#ifndef DWARF_UTIL_H -#define DWARF_UTIL_H -/* - - Copyright (C) 2000,2003,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* The address of the Free Software Foundation is - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. - SGI has moved from the Crittenden Lane address. -*/ - - - - -/* - Decodes unsigned leb128 encoded numbers. - Make sure ptr is a pointer to a 1-byte type. - In 2003 and earlier this was a hand-inlined - version of _dwarf_decode_u_leb128() which did - not work correctly if Dwarf_Word was 64 bits. -*/ -#define DECODE_LEB128_UWORD(ptr, value) \ - do { \ - Dwarf_Word uleblen; \ - value = _dwarf_decode_u_leb128(ptr,&uleblen); \ - ptr += uleblen; \ - } while (0) - -/* - Decodes signed leb128 encoded numbers. - Make sure ptr is a pointer to a 1-byte type. - In 2003 and earlier this was a hand-inlined - version of _dwarf_decode_s_leb128() which did - not work correctly if Dwarf_Word was 64 bits. - -*/ -#define DECODE_LEB128_SWORD(ptr, value) \ - do { \ - Dwarf_Word sleblen; \ - value = _dwarf_decode_s_leb128(ptr,&sleblen); \ - ptr += sleblen; \ - } while(0) - - -/* - Skips leb128_encoded numbers that are guaranteed - to be no more than 4 bytes long. Same for both - signed and unsigned numbers. -*/ -#define SKIP_LEB128_WORD(ptr) \ - do{ if ((*(ptr++) & 0x80) != 0) { \ - if ((*(ptr++) & 0x80) != 0) { \ - if ((*(ptr++) & 0x80) != 0) { \ - if ((*(ptr++) & 0x80) != 0) { \ - } \ - } \ - } \ - } } while (0) - - -#define CHECK_DIE(die, error_ret_value) \ -do {if (die == NULL) { \ - _dwarf_error(NULL, error, DW_DLE_DIE_NULL); \ - return(error_ret_value); \ - } \ - if (die->di_cu_context == NULL) { \ - _dwarf_error(NULL, error, DW_DLE_DIE_NO_CU_CONTEXT); \ - return(error_ret_value); \ - } \ - if (die->di_cu_context->cc_dbg == NULL) { \ - _dwarf_error(NULL, error, DW_DLE_DBG_NULL); \ - return(error_ret_value); \ - } \ -} while (0) - - -/* - Reads 'source' for 'length' bytes from unaligned addr. - - Avoids any constant-in-conditional warnings and - avoids a test in the generated code (for non-const cases, - which are in the majority.) - Uses a temp to avoid the test. - The decl here should avoid any problem of size in the temp. - This code is ENDIAN DEPENDENT - The memcpy args are the endian issue. -*/ -typedef Dwarf_Unsigned BIGGEST_UINT; - -#ifdef WORDS_BIGENDIAN -#define READ_UNALIGNED(dbg,dest,desttype, source, length) \ - do { \ - BIGGEST_UINT _ltmp = 0; \ - dbg->de_copy_word( (((char *)(&_ltmp)) + sizeof(_ltmp) - length), \ - source, length) ; \ - dest = (desttype)_ltmp; \ - } while (0) - - -/* - This macro sign-extends a variable depending on the length. - It fills the bytes between the size of the destination and - the length with appropriate padding. - This code is ENDIAN DEPENDENT but dependent only - on host endianness, not object file endianness. - The memcpy args are the issue. -*/ -#define SIGN_EXTEND(dest, length) \ - do {if (*(Dwarf_Sbyte *)((char *)&dest + sizeof(dest) - length) < 0) {\ - memcpy((char *)&dest, "\xff\xff\xff\xff\xff\xff\xff\xff", \ - sizeof(dest) - length); \ - } \ - } while (0) -#else /* LITTLE ENDIAN */ - -#define READ_UNALIGNED(dbg,dest,desttype, source, length) \ - do { \ - BIGGEST_UINT _ltmp = 0; \ - dbg->de_copy_word( (char *)(&_ltmp) , \ - source, length) ; \ - dest = (desttype)_ltmp; \ - } while (0) - - -/* - This macro sign-extends a variable depending on the length. - It fills the bytes between the size of the destination and - the length with appropriate padding. - This code is ENDIAN DEPENDENT but dependent only - on host endianness, not object file endianness. - The memcpy args are the issue. -*/ -#define SIGN_EXTEND(dest, length) \ - do {if (*(Dwarf_Sbyte *)((char *)&dest + (length-1)) < 0) {\ - memcpy((char *)&dest+length, \ - "\xff\xff\xff\xff\xff\xff\xff\xff", \ - sizeof(dest) - length); \ - } \ - } while (0) - -#endif /* ! LITTLE_ENDIAN */ - - - -/* - READ_AREA LENGTH reads the length (the older way - of pure 32 or 64 bit - or the new proposed dwarfv2.1 64bit-extension way) - - It reads the bits from where rw_src_data_p points to - and updates the rw_src_data_p to point past what was just read. - - It updates w_length_size (to the size of an offset, either 4 or 8) - and w_exten_size (set 0 unless this frame has the DWARF3,4 64bit - extension, in which case w_exten_size is set to 4). - - r_dbg is just the current dbg pointer. - w_target is the output length field. - r_targtype is the output type. Always Dwarf_Unsigned so far. - -*/ -/* This one handles the v2.1 64bit extension - and 32bit (and MIPS fixed 64 bit via the - dwarf_init-set r_dbg->de_length_size).. - It does not recognize any but the one distingushed value - (the only one with defined meaning). - It assumes that no CU will have a length - 0xffffffxx (32bit length) - or - 0xffffffxx xxxxxxxx (64bit length) - which makes possible auto-detection of the extension. - - This depends on knowing that only a non-zero length - is legitimate (AFAICT), and for IRIX non-standard -64 - dwarf that the first 32 bits of the 64bit offset will be - zero (because the compiler could not handle a truly large - value as of Jan 2003 and because no app has that much debug - info anyway, at least not in the IRIX case). - - At present not testing for '64bit elf' here as that - does not seem necessary (none of the 64bit length seems - appropriate unless it's ident[EI_CLASS] == ELFCLASS64). -*/ -# define READ_AREA_LENGTH(r_dbg,w_target,r_targtype, \ - rw_src_data_p,w_length_size,w_exten_size) \ -do { READ_UNALIGNED(r_dbg,w_target,r_targtype, \ - rw_src_data_p, ORIGINAL_DWARF_OFFSET_SIZE); \ - if(w_target == DISTINGUISHED_VALUE) { \ - /* dwarf3 64bit extension */ \ - w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ - rw_src_data_p += ORIGINAL_DWARF_OFFSET_SIZE; \ - w_exten_size = ORIGINAL_DWARF_OFFSET_SIZE; \ - READ_UNALIGNED(r_dbg,w_target,r_targtype, \ - rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE);\ - rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ - } else { \ - if(w_target == 0 && r_dbg->de_big_endian_object) { \ - /* IRIX 64 bit, big endian. This test */ \ - /* is not a truly precise test, a precise test */ \ - /* would check if the target was IRIX. */ \ - READ_UNALIGNED(r_dbg,w_target,r_targtype, \ - rw_src_data_p, DISTINGUISHED_VALUE_OFFSET_SIZE); \ - w_length_size = DISTINGUISHED_VALUE_OFFSET_SIZE; \ - rw_src_data_p += DISTINGUISHED_VALUE_OFFSET_SIZE; \ - w_exten_size = 0; \ - } else { \ - /* standard 32 bit dwarf2/dwarf3 */ \ - w_exten_size = 0; \ - w_length_size = ORIGINAL_DWARF_OFFSET_SIZE; \ - rw_src_data_p += w_length_size; \ - } \ - } } while(0) - -Dwarf_Unsigned -_dwarf_decode_u_leb128(Dwarf_Small * leb128, - Dwarf_Word * leb128_length); - -Dwarf_Signed -_dwarf_decode_s_leb128(Dwarf_Small * leb128, - Dwarf_Word * leb128_length); - -Dwarf_Unsigned -_dwarf_get_size_of_val(Dwarf_Debug dbg, - Dwarf_Unsigned form, - Dwarf_Half address_size, - Dwarf_Small * val_ptr, - int v_length_size); - -struct Dwarf_Hash_Table_Entry_s; -/* This single struct is the base for the hash table. - The intent is that once the total_abbrev_count across - all the entries is greater than 10*current_table_entry_count - one should build a new Dwarf_Hash_Table_Base_s, rehash - all the existing entries, and delete the old table and entries. - (10 is a heuristic, nothing magic about it, but once the - count gets to 30 or 40 times current_table_entry_count - things really slow down a lot. One (500MB) application had - 127000 abbreviations in one compilation unit) - The incoming 'code' is an abbrev number and those simply - increase linearly so the hashing is perfect always. -*/ -struct Dwarf_Hash_Table_s { - unsigned long tb_table_entry_count; - unsigned long tb_total_abbrev_count; - /* Each table entry is a list of abbreviations. */ - struct Dwarf_Hash_Table_Entry_s *tb_entries; -}; - -/* - This struct is used to build a hash table for the - abbreviation codes for a compile-unit. -*/ -struct Dwarf_Hash_Table_Entry_s { - Dwarf_Abbrev_List at_head; -}; - - - -Dwarf_Abbrev_List -_dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context, - Dwarf_Unsigned code); - - -/* return 1 if string ends before 'endptr' else -** return 0 meaning string is not properly terminated. -** Presumption is the 'endptr' pts to end of some dwarf section data. -*/ -int _dwarf_string_valid(void *startptr, void *endptr); - -Dwarf_Unsigned _dwarf_length_of_cu_header(Dwarf_Debug, - Dwarf_Unsigned offset); -Dwarf_Unsigned _dwarf_length_of_cu_header_simple(Dwarf_Debug); - -int _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error *error); -void _dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg, - struct Dwarf_Hash_Table_s* hash_table); -int _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die); - -#endif /* DWARF_UTIL_H */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_vars.c b/usr/src/tools/ctf/dwarf/common/dwarf_vars.c deleted file mode 100644 index 24105289ba..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_vars.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_vars.h" -#include "dwarf_global.h" - -int -dwarf_get_vars(Dwarf_Debug dbg, - Dwarf_Var ** vars, - Dwarf_Signed * ret_var_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_varnames,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_varnames.dss_data, - dbg->de_debug_varnames.dss_size, - (Dwarf_Global **) vars, /* Type punning for sections - with identical format. */ - ret_var_count, - error, - DW_DLA_VAR_CONTEXT, - DW_DLA_VAR, - DW_DLE_DEBUG_VARNAMES_LENGTH_BAD, - DW_DLE_DEBUG_VARNAMES_VERSION_ERROR); -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_vars_dealloc(Dwarf_Debug dbg, Dwarf_Var * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl, - count, - DW_DLA_VAR_CONTEXT, - DW_DLA_VAR, DW_DLA_LIST); - return; -} - - -int -dwarf_varname(Dwarf_Var var_in, char **ret_varname, Dwarf_Error * error) -{ - Dwarf_Global var = (Dwarf_Global) var_in; - - if (var == NULL) { - _dwarf_error(NULL, error, DW_DLE_VAR_NULL); - return (DW_DLV_ERROR); - } - - *ret_varname = (char *) (var->gl_name); - return DW_DLV_OK; -} - - -int -dwarf_var_die_offset(Dwarf_Var var_in, - Dwarf_Off * returned_offset, Dwarf_Error * error) -{ - Dwarf_Global var = (Dwarf_Global) var_in; - - return dwarf_global_die_offset(var, returned_offset, error); - -} - - -int -dwarf_var_cu_offset(Dwarf_Var var_in, - Dwarf_Off * returned_offset, Dwarf_Error * error) -{ - Dwarf_Global var = (Dwarf_Global) var_in; - - return dwarf_global_cu_offset(var, returned_offset, error); -} - - -int -dwarf_var_name_offsets(Dwarf_Var var_in, - char **returned_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_offset, Dwarf_Error * error) -{ - Dwarf_Global var = (Dwarf_Global) var_in; - - return - dwarf_global_name_offsets(var, - returned_name, die_offset, cu_offset, - error); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_vars.h b/usr/src/tools/ctf/dwarf/common/dwarf_vars.h deleted file mode 100644 index bd5f967e48..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_vars.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -typedef struct Dwarf_Var_Context_s *Dwarf_Var_Context; - -/* struct never completed: see dwarf_global.h */ diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_weaks.c b/usr/src/tools/ctf/dwarf/common/dwarf_weaks.c deleted file mode 100644 index 425916e62e..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_weaks.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - - Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "dwarf_incl.h" -#include <stdio.h> -#include "dwarf_weaks.h" -#include "dwarf_global.h" - -int -dwarf_get_weaks(Dwarf_Debug dbg, - Dwarf_Weak ** weaks, - Dwarf_Signed * ret_weak_count, Dwarf_Error * error) -{ - int res = _dwarf_load_section(dbg, &dbg->de_debug_weaknames,error); - if (res != DW_DLV_OK) { - return res; - } - - return _dwarf_internal_get_pubnames_like_data(dbg, - dbg->de_debug_weaknames.dss_data, - dbg->de_debug_weaknames.dss_size, - (Dwarf_Global **) weaks, /* Type punning for sections - with identical format. */ - ret_weak_count, - error, - DW_DLA_WEAK_CONTEXT, - DW_DLA_WEAK, - DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD, - DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR); -} - -/* Deallocating fully requires deallocating the list - and all entries. But some internal data is - not exposed, so we need a function with internal knowledge. -*/ - -void -dwarf_weaks_dealloc(Dwarf_Debug dbg, Dwarf_Weak * dwgl, - Dwarf_Signed count) -{ - _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl, - count, - DW_DLA_WEAK_CONTEXT, - DW_DLA_WEAK, DW_DLA_LIST); - return; -} - - - -int -dwarf_weakname(Dwarf_Weak weak_in, char **ret_name, Dwarf_Error * error) -{ - Dwarf_Global weak = (Dwarf_Global) weak_in; - - if (weak == NULL) { - _dwarf_error(NULL, error, DW_DLE_WEAK_NULL); - return (DW_DLV_ERROR); - } - *ret_name = (char *) (weak->gl_name); - return DW_DLV_OK; -} - - -int -dwarf_weak_die_offset(Dwarf_Weak weak_in, - Dwarf_Off * weak_off, Dwarf_Error * error) -{ - Dwarf_Global weak = (Dwarf_Global) weak_in; - - return dwarf_global_die_offset(weak, weak_off, error); -} - - -int -dwarf_weak_cu_offset(Dwarf_Weak weak_in, - Dwarf_Off * weak_off, Dwarf_Error * error) -{ - Dwarf_Global weak = (Dwarf_Global) weak_in; - - return dwarf_global_cu_offset(weak, weak_off, error); -} - - -int -dwarf_weak_name_offsets(Dwarf_Weak weak_in, - char **weak_name, - Dwarf_Off * die_offset, - Dwarf_Off * cu_offset, Dwarf_Error * error) -{ - Dwarf_Global weak = (Dwarf_Global) weak_in; - - return dwarf_global_name_offsets(weak, - weak_name, die_offset, cu_offset, error); -} diff --git a/usr/src/tools/ctf/dwarf/common/dwarf_weaks.h b/usr/src/tools/ctf/dwarf/common/dwarf_weaks.h deleted file mode 100644 index d38f5f118a..0000000000 --- a/usr/src/tools/ctf/dwarf/common/dwarf_weaks.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -typedef struct Dwarf_Weak_Context_s *Dwarf_Weak_Context; - -/* struct never completed: see dwarf_global.h */ diff --git a/usr/src/tools/ctf/dwarf/common/libdwarf.h b/usr/src/tools/ctf/dwarf/common/libdwarf.h deleted file mode 100644 index 78627a96a6..0000000000 --- a/usr/src/tools/ctf/dwarf/common/libdwarf.h +++ /dev/null @@ -1,2736 +0,0 @@ -/* - - Copyright (C) 2000-2010 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 David Anderson. All rights reserved. - Portions Copyright 2008-2010 Arxan Technologies, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#ifndef _LIBDWARF_H -#define _LIBDWARF_H -#ifdef __cplusplus -extern "C" { -#endif -/* - libdwarf.h - $Revision: #9 $ $Date: 2008/01/17 $ - - For libdwarf producers and consumers - - The interface is defined as having 8-byte signed and unsigned - values so it can handle 64-or-32bit target on 64-or-32bit host. - Addr is the native size: it represents pointers on - the host machine (not the target!). - - This contains declarations for types and all producer - and consumer functions. - - Function declarations are written on a single line each here - so one can use grep to each declaration in its entirety. - The declarations are a little harder to read this way, but... - -*/ - -struct Elf; -typedef struct Elf* dwarf_elf_handle; - -/* To enable printing with printf regardless of the - actual underlying data type, we define the DW_PR_xxx macros. */ -#if (_MIPS_SZLONG == 64) -/* Special case for MIPS, so -64 (LP64) build gets simple -long-. - Non-MIPS LP64 or ILP64 environments should probably ensure - _MIPS_SZLONG set to 64 everywhere this header is #included. -*/ -typedef int Dwarf_Bool; /* boolean type */ -typedef unsigned long Dwarf_Off; /* 4 or 8 byte file offset */ -typedef unsigned long Dwarf_Unsigned; /* 4 or 8 byte unsigned value */ -typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ -typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ -typedef signed long Dwarf_Signed; /* 4 or 8 byte signed value */ -typedef unsigned long Dwarf_Addr; /* target memory address */ -#define DW_PR_DUx "lx" -#define DW_PR_DSx "lx" -#define DW_PR_DUu "lu" -#define DW_PR_DSd "ld" - -#else /* 32-bit */ -/* This is for ILP32, allowing i/o of 64bit dwarf info. - Also should be fine for LP64 and ILP64 cases. -*/ -typedef int Dwarf_Bool; /* boolean type */ -typedef unsigned long long Dwarf_Off; /* 8 byte file offset */ -typedef unsigned long long Dwarf_Unsigned; /* 8 byte unsigned value*/ -typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ -typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ -typedef signed long long Dwarf_Signed; /* 8 byte signed value */ -typedef unsigned long long Dwarf_Addr; /* target memory address */ -#define DW_PR_DUx "llx" -#define DW_PR_DSx "llx" -#define DW_PR_DUu "llu" -#define DW_PR_DSd "lld" -#endif -#ifdef HAVE_NONSTANDARD_PRINTF_64_FORMAT -/* Windows does not use std C formatting, so allow it. */ -#undef DW_PR_DUx -#undef DW_PR_DSx -#undef DW_PR_DUu -#undef DW_PR_DSd -#define DW_PR_DUx "I64x" -#define DW_PR_DSx "I64x" -#define DW_PR_DUu "I64u" -#define DW_PR_DSd "I64d" -#endif /* HAVE_NONSTANDARD_FORMAT */ - -typedef void* Dwarf_Ptr; /* host machine pointer */ - -/* Used for DW_FORM_ref_sig8. It is not a string, it - is 8 bytes of a signature one would use to find - a type unit. See dwarf_formsig8() -*/ -typedef struct { - char signature[8]; -} Dwarf_Sig8; - -/* Contains info on an uninterpreted block of data -*/ -typedef struct { - Dwarf_Unsigned bl_len; /* length of block */ - Dwarf_Ptr bl_data; /* uninterpreted data */ - Dwarf_Small bl_from_loclist; /*non-0 if loclist, else debug_info*/ - Dwarf_Unsigned bl_section_offset; /* Section (not CU) offset - which 'data' comes from. */ -} Dwarf_Block; - - -/* location record -*/ -typedef struct { - Dwarf_Small lr_atom; /* location operation */ - Dwarf_Unsigned lr_number; /* operand */ - Dwarf_Unsigned lr_number2; /* for OP_BREGx */ - Dwarf_Unsigned lr_offset; /* offset in locexpr for OP_BRA etc */ -} Dwarf_Loc; - - -/* location description -*/ -typedef struct { - Dwarf_Addr ld_lopc; /* beginning of active range */ - Dwarf_Addr ld_hipc; /* end of active range */ - Dwarf_Half ld_cents; /* count of location records */ - Dwarf_Loc* ld_s; /* pointer to list of same */ - Dwarf_Small ld_from_loclist; - /* non-0 if loclist, else debug_info*/ - - Dwarf_Unsigned ld_section_offset; /* Section (not CU) offset - where loc-expr begins*/ -} Dwarf_Locdesc; - -/* First appears in DWARF3. - The dwr_addr1/addr2 data is either an offset (DW_RANGES_ENTRY) - or an address (dwr_addr2 in DW_RANGES_ADDRESS_SELECTION) or - both are zero (DW_RANGES_END). -*/ -enum Dwarf_Ranges_Entry_Type { DW_RANGES_ENTRY, - DW_RANGES_ADDRESS_SELECTION, - DW_RANGES_END }; -typedef struct { - Dwarf_Addr dwr_addr1; - Dwarf_Addr dwr_addr2; - enum Dwarf_Ranges_Entry_Type dwr_type; -} Dwarf_Ranges; - -/* Frame description instructions expanded. -*/ -typedef struct { - Dwarf_Small fp_base_op; - Dwarf_Small fp_extended_op; - Dwarf_Half fp_register; - - /* Value may be signed, depends on op. - Any applicable data_alignment_factor has - not been applied, this is the raw offset. */ - Dwarf_Unsigned fp_offset; - Dwarf_Off fp_instr_offset; -} Dwarf_Frame_Op; /* DWARF2 */ - -typedef struct { - Dwarf_Small fp_base_op; - Dwarf_Small fp_extended_op; - Dwarf_Half fp_register; - - /* Value may be signed, depends on op. - Any applicable data_alignment_factor has - not been applied, this is the raw offset. */ - Dwarf_Unsigned fp_offset_or_block_len; - Dwarf_Small *fp_expr_block; - - Dwarf_Off fp_instr_offset; -} Dwarf_Frame_Op3; /* DWARF3 and DWARF2 compatible */ - -/* ***IMPORTANT NOTE, TARGET DEPENDENCY **** - DW_REG_TABLE_SIZE must be at least as large as - the number of registers - (DW_FRAME_LAST_REG_NUM) as defined in dwarf.h - Preferably identical to DW_FRAME_LAST_REG_NUM. - Ensure [0-DW_REG_TABLE_SIZE] does not overlap - DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL. - Also ensure DW_FRAME_REG_INITIAL_VALUE is set to what - is appropriate to your cpu. - For various CPUs DW_FRAME_UNDEFINED_VAL is correct - as the value for DW_FRAME_REG_INITIAL_VALUE. - - For consumer apps, this can be set dynamically: see - dwarf_set_frame_rule_table_size(); - */ -#ifndef DW_REG_TABLE_SIZE -#define DW_REG_TABLE_SIZE 66 -#endif - -/* For MIPS, DW_FRAME_SAME_VAL is the correct default value - for a frame register value. For other CPUS another value - may be better, such as DW_FRAME_UNDEFINED_VAL. - See dwarf_set_frame_rule_table_size -*/ -#ifndef DW_FRAME_REG_INITIAL_VALUE -#define DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL -#endif - -/* Taken as meaning 'undefined value', this is not - a column or register number. - Only present at libdwarf runtime in the consumer - interfaces. Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - Ensure this is > DW_REG_TABLE_SIZE (the reg table - size is changeable at runtime with the *reg3() interfaces, - and this value must be greater than the reg table size). -*/ -#define DW_FRAME_UNDEFINED_VAL 1034 - -/* Taken as meaning 'same value' as caller had, not a column - or register number. - Only present at libdwarf runtime in the consumer - interfaces. Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - Ensure this is > DW_REG_TABLE_SIZE (the reg table - size is changeable at runtime with the *reg3() interfaces, - and this value must be greater than the reg table size). -*/ -#define DW_FRAME_SAME_VAL 1035 - -/* For DWARF3 consumer interfaces, make the CFA a column with no - real table number. This is what should have been done - for the DWARF2 interfaces. This actually works for - both DWARF2 and DWARF3, but see the libdwarf documentation - on Dwarf_Regtable3 and dwarf_get_fde_info_for_reg3() - and dwarf_get_fde_info_for_all_regs3() - Do NOT use this with the older dwarf_get_fde_info_for_reg() - or dwarf_get_fde_info_for_all_regs() consumer interfaces. - Must be higher than any register count for *any* ABI - (ensures maximum applicability with minimum effort). - Ensure this is > DW_REG_TABLE_SIZE (the reg table - size is changeable at runtime with the *reg3() interfaces, - and this value must be greater than the reg table size). - Only present at libdwarf runtime in the consumer - interfaces. Never on disk. -*/ -#define DW_FRAME_CFA_COL3 1436 - -/* The following are all needed to evaluate DWARF3 register rules. -*/ -#define DW_EXPR_OFFSET 0 /* DWARF2 only sees this. */ -#define DW_EXPR_VAL_OFFSET 1 -#define DW_EXPR_EXPRESSION 2 -#define DW_EXPR_VAL_EXPRESSION 3 - -typedef struct Dwarf_Regtable_Entry_s { - /* For each index i (naming a hardware register with dwarf number - i) the following is true and defines the value of that register: - - If dw_regnum is Register DW_FRAME_UNDEFINED_VAL - it is not DWARF register number but - a place holder indicating the register has no defined value. - If dw_regnum is Register DW_FRAME_SAME_VAL - it is not DWARF register number but - a place holder indicating the register has the same - value in the previous frame. - DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL are - only present at libdwarf runtime. Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - - Otherwise: the register number is a DWARF register number - (see ABI documents for how this translates to hardware/ - software register numbers in the machine hardware) - and the following applies: - - if dw_value_type == DW_EXPR_OFFSET (the only case for dwarf2): - If dw_offset_relevant is non-zero, then - the value is stored at at the address CFA+N where - N is a signed offset. - Rule: Offset(N) - If dw_offset_relevant is zero, then the value of the register - is the value of (DWARF) register number dw_regnum. - Rule: register(F) - Other values of dw_value_type are an error. - */ - Dwarf_Small dw_offset_relevant; - - /* For DWARF2, always 0 */ - Dwarf_Small dw_value_type; - - Dwarf_Half dw_regnum; - - /* The data type here should the larger of Dwarf_Addr - and Dwarf_Unsigned and Dwarf_Signed. */ - Dwarf_Addr dw_offset; -} Dwarf_Regtable_Entry; - -typedef struct Dwarf_Regtable_s { - struct Dwarf_Regtable_Entry_s rules[DW_REG_TABLE_SIZE]; -} Dwarf_Regtable; - -/* opaque type. Functional interface shown later. */ -struct Dwarf_Reg_value3_s; -typedef struct Dwarf_Reg_value3_s Dwarf_Reg_Value3; - -typedef struct Dwarf_Regtable_Entry3_s { - /* For each index i (naming a hardware register with dwarf number - i) the following is true and defines the value of that register: - - If dw_regnum is Register DW_FRAME_UNDEFINED_VAL - it is not DWARF register number but - a place holder indicating the register has no defined value. - If dw_regnum is Register DW_FRAME_SAME_VAL - it is not DWARF register number but - a place holder indicating the register has the same - value in the previous frame. - DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL and - DW_FRAME_CFA_COL3 are only present at libdwarf runtime. - Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - Because DW_FRAME_SAME_VAL and DW_FRAME_UNDEFINED_VAL - and DW_FRAME_CFA_COL3 are defineable at runtime - consider the names symbolic in this comment, not absolute. - - Otherwise: the register number is a DWARF register number - (see ABI documents for how this translates to hardware/ - software register numbers in the machine hardware) - and the following applies: - - In a cfa-defining entry (rt3_cfa_rule) the regnum is the - CFA 'register number'. Which is some 'normal' register, - not DW_FRAME_CFA_COL3, nor DW_FRAME_SAME_VAL, nor - DW_FRAME_UNDEFINED_VAL. - - If dw_value_type == DW_EXPR_OFFSET (the only possible case for - dwarf2): - If dw_offset_relevant is non-zero, then - the value is stored at at the address - CFA+N where N is a signed offset. - dw_regnum is the cfa register rule which means - one ignores dw_regnum and uses the CFA appropriately. - So dw_offset_or_block_len is a signed value, really, - and must be printed/evaluated as such. - Rule: Offset(N) - If dw_offset_relevant is zero, then the value of the register - is the value of (DWARF) register number dw_regnum. - Rule: register(R) - If dw_value_type == DW_EXPR_VAL_OFFSET - the value of this register is CFA +N where N is a signed offset. - dw_regnum is the cfa register rule which means - one ignores dw_regnum and uses the CFA appropriately. - Rule: val_offset(N) - If dw_value_type == DW_EXPR_EXPRESSION - The value of the register is the value at the address - computed by evaluating the DWARF expression E. - Rule: expression(E) - The expression E byte stream is pointed to by dw_block_ptr. - The expression length in bytes is given by - dw_offset_or_block_len. - If dw_value_type == DW_EXPR_VAL_EXPRESSION - The value of the register is the value - computed by evaluating the DWARF expression E. - Rule: val_expression(E) - The expression E byte stream is pointed to by dw_block_ptr. - The expression length in bytes is given by - dw_offset_or_block_len. - Other values of dw_value_type are an error. - */ - Dwarf_Small dw_offset_relevant; - Dwarf_Small dw_value_type; - Dwarf_Half dw_regnum; - Dwarf_Unsigned dw_offset_or_block_len; - Dwarf_Ptr dw_block_ptr; - -}Dwarf_Regtable_Entry3; - -/* For the DWARF3 version, moved the DW_FRAME_CFA_COL - out of the array and into its own struct. - Having it part of the array is not very easy to work - with from a portability point of view: changing - the number for every architecture is a pain (if one fails - to set it correctly a register rule gets clobbered when - setting CFA). With MIPS it just happened to be easy to use - DW_FRAME_CFA_COL (it was wrong conceptually but it was easy...). - - rt3_rules and rt3_reg_table_size must be filled in before - calling libdwarf. Filled in with a pointer to an array - (pointer and array set up by the calling application) - of rt3_reg_table_size Dwarf_Regtable_Entry3_s structs. - libdwarf does not allocate or deallocate space for the - rules, you must do so. libdwarf will initialize the - contents rules array, you do not need to do so (though - if you choose to initialize the array somehow that is ok: - libdwarf will overwrite your initializations with its own). - -*/ -typedef struct Dwarf_Regtable3_s { - struct Dwarf_Regtable_Entry3_s rt3_cfa_rule; - - Dwarf_Half rt3_reg_table_size; - struct Dwarf_Regtable_Entry3_s * rt3_rules; -} Dwarf_Regtable3; - - -/* Use for DW_EPXR_STANDARD., DW_EXPR_VAL_OFFSET. - Returns DW_DLV_OK if the value is available. - If DW_DLV_OK returns the regnum and offset thru the pointers - (which the consumer must use appropriately). -*/ -int dwarf_frame_get_reg_register(struct Dwarf_Regtable_Entry3_s *reg_in, - Dwarf_Small *offset_relevant, - Dwarf_Half *regnum_out, - Dwarf_Signed *offset_out); - -/* Use for DW_EXPR_EXPRESSION, DW_EXPR_VAL_EXPRESSION. - Returns DW_DLV_OK if the value is available. - The caller must pass in the address of a valid - Dwarf_Block (the caller need not initialize it). -*/ -int dwarf_frame_get_reg_expression(struct Dwarf_Regtable_Entry3_s *reg_in, - Dwarf_Block *block_out); - - -/* For DW_DLC_SYMBOLIC_RELOCATIONS output to caller - v2, adding drd_length: some relocations are 4 and - some 8 bytes (pointers are 8, section offsets 4) in - some dwarf environments. (MIPS relocations are all one - size in any given ABI.) Changing drd_type to an unsigned char - to keep struct size down. -*/ -enum Dwarf_Rel_Type { - dwarf_drt_none, /* Should not get to caller */ - dwarf_drt_data_reloc, /* Simple normal relocation. */ - dwarf_drt_segment_rel, /* Special reloc, exceptions. */ - /* dwarf_drt_first_of_length_pair and drt_second - are for for the .word end - begin case. */ - dwarf_drt_first_of_length_pair, - dwarf_drt_second_of_length_pair -}; - -typedef struct Dwarf_P_Marker_s * Dwarf_P_Marker; -struct Dwarf_P_Marker_s { - Dwarf_Unsigned ma_marker; - Dwarf_Unsigned ma_offset; -}; - -typedef struct Dwarf_Relocation_Data_s * Dwarf_Relocation_Data; -struct Dwarf_Relocation_Data_s { - unsigned char drd_type; /* Cast to/from Dwarf_Rel_Type - to keep size small in struct. */ - unsigned char drd_length; /* Length in bytes of data being - relocated. 4 for 32bit data, - 8 for 64bit data. */ - Dwarf_Unsigned drd_offset; /* Where the data to reloc is. */ - Dwarf_Unsigned drd_symbol_index; -}; - -typedef struct Dwarf_P_String_Attr_s * Dwarf_P_String_Attr; -struct Dwarf_P_String_Attr_s { - Dwarf_Unsigned sa_offset; /* Offset of string attribute data */ - Dwarf_Unsigned sa_nbytes; -}; - - -/* Opaque types for Consumer Library. */ -typedef struct Dwarf_Debug_s* Dwarf_Debug; -typedef struct Dwarf_Die_s* Dwarf_Die; -typedef struct Dwarf_Line_s* Dwarf_Line; -typedef struct Dwarf_Global_s* Dwarf_Global; -typedef struct Dwarf_Func_s* Dwarf_Func; -typedef struct Dwarf_Type_s* Dwarf_Type; -typedef struct Dwarf_Var_s* Dwarf_Var; -typedef struct Dwarf_Weak_s* Dwarf_Weak; -typedef struct Dwarf_Error_s* Dwarf_Error; -typedef struct Dwarf_Attribute_s* Dwarf_Attribute; -typedef struct Dwarf_Abbrev_s* Dwarf_Abbrev; -typedef struct Dwarf_Fde_s* Dwarf_Fde; -typedef struct Dwarf_Cie_s* Dwarf_Cie; -typedef struct Dwarf_Arange_s* Dwarf_Arange; - -/* Opaque types for Producer Library. */ -typedef struct Dwarf_P_Debug_s* Dwarf_P_Debug; -typedef struct Dwarf_P_Die_s* Dwarf_P_Die; -typedef struct Dwarf_P_Attribute_s* Dwarf_P_Attribute; -typedef struct Dwarf_P_Fde_s* Dwarf_P_Fde; -typedef struct Dwarf_P_Expr_s* Dwarf_P_Expr; -typedef Dwarf_Unsigned Dwarf_Tag; - - -/* error handler function -*/ -typedef void (*Dwarf_Handler)(Dwarf_Error /*error*/, Dwarf_Ptr /*errarg*/); - - -/* Begin libdwarf Object File Interface declarations. - -As of February 2008 there are multiple dwarf_reader object access -initialization methods available: -The traditional dwarf_elf_init() and dwarf_init() and dwarf_finish() - which assume libelf and POSIX file access. -An object-file and library agnostic dwarf_object_init() and dwarf_object_finish() - which allow the coder to provide object access routines - abstracting away the elf interface. So there is no dependence in the - reader code on the object format and no dependence on libelf. - See the code in dwarf_elf_access.c and dwarf_original_elf_init.c - to see an example of initializing the structures mentioned below. - -Projects using dwarf_elf_init() or dwarf_init() can ignore -the Dwarf_Obj_Access* structures entirely as all these details -are completed for you. - -*/ - -typedef struct Dwarf_Obj_Access_Interface_s Dwarf_Obj_Access_Interface; -typedef struct Dwarf_Obj_Access_Methods_s Dwarf_Obj_Access_Methods; -typedef struct Dwarf_Obj_Access_Section_s Dwarf_Obj_Access_Section; - - -/* Used in the get_section interface function - in Dwarf_Obj_Access_Section_s. Since libdwarf - depends on standard DWARF section names an object - format that has no such names (but has some - method of setting up 'sections equivalents') - must arrange to return standard DWARF section - names in the 'name' field. libdwarf does - not free the strings in 'name'. */ -struct Dwarf_Obj_Access_Section_s { - Dwarf_Addr addr; - Dwarf_Unsigned size; - const char* name; - /* Set link to zero if it is meaningless. If non-zero - it should be a link to a rela section or from symtab - to strtab. In Elf it is sh_link. */ - Dwarf_Unsigned link; -}; - -/* Returned by the get_endianness function in - Dwarf_Obj_Access_Methods_s. */ -typedef enum { - DW_OBJECT_MSB, - DW_OBJECT_LSB -} Dwarf_Endianness; - -/* The functions we need to access object data from libdwarf are declared here. - - In these function pointer declarations - 'void *obj' is intended to be a pointer (the object field in - Dwarf_Obj_Access_Interface_s) - that hides the library-specific and object-specific data that makes - it possible to handle multiple object formats and multiple libraries. - It's not required that one handles multiple such in a single libdwarf - archive/shared-library (but not ruled out either). - See dwarf_elf_object_access_internals_t and dwarf_elf_access.c - for an example. - -*/ -struct Dwarf_Obj_Access_Methods_s { - /** - * get_section_info - * - * Get address, size, and name info about a section. - * - * Parameters - * section_index - Zero-based index. - * return_section - Pointer to a structure in which section info - * will be placed. Caller must provide a valid pointer to a - * structure area. The structure's contents will be overwritten - * by the call to get_section_info. - * error - A pointer to an integer in which an error code may be stored. - * - * Return - * DW_DLV_OK - Everything ok. - * DW_DLV_ERROR - Error occurred. Use 'error' to determine the - * libdwarf defined error. - * DW_DLV_NO_ENTRY - No such section. - */ - int (*get_section_info)(void* obj, Dwarf_Half section_index, - Dwarf_Obj_Access_Section* return_section, int* error); - /** - * get_byte_order - * - * Get whether the object file represented by this interface is big-endian - * (DW_OBJECT_MSB) or little endian (DW_OBJECT_LSB). - * - * Parameters - * obj - Equivalent to 'this' in OO languages. - * - * Return - * Endianness of object. Cannot fail. - */ - Dwarf_Endianness (*get_byte_order)(void* obj); - /** - * get_length_size - * - * Get the size of a length field in the underlying object file. - * libdwarf currently supports * 4 and 8 byte sizes, but may - * support larger in the future. - * Perhaps the return type should be an enumeration? - * - * Parameters - * obj - Equivalent to 'this' in OO languages. - * - * Return - * Size of length. Cannot fail. - */ - Dwarf_Small (*get_length_size)(void* obj); - /** - * get_pointer_size - * - * Get the size of a pointer field in the underlying object file. - * libdwarf currently supports 4 and 8 byte sizes. - * Perhaps the return type should be an enumeration? - - * Return - * Size of pointer. Cannot fail. - */ - Dwarf_Small (*get_pointer_size)(void* obj); - /** - * get_section_count - * - * Get the number of sections in the object file. - * - * Parameters - * - * Return - * Number of sections - */ - Dwarf_Unsigned (*get_section_count)(void* obj); - /** - * load_section - * - * Get a pointer to an array of bytes that represent the section. - * - * Parameters - * section_index - Zero-based index. - * return_data - The address of a pointer to which the section data block - * will be assigned. - * error - Pointer to an integer for returning libdwarf-defined - * error numbers. - * - * Return - * DW_DLV_OK - No error. - * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined - * error number. - * DW_DLV_NO_ENTRY - No such section. - */ - int (*load_section)(void* obj, Dwarf_Half section_index, - Dwarf_Small** return_data, int* error); - - /** - * relocate_a_section - * If relocations are not supported leave this pointer NULL. - * - * Get a pointer to an array of bytes that represent the section. - * - * Parameters - * section_index - Zero-based index of the section to be relocated. - * error - Pointer to an integer for returning libdwarf-defined - * error numbers. - * - * Return - * DW_DLV_OK - No error. - * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined - * error number. - * DW_DLV_NO_ENTRY - No such section. - */ - int (*relocate_a_section)(void* obj, Dwarf_Half section_index, - Dwarf_Debug dbg, - int* error); - -}; - - - -/* These structures are allocated and deallocated by your code - when you are using the libdwarf Object File Interface - [dwarf_object_init() and dwarf_object_finish()] directly. - dwarf_object_finish() does not free - struct Dwarf_Obj_Access_Interface_s or its content. - (libdwarf does record a pointer to this struct: you must - ensure that pointer remains valid for as long as - a libdwarf instance is open (meaning - after dwarf_init() and before dwarf_finish()). - - If you are reading Elf objects and libelf use dwarf_init() - or dwarf_elf_init() which take care of these details. -*/ -struct Dwarf_Obj_Access_Interface_s { - /* object is a void* as it hides the data the object access routines - need (which varies by library in use and object format). - */ - void* object; - const Dwarf_Obj_Access_Methods * methods; -}; - -/* End libdwarf Object File Interface */ - -/* - Dwarf_dealloc() alloc_type arguments. - Argument points to: -*/ -#define DW_DLA_STRING 0x01 /* char* */ -#define DW_DLA_LOC 0x02 /* Dwarf_Loc */ -#define DW_DLA_LOCDESC 0x03 /* Dwarf_Locdesc */ -#define DW_DLA_ELLIST 0x04 /* Dwarf_Ellist (not used)*/ -#define DW_DLA_BOUNDS 0x05 /* Dwarf_Bounds (not used) */ -#define DW_DLA_BLOCK 0x06 /* Dwarf_Block */ -#define DW_DLA_DEBUG 0x07 /* Dwarf_Debug */ -#define DW_DLA_DIE 0x08 /* Dwarf_Die */ -#define DW_DLA_LINE 0x09 /* Dwarf_Line */ -#define DW_DLA_ATTR 0x0a /* Dwarf_Attribute */ -#define DW_DLA_TYPE 0x0b /* Dwarf_Type (not used) */ -#define DW_DLA_SUBSCR 0x0c /* Dwarf_Subscr (not used) */ -#define DW_DLA_GLOBAL 0x0d /* Dwarf_Global */ -#define DW_DLA_ERROR 0x0e /* Dwarf_Error */ -#define DW_DLA_LIST 0x0f /* a list */ -#define DW_DLA_LINEBUF 0x10 /* Dwarf_Line* (not used) */ -#define DW_DLA_ARANGE 0x11 /* Dwarf_Arange */ -#define DW_DLA_ABBREV 0x12 /* Dwarf_Abbrev */ -#define DW_DLA_FRAME_OP 0x13 /* Dwarf_Frame_Op */ -#define DW_DLA_CIE 0x14 /* Dwarf_Cie */ -#define DW_DLA_FDE 0x15 /* Dwarf_Fde */ -#define DW_DLA_LOC_BLOCK 0x16 /* Dwarf_Loc Block (not used) */ -#define DW_DLA_FRAME_BLOCK 0x17 /* Dwarf_Frame Block (not used) */ -#define DW_DLA_FUNC 0x18 /* Dwarf_Func */ -#define DW_DLA_TYPENAME 0x19 /* Dwarf_Type */ -#define DW_DLA_VAR 0x1a /* Dwarf_Var */ -#define DW_DLA_WEAK 0x1b /* Dwarf_Weak */ -#define DW_DLA_ADDR 0x1c /* Dwarf_Addr sized entries */ -#define DW_DLA_RANGES 0x1d /* Dwarf_Ranges */ - -/* The augmenter string for CIE */ -#define DW_CIE_AUGMENTER_STRING_V0 "z" - -/* dwarf_init() access arguments -*/ -#define DW_DLC_READ 0 /* read only access */ -#define DW_DLC_WRITE 1 /* write only access */ -#define DW_DLC_RDWR 2 /* read/write access NOT SUPPORTED*/ - -/* pro_init() access flag modifiers - If HAVE_DWARF2_99_EXTENSION is defined at libdwarf build time - and DW_DLC_OFFSET_SIZE_64 is passed in pro_init() flags then the DWARF3 - 64 bit offset extension is used to generate 64 bit offsets. -*/ -#define DW_DLC_SIZE_64 0x40000000 /* 32-bit address-size target */ -#define DW_DLC_SIZE_32 0x20000000 /* 64-bit address-size target */ -#define DW_DLC_OFFSET_SIZE_64 0x10000000 /* 64-bit offset-size DWARF */ - -/* dwarf_pro_init() access flag modifiers -*/ -#define DW_DLC_ISA_MIPS 0x00000000 /* MIPS target */ -#define DW_DLC_ISA_IA64 0x01000000 /* IA64 target */ -#define DW_DLC_STREAM_RELOCATIONS 0x02000000 /* Old style binary relocs */ - - /* Usable with assembly output because it is up to the producer to - deal with locations in whatever manner the producer code wishes. - Possibly emitting text an assembler will recognize. */ -#define DW_DLC_SYMBOLIC_RELOCATIONS 0x04000000 - -#define DW_DLC_TARGET_BIGENDIAN 0x08000000 /* Big endian target */ -#define DW_DLC_TARGET_LITTLEENDIAN 0x00100000 /* Little endian target */ - -#if 0 - /* - The libdwarf producer interfaces jumble these two semantics together in - confusing ways. We *should* have flags like these... - But changing the code means a lot of diffs. So for now, - we leave things as they are - */ - #define DW_DLC_SUN_OFFSET32 0x00010000 /* use 32-bit sec offsets */ - #define DW_DLC_SUN_OFFSET64 0x00020000 /* use 64-bit sec offsets */ - #define DW_DLC_SUN_POINTER32 0x00040000 /* use 4 for address_size */ - #define DW_DLC_SUN_POINTER64 0x00080000 /* use 8 for address_size */ -#endif - -/* dwarf_pcline() slide arguments -*/ -#define DW_DLS_BACKWARD -1 /* slide backward to find line */ -#define DW_DLS_NOSLIDE 0 /* match exactly without sliding */ -#define DW_DLS_FORWARD 1 /* slide forward to find line */ - -/* libdwarf error numbers -*/ -#define DW_DLE_NE 0 /* no error */ -#define DW_DLE_VMM 1 /* dwarf format/library version mismatch */ -#define DW_DLE_MAP 2 /* memory map failure */ -#define DW_DLE_LEE 3 /* libelf error */ -#define DW_DLE_NDS 4 /* no debug section */ -#define DW_DLE_NLS 5 /* no line section */ -#define DW_DLE_ID 6 /* invalid descriptor for query */ -#define DW_DLE_IOF 7 /* I/O failure */ -#define DW_DLE_MAF 8 /* memory allocation failure */ -#define DW_DLE_IA 9 /* invalid argument */ -#define DW_DLE_MDE 10 /* mangled debugging entry */ -#define DW_DLE_MLE 11 /* mangled line number entry */ -#define DW_DLE_FNO 12 /* file not open */ -#define DW_DLE_FNR 13 /* file not a regular file */ -#define DW_DLE_FWA 14 /* file open with wrong access */ -#define DW_DLE_NOB 15 /* not an object file */ -#define DW_DLE_MOF 16 /* mangled object file header */ -#define DW_DLE_EOLL 17 /* end of location list entries */ -#define DW_DLE_NOLL 18 /* no location list section */ -#define DW_DLE_BADOFF 19 /* Invalid offset */ -#define DW_DLE_EOS 20 /* end of section */ -#define DW_DLE_ATRUNC 21 /* abbreviations section appears truncated*/ -#define DW_DLE_BADBITC 22 /* Address size passed to dwarf bad*/ - /* It is not an allowed size (64 or 32) */ - /* Error codes defined by the current Libdwarf Implementation. */ -#define DW_DLE_DBG_ALLOC 23 -#define DW_DLE_FSTAT_ERROR 24 -#define DW_DLE_FSTAT_MODE_ERROR 25 -#define DW_DLE_INIT_ACCESS_WRONG 26 -#define DW_DLE_ELF_BEGIN_ERROR 27 -#define DW_DLE_ELF_GETEHDR_ERROR 28 -#define DW_DLE_ELF_GETSHDR_ERROR 29 -#define DW_DLE_ELF_STRPTR_ERROR 30 -#define DW_DLE_DEBUG_INFO_DUPLICATE 31 -#define DW_DLE_DEBUG_INFO_NULL 32 -#define DW_DLE_DEBUG_ABBREV_DUPLICATE 33 -#define DW_DLE_DEBUG_ABBREV_NULL 34 -#define DW_DLE_DEBUG_ARANGES_DUPLICATE 35 -#define DW_DLE_DEBUG_ARANGES_NULL 36 -#define DW_DLE_DEBUG_LINE_DUPLICATE 37 -#define DW_DLE_DEBUG_LINE_NULL 38 -#define DW_DLE_DEBUG_LOC_DUPLICATE 39 -#define DW_DLE_DEBUG_LOC_NULL 40 -#define DW_DLE_DEBUG_MACINFO_DUPLICATE 41 -#define DW_DLE_DEBUG_MACINFO_NULL 42 -#define DW_DLE_DEBUG_PUBNAMES_DUPLICATE 43 -#define DW_DLE_DEBUG_PUBNAMES_NULL 44 -#define DW_DLE_DEBUG_STR_DUPLICATE 45 -#define DW_DLE_DEBUG_STR_NULL 46 -#define DW_DLE_CU_LENGTH_ERROR 47 -#define DW_DLE_VERSION_STAMP_ERROR 48 -#define DW_DLE_ABBREV_OFFSET_ERROR 49 -#define DW_DLE_ADDRESS_SIZE_ERROR 50 -#define DW_DLE_DEBUG_INFO_PTR_NULL 51 -#define DW_DLE_DIE_NULL 52 -#define DW_DLE_STRING_OFFSET_BAD 53 -#define DW_DLE_DEBUG_LINE_LENGTH_BAD 54 -#define DW_DLE_LINE_PROLOG_LENGTH_BAD 55 -#define DW_DLE_LINE_NUM_OPERANDS_BAD 56 -#define DW_DLE_LINE_SET_ADDR_ERROR 57 /* No longer used. */ -#define DW_DLE_LINE_EXT_OPCODE_BAD 58 -#define DW_DLE_DWARF_LINE_NULL 59 -#define DW_DLE_INCL_DIR_NUM_BAD 60 -#define DW_DLE_LINE_FILE_NUM_BAD 61 -#define DW_DLE_ALLOC_FAIL 62 -#define DW_DLE_NO_CALLBACK_FUNC 63 -#define DW_DLE_SECT_ALLOC 64 -#define DW_DLE_FILE_ENTRY_ALLOC 65 -#define DW_DLE_LINE_ALLOC 66 -#define DW_DLE_FPGM_ALLOC 67 -#define DW_DLE_INCDIR_ALLOC 68 -#define DW_DLE_STRING_ALLOC 69 -#define DW_DLE_CHUNK_ALLOC 70 -#define DW_DLE_BYTEOFF_ERR 71 -#define DW_DLE_CIE_ALLOC 72 -#define DW_DLE_FDE_ALLOC 73 -#define DW_DLE_REGNO_OVFL 74 -#define DW_DLE_CIE_OFFS_ALLOC 75 -#define DW_DLE_WRONG_ADDRESS 76 -#define DW_DLE_EXTRA_NEIGHBORS 77 -#define DW_DLE_WRONG_TAG 78 -#define DW_DLE_DIE_ALLOC 79 -#define DW_DLE_PARENT_EXISTS 80 -#define DW_DLE_DBG_NULL 81 -#define DW_DLE_DEBUGLINE_ERROR 82 -#define DW_DLE_DEBUGFRAME_ERROR 83 -#define DW_DLE_DEBUGINFO_ERROR 84 -#define DW_DLE_ATTR_ALLOC 85 -#define DW_DLE_ABBREV_ALLOC 86 -#define DW_DLE_OFFSET_UFLW 87 -#define DW_DLE_ELF_SECT_ERR 88 -#define DW_DLE_DEBUG_FRAME_LENGTH_BAD 89 -#define DW_DLE_FRAME_VERSION_BAD 90 -#define DW_DLE_CIE_RET_ADDR_REG_ERROR 91 -#define DW_DLE_FDE_NULL 92 -#define DW_DLE_FDE_DBG_NULL 93 -#define DW_DLE_CIE_NULL 94 -#define DW_DLE_CIE_DBG_NULL 95 -#define DW_DLE_FRAME_TABLE_COL_BAD 96 -#define DW_DLE_PC_NOT_IN_FDE_RANGE 97 -#define DW_DLE_CIE_INSTR_EXEC_ERROR 98 -#define DW_DLE_FRAME_INSTR_EXEC_ERROR 99 -#define DW_DLE_FDE_PTR_NULL 100 -#define DW_DLE_RET_OP_LIST_NULL 101 -#define DW_DLE_LINE_CONTEXT_NULL 102 -#define DW_DLE_DBG_NO_CU_CONTEXT 103 -#define DW_DLE_DIE_NO_CU_CONTEXT 104 -#define DW_DLE_FIRST_DIE_NOT_CU 105 -#define DW_DLE_NEXT_DIE_PTR_NULL 106 -#define DW_DLE_DEBUG_FRAME_DUPLICATE 107 -#define DW_DLE_DEBUG_FRAME_NULL 108 -#define DW_DLE_ABBREV_DECODE_ERROR 109 -#define DW_DLE_DWARF_ABBREV_NULL 110 -#define DW_DLE_ATTR_NULL 111 -#define DW_DLE_DIE_BAD 112 -#define DW_DLE_DIE_ABBREV_BAD 113 -#define DW_DLE_ATTR_FORM_BAD 114 -#define DW_DLE_ATTR_NO_CU_CONTEXT 115 -#define DW_DLE_ATTR_FORM_SIZE_BAD 116 -#define DW_DLE_ATTR_DBG_NULL 117 -#define DW_DLE_BAD_REF_FORM 118 -#define DW_DLE_ATTR_FORM_OFFSET_BAD 119 -#define DW_DLE_LINE_OFFSET_BAD 120 -#define DW_DLE_DEBUG_STR_OFFSET_BAD 121 -#define DW_DLE_STRING_PTR_NULL 122 -#define DW_DLE_PUBNAMES_VERSION_ERROR 123 -#define DW_DLE_PUBNAMES_LENGTH_BAD 124 -#define DW_DLE_GLOBAL_NULL 125 -#define DW_DLE_GLOBAL_CONTEXT_NULL 126 -#define DW_DLE_DIR_INDEX_BAD 127 -#define DW_DLE_LOC_EXPR_BAD 128 -#define DW_DLE_DIE_LOC_EXPR_BAD 129 -#define DW_DLE_ADDR_ALLOC 130 -#define DW_DLE_OFFSET_BAD 131 -#define DW_DLE_MAKE_CU_CONTEXT_FAIL 132 -#define DW_DLE_REL_ALLOC 133 -#define DW_DLE_ARANGE_OFFSET_BAD 134 -#define DW_DLE_SEGMENT_SIZE_BAD 135 -#define DW_DLE_ARANGE_LENGTH_BAD 136 -#define DW_DLE_ARANGE_DECODE_ERROR 137 -#define DW_DLE_ARANGES_NULL 138 -#define DW_DLE_ARANGE_NULL 139 -#define DW_DLE_NO_FILE_NAME 140 -#define DW_DLE_NO_COMP_DIR 141 -#define DW_DLE_CU_ADDRESS_SIZE_BAD 142 -#define DW_DLE_INPUT_ATTR_BAD 143 -#define DW_DLE_EXPR_NULL 144 -#define DW_DLE_BAD_EXPR_OPCODE 145 -#define DW_DLE_EXPR_LENGTH_BAD 146 -#define DW_DLE_MULTIPLE_RELOC_IN_EXPR 147 -#define DW_DLE_ELF_GETIDENT_ERROR 148 -#define DW_DLE_NO_AT_MIPS_FDE 149 -#define DW_DLE_NO_CIE_FOR_FDE 150 -#define DW_DLE_DIE_ABBREV_LIST_NULL 151 -#define DW_DLE_DEBUG_FUNCNAMES_DUPLICATE 152 -#define DW_DLE_DEBUG_FUNCNAMES_NULL 153 -#define DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR 154 -#define DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD 155 -#define DW_DLE_FUNC_NULL 156 -#define DW_DLE_FUNC_CONTEXT_NULL 157 -#define DW_DLE_DEBUG_TYPENAMES_DUPLICATE 158 -#define DW_DLE_DEBUG_TYPENAMES_NULL 159 -#define DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR 160 -#define DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD 161 -#define DW_DLE_TYPE_NULL 162 -#define DW_DLE_TYPE_CONTEXT_NULL 163 -#define DW_DLE_DEBUG_VARNAMES_DUPLICATE 164 -#define DW_DLE_DEBUG_VARNAMES_NULL 165 -#define DW_DLE_DEBUG_VARNAMES_VERSION_ERROR 166 -#define DW_DLE_DEBUG_VARNAMES_LENGTH_BAD 167 -#define DW_DLE_VAR_NULL 168 -#define DW_DLE_VAR_CONTEXT_NULL 169 -#define DW_DLE_DEBUG_WEAKNAMES_DUPLICATE 170 -#define DW_DLE_DEBUG_WEAKNAMES_NULL 171 -#define DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR 172 -#define DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD 173 -#define DW_DLE_WEAK_NULL 174 -#define DW_DLE_WEAK_CONTEXT_NULL 175 -#define DW_DLE_LOCDESC_COUNT_WRONG 176 -#define DW_DLE_MACINFO_STRING_NULL 177 -#define DW_DLE_MACINFO_STRING_EMPTY 178 -#define DW_DLE_MACINFO_INTERNAL_ERROR_SPACE 179 -#define DW_DLE_MACINFO_MALLOC_FAIL 180 -#define DW_DLE_DEBUGMACINFO_ERROR 181 -#define DW_DLE_DEBUG_MACRO_LENGTH_BAD 182 -#define DW_DLE_DEBUG_MACRO_MAX_BAD 183 -#define DW_DLE_DEBUG_MACRO_INTERNAL_ERR 184 -#define DW_DLE_DEBUG_MACRO_MALLOC_SPACE 185 -#define DW_DLE_DEBUG_MACRO_INCONSISTENT 186 -#define DW_DLE_DF_NO_CIE_AUGMENTATION 187 -#define DW_DLE_DF_REG_NUM_TOO_HIGH 188 -#define DW_DLE_DF_MAKE_INSTR_NO_INIT 189 -#define DW_DLE_DF_NEW_LOC_LESS_OLD_LOC 190 -#define DW_DLE_DF_POP_EMPTY_STACK 191 -#define DW_DLE_DF_ALLOC_FAIL 192 -#define DW_DLE_DF_FRAME_DECODING_ERROR 193 -#define DW_DLE_DEBUG_LOC_SECTION_SHORT 194 -#define DW_DLE_FRAME_AUGMENTATION_UNKNOWN 195 -#define DW_DLE_PUBTYPE_CONTEXT 196 /* Unused. */ -#define DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD 197 -#define DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR 198 -#define DW_DLE_DEBUG_PUBTYPES_DUPLICATE 199 -#define DW_DLE_FRAME_CIE_DECODE_ERROR 200 -#define DW_DLE_FRAME_REGISTER_UNREPRESENTABLE 201 -#define DW_DLE_FRAME_REGISTER_COUNT_MISMATCH 202 -#define DW_DLE_LINK_LOOP 203 -#define DW_DLE_STRP_OFFSET_BAD 204 -#define DW_DLE_DEBUG_RANGES_DUPLICATE 205 -#define DW_DLE_DEBUG_RANGES_OFFSET_BAD 206 -#define DW_DLE_DEBUG_RANGES_MISSING_END 207 -#define DW_DLE_DEBUG_RANGES_OUT_OF_MEM 208 -#define DW_DLE_DEBUG_SYMTAB_ERR 209 -#define DW_DLE_DEBUG_STRTAB_ERR 210 -#define DW_DLE_RELOC_MISMATCH_INDEX 211 -#define DW_DLE_RELOC_MISMATCH_RELOC_INDEX 212 -#define DW_DLE_RELOC_MISMATCH_STRTAB_INDEX 213 -#define DW_DLE_RELOC_SECTION_MISMATCH 214 -#define DW_DLE_RELOC_SECTION_MISSING_INDEX 215 -#define DW_DLE_RELOC_SECTION_LENGTH_ODD 216 -#define DW_DLE_RELOC_SECTION_PTR_NULL 217 -#define DW_DLE_RELOC_SECTION_MALLOC_FAIL 218 -#define DW_DLE_NO_ELF64_SUPPORT 219 -#define DW_DLE_MISSING_ELF64_SUPPORT 220 -#define DW_DLE_ORPHAN_FDE 221 -#define DW_DLE_DUPLICATE_INST_BLOCK 222 -#define DW_DLE_BAD_REF_SIG8_FORM 223 -#define DW_DLE_ATTR_EXPRLOC_FORM_BAD 224 -#define DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD 225 -#define DW_DLE_NOT_REF_FORM 226 -#define DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE 227 - - - - /* DW_DLE_LAST MUST EQUAL LAST ERROR NUMBER */ -#define DW_DLE_LAST 227 -#define DW_DLE_LO_USER 0x10000 - - /* Taken as meaning 'undefined value', this is not - a column or register number. - Only present at libdwarf runtime. Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - */ -#define DW_FRAME_UNDEFINED_VAL 1034 - - /* Taken as meaning 'same value' as caller had, not a column - or register number - Only present at libdwarf runtime. Never on disk. - DW_FRAME_* Values present on disk are in dwarf.h - */ -#define DW_FRAME_SAME_VAL 1035 - - - -/* error return values -*/ -#define DW_DLV_BADADDR (~(Dwarf_Addr)0) - /* for functions returning target address */ - -#define DW_DLV_NOCOUNT ((Dwarf_Signed)-1) - /* for functions returning count */ - -#define DW_DLV_BADOFFSET (~(Dwarf_Off)0) - /* for functions returning offset */ - -/* standard return values for functions */ -#define DW_DLV_NO_ENTRY -1 -#define DW_DLV_OK 0 -#define DW_DLV_ERROR 1 - -/* Special values for offset_into_exception_table field of dwarf fde's. */ -/* The following value indicates that there is no Exception table offset - associated with a dwarf frame. */ -#define DW_DLX_NO_EH_OFFSET (-1LL) -/* The following value indicates that the producer was unable to analyse the - source file to generate Exception tables for this function. */ -#define DW_DLX_EH_OFFSET_UNAVAILABLE (-2LL) - - -/*===========================================================================*/ -/* Dwarf consumer interface initialization and termination operations */ - -/* Initialization based on Unix open fd (using libelf internally). */ -int dwarf_init(int /*fd*/, - Dwarf_Unsigned /*access*/, - Dwarf_Handler /*errhand*/, - Dwarf_Ptr /*errarg*/, - Dwarf_Debug* /*dbg*/, - Dwarf_Error* /*error*/); - -/* Initialization based on libelf/sgi-fastlibelf open pointer. */ -int dwarf_elf_init(dwarf_elf_handle /*elf*/, - Dwarf_Unsigned /*access*/, - Dwarf_Handler /*errhand*/, - Dwarf_Ptr /*errarg*/, - Dwarf_Debug* /*dbg*/, - Dwarf_Error* /*error*/); - -/* Undocumented function for memory allocator. */ -void dwarf_print_memory_stats(Dwarf_Debug /*dbg*/); - -int dwarf_get_elf(Dwarf_Debug /*dbg*/, - dwarf_elf_handle* /*return_elfptr*/, - Dwarf_Error* /*error*/); - -int dwarf_finish(Dwarf_Debug /*dbg*/, Dwarf_Error* /*error*/); - - -int dwarf_object_init(Dwarf_Obj_Access_Interface* /* obj */, - Dwarf_Handler /* errhand */, - Dwarf_Ptr /* errarg */, - Dwarf_Debug* /* dbg */, - Dwarf_Error* /* error */); - -int dwarf_object_finish(Dwarf_Debug /* dbg */, - Dwarf_Error* /* error */); - -/* die traversal operations */ -int dwarf_next_cu_header_b(Dwarf_Debug /*dbg*/, - Dwarf_Unsigned* /*cu_header_length*/, - Dwarf_Half* /*version_stamp*/, - Dwarf_Off* /*abbrev_offset*/, - Dwarf_Half* /*address_size*/, - Dwarf_Half* /*length_size*/, - Dwarf_Half* /*extension_size*/, - Dwarf_Unsigned* /*next_cu_header_offset*/, - Dwarf_Error* /*error*/); -/* The following is now obsolete, though supported. November 2009. */ -int dwarf_next_cu_header(Dwarf_Debug /*dbg*/, - Dwarf_Unsigned* /*cu_header_length*/, - Dwarf_Half* /*version_stamp*/, - Dwarf_Off* /*abbrev_offset*/, - Dwarf_Half* /*address_size*/, - Dwarf_Unsigned* /*next_cu_header_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_siblingof(Dwarf_Debug /*dbg*/, - Dwarf_Die /*die*/, - Dwarf_Die* /*return_siblingdie*/, - Dwarf_Error* /*error*/); - -int dwarf_child(Dwarf_Die /*die*/, - Dwarf_Die* /*return_childdie*/, - Dwarf_Error* /*error*/); - -/* Finding die given global (not CU-relative) offset */ -int dwarf_offdie(Dwarf_Debug /*dbg*/, - Dwarf_Off /*offset*/, - Dwarf_Die* /*return_die*/, - Dwarf_Error* /*error*/); - -/* Higher level functions (Unimplemented) */ -int dwarf_pcfile(Dwarf_Debug /*dbg*/, - Dwarf_Addr /*pc*/, - Dwarf_Die* /*return_die*/, - Dwarf_Error* /*error*/); - -/* Unimplemented */ -int dwarf_pcsubr(Dwarf_Debug /*dbg*/, - Dwarf_Addr /*pc*/, - Dwarf_Die* /*return_die*/, - Dwarf_Error* /*error*/); - -/* Unimplemented */ -int dwarf_pcscope(Dwarf_Debug /*dbg*/, - Dwarf_Addr /*pc*/, - Dwarf_Die* /*return_die*/, - Dwarf_Error* /*error*/); - -/* operations on DIEs */ -int dwarf_tag(Dwarf_Die /*die*/, - Dwarf_Half* /*return_tag*/, - Dwarf_Error* /*error*/); - -/* utility? */ -/* dwarf_dieoffset returns the global debug_info - section offset, not the CU relative offset. */ -int dwarf_dieoffset(Dwarf_Die /*die*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -/* dwarf_CU_dieoffset_given_die returns - the global debug_info section offset of the CU die - that is the CU containing the given_die - (the passed in DIE can be any DIE). - This information makes it possible for a consumer to - find and print CU context information for any die. - See also dwarf_get_cu_die_offset_given_cu_header_offset(). */ -int dwarf_CU_dieoffset_given_die(Dwarf_Die /*given_die*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -/* dwarf_die_CU_offset returns the CU relative offset - not the global debug_info section offset, given - any DIE in the CU. See also dwarf_CU_dieoffset_given_die(). - */ -int dwarf_die_CU_offset(Dwarf_Die /*die*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_die_CU_offset_range(Dwarf_Die /*die*/, - Dwarf_Off* /*return_CU_header_offset*/, - Dwarf_Off* /*return_CU_length_bytes*/, - Dwarf_Error* /*error*/); - -int dwarf_attr (Dwarf_Die /*die*/, - Dwarf_Half /*attr*/, - Dwarf_Attribute * /*returned_attr*/, - Dwarf_Error* /*error*/); - -int dwarf_diename(Dwarf_Die /*die*/, - char ** /*diename*/, - Dwarf_Error* /*error*/); - -/* Returns the abbrev code of the die. Cannot fail. */ -int dwarf_die_abbrev_code(Dwarf_Die /*die */); - - -/* convenience functions, alternative to using dwarf_attrlist() */ -int dwarf_hasattr(Dwarf_Die /*die*/, - Dwarf_Half /*attr*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -/* dwarf_loclist_n preferred over dwarf_loclist */ -int dwarf_loclist_n(Dwarf_Attribute /*attr*/, - Dwarf_Locdesc*** /*llbuf*/, - Dwarf_Signed * /*locCount*/, - Dwarf_Error* /*error*/); - -int dwarf_loclist(Dwarf_Attribute /*attr*/, /* inflexible! */ - Dwarf_Locdesc** /*llbuf*/, - Dwarf_Signed * /*locCount*/, - Dwarf_Error* /*error*/); - -/* Extracts a dwarf expression from an expression byte stream. - Useful to get expressions from DW_CFA_def_cfa_expression - DW_CFA_expression DW_CFA_val_expression expression bytes. - 27 April 2009: dwarf_loclist_from_expr() interface with - no addr_size is obsolete but supported, - use dwarf_loclist_from_expr_a() instead. -*/ -int dwarf_loclist_from_expr(Dwarf_Debug dbg, - Dwarf_Ptr expression_in, - Dwarf_Unsigned expression_length, - Dwarf_Locdesc ** llbuf, - Dwarf_Signed * listlen, Dwarf_Error * error); - -/* dwarf_loclist_from_expr_a() new 27 Apr 2009: added addr_size argument. */ -int dwarf_loclist_from_expr_a(Dwarf_Debug dbg, - Dwarf_Ptr expression_in, - Dwarf_Unsigned expression_length, - Dwarf_Half addr_size, - Dwarf_Locdesc ** llbuf, - Dwarf_Signed * listlen, Dwarf_Error * error); - -/* Unimplemented */ -int dwarf_stringlen(Dwarf_Die /*die*/, - Dwarf_Locdesc ** /*returned_locdesc*/, - Dwarf_Error* /*error*/); - -/* Unimplemented */ -int dwarf_subscrcnt(Dwarf_Die /*die*/, - Dwarf_Signed * /*returned_count*/, - Dwarf_Error* /*error*/); - -/* Unimplemented */ -int dwarf_nthsubscr(Dwarf_Die /*die*/, - Dwarf_Unsigned /*ssndx*/, - Dwarf_Die * /*returned_die*/, - Dwarf_Error* /*error*/); - -int dwarf_lowpc(Dwarf_Die /*die*/, - Dwarf_Addr * /*returned_addr*/, - Dwarf_Error* /*error*/); - -int dwarf_highpc(Dwarf_Die /*die*/, - Dwarf_Addr * /*returned_addr*/, - Dwarf_Error* /*error*/); - -int dwarf_bytesize(Dwarf_Die /*die*/, - Dwarf_Unsigned * /*returned_size*/, - Dwarf_Error* /*error*/); - -/* Unimplemented */ -int dwarf_isbitfield(Dwarf_Die /*die*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -int dwarf_bitsize(Dwarf_Die /*die*/, - Dwarf_Unsigned * /*returned_size*/, - Dwarf_Error* /*error*/); - -int dwarf_bitoffset(Dwarf_Die /*die*/, - Dwarf_Unsigned * /*returned_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_srclang(Dwarf_Die /*die*/, - Dwarf_Unsigned * /*returned_lang*/, - Dwarf_Error* /*error*/); - -int dwarf_arrayorder(Dwarf_Die /*die*/, - Dwarf_Unsigned * /*returned_order*/, - Dwarf_Error* /*error*/); - -/* end of convenience function list */ - -/* this is the main interface to attributes of a DIE */ -int dwarf_attrlist(Dwarf_Die /*die*/, - Dwarf_Attribute** /*attrbuf*/, - Dwarf_Signed * /*attrcount*/, - Dwarf_Error* /*error*/); - -/* query operations for attributes */ -int dwarf_hasform(Dwarf_Attribute /*attr*/, - Dwarf_Half /*form*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -int dwarf_whatform(Dwarf_Attribute /*attr*/, - Dwarf_Half * /*returned_form*/, - Dwarf_Error* /*error*/); - -int dwarf_whatform_direct(Dwarf_Attribute /*attr*/, - Dwarf_Half * /*returned_form*/, - Dwarf_Error* /*error*/); - -int dwarf_whatattr(Dwarf_Attribute /*attr*/, - Dwarf_Half * /*returned_attr_num*/, - Dwarf_Error* /*error*/); - -/* - The following are concerned with the Primary Interface: getting - the actual data values. One function per 'kind' of FORM. -*/ -/* dwarf_formref returns, thru return_offset, a CU-relative offset - and does not allow DW_FORM_ref_addr*/ -int dwarf_formref(Dwarf_Attribute /*attr*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); -/* dwarf_global_formref returns, thru return_offset, - a debug_info-relative offset and does allow all reference forms*/ -int dwarf_global_formref(Dwarf_Attribute /*attr*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -/* dwarf_formsig8 returns in the caller-provided 8 byte area - the 8 bytes of a DW_FORM_ref_sig8. Not a string. */ -int dwarf_formsig8(Dwarf_Attribute /*attr*/, - Dwarf_Sig8 * /*returned sig bytes*/, - Dwarf_Error* /*error*/); - -int dwarf_formaddr(Dwarf_Attribute /*attr*/, - Dwarf_Addr * /*returned_addr*/, - Dwarf_Error* /*error*/); - -int dwarf_formflag(Dwarf_Attribute /*attr*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -int dwarf_formudata(Dwarf_Attribute /*attr*/, - Dwarf_Unsigned * /*returned_val*/, - Dwarf_Error* /*error*/); - -int dwarf_formsdata(Dwarf_Attribute /*attr*/, - Dwarf_Signed * /*returned_val*/, - Dwarf_Error* /*error*/); - -int dwarf_formblock(Dwarf_Attribute /*attr*/, - Dwarf_Block ** /*returned_block*/, - Dwarf_Error* /*error*/); - -int dwarf_formstring(Dwarf_Attribute /*attr*/, - char ** /*returned_string*/, - Dwarf_Error* /*error*/); - -int dwarf_formexprloc(Dwarf_Attribute /*attr*/, - Dwarf_Unsigned * /*return_exprlen*/, - Dwarf_Ptr * /*block_ptr*/, - Dwarf_Error * /*error*/); - - -/* end attribute query operations. */ - -/* line number operations */ -/* dwarf_srclines is the normal interface */ -int dwarf_srclines(Dwarf_Die /*die*/, - Dwarf_Line** /*linebuf*/, - Dwarf_Signed * /*linecount*/, - Dwarf_Error* /*error*/); - -/* dwarf_srclines_dealloc, created July 2005, is the new - method for deallocating what dwarf_srclines returns. - More complete free than using dwarf_dealloc directly. */ -void dwarf_srclines_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Line* /*linebuf*/, - Dwarf_Signed /*count */); - - -int dwarf_srcfiles(Dwarf_Die /*die*/, - char*** /*srcfiles*/, - Dwarf_Signed * /*filecount*/, - Dwarf_Error* /*error*/); - -/* Unimplemented. */ -int dwarf_dieline(Dwarf_Die /*die*/, - Dwarf_Line * /*returned_line*/, - Dwarf_Error * /*error*/); - -int dwarf_linebeginstatement(Dwarf_Line /*line*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -int dwarf_lineendsequence(Dwarf_Line /*line*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -int dwarf_lineno(Dwarf_Line /*line*/, - Dwarf_Unsigned * /*returned_lineno*/, - Dwarf_Error* /*error*/); - -int dwarf_line_srcfileno(Dwarf_Line /*line*/, - Dwarf_Unsigned * /*ret_fileno*/, - Dwarf_Error * /*error*/); - -int dwarf_lineaddr(Dwarf_Line /*line*/, - Dwarf_Addr * /*returned_addr*/, - Dwarf_Error* /*error*/); - -int dwarf_lineoff(Dwarf_Line /*line*/, - Dwarf_Signed * /*returned_lineoffset*/, - Dwarf_Error* /*error*/); - -int dwarf_linesrc(Dwarf_Line /*line*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_lineblock(Dwarf_Line /*line*/, - Dwarf_Bool * /*returned_bool*/, - Dwarf_Error* /*error*/); - -/* tertiary interface to line info */ -/* Unimplemented */ -int dwarf_pclines(Dwarf_Debug /*dbg*/, - Dwarf_Addr /*pc*/, - Dwarf_Line** /*linebuf*/, - Dwarf_Signed * /*linecount*/, - Dwarf_Signed /*slide*/, - Dwarf_Error* /*error*/); -/* end line number operations */ - -/* global name space operations (.debug_pubnames access) */ -int dwarf_get_globals(Dwarf_Debug /*dbg*/, - Dwarf_Global** /*globals*/, - Dwarf_Signed * /*number_of_globals*/, - Dwarf_Error* /*error*/); -void dwarf_globals_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Global* /*globals*/, - Dwarf_Signed /*number_of_globals*/); - -int dwarf_globname(Dwarf_Global /*glob*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_global_die_offset(Dwarf_Global /*global*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error * /*error*/); - -/* This returns the CU die global offset if one knows the - CU header global offset. - See also dwarf_CU_dieoffset_given_die(). */ -int dwarf_get_cu_die_offset_given_cu_header_offset( - Dwarf_Debug /*dbg*/, - Dwarf_Off /*in_cu_header_offset*/, - Dwarf_Off * /*out_cu_die_offset*/, - Dwarf_Error * /*err*/); -#ifdef __sgi /* pragma is sgi MIPS only */ -#pragma optional dwarf_get_cu_die_offset_given_cu_header_offset -#endif - -int dwarf_global_cu_offset(Dwarf_Global /*global*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_global_name_offsets(Dwarf_Global /*global*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* Static function name operations. */ -int dwarf_get_funcs(Dwarf_Debug /*dbg*/, - Dwarf_Func** /*funcs*/, - Dwarf_Signed * /*number_of_funcs*/, - Dwarf_Error* /*error*/); -void dwarf_funcs_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Func* /*funcs*/, - Dwarf_Signed /*number_of_funcs*/); - -int dwarf_funcname(Dwarf_Func /*func*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_func_die_offset(Dwarf_Func /*func*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_func_cu_offset(Dwarf_Func /*func*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_func_name_offsets(Dwarf_Func /*func*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* User-defined type name operations, SGI IRIX .debug_typenames section. - Same content as DWARF3 .debug_pubtypes, but defined years before - .debug_pubtypes was defined. SGI IRIX only. */ -int dwarf_get_types(Dwarf_Debug /*dbg*/, - Dwarf_Type** /*types*/, - Dwarf_Signed * /*number_of_types*/, - Dwarf_Error* /*error*/); -void dwarf_types_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Type* /*types*/, - Dwarf_Signed /*number_of_types*/); - - -int dwarf_typename(Dwarf_Type /*type*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_type_die_offset(Dwarf_Type /*type*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_type_cu_offset(Dwarf_Type /*type*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_type_name_offsets(Dwarf_Type /*type*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* User-defined type name operations, DWARF3 .debug_pubtypes section. -*/ -int dwarf_get_pubtypes(Dwarf_Debug /*dbg*/, - Dwarf_Type** /*types*/, - Dwarf_Signed * /*number_of_types*/, - Dwarf_Error* /*error*/); -void dwarf_pubtypes_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Type* /*pubtypes*/, - Dwarf_Signed /*number_of_pubtypes*/); - - -int dwarf_pubtypename(Dwarf_Type /*type*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_pubtype_die_offset(Dwarf_Type /*type*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_pubtype_cu_offset(Dwarf_Type /*type*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_pubtype_name_offsets(Dwarf_Type /*type*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* File-scope static variable name operations. */ -int dwarf_get_vars(Dwarf_Debug /*dbg*/, - Dwarf_Var** /*vars*/, - Dwarf_Signed * /*number_of_vars*/, - Dwarf_Error* /*error*/); -void dwarf_vars_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Var* /*vars*/, - Dwarf_Signed /*number_of_vars*/); - - -int dwarf_varname(Dwarf_Var /*var*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_var_die_offset(Dwarf_Var /*var*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_var_cu_offset(Dwarf_Var /*var*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_var_name_offsets(Dwarf_Var /*var*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* weak name operations. */ -int dwarf_get_weaks(Dwarf_Debug /*dbg*/, - Dwarf_Weak** /*weaks*/, - Dwarf_Signed * /*number_of_weaks*/, - Dwarf_Error* /*error*/); -void dwarf_weaks_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Weak* /*weaks*/, - Dwarf_Signed /*number_of_weaks*/); - - -int dwarf_weakname(Dwarf_Weak /*weak*/, - char ** /*returned_name*/, - Dwarf_Error* /*error*/); - -int dwarf_weak_die_offset(Dwarf_Weak /*weak*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_weak_cu_offset(Dwarf_Weak /*weak*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_weak_name_offsets(Dwarf_Weak /*weak*/, - char ** /*returned_name*/, - Dwarf_Off* /*die_offset*/, - Dwarf_Off* /*cu_offset*/, - Dwarf_Error* /*error*/); - -/* location list section operation. (.debug_loc access) */ -int dwarf_get_loclist_entry(Dwarf_Debug /*dbg*/, - Dwarf_Unsigned /*offset*/, - Dwarf_Addr* /*hipc*/, - Dwarf_Addr* /*lopc*/, - Dwarf_Ptr* /*data*/, - Dwarf_Unsigned* /*entry_len*/, - Dwarf_Unsigned* /*next_entry*/, - Dwarf_Error* /*error*/); - -/* abbreviation section operations */ -int dwarf_get_abbrev(Dwarf_Debug /*dbg*/, - Dwarf_Unsigned /*offset*/, - Dwarf_Abbrev * /*returned_abbrev*/, - Dwarf_Unsigned* /*length*/, - Dwarf_Unsigned* /*attr_count*/, - Dwarf_Error* /*error*/); - -int dwarf_get_abbrev_tag(Dwarf_Abbrev /*abbrev*/, - Dwarf_Half* /*return_tag_number*/, - Dwarf_Error* /*error*/); -int dwarf_get_abbrev_code(Dwarf_Abbrev /*abbrev*/, - Dwarf_Unsigned* /*return_code_number*/, - Dwarf_Error* /*error*/); - -int dwarf_get_abbrev_children_flag(Dwarf_Abbrev /*abbrev*/, - Dwarf_Signed* /*return_flag*/, - Dwarf_Error* /*error*/); - -int dwarf_get_abbrev_entry(Dwarf_Abbrev /*abbrev*/, - Dwarf_Signed /*index*/, - Dwarf_Half * /*returned_attr_num*/, - Dwarf_Signed* /*form*/, - Dwarf_Off* /*offset*/, - Dwarf_Error* /*error*/); - -/* consumer string section operation */ -int dwarf_get_str(Dwarf_Debug /*dbg*/, - Dwarf_Off /*offset*/, - char** /*string*/, - Dwarf_Signed * /*strlen_of_string*/, - Dwarf_Error* /*error*/); - -/* Consumer op on gnu .eh_frame info */ -int dwarf_get_fde_list_eh( - Dwarf_Debug /*dbg*/, - Dwarf_Cie** /*cie_data*/, - Dwarf_Signed* /*cie_element_count*/, - Dwarf_Fde** /*fde_data*/, - Dwarf_Signed* /*fde_element_count*/, - Dwarf_Error* /*error*/); - - -/* consumer operations on frame info: .debug_frame */ -int dwarf_get_fde_list(Dwarf_Debug /*dbg*/, - Dwarf_Cie** /*cie_data*/, - Dwarf_Signed* /*cie_element_count*/, - Dwarf_Fde** /*fde_data*/, - Dwarf_Signed* /*fde_element_count*/, - Dwarf_Error* /*error*/); - -/* Release storage gotten by dwarf_get_fde_list_eh() or - dwarf_get_fde_list() */ -void dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg, - Dwarf_Cie *cie_data, - Dwarf_Signed cie_element_count, - Dwarf_Fde *fde_data, - Dwarf_Signed fde_element_count); - - - -int dwarf_get_fde_range(Dwarf_Fde /*fde*/, - Dwarf_Addr* /*low_pc*/, - Dwarf_Unsigned* /*func_length*/, - Dwarf_Ptr* /*fde_bytes*/, - Dwarf_Unsigned* /*fde_byte_length*/, - Dwarf_Off* /*cie_offset*/, - Dwarf_Signed* /*cie_index*/, - Dwarf_Off* /*fde_offset*/, - Dwarf_Error* /*error*/); - -/* Useful for IRIX only: see dwarf_get_cie_augmentation_data() - dwarf_get_fde_augmentation_data() for GNU .eh_frame. */ -int dwarf_get_fde_exception_info(Dwarf_Fde /*fde*/, - Dwarf_Signed* /* offset_into_exception_tables */, - Dwarf_Error* /*error*/); - - -int dwarf_get_cie_of_fde(Dwarf_Fde /*fde*/, - Dwarf_Cie * /*cie_returned*/, - Dwarf_Error* /*error*/); - -int dwarf_get_cie_info(Dwarf_Cie /*cie*/, - Dwarf_Unsigned * /*bytes_in_cie*/, - Dwarf_Small* /*version*/, - char ** /*augmenter*/, - Dwarf_Unsigned* /*code_alignment_factor*/, - Dwarf_Signed* /*data_alignment_factor*/, - Dwarf_Half* /*return_address_register_rule*/, - Dwarf_Ptr* /*initial_instructions*/, - Dwarf_Unsigned* /*initial_instructions_length*/, - Dwarf_Error* /*error*/); - -/* dwarf_get_cie_index new September 2009. */ -int dwarf_get_cie_index( - Dwarf_Cie /*cie*/, - Dwarf_Signed* /*index*/, - Dwarf_Error* /*error*/ ); - - -int dwarf_get_fde_instr_bytes(Dwarf_Fde /*fde*/, - Dwarf_Ptr * /*outinstrs*/, Dwarf_Unsigned * /*outlen*/, - Dwarf_Error * /*error*/); - -int dwarf_get_fde_info_for_all_regs(Dwarf_Fde /*fde*/, - Dwarf_Addr /*pc_requested*/, - Dwarf_Regtable* /*reg_table*/, - Dwarf_Addr* /*row_pc*/, - Dwarf_Error* /*error*/); - -int dwarf_get_fde_info_for_all_regs3(Dwarf_Fde /*fde*/, - Dwarf_Addr /*pc_requested*/, - Dwarf_Regtable3* /*reg_table*/, - Dwarf_Addr* /*row_pc*/, - Dwarf_Error* /*error*/); - -/* In this older interface DW_FRAME_CFA_COL is a meaningful - column (which does not work well with DWARF3 or - non-MIPS architectures). */ -int dwarf_get_fde_info_for_reg(Dwarf_Fde /*fde*/, - Dwarf_Half /*table_column*/, - Dwarf_Addr /*pc_requested*/, - Dwarf_Signed* /*offset_relevant*/, - Dwarf_Signed* /*register*/, - Dwarf_Signed* /*offset*/, - Dwarf_Addr* /*row_pc*/, - Dwarf_Error* /*error*/); - -/* See discussion of dw_value_type, libdwarf.h. - Use of DW_FRAME_CFA_COL is not meaningful in this interface. - See dwarf_get_fde_info_for_cfa_reg3(). -*/ -/* dwarf_get_fde_info_for_reg3 is useful on a single column, but - it is inefficient to iterate across all table_columns using this - function. Instead call dwarf_get_fde_info_for_all_regs3() and index - into the table it fills in. */ -int dwarf_get_fde_info_for_reg3(Dwarf_Fde /*fde*/, - Dwarf_Half /*table_column*/, - Dwarf_Addr /*pc_requested*/, - Dwarf_Small * /*value_type*/, - Dwarf_Signed * /*offset_relevant*/, - Dwarf_Signed* /*register*/, - Dwarf_Signed* /*offset_or_block_len*/, - Dwarf_Ptr * /*block_ptr */, - Dwarf_Addr* /*row_pc_out*/, - Dwarf_Error* /*error*/); - -/* Use this to get the cfa. */ -int dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde /*fde*/, - Dwarf_Addr /*pc_requested*/, - Dwarf_Small * /*value_type*/, - Dwarf_Signed * /*offset_relevant*/, - Dwarf_Signed* /*register*/, - Dwarf_Signed* /*offset_or_block_len*/, - Dwarf_Ptr * /*block_ptr */, - Dwarf_Addr* /*row_pc_out*/, - Dwarf_Error* /*error*/); - -int dwarf_get_fde_for_die(Dwarf_Debug /*dbg*/, - Dwarf_Die /*subr_die */, - Dwarf_Fde * /*returned_fde*/, - Dwarf_Error* /*error*/); - -int dwarf_get_fde_n(Dwarf_Fde* /*fde_data*/, - Dwarf_Unsigned /*fde_index*/, - Dwarf_Fde * /*returned_fde*/, - Dwarf_Error* /*error*/); - -int dwarf_get_fde_at_pc(Dwarf_Fde* /*fde_data*/, - Dwarf_Addr /*pc_of_interest*/, - Dwarf_Fde * /*returned_fde*/, - Dwarf_Addr* /*lopc*/, - Dwarf_Addr* /*hipc*/, - Dwarf_Error* /*error*/); - -/* GNU .eh_frame augmentation information, raw form, see - Linux Standard Base Core Specification version 3.0 . */ -int dwarf_get_cie_augmentation_data(Dwarf_Cie /* cie*/, - Dwarf_Small ** /* augdata */, - Dwarf_Unsigned * /* augdata_len */, - Dwarf_Error* /*error*/); -/* GNU .eh_frame augmentation information, raw form, see - Linux Standard Base Core Specification version 3.0 . */ -int dwarf_get_fde_augmentation_data(Dwarf_Fde /* fde*/, - Dwarf_Small ** /* augdata */, - Dwarf_Unsigned * /* augdata_len */, - Dwarf_Error* /*error*/); - -int dwarf_expand_frame_instructions(Dwarf_Cie /*cie*/, - Dwarf_Ptr /*instruction*/, - Dwarf_Unsigned /*i_length*/, - Dwarf_Frame_Op** /*returned_op_list*/, - Dwarf_Signed* /*op_count*/, - Dwarf_Error* /*error*/); - -/* Operations on .debug_aranges. */ -int dwarf_get_aranges(Dwarf_Debug /*dbg*/, - Dwarf_Arange** /*aranges*/, - Dwarf_Signed * /*arange_count*/, - Dwarf_Error* /*error*/); - - - -int dwarf_get_arange( - Dwarf_Arange* /*aranges*/, - Dwarf_Unsigned /*arange_count*/, - Dwarf_Addr /*address*/, - Dwarf_Arange * /*returned_arange*/, - Dwarf_Error* /*error*/); - -int dwarf_get_cu_die_offset( - Dwarf_Arange /*arange*/, - Dwarf_Off* /*return_offset*/, - Dwarf_Error* /*error*/); - -int dwarf_get_arange_cu_header_offset( - Dwarf_Arange /*arange*/, - Dwarf_Off* /*return_cu_header_offset*/, - Dwarf_Error* /*error*/); -#ifdef __sgi /* pragma is sgi MIPS only */ -#pragma optional dwarf_get_arange_cu_header_offset -#endif - -/* DWARF2,3 interface. No longer really adequate (it was never - right for segmented address spaces, please switch - to using dwarf_get_arange_info_b instead. - There is no effective difference between these - functions if the address space - of the target is not segmented. */ -int dwarf_get_arange_info( - Dwarf_Arange /*arange*/, - Dwarf_Addr* /*start*/, - Dwarf_Unsigned* /*length*/, - Dwarf_Off* /*cu_die_offset*/, - Dwarf_Error* /*error*/ ); - -/* New for DWARF4, entries may have segment information. - *segment is only meaningful if *segment_entry_size is non-zero. */ -int dwarf_get_arange_info_b( - Dwarf_Arange /*arange*/, - Dwarf_Unsigned* /*segment*/, - Dwarf_Unsigned* /*segment_entry_size*/, - Dwarf_Addr * /*start*/, - Dwarf_Unsigned* /*length*/, - Dwarf_Off * /*cu_die_offset*/, - Dwarf_Error * /*error*/ ); - - -/* consumer .debug_macinfo information interface. -*/ -struct Dwarf_Macro_Details_s { - Dwarf_Off dmd_offset; /* offset, in the section, - of this macro info */ - Dwarf_Small dmd_type; /* the type, DW_MACINFO_define etc*/ - Dwarf_Signed dmd_lineno; /* the source line number where - applicable and vend_def # if - vendor_extension op - */ - - Dwarf_Signed dmd_fileindex;/* the source file index: - applies to define undef start_file - */ - char * dmd_macro; /* macro name (with value for defineop) - string from vendor ext - */ -}; - -/* dwarf_print_lines is for use by dwarfdump: it prints - line info to stdout. - The _dwarf name is obsolete. Use dwarf_ instead. - Added extra argnument 2/2009 for better checking. -*/ -int _dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/); -int dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/, - int * /*error_count_out */); - -/* dwarf_check_lineheader lets dwarfdump get detailed messages - about some compiler errors we detect. - We return the count of detected errors throught the - pointer. -*/ -void dwarf_check_lineheader(Dwarf_Die /*cu_die*/,int *errcount_out); - -/* dwarf_ld_sort_lines helps SGI IRIX ld - rearrange lines in .debug_line in a .o created with a text - section per function. - -OPT:procedure_reorder=ON - where ld-cord (cord(1)ing by ld, - not by cord(1)) may have changed the function order. - The _dwarf name is obsolete. Use dwarf_ instead. -*/ -int _dwarf_ld_sort_lines( - void * /*orig_buffer*/, - unsigned long /* buffer_len*/, - int /*is_64_bit*/, - int * /*any_change*/, - int * /*err_code*/); -int dwarf_ld_sort_lines( - void * /*orig_buffer*/, - unsigned long /*buffer_len*/, - int /*is_64_bit*/, - int * /*any_change*/, - int * /*err_code*/); - -/* Used by dwarfdump -v to print fde offsets from debugging - info. - The _dwarf name is obsolete. Use dwarf_ instead. -*/ -int _dwarf_fde_section_offset(Dwarf_Debug dbg, - Dwarf_Fde /*in_fde*/, - Dwarf_Off * /*fde_off*/, - Dwarf_Off * /*cie_off*/, - Dwarf_Error * /*err*/); -int dwarf_fde_section_offset(Dwarf_Debug dbg, - Dwarf_Fde /*in_fde*/, - Dwarf_Off * /*fde_off*/, - Dwarf_Off * /*cie_off*/, - Dwarf_Error * /*err*/); - -/* Used by dwarfdump -v to print cie offsets from debugging - info. - The _dwarf name is obsolete. Use dwarf_ instead. -*/ -int dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, - Dwarf_Cie /*in_cie*/, - Dwarf_Off * /*cie_off */, - Dwarf_Error * /*err*/); -int _dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, - Dwarf_Cie /*in_cie*/, - Dwarf_Off * /*cie_off*/, - Dwarf_Error * /*err*/); - -typedef struct Dwarf_Macro_Details_s Dwarf_Macro_Details; - -int dwarf_get_macro(Dwarf_Debug /*dbg*/, - char * /*requested_macro_name*/, - Dwarf_Addr /*pc_of_request*/, - char ** /*returned_macro_value*/, - Dwarf_Error * /*error*/); - -int dwarf_get_all_defined_macros(Dwarf_Debug /*dbg*/, - Dwarf_Addr /*pc_of_request*/, - Dwarf_Signed * /*returned_count*/, - char *** /*returned_pointers_to_macros*/, - Dwarf_Error * /*error*/); - -char *dwarf_find_macro_value_start(char * /*macro_string*/); - -int dwarf_get_macro_details(Dwarf_Debug /*dbg*/, - Dwarf_Off /*macro_offset*/, - Dwarf_Unsigned /*maximum_count*/, - Dwarf_Signed * /*entry_count*/, - Dwarf_Macro_Details ** /*details*/, - Dwarf_Error * /*err*/); - - -int dwarf_get_address_size(Dwarf_Debug /*dbg*/, - Dwarf_Half * /*addr_size*/, - Dwarf_Error * /*error*/); -int dwarf_get_die_address_size(Dwarf_Die /*die*/, - Dwarf_Half * /*addr_size*/, - Dwarf_Error * /*error*/); - -/* The dwarf specification separates FORMs into -different classes. To do the seperation properly -requires 4 pieces of data as of DWARF4 (thus the -function arguments listed here). -The DWARF4 specification class definition suffices to -describe all DWARF versions. -See section 7.5.4, Attribute Encodings. -A return of DW_FORM_CLASS_UNKNOWN means we could not properly figure -out what form-class it is. - - DW_FORM_CLASS_FRAMEPTR is MIPS/IRIX only, and refers - to the DW_AT_MIPS_fde attribute (a reference to the - .debug_frame section). -*/ -enum Dwarf_Form_Class { - DW_FORM_CLASS_UNKNOWN, DW_FORM_CLASS_ADDRESS, - DW_FORM_CLASS_BLOCK, DW_FORM_CLASS_CONSTANT, - DW_FORM_CLASS_EXPRLOC, DW_FORM_CLASS_FLAG, - DW_FORM_CLASS_LINEPTR, DW_FORM_CLASS_LOCLISTPTR, - DW_FORM_CLASS_MACPTR, DW_FORM_CLASS_RANGELISTPTR, - DW_FORM_CLASS_REFERENCE, DW_FORM_CLASS_STRING, - DW_FORM_CLASS_FRAMEPTR -}; - -enum Dwarf_Form_Class dwarf_get_form_class( - Dwarf_Half /* dwversion */, - Dwarf_Half /* attrnum */, - Dwarf_Half /*offset_size */, - Dwarf_Half /*form*/); - -/* utility operations */ -Dwarf_Unsigned dwarf_errno(Dwarf_Error /*error*/); - -char* dwarf_errmsg(Dwarf_Error /*error*/); - -/* stringcheck zero is default and means do all -** string length validity checks. -** Call with parameter value 1 to turn off many such checks (and -** increase performance). -** Call with zero for safest running. -** Actual value saved and returned is only 8 bits! Upper bits -** ignored by libdwarf (and zero on return). -** Returns previous value. -*/ -int dwarf_set_stringcheck(int /*stringcheck*/); - -/* 'apply' defaults to 1 and means do all - * 'rela' relocations on reading in a dwarf object section with - * such relocations. - * Call with parameter value 0 to turn off application of - * such relocations. - * Since the static linker leaves 'bogus' data in object sections - * with a 'rela' relocation section such data cannot be read - * sensibly without processing the relocations. Such relocations - * do not exist in executables and shared objects (.so), the - * relocations only exist in plain .o relocatable object files. - * Actual value saved and returned is only 8 bits! Upper bits - * ignored by libdwarf (and zero on return). - * Returns previous value. - * */ -int dwarf_set_reloc_application(int /*apply*/); - - -/* Unimplemented */ -Dwarf_Handler dwarf_seterrhand(Dwarf_Debug /*dbg*/, Dwarf_Handler /*errhand*/); - -/* Unimplemented */ -Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug /*dbg*/, Dwarf_Ptr /*errarg*/); - -void dwarf_dealloc(Dwarf_Debug /*dbg*/, void* /*space*/, - Dwarf_Unsigned /*type*/); - -/* DWARF Producer Interface */ - -typedef int (*Dwarf_Callback_Func)( - char* /*name*/, - int /*size*/, - Dwarf_Unsigned /*type*/, - Dwarf_Unsigned /*flags*/, - Dwarf_Unsigned /*link*/, - Dwarf_Unsigned /*info*/, - int* /*sect name index*/, - int* /*error*/); - -Dwarf_P_Debug dwarf_producer_init( - Dwarf_Unsigned /*creation_flags*/, - Dwarf_Callback_Func /*func*/, - Dwarf_Handler /*errhand*/, - Dwarf_Ptr /*errarg*/, - Dwarf_Error* /*error*/); - -typedef int (*Dwarf_Callback_Func_b)( - char* /*name*/, - int /*size*/, - Dwarf_Unsigned /*type*/, - Dwarf_Unsigned /*flags*/, - Dwarf_Unsigned /*link*/, - Dwarf_Unsigned /*info*/, - Dwarf_Unsigned* /*sect_name_index*/, - int* /*error*/); - - -Dwarf_P_Debug dwarf_producer_init_b( - Dwarf_Unsigned /*flags*/, - Dwarf_Callback_Func_b /*func*/, - Dwarf_Handler /*errhand*/, - Dwarf_Ptr /*errarg*/, - Dwarf_Error * /*error*/); - - -Dwarf_Signed dwarf_transform_to_disk_form(Dwarf_P_Debug /*dbg*/, - Dwarf_Error* /*error*/); - -Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug /*dbg*/, - Dwarf_Signed /*dwarf_section*/, - Dwarf_Signed* /*elf_section_index*/, - Dwarf_Unsigned* /*length*/, - Dwarf_Error* /*error*/); - -int dwarf_get_relocation_info_count( - Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned * /*count_of_relocation_sections*/, - int * /*drd_buffer_version*/, - Dwarf_Error* /*error*/); - -int dwarf_get_relocation_info( - Dwarf_P_Debug /*dbg*/, - Dwarf_Signed * /*elf_section_index*/, - Dwarf_Signed * /*elf_section_index_link*/, - Dwarf_Unsigned * /*relocation_buffer_count*/, - Dwarf_Relocation_Data * /*reldata_buffer*/, - Dwarf_Error* /*error*/); - -/* v1: no drd_length field, enum explicit */ -/* v2: has the drd_length field, enum value in uchar member */ -#define DWARF_DRD_BUFFER_VERSION 2 - -/* Markers are not written to DWARF2/3/4, they are user - defined and may be used for any purpose. -*/ -Dwarf_Signed dwarf_get_die_markers( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Marker * /*marker_list*/, - Dwarf_Unsigned * /*marker_count*/, - Dwarf_Error * /*error*/); - -int dwarf_get_string_attributes_count(Dwarf_P_Debug, - Dwarf_Unsigned *, - int *, - Dwarf_Error *); - -int dwarf_get_string_attributes_info(Dwarf_P_Debug, - Dwarf_Signed *, - Dwarf_Unsigned *, - Dwarf_P_String_Attr *, - Dwarf_Error *); - -void dwarf_reset_section_bytes(Dwarf_P_Debug /*dbg*/); - -Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug /*dbg*/, - Dwarf_Error* /*error*/); - -/* Producer attribute addition functions. */ -Dwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Unsigned /*pc_value*/, - Dwarf_Signed /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_block(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Small* /*block_data*/, - Dwarf_Unsigned /*block_len*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Unsigned /*pc_value*/, - Dwarf_Unsigned /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Unsigned /*pc_value*/, - Dwarf_Unsigned /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Unsigned /*value*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Signed /*value*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_P_Die /*otherdie*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_dataref( - Dwarf_P_Debug /* dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Unsigned /*pcvalue*/, - Dwarf_Unsigned /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die /*ownerdie*/, - char* /*string_value*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_P_Expr /*loc_expr*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - char* /*string*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*ownerdie*/, - Dwarf_Half /*attr*/, - Dwarf_Small /*flag*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die /*ownerdie*/, - char* /*producer_string*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die /*ownerdie*/, - Dwarf_Signed /*signed_value*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_const_value_unsignedint( - Dwarf_P_Die /*ownerdie*/, - Dwarf_Unsigned /*unsigned_value*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die /*ownerdie*/, - char* /*current_working_directory*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die /*die*/, - char* /*name*/, - Dwarf_Error* /*error*/); - -/* Producer line creation functions (.debug_line) */ -Dwarf_Unsigned dwarf_add_directory_decl(Dwarf_P_Debug /*dbg*/, - char* /*name*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_file_decl(Dwarf_P_Debug /*dbg*/, - char* /*name*/, - Dwarf_Unsigned /*dir_index*/, - Dwarf_Unsigned /*time_last_modified*/, - Dwarf_Unsigned /*length*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_line_entry(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*file_index*/, - Dwarf_Addr /*code_address*/, - Dwarf_Unsigned /*lineno*/, - Dwarf_Signed /*column_number*/, - Dwarf_Bool /*is_source_stmt_begin*/, - Dwarf_Bool /*is_basic_block_begin*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_lne_set_address(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*offset*/, - Dwarf_Unsigned /*symbol_index*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_lne_end_sequence(Dwarf_P_Debug /*dbg*/, - Dwarf_Addr /*end_address*/, - Dwarf_Error* /*error*/); - -/* Producer .debug_frame functions */ -Dwarf_Unsigned dwarf_add_frame_cie(Dwarf_P_Debug /*dbg*/, - char* /*augmenter*/, - Dwarf_Small /*code_alignent_factor*/, - Dwarf_Small /*data_alignment_factor*/, - Dwarf_Small /*return_address_reg*/, - Dwarf_Ptr /*initialization_bytes*/, - Dwarf_Unsigned /*init_byte_len*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_frame_fde( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Fde /*fde*/, - Dwarf_P_Die /*corresponding subprogram die*/, - Dwarf_Unsigned /*cie_to_use*/, - Dwarf_Unsigned /*virt_addr_of_described_code*/, - Dwarf_Unsigned /*length_of_code*/, - Dwarf_Unsigned /*symbol_index*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_frame_fde_b( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Fde /*fde*/, - Dwarf_P_Die /*die*/, - Dwarf_Unsigned /*cie*/, - Dwarf_Addr /*virt_addr*/, - Dwarf_Unsigned /*code_len*/, - Dwarf_Unsigned /*sym_idx*/, - Dwarf_Unsigned /*sym_idx_of_end*/, - Dwarf_Addr /*offset_from_end_sym*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_frame_info_b( - Dwarf_P_Debug dbg /*dbg*/, - Dwarf_P_Fde /*fde*/, - Dwarf_P_Die /*die*/, - Dwarf_Unsigned /*cie*/, - Dwarf_Addr /*virt_addr*/, - Dwarf_Unsigned /*code_len*/, - Dwarf_Unsigned /*symidx*/, - Dwarf_Unsigned /*end_symbol */, - Dwarf_Addr /*offset_from_end_symbol */, - Dwarf_Signed /*offset_into_exception_tables*/, - Dwarf_Unsigned /*exception_table_symbol*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_frame_info( - Dwarf_P_Debug dbg /*dbg*/, - Dwarf_P_Fde /*fde*/, - Dwarf_P_Die /*die*/, - Dwarf_Unsigned /*cie*/, - Dwarf_Addr /*virt_addr*/, - Dwarf_Unsigned /*code_len*/, - Dwarf_Unsigned /*symidx*/, - Dwarf_Signed /*offset_into_exception_tables*/, - Dwarf_Unsigned /*exception_table_symbol*/, - Dwarf_Error* /*error*/); - -Dwarf_P_Fde dwarf_add_fde_inst( - Dwarf_P_Fde /*fde*/, - Dwarf_Small /*op*/, - Dwarf_Unsigned /*val1*/, - Dwarf_Unsigned /*val2*/, - Dwarf_Error* /*error*/); - -/* New September 17, 2009 */ -int dwarf_insert_fde_inst_bytes( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Fde /*fde*/, - Dwarf_Unsigned /*len*/, - Dwarf_Ptr /*ibytes*/, - Dwarf_Error* /*error*/); - - -Dwarf_P_Fde dwarf_new_fde(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); - -Dwarf_P_Fde dwarf_fde_cfa_offset( - Dwarf_P_Fde /*fde*/, - Dwarf_Unsigned /*register_number*/, - Dwarf_Signed /*offset*/, - Dwarf_Error* /*error*/); - -/* die creation & addition routines */ -Dwarf_P_Die dwarf_new_die( - Dwarf_P_Debug /*dbg*/, - Dwarf_Tag /*tag*/, - Dwarf_P_Die /*parent*/, - Dwarf_P_Die /*child*/, - Dwarf_P_Die /*left */, - Dwarf_P_Die /*right*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_die_to_debug( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - Dwarf_Error* /*error*/); - -/* Markers are not written to DWARF2/3/4, they are user - defined and may be used for any purpose. -*/ -Dwarf_Unsigned dwarf_add_die_marker( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - Dwarf_Unsigned /*marker*/, - Dwarf_Error * /*error*/); - -Dwarf_Unsigned dwarf_get_die_marker( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - Dwarf_Unsigned * /*marker*/, - Dwarf_Error * /*error*/); - -Dwarf_P_Die dwarf_die_link( - Dwarf_P_Die /*die*/, - Dwarf_P_Die /*parent*/, - Dwarf_P_Die /*child*/, - Dwarf_P_Die /*left*/, - Dwarf_P_Die /*right*/, - Dwarf_Error* /*error*/); - -void dwarf_dealloc_compressed_block( - Dwarf_P_Debug, - void * -); - -/* Call this passing in return value from dwarf_uncompress_integer_block() - * to free the space the decompression allocated. */ -void dwarf_dealloc_uncompressed_block( - Dwarf_Debug, - void * -); - -void * dwarf_compress_integer_block( - Dwarf_P_Debug, /* dbg */ - Dwarf_Bool, /* signed==true (or unsigned) */ - Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ - void*, /* data */ - Dwarf_Unsigned, /* number of elements */ - Dwarf_Unsigned*, /* number of bytes in output block */ - Dwarf_Error* /* error */ -); - -/* Decode an array of signed leb integers (so of course the - * array is not composed of fixed length values, but is instead - * a sequence of sleb values). - * Returns a DW_DLV_BADADDR on error. - * Otherwise returns a pointer to an array of 32bit integers. - * The signed argument must be non-zero (the decode - * assumes sleb integers in the input data) at this time. - * Size of integer units must be 32 (32 bits each) at this time. - * Number of bytes in block is a byte count (not array count). - * Returns number of units in output block (ie, number of elements - * of the array that the return value points to) thru the argument. - */ -void * dwarf_uncompress_integer_block( - Dwarf_Debug, /* dbg */ - Dwarf_Bool, /* signed==true (or unsigned) */ - Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ - void*, /* input data */ - Dwarf_Unsigned, /* number of bytes in input */ - Dwarf_Unsigned*, /* number of units in output block */ - Dwarf_Error* /* error */ -); - -/* Operations to create location expressions. */ -Dwarf_P_Expr dwarf_new_expr(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); - -void dwarf_expr_reset( - Dwarf_P_Expr /*expr*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_expr_gen( - Dwarf_P_Expr /*expr*/, - Dwarf_Small /*opcode*/, - Dwarf_Unsigned /*val1*/, - Dwarf_Unsigned /*val2*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_expr_addr( - Dwarf_P_Expr /*expr*/, - Dwarf_Unsigned /*addr*/, - Dwarf_Signed /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_expr_addr_b( - Dwarf_P_Expr /*expr*/, - Dwarf_Unsigned /*addr*/, - Dwarf_Unsigned /*sym_index*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_expr_current_offset( - Dwarf_P_Expr /*expr*/, - Dwarf_Error* /*error*/); - -Dwarf_Addr dwarf_expr_into_block( - Dwarf_P_Expr /*expr*/, - Dwarf_Unsigned* /*length*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_arange(Dwarf_P_Debug /*dbg*/, - Dwarf_Addr /*begin_address*/, - Dwarf_Unsigned /*length*/, - Dwarf_Signed /*symbol_index*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_arange_b( - Dwarf_P_Debug /*dbg*/, - Dwarf_Addr /*begin_address*/, - Dwarf_Unsigned /*length*/, - Dwarf_Unsigned /*symbol_index*/, - Dwarf_Unsigned /*end_symbol_index*/, - Dwarf_Addr /*offset_from_end_symbol*/, - Dwarf_Error * /*error*/); - -Dwarf_Unsigned dwarf_add_pubname( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - char* /*pubname_name*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_funcname( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - char* /*func_name*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_typename( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - char* /*type_name*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_varname( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - char* /*var_name*/, - Dwarf_Error* /*error*/); - -Dwarf_Unsigned dwarf_add_weakname( - Dwarf_P_Debug /*dbg*/, - Dwarf_P_Die /*die*/, - char* /*weak_name*/, - Dwarf_Error* /*error*/); - -/* .debug_macinfo producer functions - Functions must be called in right order: the section is output - In the order these are presented. -*/ -int dwarf_def_macro(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*line*/, - char * /*macname, with (arglist), no space before (*/, - char * /*macvalue*/, - Dwarf_Error* /*error*/); - -int dwarf_undef_macro(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*line*/, - char * /*macname, no arglist, of course*/, - Dwarf_Error* /*error*/); - -int dwarf_start_macro_file(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*fileindex*/, - Dwarf_Unsigned /*linenumber*/, - Dwarf_Error* /*error*/); - -int dwarf_end_macro_file(Dwarf_P_Debug /*dbg*/, - Dwarf_Error* /*error*/); - -int dwarf_vendor_ext(Dwarf_P_Debug /*dbg*/, - Dwarf_Unsigned /*constant*/, - char * /*string*/, - Dwarf_Error* /*error*/); - -/* end macinfo producer functions */ - -int dwarf_attr_offset(Dwarf_Die /*die*/, - Dwarf_Attribute /*attr of above die*/, - Dwarf_Off * /*returns offset thru this ptr */, - Dwarf_Error * /*error*/); - -/* This is a hack so clients can verify offsets. - Added April 2005 so that debugger can detect broken offsets - (which happened in an IRIX executable larger than 2GB - with MIPSpro 7.3.1.3 toolchain.). -*/ -int -dwarf_get_section_max_offsets(Dwarf_Debug /*dbg*/, - Dwarf_Unsigned * /*debug_info_size*/, - Dwarf_Unsigned * /*debug_abbrev_size*/, - Dwarf_Unsigned * /*debug_line_size*/, - Dwarf_Unsigned * /*debug_loc_size*/, - Dwarf_Unsigned * /*debug_aranges_size*/, - Dwarf_Unsigned * /*debug_macinfo_size*/, - Dwarf_Unsigned * /*debug_pubnames_size*/, - Dwarf_Unsigned * /*debug_str_size*/, - Dwarf_Unsigned * /*debug_frame_size*/, - Dwarf_Unsigned * /*debug_ranges_size*/, - Dwarf_Unsigned * /*debug_pubtypes_size*/); - -/* Multiple releases spelled 'initial' as 'inital' . - The 'inital' spelling should not be used. */ -Dwarf_Half dwarf_set_frame_rule_inital_value(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); -/* Additional interface with correct 'initial' spelling. */ -/* It is likely you will want to call the following 5 functions - before accessing any frame information. All are useful - to tailor handling of pseudo-registers needed to turn - frame operation references into simpler forms and to - reflect ABI specific data. Of course altering libdwarf.h - and dwarf.h allow the same capabilities, but such header changes - do not let one change these values at runtime. */ -Dwarf_Half dwarf_set_frame_rule_initial_value(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); -Dwarf_Half dwarf_set_frame_rule_table_size(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); -Dwarf_Half dwarf_set_frame_cfa_value(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); -Dwarf_Half dwarf_set_frame_same_value(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); -Dwarf_Half dwarf_set_frame_undefined_value(Dwarf_Debug /*dbg*/, - Dwarf_Half /*value*/); - -/* As of April 27, 2009, this version with no diepointer is - obsolete though supported. Use dwarf_get_ranges_a() instead. */ -int dwarf_get_ranges(Dwarf_Debug /*dbg*/, - Dwarf_Off /*rangesoffset*/, - Dwarf_Ranges ** /*rangesbuf*/, - Dwarf_Signed * /*listlen*/, - Dwarf_Unsigned * /*bytecount*/, - Dwarf_Error * /*error*/); - -/* This adds the address_size argument. New April 27, 2009 */ -int dwarf_get_ranges_a(Dwarf_Debug /*dbg*/, - Dwarf_Off /*rangesoffset*/, - Dwarf_Die /* diepointer */, - Dwarf_Ranges ** /*rangesbuf*/, - Dwarf_Signed * /*listlen*/, - Dwarf_Unsigned * /*bytecount*/, - Dwarf_Error * /*error*/); - -void dwarf_ranges_dealloc(Dwarf_Debug /*dbg*/, - Dwarf_Ranges * /*rangesbuf*/, - Dwarf_Signed /*rangecount*/); - -/* The harmless error list is a circular buffer of - errors we note but which do not stop us from processing - the object. Created so dwarfdump or other tools - can report such inconsequential errors without causing - anything to stop early. */ -#define DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE 4 -#define DW_HARMLESS_ERROR_MSG_STRING_SIZE 200 -/* User code supplies size of array of pointers errmsg_ptrs_array - in count and the array of pointers (the pointers themselves - need not be initialized). - The pointers returned in the array of pointers - are invalidated by ANY call to libdwarf. - Use them before making another libdwarf call! - The array of string pointers passed in always has - a final null pointer, so if there are N pointers the - and M actual strings, then MIN(M,N-1) pointers are - set to point to error strings. The array of pointers - to strings always terminates with a NULL pointer. - If 'count' is passed in zero then errmsg_ptrs_array - is not touched. - - The function returns DW_DLV_NO_ENTRY if no harmless errors - were noted so far. Returns DW_DLV_OK if there are errors. - Never returns DW_DLV_ERROR. - - Each call empties the error list (discarding all current entries). - If newerr_count is non-NULL the count of harmless errors - since the last call is returned through the pointer - (some may have been discarded or not returned, it is a circular - list...). - If DW_DLV_NO_ENTRY is returned none of the arguments - here are touched or used. - */ -int dwarf_get_harmless_error_list(Dwarf_Debug /*dbg*/, - unsigned /*count*/, - const char ** /*errmsg_ptrs_array*/, - unsigned * /*newerr_count*/); - -/* Insertion is only for testing the harmless error code, it is not - necessarily useful otherwise. */ -void dwarf_insert_harmless_error(Dwarf_Debug /*dbg*/, - char * /*newerror*/); - -/* The size of the circular list of strings may be set - and reset as needed. If it is shortened excess - messages are simply dropped. It returns the previous - size. If zero passed in the size is unchanged - and it simply returns the current size */ -unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug /*dbg*/, - unsigned /*maxcount*/); -/* The harmless error strings (if any) are freed when the dbg - is dwarf_finish()ed. */ - -/* When the val_in is known these dwarf_get_TAG_name (etc) - functions return the string corresponding to the val_in passed in - through the pointer s_out and the value returned is DW_DLV_OK. - The strings are in static storage - and must not be freed. - If DW_DLV_NO_ENTRY is returned the val_in is not known and - *s_out is not set. DW_DLV_ERROR is never returned.*/ - -extern int dwarf_get_TAG_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_children_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_FORM_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_AT_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_OP_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ATE_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_DS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_END_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ATCF_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ACCESS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_VIS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_VIRTUALITY_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LANG_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ID_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CC_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_INL_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ORD_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_DSC_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LNS_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_LNE_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_MACINFO_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CFA_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_EH_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_FRAME_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_CHILDREN_name(unsigned int /*val_in*/, const char ** /*s_out */); -extern int dwarf_get_ADDR_name(unsigned int /*val_in*/, const char ** /*s_out */); - -#ifdef __cplusplus -} -#endif -#endif /* _LIBDWARF_H */ - - diff --git a/usr/src/tools/ctf/dwarf/common/libdwarfdefs.h b/usr/src/tools/ctf/dwarf/common/libdwarfdefs.h deleted file mode 100644 index a564655b23..0000000000 --- a/usr/src/tools/ctf/dwarf/common/libdwarfdefs.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -/* libdwarfdefs.h -*/ - -#ifndef LIBDWARFDEFS_H -#define LIBDWARFDEFS_H - -/* We want __uint32_t and __uint64_t and __int32_t __int64_t - properly defined but not duplicated, since duplicate typedefs - are not legal C. -*/ -/* - HAVE___UINT32_T - HAVE___UINT64_T will be set by configure if - our 4 types are predefined in compiler -*/ - - -#if (!defined(HAVE___UINT32_T)) && defined(HAVE___UINT32_T_IN_SGIDEFS_H) -#include <sgidefs.h> /* sgidefs.h defines them */ -#define HAVE___UINT32_T 1 -#endif - -#if (!defined(HAVE___UINT64_T)) && defined(HAVE___UINT64_T_IN_SGIDEFS_H) -#include <sgidefs.h> /* sgidefs.h defines them */ -#define HAVE___UINT64_T 1 -#endif - - -#if (!defined(HAVE___UINT32_T)) && \ - defined(HAVE_SYS_TYPES_H) && \ - defined(HAVE___UINT32_T_IN_SYS_TYPES_H) -# include <sys/types.h> -#define HAVE___UINT32_T 1 -#endif - -#if (!defined(HAVE___UINT64_T)) && \ - defined(HAVE_SYS_TYPES_H) && \ - defined(HAVE___UINT64_T_IN_SYS_TYPES_H) -# include <sys/types.h> -#define HAVE___UINT64_T 1 -#endif - -#ifndef HAVE___UINT32_T -typedef int __int32_t; -typedef unsigned __uint32_t; -#define HAVE___UINT32_T 1 -#endif - -#ifndef HAVE___UINT64_T -typedef long long __int64_t; -typedef unsigned long long __uint64_t; -#define HAVE___UINT64_T 1 -#endif - -#endif /* LIBDWARFDEFS_H */ diff --git a/usr/src/tools/ctf/dwarf/common/malloc_check.c b/usr/src/tools/ctf/dwarf/common/malloc_check.c deleted file mode 100644 index 1c6e7738e4..0000000000 --- a/usr/src/tools/ctf/dwarf/common/malloc_check.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - - Copyright (C) 2005 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* malloc_check.c For checking dealloc completeness. - - This code is as simple as possible and works ok for - reasonable size allocation counts. - - It treats allocation as global, and so will not - work very well if an application opens more than one - Dwarf_Debug. - -*/ - -#include <stdio.h> -#include <stdlib.h> /* for exit() and various malloc - prototypes */ -#include "config.h" -#include "dwarf_incl.h" -#include "malloc_check.h" -#ifdef WANT_LIBBDWARF_MALLOC_CHECK - -/* To turn off printing every entry, just change the define - to set PRINT_MALLOC_DETAILS 0. -*/ -#define PRINT_MALLOC_DETAILS 0 - -#define MC_TYPE_UNKNOWN 0 -#define MC_TYPE_ALLOC 1 -#define MC_TYPE_DEALLOC 2 - -struct mc_data_s { - struct mc_data_s *mc_prev; - unsigned long mc_address; /* Assumes this is large enough to hold - a pointer! */ - - long mc_alloc_number; /* Assigned in order by when record - created. */ - unsigned char mc_alloc_code; /* Allocation code, libdwarf. */ - unsigned char mc_type; - unsigned char mc_dealloc_noted; /* Used on an ALLOC node. */ - unsigned char mc_dealloc_noted_count; /* Used on an ALLOC - node. */ -}; - -/* - - -*/ -#define HASH_TABLE_SIZE 10501 -static struct mc_data_s *mc_data_hash[HASH_TABLE_SIZE]; -static long mc_data_list_size = 0; - -static char *alloc_type_name[MAX_DW_DLA + 1] = { - "", - "DW_DLA_STRING", - "DW_DLA_LOC", - "DW_DLA_LOCDESC", - "DW_DLA_ELLIST", - "DW_DLA_BOUNDS", - "DW_DLA_BLOCK", - "DW_DLA_DEBUG", - "DW_DLA_DIE", - "DW_DLA_LINE", - "DW_DLA_ATTR", - "DW_DLA_TYPE", - "DW_DLA_SUBSCR", - "DW_DLA_GLOBAL", - "DW_DLA_ERROR", - "DW_DLA_LIST", - "DW_DLA_LINEBUF", - "DW_DLA_ARANGE", - "DW_DLA_ABBREV", - "DW_DLA_FRAME_OP", - "DW_DLA_CIE", - "DW_DLA_FDE", - "DW_DLA_LOC_BLOCK", - "DW_DLA_FRAME_BLOCK", - "DW_DLA_FUNC", - "DW_DLA_TYPENAME", - "DW_DLA_VAR", - "DW_DLA_WEAK", - "DW_DLA_ADDR", - "DW_DLA_ABBREV_LIST", - "DW_DLA_CHAIN", - "DW_DLA_CU_CONTEXT", - "DW_DLA_FRAME", - "DW_DLA_GLOBAL_CONTEXT", - "DW_DLA_FILE_ENTRY", - "DW_DLA_LINE_CONTEXT", - "DW_DLA_LOC_CHAIN", - "DW_DLA_HASH_TABLE", - "DW_DLA_FUNC_CONTEXT", - "DW_DLA_TYPENAME_CONTEXT", - "DW_DLA_VAR_CONTEXT", - "DW_DLA_WEAK_CONTEXT", - "DW_DLA_PUBTYPES_CONTEXT" - /* Don't forget to expand this list if the list of codes - expands. */ -}; - -static unsigned -hash_address(unsigned long addr) -{ - unsigned long a = addr >> 2; - - return a % HASH_TABLE_SIZE; -} - -#if PRINT_MALLOC_DETAILS -static void -print_alloc_dealloc_detail(unsigned long addr, - int code, char *whichisit) -{ - fprintf(stderr, - "%s addr 0x%lx code %d (%s) entry %ld\n", - whichisit, addr, code, alloc_type_name[code], - mc_data_list_size); -} -#else -#define print_alloc_dealloc_detail(a,b,c) /* nothing */ -#endif - -/* Create a zeroed struct or die. */ -static void * -newone(void) -{ - struct mc_data_s *newd = malloc(sizeof(struct mc_data_s)); - - if (newd == 0) { - fprintf(stderr, "out of memory , # %ld\n", mc_data_list_size); - exit(1); - } - memset(newd, 0, sizeof(struct mc_data_s)); - return newd; -} - -/* Notify checker that get_alloc has allocated user data. */ -void -dwarf_malloc_check_alloc_data(void *addr_in, unsigned char code) -{ - struct mc_data_s *newd = newone(); - unsigned long addr = (unsigned long) addr_in; - struct mc_data_s **base = &mc_data_hash[hash_address(addr)]; - - print_alloc_dealloc_detail(addr, code, "alloc "); - newd->mc_address = addr; - newd->mc_alloc_code = code; - newd->mc_type = MC_TYPE_ALLOC; - newd->mc_alloc_number = mc_data_list_size; - newd->mc_prev = *base; - *base = newd; - newd->mc_alloc_number = mc_data_list_size; - mc_data_list_size += 1; -} - -static void -print_entry(char *msg, struct mc_data_s *data) -{ - fprintf(stderr, - "%s: 0x%08lx code %2d (%s) type %s dealloc noted %u ct %u\n", - msg, - (long) data->mc_address, - data->mc_alloc_code, - alloc_type_name[data->mc_alloc_code], - (data->mc_type == MC_TYPE_ALLOC) ? "alloc " : - (data->mc_type == MC_TYPE_DEALLOC) ? "dealloc" : "unknown", - (unsigned) data->mc_dealloc_noted, - (unsigned) data->mc_dealloc_noted_count); -} - -/* newd is a 'dealloc'. -*/ -static long -balanced_by_alloc_p(struct mc_data_s *newd, - long *addr_match_num, - struct mc_data_s **addr_match, - struct mc_data_s *base) -{ - struct mc_data_s *cur = base; - - for (; cur; cur = cur->mc_prev) { - if (cur->mc_address == newd->mc_address) { - if (cur->mc_type == MC_TYPE_ALLOC) { - if (cur->mc_alloc_code == newd->mc_alloc_code) { - *addr_match = cur; - *addr_match_num = cur->mc_alloc_number; - return cur->mc_alloc_number; - } else { - /* code mismatch */ - *addr_match = cur; - *addr_match_num = cur->mc_alloc_number; - return -1; - } - } else { - /* Unbalanced new/del */ - *addr_match = cur; - *addr_match_num = cur->mc_alloc_number; - return -1; - } - } - } - return -1; -} - -/* A dealloc is to take place. Ensure it balances an alloc. -*/ -void -dwarf_malloc_check_dealloc_data(void *addr_in, unsigned char code) -{ - struct mc_data_s *newd = newone(); - long prev; - long addr_match_num = -1; - struct mc_data_s *addr_match = 0; - unsigned long addr = (unsigned long) addr_in; - struct mc_data_s **base = &mc_data_hash[hash_address(addr)]; - - - print_alloc_dealloc_detail(addr, code, "dealloc "); - newd->mc_address = (unsigned long) addr; - newd->mc_alloc_code = code; - newd->mc_type = MC_TYPE_DEALLOC; - newd->mc_prev = *base; - prev = - balanced_by_alloc_p(newd, &addr_match_num, &addr_match, *base); - if (prev < 0) { - fprintf(stderr, - "Unbalanced dealloc at index %ld\n", mc_data_list_size); - print_entry("new", newd); - fprintf(stderr, "addr-match_num? %ld\n", addr_match_num); - if (addr_match) { - print_entry("prev entry", addr_match); - if (addr_match->mc_dealloc_noted > 1) { - fprintf(stderr, "Above is Duplicate dealloc!\n"); - } - } - abort(); - exit(3); - } - addr_match->mc_dealloc_noted = 1; - addr_match->mc_dealloc_noted_count += 1; - if (addr_match->mc_dealloc_noted_count > 1) { - fprintf(stderr, "Double dealloc entry %ld\n", addr_match_num); - print_entry("new dealloc entry", newd); - print_entry("bad alloc entry", addr_match); - } - *base = newd; - mc_data_list_size += 1; -} - -/* Final check for leaks. -*/ -void -dwarf_malloc_check_complete(char *msg) -{ - long i = 0; - long total = mc_data_list_size; - long hash_slots_used = 0; - long max_chain_length = 0; - - fprintf(stderr, "Run complete, %s. %ld entries\n", msg, total); - for (; i < HASH_TABLE_SIZE; ++i) { - struct mc_data_s *cur = mc_data_hash[i]; - long cur_chain_length = 0; - - if (cur == 0) - continue; - ++hash_slots_used; - for (; cur; cur = cur->mc_prev) { - ++cur_chain_length; - if (cur->mc_type == MC_TYPE_ALLOC) { - if (cur->mc_dealloc_noted) { - if (cur->mc_dealloc_noted > 1) { - fprintf(stderr, - " Duplicate dealloc! entry %ld\n", - cur->mc_alloc_number); - print_entry("duplicate dealloc", cur); - - } - continue; - } else { - fprintf(stderr, "malloc no dealloc, entry %ld\n", - cur->mc_alloc_number); - print_entry("dangle", cur); - } - } else { - /* mc_type is MC_TYPE_DEALLOC, already checked */ - - } - } - if (cur_chain_length > max_chain_length) { - max_chain_length = cur_chain_length; - } - } - fprintf(stderr, "mc hash table slots=%ld, " - "used=%ld, maxchain=%ld\n", - (long) HASH_TABLE_SIZE, hash_slots_used, max_chain_length); - return; -} - -#else - -extern void *libdwarf_an_unused_function_so_not_empty_c_file(); - -#endif /* WANT_LIBBDWARF_MALLOC_CHECK */ diff --git a/usr/src/tools/ctf/dwarf/common/malloc_check.h b/usr/src/tools/ctf/dwarf/common/malloc_check.h deleted file mode 100644 index ba1ad3da71..0000000000 --- a/usr/src/tools/ctf/dwarf/common/malloc_check.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - - Copyright (C) 2005 Silicon Graphics, Inc. All Rights Reserved. - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -/* malloc_check.h */ - -/* A simple libdwarf-aware malloc checker. - define WANT_LIBBDWARF_MALLOC_CHECK and rebuild libdwarf - do make a checking-for-alloc-mistakes libdwarf. - NOT recommended for production use. - - When defined, also add malloc_check.c to the list of - files in Makefile. -*/ - -#undef WANT_LIBBDWARF_MALLOC_CHECK -/*#define WANT_LIBBDWARF_MALLOC_CHECK 1 */ - -#ifdef WANT_LIBBDWARF_MALLOC_CHECK - -void dwarf_malloc_check_alloc_data(void * addr,unsigned char code); -void dwarf_malloc_check_dealloc_data(void * addr,unsigned char code); -void dwarf_malloc_check_complete(char *wheremsg); /* called at exit of app */ - -#else /* !WANT_LIBBDWARF_MALLOC_CHECK */ - -#define dwarf_malloc_check_alloc_data(a,b) /* nothing */ -#define dwarf_malloc_check_dealloc_data(a,b) /* nothing */ -#define dwarf_malloc_check_complete(a) /* nothing */ - -#endif /* WANT_LIBBDWARF_MALLOC_CHECK */ diff --git a/usr/src/tools/ctf/dwarf/common/mapfile-vers b/usr/src/tools/ctf/dwarf/common/mapfile-vers deleted file mode 100644 index c1a652a591..0000000000 --- a/usr/src/tools/ctf/dwarf/common/mapfile-vers +++ /dev/null @@ -1,302 +0,0 @@ -# -# This file and its contents are supplied under the terms of the -# Common Development and Distribution License ("CDDL"), version 1.0. -# You may only use this file in accordance with the terms of version -# 1.0 of the CDDL. -# -# A full copy of the text of the CDDL should have accompanied this -# source. A copy of the CDDL is also available via the Internet at -# http://www.illumos.org/license/CDDL. -# - -# -# Copyright 2011, Richard Lowe. -# - -# -# MAPFILE HEADER START -# -# WARNING: STOP NOW. DO NOT MODIFY THIS FILE. -# Object versioning must comply with the rules detailed in -# -# usr/src/lib/README.mapfiles -# -# You should not be making modifications here until you've read the most current -# copy of that file. If you need help, contact a gatekeeper for guidance. -# -# MAPFILE HEADER END -# - -$mapfile_version 2 - -SYMBOL_VERSION ILLUMOSprivate_1.1 { - global: - dwarf_add_arange; - dwarf_add_arange_b; - dwarf_add_AT_block; - dwarf_add_AT_comp_dir; - dwarf_add_AT_const_value_signedint; - dwarf_add_AT_const_value_string; - dwarf_add_AT_const_value_unsignedint; - dwarf_add_AT_dataref; - dwarf_add_AT_flag; - dwarf_add_AT_location_expr; - dwarf_add_AT_name; - dwarf_add_AT_producer; - dwarf_add_AT_ref_address; - dwarf_add_AT_reference; - dwarf_add_AT_signed_const; - dwarf_add_AT_string; - dwarf_add_AT_targ_address; - dwarf_add_AT_targ_address_b; - dwarf_add_AT_unsigned_const; - dwarf_add_die_marker; - dwarf_add_die_to_debug; - dwarf_add_directory_decl; - dwarf_add_expr_addr; - dwarf_add_expr_addr_b; - dwarf_add_expr_gen; - dwarf_add_fde_inst; - dwarf_add_file_decl; - dwarf_add_frame_cie; - dwarf_add_frame_fde; - dwarf_add_frame_fde_b; - dwarf_add_frame_info; - dwarf_add_frame_info_b; - dwarf_add_funcname; - dwarf_add_line_entry; - dwarf_add_pubname; - dwarf_add_typename; - dwarf_add_varname; - dwarf_add_weakname; - dwarf_arrayorder; - dwarf_attr; - dwarf_attr_offset; - dwarf_attrlist; - dwarf_bitoffset; - dwarf_bitsize; - dwarf_bytesize; - dwarf_check_lineheader; - dwarf_child; - dwarf_cie_section_offset; - dwarf_compress_integer_block; - dwarf_create_cie_from_after_start; - dwarf_create_fde_from_after_start; - dwarf_CU_dieoffset_given_die; - dwarf_dealloc; - dwarf_dealloc_compressed_block; - dwarf_dealloc_uncompressed_block; - dwarf_def_macro; - dwarf_die_abbrev_code; - dwarf_die_CU_offset; - dwarf_die_CU_offset_range; - dwarf_die_link; - dwarf_diename; - dwarf_dieoffset; - dwarf_elf_init; - dwarf_elf_object_access_finish; - dwarf_elf_object_access_init; - dwarf_end_macro_file; - dwarf_errmsg; - dwarf_errno; - dwarf_expand_frame_instructions; - dwarf_expr_current_offset; - dwarf_expr_into_block; - dwarf_expr_reset; - dwarf_fde_cfa_offset; - dwarf_fde_cie_list_dealloc; - dwarf_fde_section_offset; - dwarf_find_macro_value_start; - dwarf_finish; - dwarf_formaddr; - dwarf_formblock; - dwarf_formexprloc; - dwarf_formflag; - dwarf_formref; - dwarf_formsdata; - dwarf_formsig8; - dwarf_formstring; - dwarf_formudata; - dwarf_free_line_table_prefix; - dwarf_func_cu_offset; - dwarf_func_die_offset; - dwarf_func_name_offsets; - dwarf_funcname; - dwarf_funcs_dealloc; - dwarf_get_abbrev; - dwarf_get_abbrev_children_flag; - dwarf_get_abbrev_code; - dwarf_get_abbrev_entry; - dwarf_get_abbrev_tag; - dwarf_get_ACCESS_name; - dwarf_get_ADDR_name; - dwarf_get_address_size; - dwarf_get_arange; - dwarf_get_arange_cu_header_offset; - dwarf_get_arange_info; - dwarf_get_arange_info_b; - dwarf_get_aranges; - dwarf_get_AT_name; - dwarf_get_ATCF_name; - dwarf_get_ATE_name; - dwarf_get_CC_name; - dwarf_get_CFA_name; - dwarf_get_children_name; - dwarf_get_CHILDREN_name; - dwarf_get_cie_augmentation_data; - dwarf_get_cie_index; - dwarf_get_cie_info; - dwarf_get_cie_of_fde; - dwarf_get_cu_die_offset; - dwarf_get_cu_die_offset_given_cu_header_offset; - dwarf_get_die_address_size; - dwarf_get_die_marker; - dwarf_get_die_markers; - dwarf_get_DS_name; - dwarf_get_DSC_name; - dwarf_get_EH_name; - dwarf_get_elf; - dwarf_get_END_name; - dwarf_get_fde_at_pc; - dwarf_get_fde_augmentation_data; - dwarf_get_fde_exception_info; - dwarf_get_fde_for_die; - dwarf_get_fde_info_for_all_regs; - dwarf_get_fde_info_for_all_regs3; - dwarf_get_fde_info_for_cfa_reg3; - dwarf_get_fde_info_for_reg; - dwarf_get_fde_info_for_reg3; - dwarf_get_fde_instr_bytes; - dwarf_get_fde_list; - dwarf_get_fde_list_eh; - dwarf_get_fde_n; - dwarf_get_fde_range; - dwarf_get_form_class; - dwarf_get_FORM_name; - dwarf_get_FRAME_name; - dwarf_get_funcs; - dwarf_get_globals; - dwarf_get_harmless_error_list; - dwarf_get_ID_name; - dwarf_get_INL_name; - dwarf_get_ISA_name; - dwarf_get_LANG_name; - dwarf_get_LNE_name; - dwarf_get_LNS_name; - dwarf_get_loclist_entry; - dwarf_get_MACINFO_name; - dwarf_get_macro_details; - dwarf_get_OP_name; - dwarf_get_ORD_name; - dwarf_get_pubtypes; - dwarf_get_ranges; - dwarf_get_ranges_a; - dwarf_get_relocation_info; - dwarf_get_relocation_info_count; - dwarf_get_section_bytes; - dwarf_get_section_max_offsets; - dwarf_get_str; - dwarf_get_string_attributes_count; - dwarf_get_string_attributes_info; - dwarf_get_TAG_name; - dwarf_get_types; - dwarf_get_vars; - dwarf_get_VIRTUALITY_name; - dwarf_get_VIS_name; - dwarf_get_weaks; - dwarf_global_cu_offset; - dwarf_global_die_offset; - dwarf_global_formref; - dwarf_global_name_offsets; - dwarf_globals_dealloc; - dwarf_globname; - dwarf_harmless_cleanout; - dwarf_harmless_init; - dwarf_hasattr; - dwarf_hasform; - dwarf_highpc; - dwarf_init; - dwarf_init_line_table_prefix; - dwarf_insert_fde_inst_bytes; - dwarf_insert_harmless_error; - dwarf_ld_sort_lines; - dwarf_line_srcfileno; - dwarf_lineaddr; - dwarf_linebeginstatement; - dwarf_lineblock; - dwarf_lineendsequence; - dwarf_lineno; - dwarf_lineoff; - dwarf_linesrc; - dwarf_lne_end_sequence; - dwarf_lne_set_address; - dwarf_loclist; - dwarf_loclist_from_expr; - dwarf_loclist_from_expr_a; - dwarf_loclist_n; - dwarf_lowpc; - dwarf_new_die; - dwarf_new_expr; - dwarf_new_fde; - dwarf_next_cu_header; - dwarf_next_cu_header_b; - dwarf_nextglob; - dwarf_object_finish; - dwarf_object_init; - dwarf_offdie; - dwarf_p_dealloc; - dwarf_print_lines; - dwarf_print_memory_stats; - dwarf_producer_finish; - dwarf_producer_init; - dwarf_producer_init_b; - dwarf_pubtype_cu_offset; - dwarf_pubtype_name_offsets; - dwarf_pubtype_type_die_offset; - dwarf_pubtypename; - dwarf_pubtypes_dealloc; - dwarf_ranges_dealloc; - dwarf_read_cie_fde_prefix; - dwarf_read_line_table_prefix; - dwarf_reset_section_bytes; - dwarf_set_frame_cfa_value; - dwarf_set_frame_rule_inital_value; - dwarf_set_frame_rule_initial_value; - dwarf_set_frame_rule_table_size; - dwarf_set_frame_same_value; - dwarf_set_frame_undefined_value; - dwarf_set_harmless_error_list_size; - dwarf_set_reloc_application; - dwarf_set_stringcheck; - dwarf_siblingof; - dwarf_srcfiles; - dwarf_srclang; - dwarf_srclines; - dwarf_srclines_dealloc; - dwarf_start_macro_file; - dwarf_tag; - dwarf_transform_to_disk_form; - dwarf_type_cu_offset; - dwarf_type_die_offset; - dwarf_type_name_offsets; - dwarf_typename; - dwarf_types_dealloc; - dwarf_uncompress_integer_block; - dwarf_undef_macro; - dwarf_var_cu_offset; - dwarf_var_die_offset; - dwarf_var_name_offsets; - dwarf_varname; - dwarf_vars_dealloc; - dwarf_vendor_ext; - dwarf_weak_cu_offset; - dwarf_weak_die_offset; - dwarf_weak_name_offsets; - dwarf_weakname; - dwarf_weaks_dealloc; - dwarf_whatattr; - dwarf_whatform; - dwarf_whatform_direct; - local: - *; -}; diff --git a/usr/src/tools/ctf/dwarf/common/pro_alloc.c b/usr/src/tools/ctf/dwarf/common/pro_alloc.c deleted file mode 100644 index 1ca7806239..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_alloc.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "pro_incl.h" -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif /* HAVE_STDLIB_H */ -#ifdef HAVE_STRING_H -#include <string.h> -#endif /* HAVE_STRING_H */ -#include <malloc.h> - -/* - When each block is allocated, there is a two-word structure - allocated at the beginning so the block can go on a list. - The address returned is the address *after* the two pointers - at the start. But this allows us to be given a pointer to - a generic block, and go backwards to find the list-node. Then - we can remove this block from it's list without the need to search - through a linked list in order to remove the node. It also allows - us to 'delete' a memory block without needing the dbg structure. - We still need the dbg structure on allocation so that we know which - linked list to add the block to. - - Only the allocation of the dbg structure itself cannot use _dwarf_p_get_alloc. - That structure should be set up by hand, and the two list pointers - should be initialized to point at the node itself. That initializes - the doubly linked list. -*/ - -#define LIST_TO_BLOCK(lst) ((void*) (((char *)lst) + sizeof(memory_list_t))) -#define BLOCK_TO_LIST(blk) ((memory_list_t*) (((char*)blk) - sizeof(memory_list_t))) - - -/* - dbg should be NULL only when allocating dbg itself. In that - case we initialize it to an empty circular doubly-linked list. -*/ - -Dwarf_Ptr -_dwarf_p_get_alloc(Dwarf_P_Debug dbg, Dwarf_Unsigned size) -{ - void *sp; - memory_list_t *lp = NULL; - memory_list_t *dbglp = NULL; - memory_list_t *nextblock = NULL; - - /* alloc control struct and data block together for performance reasons */ - lp = (memory_list_t *) malloc(size + sizeof(memory_list_t)); - if (lp == NULL) { - /* should throw an error */ - return NULL; - } - - /* point to 'size' bytes just beyond lp struct */ - sp = LIST_TO_BLOCK(lp); - memset(sp, 0, size); - - if (dbg == NULL) { - lp->next = lp->prev = lp; - } else { - /* I always have to draw a picture to understand this part. */ - - dbglp = BLOCK_TO_LIST(dbg); - nextblock = dbglp->next; - - /* Insert between dbglp and nextblock */ - dbglp->next = lp; - lp->prev = dbglp; - lp->next = nextblock; - nextblock->prev = lp; - } - - return sp; -} - -/* - This routine is only here in case a caller of an older version of the - library is calling this for some reason. - We will clean up any stray blocks when the session is closed. - No need to remove this block. In theory the user might be - depending on the fact that we used to just 'free' this. - In theory they might also be - passing a block that they got from libdwarf. So we don't know if we - should try to remove this block from our global list. Safest just to - do nothing at this point. - - !!! - This function is deprecated! Don't call it inside libdwarf or outside of it. - !!! -*/ - -void -dwarf_p_dealloc(Dwarf_Small * ptr) -{ - return; -} - -/* - The dbg structure is not needed here anymore. -*/ - -void -_dwarf_p_dealloc(Dwarf_P_Debug dbg, Dwarf_Small * ptr) /* ARGSUSED */ -{ - memory_list_t *lp; - lp = BLOCK_TO_LIST(ptr); - - /* - Remove from a doubly linked, circular list. - Read carefully, use a white board if necessary. - If this is an empty list, the following statements are no-ops, and - will write to the same memory location they read from. - This should only happen when we deallocate the dbg structure itself. - */ - - lp->prev->next = lp->next; - lp->next->prev = lp->prev; - - free((void*)lp); -} - - -/* - This routine deallocates all the nodes on the dbg list, - and then deallocates the dbg structure itself. -*/ - -void -_dwarf_p_dealloc_all(Dwarf_P_Debug dbg) -{ - memory_list_t *dbglp; - - if (dbg == NULL) { - /* should throw an error */ - return; - } - - dbglp = BLOCK_TO_LIST(dbg); - while (dbglp->next != dbglp) { - _dwarf_p_dealloc(dbg, LIST_TO_BLOCK(dbglp->next)); - } - if (dbglp->next != dbglp || - dbglp->prev != dbglp) { - - /* should throw error */ - /* For some reason we couldn't free all the blocks? */ - return; - } - _dwarf_p_dealloc(NULL, (void*)dbg); -} - diff --git a/usr/src/tools/ctf/dwarf/common/pro_alloc.h b/usr/src/tools/ctf/dwarf/common/pro_alloc.h deleted file mode 100644 index b4da65325f..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_alloc.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -Dwarf_Ptr _dwarf_p_get_alloc(Dwarf_P_Debug, Dwarf_Unsigned); - -void _dwarf_p_dealloc(Dwarf_P_Debug dbg, Dwarf_Small * ptr); - -void _dwarf_p_dealloc_all(Dwarf_P_Debug dbg); diff --git a/usr/src/tools/ctf/dwarf/common/pro_arange.c b/usr/src/tools/ctf/dwarf/common/pro_arange.c deleted file mode 100644 index 4e5c37795c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_arange.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_arange.h" -#include "pro_section.h" -#include "pro_reloc.h" - - - -/* - This function adds another address range - to the list of address ranges for the - given Dwarf_P_Debug. It returns 0 on error, - and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_arange(Dwarf_P_Debug dbg, - Dwarf_Addr begin_address, - Dwarf_Unsigned length, - Dwarf_Signed symbol_index, Dwarf_Error * error) -{ - return dwarf_add_arange_b(dbg, begin_address, length, symbol_index, - /* end_symbol_index */ 0, - /* offset_from_end_sym */ 0, - error); -} - -/* - This function adds another address range - to the list of address ranges for the - given Dwarf_P_Debug. It returns 0 on error, - and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_arange_b(Dwarf_P_Debug dbg, - Dwarf_Addr begin_address, - Dwarf_Unsigned length, - Dwarf_Unsigned symbol_index, - Dwarf_Unsigned end_symbol_index, - Dwarf_Addr offset_from_end_sym, Dwarf_Error * error) -{ - Dwarf_P_Arange arange; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (0); - } - - arange = (Dwarf_P_Arange) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Arange_s)); - if (arange == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - - arange->ag_begin_address = begin_address; - arange->ag_length = length; - arange->ag_symbol_index = symbol_index; - arange->ag_end_symbol_index = end_symbol_index; - arange->ag_end_symbol_offset = offset_from_end_sym; - - if (dbg->de_arange == NULL) - dbg->de_arange = dbg->de_last_arange = arange; - else { - dbg->de_last_arange->ag_next = arange; - dbg->de_last_arange = arange; - } - dbg->de_arange_count++; - - return (1); -} - - -int -_dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - /* Total num of bytes in .debug_aranges section. */ - Dwarf_Unsigned arange_num_bytes; - - /* - Adjustment to align the start of the actual address ranges on a - boundary aligned with twice the address size. */ - Dwarf_Small remainder; - - /* Total number of bytes excluding the length field. */ - Dwarf_Unsigned adjusted_length; - - /* Points to first byte of .debug_aranges buffer. */ - Dwarf_Small *arange; - - /* Fills in the .debug_aranges buffer. */ - Dwarf_Small *arange_ptr; - - /* Scans the list of address ranges provided by user. */ - Dwarf_P_Arange given_arange; - - /* Used to fill in 0. */ - const Dwarf_Signed big_zero = 0; - - int extension_word_size = dbg->de_64bit_extension ? 4 : 0; - int uword_size = dbg->de_offset_size; - int upointer_size = dbg->de_pointer_size; - int res; - - - /* ***** BEGIN CODE ***** */ - - /* Size of the .debug_aranges section header. */ - arange_num_bytes = extension_word_size + uword_size + /* Size - of - length - field. - */ - sizeof(Dwarf_Half) + /* Size of version field. */ - uword_size + /* Size of .debug_info offset. */ - sizeof(Dwarf_Small) + /* Size of address size field. */ - sizeof(Dwarf_Small); /* Size of segment size field. */ - - /* - Adjust the size so that the set of aranges begins on a boundary - that aligned with twice the address size. This is a Libdwarf - requirement. */ - remainder = arange_num_bytes % (2 * upointer_size); - if (remainder != 0) - arange_num_bytes += (2 * upointer_size) - remainder; - - - /* Add the bytes for the actual address ranges. */ - arange_num_bytes += upointer_size * 2 * (dbg->de_arange_count + 1); - - GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_ARANGES], - arange, (unsigned long) arange_num_bytes, error); - arange_ptr = arange; - if (arange == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - if (extension_word_size) { - Dwarf_Word x = DISTINGUISHED_VALUE; - - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &x, - sizeof(x), extension_word_size); - arange_ptr += extension_word_size; - } - - /* Write the total length of .debug_aranges section. */ - adjusted_length = arange_num_bytes - uword_size - - extension_word_size; - { - Dwarf_Unsigned du = adjusted_length; - - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &du, sizeof(du), uword_size); - arange_ptr += uword_size; - } - - /* Write the version as 2 bytes. */ - { - Dwarf_Half verstamp = CURRENT_VERSION_STAMP; - - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &verstamp, - sizeof(verstamp), sizeof(Dwarf_Half)); - arange_ptr += sizeof(Dwarf_Half); - } - - - /* Write the .debug_info offset. This is always 0. */ - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &big_zero, - sizeof(big_zero), uword_size); - arange_ptr += uword_size; - - { - unsigned long count = dbg->de_arange_count + 1; - int res; - - if (dbg->de_reloc_pair) { - count = (3 * dbg->de_arange_count) + 1; - } - /* the following is a small optimization: not needed for - correctness */ - res = _dwarf_pro_pre_alloc_n_reloc_slots(dbg, - DEBUG_ARANGES, count); - if (res != DW_DLV_OK) { - { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } - } - - /* reloc for .debug_info */ - res = dbg->de_reloc_name(dbg, - DEBUG_ARANGES, - extension_word_size + - uword_size + sizeof(Dwarf_Half), - dbg->de_sect_name_idx[DEBUG_INFO], - dwarf_drt_data_reloc, uword_size); - - /* Write the size of addresses. */ - *arange_ptr = dbg->de_pointer_size; - arange_ptr++; - - /* - Write the size of segment addresses. This is zero for MIPS - architectures. */ - *arange_ptr = 0; - arange_ptr++; - - /* - Skip over the padding to align the start of the actual address - ranges to twice the address size. */ - if (remainder != 0) - arange_ptr += (2 * upointer_size) - remainder; - - - - - - /* The arange address, length are pointer-size fields of the target - machine. */ - for (given_arange = dbg->de_arange; given_arange != NULL; - given_arange = given_arange->ag_next) { - - /* Write relocation record for beginning of address range. */ - res = dbg->de_reloc_name(dbg, DEBUG_ARANGES, arange_ptr - arange, /* r_offset - */ - (long) given_arange->ag_symbol_index, - dwarf_drt_data_reloc, upointer_size); - if (res != DW_DLV_OK) { - { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } - - /* Copy beginning address of range. */ - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &given_arange->ag_begin_address, - sizeof(given_arange->ag_begin_address), - upointer_size); - arange_ptr += upointer_size; - - if (dbg->de_reloc_pair && - given_arange->ag_end_symbol_index != 0 && - given_arange->ag_length == 0) { - /* symbolic reloc, need reloc for length What if we really - know the length? If so, should use the other part of - 'if'. */ - Dwarf_Unsigned val; - - res = dbg->de_reloc_pair(dbg, DEBUG_ARANGES, arange_ptr - arange, /* r_offset - */ - given_arange->ag_symbol_index, - given_arange->ag_end_symbol_index, - dwarf_drt_first_of_length_pair, - upointer_size); - if (res != DW_DLV_OK) { - { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } - - /* arrange pre-calc so assem text can do .word end - begin - + val (gets val from stream) */ - val = given_arange->ag_end_symbol_offset - - given_arange->ag_begin_address; - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &val, - sizeof(val), upointer_size); - arange_ptr += upointer_size; - - } else { - /* plain old length to copy, no relocation at all */ - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &given_arange->ag_length, - sizeof(given_arange->ag_length), - upointer_size); - arange_ptr += upointer_size; - } - } - - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &big_zero, - sizeof(big_zero), upointer_size); - - arange_ptr += upointer_size; - WRITE_UNALIGNED(dbg, (void *) arange_ptr, - (const void *) &big_zero, - sizeof(big_zero), upointer_size); - return (int) dbg->de_n_debug_sect; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_arange.h b/usr/src/tools/ctf/dwarf/common/pro_arange.h deleted file mode 100644 index f0e7e84dff..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_arange.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -/* - If ag_end_symbol_index is zero, - ag_length must be known and non-zero. - - - Deals with length being known costant or fr - assembler output, not known. - -*/ - -struct Dwarf_P_Arange_s { - Dwarf_Addr ag_begin_address; /* known address or for - symbolic assem output, - offset of symbol */ - Dwarf_Addr ag_length; /* zero or address or offset */ - Dwarf_Unsigned ag_symbol_index; - - Dwarf_P_Arange ag_next; - - Dwarf_Unsigned ag_end_symbol_index; /* zero or index/id of end - symbol */ - Dwarf_Addr ag_end_symbol_offset; /* known address or for - symbolic assem output, - offset of end symbol */ - -}; diff --git a/usr/src/tools/ctf/dwarf/common/pro_die.c b/usr/src/tools/ctf/dwarf/common/pro_die.c deleted file mode 100644 index 948b641146..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_die.c +++ /dev/null @@ -1,442 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include "pro_incl.h" -#include "pro_die.h" - -#ifndef R_MIPS_NONE -#define R_MIPS_NONE 0 -#endif - -/* adds an attribute to a die */ -void _dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr); - -/*---------------------------------------------------------------------------- - This function creates a new die. - tag: tag of the new die to be created - parent,child,left,right: specify neighbors of the new die. Only - one of these may be non-null ------------------------------------------------------------------------------*/ -Dwarf_P_Die -dwarf_new_die(Dwarf_P_Debug dbg, - Dwarf_Tag tag, - Dwarf_P_Die parent, - Dwarf_P_Die child, - Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error) -{ - Dwarf_P_Die ret_die = 0; - - Dwarf_P_Die new_die = (Dwarf_P_Die) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Die_s)); - if (new_die == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_ALLOC, - (Dwarf_P_Die) DW_DLV_BADADDR); - } - new_die->di_parent = NULL; - new_die->di_left = NULL; - new_die->di_right = NULL; - new_die->di_child = NULL; - new_die->di_last_child = NULL; - new_die->di_tag = tag; - new_die->di_dbg = dbg; - new_die->di_marker = 0; - ret_die = - dwarf_die_link(new_die, parent, child, left, right, error); - return ret_die; -} - -/*---------------------------------------------------------------------------- - This function links up a die to specified neighbors - parent,child,left,right: specify neighbors of the new die. Only - one of these may be non-null ------------------------------------------------------------------------------*/ -Dwarf_P_Die -dwarf_die_link(Dwarf_P_Die new_die, - Dwarf_P_Die parent, - Dwarf_P_Die child, - Dwarf_P_Die left, Dwarf_P_Die right, Dwarf_Error * error) -{ - /* Count the # of non null neighbors. */ - int n_nulls = 0; - - if (parent != NULL) { - n_nulls++; - if (new_die->di_parent != NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_LINK_LOOP, - (Dwarf_P_Die) DW_DLV_BADADDR); - } - new_die->di_parent = parent; - if (parent->di_child) { - - /* di_last_child identifies the last sibling, the - die we want to attach new_die to. */ - /* ASSERT: if di_child is set so is di_last_child. */ - Dwarf_P_Die former_lastchild = parent->di_last_child; - parent->di_last_child = new_die; - /* Attach to the new die to end of the sibling list. */ - former_lastchild->di_right = new_die; - new_die->di_left = former_lastchild; - } else { - parent->di_child = new_die; - parent->di_last_child = new_die; - } - } - if (child != NULL) { - n_nulls++; - new_die->di_child = child; - new_die->di_last_child = child; - if (child->di_parent) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, - (Dwarf_P_Die) DW_DLV_BADADDR); - } else { - child->di_parent = new_die; - } - } - if (left != NULL) { - n_nulls++; - new_die->di_left = left; - if (left->di_right) { - /* There's already a right sibling of left, - insert the new die in the list. */ - new_die->di_right = left->di_right; - left->di_right->di_left = new_die; - } - left->di_right = new_die; - if (new_die->di_parent) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, - (Dwarf_P_Die) DW_DLV_BADADDR); - } else { - new_die->di_parent = left->di_parent; - } - } - if (right != NULL) { - n_nulls++; - new_die->di_right = right; - if (right->di_left) { - /* There is already a left sibling of the right die, - insert the new die in the list. */ - new_die->di_left = right->di_left; - right->di_left->di_right = new_die; - } - right->di_left = new_die; - if (new_die->di_parent) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_PARENT_EXISTS, - (Dwarf_P_Die) DW_DLV_BADADDR); - } else { - new_die->di_parent = right->di_parent; - } - } - if (n_nulls > 1) { - /* Multiple neighbors! error! */ - DWARF_P_DBG_ERROR(NULL, DW_DLE_EXTRA_NEIGHBORS, - (Dwarf_P_Die) DW_DLV_BADADDR); - } - return new_die; - -} - -Dwarf_Unsigned -dwarf_add_die_marker(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - Dwarf_Unsigned marker, - Dwarf_Error * error) -{ - if (die == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); - } - die->di_marker = marker; - return 0; -} - - -Dwarf_Unsigned -dwarf_get_die_marker(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - Dwarf_Unsigned * marker, - Dwarf_Error * error) -{ - if (die == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); - } - *marker = die->di_marker; - return 0; -} - - -/*---------------------------------------------------------------------------- - This function adds a die to dbg struct. It should be called using - the root of all the dies. ------------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_die_to_debug(Dwarf_P_Debug dbg, - Dwarf_P_Die first_die, Dwarf_Error * error) -{ - if (first_die == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DIE_NULL, DW_DLV_NOCOUNT); - } - if (first_die->di_tag != DW_TAG_compile_unit) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_WRONG_TAG, DW_DLV_NOCOUNT); - } - dbg->de_dies = first_die; - return 0; -} - -int -_dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg, - Dwarf_P_Die first_die, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int uwordb_size = dbg->de_offset_size; - - /* Add AT_stmt_list attribute */ - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, DW_DLV_NOCOUNT); - } - - new_attr->ar_attribute = DW_AT_stmt_list; - new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form; - new_attr->ar_rel_type = dbg->de_offset_reloc; - - new_attr->ar_nbytes = uwordb_size; - new_attr->ar_next = NULL; - new_attr->ar_reloc_len = uwordb_size; - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, uwordb_size); - if (new_attr->ar_data == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); - } - { - Dwarf_Unsigned du = 0; - - WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, - (const void *) &du, sizeof(du), uwordb_size); - } - - _dwarf_pro_add_at_to_die(first_die, new_attr); - return 0; -} - -/*----------------------------------------------------------------------------- - Add AT_name attribute to die -------------------------------------------------------------------------------*/ -Dwarf_P_Attribute -dwarf_add_AT_name(Dwarf_P_Die die, char *name, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (die == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(die->di_dbg,sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - /* fill in the information */ - new_attr->ar_attribute = DW_AT_name; - /* assume that form is string, no debug_str yet */ - new_attr->ar_attribute_form = DW_FORM_string; - new_attr->ar_nbytes = strlen(name) + 1; - new_attr->ar_next = NULL; - new_attr->ar_reloc_len = 0; - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(die->di_dbg, strlen(name)+1); - if (new_attr->ar_data == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - strcpy(new_attr->ar_data, name); - - new_attr->ar_rel_type = R_MIPS_NONE; - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(die, new_attr); - return new_attr; -} - - -/*----------------------------------------------------------------------------- - Add AT_comp_dir attribute to die -------------------------------------------------------------------------------*/ -Dwarf_P_Attribute -dwarf_add_AT_comp_dir(Dwarf_P_Die ownerdie, - char *current_working_directory, - Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (ownerdie == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(ownerdie->di_dbg, - sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - /* fill in the information */ - new_attr->ar_attribute = DW_AT_comp_dir; - /* assume that form is string, no debug_str yet */ - new_attr->ar_attribute_form = DW_FORM_string; - new_attr->ar_nbytes = strlen(current_working_directory) + 1; - new_attr->ar_next = NULL; - new_attr->ar_reloc_len = 0; - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(ownerdie->di_dbg, - strlen(current_working_directory)+1); - if (new_attr->ar_data == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_STRING_ALLOC, - (Dwarf_P_Attribute) DW_DLV_BADADDR); - } - strcpy(new_attr->ar_data, current_working_directory); - - new_attr->ar_rel_type = R_MIPS_NONE; - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - -int -_dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - Dwarf_Unsigned offset, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int uwordb_size = dbg->de_offset_size; - - if (die == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1); - } - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1); - } - - /* fill in the information */ - new_attr->ar_attribute = DW_AT_MIPS_fde; - new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form;; - new_attr->ar_rel_type = dbg->de_offset_reloc; - new_attr->ar_nbytes = uwordb_size; - new_attr->ar_next = NULL; - new_attr->ar_reloc_len = uwordb_size; - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, uwordb_size); - if (new_attr->ar_data == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); - } - { - Dwarf_Unsigned du = offset; - - WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, - (const void *) &du, sizeof(du), uwordb_size); - } - - _dwarf_pro_add_at_to_die(die, new_attr); - - return 0; -} - -int -_dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - Dwarf_Unsigned offset, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int uwordb_size = dbg->de_offset_size; - - if (die == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_DIE_NULL, -1); - } - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg,sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ATTR_ALLOC, -1); - } - - /* fill in the information */ - new_attr->ar_attribute = DW_AT_macro_info; - new_attr->ar_attribute_form = dbg->de_ar_data_attribute_form; - new_attr->ar_rel_type = dbg->de_offset_reloc; - - new_attr->ar_nbytes = uwordb_size; - new_attr->ar_next = NULL; - new_attr->ar_reloc_len = uwordb_size; - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, uwordb_size); - if (new_attr->ar_data == NULL) { - DWARF_P_DBG_ERROR(NULL, DW_DLE_ADDR_ALLOC, DW_DLV_NOCOUNT); - } - { - Dwarf_Unsigned du = offset; - - WRITE_UNALIGNED(dbg, (void *) new_attr->ar_data, - (const void *) &du, sizeof(du), uwordb_size); - } - - _dwarf_pro_add_at_to_die(die, new_attr); - - return 0; -} - - -void -_dwarf_pro_add_at_to_die(Dwarf_P_Die die, Dwarf_P_Attribute attr) -{ - if (die->di_last_attr) { - die->di_last_attr->ar_next = attr; - die->di_last_attr = attr; - die->di_n_attr++; - } else { - die->di_n_attr = 1; - die->di_attrs = die->di_last_attr = attr; - } -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_die.h b/usr/src/tools/ctf/dwarf/common/pro_die.h deleted file mode 100644 index 01c00e79bd..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_die.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -/* - This struct holds the abbreviation table, before they are written - on disk. Holds a linked list of abbreviations, each consisting of - a bitmap for attributes and a bitmap for forms -*/ -typedef struct Dwarf_P_Abbrev_s *Dwarf_P_Abbrev; - -struct Dwarf_P_Abbrev_s { - Dwarf_Unsigned abb_idx; /* index of abbreviation */ - Dwarf_Tag abb_tag; /* tag of die */ - Dwarf_Ubyte abb_children; /* if children are present */ - Dwarf_ufixed *abb_attrs; /* holds names of attrs */ - Dwarf_ufixed *abb_forms; /* forms of attributes */ - int abb_n_attr; /* num of attrs = # of forms */ - Dwarf_P_Abbrev abb_next; -}; - -/* used in pro_section.c */ - -int _dwarf_pro_add_AT_fde(Dwarf_P_Debug dbg, Dwarf_P_Die die, - Dwarf_Unsigned offset, Dwarf_Error * error); - -int _dwarf_pro_add_AT_stmt_list(Dwarf_P_Debug dbg, - Dwarf_P_Die first_die, - Dwarf_Error * error); - -int _dwarf_pro_add_AT_macro_info(Dwarf_P_Debug dbg, - Dwarf_P_Die first_die, - Dwarf_Unsigned offset, - Dwarf_Error * error); diff --git a/usr/src/tools/ctf/dwarf/common/pro_encode_nm.c b/usr/src/tools/ctf/dwarf/common/pro_encode_nm.c deleted file mode 100644 index d6215dc56b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_encode_nm.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <string.h> -#include "pro_incl.h" - -#define MORE_BYTES 0x80 -#define DATA_MASK 0x7f -#define DIGIT_WIDTH 7 -#define SIGN_BIT 0x40 - - -/*------------------------------------------------------------- - Encode val as a leb128. This encodes it as an unsigned - number. ----------------------------------------------------------------*/ -/* return DW_DLV_ERROR or DW_DLV_OK. -** space to write leb number is provided by caller, with caller -** passing length. -** number of bytes used returned thru nbytes arg -*/ -int -_dwarf_pro_encode_leb128_nm(Dwarf_Unsigned val, int *nbytes, - char *space, int splen) -{ - char *a; - char *end = space + splen; - - a = space; - do { - unsigned char uc; - - if (a >= end) { - return DW_DLV_ERROR; - } - uc = val & DATA_MASK; - val >>= DIGIT_WIDTH; - if (val != 0) { - uc |= MORE_BYTES; - } - *a = uc; - a++; - } while (val); - *nbytes = a - space; - return DW_DLV_OK; -} - -/* return DW_DLV_ERROR or DW_DLV_OK. -** space to write leb number is provided by caller, with caller -** passing length. -** number of bytes used returned thru nbytes arg -** encodes a signed number. -*/ -int -_dwarf_pro_encode_signed_leb128_nm(Dwarf_Signed value, int *nbytes, - char *space, int splen) -{ - char *str; - Dwarf_Signed sign = -(value < 0); - int more = 1; - char *end = space + splen; - - str = space; - - do { - unsigned char byte = value & DATA_MASK; - - value >>= DIGIT_WIDTH; - - if (str >= end) { - return DW_DLV_ERROR; - } - /* - * Remaining chunks would just contain the sign bit, and this chunk - * has already captured at least one sign bit. - */ - if (value == sign && ((byte & SIGN_BIT) == (sign & SIGN_BIT))) { - more = 0; - } else { - byte |= MORE_BYTES; - } - *str = byte; - str++; - } while (more); - *nbytes = str - space; - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_encode_nm.h b/usr/src/tools/ctf/dwarf/common/pro_encode_nm.h deleted file mode 100644 index d08e4d5148..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_encode_nm.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* Bytes needed to encode a number. - Not a tight bound, just a reasonable bound. -*/ -#define ENCODE_SPACE_NEEDED (2*sizeof(Dwarf_Unsigned)) - - -int _dwarf_pro_encode_leb128_nm(Dwarf_Unsigned val, int *nbytes, - char *space, int splen); - -int _dwarf_pro_encode_signed_leb128_nm(Dwarf_Signed value, int *nbytes, - char *space, int splen); diff --git a/usr/src/tools/ctf/dwarf/common/pro_error.c b/usr/src/tools/ctf/dwarf/common/pro_error.c deleted file mode 100644 index d408a391e2..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_error.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#ifdef HAVE_ELF_H -#include <elf.h> -#endif - -#include <stdio.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <stdlib.h> -#include "pro_incl.h" - -extern char *_dwarf_errmsgs[]; - -/* - This function performs error handling as described in the - libdwarf consumer document section 3. Dbg is the Dwarf_P_debug - structure being processed. Error is a pointer to the pointer - to the error descriptor that will be returned. Errval is an - error code listed in dwarf_error.h. -*/ -void -_dwarf_p_error(Dwarf_P_Debug dbg, - Dwarf_Error * error, Dwarf_Word errval) -{ - Dwarf_Error errptr; - - /* Allow NULL dbg on entry, since sometimes that can happen and we - want to report the upper-level error, not this one. */ - if ((Dwarf_Sword) errval < 0) - printf("ERROR VALUE: %ld - %s\n", - (long) errval, _dwarf_errmsgs[-errval - 1]); - if (error != NULL) { - errptr = (Dwarf_Error) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_Error_s)); - if (errptr == NULL) { - fprintf(stderr, - "Could not allocate Dwarf_Error structure\n"); - abort(); - } - errptr->er_errval = (Dwarf_Sword) errval; - *error = errptr; - return; - } - - if (dbg != NULL && dbg->de_errhand != NULL) { - errptr = (Dwarf_Error) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_Error_s)); - if (errptr == NULL) { - fprintf(stderr, - "Could not allocate Dwarf_Error structure\n"); - abort(); - } - errptr->er_errval = (Dwarf_Sword) errval; - dbg->de_errhand(errptr, dbg->de_errarg); - return; - } - - abort(); -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_error.h b/usr/src/tools/ctf/dwarf/common/pro_error.h deleted file mode 100644 index c37035301b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_error.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -/* Handle error passing in the name of the Dwarf_P_Debug - User must supply {} around the macro. - Putting the {} here leads to macro uses that don't look like C. - The error argument to dwarf_error is hard coded here as 'error' -*/ -#define DWARF_P_DBG_ERROR(dbg,errval,retval) \ - _dwarf_p_error(dbg,error,errval); return(retval); - -struct Dwarf_Error_s { - Dwarf_Sword er_errval; -}; - -void _dwarf_p_error(Dwarf_P_Debug dbg, Dwarf_Error * error, - Dwarf_Word errval); diff --git a/usr/src/tools/ctf/dwarf/common/pro_expr.c b/usr/src/tools/ctf/dwarf/common/pro_expr.c deleted file mode 100644 index ad40eb762a..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_expr.c +++ /dev/null @@ -1,597 +0,0 @@ -/* - - Copyright (C) 2000,2004,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include "pro_incl.h" -#include "pro_expr.h" - -/* - This function creates a new expression - struct that can be used to build up a - location expression. -*/ -Dwarf_P_Expr -dwarf_new_expr(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - Dwarf_P_Expr ret_expr; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (NULL); - } - - ret_expr = (Dwarf_P_Expr) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Expr_s)); - if (ret_expr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (NULL); - } - - ret_expr->ex_dbg = dbg; - - return (ret_expr); -} - - -Dwarf_Unsigned -dwarf_add_expr_gen(Dwarf_P_Expr expr, - Dwarf_Small opcode, - Dwarf_Unsigned val1, - Dwarf_Unsigned val2, Dwarf_Error * error) -{ - char encode_buffer[2 * ENCODE_SPACE_NEEDED]; /* 2* since - used to - concatenate - 2 leb's - below */ - char encode_buffer2[ENCODE_SPACE_NEEDED]; - int res; - Dwarf_P_Debug dbg = expr->ex_dbg; - - /* - Give the buffer where the operands are first going to be - assembled the largest alignment. */ - Dwarf_Unsigned operand_buffer[10]; - - /* - Size of the byte stream buffer that needs to be memcpy-ed. */ - int operand_size; - - /* - Points to the byte stream for the first operand, and finally to - the buffer that is memcp-ed into the Dwarf_P_Expr_s struct. */ - Dwarf_Small *operand; - - /* Size of the byte stream for second operand. */ - int operand2_size; - - /* Points to next byte to be written in Dwarf_P_Expr_s struct. */ - Dwarf_Small *next_byte_ptr; - - /* Offset past the last byte written into Dwarf_P_Expr_s. */ - int next_byte_offset; - - /* ***** BEGIN CODE ***** */ - - if (expr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_EXPR_NULL); - return (DW_DLV_NOCOUNT); - } - - if (expr->ex_dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_NOCOUNT); - } - - operand = NULL; - operand_size = 0; - - switch (opcode) { - case DW_OP_reg0: - case DW_OP_reg1: - case DW_OP_reg2: - case DW_OP_reg3: - case DW_OP_reg4: - case DW_OP_reg5: - case DW_OP_reg6: - case DW_OP_reg7: - case DW_OP_reg8: - case DW_OP_reg9: - case DW_OP_reg10: - case DW_OP_reg11: - case DW_OP_reg12: - case DW_OP_reg13: - case DW_OP_reg14: - case DW_OP_reg15: - case DW_OP_reg16: - case DW_OP_reg17: - case DW_OP_reg18: - case DW_OP_reg19: - case DW_OP_reg20: - case DW_OP_reg21: - case DW_OP_reg22: - case DW_OP_reg23: - case DW_OP_reg24: - case DW_OP_reg25: - case DW_OP_reg26: - case DW_OP_reg27: - case DW_OP_reg28: - case DW_OP_reg29: - case DW_OP_reg30: - case DW_OP_reg31: - break; - - case DW_OP_breg0: - case DW_OP_breg1: - case DW_OP_breg2: - case DW_OP_breg3: - case DW_OP_breg4: - case DW_OP_breg5: - case DW_OP_breg6: - case DW_OP_breg7: - case DW_OP_breg8: - case DW_OP_breg9: - case DW_OP_breg10: - case DW_OP_breg11: - case DW_OP_breg12: - case DW_OP_breg13: - case DW_OP_breg14: - case DW_OP_breg15: - case DW_OP_breg16: - case DW_OP_breg17: - case DW_OP_breg18: - case DW_OP_breg19: - case DW_OP_breg20: - case DW_OP_breg21: - case DW_OP_breg22: - case DW_OP_breg23: - case DW_OP_breg24: - case DW_OP_breg25: - case DW_OP_breg26: - case DW_OP_breg27: - case DW_OP_breg28: - case DW_OP_breg29: - case DW_OP_breg30: - case DW_OP_breg31: - res = _dwarf_pro_encode_signed_leb128_nm(val1, - &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_regx: - res = _dwarf_pro_encode_leb128_nm(val1, &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_lit0: - case DW_OP_lit1: - case DW_OP_lit2: - case DW_OP_lit3: - case DW_OP_lit4: - case DW_OP_lit5: - case DW_OP_lit6: - case DW_OP_lit7: - case DW_OP_lit8: - case DW_OP_lit9: - case DW_OP_lit10: - case DW_OP_lit11: - case DW_OP_lit12: - case DW_OP_lit13: - case DW_OP_lit14: - case DW_OP_lit15: - case DW_OP_lit16: - case DW_OP_lit17: - case DW_OP_lit18: - case DW_OP_lit19: - case DW_OP_lit20: - case DW_OP_lit21: - case DW_OP_lit22: - case DW_OP_lit23: - case DW_OP_lit24: - case DW_OP_lit25: - case DW_OP_lit26: - case DW_OP_lit27: - case DW_OP_lit28: - case DW_OP_lit29: - case DW_OP_lit30: - case DW_OP_lit31: - break; - - case DW_OP_addr: - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_BAD_EXPR_OPCODE); - return (DW_DLV_NOCOUNT); - - case DW_OP_const1u: - case DW_OP_const1s: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 1); - operand_size = 1; - break; - - case DW_OP_const2u: - case DW_OP_const2s: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 2); - operand_size = 2; - break; - - case DW_OP_const4u: - case DW_OP_const4s: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 4); - operand_size = 4; - break; - - case DW_OP_const8u: - case DW_OP_const8s: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 8); - operand_size = 8; - break; - - case DW_OP_constu: - res = _dwarf_pro_encode_leb128_nm(val1, - &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_consts: - res = _dwarf_pro_encode_signed_leb128_nm(val1, - &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_fbreg: - res = _dwarf_pro_encode_signed_leb128_nm(val1, - &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_bregx: - res = _dwarf_pro_encode_leb128_nm(val1, &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - /* put this one directly into 'operand' at tail of prev value */ - res = _dwarf_pro_encode_signed_leb128_nm(val2, &operand2_size, - ((char *) operand) + - operand_size, - sizeof - (encode_buffer2)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand_size += operand2_size; - - case DW_OP_dup: - case DW_OP_drop: - break; - - case DW_OP_pick: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, (const void *) &val1, - sizeof(val1), 1); - operand_size = 1; - break; - - case DW_OP_over: - case DW_OP_swap: - case DW_OP_rot: - case DW_OP_deref: - case DW_OP_xderef: - break; - - case DW_OP_deref_size: - case DW_OP_xderef_size: - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, (const void *) &val1, - sizeof(val1), 1); - operand_size = 1; - break; - - case DW_OP_abs: - case DW_OP_and: - case DW_OP_div: - case DW_OP_minus: - case DW_OP_mod: - case DW_OP_mul: - case DW_OP_neg: - case DW_OP_not: - case DW_OP_or: - case DW_OP_plus: - break; - - case DW_OP_plus_uconst: - res = _dwarf_pro_encode_leb128_nm(val1, &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_shl: - case DW_OP_shr: - case DW_OP_shra: - case DW_OP_xor: - break; - - case DW_OP_le: - case DW_OP_ge: - case DW_OP_eq: - case DW_OP_lt: - case DW_OP_gt: - case DW_OP_ne: - break; - - case DW_OP_skip: - case DW_OP_bra: - /* FIX: unhandled! OP_bra, OP_skip! */ - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_BAD_EXPR_OPCODE); - return (DW_DLV_NOCOUNT); - - case DW_OP_piece: - res = _dwarf_pro_encode_leb128_nm(val1, &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - break; - - case DW_OP_nop: - break; - case DW_OP_push_object_address: /* DWARF3 */ - break; - case DW_OP_call2: /* DWARF3 */ - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 2); - operand_size = 2; - break; - - case DW_OP_call4: /* DWARF3 */ - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), 4); - operand_size = 4; - break; - - case DW_OP_call_ref: /* DWARF3 */ - operand = (Dwarf_Small *) & operand_buffer[0]; - WRITE_UNALIGNED(dbg, operand, &val1, sizeof(val1), - dbg->de_offset_size); - operand_size = dbg->de_offset_size; - break; - case DW_OP_form_tls_address: /* DWARF3f */ - break; - case DW_OP_call_frame_cfa: /* DWARF3f */ - break; - case DW_OP_bit_piece: /* DWARF3f */ - res = _dwarf_pro_encode_leb128_nm(val1, &operand_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand = (Dwarf_Small *) encode_buffer; - /* put this one directly into 'operand' at tail of prev value */ - res = _dwarf_pro_encode_leb128_nm(val2, &operand2_size, - ((char *) operand) + - operand_size, - sizeof(encode_buffer2)); - if (res != DW_DLV_OK) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - operand_size += operand2_size; - break; - - default: - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_BAD_EXPR_OPCODE); - return (DW_DLV_NOCOUNT); - } - - next_byte_offset = expr->ex_next_byte_offset + operand_size + 1; - - if (next_byte_offset > MAXIMUM_LOC_EXPR_LENGTH) { - _dwarf_p_error(expr->ex_dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - - next_byte_ptr = - &(expr->ex_byte_stream[0]) + expr->ex_next_byte_offset; - - *next_byte_ptr = opcode; - next_byte_ptr++; - memcpy(next_byte_ptr, operand, operand_size); - - expr->ex_next_byte_offset = next_byte_offset; - return (next_byte_offset); -} - -Dwarf_Unsigned -dwarf_add_expr_addr_b(Dwarf_P_Expr expr, - Dwarf_Unsigned addr, - Dwarf_Unsigned sym_index, Dwarf_Error * error) -{ - Dwarf_P_Debug dbg; - Dwarf_Small *next_byte_ptr; - Dwarf_Unsigned next_byte_offset; - int upointer_size; - - if (expr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_EXPR_NULL); - return (DW_DLV_NOCOUNT); - } - - dbg = expr->ex_dbg; - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_NOCOUNT); - } - - upointer_size = dbg->de_pointer_size; - next_byte_offset = expr->ex_next_byte_offset + upointer_size + 1; - if (next_byte_offset > MAXIMUM_LOC_EXPR_LENGTH) { - _dwarf_p_error(dbg, error, DW_DLE_EXPR_LENGTH_BAD); - return (DW_DLV_NOCOUNT); - } - - next_byte_ptr = - &(expr->ex_byte_stream[0]) + expr->ex_next_byte_offset; - - *next_byte_ptr = DW_OP_addr; - next_byte_ptr++; - WRITE_UNALIGNED(dbg, next_byte_ptr, (const void *) &addr, - sizeof(addr), upointer_size); - - if (expr->ex_reloc_offset != 0) { - _dwarf_p_error(dbg, error, DW_DLE_MULTIPLE_RELOC_IN_EXPR); - return (DW_DLV_NOCOUNT); - } - - expr->ex_reloc_sym_index = sym_index; - expr->ex_reloc_offset = expr->ex_next_byte_offset + 1; - - expr->ex_next_byte_offset = next_byte_offset; - return (next_byte_offset); -} - -Dwarf_Unsigned -dwarf_add_expr_addr(Dwarf_P_Expr expr, - Dwarf_Unsigned addr, - Dwarf_Signed sym_index, Dwarf_Error * error) -{ - return - dwarf_add_expr_addr_b(expr, addr, (Dwarf_Unsigned) sym_index, - error); -} - - -Dwarf_Unsigned -dwarf_expr_current_offset(Dwarf_P_Expr expr, Dwarf_Error * error) -{ - if (expr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_EXPR_NULL); - return (DW_DLV_NOCOUNT); - } - - if (expr->ex_dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_NOCOUNT); - } - - return (expr->ex_next_byte_offset); -} - -void -dwarf_expr_reset(Dwarf_P_Expr expr, Dwarf_Error * error) -{ - if (expr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_EXPR_NULL); - return; - } - expr->ex_next_byte_offset=0; -} - - -Dwarf_Addr -dwarf_expr_into_block(Dwarf_P_Expr expr, - Dwarf_Unsigned * length, Dwarf_Error * error) -{ - if (expr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_EXPR_NULL); - return (DW_DLV_BADADDR); - } - - if (expr->ex_dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_BADADDR); - } - - if (length != NULL) - *length = expr->ex_next_byte_offset; - /* The following cast from pointer to integer is ok as long as - Dwarf_Addr is at least as large as a pointer. Which is a - requirement of libdwarf so must be satisfied (some compilers - emit a warning about the following line). */ - return ((Dwarf_Addr)(uintptr_t) &(expr->ex_byte_stream[0])); -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_expr.h b/usr/src/tools/ctf/dwarf/common/pro_expr.h deleted file mode 100644 index 202f2d30d5..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_expr.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#define MAXIMUM_LOC_EXPR_LENGTH 20 - -struct Dwarf_P_Expr_s { - Dwarf_Small ex_byte_stream[MAXIMUM_LOC_EXPR_LENGTH]; - Dwarf_P_Debug ex_dbg; - Dwarf_Unsigned ex_next_byte_offset; - Dwarf_Unsigned ex_reloc_sym_index; - Dwarf_Unsigned ex_reloc_offset; -}; diff --git a/usr/src/tools/ctf/dwarf/common/pro_finish.c b/usr/src/tools/ctf/dwarf/common/pro_finish.c deleted file mode 100644 index bc43a5f0f4..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_finish.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include "pro_incl.h" - -/*--------------------------------------------------------------- - This routine deallocates all memory, and does some - finishing up ------------------------------------------------------------------*/ - /*ARGSUSED*/ Dwarf_Unsigned -dwarf_producer_finish(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - if (dbg->de_version_magic_number != PRO_VERSION_MAGIC) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, DW_DLV_NOCOUNT); - } - - /* this frees all blocks, then frees dbg. */ - _dwarf_p_dealloc_all(dbg); - return 0; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_forms.c b/usr/src/tools/ctf/dwarf/common/pro_forms.c deleted file mode 100644 index fec9a39c60..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_forms.c +++ /dev/null @@ -1,1182 +0,0 @@ -/* - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2007-2010 David Anderson. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include <limits.h> -#include "pro_incl.h" -#include "pro_expr.h" - -#ifndef R_MIPS_NONE -#define R_MIPS_NONE 0 -#endif - - - /* Indicates no relocation needed. */ -#define NO_ELF_SYM_INDEX 0 - - -/* adds an attribute to a die */ -extern void _dwarf_pro_add_at_to_die(Dwarf_P_Die die, - Dwarf_P_Attribute attr); - -/* - This function adds an attribute whose value is - a target address to the given die. The attribute - is given the name provided by attr. The address - is given in pc_value. -*/ - -static Dwarf_P_Attribute -local_add_AT_address(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Signed form, - Dwarf_Unsigned pc_value, - Dwarf_Unsigned sym_index, - Dwarf_Error * error); - -/* old interface */ -Dwarf_P_Attribute -dwarf_add_AT_targ_address(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Unsigned pc_value, - Dwarf_Signed sym_index, Dwarf_Error * error) -{ - return - dwarf_add_AT_targ_address_b(dbg, - ownerdie, - attr, - pc_value, - (Dwarf_Unsigned) sym_index, error); -} - -/* New interface, replacing dwarf_add_AT_targ_address. - Essentially just makes sym_index a Dwarf_Unsigned - so for symbolic relocations it can be a full address. -*/ -Dwarf_P_Attribute -dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Unsigned pc_value, - Dwarf_Unsigned sym_index, - Dwarf_Error * error) -{ - switch (attr) { - case DW_AT_low_pc: - case DW_AT_high_pc: - - /* added to support location lists */ - /* no way to check that this is a loclist-style address though */ - case DW_AT_location: - case DW_AT_string_length: - case DW_AT_return_addr: - case DW_AT_frame_base: - case DW_AT_segment: - case DW_AT_static_link: - case DW_AT_use_location: - case DW_AT_vtable_elem_location: - case DW_AT_const_value: /* Gcc can generate this as address. */ - case DW_AT_entry_pc: - break; - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - - return local_add_AT_address(dbg, ownerdie, attr, DW_FORM_addr, - pc_value, sym_index, error); -} - -Dwarf_P_Attribute -dwarf_add_AT_ref_address(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Unsigned pc_value, - Dwarf_Unsigned sym_index, - Dwarf_Error * error) -{ - switch (attr) { - case DW_AT_type: - case DW_AT_import: - break; - - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - - return local_add_AT_address(dbg, ownerdie, attr, DW_FORM_ref_addr, - pc_value, sym_index, error); -} - - -/* Make sure attribute types are checked before entering here. */ -static Dwarf_P_Attribute -local_add_AT_address(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Signed form, - Dwarf_Unsigned pc_value, - Dwarf_Unsigned sym_index, - Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int upointer_size = dbg->de_pointer_size; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - /* attribute types have already been checked */ - /* switch (attr) { ... } */ - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = form; - new_attr->ar_nbytes = upointer_size; - new_attr->ar_rel_symidx = sym_index; - new_attr->ar_reloc_len = upointer_size; - new_attr->ar_next = 0; - if (sym_index != NO_ELF_SYM_INDEX) - new_attr->ar_rel_type = dbg->de_ptr_reloc; - else - new_attr->ar_rel_type = R_MIPS_NONE; - - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, upointer_size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - WRITE_UNALIGNED(dbg, new_attr->ar_data, - (const void *) &pc_value, - sizeof(pc_value), upointer_size); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - -/* - * Functions to compress and uncompress data from normal - * arrays of integral types into arrays of LEB128 numbers. - * Extend these functions as needed to handle wider input - * variety. Return values should be freed with _dwarf_p_dealloc - * after they aren't needed any more. - */ - -/* return value points to an array of LEB number */ - -void * -dwarf_compress_integer_block( - Dwarf_P_Debug dbg, - Dwarf_Bool unit_is_signed, - Dwarf_Small unit_length_in_bits, - void* input_block, - Dwarf_Unsigned input_length_in_units, - Dwarf_Unsigned* output_length_in_bytes_ptr, - Dwarf_Error* error -) -{ - Dwarf_Unsigned output_length_in_bytes = 0; - char * output_block = 0; - char encode_buffer[ENCODE_SPACE_NEEDED]; - int i = 0; - char * ptr = 0; - int remain = 0; - int result = 0; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return((void *)DW_DLV_BADADDR); - } - - if (unit_is_signed == false || - unit_length_in_bits != 32 || - input_block == NULL || - input_length_in_units == 0 || - output_length_in_bytes_ptr == NULL) { - - _dwarf_p_error(NULL, error, DW_DLE_BADBITC); - return ((void *) DW_DLV_BADADDR); - } - - /* At this point we assume the format is: signed 32 bit */ - - /* first compress everything to find the total size. */ - - output_length_in_bytes = 0; - for (i=0; i<input_length_in_units; i++) { - int unit_encoded_size; - Dwarf_sfixed unit; /* this is fixed at signed-32-bits */ - - unit = ((Dwarf_sfixed*)input_block)[i]; - - result = _dwarf_pro_encode_signed_leb128_nm(unit, &unit_encoded_size, - encode_buffer,sizeof(encode_buffer)); - if (result != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - output_length_in_bytes += unit_encoded_size; - } - - - /* then alloc */ - - output_block = (void *) - _dwarf_p_get_alloc(dbg, output_length_in_bytes); - if (output_block == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((void*)DW_DLV_BADADDR); - } - - /* then compress again and copy into new buffer */ - - ptr = output_block; - remain = output_length_in_bytes; - for (i=0; i<input_length_in_units; i++) { - int unit_encoded_size; - Dwarf_sfixed unit; /* this is fixed at signed-32-bits */ - - unit = ((Dwarf_sfixed*)input_block)[i]; - - result = _dwarf_pro_encode_signed_leb128_nm(unit, &unit_encoded_size, - ptr, remain); - if (result != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - remain -= unit_encoded_size; - ptr += unit_encoded_size; - } - - if (remain != 0) { - _dwarf_p_dealloc(dbg, (unsigned char *)output_block); - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - *output_length_in_bytes_ptr = output_length_in_bytes; - return (void*) output_block; - -} - -void -dwarf_dealloc_compressed_block(Dwarf_P_Debug dbg, void * space) -{ - _dwarf_p_dealloc(dbg, space); -} - -/* This is very similar to targ_address but results in a different FORM */ -/* dbg->de_ar_data_attribute_form is data4 or data8 - and dwarf4 changes the definition for such on DW_AT_high_pc. - DWARF 3: the FORM here has no defined meaning for dwarf3. - DWARF 4: the FORM here means that for DW_AT_high_pc the value - is not a high address but is instead an offset - from a (separate) DW_AT_low_pc. - The intent for DWARF4 is that this is not a relocated - address at all. Instead a simple offset. - But this should NOT be called for a simple non-relocated offset. - So do not call this with an attr of DW_AT_high_pc. - Use dwarf_add_AT_unsigned_const() (for example) instead of - dwarf_add_AT_dataref when the value is a simple offset . -*/ -Dwarf_P_Attribute -dwarf_add_AT_dataref( - Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Unsigned pc_value, - Dwarf_Unsigned sym_index, - Dwarf_Error * error) -{ - /* TODO: Add checking here */ - return local_add_AT_address(dbg, ownerdie, attr, - dbg->de_ar_data_attribute_form, - pc_value, - sym_index, - error); -} - - - -Dwarf_P_Attribute -dwarf_add_AT_block( - Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Small *block_data, - Dwarf_Unsigned block_size, - Dwarf_Error *error -) -{ - Dwarf_P_Attribute new_attr; - int result; - char encode_buffer[ENCODE_SPACE_NEEDED]; - int len_size; - char * attrdata; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - /* I don't mess with block1, block2, block4, not worth the effort */ - - /* So, encode the length into LEB128 */ - result = _dwarf_pro_encode_leb128_nm(block_size, &len_size, - encode_buffer,sizeof(encode_buffer)); - if (result != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - /* Allocate the new attribute */ - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - /* Fill in the attribute */ - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = DW_FORM_block; - new_attr->ar_nbytes = len_size + block_size; - new_attr->ar_next = 0; - - new_attr->ar_data = attrdata = (char *) - _dwarf_p_get_alloc(dbg, len_size + block_size); - if (new_attr->ar_data == NULL) { - /* free the block we got earlier */ - _dwarf_p_dealloc(dbg, (unsigned char *) new_attr); - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return((Dwarf_P_Attribute)DW_DLV_BADADDR); - } - - /* write length and data to attribute data buffer */ - memcpy(attrdata, encode_buffer, len_size); - attrdata += len_size; - memcpy(attrdata, block_data, block_size); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - - return new_attr; -} - - -/* - This function adds attributes whose value - is an unsigned constant. It determines the - size of the value field from the value of - the constant. -*/ -Dwarf_P_Attribute -dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Unsigned value, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - Dwarf_Half attr_form; - Dwarf_Small size; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - switch (attr) { - case DW_AT_ordering: - case DW_AT_byte_size: - case DW_AT_bit_offset: - case DW_AT_bit_size: - case DW_AT_inline: - case DW_AT_language: - case DW_AT_visibility: - case DW_AT_virtuality: - case DW_AT_accessibility: - case DW_AT_address_class: - case DW_AT_calling_convention: - case DW_AT_encoding: - case DW_AT_identifier_case: - case DW_AT_MIPS_loop_unroll_factor: - case DW_AT_MIPS_software_pipeline_depth: - break; - - case DW_AT_decl_column: - case DW_AT_decl_file: - case DW_AT_decl_line: - case DW_AT_const_value: - case DW_AT_start_scope: - case DW_AT_stride_size: - case DW_AT_count: - case DW_AT_associated: - case DW_AT_allocated: - case DW_AT_upper_bound: - case DW_AT_lower_bound: - case DW_AT_call_file: - case DW_AT_call_line: - break; - - default: { - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - } - - /* - Compute the number of bytes needed to hold constant. */ - if (value <= UCHAR_MAX) { - attr_form = DW_FORM_data1; - size = 1; - } else if (value <= USHRT_MAX) { - attr_form = DW_FORM_data2; - size = 2; - } else if (value <= UINT_MAX) { - attr_form = DW_FORM_data4; - size = 4; - } else { - attr_form = DW_FORM_data8; - size = 8; - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = attr_form; - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */ - new_attr->ar_nbytes = size; - new_attr->ar_next = 0; - - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - WRITE_UNALIGNED(dbg, new_attr->ar_data, - (const void *) &value, sizeof(value), size); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -/* - This function adds attributes whose value - is an signed constant. It determines the - size of the value field from the value of - the constant. -*/ -Dwarf_P_Attribute -dwarf_add_AT_signed_const(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Signed value, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - Dwarf_Half attr_form; - Dwarf_Small size; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - switch (attr) { - case DW_AT_lower_bound: - case DW_AT_upper_bound: - case DW_AT_const_value: - case DW_AT_bit_offset: - case DW_AT_bit_size: - case DW_AT_byte_size: - case DW_AT_count: - case DW_AT_byte_stride: - case DW_AT_bit_stride: - case DW_AT_allocated: - case DW_AT_associated: - break; - - default:{ - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - } - break; - } - - /* - Compute the number of bytes needed to hold constant. */ - if (value >= SCHAR_MIN && value <= SCHAR_MAX) { - attr_form = DW_FORM_data1; - size = 1; - } else if (value >= SHRT_MIN && value <= SHRT_MAX) { - attr_form = DW_FORM_data2; - size = 2; - } else if (value >= INT_MIN && value <= INT_MAX) { - attr_form = DW_FORM_data4; - size = 4; - } else { - attr_form = DW_FORM_data8; - size = 8; - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = attr_form; - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* irrelevant: unused with R_MIPS_NONE */ - new_attr->ar_nbytes = size; - new_attr->ar_next = 0; - - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - WRITE_UNALIGNED(dbg, new_attr->ar_data, - (const void *) &value, sizeof(value), size); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -/* - This function adds attributes whose value - is a location expression. -*/ -Dwarf_P_Attribute -dwarf_add_AT_location_expr(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_P_Expr loc_expr, Dwarf_Error * error) -{ - char encode_buffer[ENCODE_SPACE_NEEDED]; - int res; - Dwarf_P_Attribute new_attr; - Dwarf_Half attr_form; - char *len_str = 0; - int len_size; - int block_size; - char *block_dest_ptr; - int do_len_as_int = 0; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (loc_expr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_EXPR_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (loc_expr->ex_dbg != dbg) { - _dwarf_p_error(dbg, error, DW_DLE_LOC_EXPR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - block_size = loc_expr->ex_next_byte_offset; - - switch (attr) { - case DW_AT_location: - case DW_AT_string_length: - case DW_AT_const_value: - case DW_AT_use_location: - case DW_AT_return_addr: - case DW_AT_data_member_location: - case DW_AT_frame_base: - case DW_AT_static_link: - case DW_AT_vtable_elem_location: - case DW_AT_lower_bound: - case DW_AT_upper_bound: - case DW_AT_count: - case DW_AT_associated: - case DW_AT_allocated: - case DW_AT_data_location: - case DW_AT_byte_stride: - case DW_AT_bit_stride: - case DW_AT_byte_size: - case DW_AT_bit_size: - break; - - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - - /* - Compute the number of bytes needed to hold constant. */ - if (block_size <= UCHAR_MAX) { - attr_form = DW_FORM_block1; - len_size = 1; - do_len_as_int = 1; - } else if (block_size <= USHRT_MAX) { - attr_form = DW_FORM_block2; - len_size = 2; - do_len_as_int = 1; - } else if (block_size <= UINT_MAX) { - attr_form = DW_FORM_block4; - len_size = 4; - do_len_as_int = 1; - } else { - attr_form = DW_FORM_block; - res = _dwarf_pro_encode_leb128_nm(block_size, &len_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - len_str = (char *) encode_buffer; - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = attr_form; - new_attr->ar_reloc_len = dbg->de_pointer_size; - if (loc_expr->ex_reloc_sym_index != NO_ELF_SYM_INDEX) { - new_attr->ar_rel_type = dbg->de_ptr_reloc; - } else { - new_attr->ar_rel_type = R_MIPS_NONE; - } - new_attr->ar_rel_symidx = loc_expr->ex_reloc_sym_index; - new_attr->ar_rel_offset = - (Dwarf_Word) loc_expr->ex_reloc_offset + len_size; - - new_attr->ar_nbytes = block_size + len_size; - - new_attr->ar_next = 0; - new_attr->ar_data = block_dest_ptr = - (char *) _dwarf_p_get_alloc(dbg, block_size + len_size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (do_len_as_int) { - WRITE_UNALIGNED(dbg, block_dest_ptr, (const void *) &block_size, - sizeof(block_size), len_size); - } else { - /* Is uleb number form, DW_FORM_block. See above. */ - memcpy(block_dest_ptr, len_str, len_size); - } - block_dest_ptr += len_size; - memcpy(block_dest_ptr, &(loc_expr->ex_byte_stream[0]), block_size); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -/* - This function adds attributes of reference class. - The references here are local CU references, - not DW_FORM_ref_addr. - The offset field is 4 bytes for 32-bit objects, - and 8-bytes for 64-bit objects. Otherdie is the - that is referenced by ownerdie. - - For reference attributes, the ar_data and ar_nbytes - are not needed. Instead, the ar_ref_die points to - the other die, and its di_offset value is used as - the reference value. -*/ -Dwarf_P_Attribute -dwarf_add_AT_reference(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_P_Die otherdie, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (otherdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - switch (attr) { - case DW_AT_specification: - case DW_AT_discr: - case DW_AT_common_reference: - case DW_AT_import: - case DW_AT_containing_type: - case DW_AT_default_value: - case DW_AT_abstract_origin: - case DW_AT_friend: - case DW_AT_priority: - case DW_AT_type: - case DW_AT_lower_bound: - case DW_AT_upper_bound: - case DW_AT_count: - case DW_AT_associated: - case DW_AT_allocated: - case DW_AT_bit_offset: - case DW_AT_bit_size: - case DW_AT_byte_size: - case DW_AT_sibling: - case DW_AT_bit_stride: - case DW_AT_byte_stride: - case DW_AT_namelist_item: - break; - - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = dbg->de_ar_ref_attr_form; - new_attr->ar_nbytes = dbg->de_offset_size; - new_attr->ar_reloc_len = dbg->de_offset_size; - new_attr->ar_ref_die = otherdie; - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_next = 0; - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -/* - This function adds attributes of the flag class. -*/ -Dwarf_P_Attribute -dwarf_add_AT_flag(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, - Dwarf_Small flag, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - -#if 0 - switch (attr) { - case DW_AT_is_optional: - case DW_AT_artificial: - case DW_AT_declaration: - case DW_AT_external: - case DW_AT_prototyped: - case DW_AT_variable_parameter: - break; - - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } -#endif - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = DW_FORM_flag; - new_attr->ar_nbytes = 1; - new_attr->ar_reloc_len = 0; /* not used */ - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_next = 0; - - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(dbg, 1); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - memcpy(new_attr->ar_data, &flag, 1); - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -/* - This function adds values of attributes - belonging to the string class. -*/ -Dwarf_P_Attribute -dwarf_add_AT_string(Dwarf_P_Debug dbg, - Dwarf_P_Die ownerdie, - Dwarf_Half attr, char *string, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - if (ownerdie == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - switch (attr) { - case DW_AT_name: - case DW_AT_comp_dir: - case DW_AT_const_value: - case DW_AT_producer: - break; - - default: - if ( attr < DW_AT_lo_user || attr > DW_AT_hi_user ) { - _dwarf_p_error(dbg, error, DW_DLE_INPUT_ATTR_BAD); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - break; - } - - new_attr->ar_attribute = attr; - new_attr->ar_attribute_form = DW_FORM_string; - new_attr->ar_nbytes = strlen(string) + 1; - new_attr->ar_next = 0; - - new_attr->ar_data = - (char *) _dwarf_p_get_alloc(dbg, strlen(string)+1); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - strcpy(new_attr->ar_data, string); - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */ - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -Dwarf_P_Attribute -dwarf_add_AT_const_value_string(Dwarf_P_Die ownerdie, - char *string_value, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (ownerdie == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(ownerdie->di_dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = DW_AT_const_value; - new_attr->ar_attribute_form = DW_FORM_string; - new_attr->ar_nbytes = strlen(string_value) + 1; - new_attr->ar_next = 0; - - new_attr->ar_data = - (char *) _dwarf_p_get_alloc(ownerdie->di_dbg, strlen(string_value)+1); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - strcpy(new_attr->ar_data, string_value); - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */ - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -Dwarf_P_Attribute -dwarf_add_AT_producer(Dwarf_P_Die ownerdie, - char *producer_string, Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - - if (ownerdie == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(ownerdie->di_dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = DW_AT_producer; - new_attr->ar_attribute_form = DW_FORM_string; - new_attr->ar_nbytes = strlen(producer_string) + 1; - new_attr->ar_next = 0; - - new_attr->ar_data = - (char *) _dwarf_p_get_alloc(ownerdie->di_dbg, strlen(producer_string)+1); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - strcpy(new_attr->ar_data, producer_string); - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */ - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -Dwarf_P_Attribute -dwarf_add_AT_const_value_signedint(Dwarf_P_Die ownerdie, - Dwarf_Signed signed_value, - Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int leb_size; - char encode_buffer[ENCODE_SPACE_NEEDED]; - int res; - - if (ownerdie == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(ownerdie->di_dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = DW_AT_const_value; - new_attr->ar_attribute_form = DW_FORM_sdata; - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */ - new_attr->ar_next = 0; - - res = _dwarf_pro_encode_signed_leb128_nm(signed_value, &leb_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(ownerdie->di_dbg, leb_size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - memcpy(new_attr->ar_data, encode_buffer, leb_size); - new_attr->ar_nbytes = leb_size; - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} - - -Dwarf_P_Attribute -dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die ownerdie, - Dwarf_Unsigned unsigned_value, - Dwarf_Error * error) -{ - Dwarf_P_Attribute new_attr; - int leb_size; - char encode_buffer[ENCODE_SPACE_NEEDED]; - int res; - - if (ownerdie == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr = (Dwarf_P_Attribute) - _dwarf_p_get_alloc(ownerdie->di_dbg, sizeof(struct Dwarf_P_Attribute_s)); - if (new_attr == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - - new_attr->ar_attribute = DW_AT_const_value; - new_attr->ar_attribute_form = DW_FORM_udata; - new_attr->ar_rel_type = R_MIPS_NONE; - new_attr->ar_reloc_len = 0; /* unused for R_MIPS_NONE */ - new_attr->ar_next = 0; - - res = _dwarf_pro_encode_leb128_nm(unsigned_value, &leb_size, - encode_buffer, - sizeof(encode_buffer)); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - new_attr->ar_data = (char *) - _dwarf_p_get_alloc(ownerdie->di_dbg, leb_size); - if (new_attr->ar_data == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_ALLOC_FAIL); - return ((Dwarf_P_Attribute) DW_DLV_BADADDR); - } - memcpy(new_attr->ar_data, encode_buffer, leb_size); - new_attr->ar_nbytes = leb_size; - - /* add attribute to the die */ - _dwarf_pro_add_at_to_die(ownerdie, new_attr); - return new_attr; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_frame.c b/usr/src/tools/ctf/dwarf/common/pro_frame.c deleted file mode 100644 index bd1ef6a637..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_frame.c +++ /dev/null @@ -1,598 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include <limits.h> -#include "pro_incl.h" -#include "pro_frame.h" - -static void _dwarf_pro_add_to_fde(Dwarf_P_Fde fde, - Dwarf_P_Frame_Pgm inst); - -/*------------------------------------------------------------------------- - This function adds a cie struct to the debug pointer. Its in the - form of a linked list. - augmenter: string reps augmentation (implementation defined) - code_align: alignment of code - data_align: alignment of data - init_bytes: byts having initial instructions - init_n_bytes: number of bytes of initial instructions ---------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_frame_cie(Dwarf_P_Debug dbg, - char *augmenter, - Dwarf_Small code_align, - Dwarf_Small data_align, - Dwarf_Small return_reg, - Dwarf_Ptr init_bytes, - Dwarf_Unsigned init_n_bytes, Dwarf_Error * error) -{ - Dwarf_P_Cie curcie; - - if (dbg->de_frame_cies == NULL) { - dbg->de_frame_cies = (Dwarf_P_Cie) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s)); - if (dbg->de_frame_cies == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT); - } - curcie = dbg->de_frame_cies; - dbg->de_n_cie = 1; - dbg->de_last_cie = curcie; - } else { - curcie = dbg->de_last_cie; - curcie->cie_next = (Dwarf_P_Cie) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s)); - if (curcie->cie_next == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT); - } - curcie = curcie->cie_next; - dbg->de_n_cie++; - dbg->de_last_cie = curcie; - } - curcie->cie_version = DW_CIE_VERSION; - curcie->cie_aug = augmenter; - curcie->cie_code_align = code_align; - curcie->cie_data_align = data_align; - curcie->cie_ret_reg = return_reg; - curcie->cie_inst = (char *) init_bytes; - curcie->cie_inst_bytes = (long) init_n_bytes; - curcie->cie_next = NULL; - return dbg->de_n_cie; -} - - -/*------------------------------------------------------------------------- - This functions adds a fde struct to the debug pointer. Its in the - form of a linked list. - die: subprogram/function die corresponding to this fde - cie: cie referred to by this fde, obtained from call to - add_frame_cie() routine. - virt_addr: beginning address - code_len: length of code reps by the fde ---------------------------------------------------------------------------*/ - /*ARGSUSED*/ /* pretend all args used */ - Dwarf_Unsigned -dwarf_add_frame_fde(Dwarf_P_Debug dbg, - Dwarf_P_Fde fde, - Dwarf_P_Die die, - Dwarf_Unsigned cie, - Dwarf_Unsigned virt_addr, - Dwarf_Unsigned code_len, - Dwarf_Unsigned symidx, Dwarf_Error * error) -{ - return dwarf_add_frame_fde_b(dbg, fde, die, cie, virt_addr, - code_len, symidx, 0, 0, error); -} - -/*ARGSUSED10*/ -Dwarf_Unsigned -dwarf_add_frame_fde_b(Dwarf_P_Debug dbg, - Dwarf_P_Fde fde, - Dwarf_P_Die die, - Dwarf_Unsigned cie, - Dwarf_Unsigned virt_addr, - Dwarf_Unsigned code_len, - Dwarf_Unsigned symidx, - Dwarf_Unsigned symidx_of_end, - Dwarf_Addr offset_from_end_sym, - Dwarf_Error * error) -{ - Dwarf_P_Fde curfde; - - fde->fde_die = die; - fde->fde_cie = (long) cie; - fde->fde_initloc = virt_addr; - fde->fde_r_symidx = symidx; - fde->fde_addr_range = code_len; - fde->fde_offset_into_exception_tables = DW_DLX_NO_EH_OFFSET; - fde->fde_exception_table_symbol = 0; - fde->fde_end_symbol_offset = offset_from_end_sym; - fde->fde_end_symbol = symidx_of_end; - fde->fde_dbg = dbg; - - curfde = dbg->de_last_fde; - if (curfde == NULL) { - dbg->de_frame_fdes = fde; - dbg->de_last_fde = fde; - dbg->de_n_fde = 1; - } else { - curfde->fde_next = fde; - dbg->de_last_fde = fde; - dbg->de_n_fde++; - } - return dbg->de_n_fde; -} - -/*------------------------------------------------------------------------- - This functions adds information to an fde. The fde is - linked into the linked list of fde's maintained in the Dwarf_P_Debug - structure. - dbg: The debug descriptor. - fde: The fde to be added. - die: subprogram/function die corresponding to this fde - cie: cie referred to by this fde, obtained from call to - add_frame_cie() routine. - virt_addr: beginning address - code_len: length of code reps by the fde - symidx: The symbol id of the symbol wrt to which relocation needs - to be performed for 'virt_addr'. - offset_into_exception_tables: The start of exception tables for - this function (indicated as an offset into the exception - tables). A value of -1 indicates that there is no exception - table entries associated with this function. - exception_table_symbol: The symbol id of the section for exception - tables wrt to which the offset_into_exception_tables will - be relocated. ---------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_frame_info(Dwarf_P_Debug dbg, - Dwarf_P_Fde fde, - Dwarf_P_Die die, - Dwarf_Unsigned cie, - Dwarf_Unsigned virt_addr, - Dwarf_Unsigned code_len, - Dwarf_Unsigned symidx, - Dwarf_Signed offset_into_exception_tables, - Dwarf_Unsigned exception_table_symbol, - Dwarf_Error * error) -{ - - return dwarf_add_frame_info_b(dbg, fde, die, cie, virt_addr, - code_len, symidx, - /* end_symbol */ 0, - /* offset_from_end */ 0, - offset_into_exception_tables, - exception_table_symbol, error); - -} - - /*ARGSUSED*/ /* pretend all args used */ -Dwarf_Unsigned -dwarf_add_frame_info_b(Dwarf_P_Debug dbg, - Dwarf_P_Fde fde, - Dwarf_P_Die die, - Dwarf_Unsigned cie, - Dwarf_Unsigned virt_addr, - Dwarf_Unsigned code_len, - Dwarf_Unsigned symidx, - Dwarf_Unsigned end_symidx, - Dwarf_Unsigned offset_from_end_symbol, - Dwarf_Signed offset_into_exception_tables, - Dwarf_Unsigned exception_table_symbol, - Dwarf_Error * error) -{ - Dwarf_P_Fde curfde; - - fde->fde_die = die; - fde->fde_cie = (long) cie; - fde->fde_initloc = virt_addr; - fde->fde_r_symidx = symidx; - fde->fde_addr_range = code_len; - fde->fde_offset_into_exception_tables = - offset_into_exception_tables; - fde->fde_exception_table_symbol = exception_table_symbol; - fde->fde_end_symbol_offset = offset_from_end_symbol; - fde->fde_end_symbol = end_symidx; - fde->fde_dbg = dbg; - - curfde = dbg->de_last_fde; - if (curfde == NULL) { - dbg->de_frame_fdes = fde; - dbg->de_last_fde = fde; - dbg->de_n_fde = 1; - } else { - curfde->fde_next = fde; - dbg->de_last_fde = fde; - dbg->de_n_fde++; - } - return dbg->de_n_fde; -} - -/* This is an alternate to inserting frame instructions - one instruction at a time. But use either this - or instruction level, not both in one fde. */ -int -dwarf_insert_fde_inst_bytes(Dwarf_P_Debug dbg, - Dwarf_P_Fde fde,Dwarf_Unsigned len, Dwarf_Ptr ibytes, - Dwarf_Error *error) -{ - if( len == 0) { - return DW_DLV_OK; - } - if(fde->fde_block || fde->fde_inst) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DUPLICATE_INST_BLOCK, - (int)DW_DLV_BADADDR); - } - fde->fde_block = (Dwarf_Ptr)_dwarf_p_get_alloc(dbg, len); - memcpy(fde->fde_block,ibytes,len); - fde->fde_inst_block_size = len; - fde->fde_n_bytes += len; - return DW_DLV_OK; -} - - - -/*------------------------------------------------------------------- - Create a new fde. ----------------------------------------------------------------------*/ -Dwarf_P_Fde -dwarf_new_fde(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - Dwarf_P_Fde fde; - - fde = (Dwarf_P_Fde) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Fde_s)); - if (fde == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_FDE_ALLOC, - (Dwarf_P_Fde) DW_DLV_BADADDR); - } - - fde->fde_uwordb_size = dbg->de_offset_size; - - return fde; -} - - -/*------------------------------------------------------------------------ - Add a cfe_offset instruction to the fde passed in. --------------------------------------------------------------------------*/ -Dwarf_P_Fde -dwarf_fde_cfa_offset(Dwarf_P_Fde fde, - Dwarf_Unsigned reg, - Dwarf_Signed offset, Dwarf_Error * error) -{ - Dwarf_Ubyte opc, regno; - char *ptr; - Dwarf_P_Frame_Pgm curinst; - int nbytes; - int res; - char buff1[ENCODE_SPACE_NEEDED]; - Dwarf_P_Debug dbg = fde->fde_dbg; - - curinst = (Dwarf_P_Frame_Pgm) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s)); - if (curinst == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_FPGM_ALLOC, - (Dwarf_P_Fde) DW_DLV_BADADDR); - } - opc = DW_CFA_offset; - regno = reg; - if (regno & 0xc0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REGNO_OVFL, - (Dwarf_P_Fde) DW_DLV_BADADDR); - } - opc = opc | regno; /* lower 6 bits are register number */ - curinst->dfp_opcode = opc; - res = _dwarf_pro_encode_leb128_nm(offset, &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy(ptr, buff1, nbytes); - - curinst->dfp_args = ptr; - curinst->dfp_nbytes = nbytes; - curinst->dfp_next = NULL; - - _dwarf_pro_add_to_fde(fde, curinst); - return fde; -} - -/* - Generic routine to add opcode to fde instructions. val1 and - val2 are parameters whose interpretation depends on the 'op'. - - This does not work properly for DW_DLC_SYMBOLIC_RELOCATIONS - for DW_CFA_set_loc or DW_DVA_advance_loc* 'op', as - these ops normally are addresses or (DW_CFA_set_loc) - or code lengths (DW_DVA_advance_loc*) and such must be - represented with relocations and symbol indices for - DW_DLC_SYMBOLIC_RELOCATIONS. - - This does not treat all DW_CFA instructions yet. - - For certain operations a val? value must be - signed (though passed in as unsigned here). - - Currently this does not check that the frame - version is 3(for dwarf3) or 4 (for dwarf4) - when applying operations that are only valid for - dwarf3 or dwarf4. - -*/ -Dwarf_P_Fde -dwarf_add_fde_inst(Dwarf_P_Fde fde, - Dwarf_Small op, - Dwarf_Unsigned val1, - Dwarf_Unsigned val2, Dwarf_Error * error) -{ - Dwarf_P_Frame_Pgm curinst; - int nbytes, nbytes1, nbytes2; - Dwarf_Ubyte db; - Dwarf_Half dh; - Dwarf_Word dw; - Dwarf_Unsigned du; - char *ptr; - int res; - char buff1[ENCODE_SPACE_NEEDED]; - char buff2[ENCODE_SPACE_NEEDED]; - Dwarf_P_Debug dbg = fde->fde_dbg; - /* This is a hack telling the code when to transform - a value to a signed leb number. */ - int signed_second = 0; - int signed_first = 0; - - - nbytes = 0; - ptr = NULL; - curinst = (Dwarf_P_Frame_Pgm) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s)); - if (curinst == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_FPGM_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - - switch (op) { - - case DW_CFA_advance_loc: - if (val1 <= 0x3f) { - db = val1; - op |= db; - } - /* test not portable FIX */ - else if (val1 <= UCHAR_MAX) { - op = DW_CFA_advance_loc1; - db = val1; - ptr = (char *) _dwarf_p_get_alloc(dbg, 1); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy((void *) ptr, (const void *) &db, 1); - nbytes = 1; - } - /* test not portable FIX */ - else if (val1 <= USHRT_MAX) { - op = DW_CFA_advance_loc2; - dh = val1; - ptr = (char *) _dwarf_p_get_alloc(dbg, 2); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy((void *) ptr, (const void *) &dh, 2); - nbytes = 2; - } - /* test not portable FIX */ - else if (val1 <= ULONG_MAX) { - op = DW_CFA_advance_loc4; - dw = (Dwarf_Word) val1; - ptr = (char *) _dwarf_p_get_alloc(dbg, 4); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy((void *) ptr, (const void *) &dw, 4); - nbytes = 4; - } else { - op = DW_CFA_MIPS_advance_loc8; - du = val1; - ptr = - (char *) _dwarf_p_get_alloc(dbg, - sizeof(Dwarf_Unsigned)); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy((void *) ptr, (const void *) &du, 8); - nbytes = 8; - } - break; - - case DW_CFA_offset: - if (val1 <= MAX_6_BIT_VALUE) { - db = val1; - op |= db; - res = _dwarf_pro_encode_leb128_nm(val2, &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy(ptr, buff1, nbytes); - - } else { - op = DW_CFA_offset_extended; - goto two_leb; - } - break; - case DW_CFA_offset_extended_sf: /* DWARF3 */ - signed_second = 1; - goto two_leb; - case DW_CFA_offset_extended: - goto two_leb; - - case DW_CFA_undefined: - case DW_CFA_same_value: - goto one_leb; - - case DW_CFA_val_offset: - goto two_leb; - case DW_CFA_val_offset_sf: - signed_second = 1; - goto two_leb; - case DW_CFA_def_cfa_sf: - signed_second = 1; - goto two_leb; - case DW_CFA_register: - case DW_CFA_def_cfa: - two_leb: - res = _dwarf_pro_encode_leb128_nm(val1, &nbytes1, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - if (!signed_second) { - res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2, - buff2, sizeof(buff2)); - } else { - Dwarf_Signed val2s = val2; - res = _dwarf_pro_encode_signed_leb128_nm(val2s, &nbytes2, - buff2, sizeof(buff2)); - } - - res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2, - buff2, sizeof(buff2)); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - - ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes1 + nbytes2); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy(ptr, buff1, nbytes1); - memcpy(ptr + nbytes1, buff2, nbytes2); - nbytes = nbytes1 + nbytes2; - break; - - case DW_CFA_def_cfa_offset_sf: /* DWARF3 */ - signed_first = 1; - goto one_leb; - case DW_CFA_def_cfa_register: - case DW_CFA_def_cfa_offset: - one_leb: - if(!signed_first) { - res = _dwarf_pro_encode_leb128_nm(val1, &nbytes, - buff1, sizeof(buff1)); - } else { - Dwarf_Signed val1s = val1; - res = _dwarf_pro_encode_signed_leb128_nm(val1s, &nbytes, - buff1, sizeof(buff1)); - } - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes); - if (ptr == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - memcpy(ptr, buff1, nbytes); - break; - case DW_CFA_def_cfa_expression: /* DWARF3 */ - /* FIXME: argument is dwarf expr, not handled yet. */ - case DW_CFA_expression: /* DWARF3 */ - /* First arg: ULEB reg num. 2nd arg dwarf expr in form block. - FIXME: not handled yet. */ - case DW_CFA_val_expression: /* DWARF3f */ - /* First arg: ULEB reg num. 2nd arg dwarf expr in form block. - FIXME: not handled yet. */ - default: - _dwarf_p_error(dbg, error, DW_DLE_DEBUGFRAME_ERROR); - return ((Dwarf_P_Fde) DW_DLV_BADADDR); - } - - curinst->dfp_opcode = op; - curinst->dfp_args = ptr; - curinst->dfp_nbytes = nbytes; - curinst->dfp_next = NULL; - - _dwarf_pro_add_to_fde(fde, curinst); - return fde; -} - - -/*------------------------------------------------------------------------ - Instructions are added to an fde in the form of a linked - list. This function manages the linked list. --------------------------------------------------------------------------*/ -void -_dwarf_pro_add_to_fde(Dwarf_P_Fde fde, Dwarf_P_Frame_Pgm curinst) -{ - if (fde->fde_last_inst) { - fde->fde_last_inst->dfp_next = curinst; - fde->fde_last_inst = curinst; - fde->fde_n_inst++; - fde->fde_n_bytes += - (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte)); - } else { - fde->fde_last_inst = curinst; - fde->fde_inst = curinst; - fde->fde_n_inst = 1; - fde->fde_n_bytes = - (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte)); - } -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_frame.h b/usr/src/tools/ctf/dwarf/common/pro_frame.h deleted file mode 100644 index df60d369ed..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_frame.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -/* - Largest register value that can be coded into - the opcode since there are only 6 bits in the - register field. -*/ -#define MAX_6_BIT_VALUE 0x3f - -/* - This struct holds debug_frame instructions -*/ -typedef struct Dwarf_P_Frame_Pgm_s *Dwarf_P_Frame_Pgm; - -struct Dwarf_P_Frame_Pgm_s { - Dwarf_Ubyte dfp_opcode; /* opcode - includes reg # */ - char *dfp_args; /* operands */ - int dfp_nbytes; /* number of bytes in args */ -#if 0 - Dwarf_Unsigned dfp_sym_index; /* 0 unless reloc needed */ -#endif - Dwarf_P_Frame_Pgm dfp_next; -}; - - -/* - This struct has cie related information. Used to gather data - from user program, and later to transform to disk form -*/ -struct Dwarf_P_Cie_s { - Dwarf_Ubyte cie_version; - char *cie_aug; /* augmentation */ - Dwarf_Ubyte cie_code_align; /* alignment of code */ - Dwarf_Sbyte cie_data_align; - Dwarf_Ubyte cie_ret_reg; /* return register # */ - char *cie_inst; /* initial instruction */ - long cie_inst_bytes; - /* no of init_inst */ - Dwarf_P_Cie cie_next; -}; - - -/* producer fields */ -struct Dwarf_P_Fde_s { - Dwarf_Unsigned fde_unused1; - - /* function/subr die for this fde */ - Dwarf_P_Die fde_die; - - /* index to asso. cie */ - Dwarf_Word fde_cie; - - /* Address of first location of the code this frame applies to If - fde_end_symbol non-zero, this represents the offset from the - symbol indicated by fde_r_symidx */ - Dwarf_Addr fde_initloc; - - /* Relocation symbol for address of the code this frame applies to. - */ - Dwarf_Unsigned fde_r_symidx; - - /* Bytes of instr for this fde, if known */ - Dwarf_Unsigned fde_addr_range; - - /* linked list of instructions we will put in fde. */ - Dwarf_P_Frame_Pgm fde_inst; - - /* number of instructions in fde */ - long fde_n_inst; - - /* number of bytes of inst in fde */ - long fde_n_bytes; - - /* offset into exception table for this function. */ - Dwarf_Signed fde_offset_into_exception_tables; - - /* The symbol for the exception table elf section. */ - Dwarf_Unsigned fde_exception_table_symbol; - - /* pointer to last inst */ - Dwarf_P_Frame_Pgm fde_last_inst; - - Dwarf_P_Fde fde_next; - - /* The symbol and offset of the end symbol. When fde_end_symbol is - non-zero we must represent the */ - Dwarf_Addr fde_end_symbol_offset; - Dwarf_Unsigned fde_end_symbol; - - int fde_uwordb_size; - Dwarf_P_Debug fde_dbg; - - /* If fde_block is non-null, then it is the set of instructions. - so we should use it rather than fde_inst. */ - Dwarf_Unsigned fde_inst_block_size; - void *fde_block; -}; diff --git a/usr/src/tools/ctf/dwarf/common/pro_funcs.c b/usr/src/tools/ctf/dwarf/common/pro_funcs.c deleted file mode 100644 index 8ff05500bb..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_funcs.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" - -/* - This function adds another function name to the - list of function names for the given Dwarf_P_Debug. - It returns 0 on error, and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_funcname(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *function_name, Dwarf_Error * error) -{ - return - _dwarf_add_simple_name_entry(dbg, die, function_name, - dwarf_snk_funcname, error); - -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_incl.h b/usr/src/tools/ctf/dwarf/common/pro_incl.h deleted file mode 100644 index 10bce470c2..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_incl.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 David Anderson. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#ifdef HAVE_ELF_H -#include <elf.h> -#elif defined(HAVE_LIBELF_H) -/* On one platform without elf.h this gets Elf32_Rel - type defined (a required type). */ -#include <libelf.h> -#endif - -#if defined(sun) -#include <sys/elf_SPARC.h> -#include <sys/elf_386.h> -#endif - -/* The target address is given: the place in the source integer - is to be determined. -*/ -#ifdef WORDS_BIGENDIAN -#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ - { \ - dbg->de_copy_word(dest, \ - ((char *)source) +srclength-len_out, \ - len_out) ; \ - } - - -#else /* LITTLE ENDIAN */ - -#define WRITE_UNALIGNED(dbg,dest,source, srclength,len_out) \ - { \ - dbg->de_copy_word( (dest) , \ - ((char *)source) , \ - len_out) ; \ - } -#endif - - -#if defined(sparc) && defined(sun) -#define REL32 Elf32_Rela -#define REL64 Elf64_Rela -#define REL_SEC_PREFIX ".rela" -#else -#define REL32 Elf32_Rel -#define REL64 Elf64_Rel -#define REL_SEC_PREFIX ".rel" -#endif - -#include "dwarf.h" -#include "libdwarf.h" - -#include "pro_opaque.h" -#include "pro_error.h" -#include "pro_util.h" -#include "pro_encode_nm.h" -#include "pro_alloc.h" diff --git a/usr/src/tools/ctf/dwarf/common/pro_init.c b/usr/src/tools/ctf/dwarf/common/pro_init.c deleted file mode 100644 index d696113a67..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_init.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 David Anderson, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include "pro_incl.h" -#include "pro_section.h" /* for MAGIC_SECT_NO */ -#include "pro_reloc_symbolic.h" -#include "pro_reloc_stream.h" - - -static void common_init(Dwarf_P_Debug dbg, Dwarf_Unsigned flags); - -void *_dwarf_memcpy_swap_bytes(void *s1, const void *s2, size_t len); - -/*-------------------------------------------------------------------- - This function sets up a new dwarf producing region. - flags: Indicates type of access method, one of DW_DLC* macros - func(): Used to create a new object file, a call back function - errhand(): Error Handler provided by user - errarg: Argument to errhand() - error: returned error value ---------------------------------------------------------------------*/ - /* We want the following to have an elf section number that matches - 'nothing' */ -static struct Dwarf_P_Section_Data_s init_sect = { - MAGIC_SECT_NO, 0, 0, 0, 0 -}; - -Dwarf_P_Debug -dwarf_producer_init_b(Dwarf_Unsigned flags, - Dwarf_Callback_Func_b func, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, Dwarf_Error * error) -{ - Dwarf_P_Debug dbg; - dbg = (Dwarf_P_Debug) _dwarf_p_get_alloc(NULL, - sizeof(struct - Dwarf_P_Debug_s)); - if (dbg == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, - (Dwarf_P_Debug) DW_DLV_BADADDR); - } - memset((void *) dbg, 0, sizeof(struct Dwarf_P_Debug_s)); - /* For the time being */ - if (func == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_NO_CALLBACK_FUNC, - (Dwarf_P_Debug) DW_DLV_BADADDR); - } - dbg->de_callback_func_b = func; - dbg->de_errhand = errhand; - dbg->de_errarg = errarg; - common_init(dbg, flags); - return dbg; - -} - -Dwarf_P_Debug -dwarf_producer_init(Dwarf_Unsigned flags, - Dwarf_Callback_Func func, - Dwarf_Handler errhand, - Dwarf_Ptr errarg, Dwarf_Error * error) -{ - - Dwarf_P_Debug dbg; - - - - dbg = (Dwarf_P_Debug) _dwarf_p_get_alloc(NULL, - sizeof(struct - Dwarf_P_Debug_s)); - if (dbg == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, - (Dwarf_P_Debug) DW_DLV_BADADDR); - } - memset((void *) dbg, 0, sizeof(struct Dwarf_P_Debug_s)); - /* For the time being */ - if (func == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_NO_CALLBACK_FUNC, - (Dwarf_P_Debug) DW_DLV_BADADDR); - } - dbg->de_callback_func = func; - dbg->de_errhand = errhand; - dbg->de_errarg = errarg; - common_init(dbg, flags); - return dbg; -} -static void -common_init(Dwarf_P_Debug dbg, Dwarf_Unsigned flags) -{ - unsigned int k; - - - dbg->de_version_magic_number = PRO_VERSION_MAGIC; - dbg->de_n_debug_sect = 0; - dbg->de_debug_sects = &init_sect; - dbg->de_current_active_section = &init_sect; - dbg->de_flags = flags; - - /* Now, with flags set, can use 64bit tests */ - - - -#if defined(HAVE_STRICT_DWARF2_32BIT_OFFSET) - /* This is cygnus 32bit offset, as specified in pure dwarf2 v2.0.0. - It is consistent with normal DWARF2/3 generation of always - generating 32 bit offsets. */ - dbg->de_64bit_extension = 0; - dbg->de_pointer_size = (IS_64BIT(dbg) ? 8 : 4); - dbg->de_offset_size = (IS_64BIT(dbg) ? 4 : 4); - dbg->de_ptr_reloc = - IS_64BIT(dbg) ? Get_REL64_isa(dbg) : Get_REL32_isa(dbg); - /* non-MIPS, dwarf lengths and offsets are 32 bits even for 64bit - pointer environments. */ - /* Get_REL32_isa here supports 64-bit-pointer dwarf with pure - dwarf2 v2.0.0 32bit offsets, as emitted by cygnus tools. And - pure 32 bit offset dwarf for 32bit pointer apps. */ - - dbg->de_offset_reloc = Get_REL32_isa(dbg); -#elif defined(HAVE_SGI_IRIX_OFFSETS) - /* MIPS-SGI-IRIX 32 or 64, where offsets and lengths are both 64 bit for - 64bit pointer objects and both 32 bit for 32bit pointer objects. - And a dwarf-reader must check elf info to tell which applies. */ - dbg->de_64bit_extension = 0; - dbg->de_pointer_size = (IS_64BIT(dbg) ? 8 : 4); - dbg->de_offset_size = (IS_64BIT(dbg) ? 8 : 4); - dbg->de_ptr_reloc = - IS_64BIT(dbg) ? Get_REL64_isa(dbg) : Get_REL32_isa(dbg); - dbg->de_offset_reloc = dbg->de_ptr_reloc; -#else /* HAVE_DWARF2_99_EXTENSION or default. */ - /* Revised 64 bit output, using distingushed values. Per 1999 - dwarf3. This allows run-time selection of offset size. */ - dbg->de_64bit_extension = (IS_64BIT(dbg) ? 1 : 0); - dbg->de_pointer_size = (IS_64BIT(dbg) ? 8 : 4); - if( flags & DW_DLC_OFFSET_SIZE_64 && (dbg->de_pointer_size == 8)) { - /* When it's 64 bit address, a 64bit offset is sensible. - Arguably a 32 bit address with 64 bit offset could be - sensible, but who would want that? */ - dbg->de_offset_size = 8; - dbg->de_64bit_extension = 1; - } else { - dbg->de_offset_size = 4; - dbg->de_64bit_extension = 0; - } - dbg->de_ptr_reloc = - IS_64BIT(dbg) ? Get_REL64_isa(dbg) : Get_REL32_isa(dbg); - /* Non-MIPS, dwarf lengths and offsets are 32 bits even for 64bit - pointer environments. */ - /* Get_REL??_isa here supports 64bit-offset dwarf. For 64bit, we - emit the extension bytes. */ - - dbg->de_offset_reloc = IS_64BIT(dbg) ? Get_REL64_isa(dbg) - : Get_REL32_isa(dbg); -#endif /* HAVE_DWARF2_99_EXTENSION etc. */ - - dbg->de_exc_reloc = Get_REL_SEGREL_isa(dbg); - - dbg->de_is_64bit = IS_64BIT(dbg); - - - if (flags & DW_DLC_SYMBOLIC_RELOCATIONS) { - dbg->de_relocation_record_size = - sizeof(struct Dwarf_Relocation_Data_s); - } else { - -#if HAVE_ELF64_GETEHDR - dbg->de_relocation_record_size = - IS_64BIT(dbg)? sizeof(REL64) : sizeof(REL32); -#else - dbg->de_relocation_record_size = sizeof(REL32); -#endif - - } - - if (dbg->de_offset_size == 8) { - dbg->de_ar_data_attribute_form = DW_FORM_data8; - dbg->de_ar_ref_attr_form = DW_FORM_ref8; - } else { - dbg->de_ar_data_attribute_form = DW_FORM_data4; - dbg->de_ar_ref_attr_form = DW_FORM_ref4; - } - - if (flags & DW_DLC_SYMBOLIC_RELOCATIONS) { - dbg->de_reloc_name = _dwarf_pro_reloc_name_symbolic; - dbg->de_reloc_pair = _dwarf_pro_reloc_length_symbolic; - dbg->de_transform_relocs_to_disk = - _dwarf_symbolic_relocs_to_disk; - } else { - if (IS_64BIT(dbg)) { - dbg->de_reloc_name = _dwarf_pro_reloc_name_stream64; - } else { - dbg->de_reloc_name = _dwarf_pro_reloc_name_stream32; - } - dbg->de_reloc_pair = 0; - dbg->de_transform_relocs_to_disk = _dwarf_stream_relocs_to_disk; - } - for (k = 0; k < NUM_DEBUG_SECTIONS; ++k) { - - Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[k]; - - prel->pr_slots_per_block_to_alloc = DEFAULT_SLOTS_PER_BLOCK; - } - /* First assume host, target same endianness */ - dbg->de_same_endian = 1; - dbg->de_copy_word = memcpy; -#ifdef WORDS_BIGENDIAN - /* host is big endian, so what endian is target? */ - if (flags & DW_DLC_TARGET_LITTLEENDIAN) { - dbg->de_same_endian = 0; - dbg->de_copy_word = _dwarf_memcpy_swap_bytes; - } -#else /* little endian */ - /* host is little endian, so what endian is target? */ - if (flags & DW_DLC_TARGET_BIGENDIAN) { - dbg->de_same_endian = 0; - dbg->de_copy_word = _dwarf_memcpy_swap_bytes; - } -#endif /* !WORDS_BIGENDIAN */ - - - return; - -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_line.c b/usr/src/tools/ctf/dwarf/common/pro_line.c deleted file mode 100644 index 69d3e339f0..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_line.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELF_H -#include <elf.h> -#endif -#include "pro_incl.h" -#include "pro_line.h" - -Dwarf_Unsigned _dwarf_pro_add_line_entry(Dwarf_P_Debug, - Dwarf_Unsigned file_index, - Dwarf_Addr code_address, - Dwarf_Unsigned symidx, - Dwarf_Unsigned line_no, - Dwarf_Signed col_no, - Dwarf_Bool is_stmt_begin, - Dwarf_Bool is_bb_begin, - Dwarf_Ubyte opc, - Dwarf_Error * error); - -/*------------------------------------------------------------------------- - Add a entry to the line information section - file_index: index of file in file entries, obtained from - add_file_entry() call. - - This function actually calls _dwarf_pro_add_line_entry(), with - an extra parameter, the opcode. Done so that interface calls - dwarf_lne_set_address() and dwarf_lne_end_sequence() can use - this internal routine. ----------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_line_entry(Dwarf_P_Debug dbg, - Dwarf_Unsigned file_index, - Dwarf_Addr code_address, - Dwarf_Unsigned line_no, - Dwarf_Signed col_no, - Dwarf_Bool is_stmt_begin, - Dwarf_Bool is_bb_begin, Dwarf_Error * error) -{ - Dwarf_Unsigned retval; - - retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address, 0, - line_no, col_no, is_stmt_begin, - is_bb_begin, 0, error); - return retval; -} - -/*------------------------------------------------------------------------ - Ask to emit DW_LNE_set_address opcode explicitly. Used by be - to emit start of a new .text section, or to force a relocated - address into debug line information entry. --------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_lne_set_address(Dwarf_P_Debug dbg, - Dwarf_Addr offs, - Dwarf_Unsigned symidx, Dwarf_Error * error) -{ - Dwarf_Ubyte opc; - Dwarf_Unsigned retval; - - opc = DW_LNE_set_address; - retval = - _dwarf_pro_add_line_entry(dbg, 0, offs, symidx, 0, 0, 0, 0, opc, - error); - return retval; -} - -/*------------------------------------------------------------------------ - Ask to emit end_seqence opcode. Used normally at the end of a - compilation unit. Can also be used in the middle if there - are gaps in the region described by the code address. --------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_lne_end_sequence(Dwarf_P_Debug dbg, - Dwarf_Addr end_address, Dwarf_Error * error) -{ - Dwarf_Ubyte opc; - Dwarf_Unsigned retval; - - opc = DW_LNE_end_sequence; - retval = - _dwarf_pro_add_line_entry(dbg, 0, end_address, 0, 0, 0, 0, 0, - opc, error); - return retval; -} - -/*---------------------------------------------------------------------------- - Add an entry in the internal list of lines mantained by producer. - Opc indicates if an opcode needs to be generated, rather than just - an entry in the matrix. During opcodes generation time, these - opcodes will be used. ------------------------------------------------------------------------------*/ -Dwarf_Unsigned -_dwarf_pro_add_line_entry(Dwarf_P_Debug dbg, - Dwarf_Unsigned file_index, - Dwarf_Addr code_address, - Dwarf_Unsigned symidx, - Dwarf_Unsigned line_no, - Dwarf_Signed col_no, - Dwarf_Bool is_stmt_begin, - Dwarf_Bool is_bb_begin, - Dwarf_Ubyte opc, Dwarf_Error * error) -{ - if (dbg->de_lines == NULL) { - dbg->de_lines = (Dwarf_P_Line) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s)); - if (dbg->de_lines == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT); - } - dbg->de_last_line = dbg->de_lines; - _dwarf_pro_reg_init(dbg->de_lines); - - } else { - dbg->de_last_line->dpl_next = (Dwarf_P_Line) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s)); - if (dbg->de_last_line->dpl_next == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT); - } - dbg->de_last_line = dbg->de_last_line->dpl_next; - _dwarf_pro_reg_init(dbg->de_last_line); - } - dbg->de_last_line->dpl_address = code_address; - dbg->de_last_line->dpl_file = (unsigned long) file_index; - dbg->de_last_line->dpl_line = (unsigned long) line_no; - dbg->de_last_line->dpl_column = (unsigned long) col_no; - dbg->de_last_line->dpl_is_stmt = is_stmt_begin; - dbg->de_last_line->dpl_basic_block = is_bb_begin; - dbg->de_last_line->dpl_opc = opc; - dbg->de_last_line->dpl_r_symidx = symidx; - - return (0); -} - -/*----------------------------------------------------------------------- - Add a directory declaration to the debug_line section. Stored - in linked list. -------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_directory_decl(Dwarf_P_Debug dbg, - char *name, Dwarf_Error * error) -{ - if (dbg->de_inc_dirs == NULL) { - dbg->de_inc_dirs = (Dwarf_P_Inc_Dir) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s)); - if (dbg->de_inc_dirs == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT); - } - dbg->de_last_inc_dir = dbg->de_inc_dirs; - dbg->de_n_inc_dirs = 1; - } else { - dbg->de_last_inc_dir->did_next = (Dwarf_P_Inc_Dir) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s)); - if (dbg->de_last_inc_dir->did_next == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT); - } - dbg->de_last_inc_dir = dbg->de_last_inc_dir->did_next; - dbg->de_n_inc_dirs++; - } - dbg->de_last_inc_dir->did_name = - (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1); - if (dbg->de_last_inc_dir->did_name == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_STRING_ALLOC, DW_DLV_NOCOUNT); - } - strcpy(dbg->de_last_inc_dir->did_name, name); - dbg->de_last_inc_dir->did_next = NULL; - - return dbg->de_n_inc_dirs; -} - -/*----------------------------------------------------------------------- - Add a file entry declaration to the debug_line section. Stored - in linked list. The data is immediately encodes as leb128 - and stored in Dwarf_P_F_Entry_s struct. -------------------------------------------------------------------------*/ -Dwarf_Unsigned -dwarf_add_file_decl(Dwarf_P_Debug dbg, - char *name, - Dwarf_Unsigned dir_idx, - Dwarf_Unsigned time_mod, - Dwarf_Unsigned length, Dwarf_Error * error) -{ - Dwarf_P_F_Entry cur; - char *ptr; - int nbytes_idx, nbytes_time, nbytes_len; - char buffidx[ENCODE_SPACE_NEEDED]; - char bufftime[ENCODE_SPACE_NEEDED]; - char bufflen[ENCODE_SPACE_NEEDED]; - int res; - - if (dbg->de_file_entries == NULL) { - dbg->de_file_entries = (Dwarf_P_F_Entry) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s)); - if (dbg->de_file_entries == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC, - DW_DLV_NOCOUNT); - } - cur = dbg->de_file_entries; - dbg->de_last_file_entry = cur; - dbg->de_n_file_entries = 1; - } else { - cur = dbg->de_last_file_entry; - cur->dfe_next = (Dwarf_P_F_Entry) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s)); - if (cur->dfe_next == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC, - DW_DLV_NOCOUNT); - } - cur = cur->dfe_next; - dbg->de_last_file_entry = cur; - dbg->de_n_file_entries++; - } - cur->dfe_name = (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1); - if (cur->dfe_name == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT); - } - strcpy((char *) cur->dfe_name, name); - res = _dwarf_pro_encode_leb128_nm(dir_idx, &nbytes_idx, - buffidx, sizeof(buffidx)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT); - } - res = _dwarf_pro_encode_leb128_nm(time_mod, &nbytes_time, - bufftime, sizeof(bufftime)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT); - } - res = _dwarf_pro_encode_leb128_nm(length, &nbytes_len, - bufflen, sizeof(bufflen)); - cur->dfe_args = (char *) - _dwarf_p_get_alloc(dbg, nbytes_idx + nbytes_time + nbytes_len); - if (cur->dfe_args == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT); - } - ptr = cur->dfe_args; - memcpy((void *) ptr, buffidx, nbytes_idx); - ptr += nbytes_idx; - memcpy((void *) ptr, bufftime, nbytes_time); - ptr += nbytes_time; - memcpy((void *) ptr, bufflen, nbytes_len); - ptr += nbytes_len; - cur->dfe_nbytes = nbytes_idx + nbytes_time + nbytes_len; - cur->dfe_next = NULL; - - return dbg->de_n_file_entries; -} - - -/*--------------------------------------------------------------------- - Initialize a row of the matrix for line numbers, meaning - initialize the struct corresponding to it -----------------------------------------------------------------------*/ -void -_dwarf_pro_reg_init(Dwarf_P_Line cur_line) -{ - cur_line->dpl_address = 0; - cur_line->dpl_file = 1; - cur_line->dpl_line = 1; - cur_line->dpl_column = 0; - cur_line->dpl_is_stmt = DEFAULT_IS_STMT; - cur_line->dpl_basic_block = false; - cur_line->dpl_next = NULL; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_line.h b/usr/src/tools/ctf/dwarf/common/pro_line.h deleted file mode 100644 index eed941239d..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_line.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#define VERSION 2 -#ifdef __i386 -#define MIN_INST_LENGTH 1 -#else -#define MIN_INST_LENGTH 4 -#endif -#define DEFAULT_IS_STMT false - /* line base and range are temporarily defines. - They need to be calculated later */ -#define LINE_BASE -1 -#define LINE_RANGE 4 - -#define OPCODE_BASE 10 -#define MAX_OPCODE 255 - - -/* - This struct is used to hold entries in the include directories - part of statement prologue. -*/ -struct Dwarf_P_Inc_Dir_s { - char *did_name; /* name of directory */ - Dwarf_P_Inc_Dir did_next; -}; - - -/* - This struct holds file entries for the statement prologue. - Defined in pro_line.h -*/ -struct Dwarf_P_F_Entry_s { - char *dfe_name; - char *dfe_args; /* has dir index, time of modification, - length in bytes. Encodes as leb128 */ - int dfe_nbytes; /* number of bytes in args */ - Dwarf_P_F_Entry dfe_next; -}; - - -/* - Struct holding line number information for each of the producer - line entries -*/ -struct Dwarf_P_Line_s { - /* code address */ - Dwarf_Addr dpl_address; - - /* file index, index into file entry */ - Dwarf_Word dpl_file; - - /* line number */ - Dwarf_Word dpl_line; - - /* column number */ - Dwarf_Word dpl_column; - - /* whether its a beginning of a stmt */ - Dwarf_Ubyte dpl_is_stmt; - - /* whether its a beginning of basic blk */ - Dwarf_Ubyte dpl_basic_block; - - /* used to store opcodes set_address, and end_seq */ - Dwarf_Ubyte dpl_opc; - - /* - Used only for relocations. Has index of symbol relative to - which relocation has to be done (the S part in S + A) */ - Dwarf_Unsigned dpl_r_symidx; - - Dwarf_P_Line dpl_next; -}; - -/* - to initialize state machine registers, definition in - pro_line.c -*/ -void _dwarf_pro_reg_init(Dwarf_P_Line); diff --git a/usr/src/tools/ctf/dwarf/common/pro_macinfo.c b/usr/src/tools/ctf/dwarf/common/pro_macinfo.c deleted file mode 100644 index cfa820aee6..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_macinfo.c +++ /dev/null @@ -1,472 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#include "pro_incl.h" -#include "pro_section.h" -#include "pro_macinfo.h" - -/* - I don't much like the error strings this generates, since - like the rest of libdwarf they are simple strings with - no useful numbers in them. But that's not something I can - fix without more work than I have time for - right now. davea Nov 94. -*/ - -/* these are gross overestimates of the number of -** bytes needed to store a number in LEB form. -** Just estimates, and since blocks are reasonable size, -** the end-block waste is small. -** Of course the waste is NOT present on disk. -*/ - -#define COMMAND_LEN ENCODE_SPACE_NEEDED -#define LINE_LEN ENCODE_SPACE_NEEDED -#define BASE_MACINFO_MALLOC_LEN 2048 - -static int -libdwarf_compose_begin(Dwarf_P_Debug dbg, int code, - size_t maxlen, int *compose_error_type) -{ - unsigned char *nextchar; - struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo; - - if (curblk == 0) { - struct dw_macinfo_block_s *newb; - size_t len; - - /* initial allocation */ - size_t blen = BASE_MACINFO_MALLOC_LEN; - - if (blen < maxlen) { - blen = 2 * maxlen; - } - len = sizeof(struct dw_macinfo_block_s) + blen; - newb = - (struct dw_macinfo_block_s *) _dwarf_p_get_alloc(dbg, len); - if (!newb) { - *compose_error_type = DW_DLE_MACINFO_MALLOC_FAIL; - return DW_DLV_ERROR; - } - newb->mb_data = - (char *) newb + sizeof(struct dw_macinfo_block_s); - newb->mb_avail_len = blen; - newb->mb_used_len = 0; - newb->mb_macinfo_data_space_len = blen; - dbg->de_first_macinfo = newb; - dbg->de_current_macinfo = newb; - curblk = newb; - } else if (curblk->mb_avail_len < maxlen) { - struct dw_macinfo_block_s *newb; - size_t len; - - /* no space left in block: allocate a new block */ - size_t blen = - dbg->de_current_macinfo->mb_macinfo_data_space_len * 2; - if (blen < maxlen) { - blen = 2 * maxlen; - } - len = sizeof(struct dw_macinfo_block_s) + blen; - newb = - (struct dw_macinfo_block_s *) _dwarf_p_get_alloc(dbg, len); - if (!newb) { - *compose_error_type = DW_DLE_MACINFO_MALLOC_FAIL; - return DW_DLV_ERROR; - } - newb->mb_data = - (char *) newb + sizeof(struct dw_macinfo_block_s); - newb->mb_avail_len = blen; - newb->mb_used_len = 0; - newb->mb_macinfo_data_space_len = blen; - dbg->de_first_macinfo->mb_next = newb; - dbg->de_current_macinfo = newb; - curblk = newb; - } - /* now curblk has enough room */ - dbg->de_compose_avail = curblk->mb_avail_len; - dbg->de_compose_used_len = curblk->mb_used_len; - nextchar = - (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len); - *nextchar = code; - dbg->de_compose_avail--; - ++dbg->de_compose_used_len; - return DW_DLV_OK; -} - - - -static void -libdwarf_compose_add_string(Dwarf_P_Debug dbg, char *string, size_t len) -{ - struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo; - unsigned char *nextchar; - - nextchar = - (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len); - - len += 1; /* count the null terminator */ - - memcpy(nextchar, string, len); - dbg->de_compose_avail -= len; - dbg->de_compose_used_len += len; - return; - -} -static int -libdwarf_compose_add_line(Dwarf_P_Debug dbg, - Dwarf_Unsigned line, int *compose_error_type) -{ - struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo; - unsigned char *nextchar; - int res; - int nbytes; - - nextchar = - (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len); - - /* Put the created leb number directly into the macro buffer If - dbg->de_compose_avail is > INT_MAX this will not work as the - 'int' will look negative to _dwarf_pro_encode_leb128_nm! */ - - res = _dwarf_pro_encode_leb128_nm(line, &nbytes, - (char *) nextchar, - (int) dbg->de_compose_avail); - if (res != DW_DLV_OK) { - *compose_error_type = DW_DLE_MACINFO_INTERNAL_ERROR_SPACE; - return DW_DLV_ERROR; - } - - dbg->de_compose_avail -= nbytes; - dbg->de_compose_used_len += nbytes; - return DW_DLV_OK; -} - -/* - This function actually 'commits' the space used by the - preceeding calls. -*/ -static int -libdwarf_compose_complete(Dwarf_P_Debug dbg, int *compose_error_type) -{ - struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo; - - if (dbg->de_compose_used_len > curblk->mb_macinfo_data_space_len) { - *compose_error_type = DW_DLE_MACINFO_INTERNAL_ERROR_SPACE; - return DW_DLV_ERROR; - } - curblk->mb_avail_len = dbg->de_compose_avail; - curblk->mb_used_len = dbg->de_compose_used_len; - return DW_DLV_OK; -} - - - -int -dwarf_def_macro(Dwarf_P_Debug dbg, - Dwarf_Unsigned line, - char *macname, char *macvalue, Dwarf_Error * error) -{ - size_t len; - size_t len2; - size_t length_est; - int res; - int compose_error_type; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - if (macname == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL); - return (DW_DLV_ERROR); - } - len = strlen(macname) + 1; - if (len == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY); - return (DW_DLV_ERROR); - } - if (macvalue) { - len2 = strlen(macvalue) + 1; - } else { - len2 = 0; - } - length_est = COMMAND_LEN + LINE_LEN + len + len2 + 1; /* 1 - for - space - character - we - add */ - res = libdwarf_compose_begin(dbg, DW_MACINFO_define, length_est, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_add_line(dbg, line, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - libdwarf_compose_add_string(dbg, macname, len); - libdwarf_compose_add_string(dbg, " ", 1); - if (macvalue) { - libdwarf_compose_add_string(dbg, " ", 1); - libdwarf_compose_add_string(dbg, macvalue, len2); - } - res = libdwarf_compose_complete(dbg, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; -} - -int -dwarf_undef_macro(Dwarf_P_Debug dbg, - Dwarf_Unsigned line, - char *macname, Dwarf_Error * error) -{ - - size_t len; - size_t length_est; - int res; - int compose_error_type; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - if (macname == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL); - return (DW_DLV_ERROR); - } - len = strlen(macname) + 1; - if (len == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY); - return (DW_DLV_ERROR); - } - length_est = COMMAND_LEN + LINE_LEN + len; - res = libdwarf_compose_begin(dbg, DW_MACINFO_undef, length_est, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_add_line(dbg, line, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - libdwarf_compose_add_string(dbg, macname, len); - res = libdwarf_compose_complete(dbg, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; -} - -int -dwarf_start_macro_file(Dwarf_P_Debug dbg, - Dwarf_Unsigned fileindex, - Dwarf_Unsigned linenumber, Dwarf_Error * error) -{ - size_t length_est; - int res; - int compose_error_type; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - length_est = COMMAND_LEN + LINE_LEN + LINE_LEN; - res = libdwarf_compose_begin(dbg, DW_MACINFO_start_file, length_est, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_add_line(dbg, fileindex, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_add_line(dbg, linenumber, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; -} - -int -dwarf_end_macro_file(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - size_t length_est; - int res; - int compose_error_type; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - length_est = COMMAND_LEN; - res = libdwarf_compose_begin(dbg, DW_MACINFO_end_file, length_est, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_complete(dbg, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; -} - -int -dwarf_vendor_ext(Dwarf_P_Debug dbg, - Dwarf_Unsigned constant, - char *string, Dwarf_Error * error) -{ - size_t len; - size_t length_est; - int res; - int compose_error_type; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (DW_DLV_ERROR); - } - if (string == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL); - return (DW_DLV_ERROR); - } - len = strlen(string) + 1; - if (len == 0) { - _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY); - return (DW_DLV_ERROR); - } - length_est = COMMAND_LEN + LINE_LEN + len; - res = libdwarf_compose_begin(dbg, DW_MACINFO_vendor_ext, length_est, - &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - res = libdwarf_compose_add_line(dbg, constant, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - libdwarf_compose_add_string(dbg, string, len); - libdwarf_compose_complete(dbg, &compose_error_type); - if (res != DW_DLV_OK) { - _dwarf_p_error(NULL, error, compose_error_type); - return (DW_DLV_ERROR); - } - return DW_DLV_OK; -} - - - -int -_dwarf_pro_transform_macro_info_to_disk(Dwarf_P_Debug dbg, - Dwarf_Error * error) -{ - /* Total num of bytes in .debug_macinfo section. */ - Dwarf_Unsigned mac_num_bytes; - - /* Points to first byte of .debug_macinfo buffer. */ - Dwarf_Small *macinfo; - - /* Fills in the .debug_macinfo buffer. */ - Dwarf_Small *macinfo_ptr; - - - /* Used to scan the section data buffers. */ - struct dw_macinfo_block_s *m_prev; - struct dw_macinfo_block_s *m_sect; - - - /* Get the size of the debug_macinfo data */ - mac_num_bytes = 0; - for (m_sect = dbg->de_first_macinfo; m_sect != NULL; - m_sect = m_sect->mb_next) { - mac_num_bytes += m_sect->mb_used_len; - } - /* Tthe final entry has a type code of 0 to indicate It is final - for this CU Takes just 1 byte. */ - mac_num_bytes += 1; - - GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_MACINFO], - macinfo, (unsigned long) mac_num_bytes, error); - if (macinfo == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - - macinfo_ptr = macinfo; - m_prev = 0; - for (m_sect = dbg->de_first_macinfo; m_sect != NULL; - m_sect = m_sect->mb_next) { - memcpy(macinfo_ptr, m_sect->mb_data, m_sect->mb_used_len); - macinfo_ptr += m_sect->mb_used_len; - if (m_prev) { - _dwarf_p_dealloc(dbg, (Dwarf_Small *) m_prev); - m_prev = 0; - } - m_prev = m_sect; - } - *macinfo_ptr = 0; /* the type code of 0 as last entry */ - if (m_prev) { - _dwarf_p_dealloc(dbg, (Dwarf_Small *) m_prev); - m_prev = 0; - } - - dbg->de_first_macinfo = NULL; - dbg->de_current_macinfo = NULL; - - return (int) dbg->de_n_debug_sect; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_macinfo.h b/usr/src/tools/ctf/dwarf/common/pro_macinfo.h deleted file mode 100644 index 852a0cec1f..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_macinfo.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -int _dwarf_pro_transform_macro_info_to_disk(Dwarf_P_Debug dbg, - Dwarf_Error * error); diff --git a/usr/src/tools/ctf/dwarf/common/pro_opaque.h b/usr/src/tools/ctf/dwarf/common/pro_opaque.h deleted file mode 100644 index befc69faa6..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_opaque.h +++ /dev/null @@ -1,484 +0,0 @@ -/* - - Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -#include <stddef.h> - -/* - Sgidefs included to define __uint32_t, - a guaranteed 4-byte quantity. -*/ -#include "libdwarfdefs.h" - -#define true 1 -#define false 0 - -/* to identify a cie */ -#define DW_CIE_ID ~(0x0) -#define DW_CIE_VERSION 1 - -/*Dwarf_Word is unsigned word usable for index, count in memory */ -/*Dwarf_Sword is signed word usable for index, count in memory */ -/* The are 32 or 64 bits depending if 64 bit longs or not, which -** fits the ILP32 and LP64 models -** These work equally well with ILP64. -*/ - -typedef unsigned long Dwarf_Word; -typedef long Dwarf_Sword; - - -typedef signed char Dwarf_Sbyte; -typedef unsigned char Dwarf_Ubyte; -typedef signed short Dwarf_Shalf; - -/* - On any change that makes libdwarf producer - incompatible, increment this number. - 1->2->3 ... - -*/ -#define PRO_VERSION_MAGIC 0xdead1 - - -/* these 2 are fixed sizes which must not vary with the -** ILP32/LP64 model. These two stay at 32 bit. -*/ -typedef __uint32_t Dwarf_ufixed; -typedef __int32_t Dwarf_sfixed; - -/* - producer: - This struct is used to hold information about all - debug* sections. On creating a new section, section - names and indices are added to this struct - definition in pro_section.h -*/ -typedef struct Dwarf_P_Section_Data_s *Dwarf_P_Section_Data; - -/* - producer: - This struct is used to hold entries in the include directories - part of statement prologue. Definition in pro_line.h -*/ -typedef struct Dwarf_P_Inc_Dir_s *Dwarf_P_Inc_Dir; - -/* - producer: - This struct holds file entries for the statement prologue. - Defined in pro_line.h -*/ -typedef struct Dwarf_P_F_Entry_s *Dwarf_P_F_Entry; - -/* - producer: - This struct holds information for each cie. Defn in pro_frame.h -*/ -typedef struct Dwarf_P_Cie_s *Dwarf_P_Cie; - -/* - producer: - Struct to hold line number information, different from - Dwarf_Line opaque type. -*/ -typedef struct Dwarf_P_Line_s *Dwarf_P_Line; - -/* - producer: - Struct to hold information about address ranges. -*/ -typedef struct Dwarf_P_Simple_nameentry_s *Dwarf_P_Simple_nameentry; -typedef struct Dwarf_P_Simple_name_header_s *Dwarf_P_Simple_name_header; -typedef struct Dwarf_P_Arange_s *Dwarf_P_Arange; -typedef struct Dwarf_P_Per_Reloc_Sect_s *Dwarf_P_Per_Reloc_Sect; -typedef struct Dwarf_P_Per_Sect_String_Attrs_s *Dwarf_P_Per_Sect_String_Attrs; - -/* Defined to get at the elf section numbers and section name - indices in symtab for the dwarf sections - Must match .rel.* names in _dwarf_rel_section_names - exactly. -*/ -#define DEBUG_INFO 0 -#define DEBUG_LINE 1 -#define DEBUG_ABBREV 2 -#define DEBUG_FRAME 3 -#define DEBUG_ARANGES 4 -#define DEBUG_PUBNAMES 5 -#define DEBUG_STR 6 -#define DEBUG_FUNCNAMES 7 -#define DEBUG_TYPENAMES 8 -#define DEBUG_VARNAMES 9 -#define DEBUG_WEAKNAMES 10 -#define DEBUG_MACINFO 11 -#define DEBUG_LOC 12 - - /* number of debug_* sections not including the relocations */ -#define NUM_DEBUG_SECTIONS DEBUG_LOC + 1 - - -struct Dwarf_P_Die_s { - Dwarf_Unsigned di_offset; /* offset in debug info */ - char *di_abbrev; /* abbreviation */ - Dwarf_Word di_abbrev_nbytes; /* # of bytes in abbrev */ - Dwarf_Tag di_tag; - Dwarf_P_Die di_parent; /* parent of current die */ - Dwarf_P_Die di_child; /* first child */ - /* The last child field makes linking up children an O(1) operation, - See pro_die.c. */ - Dwarf_P_Die di_last_child; - Dwarf_P_Die di_left; /* left sibling */ - Dwarf_P_Die di_right; /* right sibling */ - Dwarf_P_Attribute di_attrs; /* list of attributes */ - Dwarf_P_Attribute di_last_attr; /* last attribute */ - int di_n_attr; /* number of attributes */ - Dwarf_P_Debug di_dbg; /* For memory management */ - Dwarf_Unsigned di_marker; /* used to attach symbols to dies */ -}; - - -/* producer fields */ -struct Dwarf_P_Attribute_s { - Dwarf_Half ar_attribute; /* Attribute Value. */ - Dwarf_Half ar_attribute_form; /* Attribute Form. */ - Dwarf_P_Die ar_ref_die; /* die pointer if form ref */ - char *ar_data; /* data, format given by form */ - Dwarf_Unsigned ar_nbytes; /* no. of bytes of data */ - Dwarf_Unsigned ar_rel_symidx; /* when attribute has a - relocatable value, holds - index of symbol in SYMTAB */ - Dwarf_Ubyte ar_rel_type; /* relocation type */ - Dwarf_Word ar_rel_offset; /* Offset of relocation within block */ - char ar_reloc_len; /* Number of bytes that relocation - applies to. 4 or 8. Unused and may - be 0 if if ar_rel_type is - R_MIPS_NONE */ - Dwarf_P_Attribute ar_next; -}; - -/* A block of .debug_macinfo data: this forms a series of blocks. -** Each macinfo input is compressed immediately and put into -** the current block if room, else a newblock allocated. -** The space allocation is such that the block and the macinfo -** data are one malloc block: free with a pointer to this and the -** mb_data is freed automatically. -** Like the struct hack, but legal ANSI C. -*/ -struct dw_macinfo_block_s { - struct dw_macinfo_block_s *mb_next; - unsigned long mb_avail_len; - unsigned long mb_used_len; - unsigned long mb_macinfo_data_space_len; - char *mb_data; /* original malloc ptr. */ -}; - -/* dwarf_sn_kind is for the array of similarly-treated - name -> cu ties -*/ -enum dwarf_sn_kind { dwarf_snk_pubname, dwarf_snk_funcname, - dwarf_snk_weakname, dwarf_snk_typename, - dwarf_snk_varname, - dwarf_snk_entrycount /* this one must be last */ -}; - - - -/* The calls to add a varname etc use a list of - these as the list. -*/ -struct Dwarf_P_Simple_nameentry_s { - Dwarf_P_Die sne_die; - char *sne_name; - int sne_name_len; - Dwarf_P_Simple_nameentry sne_next; -}; - -/* An array of these, each of which heads a list - of Dwarf_P_Simple_nameentry -*/ -struct Dwarf_P_Simple_name_header_s { - Dwarf_P_Simple_nameentry sn_head; - Dwarf_P_Simple_nameentry sn_tail; - Dwarf_Signed sn_count; - - /* length that will be generated, not counting fixed header or - trailer */ - Dwarf_Signed sn_net_len; -}; -typedef int (*_dwarf_pro_reloc_name_func_ptr) (Dwarf_P_Debug dbg, - int sec_index, - Dwarf_Unsigned offset,/* r_offset */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type type, - int reltarget_length); - -typedef int (*_dwarf_pro_reloc_length_func_ptr) (Dwarf_P_Debug dbg, - int sec_index, Dwarf_Unsigned offset,/* r_offset */ - Dwarf_Unsigned start_symidx, - Dwarf_Unsigned end_symidx, - enum Dwarf_Rel_Type type, - int reltarget_length); -typedef int (*_dwarf_pro_transform_relocs_func_ptr) (Dwarf_P_Debug dbg, - Dwarf_Signed * - new_sec_count); - -/* - Each slot in a block of slots could be: - a binary stream relocation entry (32 or 64bit relocation data) - a SYMBOLIC relocation entry. - During creation sometimes we create multiple chained blocks, - but sometimes we create a single long block. - Before returning reloc data to caller, - we switch to a single, long-enough, - block. - - We make counters here Dwarf_Unsigned so that we - get sufficient alignment. Since we use space after - the struct (at malloc time) for user data which - must have Dwarf_Unsigned alignment, this - struct must have that alignment too. -*/ -struct Dwarf_P_Relocation_Block_s { - Dwarf_Unsigned rb_slots_in_block; /* slots in block, as created */ - Dwarf_Unsigned rb_next_slot_to_use; /* counter, start at 0. */ - struct Dwarf_P_Relocation_Block_s *rb_next; - char *rb_where_to_add_next; /* pointer to next slot (might be past - end, depending on - rb_next_slot_to_use) */ - char *rb_data; /* data area */ -}; - -/* One of these per potential relocation section - So one per actual dwarf section. - Left zeroed when not used (some sections have - no relocations). -*/ -struct Dwarf_P_Per_Reloc_Sect_s { - unsigned long pr_reloc_total_count; /* total number of entries - across all blocks */ - - unsigned long pr_slots_per_block_to_alloc; /* at Block alloc, this - is the default number of slots to use */ - - int pr_sect_num_of_reloc_sect; /* sect number returned by - de_callback_func() or de_callback_func_b() call, this is the sect - number of the relocation section. */ - - /* singly-linked list. add at and ('last') with count of blocks */ - struct Dwarf_P_Relocation_Block_s *pr_first_block; - struct Dwarf_P_Relocation_Block_s *pr_last_block; - unsigned long pr_block_count; -}; - -#define DEFAULT_SLOTS_PER_BLOCK 3 - -typedef struct memory_list_s { - struct memory_list_s *prev; - struct memory_list_s *next; -} memory_list_t; - -struct Dwarf_P_Per_Sect_String_Attrs_s { - int sect_sa_section_number; - unsigned sect_sa_n_alloc; - unsigned sect_sa_n_used; - Dwarf_P_String_Attr sect_sa_list; -}; - -/* Fields used by producer */ -struct Dwarf_P_Debug_s { - /* used to catch dso passing dbg to another DSO with incompatible - version of libdwarf See PRO_VERSION_MAGIC */ - int de_version_magic_number; - - Dwarf_Handler de_errhand; - Dwarf_Ptr de_errarg; - - /* Call back function, used to create .debug* sections. Provided - by user. Only of these used per dbg. */ - Dwarf_Callback_Func de_callback_func; - Dwarf_Callback_Func_b de_callback_func_b; - - /* Flags from producer_init call */ - Dwarf_Unsigned de_flags; - - /* This holds information on debug section stream output, including - the stream data */ - Dwarf_P_Section_Data de_debug_sects; - - /* Pointer to the 'current active' section */ - Dwarf_P_Section_Data de_current_active_section; - - /* Number of debug data streams globs. */ - Dwarf_Word de_n_debug_sect; - - /* File entry information, null terminated singly-linked list */ - Dwarf_P_F_Entry de_file_entries; - Dwarf_P_F_Entry de_last_file_entry; - Dwarf_Unsigned de_n_file_entries; - - /* Has the directories used to search for source files */ - Dwarf_P_Inc_Dir de_inc_dirs; - Dwarf_P_Inc_Dir de_last_inc_dir; - Dwarf_Unsigned de_n_inc_dirs; - - /* Has all the line number info for the stmt program */ - Dwarf_P_Line de_lines; - Dwarf_P_Line de_last_line; - - /* List of cie's for the debug unit */ - Dwarf_P_Cie de_frame_cies; - Dwarf_P_Cie de_last_cie; - Dwarf_Unsigned de_n_cie; - - /* Singly-linked list of fde's for the debug unit */ - Dwarf_P_Fde de_frame_fdes; - Dwarf_P_Fde de_last_fde; - Dwarf_Unsigned de_n_fde; - - /* First die, leads to all others */ - Dwarf_P_Die de_dies; - - /* Pointer to list of strings */ - char *de_strings; - - /* Pointer to chain of aranges */ - Dwarf_P_Arange de_arange; - Dwarf_P_Arange de_last_arange; - Dwarf_Sword de_arange_count; - - /* macinfo controls. */ - /* first points to beginning of the list during creation */ - struct dw_macinfo_block_s *de_first_macinfo; - - /* current points to the current, unfilled, block */ - struct dw_macinfo_block_s *de_current_macinfo; - - /* Pointer to the first section, to support reset_section_bytes */ - Dwarf_P_Section_Data de_first_debug_sect; - - /* handles pubnames, weaknames, etc. See dwarf_sn_kind in - pro_opaque.h */ - struct Dwarf_P_Simple_name_header_s - de_simple_name_headers[dwarf_snk_entrycount]; - - /* relocation data. not all sections will actally have relocation - info, of course */ - struct Dwarf_P_Per_Reloc_Sect_s de_reloc_sect[NUM_DEBUG_SECTIONS]; - int de_reloc_next_to_return; /* iterator on reloc sections - (SYMBOLIC output) */ - - /* used in remembering sections */ - int de_elf_sects[NUM_DEBUG_SECTIONS]; /* elf sect number of - the section itself, DEBUG_LINE for example */ - - Dwarf_Unsigned de_sect_name_idx[NUM_DEBUG_SECTIONS]; /* section - name index or handle for the name of the symbol for - DEBUG_LINE for example */ - - int de_offset_reloc; /* offset reloc type, R_MIPS_32 for - example. Specific to the ABI being - produced. Relocates offset size - field */ - int de_exc_reloc; /* reloc type specific to exception - table relocs. */ - int de_ptr_reloc; /* standard reloc type, R_MIPS_32 for - example. Specific to the ABI being - produced. relocates pointer size - field */ - - unsigned char de_offset_size; /* section offset. Here to - avoid test of abi in macro - at run time MIPS -n32 4, - -64 8. */ - - unsigned char de_pointer_size; /* size of pointer in target. - Here to avoid test of abi in - macro at run time MIPS -n32 - 4, -64 is 8. */ - - unsigned char de_is_64bit; /* non-zero if is 64bit. Else 32 bit: - used for passing this info as a flag - */ - unsigned char de_relocation_record_size; /* reloc record size - varies by ABI and - relocation-output - method (stream or - symbolic) */ - - unsigned char de_64bit_extension; /* non-zero if creating 64 bit - offsets using dwarf2-99 - extension proposal */ - - int de_ar_data_attribute_form; /* data8, data4 abi dependent */ - int de_ar_ref_attr_form; /* ref8 ref4 , abi dependent */ - - /* simple name relocations */ - _dwarf_pro_reloc_name_func_ptr de_reloc_name; - - /* relocations for a length, requiring a pair of symbols */ - _dwarf_pro_reloc_length_func_ptr de_reloc_pair; - - _dwarf_pro_transform_relocs_func_ptr de_transform_relocs_to_disk; - - /* following used for macro buffers */ - unsigned long de_compose_avail; - unsigned long de_compose_used_len; - - unsigned char de_same_endian; - void *(*de_copy_word) (void *, const void *, size_t); - - /* Add new fields at the END of this struct to preserve some hope - of sensible behavior on dbg passing between DSOs linked with - mismatched libdwarf producer versions. */ - - Dwarf_P_Marker de_markers; /* pointer to array of markers */ - unsigned de_marker_n_alloc; - unsigned de_marker_n_used; - int de_sect_sa_next_to_return; /* Iterator on sring attrib sects */ - /* String attributes data of each section. */ - struct Dwarf_P_Per_Sect_String_Attrs_s de_sect_string_attr[NUM_DEBUG_SECTIONS]; -}; - -#define CURRENT_VERSION_STAMP 2 - -Dwarf_Unsigned _dwarf_add_simple_name_entry(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *entry_name, - enum dwarf_sn_kind - entrykind, - Dwarf_Error * error); - - -#define DISTINGUISHED_VALUE 0xffffffff /* 64bit extension flag */ diff --git a/usr/src/tools/ctf/dwarf/common/pro_pubnames.c b/usr/src/tools/ctf/dwarf/common/pro_pubnames.c deleted file mode 100644 index e07fe35943..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_pubnames.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" - - -/* - This function adds another public name to the - list of public names for the given Dwarf_P_Debug. - It returns 0 on error, and 1 otherwise. -*/ - -Dwarf_Unsigned -dwarf_add_pubname(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *pubname_name, Dwarf_Error * error) -{ - return - _dwarf_add_simple_name_entry(dbg, die, pubname_name, - dwarf_snk_pubname, error); -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc.c b/usr/src/tools/ctf/dwarf/common/pro_reloc.c deleted file mode 100644 index 66f16acbd0..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2008-2010 David Anderson, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -/*#include <elfaccess.h> */ -#include "pro_incl.h" - - -/*Do initial alloc of newslots slots. - Fails only if malloc fails. - - Supposed to be called before any relocs allocated. - Ignored if after any allocated. - - Part of an optimization, so that for a known 'newslots' - relocations count we can preallocate the right size block. - Called from just 2 places. - - returns DW_DLV_OK or DW_DLV_ERROR -*/ -int -_dwarf_pro_pre_alloc_n_reloc_slots(Dwarf_P_Debug dbg, - int rel_sec_index, - Dwarf_Unsigned newslots) -{ - unsigned long len = 0; - struct Dwarf_P_Relocation_Block_s *data = 0; - Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[rel_sec_index]; - unsigned long slots_in_blk = (unsigned long) newslots; - unsigned long rel_rec_size = dbg->de_relocation_record_size; - - if (prel->pr_first_block) - return DW_DLV_OK; /* do nothing */ - - len = sizeof(struct Dwarf_P_Relocation_Block_s) + - slots_in_blk * rel_rec_size; - - - data = (struct Dwarf_P_Relocation_Block_s *) - _dwarf_p_get_alloc(dbg, len); - if (!data) { - return DW_DLV_ERROR; - } - data->rb_slots_in_block = slots_in_blk; /* could use default - here, as fallback in - case our origininal - estimate wrong. When - we call this we - presumably know what - we are doing, so - keep this count for - now */ - data->rb_next_slot_to_use = 0; - data->rb_where_to_add_next = - ((char *) data) + sizeof(struct Dwarf_P_Relocation_Block_s); - data->rb_data = data->rb_where_to_add_next; - - prel->pr_first_block = data; - prel->pr_last_block = data; - prel->pr_block_count = 1; - - - return DW_DLV_OK; -} - - -/*Do alloc of slots. - Fails only if malloc fails. - - Only allocator used. - - returns DW_DLV_OK or DW_DLV_ERROR -*/ -int -_dwarf_pro_alloc_reloc_slots(Dwarf_P_Debug dbg, int rel_sec_index) -{ - unsigned long len = 0; - struct Dwarf_P_Relocation_Block_s *data = 0; - Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[rel_sec_index]; - unsigned long slots_in_blk = prel->pr_slots_per_block_to_alloc; - unsigned long rel_rec_size = dbg->de_relocation_record_size; - - len = sizeof(struct Dwarf_P_Relocation_Block_s) + - slots_in_blk * rel_rec_size; - - data = (struct Dwarf_P_Relocation_Block_s *) - _dwarf_p_get_alloc(dbg, len); - if (!data) { - return DW_DLV_ERROR; - } - - if (prel->pr_first_block) { - prel->pr_last_block->rb_next = data; - prel->pr_last_block = data; - prel->pr_block_count += 1; - - } else { - - prel->pr_first_block = data; - prel->pr_last_block = data; - prel->pr_block_count = 1; - } - - data->rb_slots_in_block = slots_in_blk; - data->rb_next_slot_to_use = 0; - data->rb_where_to_add_next = - ((char *) data) + sizeof(struct Dwarf_P_Relocation_Block_s); - data->rb_data = data->rb_where_to_add_next; - - return DW_DLV_OK; - -} - -/* - Reserve a slot. return DW_DLV_OK if succeeds. - - Return DW_DLV_ERROR if fails (malloc error). - - Use the relrec_to_fill to pass back a pointer to - a slot space to use. -*/ -int -_dwarf_pro_reloc_get_a_slot(Dwarf_P_Debug dbg, - int base_sec_index, void **relrec_to_fill) -{ - struct Dwarf_P_Relocation_Block_s *data = 0; - Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[base_sec_index]; - unsigned long rel_rec_size = dbg->de_relocation_record_size; - - char *ret_addr = 0; - - data = prel->pr_last_block; - if ((data == 0) || - (data->rb_next_slot_to_use >= data->rb_slots_in_block)) { - int res; - - res = _dwarf_pro_alloc_reloc_slots(dbg, base_sec_index); - if (res != DW_DLV_OK) { - return res; - } - } - - data = prel->pr_last_block; - /* now we have an empty slot */ - ret_addr = data->rb_where_to_add_next; - - data->rb_where_to_add_next += rel_rec_size; - data->rb_next_slot_to_use += 1; - - prel->pr_reloc_total_count += 1; - - *relrec_to_fill = (void *) ret_addr; - - return DW_DLV_OK; - -} - -/* - On success returns count of - .rel.* sections that are symbolic - thru count_of_relocation_sections. - - On success, returns DW_DLV_OK. - - If this is not a 'symbolic' run, returns - DW_DLV_NO_ENTRY. - - No errors are possible. - - - - -*/ - - /*ARGSUSED*/ int -dwarf_get_relocation_info_count(Dwarf_P_Debug dbg, - Dwarf_Unsigned * - count_of_relocation_sections, - int *drd_buffer_version, - Dwarf_Error * error) -{ - if (dbg->de_flags & DW_DLC_SYMBOLIC_RELOCATIONS) { - int i; - unsigned int count = 0; - - for (i = 0; i < NUM_DEBUG_SECTIONS; ++i) { - if (dbg->de_reloc_sect[i].pr_reloc_total_count > 0) { - ++count; - } - } - *count_of_relocation_sections = (Dwarf_Unsigned) count; - *drd_buffer_version = DWARF_DRD_BUFFER_VERSION; - return DW_DLV_OK; - } - return DW_DLV_NO_ENTRY; -} - -int -dwarf_get_relocation_info(Dwarf_P_Debug dbg, - Dwarf_Signed * elf_section_index, - Dwarf_Signed * elf_section_index_link, - Dwarf_Unsigned * relocation_buffer_count, - Dwarf_Relocation_Data * reldata_buffer, - Dwarf_Error * error) -{ - int next = dbg->de_reloc_next_to_return; - - if (dbg->de_flags & DW_DLC_SYMBOLIC_RELOCATIONS) { - int i; - - for (i = next; i < NUM_DEBUG_SECTIONS; ++i) { - Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[i]; - - if (prel->pr_reloc_total_count > 0) { - dbg->de_reloc_next_to_return = i + 1; - - - /* ASSERT: prel->.pr_block_count == 1 */ - - *elf_section_index = prel->pr_sect_num_of_reloc_sect; - *elf_section_index_link = dbg->de_elf_sects[i]; - *relocation_buffer_count = prel->pr_reloc_total_count; - *reldata_buffer = (Dwarf_Relocation_Data) - (prel->pr_first_block->rb_data); - return DW_DLV_OK; - } - } - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, DW_DLV_ERROR); - } - return DW_DLV_NO_ENTRY; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc.h b/usr/src/tools/ctf/dwarf/common/pro_reloc.h deleted file mode 100644 index d2e6c67357..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -int _dwarf_pro_pre_alloc_n_reloc_slots(Dwarf_P_Debug dbg, - int rel_sec_index, - Dwarf_Unsigned newslots); - -int _dwarf_pro_alloc_reloc_slots(Dwarf_P_Debug dbg, int rel_sec_index); - -int _dwarf_pro_reloc_get_a_slot(Dwarf_P_Debug dbg, - int base_sec_index, - void **relrec_to_fill); diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.c b/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.c deleted file mode 100644 index 459779ceda..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - - Copyright (C) 2000,2001,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - Portions Copyright 2008-2010 David Anderson, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#else -/* Set r_info as defined by ELF generic ABI */ -#define Set_REL32_info(r,s,t) ((r).r_info = ELF32_R_INFO(s,t)) -#define Set_REL64_info(r,s,t) ((r).r_info = ELF64_R_INFO(s,t)) -#endif -#include "pro_incl.h" -#include "pro_section.h" -#include "pro_reloc.h" -#include "pro_reloc_stream.h" - -/* - Return DW_DLV_ERROR on malloc error or reltarget_length error. - Return DW_DLV_OK otherwise - - - -*/ - /*ARGSUSED*/ int -_dwarf_pro_reloc_name_stream64(Dwarf_P_Debug dbg, - int base_sec_index, - Dwarf_Unsigned offset, /* r_offset of reloc */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type type, - int reltarget_length) -{ -#if HAVE_ELF64_GETEHDR - REL64 *elf64_reloc = 0; - void *relrec_to_fill = 0; - int res = 0; - int rel_type = 0; - - res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index, - &relrec_to_fill); - if (res != DW_DLV_OK) - return res; - - - if (type == dwarf_drt_data_reloc) { - if (reltarget_length == dbg->de_offset_size) { - rel_type = dbg->de_offset_reloc; - } else if (reltarget_length == dbg->de_pointer_size) { - rel_type = dbg->de_ptr_reloc; - } else { - return DW_DLV_ERROR; - } - } else if (type == dwarf_drt_segment_rel) { - rel_type = dbg->de_exc_reloc; - } else { - /* We are in trouble: improper use of stream relocations. - Someone else will diagnose */ - rel_type = 0; - } - - elf64_reloc = (REL64 *)relrec_to_fill; - elf64_reloc->r_offset = offset; - Set_REL64_info(*elf64_reloc, symidx, rel_type); - return DW_DLV_OK; -#else /* !HAVE_ELF64_GETEHDR */ - return DW_DLV_ERROR; -#endif /* #if HAVE_ELF64_GETEHDR */ -} - -/* - Return DW_DLV_ERROR on malloc error or reltarget_length error. - Return DW_DLV_OK otherwise - a binary reloc: 32bit ABI -*/ -int -_dwarf_pro_reloc_name_stream32(Dwarf_P_Debug dbg, int base_sec_index, - Dwarf_Unsigned offset, /* r_offset of reloc */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type type, - int reltarget_length) -{ - REL32 *elf32_reloc = 0; - void *relrec_to_fill = 0; - int res = 0; - int rel_type = 0; - - res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index, - &relrec_to_fill); - if (res != DW_DLV_OK) - return res; - if (type == dwarf_drt_data_reloc) { - if (reltarget_length == dbg->de_offset_size) { - rel_type = dbg->de_offset_reloc; - } else if (reltarget_length == dbg->de_pointer_size) { - rel_type = dbg->de_ptr_reloc; - } else { - return DW_DLV_ERROR; - } - } else if (type == dwarf_drt_segment_rel) { - rel_type = dbg->de_exc_reloc; - } else { - /* We are in trouble: improper use of stream relocations. - Someone else will diagnose */ - rel_type = 0; - } - - elf32_reloc = (REL32*)relrec_to_fill; - elf32_reloc->r_offset = (Elf32_Addr) offset; - Set_REL32_info(*elf32_reloc, (Dwarf_Word) symidx, rel_type); - return DW_DLV_OK; - - /* get a slot, fill in the slot entry */ -} - - - -/* - Return DW_DLV_OK. - Never can really do anything: lengths cannot - be represented as end-start in a stream. - -*/ - /*ARGSUSED*/ int -_dwarf_pro_reloc_length_stream(Dwarf_P_Debug dbg, - int base_sec_index, - Dwarf_Unsigned offset, /* r_offset of reloc */ - Dwarf_Unsigned start_symidx, - Dwarf_Unsigned end_symidx, - enum Dwarf_Rel_Type type, - int reltarget_length) -{ - /* get a slot, fill in the slot entry */ - return DW_DLV_OK; -} - - -/* - Ensure each stream is a single buffer and - add that single buffer to the set of stream buffers. - - By creating a new buffer and copying if necessary. - - Free the input set of buffers if we consolidate. - Return -1 on error (malloc failure) - - - Return DW_DLV_OK on success. Any other return indicates - malloc failed. - -*/ -int -_dwarf_stream_relocs_to_disk(Dwarf_P_Debug dbg, - Dwarf_Signed * new_sec_count) -{ - unsigned long total_size = 0; - Dwarf_Small *data = 0; - int sec_index = 0; - unsigned long i = 0; - Dwarf_Error err = 0; - Dwarf_Error *error = &err; - - Dwarf_Signed sec_count = 0; - - Dwarf_P_Per_Reloc_Sect p_reloc = &dbg->de_reloc_sect[0]; - - for (i = 0; i < NUM_DEBUG_SECTIONS; ++i, ++p_reloc) { - unsigned long ct = p_reloc->pr_reloc_total_count; - unsigned len = 0; - struct Dwarf_P_Relocation_Block_s *p_blk = 0; - struct Dwarf_P_Relocation_Block_s *p_blk_last = 0; - Dwarf_P_Per_Reloc_Sect prb = 0; - - if (ct == 0) { - continue; - } - prb = &dbg->de_reloc_sect[i]; - len = dbg->de_relocation_record_size; - ++sec_count; - - total_size = ct * len; - sec_index = prb->pr_sect_num_of_reloc_sect; - if (sec_index == 0) { - /* Call de_callback_func or de_callback_func_b, getting - section number of reloc section. */ - int rel_section_index = 0; - Dwarf_Unsigned name_idx = 0; - int int_name = 0; - int err = 0; - - if (dbg->de_callback_func_b) { - rel_section_index = - dbg->de_callback_func_b(_dwarf_rel_section_names[i], - /* size */ - dbg->de_relocation_record_size, - /* type */ SHT_REL, - /* flags */ 0, - /* link to symtab, which we cannot - know */ 0, - /* info == link to sec rels apply to - */ - dbg->de_elf_sects[i], - &name_idx, &err); - } else { - rel_section_index = - dbg->de_callback_func(_dwarf_rel_section_names[i], - /* size */ - dbg->de_relocation_record_size, - /* type */ SHT_REL, - /* flags */ 0, - /* link to symtab, which we cannot - know */ 0, - /* info == link to sec rels apply to */ - dbg->de_elf_sects[i], &int_name, &err); - name_idx = int_name; - } - if (rel_section_index == -1) { - { - _dwarf_p_error(dbg, error, DW_DLE_ELF_SECT_ERR); - return (DW_DLV_ERROR); - } - - } - prb->pr_sect_num_of_reloc_sect = rel_section_index; - sec_index = rel_section_index; - } - GET_CHUNK(dbg, sec_index, data, total_size, &err); - p_blk = p_reloc->pr_first_block; - - /* following loop executes at least once. Effects the - consolidation to a single block or, if already a single - block, simply copies to the output buffer. And frees the - input block. The new block is in the de_debug_sects list. */ - while (p_blk) { - - unsigned long len = - p_blk->rb_where_to_add_next - p_blk->rb_data; - - memcpy(data, p_blk->rb_data, len); - - - data += len; - - p_blk_last = p_blk; - p_blk = p_blk->rb_next; - - _dwarf_p_dealloc(dbg, (Dwarf_Small *) p_blk_last); - } - /* ASSERT: sum of len copied == total_size */ - - /* - We have copied the input, now drop the pointers to it. For - debugging, leave the other data untouched. */ - p_reloc->pr_first_block = 0; - p_reloc->pr_last_block = 0; - } - - *new_sec_count = sec_count; - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.h b/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.h deleted file mode 100644 index 892ea5baf3..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc_stream.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -int _dwarf_pro_reloc_name_stream64(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset - of - reloc - */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type, - int reltarget_length); -int _dwarf_pro_reloc_name_stream32(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset - of - reloc - */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type, - int reltarget_length); -int _dwarf_pro_reloc_length_stream(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset - of - reloc - */ - Dwarf_Unsigned start_symidx, - Dwarf_Unsigned end_symidx, - enum Dwarf_Rel_Type, - int reltarget_length); - -int _dwarf_stream_relocs_to_disk(Dwarf_P_Debug dbg, - Dwarf_Signed * new_sec_count); diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.c b/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.c deleted file mode 100644 index 22080a00cd..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -/*#include <elfaccess.h> */ -#include "pro_incl.h" -#include "pro_section.h" -#include "pro_reloc.h" -#include "pro_reloc_symbolic.h" - -/* - Return DW_DLV_ERROR on malloc error. - Return DW_DLV_OK otherwise -*/ - -int -_dwarf_pro_reloc_name_symbolic(Dwarf_P_Debug dbg, - int base_sec_index, - Dwarf_Unsigned offset, /* r_offset of reloc */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type type, - int reltarget_length) -{ - /* get a slot, fill in the slot entry */ - void *relrec_to_fill = 0; - int res = 0; - struct Dwarf_Relocation_Data_s *slotp; - - res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index, - &relrec_to_fill); - if (res != DW_DLV_OK) - return res; - slotp = (struct Dwarf_Relocation_Data_s *) relrec_to_fill; - slotp->drd_type = type; - slotp->drd_length = reltarget_length; - slotp->drd_offset = offset; - slotp->drd_symbol_index = symidx; - return DW_DLV_OK; -} - - - -/* - Return DW_DLV_ERROR on malloc error. - Return DW_DLV_OK otherwise -*/ -int -_dwarf_pro_reloc_length_symbolic(Dwarf_P_Debug dbg, - int base_sec_index, - Dwarf_Unsigned offset, /* r_offset of reloc */ - Dwarf_Unsigned start_symidx, - Dwarf_Unsigned end_symidx, - enum Dwarf_Rel_Type type, - int reltarget_length) -{ - /* get a slot, fill in the slot entry */ - void *relrec_to_fill = 0; - int res = 0; - struct Dwarf_Relocation_Data_s *slotp1 = 0; - struct Dwarf_Relocation_Data_s *slotp2 = 0; - - res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index, - &relrec_to_fill); - if (res != DW_DLV_OK) - return res; - slotp1 = (struct Dwarf_Relocation_Data_s *) relrec_to_fill; - res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index, - &relrec_to_fill); - if (res != DW_DLV_OK) - return res; - slotp2 = (struct Dwarf_Relocation_Data_s *) relrec_to_fill; - - /* ASSERT: type == dwarf_drt_first_of_length_type_pair */ - slotp1->drd_type = type; - slotp1->drd_length = reltarget_length; - slotp1->drd_offset = offset; - slotp1->drd_symbol_index = start_symidx; - - slotp2->drd_type = dwarf_drt_second_of_length_pair; - slotp2->drd_length = reltarget_length; - slotp2->drd_offset = offset; - slotp2->drd_symbol_index = end_symidx; - return DW_DLV_OK; -} - -/* - Reset whatever fields of Dwarf_P_Per_Reloc_Sect_s - we must to allow adding a fresh new single - block easily (block consolidation use only). - -*/ -static void -_dwarf_reset_reloc_sect_info(struct Dwarf_P_Per_Reloc_Sect_s *pblk, - unsigned long ct) -{ - - - /* Do not zero pr_sect_num_of_reloc_sect */ - pblk->pr_reloc_total_count = 0; - pblk->pr_first_block = 0; - pblk->pr_last_block = 0; - pblk->pr_block_count = 0; - pblk->pr_slots_per_block_to_alloc = ct; -} - -/* - Ensure each stream is a single buffer and - add that single buffer to the set of stream buffers. - - By creating a new buffer and copying if necessary. - (If > 1 block, reduce to 1 block) - - Free the input set of buffers if we consolidate. - - We pass back *new_sec_count as zero because we - are not creating normal sections for a .o, but - symbolic relocations, separately counted. - - Return -1 on error (malloc failure) - - Return DW_DLV_OK on success. Any other return indicates - malloc failed. -*/ -int -_dwarf_symbolic_relocs_to_disk(Dwarf_P_Debug dbg, - Dwarf_Signed * new_sec_count) -{ - /* unsigned long total_size =0; */ - Dwarf_Small *data = 0; - int sec_index = 0; - int res = 0; - unsigned long i = 0; - Dwarf_Error error = 0; - Dwarf_Signed sec_count = 0; - Dwarf_P_Per_Reloc_Sect p_reloc = &dbg->de_reloc_sect[0]; - - for (i = 0; i < NUM_DEBUG_SECTIONS; ++i, ++p_reloc) { - unsigned long ct = p_reloc->pr_reloc_total_count; - struct Dwarf_P_Relocation_Block_s *p_blk; - struct Dwarf_P_Relocation_Block_s *p_blk_last; - int err; - if (ct == 0) { - continue; - } - - /* len = dbg->de_relocation_record_size; */ - ++sec_count; - - /* total_size = ct *len; */ - sec_index = p_reloc->pr_sect_num_of_reloc_sect; - if (sec_index == 0) { - /* Call de_callback_func or de_callback_func_b, - getting section number of reloc section. */ - int rel_section_index = 0; - int int_name = 0; - Dwarf_Unsigned name_idx = 0; - - /* - This is a bit of a fake, as we do not really have true - elf sections at all. Just the data such might contain. - But this lets the caller eventually link things - together: without this call we would not know what rel - data goes with what section when we are asked for the - real arrays. */ - - if (dbg->de_callback_func_b) { - rel_section_index = - dbg->de_callback_func_b(_dwarf_rel_section_names[i], - dbg->de_relocation_record_size, - /* type */ SHT_REL, - /* flags */ 0, - /* link to symtab, which we cannot - know */ SHN_UNDEF, - /* sec rels apply to */ - dbg->de_elf_sects[i], - &name_idx, &err); - } else { - rel_section_index = - dbg->de_callback_func(_dwarf_rel_section_names[i], - dbg->de_relocation_record_size, - /* type */ SHT_REL, - /* flags */ 0, - /* link to symtab, which we cannot - know */ SHN_UNDEF, - /* sec rels apply to, in elf, sh_info */ - dbg->de_elf_sects[i], &int_name, &err); - name_idx = int_name; - } - if (rel_section_index == -1) { - { - _dwarf_p_error(dbg, &error, DW_DLE_ELF_SECT_ERR); - return (DW_DLV_ERROR); - } - } - p_reloc->pr_sect_num_of_reloc_sect = rel_section_index; - sec_index = rel_section_index; - } - - p_blk = p_reloc->pr_first_block; - - if (p_reloc->pr_block_count > 1) { - struct Dwarf_P_Relocation_Block_s *new_blk; - - /* HACK , not normal interfaces, trashing p_reloc current - contents! */ - _dwarf_reset_reloc_sect_info(p_reloc, ct); - - /* Creating new single block for all 'ct' entries */ - res = _dwarf_pro_pre_alloc_n_reloc_slots(dbg, (int) i, ct); - if (res != DW_DLV_OK) { - return res; - } - new_blk = p_reloc->pr_first_block; - - data = (Dwarf_Small *) new_blk->rb_data; - - /* The following loop does the consolidation to a single - block and frees the input block(s). */ - do { - unsigned long len = - p_blk->rb_where_to_add_next - p_blk->rb_data; - memcpy(data, p_blk->rb_data, len); - data += len; - p_blk_last = p_blk; - p_blk = p_blk->rb_next; - _dwarf_p_dealloc(dbg, (Dwarf_Small *) p_blk_last); - } while (p_blk); - /* ASSERT: sum of len copied == total_size */ - new_blk->rb_next_slot_to_use = ct; - new_blk->rb_where_to_add_next = (char *) data; - p_reloc->pr_reloc_total_count = ct; - - /* have now created a single block, but no change in slots - used (pr_reloc_total_count) */ - } - } - *new_sec_count = 0; - return DW_DLV_OK; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.h b/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.h deleted file mode 100644 index 3d03a47863..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_reloc_symbolic.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -int _dwarf_pro_reloc_name_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset - of - reloc - */ - Dwarf_Unsigned symidx, - enum Dwarf_Rel_Type, - int reltarget_length); -int - _dwarf_pro_reloc_length_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset - of - reloc - */ - Dwarf_Unsigned start_symidx, - Dwarf_Unsigned end_symidx, - enum Dwarf_Rel_Type, - int reltarget_length); - -int _dwarf_symbolic_relocs_to_disk(Dwarf_P_Debug dbg, - Dwarf_Signed * new_sec_count); diff --git a/usr/src/tools/ctf/dwarf/common/pro_section.c b/usr/src/tools/ctf/dwarf/common/pro_section.c deleted file mode 100644 index 6503c2cf09..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_section.c +++ /dev/null @@ -1,2221 +0,0 @@ -/* - - Copyright (C) 2000,2004,2006 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ -/* - SGI has moved from the Crittenden Lane address. -*/ - - - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" -#include "pro_line.h" -#include "pro_frame.h" -#include "pro_die.h" -#include "pro_macinfo.h" -#include "pro_types.h" - -#ifndef SHF_MIPS_NOSTRIP -/* if this is not defined, we probably don't need it: just use 0 */ -#define SHF_MIPS_NOSTRIP 0 -#endif -#ifndef R_MIPS_NONE -#define R_MIPS_NONE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -/* must match up with pro_section.h defines of DEBUG_INFO etc -and sectnames (below). REL_SEC_PREFIX is either ".rel" or ".rela" -see pro_incl.h -*/ -char *_dwarf_rel_section_names[] = { - REL_SEC_PREFIX ".debug_info", - REL_SEC_PREFIX ".debug_line", - REL_SEC_PREFIX ".debug_abbrev", /* no relocations on this, really */ - REL_SEC_PREFIX ".debug_frame", - REL_SEC_PREFIX ".debug_aranges", - REL_SEC_PREFIX ".debug_pubnames", - REL_SEC_PREFIX ".debug_str", - REL_SEC_PREFIX ".debug_funcnames", /* sgi extension */ - REL_SEC_PREFIX ".debug_typenames", /* sgi extension */ - REL_SEC_PREFIX ".debug_varnames", /* sgi extension */ - REL_SEC_PREFIX ".debug_weaknames", /* sgi extension */ - REL_SEC_PREFIX ".debug_macinfo", - REL_SEC_PREFIX ".debug_loc" -}; - -/* names of sections. Ensure that it matches the defines - in pro_section.h, in the same order - Must match also _dwarf_rel_section_names above -*/ -char *_dwarf_sectnames[] = { - ".debug_info", - ".debug_line", - ".debug_abbrev", - ".debug_frame", - ".debug_aranges", - ".debug_pubnames", - ".debug_str", - ".debug_funcnames", /* sgi extension */ - ".debug_typenames", /* sgi extension */ - ".debug_varnames", /* sgi extension */ - ".debug_weaknames", /* sgi extension */ - ".debug_macinfo", - ".debug_loc" -}; - - - - -static Dwarf_Ubyte std_opcode_len[] = { 0, /* DW_LNS_copy */ - 1, /* DW_LNS_advance_pc */ - 1, /* DW_LNS_advance_line */ - 1, /* DW_LNS_set_file */ - 1, /* DW_LNS_set_column */ - 0, /* DW_LNS_negate_stmt */ - 0, /* DW_LNS_set_basic_block */ - 0, /* DW_LNS_const_add_pc */ - 1, /* DW_LNS_fixed_advance_pc */ -}; - -/* struct to hold relocation entries. Its mantained as a linked - list of relocation structs, and will then be written at as a - whole into the relocation section. Whether its 32 bit or - 64 bit will be obtained from Dwarf_Debug pointer. -*/ - -typedef struct Dwarf_P_Rel_s *Dwarf_P_Rel; -struct Dwarf_P_Rel_s { - Dwarf_P_Rel dr_next; - void *dr_rel_datap; -}; -typedef struct Dwarf_P_Rel_Head_s *Dwarf_P_Rel_Head; -struct Dwarf_P_Rel_Head_s { - struct Dwarf_P_Rel_s *drh_head; - struct Dwarf_P_Rel_s *drh_tail; -}; - -static int _dwarf_pro_generate_debugline(Dwarf_P_Debug dbg, - Dwarf_Error * error); -static int _dwarf_pro_generate_debugframe(Dwarf_P_Debug dbg, - Dwarf_Error * error); -static int _dwarf_pro_generate_debuginfo(Dwarf_P_Debug dbg, - Dwarf_Error * error); -static Dwarf_P_Abbrev _dwarf_pro_getabbrev(Dwarf_P_Die, Dwarf_P_Abbrev); -static int _dwarf_pro_match_attr - (Dwarf_P_Attribute, Dwarf_P_Abbrev, int no_attr); - -/* these macros used as return value for below functions */ -#define OPC_INCS_ZERO -1 -#define OPC_OUT_OF_RANGE -2 -#define LINE_OUT_OF_RANGE -3 -static int _dwarf_pro_get_opc(Dwarf_Unsigned addr_adv, int line_adv); - - -/* BEGIN_LEN_SIZE is the size of the 'length' field in total. - Which may be 4,8, or 12 bytes! - 4 is standard DWARF2. - 8 is non-standard MIPS-IRIX 64-bit. - 12 is standard DWARF3 for 64 bit offsets. - Used in various routines: local variable names - must match the names here. -*/ -#define BEGIN_LEN_SIZE (uwordb_size + extension_size) - -/* - Return TRUE if we need the section, FALSE otherwise - - If any of the 'line-data-related' calls were made - including file or directory entries, - produce .debug_line . - -*/ -static int -dwarf_need_debug_line_section(Dwarf_P_Debug dbg) -{ - if (dbg->de_lines == NULL && dbg->de_file_entries == NULL - && dbg->de_inc_dirs == NULL) { - return FALSE; - } - return TRUE; -} - -/* - Convert debug information to a format such that - it can be written on disk. - Called exactly once per execution. -*/ -Dwarf_Signed -dwarf_transform_to_disk_form(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - /* - Section data in written out in a number of buffers. Each - _generate_*() function returns a cumulative count of buffers for - all the sections. get_section_bytes() returns pointers to these - buffers one at a time. */ - int nbufs = 0; - int sect = 0; - int err = 0; - Dwarf_Unsigned du = 0; - - if (dbg->de_version_magic_number != PRO_VERSION_MAGIC) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, DW_DLV_NOCOUNT); - } - - /* Create dwarf section headers */ - for (sect = 0; sect < NUM_DEBUG_SECTIONS; sect++) { - long flags = 0; - - switch (sect) { - - case DEBUG_INFO: - if (dbg->de_dies == NULL) - continue; - break; - - case DEBUG_LINE: - if (dwarf_need_debug_line_section(dbg) == FALSE) { - continue; - } - break; - - case DEBUG_ABBREV: - if (dbg->de_dies == NULL) - continue; - break; - - case DEBUG_FRAME: - if (dbg->de_frame_cies == NULL) - continue; - flags = SHF_MIPS_NOSTRIP; - break; - - case DEBUG_ARANGES: - if (dbg->de_arange == NULL) - continue; - break; - - case DEBUG_PUBNAMES: - if (dbg->de_simple_name_headers[dwarf_snk_pubname]. - sn_head == NULL) - continue; - break; - - case DEBUG_STR: - if (dbg->de_strings == NULL) - continue; - break; - - case DEBUG_FUNCNAMES: - if (dbg->de_simple_name_headers[dwarf_snk_funcname]. - sn_head == NULL) - continue; - break; - - case DEBUG_TYPENAMES: - if (dbg->de_simple_name_headers[dwarf_snk_typename]. - sn_head == NULL) - continue; - break; - - case DEBUG_VARNAMES: - if (dbg->de_simple_name_headers[dwarf_snk_varname]. - sn_head == NULL) - continue; - break; - - case DEBUG_WEAKNAMES: - if (dbg->de_simple_name_headers[dwarf_snk_weakname]. - sn_head == NULL) - continue; - break; - - case DEBUG_MACINFO: - if (dbg->de_first_macinfo == NULL) - continue; - break; - case DEBUG_LOC: - /* not handled yet */ - continue; - default: - /* logic error: missing a case */ - DWARF_P_DBG_ERROR(dbg, DW_DLE_ELF_SECT_ERR, DW_DLV_NOCOUNT); - } - { - int new_base_elf_sect; - - if (dbg->de_callback_func_b) { - new_base_elf_sect = - dbg->de_callback_func_b(_dwarf_sectnames[sect], - /* rec size */ 1, - SECTION_TYPE, - flags, SHN_UNDEF, 0, &du, &err); - - } else { - int name_idx = 0; - new_base_elf_sect = dbg->de_callback_func( - _dwarf_sectnames[sect], - dbg->de_relocation_record_size, - SECTION_TYPE, flags, - SHN_UNDEF, 0, - &name_idx, &err); - du = name_idx; - } - if (new_base_elf_sect == -1) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ELF_SECT_ERR, - DW_DLV_NOCOUNT); - } - dbg->de_elf_sects[sect] = new_base_elf_sect; - - dbg->de_sect_name_idx[sect] = du; - } - } - - nbufs = 0; - - /* - Changing the order in which the sections are generated may cause - problems because of relocations. */ - - if (dwarf_need_debug_line_section(dbg) == TRUE) { - nbufs = _dwarf_pro_generate_debugline(dbg, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGLINE_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_frame_cies) { - nbufs = _dwarf_pro_generate_debugframe(dbg, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGFRAME_ERROR, - DW_DLV_NOCOUNT); - } - } - if (dbg->de_first_macinfo) { - nbufs = _dwarf_pro_transform_macro_info_to_disk(dbg, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGMACINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_dies) { - nbufs = _dwarf_pro_generate_debuginfo(dbg, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_arange) { - nbufs = _dwarf_transform_arange_to_disk(dbg, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_simple_name_headers[dwarf_snk_pubname].sn_head) { - nbufs = _dwarf_transform_simplename_to_disk(dbg, - dwarf_snk_pubname, - DEBUG_PUBNAMES, - error); - - - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_simple_name_headers[dwarf_snk_funcname].sn_head) { - nbufs = _dwarf_transform_simplename_to_disk(dbg, - dwarf_snk_funcname, - DEBUG_FUNCNAMES, - error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_simple_name_headers[dwarf_snk_typename].sn_head) { - nbufs = _dwarf_transform_simplename_to_disk(dbg, - dwarf_snk_typename, - DEBUG_TYPENAMES, - error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_simple_name_headers[dwarf_snk_varname].sn_head) { - nbufs = _dwarf_transform_simplename_to_disk(dbg, - dwarf_snk_varname, - DEBUG_VARNAMES, - error); - - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - if (dbg->de_simple_name_headers[dwarf_snk_weakname].sn_head) { - nbufs = _dwarf_transform_simplename_to_disk(dbg, - dwarf_snk_weakname, DEBUG_WEAKNAMES, error); - if (nbufs < 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - } - - { - Dwarf_Signed new_secs = 0; - int res = 0; - - res = dbg->de_transform_relocs_to_disk(dbg, &new_secs); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_DEBUGINFO_ERROR, - DW_DLV_NOCOUNT); - } - nbufs += new_secs; - } - return nbufs; -} - - -/*--------------------------------------------------------------- - Generate debug_line section ----------------------------------------------------------------*/ -static int -_dwarf_pro_generate_debugline(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - Dwarf_P_Inc_Dir curdir = 0; - Dwarf_P_F_Entry curentry = 0; - Dwarf_P_Line curline = 0; - Dwarf_P_Line prevline = 0; - - /* all data named cur* are used to loop thru linked lists */ - - int sum_bytes = 0; - int prolog_size = 0; - unsigned char *data = 0; /* holds disk form data */ - int elfsectno = 0; - unsigned char *start_line_sec = 0; /* pointer to the buffer at - section start */ - /* temps for memcpy */ - Dwarf_Unsigned du = 0; - Dwarf_Ubyte db = 0; - Dwarf_Half dh = 0; - int res = 0; - int uwordb_size = dbg->de_offset_size; - int extension_size = dbg->de_64bit_extension ? 4 : 0; - int upointer_size = dbg->de_pointer_size; - char buff1[ENCODE_SPACE_NEEDED]; - - - - sum_bytes = 0; - - elfsectno = dbg->de_elf_sects[DEBUG_LINE]; - - /* include directories */ - curdir = dbg->de_inc_dirs; - while (curdir) { - prolog_size += strlen(curdir->did_name) + 1; - curdir = curdir->did_next; - } - prolog_size++; /* last null following last directory - entry. */ - - /* file entries */ - curentry = dbg->de_file_entries; - while (curentry) { - prolog_size += - strlen(curentry->dfe_name) + 1 + curentry->dfe_nbytes; - curentry = curentry->dfe_next; - } - prolog_size++; /* last null byte */ - - - prolog_size += BEGIN_LEN_SIZE + sizeof_uhalf(dbg) + /* version # */ - uwordb_size + /* header length */ - sizeof_ubyte(dbg) + /* min_instr length */ - sizeof_ubyte(dbg) + /* default is_stmt */ - sizeof_ubyte(dbg) + /* linebase */ - sizeof_ubyte(dbg) + /* linerange */ - sizeof_ubyte(dbg); /* opcode base */ - - /* length of table specifying # of opnds */ - prolog_size += sizeof(std_opcode_len); - - GET_CHUNK(dbg, elfsectno, data, prolog_size, error); - start_line_sec = data; - - /* copy over the data */ - /* total_length */ - du = 0; - if (extension_size) { - Dwarf_Word x = DISTINGUISHED_VALUE; - - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &x, - sizeof(x), extension_size); - data += extension_size; - } - - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du, - sizeof(du), uwordb_size); - data += uwordb_size; - - dh = VERSION; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &dh, - sizeof(dh), sizeof(Dwarf_Half)); - data += sizeof(Dwarf_Half); - - /* header length */ - du = prolog_size - (BEGIN_LEN_SIZE + sizeof(Dwarf_Half) + - uwordb_size); - { - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du, - sizeof(du), uwordb_size); - data += uwordb_size; - } - db = MIN_INST_LENGTH; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - db = DEFAULT_IS_STMT; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - db = (Dwarf_Ubyte) LINE_BASE; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - db = LINE_RANGE; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - db = OPCODE_BASE; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) std_opcode_len, - sizeof(std_opcode_len), sizeof(std_opcode_len)); - data += sizeof(std_opcode_len); - - /* copy over include directories */ - curdir = dbg->de_inc_dirs; - while (curdir) { - strcpy((char *) data, curdir->did_name); - data += strlen(curdir->did_name) + 1; - curdir = curdir->did_next; - } - *data = '\0'; /* last null */ - data++; - - /* copy file entries */ - curentry = dbg->de_file_entries; - while (curentry) { - strcpy((char *) data, curentry->dfe_name); - data += strlen(curentry->dfe_name) + 1; - /* copies of leb numbers, no endian issues */ - memcpy((void *) data, - (const void *) curentry->dfe_args, curentry->dfe_nbytes); - data += curentry->dfe_nbytes; - curentry = curentry->dfe_next; - } - *data = '\0'; - data++; - - sum_bytes += prolog_size; - - curline = dbg->de_lines; - prevline = (Dwarf_P_Line) - _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s)); - if (prevline == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, -1); - } - _dwarf_pro_reg_init(prevline); - /* generate opcodes for line numbers */ - while (curline) { - int nbytes; - char *arg; - int opc; - int no_lns_copy; /* if lns copy opcode doesnt need to be - generated, if special opcode or end - sequence */ - Dwarf_Unsigned addr_adv; - int line_adv; /* supposed to be a reasonably small - number, so the size should not be a - problem. ? */ - - no_lns_copy = 0; - if (curline->dpl_opc != 0) { - int inst_bytes; /* no of bytes in extended opcode */ - char *str; /* hold leb encoded inst_bytes */ - int str_nbytes; /* no of bytes in str */ - - switch (curline->dpl_opc) { - case DW_LNE_end_sequence: - - /* Advance pc to end of text section. */ - addr_adv = curline->dpl_address - prevline->dpl_address; - if (addr_adv > 0) { - db = DW_LNS_advance_pc; - res = - _dwarf_pro_encode_leb128_nm(addr_adv / - MIN_INST_LENGTH, - &nbytes, buff1, - sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - GET_CHUNK(dbg, elfsectno, data, - nbytes + sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &db, sizeof(db), - sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - /* leb, no endianness issue */ - memcpy((void *) data, (const void *) buff1, nbytes); - data += nbytes + sizeof(Dwarf_Ubyte); - sum_bytes += nbytes + sizeof(Dwarf_Ubyte); - prevline->dpl_address = curline->dpl_address; - } - - /* first null byte */ - db = 0; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - - /* write length of extended opcode */ - inst_bytes = sizeof(Dwarf_Ubyte); - res = - _dwarf_pro_encode_leb128_nm(inst_bytes, &str_nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - GET_CHUNK(dbg, elfsectno, data, str_nbytes, error); - memcpy((void *) data, (const void *) buff1, str_nbytes); - data += str_nbytes; - sum_bytes += str_nbytes; - - /* write extended opcode */ - db = DW_LNE_end_sequence; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - /* reset value to original values */ - _dwarf_pro_reg_init(prevline); - no_lns_copy = 1; - /* this is set only for end_sequence, so that a - dw_lns_copy is not generated */ - break; - - case DW_LNE_set_address: - - /* first null byte */ - db = 0; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - - /* write length of extended opcode */ - inst_bytes = sizeof(Dwarf_Ubyte) + upointer_size; - res = - _dwarf_pro_encode_leb128_nm(inst_bytes, &str_nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - GET_CHUNK(dbg, elfsectno, data, str_nbytes, error); - str = buff1; - /* leb number, no endian issue */ - memcpy((void *) data, (const void *) str, str_nbytes); - data += str_nbytes; - sum_bytes += str_nbytes; - - /* write extended opcode */ - db = DW_LNE_set_address; - GET_CHUNK(dbg, elfsectno, data, upointer_size + - sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - - /* reloc for address */ - res = dbg->de_reloc_name(dbg, DEBUG_LINE, - sum_bytes, /* r_offset */ - curline->dpl_r_symidx, - dwarf_drt_data_reloc, - uwordb_size); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - - /* write offset (address) */ - du = curline->dpl_address; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du, - sizeof(du), upointer_size); - data += upointer_size; - sum_bytes += upointer_size; - prevline->dpl_address = curline->dpl_address; - no_lns_copy = 1; - break; - } - } else { - if (curline->dpl_file != prevline->dpl_file) { - db = DW_LNS_set_file; - res = - _dwarf_pro_encode_leb128_nm(curline->dpl_file, - &nbytes, buff1, - sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - arg = buff1; - GET_CHUNK(dbg, elfsectno, data, - nbytes + sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - memcpy((void *) data, (const void *) arg, nbytes); - data += nbytes; - sum_bytes += nbytes + sizeof(Dwarf_Ubyte); - prevline->dpl_file = curline->dpl_file; - } - if (curline->dpl_column != prevline->dpl_column) { - db = DW_LNS_set_column; - res = _dwarf_pro_encode_leb128_nm(curline->dpl_column, - &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - - arg = buff1; - GET_CHUNK(dbg, elfsectno, data, - nbytes + sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - memcpy((void *) data, (const void *) arg, nbytes); - data += nbytes; - sum_bytes += nbytes + sizeof(Dwarf_Ubyte); - prevline->dpl_column = curline->dpl_column; - } - if (curline->dpl_is_stmt != prevline->dpl_is_stmt) { - db = DW_LNS_negate_stmt; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - prevline->dpl_is_stmt = curline->dpl_is_stmt; - } - if (curline->dpl_basic_block == true && - prevline->dpl_basic_block == false) { - db = DW_LNS_set_basic_block; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - prevline->dpl_basic_block = curline->dpl_basic_block; - } - addr_adv = curline->dpl_address - prevline->dpl_address; - - line_adv = (int) (curline->dpl_line - prevline->dpl_line); - if ((addr_adv % MIN_INST_LENGTH) != 0) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_WRONG_ADDRESS, -1); - } - if ((opc = _dwarf_pro_get_opc(addr_adv, line_adv)) > 0) { - no_lns_copy = 1; - db = opc; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), - error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - prevline->dpl_basic_block = false; - prevline->dpl_address = curline->dpl_address; - prevline->dpl_line = curline->dpl_line; - } else { - if (addr_adv > 0) { - db = DW_LNS_advance_pc; - res = - _dwarf_pro_encode_leb128_nm(addr_adv / - MIN_INST_LENGTH, - &nbytes, buff1, - sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - - arg = buff1; - GET_CHUNK(dbg, elfsectno, data, - nbytes + sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - memcpy((void *) data, (const void *) arg, nbytes); - data += nbytes + sizeof(Dwarf_Ubyte); - sum_bytes += nbytes + sizeof(Dwarf_Ubyte); - prevline->dpl_basic_block = false; - prevline->dpl_address = curline->dpl_address; - } - if (line_adv != 0) { - db = DW_LNS_advance_line; - res = _dwarf_pro_encode_signed_leb128_nm(line_adv, - &nbytes, - buff1, - sizeof - (buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - - arg = buff1; - GET_CHUNK(dbg, elfsectno, data, - nbytes + sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &db, sizeof(db), - sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - memcpy((void *) data, (const void *) arg, nbytes); - data += nbytes + sizeof(Dwarf_Ubyte); - sum_bytes += nbytes + sizeof(Dwarf_Ubyte); - prevline->dpl_basic_block = false; - prevline->dpl_line = curline->dpl_line; - } - } - } /* ends else for opc != 0 */ - if (no_lns_copy == 0) { /* if not a special or dw_lne_end_seq - generate a matrix line */ - db = DW_LNS_copy; - GET_CHUNK(dbg, elfsectno, data, sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - sum_bytes += sizeof(Dwarf_Ubyte); - prevline->dpl_basic_block = false; - } - curline = curline->dpl_next; - } - - /* write total length field */ - du = sum_bytes - BEGIN_LEN_SIZE; - { - start_line_sec += extension_size; - WRITE_UNALIGNED(dbg, (void *) start_line_sec, - (const void *) &du, sizeof(du), uwordb_size); - } - - return (int) dbg->de_n_debug_sect; -} - -/*--------------------------------------------------------------- - Generate debug_frame section ----------------------------------------------------------------*/ -static int -_dwarf_pro_generate_debugframe(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - int elfsectno = 0; - int i = 0; - int firsttime = 1; - int pad = 0; /* Pad for padding to align cies and fdes */ - Dwarf_P_Cie curcie = 0; - Dwarf_P_Fde curfde = 0; - unsigned char *data = 0; - Dwarf_sfixed dsw = 0; - Dwarf_Unsigned du = 0; - Dwarf_Ubyte db = 0; - long *cie_offs = 0; /* Holds byte offsets for links to fde's */ - unsigned long cie_length = 0; - int cie_no = 0; - int uwordb_size = dbg->de_offset_size; - int extension_size = dbg->de_64bit_extension ? 4 : 0; - int upointer_size = dbg->de_pointer_size; - Dwarf_Unsigned cur_off = 0; /* current offset of written data, held - for relocation info */ - - elfsectno = dbg->de_elf_sects[DEBUG_FRAME]; - - curcie = dbg->de_frame_cies; - cie_length = 0; - cur_off = 0; - cie_offs = (long *) - _dwarf_p_get_alloc(dbg, sizeof(long) * dbg->de_n_cie); - if (cie_offs == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1); - } - /* Generate cie number as we go along. This writes - all CIEs first before any FDEs, which is rather - different from the order a compiler might like (which - might be each CIE followed by its FDEs then the next CIE, and - so on). */ - cie_no = 1; - while (curcie) { - char *code_al = 0; - int c_bytes = 0; - char *data_al = 0; - int d_bytes = 0; - int res = 0; - char buff1[ENCODE_SPACE_NEEDED]; - char buff2[ENCODE_SPACE_NEEDED]; - char buff3[ENCODE_SPACE_NEEDED]; - char *augmentation = 0; - char *augmented_al = 0; - long augmented_fields_length = 0; - int a_bytes = 0; - - res = _dwarf_pro_encode_leb128_nm(curcie->cie_code_align, - &c_bytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1); - } - /* Before April 1999, the following was using an unsigned - encode. That worked ok even though the decoder used the - correct signed leb read, but doing the encode correctly - (according to the dwarf spec) saves space in the output file - and is completely compatible. - - Note the actual stored amount on MIPS was 10 bytes (!) to - store the value -4. (hex)fc ffffffff ffffffff 01 The - libdwarf consumer consumed all 10 bytes too! - - old version res = - _dwarf_pro_encode_leb128_nm(curcie->cie_data_align, - - below is corrected signed version. */ - res = _dwarf_pro_encode_signed_leb128_nm(curcie->cie_data_align, - &d_bytes, - buff2, sizeof(buff2)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1); - } - code_al = buff1; - data_al = buff2; - - /* get the correct offset */ - if (firsttime) { - cie_offs[cie_no - 1] = 0; - firsttime = 0; - } else { - cie_offs[cie_no - 1] = cie_offs[cie_no - 2] + - (long) cie_length + BEGIN_LEN_SIZE; - } - cie_no++; - augmentation = curcie->cie_aug; - if (strcmp(augmentation, DW_CIE_AUGMENTER_STRING_V0) == 0) { - augmented_fields_length = 0; - res = _dwarf_pro_encode_leb128_nm(augmented_fields_length, - &a_bytes, buff3, - sizeof(buff3)); - augmented_al = buff3; - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1); - } - cie_length = uwordb_size + /* cie_id */ - sizeof(Dwarf_Ubyte) + /* cie version */ - strlen(curcie->cie_aug) + 1 + /* augmentation */ - c_bytes + /* code alignment factor */ - d_bytes + /* data alignment factor */ - sizeof(Dwarf_Ubyte) + /* return reg address */ - a_bytes + /* augmentation length */ - curcie->cie_inst_bytes; - } else { - cie_length = uwordb_size + /* cie_id */ - sizeof(Dwarf_Ubyte) + /* cie version */ - strlen(curcie->cie_aug) + 1 + /* augmentation */ - c_bytes + d_bytes + sizeof(Dwarf_Ubyte) + /* return - reg - address - */ - curcie->cie_inst_bytes; - } - pad = (int) PADDING(cie_length, upointer_size); - cie_length += pad; - GET_CHUNK(dbg, elfsectno, data, cie_length + - BEGIN_LEN_SIZE, error); - if (extension_size) { - Dwarf_Unsigned x = DISTINGUISHED_VALUE; - - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &x, - sizeof(x), extension_size); - data += extension_size; - - } - du = cie_length; - /* total length of cie */ - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, sizeof(du), uwordb_size); - data += uwordb_size; - - /* cie-id is a special value. */ - du = DW_CIE_ID; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &du, - sizeof(du), uwordb_size); - data += uwordb_size; - - db = curcie->cie_version; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - strcpy((char *) data, curcie->cie_aug); - data += strlen(curcie->cie_aug) + 1; - memcpy((void *) data, (const void *) code_al, c_bytes); - data += c_bytes; - memcpy((void *) data, (const void *) data_al, d_bytes); - data += d_bytes; - db = curcie->cie_ret_reg; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); - - if (strcmp(augmentation, DW_CIE_AUGMENTER_STRING_V0) == 0) { - memcpy((void *) data, (const void *) augmented_al, a_bytes); - data += a_bytes; - } - memcpy((void *) data, (const void *) curcie->cie_inst, - curcie->cie_inst_bytes); - data += curcie->cie_inst_bytes; - for (i = 0; i < pad; i++) { - *data = DW_CFA_nop; - data++; - } - curcie = curcie->cie_next; - } - /* calculate current offset */ - cur_off = cie_offs[cie_no - 2] + cie_length + BEGIN_LEN_SIZE; - - /* write out fde's */ - curfde = dbg->de_frame_fdes; - while (curfde) { - Dwarf_P_Frame_Pgm curinst = 0; - long fde_length = 0; - int pad = 0; - Dwarf_P_Cie cie_ptr = 0; - Dwarf_Word cie_index = 0; - Dwarf_Word index = 0; - int oet_length = 0; - int afl_length = 0; - int res = 0; - int v0_augmentation = 0; -#if 0 - unsigned char *fde_start_point = 0; -#endif - char afl_buff[ENCODE_SPACE_NEEDED]; - - /* Find the CIE associated with this fde. */ - cie_ptr = dbg->de_frame_cies; - cie_index = curfde->fde_cie; - index = 1; /* The cie_index of the first cie is 1, - not 0. */ - while (cie_ptr && index < cie_index) { - cie_ptr = cie_ptr->cie_next; - index++; - } - if (cie_ptr == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_NULL, -1); - } - - if (strcmp(cie_ptr->cie_aug, DW_CIE_AUGMENTER_STRING_V0) == 0) { - v0_augmentation = 1; - oet_length = sizeof(Dwarf_sfixed); - /* encode the length of augmented fields. */ - res = _dwarf_pro_encode_leb128_nm(oet_length, - &afl_length, afl_buff, - sizeof(afl_buff)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_OFFS_ALLOC, -1); - } - - fde_length = curfde->fde_n_bytes + BEGIN_LEN_SIZE + /* cie - pointer - */ - upointer_size + /* initial loc */ - upointer_size + /* address range */ - afl_length + /* augmented field length */ - oet_length; /* exception_table offset */ - } else { - fde_length = curfde->fde_n_bytes + BEGIN_LEN_SIZE + /* cie - pointer - */ - upointer_size + /* initial loc */ - upointer_size; /* address range */ - } - - - if (curfde->fde_die) { - /* IRIX/MIPS extension: - Using fde offset, generate DW_AT_MIPS_fde attribute for the - die corresponding to this fde. */ - if(_dwarf_pro_add_AT_fde(dbg, curfde->fde_die, cur_off, - error) < 0) { - return -1; - } - } - - /* store relocation for cie pointer */ - res = dbg->de_reloc_name(dbg, DEBUG_FRAME, cur_off + - BEGIN_LEN_SIZE /* r_offset */, - dbg->de_sect_name_idx[DEBUG_FRAME], - dwarf_drt_data_reloc, uwordb_size); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - - /* store relocation information for initial location */ - res = dbg->de_reloc_name(dbg, DEBUG_FRAME, - cur_off + BEGIN_LEN_SIZE + - upointer_size /* r_offset */, - curfde->fde_r_symidx, - dwarf_drt_data_reloc, upointer_size); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - /* Store the relocation information for the - offset_into_exception_info field, if the offset is valid (0 - is a valid offset). */ - if (v0_augmentation && - curfde->fde_offset_into_exception_tables >= 0) { - - res = dbg->de_reloc_name(dbg, DEBUG_FRAME, - /* r_offset, where in cie this - field starts */ - cur_off + BEGIN_LEN_SIZE + - uwordb_size + 2 * upointer_size + - afl_length, - curfde->fde_exception_table_symbol, - dwarf_drt_segment_rel, - sizeof(Dwarf_sfixed)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_CHUNK_ALLOC, -1); - } - } - - /* adjust for padding */ - pad = (int) PADDING(fde_length, upointer_size); - fde_length += pad; - - - /* write out fde */ - GET_CHUNK(dbg, elfsectno, data, fde_length + BEGIN_LEN_SIZE, - error); -#if 0 - fde_start_point = data; -#endif - du = fde_length; - { - if (extension_size) { - Dwarf_Word x = DISTINGUISHED_VALUE; - - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &x, - sizeof(x), extension_size); - data += extension_size; - } - /* length */ - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), uwordb_size); - data += uwordb_size; - - /* offset to cie */ - du = cie_offs[curfde->fde_cie - 1]; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), uwordb_size); - data += uwordb_size; - - du = curfde->fde_initloc; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), upointer_size); - data += upointer_size; - - if (dbg->de_reloc_pair && - curfde->fde_end_symbol != 0 && - curfde->fde_addr_range == 0) { - /* symbolic reloc, need reloc for length What if we - really know the length? If so, should use the other - part of 'if'. */ - Dwarf_Unsigned val; - - res = dbg->de_reloc_pair(dbg, - /* DEBUG_ARANGES, */ - DEBUG_FRAME, cur_off + 2 * uwordb_size + upointer_size, /* r_offset - */ - curfde->fde_r_symidx, - curfde->fde_end_symbol, - dwarf_drt_first_of_length_pair, - upointer_size); - if (res != DW_DLV_OK) { - { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } - - /* arrange pre-calc so assem text can do .word end - - begin + val (gets val from stream) */ - val = curfde->fde_end_symbol_offset - - curfde->fde_initloc; - WRITE_UNALIGNED(dbg, data, - (const void *) &val, - sizeof(val), upointer_size); - data += upointer_size; - } else { - - du = curfde->fde_addr_range; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), upointer_size); - data += upointer_size; - } - } - - if (v0_augmentation) { - /* write the encoded augmented field length. */ - memcpy((void *) data, (const void *) afl_buff, afl_length); - data += afl_length; - /* write the offset_into_exception_tables field. */ - dsw = - (Dwarf_sfixed) curfde->fde_offset_into_exception_tables; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &dsw, - sizeof(dsw), sizeof(Dwarf_sfixed)); - data += sizeof(Dwarf_sfixed); - } - - curinst = curfde->fde_inst; - if(curfde->fde_block) { - unsigned long size = curfde->fde_inst_block_size; - memcpy((void *) data, (const void *) curfde->fde_block, size); - data += size; - } else { - while (curinst) { - db = curinst->dfp_opcode; - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - data += sizeof(Dwarf_Ubyte); -#if 0 - if (curinst->dfp_sym_index) { - int res = dbg->de_reloc_name(dbg, - DEBUG_FRAME, - /* r_offset = */ - (data - fde_start_point) + cur_off + uwordb_size, - curinst->dfp_sym_index, - dwarf_drt_data_reloc, - upointer_size); - if (res != DW_DLV_OK) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } -#endif - memcpy((void *) data, - (const void *) curinst->dfp_args, - curinst->dfp_nbytes); - data += curinst->dfp_nbytes; - curinst = curinst->dfp_next; - } - } - /* padding */ - for (i = 0; i < pad; i++) { - *data = DW_CFA_nop; - data++; - } - cur_off += fde_length + uwordb_size; - curfde = curfde->fde_next; - } - - - return (int) dbg->de_n_debug_sect; -} - -/* - These functions remember all the markers we see along - with the right offset in the .debug_info section so that - we can dump them all back to the user with the section info. -*/ - -static int -marker_init(Dwarf_P_Debug dbg, - unsigned count) -{ - dbg->de_marker_n_alloc = count; - dbg->de_markers = NULL; - if (count > 0) { - dbg->de_markers = _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Marker_s) * - dbg->de_marker_n_alloc); - if (dbg->de_markers == NULL) { - dbg->de_marker_n_alloc = 0; - return -1; - } - } - return 0; -} - -static int -marker_add(Dwarf_P_Debug dbg, - Dwarf_Unsigned offset, - Dwarf_Unsigned marker) -{ - if (dbg->de_marker_n_alloc >= (dbg->de_marker_n_used + 1)) { - unsigned n = dbg->de_marker_n_used++; - dbg->de_markers[n].ma_offset = offset; - dbg->de_markers[n].ma_marker = marker; - return 0; - } - - return -1; -} - -Dwarf_Signed -dwarf_get_die_markers(Dwarf_P_Debug dbg, - Dwarf_P_Marker * marker_list, /* pointer to a pointer */ - Dwarf_Unsigned * marker_count, - Dwarf_Error * error) -{ - if (marker_list == NULL || marker_count == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, DW_DLV_BADADDR); - } - if (dbg->de_marker_n_used != dbg->de_marker_n_alloc) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_MAF, DW_DLV_BADADDR); - } - - *marker_list = dbg->de_markers; - *marker_count = dbg->de_marker_n_used; - return DW_DLV_OK; -} - -/* These functions provide the offsets of DW_FORM_string - attributes in the section section_index. These information - will enable a producer app that is generating assembly - text output to easily emit those attributes in ascii form - without having to decode the byte stream. - */ -static int -string_attr_init (Dwarf_P_Debug dbg, - Dwarf_Signed section_index, - unsigned count) -{ - Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[section_index]; - - sect_sa->sect_sa_n_alloc = count; - sect_sa->sect_sa_list = NULL; - if (count > 0) { - sect_sa->sect_sa_section_number = section_index; - sect_sa->sect_sa_list = _dwarf_p_get_alloc(dbg, - sizeof(struct Dwarf_P_String_Attr_s) - * sect_sa->sect_sa_n_alloc); - if (sect_sa->sect_sa_list == NULL) { - sect_sa->sect_sa_n_alloc = 0; - return -1; - } - } - return 0; -} - -static int -string_attr_add (Dwarf_P_Debug dbg, - Dwarf_Signed section_index, - Dwarf_Unsigned offset, - Dwarf_P_Attribute attr) -{ - Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[section_index]; - if (sect_sa->sect_sa_n_alloc >= (sect_sa->sect_sa_n_used + 1)) { - unsigned n = sect_sa->sect_sa_n_used++; - sect_sa->sect_sa_list[n].sa_offset = offset; - sect_sa->sect_sa_list[n].sa_nbytes = attr->ar_nbytes; - return 0; - } - - return -1; -} - -int -dwarf_get_string_attributes_count(Dwarf_P_Debug dbg, - Dwarf_Unsigned * - count_of_sa_sections, - int *drd_buffer_version, - Dwarf_Error *error) -{ - int i; - unsigned int count = 0; - - for (i = 0; i < NUM_DEBUG_SECTIONS; ++i) { - if (dbg->de_sect_string_attr[i].sect_sa_n_used > 0) { - ++count; - } - } - *count_of_sa_sections = (Dwarf_Unsigned) count; - *drd_buffer_version = DWARF_DRD_BUFFER_VERSION; - - return DW_DLV_OK; -} - -int -dwarf_get_string_attributes_info(Dwarf_P_Debug dbg, - Dwarf_Signed *elf_section_index, - Dwarf_Unsigned *sect_sa_buffer_count, - Dwarf_P_String_Attr *sect_sa_buffer, - Dwarf_Error *error) -{ - int i; - int next = dbg->de_sect_sa_next_to_return; - - for (i = next; i < NUM_DEBUG_SECTIONS; ++i) { - Dwarf_P_Per_Sect_String_Attrs sect_sa = &dbg->de_sect_string_attr[i]; - if (sect_sa->sect_sa_n_used > 0) { - dbg->de_sect_sa_next_to_return = i + 1; - *elf_section_index = sect_sa->sect_sa_section_number; - *sect_sa_buffer_count = sect_sa->sect_sa_n_used; - *sect_sa_buffer = sect_sa->sect_sa_list; - return DW_DLV_OK; - } - } - return DW_DLV_NO_ENTRY; -} - - - -/*--------------------------------------------------------------- - Generate debug_info and debug_abbrev sections ----------------------------------------------------------------*/ -static int -_dwarf_pro_generate_debuginfo(Dwarf_P_Debug dbg, Dwarf_Error * error) -{ - int elfsectno_of_debug_info = 0; - int abbrevsectno = 0; - unsigned char *data = 0; - int cu_header_size = 0; - Dwarf_P_Abbrev curabbrev = 0; - Dwarf_P_Abbrev abbrev_head = 0; - Dwarf_P_Abbrev abbrev_tail = 0; - Dwarf_P_Die curdie = 0; - Dwarf_P_Die first_child = 0; - Dwarf_Word dw = 0; - Dwarf_Unsigned du = 0; - Dwarf_Half dh = 0; - Dwarf_Ubyte db = 0; - Dwarf_Half version = 0; /* Need 2 byte quantity. */ - Dwarf_Unsigned die_off = 0; /* Offset of die in debug_info. */ - int n_abbrevs = 0; - int res = 0; - unsigned marker_count = 0; - unsigned string_attr_count = 0; - unsigned string_attr_offset = 0; - - Dwarf_Small *start_info_sec = 0; - - int uwordb_size = dbg->de_offset_size; - int extension_size = dbg->de_64bit_extension ? 4 : 0; - - abbrev_head = abbrev_tail = NULL; - elfsectno_of_debug_info = dbg->de_elf_sects[DEBUG_INFO]; - - /* write cu header */ - cu_header_size = BEGIN_LEN_SIZE + sizeof(Dwarf_Half) + /* version - stamp - */ - uwordb_size + /* offset into abbrev table */ - sizeof(Dwarf_Ubyte); /* size of target address */ - GET_CHUNK(dbg, elfsectno_of_debug_info, data, cu_header_size, - error); - start_info_sec = data; - if (extension_size) { - du = DISTINGUISHED_VALUE; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, sizeof(du), extension_size); - data += extension_size; - } - du = 0; /* length of debug_info, not counting - this field itself (unknown at this - point). */ - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, sizeof(du), uwordb_size); - data += uwordb_size; - - version = CURRENT_VERSION_STAMP; /* assume this length will not - change */ - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &version, - sizeof(version), sizeof(Dwarf_Half)); - data += sizeof(Dwarf_Half); - - du = 0; /* offset into abbrev table, not yet - known. */ - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, sizeof(du), uwordb_size); - data += uwordb_size; - - - db = dbg->de_pointer_size; - - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), 1); - - /* We have filled the chunk we got with GET_CHUNK. At this point we - no longer dare use "data" or "start_info_sec" as a pointer any - longer except to refer to that first small chunk for the cu - header. */ - - curdie = dbg->de_dies; - - /* create AT_macro_info if appropriate */ - if (dbg->de_first_macinfo != NULL) { - if (_dwarf_pro_add_AT_macro_info(dbg, curdie, 0, error) < 0) - return -1; - } - - /* create AT_stmt_list attribute if necessary */ - if (dwarf_need_debug_line_section(dbg) == TRUE) - if (_dwarf_pro_add_AT_stmt_list(dbg, curdie, error) < 0) - return -1; - - die_off = cu_header_size; - - /* - Relocation for abbrev offset in cu header store relocation - record in linked list */ - res = dbg->de_reloc_name(dbg, DEBUG_INFO, BEGIN_LEN_SIZE + - sizeof(Dwarf_Half), - /* r_offset */ - dbg->de_sect_name_idx[DEBUG_ABBREV], - dwarf_drt_data_reloc, uwordb_size); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1); - } - - /* pass 0: only top level dies, add at_sibling attribute to those - dies with children */ - first_child = curdie->di_child; - while (first_child && first_child->di_right) { - if (first_child->di_child) - dwarf_add_AT_reference(dbg, - first_child, - DW_AT_sibling, - first_child->di_right, error); - first_child = first_child->di_right; - } - - /* pass 1: create abbrev info, get die offsets, calc relocations */ - marker_count = 0; - string_attr_count = 0; - while (curdie != NULL) { - int nbytes = 0; - Dwarf_P_Attribute curattr; - Dwarf_P_Attribute new_first_attr; - Dwarf_P_Attribute new_last_attr; - char *space = 0; - int res = 0; - char buff1[ENCODE_SPACE_NEEDED]; - int i = 0; - - curdie->di_offset = die_off; - - if (curdie->di_marker != 0) - marker_count++; - - curabbrev = _dwarf_pro_getabbrev(curdie, abbrev_head); - if (curabbrev == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - if (abbrev_head == NULL) { - n_abbrevs = 1; - curabbrev->abb_idx = n_abbrevs; - abbrev_tail = abbrev_head = curabbrev; - } else { - /* check if its a new abbreviation, if yes, add to tail */ - if (curabbrev->abb_idx == 0) { - n_abbrevs++; - curabbrev->abb_idx = n_abbrevs; - abbrev_tail->abb_next = curabbrev; - abbrev_tail = curabbrev; - } - } - res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_idx, - &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - space = _dwarf_p_get_alloc(dbg, nbytes); - if (space == NULL) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - memcpy(space, buff1, nbytes); - curdie->di_abbrev = space; - curdie->di_abbrev_nbytes = nbytes; - die_off += nbytes; - - /* Resorting the attributes!! */ - new_first_attr = new_last_attr = NULL; - curattr = curdie->di_attrs; - for (i = 0; i < (int)curabbrev->abb_n_attr; i++) { - Dwarf_P_Attribute ca; - Dwarf_P_Attribute cl; - - /* The following should always find an attribute! */ - for (ca = cl = curattr; - ca && curabbrev->abb_attrs[i] != ca->ar_attribute; - cl = ca, ca = ca->ar_next) - { - } - - if (!ca) { - DWARF_P_DBG_ERROR(dbg,DW_DLE_ABBREV_ALLOC, -1); - } - - /* Remove the attribute from the old list. */ - if (ca == curattr) { - curattr = ca->ar_next; - } else { - cl->ar_next = ca->ar_next; - } - - ca->ar_next = NULL; - - /* Add the attribute to the new list. */ - if (new_first_attr == NULL) { - new_first_attr = new_last_attr = ca; - } else { - new_last_attr->ar_next = ca; - new_last_attr = ca; - } - } - - curdie->di_attrs = new_first_attr; - - curattr = curdie->di_attrs; - - while (curattr) { - if (curattr->ar_rel_type != R_MIPS_NONE) { - switch (curattr->ar_attribute) { - case DW_AT_stmt_list: - curattr->ar_rel_symidx = - dbg->de_sect_name_idx[DEBUG_LINE]; - break; - case DW_AT_MIPS_fde: - curattr->ar_rel_symidx = - dbg->de_sect_name_idx[DEBUG_FRAME]; - break; - case DW_AT_macro_info: - curattr->ar_rel_symidx = - dbg->de_sect_name_idx[DEBUG_MACINFO]; - break; - default: - break; - } - res = dbg->de_reloc_name(dbg, DEBUG_INFO, die_off + curattr->ar_rel_offset, /* r_offset - */ - curattr->ar_rel_symidx, - dwarf_drt_data_reloc, - curattr->ar_reloc_len); - - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1); - } - - } - if (curattr->ar_attribute_form == DW_FORM_string) { - string_attr_count++; - } - die_off += curattr->ar_nbytes; - curattr = curattr->ar_next; - } - - /* depth first search */ - if (curdie->di_child) - curdie = curdie->di_child; - else { - while (curdie != NULL && curdie->di_right == NULL) { - curdie = curdie->di_parent; - die_off++; /* since we are writing a null die at - the end of each sibling chain */ - } - if (curdie != NULL) - curdie = curdie->di_right; - } - - } /* end while (curdie != NULL) */ - - res = marker_init(dbg, marker_count); - if (res == -1) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1); - } - res = string_attr_init(dbg, DEBUG_INFO, string_attr_count); - if (res == -1) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1); - } - - /* Pass 2: Write out the die information Here 'data' is a - temporary, one block for each GET_CHUNK. 'data' is overused. */ - curdie = dbg->de_dies; - while (curdie != NULL) { - Dwarf_P_Attribute curattr; - - if (curdie->di_marker != 0) { - res = marker_add(dbg, curdie->di_offset, curdie->di_marker); - if (res == -1) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, -1); - } - } - - /* index to abbreviation table */ - GET_CHUNK(dbg, elfsectno_of_debug_info, - data, curdie->di_abbrev_nbytes, error); - - memcpy((void *) data, - (const void *) curdie->di_abbrev, - curdie->di_abbrev_nbytes); - - /* Attribute values - need to fill in all form attributes */ - curattr = curdie->di_attrs; - string_attr_offset = curdie->di_offset + curdie->di_abbrev_nbytes; - - while (curattr) { - GET_CHUNK(dbg, elfsectno_of_debug_info, data, - (unsigned long) curattr->ar_nbytes, error); - switch (curattr->ar_attribute_form) { - case DW_FORM_ref1: - { - if (curattr->ar_ref_die->di_offset > - (unsigned) 0xff) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1); - } - db = curattr->ar_ref_die->di_offset; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - break; - } - case DW_FORM_ref2: - { - if (curattr->ar_ref_die->di_offset > - (unsigned) 0xffff) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1); - } - dh = curattr->ar_ref_die->di_offset; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &dh, - sizeof(dh), sizeof(Dwarf_Half)); - break; - } - case DW_FORM_ref_addr: - { - /* curattr->ar_ref_die == NULL! - * - * ref_addr doesn't take a CU-offset. - * This is different than other refs. - * This value will be set by the user of the - * producer library using a relocation. - * No need to set a value here. - */ -#if 0 - du = curattr->ar_ref_die->di_offset; - { - /* ref to offset of die */ - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), uwordb_size); - } -#endif - break; - - } - case DW_FORM_ref4: - { - if (curattr->ar_ref_die->di_offset > - (unsigned) 0xffffffff) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_OFFSET_UFLW, -1); - } - dw = (Dwarf_Word) curattr->ar_ref_die->di_offset; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &dw, - sizeof(dw), sizeof(Dwarf_ufixed)); - break; - } - case DW_FORM_ref8: - du = curattr->ar_ref_die->di_offset; - WRITE_UNALIGNED(dbg, (void *) data, - (const void *) &du, - sizeof(du), sizeof(Dwarf_Unsigned)); - break; - case DW_FORM_ref_udata: - { /* unsigned leb128 offset */ - - int nbytes; - char buff1[ENCODE_SPACE_NEEDED]; - - res = - _dwarf_pro_encode_leb128_nm(curattr-> - ar_ref_die-> - di_offset, &nbytes, - buff1, - sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - - memcpy(data, buff1, nbytes); - break; - } - default: - memcpy((void *) data, - (const void *) curattr->ar_data, - curattr->ar_nbytes); - break; - } - if (curattr->ar_attribute_form == DW_FORM_string) { - string_attr_add(dbg, DEBUG_INFO, string_attr_offset, curattr); - } - string_attr_offset += curattr->ar_nbytes; - curattr = curattr->ar_next; - } - - /* depth first search */ - if (curdie->di_child) - curdie = curdie->di_child; - else { - while (curdie != NULL && curdie->di_right == NULL) { - GET_CHUNK(dbg, elfsectno_of_debug_info, data, 1, error); - *data = '\0'; - curdie = curdie->di_parent; - } - if (curdie != NULL) - curdie = curdie->di_right; - } - } /* end while (curdir != NULL) */ - - /* Write out debug_info size */ - /* Dont include length field or extension bytes */ - du = die_off - BEGIN_LEN_SIZE; - WRITE_UNALIGNED(dbg, (void *) (start_info_sec + extension_size), - (const void *) &du, sizeof(du), uwordb_size); - - - data = 0; /* Emphasise not usable now */ - - /* Write out debug_abbrev section */ - abbrevsectno = dbg->de_elf_sects[DEBUG_ABBREV]; - - curabbrev = abbrev_head; - while (curabbrev) { - char *val; - int nbytes; - int idx; - int res; - char buff1[ENCODE_SPACE_NEEDED]; - - res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_idx, &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - - GET_CHUNK(dbg, abbrevsectno, data, nbytes, error); - val = buff1; - memcpy((void *) data, (const void *) val, nbytes); - res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_tag, &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - val = buff1; - GET_CHUNK(dbg, abbrevsectno, data, nbytes, error); - memcpy((void *) data, (const void *) val, nbytes); - db = curabbrev->abb_children; - GET_CHUNK(dbg, abbrevsectno, data, sizeof(Dwarf_Ubyte), error); - WRITE_UNALIGNED(dbg, (void *) data, (const void *) &db, - sizeof(db), sizeof(Dwarf_Ubyte)); - - /* add attributes and forms */ - for (idx = 0; idx < curabbrev->abb_n_attr; idx++) { - res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_attrs[idx], - &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - val = buff1; - GET_CHUNK(dbg, abbrevsectno, data, nbytes, error); - memcpy((void *) data, (const void *) val, nbytes); - res = _dwarf_pro_encode_leb128_nm(curabbrev->abb_forms[idx], - &nbytes, - buff1, sizeof(buff1)); - if (res != DW_DLV_OK) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_ABBREV_ALLOC, -1); - } - val = buff1; - GET_CHUNK(dbg, abbrevsectno, data, nbytes, error); - memcpy((void *) data, (const void *) val, nbytes); - } - GET_CHUNK(dbg, abbrevsectno, data, 2, error); /* two zeros, - for last - entry, see - dwarf2 sec - 7.5.3 */ - *data = 0; - data++; - *data = 0; - - curabbrev = curabbrev->abb_next; - } - - GET_CHUNK(dbg, abbrevsectno, data, 1, error); /* one zero, - for end of - cu, see - dwarf2 sec - 7.5.3 */ - *data = 0; - - - return (int) dbg->de_n_debug_sect; -} - - -/*--------------------------------------------------------------------- - Get a buffer of section data. - section_idx is the elf-section number that this data applies to. - length shows length of returned data -----------------------------------------------------------------------*/ - /*ARGSUSED*/ /* pretend all args used */ - Dwarf_Ptr -dwarf_get_section_bytes(Dwarf_P_Debug dbg, - Dwarf_Signed dwarf_section, - Dwarf_Signed * section_idx, - Dwarf_Unsigned * length, Dwarf_Error * error) -{ - Dwarf_Ptr buf; - - if (dbg->de_version_magic_number != PRO_VERSION_MAGIC) { - DWARF_P_DBG_ERROR(dbg, DW_DLE_IA, NULL); - } - - if (dbg->de_debug_sects == 0) { - /* no more data !! */ - return NULL; - } - if (dbg->de_debug_sects->ds_elf_sect_no == MAGIC_SECT_NO) { - /* no data ever entered !! */ - return NULL; - } - *section_idx = dbg->de_debug_sects->ds_elf_sect_no; - *length = dbg->de_debug_sects->ds_nbytes; - - buf = (Dwarf_Ptr *) dbg->de_debug_sects->ds_data; - - dbg->de_debug_sects = dbg->de_debug_sects->ds_next; - - /* We may want to call the section stuff more than once: see - dwarf_reset_section_bytes() do not do: dbg->de_n_debug_sect--; */ - - return buf; -} - -/* - No errors possible. -*/ -void -dwarf_reset_section_bytes(Dwarf_P_Debug dbg) -{ - dbg->de_debug_sects = dbg->de_first_debug_sect; - /* No need to reset; commented out decrement. dbg->de_n_debug_sect - = ???; */ - dbg->de_reloc_next_to_return = 0; - dbg->de_sect_sa_next_to_return = 0; -} - -/* - Storage handler. Gets either a new chunk of memory, or - a pointer in existing memory, from the linked list attached - to dbg at de_debug_sects, depending on size of nbytes - - Assume dbg not null, checked in top level routine - - Returns a pointer to the allocated buffer space for the - lib to fill in, predincrements next-to-use count so the - space requested is already counted 'used' - when this returns (ie, reserved). - -*/ -Dwarf_Small * -_dwarf_pro_buffer(Dwarf_P_Debug dbg, - int elfsectno, unsigned long nbytes) -{ - Dwarf_P_Section_Data cursect; - - - cursect = dbg->de_current_active_section; - /* By using MAGIC_SECT_NO we allow the following MAGIC_SECT_NO must - not match any legit section number. test to have just two - clauses (no NULL pointer test) See dwarf_producer_init(). */ - if ((cursect->ds_elf_sect_no != elfsectno) || - ((cursect->ds_nbytes + nbytes) > cursect->ds_orig_alloc) - ) { - - /* Either the elf section has changed or there is not enough - space in the current section. - - Create a new Dwarf_P_Section_Data_s for the chunk. and have - space 'on the end' for the buffer itself so we just do one - malloc (not two). - - */ - unsigned long space = nbytes; - - if (nbytes < CHUNK_SIZE) - space = CHUNK_SIZE; - - cursect = (Dwarf_P_Section_Data) - _dwarf_p_get_alloc(dbg, - sizeof(struct Dwarf_P_Section_Data_s) - + space); - - - if (cursect == NULL) - return (NULL); - - /* _dwarf_p_get_alloc zeroes the space... */ - - cursect->ds_data = (char *) cursect + - sizeof(struct Dwarf_P_Section_Data_s); - cursect->ds_orig_alloc = space; - cursect->ds_elf_sect_no = elfsectno; - cursect->ds_nbytes = nbytes; /* reserve this number of bytes - of space for caller to fill - in */ - - /* Now link on the end of the list, and mark this one as the - current one */ - - if (dbg->de_debug_sects->ds_elf_sect_no == MAGIC_SECT_NO) { - /* the only entry is the special one for 'no entry' so - delete that phony one while adding this initial real - one. */ - dbg->de_debug_sects = cursect; - dbg->de_current_active_section = cursect; - dbg->de_first_debug_sect = cursect; - } else { - dbg->de_current_active_section->ds_next = cursect; - dbg->de_current_active_section = cursect; - } - dbg->de_n_debug_sect++; - - return ((Dwarf_Small *) cursect->ds_data); - } - - /* There is enough space in the current buffer */ - { - Dwarf_Small *space_for_caller = (Dwarf_Small *) - (cursect->ds_data + cursect->ds_nbytes); - - cursect->ds_nbytes += nbytes; - return space_for_caller; - } -} - - -/*------------------------------------------------------------ - Given address advance and line advance, it gives - either special opcode, or a number < 0 -------------------------------------------------------------*/ -static int -_dwarf_pro_get_opc(Dwarf_Unsigned addr_adv, int line_adv) -{ - int opc; - - addr_adv = addr_adv / MIN_INST_LENGTH; - if (line_adv == 0 && addr_adv == 0) - return OPC_INCS_ZERO; - if (line_adv >= LINE_BASE && line_adv < LINE_BASE + LINE_RANGE) { - opc = - (line_adv - LINE_BASE) + (addr_adv * LINE_RANGE) + - OPCODE_BASE; - if (opc > 255) - return OPC_OUT_OF_RANGE; - return opc; - } else - return LINE_OUT_OF_RANGE; -} - -/*----------------------------------------------------------------------- - Handles abbreviations. It takes a die, searches through - current list of abbreviations for matching one. If it - finds one, it returns a pointer to it, and if it doesnt, - it returns a new one. Upto the user of this function to - link it up to the abbreviation head. If its a new one, - abb_idx has 0. ------------------------------------------------------------------------*/ -static Dwarf_P_Abbrev -_dwarf_pro_getabbrev(Dwarf_P_Die die, Dwarf_P_Abbrev head) -{ - Dwarf_P_Abbrev curabbrev; - Dwarf_P_Attribute curattr; - int res1; - int nattrs; - int match; - Dwarf_ufixed *forms = 0; - Dwarf_ufixed *attrs = 0; - - curabbrev = head; - while (curabbrev) { - if ((die->di_tag == curabbrev->abb_tag) && - ((die->di_child != NULL && - curabbrev->abb_children == DW_CHILDREN_yes) || - (die->di_child == NULL && - curabbrev->abb_children == DW_CHILDREN_no)) && - (die->di_n_attr == curabbrev->abb_n_attr)) { - - /* There is a chance of a match. */ - curattr = die->di_attrs; - match = 1; /* Assume match found. */ - while (match && curattr) { - res1 = _dwarf_pro_match_attr(curattr, - curabbrev, - (int) curabbrev-> - abb_n_attr); - if (res1 == 0) - match = 0; - curattr = curattr->ar_next; - } - if (match == 1) - return curabbrev; - } - curabbrev = curabbrev->abb_next; - } - - /* no match, create new abbreviation */ - if (die->di_n_attr != 0) { - forms = (Dwarf_ufixed *) - _dwarf_p_get_alloc(die->di_dbg, - sizeof(Dwarf_ufixed) * die->di_n_attr); - if (forms == NULL) - return NULL; - attrs = (Dwarf_ufixed *) - _dwarf_p_get_alloc(die->di_dbg, - sizeof(Dwarf_ufixed) * die->di_n_attr); - if (attrs == NULL) - return NULL; - } - nattrs = 0; - curattr = die->di_attrs; - while (curattr) { - attrs[nattrs] = curattr->ar_attribute; - forms[nattrs] = curattr->ar_attribute_form; - nattrs++; - curattr = curattr->ar_next; - } - - curabbrev = (Dwarf_P_Abbrev) - _dwarf_p_get_alloc(die->di_dbg, sizeof(struct Dwarf_P_Abbrev_s)); - if (curabbrev == NULL) - return NULL; - - if (die->di_child == NULL) - curabbrev->abb_children = DW_CHILDREN_no; - else - curabbrev->abb_children = DW_CHILDREN_yes; - curabbrev->abb_tag = die->di_tag; - curabbrev->abb_attrs = attrs; - curabbrev->abb_forms = forms; - curabbrev->abb_n_attr = die->di_n_attr; - curabbrev->abb_idx = 0; - curabbrev->abb_next = NULL; - - return curabbrev; -} - -/*------------------------------------------------------------------ - Tries to see if given attribute and form combination - exists in the given abbreviation --------------------------------------------------------------------*/ -static int -_dwarf_pro_match_attr(Dwarf_P_Attribute attr, - Dwarf_P_Abbrev abbrev, int no_attr) -{ - int i; - int found = 0; - - for (i = 0; i < no_attr; i++) { - if (attr->ar_attribute == abbrev->abb_attrs[i] && - attr->ar_attribute_form == abbrev->abb_forms[i]) { - found = 1; - break; - } - } - return found; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_section.h b/usr/src/tools/ctf/dwarf/common/pro_section.h deleted file mode 100644 index b37ade44dc..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_section.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - - -/* relocation section names */ -extern char *_dwarf_rel_section_names[]; - -/* section names */ -extern char *_dwarf_sectnames[]; - -/* struct to hold relocation entries. Its mantained as a linked - list of relocation structs, and will then be written at as a - whole into the relocation section. Whether its 32 bit or - 64 bit will be obtained from Dwarf_Debug pointer. -*/ - - - - - -/* - struct stores a chunk of data pertaining to a section -*/ -struct Dwarf_P_Section_Data_s { - int ds_elf_sect_no; /* elf section number */ - char *ds_data; /* data contained in section */ - unsigned long ds_nbytes; /* bytes of data used so far */ - unsigned long ds_orig_alloc; /* bytes allocated originally */ - Dwarf_P_Section_Data ds_next; /* next on the list */ -}; - -/* Used to allow a dummy initial struct (which we - drop before it gets used - This must not match any legitimate 'section' number. -*/ -#define MAGIC_SECT_NO -3 - -/* Size of chunk of data allocated in one alloc - Not clear if this is the best size. - Used to be just 4096 for user data, the section data struct - was a separate malloc. -*/ -#define CHUNK_SIZE (4096 - sizeof (struct Dwarf_P_Section_Data_s)) - -/* - chunk alloc routine - - if chunk->ds_data is nil, it will alloc CHUNK_SIZE bytes, - and return pointer to the beginning. If chunk is not nil, - it will see if there's enoungh space for nbytes in current - chunk, if not, add new chunk to linked list, and return - a char * pointer to it. Return null if unsuccessful. -*/ -Dwarf_Small *_dwarf_pro_buffer(Dwarf_P_Debug dbg, int sectno, - unsigned long nbytes); - -#define GET_CHUNK(dbg,sectno,ptr,nbytes,error) \ - { \ - (ptr) = _dwarf_pro_buffer((dbg),(sectno),(nbytes)); \ - if ((ptr) == NULL) { \ - DWARF_P_DBG_ERROR(dbg,DW_DLE_CHUNK_ALLOC,-1); \ - } \ - } - - - -int - _dwarf_transform_arange_to_disk(Dwarf_P_Debug dbg, - Dwarf_Error * error); - -/* These are for creating ELF section type codes. -*/ -#if defined(linux) || defined(__BEOS__) || !defined(SHT_MIPS_DWARF) -/* Intel's SoftSdv accepts only this */ -#define SECTION_TYPE SHT_PROGBITS -#else -#define SECTION_TYPE SHT_MIPS_DWARF -#endif diff --git a/usr/src/tools/ctf/dwarf/common/pro_types.c b/usr/src/tools/ctf/dwarf/common/pro_types.c deleted file mode 100644 index 1f3f93280c..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_types.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" - - -/* - This function adds another type name to the - list of type names for the given Dwarf_P_Debug. - It returns 0 on error, and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_typename(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *type_name, Dwarf_Error * error) -{ - return - _dwarf_add_simple_name_entry(dbg, die, type_name, - dwarf_snk_typename, error); -} - -/* - The following is the generic 'add a simple name entry' - for any of the simple name sections. - - See enum dwarf_sn_kind in pro_opaque.h - -*/ -Dwarf_Unsigned -_dwarf_add_simple_name_entry(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *entry_name, - enum dwarf_sn_kind entrykind, - Dwarf_Error * error) -{ - Dwarf_P_Simple_nameentry nameentry; - Dwarf_P_Simple_name_header hdr; - char *name; - int uword_size; - - if (dbg == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL); - return (0); - } - - if (die == NULL) { - _dwarf_p_error(NULL, error, DW_DLE_DIE_NULL); - return (0); - } - - - nameentry = (Dwarf_P_Simple_nameentry) - _dwarf_p_get_alloc(dbg, - sizeof(struct Dwarf_P_Simple_nameentry_s)); - if (nameentry == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - - name = _dwarf_p_get_alloc(dbg, strlen(entry_name) + 1); - if (name == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - strcpy(name, entry_name); - - nameentry->sne_die = die; - nameentry->sne_name = name; - nameentry->sne_name_len = strlen(name); - uword_size = dbg->de_offset_size; - - hdr = &dbg->de_simple_name_headers[entrykind]; - if (hdr->sn_head == NULL) - hdr->sn_head = hdr->sn_tail = nameentry; - else { - hdr->sn_tail->sne_next = nameentry; - hdr->sn_tail = nameentry; - } - hdr->sn_count++; - hdr->sn_net_len += uword_size + nameentry->sne_name_len + 1; - - return (1); -} - - - -/* - _dwarf_transform_simplename_to_disk writes - ".rel.debug_pubnames", - ".rel.debug_funcnames", sgi extension - ".rel.debug_typenames", sgi extension - ".rel.debug_varnames", sgi extension - ".rel.debug_weaknames", sgi extension - to disk. - section_index indexes one of those sections. - entrykind is one of those 'kind's. - -*/ -int -_dwarf_transform_simplename_to_disk(Dwarf_P_Debug dbg, enum dwarf_sn_kind entrykind, int section_index, /* in - de_elf_sects - etc - */ - Dwarf_Error * error) -{ - - - /* Used to fill in 0. */ - const Dwarf_Signed big_zero = 0; - - /* Used to scan the section data buffers. */ - Dwarf_P_Section_Data debug_sect; - - Dwarf_Signed debug_info_size; - - Dwarf_P_Simple_nameentry nameentry_original; - Dwarf_P_Simple_nameentry nameentry; - Dwarf_Small *stream_bytes; - Dwarf_Small *cur_stream_bytes_ptr; - Dwarf_Unsigned stream_bytes_count; - Dwarf_Unsigned adjusted_length; /* count excluding length field - */ - - - int uword_size = dbg->de_offset_size; - int extension_size = dbg->de_64bit_extension ? 4 : 0; - - Dwarf_P_Simple_name_header hdr; - - - /* ***** BEGIN CODE ***** */ - - debug_info_size = 0; - for (debug_sect = dbg->de_debug_sects; debug_sect != NULL; - debug_sect = debug_sect->ds_next) { - /* We want the size of the .debug_info section for this CU - because the dwarf spec requires us to output it below so we - look for it specifically. */ - if (debug_sect->ds_elf_sect_no == dbg->de_elf_sects[DEBUG_INFO]) { - debug_info_size += debug_sect->ds_nbytes; - } - } - - hdr = &dbg->de_simple_name_headers[entrykind]; - /* Size of the .debug_typenames (or similar) section header. */ - stream_bytes_count = extension_size + uword_size + /* Size of - length - field. */ - sizeof(Dwarf_Half) + /* Size of version field. */ - uword_size + /* Size of .debug_info offset. */ - uword_size; /* Size of .debug_names. */ - - - - nameentry_original = hdr->sn_head; - nameentry = nameentry_original; - /* add in the content size */ - stream_bytes_count += hdr->sn_net_len; - - /* Size of the last 0 offset. */ - stream_bytes_count += uword_size; - - /* Now we know how long the entire section is */ - GET_CHUNK(dbg, dbg->de_elf_sects[section_index], - stream_bytes, (unsigned long) stream_bytes_count, error); - if (stream_bytes == NULL) { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - cur_stream_bytes_ptr = stream_bytes; - - if (extension_size) { - Dwarf_Unsigned x = DISTINGUISHED_VALUE; - - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &x, sizeof(x), extension_size); - cur_stream_bytes_ptr += extension_size; - - } - /* Write the adjusted length of .debug_*names section. */ - adjusted_length = stream_bytes_count - uword_size - extension_size; - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &adjusted_length, - sizeof(adjusted_length), uword_size); - cur_stream_bytes_ptr += uword_size; - - /* Write the version as 2 bytes. */ - { - Dwarf_Half verstamp = CURRENT_VERSION_STAMP; - - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &verstamp, - sizeof(verstamp), sizeof(Dwarf_Half)); - cur_stream_bytes_ptr += sizeof(Dwarf_Half); - } - - /* Write the offset of the compile-unit. */ - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &big_zero, - sizeof(big_zero), uword_size); - cur_stream_bytes_ptr += uword_size; - - /* now create the relocation for the compile_unit offset */ - { - int res = dbg->de_reloc_name(dbg, - section_index, - extension_size + uword_size + - sizeof(Dwarf_Half) - /* r_offset */ - , - /* debug_info section name symbol */ - dbg->de_sect_name_idx[DEBUG_INFO], - dwarf_drt_data_reloc, - uword_size); - - if (res != DW_DLV_OK) { - { - _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL); - return (0); - } - } - } - - /* Write the size of .debug_info section. */ - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &debug_info_size, - sizeof(debug_info_size), uword_size); - cur_stream_bytes_ptr += uword_size; - - - for (nameentry = nameentry_original; - nameentry != NULL; nameentry = nameentry->sne_next) { - - /* Copy offset of die from start of compile-unit. */ - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &nameentry->sne_die->di_offset, - sizeof(nameentry->sne_die->di_offset), - uword_size); - cur_stream_bytes_ptr += uword_size; - - /* Copy the type name. */ - strcpy((char *) cur_stream_bytes_ptr, nameentry->sne_name); - cur_stream_bytes_ptr += nameentry->sne_name_len + 1; - } - - WRITE_UNALIGNED(dbg, cur_stream_bytes_ptr, - (const void *) &big_zero, - sizeof(big_zero), uword_size); - - - - - return (int) dbg->de_n_debug_sect; -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_types.h b/usr/src/tools/ctf/dwarf/common/pro_types.h deleted file mode 100644 index 817609215b..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_types.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - -/* pro_types.h */ - - -int _dwarf_transform_simplename_to_disk(Dwarf_P_Debug dbg, enum dwarf_sn_kind entrykind, int section_index, /* in - de_elf_sects - etc - */ - Dwarf_Error * error); diff --git a/usr/src/tools/ctf/dwarf/common/pro_util.h b/usr/src/tools/ctf/dwarf/common/pro_util.h deleted file mode 100644 index 56bde8bda6..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_util.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - - -#define IS_64BIT(dbg) ((dbg)->de_flags & DW_DLC_SIZE_64 ? 1 : 0) -#define ISA_IA64(dbg) ((dbg)->de_flags & DW_DLC_ISA_IA64 ? 1 : 0) - -/* definition of sizes of types, given target machine */ -#define sizeof_sbyte(dbg) sizeof(Dwarf_Sbyte) -#define sizeof_ubyte(dbg) sizeof(Dwarf_Ubyte) -#define sizeof_uhalf(dbg) sizeof(Dwarf_Half) -/* certain sizes not defined here, but set in dbg record. - See pro_init.c -*/ - -/* Computes amount of padding necessary to align n to a k-boundary. */ -/* Important: Assumes n, k both GREATER than zero. */ -#define PADDING(n, k) ( (k)-1 - ((n)-1)%(k) ) - -/* The following defines are only important for users of the -** producer part of libdwarf, and such should have these -** defined correctly (as necessary) -** by the #include <elf.h> done in pro_incl.h -** before the #include "pro_util.h". -** For others producer macros do not matter so 0 is a usable value, and -** zero values let compilation succeed on more non-MIPS architectures. -** A better approach would be welcome. -*/ -/* R_MIPS* are #define so #ifndef works */ -/* R_IA_64* are not necessarily #define (might be enum) so #ifndef - is useless, we use the configure script generating - HAVE_R_IA_64_DIR32LSB and HAVE_R_IA64_DIR32LSB. -*/ -#ifndef R_MIPS_64 -#define R_MIPS_64 0 -#endif -#ifndef R_MIPS_32 -#define R_MIPS_32 0 -#endif -#ifndef R_MIPS_SCN_DISP -#define R_MIPS_SCN_DISP 0 -#endif - -/* R_IA_64_DIR32LSB came before the now-standard R_IA64_DIR32LSB - (etc) was defined. This now deals with either form, - preferring the new form if available. */ -#ifdef HAVE_R_IA64_DIR32LSB -#define DWARF_PRO_R_IA64_DIR32LSB R_IA64_DIR32LSB -#define DWARF_PRO_R_IA64_DIR64LSB R_IA64_DIR64LSB -#define DWARF_PRO_R_IA64_SEGREL64LSB R_IA64_SEGREL64LSB -#define DWARF_PRO_R_IA64_SEGREL32LSB R_IA64_SEGREL32LSB -#endif -#if defined(HAVE_R_IA_64_DIR32LSB) && !defined(HAVE_R_IA64_DIR32LSB) -#define DWARF_PRO_R_IA64_DIR32LSB R_IA_64_DIR32LSB -#define DWARF_PRO_R_IA64_DIR64LSB R_IA_64_DIR64LSB -#define DWARF_PRO_R_IA64_SEGREL64LSB R_IA_64_SEGREL64LSB -#define DWARF_PRO_R_IA64_SEGREL32LSB R_IA_64_SEGREL32LSB -#endif -#if !defined(HAVE_R_IA_64_DIR32LSB) && !defined(HAVE_R_IA64_DIR32LSB) -#define DWARF_PRO_R_IA64_DIR32LSB 0 -#define DWARF_PRO_R_IA64_DIR64LSB 0 -#define DWARF_PRO_R_IA64_SEGREL64LSB 0 -#define DWARF_PRO_R_IA64_SEGREL32LSB 0 -#endif - -/* - * The default "I don't know" value can't be zero. - * Because that's the sentinel value that means "no relocation". - * In order to use this library in 'symbolic relocation mode we - * don't care if this value is the right relocation value, - * only that it's non-NULL. So at the end, we define it - * to something sensible. - */ - - - -#if defined(sun) -#if defined(sparc) -#define Get_REL64_isa(dbg) (R_SPARC_UA64) -#define Get_REL32_isa(dbg) (R_SPARC_UA32) -#define Get_REL_SEGREL_isa(dbg) (R_SPARC_NONE) /* I don't know! */ -#else /* i386 */ -#define Get_REL64_isa(dbg) (R_386_32) /* Any non-zero value is ok */ -#define Get_REL32_isa(dbg) (R_386_32) -#define Get_REL_SEGREL_isa(dbg) (R_386_NONE) /* I don't know! */ -#endif /* sparc || i386 */ -#else /* !sun */ -#ifdef HAVE_SYS_IA64_ELF_H -#define Get_REL64_isa(dbg) (ISA_IA64(dbg) ? \ - DWARF_PRO_R_IA64_DIR64LSB : R_MIPS_64) -#define Get_REL32_isa(dbg) (ISA_IA64(dbg) ? \ - DWARF_PRO_R_IA64_DIR32LSB : R_MIPS_32) - - -/* ia64 uses 32bit dwarf offsets for sections */ -#define Get_REL_SEGREL_isa(dbg) (ISA_IA64(dbg) ? \ - DWARF_PRO_R_IA64_SEGREL32LSB : R_MIPS_SCN_DISP) -#else /* HAVE_SYS_IA64_ELF_H */ - -#if !defined(linux) && !defined(__BEOS__) -#define Get_REL64_isa(dbg) (R_MIPS_64) -#define Get_REL32_isa(dbg) (R_MIPS_32) -#define Get_REL_SEGREL_isa(dbg) (R_MIPS_SCN_DISP) -#else -#define Get_REL64_isa(dbg) (1) -#define Get_REL32_isa(dbg) (1) /* these are used on linux */ -#define Get_REL_SEGREL_isa(dbg) (1) /* non zero values, see comments above */ -#endif - -#endif /* HAVE_SYS_IA64_ELF_H */ -#endif /* !sun */ - - diff --git a/usr/src/tools/ctf/dwarf/common/pro_vars.c b/usr/src/tools/ctf/dwarf/common/pro_vars.c deleted file mode 100644 index 3e75a9d9af..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_vars.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" - -/* - This function adds another variable name to the - list of variable names for the given Dwarf_P_Debug. - It returns 0 on error, and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_varname(Dwarf_P_Debug dbg, - Dwarf_P_Die die, char *var_name, Dwarf_Error * error) -{ - return - _dwarf_add_simple_name_entry(dbg, die, var_name, - dwarf_snk_varname, error); - - -} diff --git a/usr/src/tools/ctf/dwarf/common/pro_weaks.c b/usr/src/tools/ctf/dwarf/common/pro_weaks.c deleted file mode 100644 index 8c74bf08ca..0000000000 --- a/usr/src/tools/ctf/dwarf/common/pro_weaks.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - - Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. - - This program is free software; you can redistribute it and/or modify it - under the terms of version 2.1 of the GNU Lesser General Public License - as published by the Free Software Foundation. - - This program is distributed in the hope that it would be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - Further, this software is distributed without any warranty that it is - free of the rightful claim of any third person regarding infringement - or the like. Any license provided herein, whether implied or - otherwise, applies only to this software file. Patent licenses, if - any, provided herein do not apply to combinations of this program with - other software, or any other product whatsoever. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, - USA. - - Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, - Mountain View, CA 94043, or: - - http://www.sgi.com - - For further information regarding this notice, see: - - http://oss.sgi.com/projects/GenInfo/NoticeExplan - -*/ - - - -#include "config.h" -#include "libdwarfdefs.h" -#include <stdio.h> -#include <string.h> -#ifdef HAVE_ELFACCESS_H -#include <elfaccess.h> -#endif -#include "pro_incl.h" -#include "pro_section.h" - -/* - This function adds another weak name to the - list of weak names for the given Dwarf_P_Debug. - It returns 0 on error, and 1 otherwise. -*/ -Dwarf_Unsigned -dwarf_add_weakname(Dwarf_P_Debug dbg, - Dwarf_P_Die die, - char *weak_name, Dwarf_Error * error) -{ - return - _dwarf_add_simple_name_entry(dbg, die, weak_name, - dwarf_snk_weakname, error); -} diff --git a/usr/src/tools/ctf/dump/Makefile.com b/usr/src/tools/ctf/libctf/Makefile index 9877fa06a3..8ea6ae181f 100644 --- a/usr/src/tools/ctf/dump/Makefile.com +++ b/usr/src/tools/ctf/libctf/Makefile @@ -19,49 +19,28 @@ # CDDL HEADER END # # -# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -.KEEP_STATE: -.SUFFIXES: - -PROG = ctfdump -SRCS = dump.c utils.c symbol.c - -include ../../Makefile.ctf - -LDFLAGS += -L$(NATIVE_ADJUNCT)/lib -LDLIBS += -lelf -lz - -OBJS = $(SRCS:%.c=%.o) -LINTFILES = $(SRCS:%.c=%.ln) +include ../../Makefile.tools -CERRWARN += -_gcc=-Wno-uninitialized +HDRS = libctf.h +HDRDIR = common -.NO_PARALLEL: -.PARALLEL: $(OBJS) $(LINTFILES) +SUBDIRS = $(MACH) -all: $(PROG) +all := TARGET = all +clean := TARGET = clean +clobber := TARGET = clobber +install := TARGET = install +lint := TARGET = lint -$(PROG): $(OBJS) - $(LINK.c) $(OBJS) -o $@ $(LDLIBS) - $(POST_PROCESS) - -%.o: ../%.c - $(COMPILE.c) $< - -$(ROOTONBLDMACHPROG): $(PROG) - -install: $(ROOTONBLDMACHPROG) - -clean: - $(RM) $(OBJS) $(LINTFILES) +.KEEP_STATE: -%.ln: ../%.c - $(LINT.c) -c $< +all clean clobber install lint: $(SUBDIRS) -lint: $(LINTFILES) - $(LINT) $(LINTFLAGS) $(LINTFILES) $(LDLIBS) +$(SUBDIRS): FRC + @cd $@; pwd; $(MAKE) $(TARGET) -include ../../Makefile.ctf.targ +FRC: diff --git a/usr/src/tools/ctf/libctf/Makefile.com b/usr/src/tools/ctf/libctf/Makefile.com new file mode 100644 index 0000000000..89769c5521 --- /dev/null +++ b/usr/src/tools/ctf/libctf/Makefile.com @@ -0,0 +1,51 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright 2018 Joyent, Inc. +# + +include $(SRC)/lib/libctf/Makefile.shared.com +include ../../Makefile.ctf + +CSTD = $(CSTD_GNU99) +C99LMODE = -Xc99=%all + +CPPFLAGS += -I$(SRC)/lib/libctf/common/ \ + -I$(SRC)/lib/libdwarf/common/ \ + -I$(SRC)/lib/mergeq \ + -include ../../common/ctf_headers.h \ + -DCTF_OLD_VERSIONS \ + -DCTF_TOOLS_BUILD +LDLIBS += -lc -lelf -L$(ROOTONBLDLIBMACH) -ldwarf -lavl +DYNFLAGS += '-R$$ORIGIN/../../lib/$(MACH)' + +.KEEP_STATE: + +all: $(LIBS) + +install: all $(ROOTONBLDLIBMACH)/libctf.so.1 $(ROOTONBLDLIBMACH)/libctf.so + +$(ROOTONBLDLIBMACH)/%: % + $(INS.file) + +$(ROOTONBLDLIBMACH)/$(LIBLINKS): $(ROOTONBLDLIBMACH)/$(LIBLINKS)$(VERS) + $(INS.liblink) + +# +# Just like with libdwarf, we can't actually add ctf to ourselves, +# because we're part of the tools for creating CTF. +# +$(DYNLIB) := CTFMERGE_POST= : +CTFCONVERT_O= : + +include $(SRC)/lib/Makefile.targ +include $(SRC)/lib/libctf/Makefile.shared.targ diff --git a/usr/src/tools/ctf/libctf/i386/Makefile b/usr/src/tools/ctf/libctf/i386/Makefile new file mode 100644 index 0000000000..a926f22084 --- /dev/null +++ b/usr/src/tools/ctf/libctf/i386/Makefile @@ -0,0 +1,18 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com + +all: $(LIBS) diff --git a/usr/src/tools/ctf/libctf/sparc/Makefile b/usr/src/tools/ctf/libctf/sparc/Makefile new file mode 100644 index 0000000000..a926f22084 --- /dev/null +++ b/usr/src/tools/ctf/libctf/sparc/Makefile @@ -0,0 +1,18 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2015, Joyent, Inc. +# + +include ../Makefile.com + +all: $(LIBS) |