1260684Skaiw/*- 2260684Skaiw * Copyright (c) 2009 Kai Wang 3260684Skaiw * All rights reserved. 4260684Skaiw * 5260684Skaiw * Redistribution and use in source and binary forms, with or without 6260684Skaiw * modification, are permitted provided that the following conditions 7260684Skaiw * are met: 8260684Skaiw * 1. Redistributions of source code must retain the above copyright 9260684Skaiw * notice, this list of conditions and the following disclaimer. 10260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright 11260684Skaiw * notice, this list of conditions and the following disclaimer in the 12260684Skaiw * documentation and/or other materials provided with the distribution. 13260684Skaiw * 14260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17260684Skaiw * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24260684Skaiw * SUCH DAMAGE. 25260684Skaiw */ 26260684Skaiw 27260684Skaiw#include "_libdwarf.h" 28260684Skaiw 29260684SkaiwELFTC_VCSID("$Id: dwarf_pro_die.c 2074 2011-10-27 03:34:33Z jkoshy $"); 30260684Skaiw 31260684SkaiwDwarf_Unsigned 32260684Skaiwdwarf_add_die_to_debug(Dwarf_P_Debug dbg, Dwarf_P_Die first_die, 33260684Skaiw Dwarf_Error *error) 34260684Skaiw{ 35260684Skaiw 36260684Skaiw if (dbg == NULL || first_die == NULL) { 37260684Skaiw DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 38260684Skaiw return (DW_DLV_NOCOUNT); 39260684Skaiw } 40260684Skaiw 41260684Skaiw dbg->dbgp_root_die = first_die; 42260684Skaiw 43260684Skaiw return (DW_DLV_OK); 44260684Skaiw} 45260684Skaiw 46260684SkaiwDwarf_P_Die 47260684Skaiwdwarf_new_die(Dwarf_P_Debug dbg, Dwarf_Tag new_tag, 48260684Skaiw Dwarf_P_Die parent, Dwarf_P_Die child, Dwarf_P_Die left_sibling, 49260684Skaiw Dwarf_P_Die right_sibling, Dwarf_Error *error) 50260684Skaiw{ 51260684Skaiw Dwarf_P_Die die; 52260684Skaiw int count; 53260684Skaiw 54260684Skaiw if (dbg == NULL) { 55260684Skaiw DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 56260684Skaiw return (DW_DLV_BADADDR); 57260684Skaiw } 58260684Skaiw 59260684Skaiw count = _dwarf_die_count_links(parent, child, left_sibling, 60260684Skaiw right_sibling); 61260684Skaiw 62260684Skaiw if (count > 1) { 63260684Skaiw DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 64260684Skaiw return (DW_DLV_BADADDR); 65260684Skaiw } 66260684Skaiw 67260684Skaiw if (_dwarf_die_alloc(dbg, &die, error) != DW_DLE_NONE) 68260684Skaiw return (DW_DLV_BADADDR); 69260684Skaiw 70260684Skaiw die->die_dbg = dbg; 71260684Skaiw die->die_tag = new_tag; 72260684Skaiw 73260684Skaiw STAILQ_INSERT_TAIL(&dbg->dbgp_dielist, die, die_pro_next); 74260684Skaiw 75260684Skaiw if (count == 0) 76260684Skaiw return (die); 77260684Skaiw 78260684Skaiw _dwarf_die_link(die, parent, child, left_sibling, right_sibling); 79260684Skaiw 80260684Skaiw return (die); 81260684Skaiw} 82260684Skaiw 83260684SkaiwDwarf_P_Die 84260684Skaiwdwarf_die_link(Dwarf_P_Die die, Dwarf_P_Die parent, 85260684Skaiw Dwarf_P_Die child, Dwarf_P_Die left_sibling, Dwarf_P_Die right_sibling, 86260684Skaiw Dwarf_Error *error) 87260684Skaiw{ 88260684Skaiw Dwarf_Debug dbg; 89260684Skaiw int count; 90260684Skaiw 91260684Skaiw 92260684Skaiw if (die == NULL) { 93260684Skaiw DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 94260684Skaiw return (DW_DLV_BADADDR); 95260684Skaiw } 96260684Skaiw 97260684Skaiw dbg = die->die_dbg; 98260684Skaiw count = _dwarf_die_count_links(parent, child, left_sibling, 99260684Skaiw right_sibling); 100260684Skaiw 101260684Skaiw if (count > 1) { 102260684Skaiw DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 103260684Skaiw return (DW_DLV_BADADDR); 104260684Skaiw } else if (count == 0) 105260684Skaiw return (die); 106260684Skaiw 107260684Skaiw _dwarf_die_link(die, parent, child, left_sibling, right_sibling); 108260684Skaiw 109260684Skaiw return (die); 110260684Skaiw} 111