blob: a717d2366b03a536af79d966714bf71089979f96 [file] [log] [blame]
/* 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