1*2de3b87aSKai Wang /*- 2*2de3b87aSKai Wang * Copyright (c) 2010 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_pro_lineno.c 2973 2013-12-23 06:46:16Z kaiwang27 $"); 30*2de3b87aSKai Wang 31*2de3b87aSKai Wang Dwarf_Unsigned 32*2de3b87aSKai Wang dwarf_add_line_entry(Dwarf_P_Debug dbg, Dwarf_Unsigned file, 33*2de3b87aSKai Wang Dwarf_Addr off, Dwarf_Unsigned lineno, Dwarf_Signed column, 34*2de3b87aSKai Wang Dwarf_Bool is_stmt, Dwarf_Bool basic_block, Dwarf_Error *error) 35*2de3b87aSKai Wang { 36*2de3b87aSKai Wang Dwarf_LineInfo li; 37*2de3b87aSKai Wang Dwarf_Line ln; 38*2de3b87aSKai Wang 39*2de3b87aSKai Wang if (dbg == NULL) { 40*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 41*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 42*2de3b87aSKai Wang } 43*2de3b87aSKai Wang 44*2de3b87aSKai Wang li = dbg->dbgp_lineinfo; 45*2de3b87aSKai Wang 46*2de3b87aSKai Wang ln = STAILQ_LAST(&li->li_lnlist, _Dwarf_Line, ln_next); 47*2de3b87aSKai Wang 48*2de3b87aSKai Wang if (ln == NULL || ln->ln_addr > off) { 49*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 50*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 51*2de3b87aSKai Wang } 52*2de3b87aSKai Wang 53*2de3b87aSKai Wang if ((ln = calloc(1, sizeof(struct _Dwarf_Line))) == NULL) { 54*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 55*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 56*2de3b87aSKai Wang } 57*2de3b87aSKai Wang ln->ln_li = li; 58*2de3b87aSKai Wang ln->ln_addr = off; 59*2de3b87aSKai Wang ln->ln_symndx = 0; 60*2de3b87aSKai Wang ln->ln_fileno = file; 61*2de3b87aSKai Wang ln->ln_lineno = lineno; 62*2de3b87aSKai Wang ln->ln_column = column; 63*2de3b87aSKai Wang ln->ln_bblock = basic_block != 0; 64*2de3b87aSKai Wang ln->ln_stmt = is_stmt != 0; 65*2de3b87aSKai Wang ln->ln_endseq = 0; 66*2de3b87aSKai Wang STAILQ_INSERT_TAIL(&li->li_lnlist, ln, ln_next); 67*2de3b87aSKai Wang li->li_lnlen++; 68*2de3b87aSKai Wang 69*2de3b87aSKai Wang return (DW_DLV_OK); 70*2de3b87aSKai Wang } 71*2de3b87aSKai Wang 72*2de3b87aSKai Wang Dwarf_Unsigned 73*2de3b87aSKai Wang dwarf_lne_set_address(Dwarf_P_Debug dbg, Dwarf_Addr offs, Dwarf_Unsigned symndx, 74*2de3b87aSKai Wang Dwarf_Error *error) 75*2de3b87aSKai Wang { 76*2de3b87aSKai Wang Dwarf_LineInfo li; 77*2de3b87aSKai Wang Dwarf_Line ln; 78*2de3b87aSKai Wang 79*2de3b87aSKai Wang if (dbg == NULL || symndx == 0) { 80*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 81*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 82*2de3b87aSKai Wang } 83*2de3b87aSKai Wang 84*2de3b87aSKai Wang li = dbg->dbgp_lineinfo; 85*2de3b87aSKai Wang 86*2de3b87aSKai Wang if ((ln = calloc(1, sizeof(struct _Dwarf_Line))) == NULL) { 87*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 88*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 89*2de3b87aSKai Wang } 90*2de3b87aSKai Wang ln->ln_li = li; 91*2de3b87aSKai Wang ln->ln_addr = offs; 92*2de3b87aSKai Wang ln->ln_symndx = symndx; 93*2de3b87aSKai Wang STAILQ_INSERT_TAIL(&li->li_lnlist, ln, ln_next); 94*2de3b87aSKai Wang li->li_lnlen++; 95*2de3b87aSKai Wang 96*2de3b87aSKai Wang return (DW_DLV_OK); 97*2de3b87aSKai Wang } 98*2de3b87aSKai Wang 99*2de3b87aSKai Wang Dwarf_Unsigned 100*2de3b87aSKai Wang dwarf_lne_end_sequence(Dwarf_P_Debug dbg, Dwarf_Addr addr, Dwarf_Error *error) 101*2de3b87aSKai Wang { 102*2de3b87aSKai Wang Dwarf_LineInfo li; 103*2de3b87aSKai Wang Dwarf_Line ln; 104*2de3b87aSKai Wang 105*2de3b87aSKai Wang if (dbg == NULL) { 106*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 107*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 108*2de3b87aSKai Wang } 109*2de3b87aSKai Wang 110*2de3b87aSKai Wang li = dbg->dbgp_lineinfo; 111*2de3b87aSKai Wang 112*2de3b87aSKai Wang ln = STAILQ_LAST(&li->li_lnlist, _Dwarf_Line, ln_next); 113*2de3b87aSKai Wang if (ln && ln->ln_addr >= addr) { 114*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 115*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 116*2de3b87aSKai Wang } 117*2de3b87aSKai Wang 118*2de3b87aSKai Wang if ((ln = calloc(1, sizeof(struct _Dwarf_Line))) == NULL) { 119*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 120*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 121*2de3b87aSKai Wang } 122*2de3b87aSKai Wang ln->ln_li = li; 123*2de3b87aSKai Wang ln->ln_addr = addr; 124*2de3b87aSKai Wang ln->ln_endseq = 1; 125*2de3b87aSKai Wang STAILQ_INSERT_TAIL(&li->li_lnlist, ln, ln_next); 126*2de3b87aSKai Wang li->li_lnlen++; 127*2de3b87aSKai Wang 128*2de3b87aSKai Wang return (DW_DLV_OK); 129*2de3b87aSKai Wang } 130*2de3b87aSKai Wang 131*2de3b87aSKai Wang Dwarf_Unsigned 132*2de3b87aSKai Wang dwarf_add_directory_decl(Dwarf_P_Debug dbg, char *name, Dwarf_Error *error) 133*2de3b87aSKai Wang { 134*2de3b87aSKai Wang Dwarf_LineInfo li; 135*2de3b87aSKai Wang 136*2de3b87aSKai Wang if (dbg == NULL || name == NULL || strlen(name) == 0) { 137*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 138*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 139*2de3b87aSKai Wang } 140*2de3b87aSKai Wang 141*2de3b87aSKai Wang li = dbg->dbgp_lineinfo; 142*2de3b87aSKai Wang 143*2de3b87aSKai Wang li->li_incdirs = realloc(li->li_incdirs, (li->li_inclen + 1) * 144*2de3b87aSKai Wang sizeof(char *)); 145*2de3b87aSKai Wang if (li->li_incdirs == NULL) { 146*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 147*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 148*2de3b87aSKai Wang } 149*2de3b87aSKai Wang if ((li->li_incdirs[li->li_inclen] = strdup(name)) == NULL) { 150*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 151*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 152*2de3b87aSKai Wang } 153*2de3b87aSKai Wang 154*2de3b87aSKai Wang return (++li->li_inclen); 155*2de3b87aSKai Wang } 156*2de3b87aSKai Wang 157*2de3b87aSKai Wang Dwarf_Unsigned 158*2de3b87aSKai Wang dwarf_add_file_decl(Dwarf_P_Debug dbg, char *name, Dwarf_Unsigned dirndx, 159*2de3b87aSKai Wang Dwarf_Unsigned mtime, Dwarf_Unsigned size, Dwarf_Error *error) 160*2de3b87aSKai Wang { 161*2de3b87aSKai Wang Dwarf_LineInfo li; 162*2de3b87aSKai Wang Dwarf_LineFile lf; 163*2de3b87aSKai Wang 164*2de3b87aSKai Wang if (dbg == NULL || name == NULL || strlen(name) == 0) { 165*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 166*2de3b87aSKai Wang return (DW_DLV_NOCOUNT); 167*2de3b87aSKai Wang } 168*2de3b87aSKai Wang 169*2de3b87aSKai Wang li = dbg->dbgp_lineinfo; 170*2de3b87aSKai Wang 171*2de3b87aSKai Wang if ((lf = malloc(sizeof(struct _Dwarf_LineFile))) == NULL) { 172*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 173*2de3b87aSKai Wang return (DW_DLE_MEMORY); 174*2de3b87aSKai Wang } 175*2de3b87aSKai Wang 176*2de3b87aSKai Wang if ((lf->lf_fname = strdup(name)) == NULL) { 177*2de3b87aSKai Wang free(lf); 178*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 179*2de3b87aSKai Wang return (DW_DLE_MEMORY); 180*2de3b87aSKai Wang } 181*2de3b87aSKai Wang lf->lf_dirndx = dirndx; 182*2de3b87aSKai Wang lf->lf_mtime = mtime; 183*2de3b87aSKai Wang lf->lf_size = size; 184*2de3b87aSKai Wang STAILQ_INSERT_TAIL(&li->li_lflist, lf, lf_next); 185*2de3b87aSKai Wang 186*2de3b87aSKai Wang return (++li->li_lflen); 187*2de3b87aSKai Wang } 188