1 /* Return reference offset represented by attribute. 2 Copyright (C) 2003 Red Hat, Inc. 3 Written by Ulrich Drepper <drepper (at) redhat.com>, 2003. 4 5 This program is Open Source software; you can redistribute it and/or 6 modify it under the terms of the Open Software License version 1.0 as 7 published by the Open Source Initiative. 8 9 You should have received a copy of the Open Software License along 10 with this program; if not, you may obtain a copy of the Open Software 11 License version 1.0 from http://www.opensource.org/licenses/osl.php or 12 by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 13 3001 King Ranch Road, Ukiah, CA 95482. */ 14 15 #ifdef HAVE_CONFIG_H 16 # include <config.h> 17 #endif 18 19 #include <dwarf.h> 20 #include "libdwP.h" 21 22 23 int 24 dwarf_formref (attr, return_offset) 25 Dwarf_Attribute *attr; 26 Dwarf_Off *return_offset; 27 { 28 if (attr == NULL) 29 return -1; 30 31 unsigned int u128; 32 unsigned char *datap; 33 34 switch (attr->form) 35 { 36 case DW_FORM_ref1: 37 *return_offset = *attr->valp; 38 break; 39 40 case DW_FORM_ref2: 41 *return_offset = read_2ubyte_unaligned (attr->cu->dbg, attr->valp); 42 break; 43 44 case DW_FORM_ref4: 45 *return_offset = read_4ubyte_unaligned (attr->cu->dbg, attr->valp); 46 break; 47 48 case DW_FORM_ref8: 49 *return_offset = read_8ubyte_unaligned (attr->cu->dbg, attr->valp); 50 break; 51 52 case DW_FORM_ref_udata: 53 datap = attr->valp; 54 get_uleb128 (u128, datap); 55 *return_offset = u128; 56 break; 57 58 case DW_FORM_ref_addr: 59 __libdw_seterrno (DWARF_E_INVALID_REFERENCE); 60 return -1; 61 62 default: 63 __libdw_seterrno (DWARF_E_NO_REFERENCE); 64 return -1; 65 } 66 67 return 0; 68 } 69