summaryrefslogtreecommitdiff
path: root/usr/src/tools/ctf/dwarf/common/dwarf_harmless.c
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2019-01-17 17:50:46 +0000
committerRobert Mustacchi <rm@joyent.com>2019-02-11 17:40:04 +0000
commitbc1f688b4872ace323eaddbb1a6365d054e7bf56 (patch)
tree3b6f2f4caaa4bafcfb4f757be7ea4de2858201ce /usr/src/tools/ctf/dwarf/common/dwarf_harmless.c
parent2b987d42b0ad07d74e39b18a2498709e5195d7e3 (diff)
downloadillumos-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/dwarf/common/dwarf_harmless.c')
-rw-r--r--usr/src/tools/ctf/dwarf/common/dwarf_harmless.c226
1 files changed, 0 insertions, 226 deletions
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;
-}
-