Stackdb
Stackdb is a stackable, multi-target and -level source debugger and memory forensics library.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
clfit.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, 2014 The University of Utah
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #ifndef __CLFIT_H__
20 #define __CLFIT_H__
21 
22 #include <Judy.h>
23 #include "alist.h"
24 #include "output.h"
25 
26 /*
27  * The clrange functions assume ranges DO NOT overlap -- i.e., where the
28  * start of range B is contained within range A, but the end of B is not
29  * within A. This is a safe assumption when dealing with code segments
30  * that are associated with symbols; however, it may not be appropriate
31  * for other kinds of things. They also assume that ranges may *nest*
32  * -- so they use more memory and are slower than clrangesimple_t below.
33  */
34 typedef Pvoid_t clrange_t;
35 
36 struct clf_range_data {
37  Word_t start;
38  Word_t end;
39  void *data;
41 };
42 
43 #define CLRANGE_START(crd) ((crd)->start)
44 #define CLRANGE_END(crd) ((crd)->end)
45 #define CLRANGE_DATA(crd) ((crd)->data)
46 
47 struct clf_range_data *crd_get_loosest(struct array_list *crdlist,
48  Word_t start,Word_t end,
49  int *contains_saveptr);
50 struct clf_range_data *crd_get_tightest(struct array_list *crdlist,
51  Word_t start,Word_t end,
52  int *contains_saveptr);
54 
56 int clrange_add(clrange_t *clf,Word_t start,Word_t end,void *data);
57 int clrange_update_end(clrange_t *clf,Word_t start,Word_t end,void *data);
58 void *clrange_find(clrange_t *clf,Word_t index);
59 /*
60  * Find the range that is the widest range containing index.
61  */
62 struct clf_range_data *clrange_find_loosest(clrange_t *clf,Word_t index,
63  struct array_list **al_saveptr);
64 /*
65  * Try to find the next index, given @index is (or might be) an existing
66  * valid index in our range array -- BUT the index we find must *not* be
67  * inside of the range(s) specified by @index; it must be completely
68  * outside them. Also, the bound we return will be the lengthiest
69  * (loosest) bound; i.e., if there are multiple things at the next
70  * index, we take the one with the widest range.
71  */
72 struct clf_range_data *clrange_find_next_loosest(clrange_t *clf,Word_t index,
73  struct array_list **al_saveptr);
74 
75 struct array_list *clrange_find_prev_inc(clrange_t *clf,Word_t index);
76 struct array_list *clrange_find_prev_exc(clrange_t *clf,Word_t index);
77 struct array_list *clrange_find_next_inc(clrange_t *clf,Word_t index);
78 struct array_list *clrange_find_next_exc(clrange_t *clf,Word_t index);
80  Word_t index,
81  unsigned int len);
82 
83 typedef void (*clrange_dumper_t)(Word_t start,Word_t end,
84  struct dump_info *ud,void *data);
85 void clrange_dump(clrange_t *clf,struct dump_info *ud,
86  clrange_dumper_t dumper);
87 
88 void clrange_free(clrange_t clf);
89 
90 /*
91  * The clrangesimple functions assume that 1) ranges cannot overlap; and
92  * 2) ranges cannot nest; and 3) only one entry will be inserted at a
93  * specific index. Thus, it's a ranged-entry Judy array, basically.
94  */
95 typedef Pvoid_t clrangesimple_t;
96 
98  Word_t start;
99  Word_t end;
100  void *data;
101 };
102 
104 /*
105  * These return -1 on error; 0 on success; and add() returns 1 if
106  * something is already there; and find/remove() return 1 if not found.
107  */
108 int clrangesimple_add(clrangesimple_t *clr,Word_t start,Word_t end,void *data);
109 int clrangesimple_find(clrangesimple_t *clr,Word_t index,
110  Word_t *start,Word_t *end,void **data);
111 /* Removes only datums at *exactly* index. */
112 int clrangesimple_remove(clrangesimple_t *clr,Word_t index,
113  Word_t *end,void **data);
114 typedef int (*clrangesimple_foreach_handler)(Word_t start,Word_t end,void *data,
115  void *hpriv);
117  clrangesimple_foreach_handler handler,void *hpriv);
118 typedef void (*clrangesimple_free_dtor)(Word_t start,Word_t end,void *data,
119  void *dtor_data);
121  void *dtor_data);
122 
123 /*
124  * The clmatch functions are simply Judy arrays... you can add one or
125  * more datums associated with an index. This means we must keep a list
126  * of datums at each index; if you only want one datum per index, use
127  * the clmatchone functions below.
128  */
129 typedef Pvoid_t clmatch_t;
130 
132 int clmatch_add(clmatch_t *clf,Word_t index,void *data);
133 struct array_list *clmatch_find(clmatch_t *clf,Word_t index);
134 void clmatch_free(clmatch_t clf);
135 
136 typedef Pvoid_t clmatchone_t;
137 
139 int clmatchone_add(clmatchone_t *clf,Word_t index,void *data);
140 int clmatchone_update(clmatchone_t *clf,Word_t index,void *data);
141 void *clmatchone_find(clmatchone_t *clf,Word_t index,Word_t *o_index);
142 void clmatchone_free(clmatchone_t clf);
143 
144 #endif
145 
struct array_list * clrange_find_prev_exc(clrange_t *clf, Word_t index)
Definition: clfit.c:468
void clrangesimple_free(clrangesimple_t clr, clrangesimple_free_dtor dtor, void *dtor_data)
Definition: clfit.c:804
Word_t start
Definition: clfit.h:37
clrangesimple_t clrangesimple_create(void)
Definition: clfit.c:648
struct clf_range_data * crd_get_tightest(struct array_list *crdlist, Word_t start, Word_t end, int *contains_saveptr)
Definition: clfit.c:66
void * clmatchone_find(clmatchone_t *clf, Word_t index, Word_t *o_index)
Definition: clfit.c:977
Word_t end
Definition: clfit.h:38
struct array_list * clmatch_find(clmatch_t *clf, Word_t index)
Definition: clfit.c:882
Pvoid_t clrange_t
Definition: clfit.h:34
struct array_list * clrange_find_subranges_inside(clrange_t *clf, Word_t index, unsigned int len)
Definition: clfit.c:507
int clmatchone_add(clmatchone_t *clf, Word_t index, void *data)
Definition: clfit.c:934
struct clf_range_data * clrange_find_loosest(clrange_t *clf, Word_t index, struct array_list **al_saveptr)
Definition: clfit.c:377
struct array_list * clrange_find_prev_inc(clrange_t *clf, Word_t index)
Definition: clfit.c:455
int clmatchone_update(clmatchone_t *clf, Word_t index, void *data)
Definition: clfit.c:953
void clrange_free(clrange_t clf)
Definition: clfit.c:572
clmatch_t clmatch_create(void)
Definition: clfit.c:836
struct clf_range_data * clrange_find_next_loosest(clrange_t *clf, Word_t index, struct array_list **al_saveptr)
Definition: clfit.c:420
struct array_list * clrange_find_next_inc(clrange_t *clf, Word_t index)
Definition: clfit.c:481
void clmatchone_free(clmatchone_t clf)
Definition: clfit.c:994
void clmatch_free(clmatch_t clf)
Definition: clfit.c:897
int clmatch_add(clmatch_t *clf, Word_t index, void *data)
Definition: clfit.c:846
Pvoid_t clmatch_t
Definition: clfit.h:129
Pvoid_t clrangesimple_t
Definition: clfit.h:95
struct clf_range_data * containing_range
Definition: clfit.h:40
void clrange_dump(clrange_t *clf, struct dump_info *ud, clrange_dumper_t dumper)
Definition: clfit.c:599
int clrangesimple_remove(clrangesimple_t *clr, Word_t index, Word_t *end, void **data)
Definition: clfit.c:739
int len
Definition: dumptarget.c:52
int clrange_update_end(clrange_t *clf, Word_t start, Word_t end, void *data)
Definition: clfit.c:221
struct clf_range_data * crd_get_loosest(struct array_list *crdlist, Word_t start, Word_t end, int *contains_saveptr)
Definition: clfit.c:38
void * data
Definition: clfit.h:39
void(* clrange_dumper_t)(Word_t start, Word_t end, struct dump_info *ud, void *data)
Definition: clfit.h:83
struct clf_range_data * crd_top_containing_range(struct clf_range_data *crd)
Definition: clfit.c:31
int(* clrangesimple_foreach_handler)(Word_t start, Word_t end, void *data, void *hpriv)
Definition: clfit.h:114
int clrangesimple_add(clrangesimple_t *clr, Word_t start, Word_t end, void *data)
Definition: clfit.c:652
clmatchone_t clmatchone_create(void)
Definition: clfit.c:924
void(* clrangesimple_free_dtor)(Word_t start, Word_t end, void *data, void *dtor_data)
Definition: clfit.h:118
int clrangesimple_foreach(clrangesimple_t clr, clrangesimple_foreach_handler handler, void *hpriv)
Definition: clfit.c:779
int clrangesimple_find(clrangesimple_t *clr, Word_t index, Word_t *start, Word_t *end, void **data)
Definition: clfit.c:713
void * clrange_find(clrange_t *clf, Word_t index)
Definition: clfit.c:312
Pvoid_t clmatchone_t
Definition: clfit.h:136
int clrange_add(clrange_t *clf, Word_t start, Word_t end, void *data)
Definition: clfit.c:104
struct array_list * clrange_find_next_exc(clrange_t *clf, Word_t index)
Definition: clfit.c:494
clrange_t clrange_create(void)
Definition: clfit.c:27