diff options
Diffstat (limited to 'usr/src/tools/ctf/dwarf/common/dwarf_harmless.c')
-rw-r--r-- | usr/src/tools/ctf/dwarf/common/dwarf_harmless.c | 226 |
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; -} - |