Home | History | Annotate | Line # | Download | only in libdwarf
dwarf_ranges.c revision 1.1.1.2
      1 /*	$NetBSD: dwarf_ranges.c,v 1.1.1.2 2016/02/20 02:42:00 christos Exp $	*/
      2 /*-
      3  * Copyright (c) 2009,2011 Kai Wang
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25  * SUCH DAMAGE.
     26  */
     27 
     28 #include "_libdwarf.h"
     29 
     30 __RCSID("$NetBSD: dwarf_ranges.c,v 1.1.1.2 2016/02/20 02:42:00 christos Exp $");
     31 ELFTC_VCSID("Id: dwarf_ranges.c 3029 2014-04-21 23:26:02Z kaiwang27 ");
     32 
     33 static int
     34 _dwarf_get_ranges(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Off off,
     35     Dwarf_Ranges **ranges, Dwarf_Signed *ret_cnt, Dwarf_Unsigned *ret_byte_cnt,
     36     Dwarf_Error *error)
     37 {
     38 	Dwarf_Rangelist rl;
     39 	int ret;
     40 
     41 	assert(cu != NULL);
     42 	if (_dwarf_ranges_find(dbg, off, &rl) == DW_DLE_NO_ENTRY) {
     43 		ret = _dwarf_ranges_add(dbg, cu, off, &rl, error);
     44 		if (ret != DW_DLE_NONE)
     45 			return (DW_DLV_ERROR);
     46 	}
     47 
     48 	*ranges = rl->rl_rgarray;
     49 	*ret_cnt = rl->rl_rglen;
     50 
     51 	if (ret_byte_cnt != NULL)
     52 		*ret_byte_cnt = cu->cu_pointer_size * rl->rl_rglen * 2;
     53 
     54 	return (DW_DLV_OK);
     55 }
     56 
     57 int
     58 dwarf_get_ranges(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Ranges **ranges,
     59     Dwarf_Signed *ret_cnt, Dwarf_Unsigned *ret_byte_cnt, Dwarf_Error *error)
     60 {
     61 
     62 	if (dbg == NULL || ranges == NULL || ret_cnt == NULL) {
     63 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
     64 		return (DW_DLV_ERROR);
     65 	}
     66 
     67 	if (!dbg->dbg_info_loaded) {
     68 		if (_dwarf_info_load(dbg, 1, 1, error) != DW_DLE_NONE)
     69 			return (DW_DLV_ERROR);
     70 	}
     71 
     72 	return (_dwarf_get_ranges(dbg, STAILQ_FIRST(&dbg->dbg_cu), offset,
     73 	    ranges, ret_cnt, ret_byte_cnt, error));
     74 }
     75 
     76 int
     77 dwarf_get_ranges_a(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die die,
     78     Dwarf_Ranges **ranges, Dwarf_Signed *ret_cnt, Dwarf_Unsigned *ret_byte_cnt,
     79     Dwarf_Error *error)
     80 {
     81 
     82 	if (dbg == NULL || die == NULL || ranges == NULL || ret_cnt == NULL) {
     83 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
     84 		return (DW_DLV_ERROR);
     85 	}
     86 
     87 	return (_dwarf_get_ranges(dbg, die->die_cu, offset, ranges, ret_cnt,
     88 	    ret_byte_cnt, error));
     89 }
     90