1*2de3b87aSKai Wang /*- 2*2de3b87aSKai Wang * Copyright (c) 2009,2011 Kai Wang 3*2de3b87aSKai Wang * All rights reserved. 4*2de3b87aSKai Wang * 5*2de3b87aSKai Wang * Redistribution and use in source and binary forms, with or without 6*2de3b87aSKai Wang * modification, are permitted provided that the following conditions 7*2de3b87aSKai Wang * are met: 8*2de3b87aSKai Wang * 1. Redistributions of source code must retain the above copyright 9*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer. 10*2de3b87aSKai Wang * 2. Redistributions in binary form must reproduce the above copyright 11*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer in the 12*2de3b87aSKai Wang * documentation and/or other materials provided with the distribution. 13*2de3b87aSKai Wang * 14*2de3b87aSKai Wang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*2de3b87aSKai Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*2de3b87aSKai Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*2de3b87aSKai Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*2de3b87aSKai Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*2de3b87aSKai Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*2de3b87aSKai Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*2de3b87aSKai Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*2de3b87aSKai Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*2de3b87aSKai Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*2de3b87aSKai Wang * SUCH DAMAGE. 25*2de3b87aSKai Wang */ 26*2de3b87aSKai Wang 27*2de3b87aSKai Wang #include "_libdwarf.h" 28*2de3b87aSKai Wang 29*2de3b87aSKai Wang ELFTC_VCSID("$Id: dwarf_abbrev.c 2072 2011-10-27 03:26:49Z jkoshy $"); 30*2de3b87aSKai Wang 31*2de3b87aSKai Wang int 32*2de3b87aSKai Wang dwarf_get_abbrev(Dwarf_Debug dbg, Dwarf_Unsigned offset, 33*2de3b87aSKai Wang Dwarf_Abbrev *return_abbrev, Dwarf_Unsigned *length, 34*2de3b87aSKai Wang Dwarf_Unsigned *attr_count, Dwarf_Error *error) 35*2de3b87aSKai Wang { 36*2de3b87aSKai Wang Dwarf_Abbrev ab; 37*2de3b87aSKai Wang int ret; 38*2de3b87aSKai Wang 39*2de3b87aSKai Wang if (dbg == NULL || return_abbrev == NULL || length == NULL || 40*2de3b87aSKai Wang attr_count == NULL) { 41*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 42*2de3b87aSKai Wang return (DW_DLV_ERROR); 43*2de3b87aSKai Wang } 44*2de3b87aSKai Wang 45*2de3b87aSKai Wang ret = _dwarf_abbrev_parse(dbg, NULL, &offset, &ab, error); 46*2de3b87aSKai Wang if (ret != DW_DLE_NONE) { 47*2de3b87aSKai Wang if (ret == DW_DLE_NO_ENTRY) { 48*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); 49*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 50*2de3b87aSKai Wang } else 51*2de3b87aSKai Wang return (DW_DLV_ERROR); 52*2de3b87aSKai Wang } 53*2de3b87aSKai Wang 54*2de3b87aSKai Wang *return_abbrev = ab; 55*2de3b87aSKai Wang *length = ab->ab_length; 56*2de3b87aSKai Wang *attr_count = ab->ab_atnum; 57*2de3b87aSKai Wang 58*2de3b87aSKai Wang return (DW_DLV_OK); 59*2de3b87aSKai Wang } 60*2de3b87aSKai Wang 61*2de3b87aSKai Wang int 62*2de3b87aSKai Wang dwarf_get_abbrev_tag(Dwarf_Abbrev abbrev, Dwarf_Half *return_tag, 63*2de3b87aSKai Wang Dwarf_Error *error) 64*2de3b87aSKai Wang { 65*2de3b87aSKai Wang 66*2de3b87aSKai Wang if (abbrev == NULL || return_tag == NULL) { 67*2de3b87aSKai Wang DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 68*2de3b87aSKai Wang return (DW_DLV_ERROR); 69*2de3b87aSKai Wang } 70*2de3b87aSKai Wang 71*2de3b87aSKai Wang *return_tag = (Dwarf_Half) abbrev->ab_tag; 72*2de3b87aSKai Wang 73*2de3b87aSKai Wang return (DW_DLV_OK); 74*2de3b87aSKai Wang } 75*2de3b87aSKai Wang 76*2de3b87aSKai Wang int 77*2de3b87aSKai Wang dwarf_get_abbrev_code(Dwarf_Abbrev abbrev, Dwarf_Unsigned *return_code, 78*2de3b87aSKai Wang Dwarf_Error *error) 79*2de3b87aSKai Wang { 80*2de3b87aSKai Wang 81*2de3b87aSKai Wang if (abbrev == NULL || return_code == NULL) { 82*2de3b87aSKai Wang DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 83*2de3b87aSKai Wang return (DW_DLV_ERROR); 84*2de3b87aSKai Wang } 85*2de3b87aSKai Wang 86*2de3b87aSKai Wang *return_code = abbrev->ab_entry; 87*2de3b87aSKai Wang 88*2de3b87aSKai Wang return (DW_DLV_OK); 89*2de3b87aSKai Wang } 90*2de3b87aSKai Wang 91*2de3b87aSKai Wang int 92*2de3b87aSKai Wang dwarf_get_abbrev_children_flag(Dwarf_Abbrev abbrev, Dwarf_Signed *return_flag, 93*2de3b87aSKai Wang Dwarf_Error *error) 94*2de3b87aSKai Wang { 95*2de3b87aSKai Wang 96*2de3b87aSKai Wang if (abbrev == NULL || return_flag == NULL) { 97*2de3b87aSKai Wang DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 98*2de3b87aSKai Wang return (DW_DLV_ERROR); 99*2de3b87aSKai Wang } 100*2de3b87aSKai Wang 101*2de3b87aSKai Wang *return_flag = (Dwarf_Signed) abbrev->ab_children; 102*2de3b87aSKai Wang 103*2de3b87aSKai Wang return (DW_DLV_OK); 104*2de3b87aSKai Wang } 105*2de3b87aSKai Wang 106*2de3b87aSKai Wang int 107*2de3b87aSKai Wang dwarf_get_abbrev_entry(Dwarf_Abbrev abbrev, Dwarf_Signed ndx, 108*2de3b87aSKai Wang Dwarf_Half *attr_num, Dwarf_Signed *form, Dwarf_Off *offset, 109*2de3b87aSKai Wang Dwarf_Error *error) 110*2de3b87aSKai Wang { 111*2de3b87aSKai Wang Dwarf_AttrDef ad; 112*2de3b87aSKai Wang int i; 113*2de3b87aSKai Wang 114*2de3b87aSKai Wang if (abbrev == NULL || attr_num == NULL || form == NULL || 115*2de3b87aSKai Wang offset == NULL) { 116*2de3b87aSKai Wang DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 117*2de3b87aSKai Wang return (DW_DLV_ERROR); 118*2de3b87aSKai Wang } 119*2de3b87aSKai Wang 120*2de3b87aSKai Wang if (ndx < 0 || (uint64_t) ndx >= abbrev->ab_atnum) { 121*2de3b87aSKai Wang DWARF_SET_ERROR(NULL, error, DW_DLE_NO_ENTRY); 122*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 123*2de3b87aSKai Wang } 124*2de3b87aSKai Wang 125*2de3b87aSKai Wang ad = STAILQ_FIRST(&abbrev->ab_attrdef); 126*2de3b87aSKai Wang for (i = 0; i < ndx && ad != NULL; i++) 127*2de3b87aSKai Wang ad = STAILQ_NEXT(ad, ad_next); 128*2de3b87aSKai Wang 129*2de3b87aSKai Wang assert(ad != NULL); 130*2de3b87aSKai Wang 131*2de3b87aSKai Wang *attr_num = ad->ad_attrib; 132*2de3b87aSKai Wang *form = ad->ad_form; 133*2de3b87aSKai Wang *offset = ad->ad_offset; 134*2de3b87aSKai Wang 135*2de3b87aSKai Wang return (DW_DLV_OK); 136*2de3b87aSKai Wang } 137