From 46ac77f4ae6bc115a9812847080ede8d67d05231 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Wed, 21 Oct 2009 21:28:12 +0200 Subject: [PATCH] dwarflint: Move addr_record stuff to file of its own --- src/Makefile.am | 1 + src/dwarflint/addr-record.cc | 58 +++++++++++++++++++++++++++++++ src/dwarflint/addr-record.h | 34 ++++++++++++++++++ src/dwarflint/low.c | 67 ------------------------------------ src/dwarflint/low.h | 8 +---- 5 files changed, 94 insertions(+), 74 deletions(-) create mode 100644 src/dwarflint/addr-record.cc create mode 100644 src/dwarflint/addr-record.h diff --git a/src/Makefile.am b/src/Makefile.am index 31dc8a945..19eb6982f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -89,6 +89,7 @@ dwarflint_SOURCES = dwarfstrings.c \ dwarflint/config.cc dwarflint/config.h \ dwarflint/checks.cc dwarflint/checks.hh \ dwarflint/checks-low.cc dwarflint/checks-low.hh \ + dwarflint/addr-record.cc dwarflint/addr-record.h \ dwarflint/checks-high.hh \ dwarflint/check_matching_ranges.cc \ dwarflint/check_range_out_of_scope.cc \ diff --git a/src/dwarflint/addr-record.cc b/src/dwarflint/addr-record.cc new file mode 100644 index 000000000..6eb4dac7f --- /dev/null +++ b/src/dwarflint/addr-record.cc @@ -0,0 +1,58 @@ +#include "addr-record.h" +#include "misc.h" + +size_t +addr_record_find_addr (struct addr_record *ar, uint64_t addr) +{ + size_t a = 0; + size_t b = ar->size; + + while (a < b) + { + size_t i = (a + b) / 2; + uint64_t v = ar->addrs[i]; + + if (v > addr) + b = i; + else if (v < addr) + a = i + 1; + else + return i; + } + + return a; +} + +bool +addr_record_has_addr (struct addr_record *ar, uint64_t addr) +{ + if (ar->size == 0 + || addr < ar->addrs[0] + || addr > ar->addrs[ar->size - 1]) + return false; + + size_t a = addr_record_find_addr (ar, addr); + return a < ar->size && ar->addrs[a] == addr; +} + +void +addr_record_add (struct addr_record *ar, uint64_t addr) +{ + size_t a = addr_record_find_addr (ar, addr); + if (a >= ar->size || ar->addrs[a] != addr) + { + REALLOC (ar, addrs); + size_t len = ar->size - a; + memmove (ar->addrs + a + 1, ar->addrs + a, len * sizeof (*ar->addrs)); + + ar->addrs[a] = addr; + ar->size++; + } +} + +void +addr_record_free (struct addr_record *ar) +{ + if (ar != NULL) + free (ar->addrs); +} diff --git a/src/dwarflint/addr-record.h b/src/dwarflint/addr-record.h new file mode 100644 index 000000000..95185ffd2 --- /dev/null +++ b/src/dwarflint/addr-record.h @@ -0,0 +1,34 @@ +#ifndef DWARFLINT_ADDR_RECORD_H +#define DWARFLINT_ADDR_RECORD_H + +#include +#include +#ifdef __cplusplus +extern "C" +{ +#else +# include +#endif + +/* Functions and data structures for address record handling. We use + that 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. */ + +struct addr_record +{ + size_t size; + size_t alloc; + uint64_t *addrs; +}; + +size_t addr_record_find_addr (struct addr_record *ar, uint64_t addr); +bool addr_record_has_addr (struct addr_record *ar, uint64_t addr); +void addr_record_add (struct addr_record *ar, uint64_t addr); +void addr_record_free (struct addr_record *ar); + +#ifdef __cplusplus +} +#endif + +#endif//DWARFLINT_ADDR_RECORD_H diff --git a/src/dwarflint/low.c b/src/dwarflint/low.c index c7487b985..e85e03540 100644 --- a/src/dwarflint/low.c +++ b/src/dwarflint/low.c @@ -69,16 +69,6 @@ check_category (enum message_category cat) /* Functions and data structures related to raw (i.e. unassisted by libdw) Dwarf abbreviation handling. */ -/* Functions and data structures for address record handling. We use - that 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. */ - -static size_t addr_record_find_addr (struct addr_record *ar, uint64_t addr); -static bool addr_record_has_addr (struct addr_record *ar, uint64_t addr); -static void addr_record_add (struct addr_record *ar, uint64_t addr); -static void addr_record_free (struct addr_record *ar); - /* Functions and data structures for reference handling. Just like the above, we use this to check validity of DIE references. Unlike @@ -610,63 +600,6 @@ abbrev_table_find_abbrev (struct abbrev_table *abbrevs, uint64_t abbrev_code) return NULL; } -static size_t -addr_record_find_addr (struct addr_record *ar, uint64_t addr) -{ - size_t a = 0; - size_t b = ar->size; - - while (a < b) - { - size_t i = (a + b) / 2; - uint64_t v = ar->addrs[i]; - - if (v > addr) - b = i; - else if (v < addr) - a = i + 1; - else - return i; - } - - return a; -} - -static bool -addr_record_has_addr (struct addr_record *ar, uint64_t addr) -{ - if (ar->size == 0 - || addr < ar->addrs[0] - || addr > ar->addrs[ar->size - 1]) - return false; - - size_t a = addr_record_find_addr (ar, addr); - return a < ar->size && ar->addrs[a] == addr; -} - -static void -addr_record_add (struct addr_record *ar, uint64_t addr) -{ - size_t a = addr_record_find_addr (ar, addr); - if (a >= ar->size || ar->addrs[a] != addr) - { - REALLOC (ar, addrs); - size_t len = ar->size - a; - memmove (ar->addrs + a + 1, ar->addrs + a, len * sizeof (*ar->addrs)); - - ar->addrs[a] = addr; - ar->size++; - } -} - -static void -addr_record_free (struct addr_record *ar) -{ - if (ar != NULL) - free (ar->addrs); -} - - static void ref_record_add (struct ref_record *rr, uint64_t addr, struct where *referrer) { diff --git a/src/dwarflint/low.h b/src/dwarflint/low.h index 6bdfe35fd..a8b7539e0 100644 --- a/src/dwarflint/low.h +++ b/src/dwarflint/low.h @@ -31,6 +31,7 @@ #include "coverage.h" #include "messages.h" #include "readctx.h" +#include "addr-record.h" #ifdef __cplusplus # include @@ -256,13 +257,6 @@ extern "C" struct ref *refs; }; - struct addr_record - { - size_t size; - size_t alloc; - uint64_t *addrs; - }; - struct cu { struct cu *next; -- 2.47.3