Path: blob/main/contrib/elftoolchain/libdwarf/dwarf_attr.c
39483 views
/*-1* Copyright (c) 2007 John Birrell ([email protected])2* Copyright (c) 2009 Kai Wang3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#include "_libdwarf.h"2829ELFTC_VCSID("$Id: dwarf_attr.c 3064 2014-06-06 19:35:55Z kaiwang27 $");3031int32dwarf_attr(Dwarf_Die die, Dwarf_Half attr, Dwarf_Attribute *atp,33Dwarf_Error *error)34{35Dwarf_Debug dbg;36Dwarf_Attribute at;3738dbg = die != NULL ? die->die_dbg : NULL;3940if (die == NULL || atp == NULL) {41DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);42return (DW_DLV_ERROR);43}4445if ((at = _dwarf_attr_find(die, attr)) == NULL) {46DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);47return (DW_DLV_NO_ENTRY);48}4950*atp = at;5152return (DW_DLV_OK);53}5455int56dwarf_attrlist(Dwarf_Die die, Dwarf_Attribute **attrbuf,57Dwarf_Signed *attrcount, Dwarf_Error *error)58{59Dwarf_Attribute at;60Dwarf_Debug dbg;61int i;6263dbg = die != NULL ? die->die_dbg : NULL;6465if (die == NULL || attrbuf == NULL || attrcount == NULL) {66DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);67return (DW_DLV_ERROR);68}6970if (die->die_ab->ab_atnum == 0) {71DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);72return (DW_DLV_NO_ENTRY);73}7475*attrcount = die->die_ab->ab_atnum;7677if (die->die_attrarray != NULL) {78*attrbuf = die->die_attrarray;79return (DW_DLV_OK);80}8182if ((die->die_attrarray = malloc(*attrcount * sizeof(Dwarf_Attribute)))83== NULL) {84DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);85return (DW_DLV_ERROR);86}8788for (i = 0, at = STAILQ_FIRST(&die->die_attr);89i < *attrcount && at != NULL; i++, at = STAILQ_NEXT(at, at_next))90die->die_attrarray[i] = at;9192*attrbuf = die->die_attrarray;9394return (DW_DLV_OK);95}9697int98dwarf_hasattr(Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *ret_bool,99Dwarf_Error *error)100{101Dwarf_Debug dbg;102103dbg = die != NULL ? die->die_dbg : NULL;104105if (die == NULL || ret_bool == NULL) {106DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);107return (DW_DLV_ERROR);108}109110*ret_bool = (_dwarf_attr_find(die, attr) != NULL);111112return (DW_DLV_OK);113}114115int116dwarf_attroffset(Dwarf_Attribute at, Dwarf_Off *ret_off, Dwarf_Error *error)117{118Dwarf_Debug dbg;119120dbg = at != NULL ? at->at_die->die_dbg : NULL;121122if (at == NULL || ret_off == NULL) {123DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);124return (DW_DLV_ERROR);125}126127*ret_off = at->at_offset;128129return (DW_DLV_OK);130}131132int133dwarf_lowpc(Dwarf_Die die, Dwarf_Addr *ret_lowpc, Dwarf_Error *error)134{135Dwarf_Attribute at;136Dwarf_Debug dbg;137138dbg = die != NULL ? die->die_dbg : NULL;139140if (die == NULL || ret_lowpc == NULL) {141DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);142return (DW_DLV_ERROR);143}144145if ((at = _dwarf_attr_find(die, DW_AT_low_pc)) == NULL) {146DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);147return (DW_DLV_NO_ENTRY);148}149150*ret_lowpc = at->u[0].u64;151152return (DW_DLV_OK);153}154155int156dwarf_highpc(Dwarf_Die die, Dwarf_Addr *ret_highpc, Dwarf_Error *error)157{158159return (dwarf_highpc_b(die, ret_highpc, NULL, NULL, error));160}161162int163dwarf_highpc_b(Dwarf_Die die, Dwarf_Addr *ret_highpc, Dwarf_Half *ret_form,164enum Dwarf_Form_Class *ret_class, Dwarf_Error *error)165{166Dwarf_Attribute at;167Dwarf_Debug dbg;168Dwarf_CU cu;169170dbg = die != NULL ? die->die_dbg : NULL;171172if (die == NULL || ret_highpc == NULL) {173DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);174return (DW_DLV_ERROR);175}176177if ((at = _dwarf_attr_find(die, DW_AT_high_pc)) == NULL) {178DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);179return (DW_DLV_NO_ENTRY);180}181182*ret_highpc = at->u[0].u64;183184if (ret_form != NULL) {185*ret_form = at->at_form;186}187188if (ret_class != NULL) {189cu = die->die_cu;190*ret_class = dwarf_get_form_class(cu->cu_version,191DW_AT_high_pc, cu->cu_length_size == 4 ? 4 : 8,192at->at_form);193}194195return (DW_DLV_OK);196}197198int199dwarf_bytesize(Dwarf_Die die, Dwarf_Unsigned *ret_size, Dwarf_Error *error)200{201Dwarf_Attribute at;202Dwarf_Debug dbg;203204dbg = die != NULL ? die->die_dbg : NULL;205206if (die == NULL || ret_size == NULL) {207DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);208return (DW_DLV_ERROR);209}210211if ((at = _dwarf_attr_find(die, DW_AT_byte_size)) == NULL) {212DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);213return (DW_DLV_NO_ENTRY);214}215216*ret_size = at->u[0].u64;217218return (DW_DLV_OK);219}220221int222dwarf_bitsize(Dwarf_Die die, Dwarf_Unsigned *ret_size, Dwarf_Error *error)223{224Dwarf_Attribute at;225Dwarf_Debug dbg;226227dbg = die != NULL ? die->die_dbg : NULL;228229if (die == NULL || ret_size == NULL) {230DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);231return (DW_DLV_ERROR);232}233234if ((at = _dwarf_attr_find(die, DW_AT_bit_size)) == NULL) {235DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);236return (DW_DLV_NO_ENTRY);237}238239*ret_size = at->u[0].u64;240241return (DW_DLV_OK);242}243244int245dwarf_bitoffset(Dwarf_Die die, Dwarf_Unsigned *ret_size, Dwarf_Error *error)246{247Dwarf_Attribute at;248Dwarf_Debug dbg;249250dbg = die != NULL ? die->die_dbg : NULL;251252if (die == NULL || ret_size == NULL) {253DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);254return (DW_DLV_ERROR);255}256257if ((at = _dwarf_attr_find(die, DW_AT_bit_offset)) == NULL) {258DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);259return (DW_DLV_NO_ENTRY);260}261262*ret_size = at->u[0].u64;263264return (DW_DLV_OK);265}266267int268dwarf_srclang(Dwarf_Die die, Dwarf_Unsigned *ret_lang, Dwarf_Error *error)269{270Dwarf_Attribute at;271Dwarf_Debug dbg;272273dbg = die != NULL ? die->die_dbg : NULL;274275if (die == NULL || ret_lang == NULL) {276DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);277return (DW_DLV_ERROR);278}279280if ((at = _dwarf_attr_find(die, DW_AT_language)) == NULL) {281DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);282return (DW_DLV_NO_ENTRY);283}284285*ret_lang = at->u[0].u64;286287return (DW_DLV_OK);288}289290int291dwarf_arrayorder(Dwarf_Die die, Dwarf_Unsigned *ret_order, Dwarf_Error *error)292{293Dwarf_Attribute at;294Dwarf_Debug dbg;295296dbg = die != NULL ? die->die_dbg : NULL;297298if (die == NULL || ret_order == NULL) {299DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);300return (DW_DLV_ERROR);301}302303if ((at = _dwarf_attr_find(die, DW_AT_ordering)) == NULL) {304DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);305return (DW_DLV_NO_ENTRY);306}307308*ret_order = at->u[0].u64;309310return (DW_DLV_OK);311}312313314