• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Return block represented by attribute.
2    Copyright (C) 2004 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
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
dwarf_formblock(attr,return_block)24 dwarf_formblock (attr, return_block)
25      Dwarf_Attribute *attr;
26      Dwarf_Block *return_block;
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_block1:
37       return_block->length = *(uint8_t *) attr->valp;
38       return_block->data = attr->valp + 1;
39       break;
40 
41     case DW_FORM_block2:
42       return_block->length = read_2ubyte_unaligned (attr->cu->dbg, attr->valp);
43       return_block->data = attr->valp + 2;
44       break;
45 
46     case DW_FORM_block4:
47       return_block->length = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
48       return_block->data = attr->valp + 4;
49       break;
50 
51     case DW_FORM_block:
52       datap = attr->valp;
53       get_uleb128 (u128, datap);
54       return_block->length = u128;
55       return_block->data = datap;
56       break;
57 
58     default:
59       __libdw_seterrno (DWARF_E_NO_BLOCK);
60       return -1;
61     }
62 
63   if (return_block->data + return_block->length
64       > ((unsigned char *) attr->cu->dbg->sectiondata[IDX_debug_info]->d_buf
65 	 + attr->cu->dbg->sectiondata[IDX_debug_info]->d_size))
66     {
67       /* Block does not fit.  */
68       __libdw_seterrno (DWARF_E_INVALID_DWARF);
69       return -1;
70     }
71 
72   return 0;
73 }
74