blob: 4fbc6f70ef5155620e541031e7fb9db38a206866 [file] [log] [blame]
/* Low-level checking of .debug_loc and .debug_range.
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/>. */
#include "checks.hh"
#include "sections_i.hh"
#include "check_debug_info_i.hh"
#include "messages.hh"
#include "coverage.hh"
#include "dwarf_version_i.hh"
class loc_range_locus
: public locus
{
locus const &_m_refby;
Dwarf_Off _m_offset;
section_id _m_sec;
public:
loc_range_locus (section_id sec, locus const &refby, Dwarf_Off offset = -1)
: _m_refby (refby)
, _m_offset (offset)
, _m_sec ((assert (sec == sec_loc || sec == sec_ranges), sec))
{}
std::string format (bool brief) const;
};
struct section_coverage
{
struct sec *sec;
struct coverage cov;
bool hit; /* true if COV is not pristine. */
bool warn; /* dwarflint should emit a warning if a coverage appears
in this section */
section_coverage (struct sec *a_sec, bool a_warn);
};
struct coverage_map
{
struct elf_file *elf;
std::vector<section_coverage> scos;
size_t size;
size_t alloc;
bool allow_overlap;
};
class check_debug_ranges
: public check<check_debug_ranges>
{
section<sec_ranges> *_m_sec_ranges;
check_debug_info *_m_info;
coverage _m_cov;
public:
static checkdescriptor const *descriptor ();
coverage const &cov () const { return _m_cov; }
check_debug_ranges (checkstack &stack, dwarflint &lint);
};
class check_debug_loc
: public check<check_debug_loc>
{
section<sec_loc> *_m_sec_loc;
check_debug_info *_m_info;
public:
static checkdescriptor const *descriptor ();
check_debug_loc (checkstack &stack, dwarflint &lint);
};
struct hole_info
{
enum section_id section;
enum message_category category;
void *data;
unsigned align;
};
/* DATA has to be a pointer to an instance of struct hole_info.
DATA->data has to point at d_buf of section in question. */
bool found_hole (uint64_t start, uint64_t length, void *data);
bool check_location_expression (dwarf_version const *ver,
elf_file const &file,
struct read_ctx *parent_ctx,
struct cu *cu,
uint64_t init_off,
struct relocation_data *reloc,
size_t length,
locus const &loc);
void check_range_relocations (locus const &loc,
enum message_category cat,
struct elf_file const *file,
GElf_Sym *begin_symbol,
GElf_Sym *end_symbol,
const char *description);