summaryrefslogtreecommitdiffstats
path: root/dwarflint/addr-record.hh
blob: a717d2366b03a536af79d966714bf71089979f96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* Pedantic checking of DWARF files
   Copyright (C) 2009,2010,2011 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef DWARFLINT_ADDR_RECORD_H
#define DWARFLINT_ADDR_RECORD_H

#include <stdlib.h>
#include <stdint.h>
#include <vector>

#include "locus.hh"

/// Address record is used to check that all DIE references actually
/// point to an existing die, not somewhere mid-DIE, where it just
/// happens to be interpretable as a DIE.  This is stored as sorted
/// array for quick lookup and duplicate removal.
struct addr_record
  : private std::vector<uint64_t>
{
  typedef std::vector<uint64_t> _super_t;
  size_t find (uint64_t addr) const;

public:
  bool has_addr (uint64_t addr) const;
  void add (uint64_t addr);
};

/// One reference for use in ref_record, parametrized by locus type.
template <class L>
struct ref_T
{
  uint64_t addr; // Referee address
  L who;         // Referrer

  ref_T ()
    : addr (-1)
  {}

  ref_T (uint64_t a_addr, L const &a_who)
    : addr (a_addr)
    , who (a_who)
  {}
};

/// Reference record is used to check validity of DIE references.
/// Unlike the above, this is not stored as sorted set, but simply as
/// an array of records, because duplicates are unlikely.
template <class L>
class ref_record_T
  : private std::vector<ref_T<L> >
{
  typedef std::vector<ref_T<L> > _super_t;
public:
  using _super_t::const_iterator;
  using _super_t::begin;
  using _super_t::end;
  using _super_t::push_back;
};

#endif//DWARFLINT_ADDR_RECORD_H