blob: 16ea7b7ab31cf242b6573096943efbface28f0c2 [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Return .debug_info section global offset of reference associated with form.
2 Copyright (C) 2000, 2002 Red Hat, Inc.
3 Written by Ulrich Drepper <drepper@redhat.com>, 2000.
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
21#include <libdwarfP.h>
22
23
24int
25dwarf_global_formref (attr, return_offset, error)
26 Dwarf_Attribute attr;
27 Dwarf_Off *return_offset;
28 Dwarf_Error *error;
29{
30 switch (attr->form)
31 {
32 case DW_FORM_ref1:
33 *return_offset = *attr->valp + attr->cu->offset;
34 break;
35
36 case DW_FORM_ref2:
37 *return_offset = (read_2ubyte_unaligned (attr->cu->dbg, attr->valp)
38 + attr->cu->offset);
39 break;
40
41 case DW_FORM_ref4:
42 *return_offset = (read_4ubyte_unaligned (attr->cu->dbg, attr->valp)
43 + attr->cu->offset);
44 break;
45
46 case DW_FORM_ref8:
47 *return_offset = (read_8ubyte_unaligned (attr->cu->dbg, attr->valp)
48 + attr->cu->offset);
49 break;
50
51 case DW_FORM_ref_udata:
52 {
53 Dwarf_Off off;
54 Dwarf_Small *attrp = attr->valp;
55 get_uleb128 (off, attrp);
56 *return_offset = off + attr->cu->offset;
57 }
58 break;
59
60 case DW_FORM_ref_addr:
61 if (attr->cu->address_size == 4)
62 *return_offset = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
63 else
64 *return_offset = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
65 break;
66
67 default:
68 __libdwarf_error (attr->cu->dbg, error, DW_E_NO_REFERENCE);
69 return DW_DLV_ERROR;
70 }
71
72 return DW_DLV_OK;
73}