aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-08 01:29:27 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-08 01:32:25 +0100
commit1749410ac473e918dcab1ea5e4e9e682f0ee2fe0 (patch)
tree066565f693ceb00ffa731590aad15ccb37bf44c9
parente0f904856b3d665a84b4342b79967b97a3739545 (diff)
parentf94f4a89ff6f31384cdfe77b5084601e7de2a131 (diff)
downloadsparse-1749410ac473e918dcab1ea5e4e9e682f0ee2fe0.tar.gz
Merge branch 'ptrlist-generic'
* ptrlist: small API improvements These improvements will be used by various incoming series. Thanks to Ramsay Jones for finding a bunch of typos and suggesting some improved phrasing. -- Luc
-rw-r--r--ptrlist.c10
-rw-r--r--ptrlist.h22
-rw-r--r--simplify.c6
-rw-r--r--sparse.c13
4 files changed, 26 insertions, 25 deletions
diff --git a/ptrlist.c b/ptrlist.c
index 0f0b3f6d..c5766002 100644
--- a/ptrlist.c
+++ b/ptrlist.c
@@ -154,10 +154,10 @@ void *ptr_list_nth_entry(struct ptr_list *list, unsigned int idx)
// @head: the list to be linearized
// @arr: a ``void*`` array to fill with @head's entries
// @max: the maximum number of entries to store into @arr
-// @return: the number of entries linearized.
+// @return: the number of entries in the list.
//
// Linearize the entries of a list up to a total of @max,
-// and return the nr of entries linearized.
+// and return the number of entries in the list.
//
// The array to linearize into (@arr) should really
// be ``void *x[]``, but we want to let people fill in any kind
@@ -170,14 +170,14 @@ int linearize_ptr_list(struct ptr_list *head, void **arr, int max)
do {
int i = list->nr;
+ nr += i;
+ if (max == 0)
+ continue;
if (i > max)
i = max;
memcpy(arr, list->list, i*sizeof(void *));
arr += i;
- nr += i;
max -= i;
- if (!max)
- break;
} while ((list = list->next) != head);
}
return nr;
diff --git a/ptrlist.h b/ptrlist.h
index c5fa4cdd..5a3dcbeb 100644
--- a/ptrlist.h
+++ b/ptrlist.h
@@ -12,7 +12,7 @@
/* Silly type-safety check ;) */
#define CHECK_TYPE(head,ptr) (void)(&(ptr) == &(head)->list[0])
-#define TYPEOF(head) __typeof__(&(head)->list[0])
+#define PTRLIST_TYPE(head) __typeof__((head)->list[0])
#define VRFY_PTR_LIST(head) (void)(sizeof((head)->list[0]))
#define LIST_NODE_NR (13)
@@ -67,6 +67,12 @@ extern void **__add_ptr_list_tag(struct ptr_list **, void *, unsigned long);
(__typeof__(&(ptr))) __add_ptr_list_tag(head, ptr, tag);\
})
+#define pop_ptr_list(l) ({ \
+ PTRLIST_TYPE(*(l)) ptr; \
+ ptr = delete_ptr_list_last((struct ptr_list**)(l)); \
+ ptr; \
+ })
+
extern void __free_ptr_list(struct ptr_list **);
#define free_ptr_list(list) do { \
VRFY_PTR_LIST(*(list)); \
@@ -75,7 +81,13 @@ extern void __free_ptr_list(struct ptr_list **);
#define ptr_list_nth(lst, nth) ({ \
struct ptr_list* head = (struct ptr_list*)(lst); \
- (__typeof__((lst)->list[0])) ptr_list_nth_entry(head, nth);\
+ (PTRLIST_TYPE(lst)) ptr_list_nth_entry(head, nth);\
+ })
+
+#define ptr_list_to_array(list, array, size) ({ \
+ struct ptr_list* head = (struct ptr_list*)(list); \
+ CHECK_TYPE(list, *array); \
+ linearize_ptr_list(head, (void**)array, size); \
})
////////////////////////////////////////////////////////////////////////
@@ -251,7 +263,7 @@ extern void __free_ptr_list(struct ptr_list **);
extern void split_ptr_list_head(struct ptr_list *);
#define DO_INSERT_CURRENT(new, __head, __list, __nr) do { \
- TYPEOF(__head) __this, __last; \
+ PTRLIST_TYPE(__head) *__this, *__last; \
if (__list->nr == LIST_NODE_NR) { \
split_ptr_list_head((struct ptr_list*)__list); \
if (__nr >= __list->nr) { \
@@ -270,8 +282,8 @@ extern void split_ptr_list_head(struct ptr_list *);
} while (0)
#define DO_DELETE_CURRENT(__head, __list, __nr) do { \
- TYPEOF(__head) __this = __list->list + __nr; \
- TYPEOF(__head) __last = __list->list + __list->nr - 1; \
+ PTRLIST_TYPE(__head) *__this = __list->list + __nr; \
+ PTRLIST_TYPE(__head) *__last = __list->list + __list->nr - 1; \
while (__this < __last) { \
__this[0] = __this[1]; \
__this++; \
diff --git a/simplify.c b/simplify.c
index 584078dd..207af8ed 100644
--- a/simplify.c
+++ b/simplify.c
@@ -83,7 +83,7 @@ static struct basic_block *phi_parent(struct basic_block *source, pseudo_t pseud
// number of element, a positive number if there was
// more than expected and a negative one if less.
//
-// :note: we can't reuse a function like linearize_ptr_list()
+// :note: we can't reuse ptr_list_to_array() for the phi-sources
// because any VOIDs in the phi-list must be ignored here
// as in this context they mean 'entry has been removed'.
static int get_phisources(struct instruction *sources[], int nbr, struct instruction *insn)
@@ -108,7 +108,7 @@ static int get_phisources(struct instruction *sources[], int nbr, struct instruc
static int if_convert_phi(struct instruction *insn)
{
struct instruction *array[2];
- struct basic_block *parents[3];
+ struct basic_block *parents[2];
struct basic_block *bb, *bb1, *bb2, *source;
struct instruction *br;
pseudo_t p1, p2;
@@ -116,7 +116,7 @@ static int if_convert_phi(struct instruction *insn)
bb = insn->bb;
if (get_phisources(array, 2, insn))
return 0;
- if (linearize_ptr_list((struct ptr_list *)bb->parents, (void **)parents, 3) != 2)
+ if (ptr_list_to_array(bb->parents, parents, 2) != 2)
return 0;
p1 = array[0]->phi_src;
bb1 = array[0]->bb;
diff --git a/sparse.c b/sparse.c
index 151eaf4e..9d62d4fe 100644
--- a/sparse.c
+++ b/sparse.c
@@ -163,20 +163,9 @@ static void check_byte_count(struct instruction *insn, pseudo_t count)
/* OK, we could try to do the range analysis here */
}
-static pseudo_t argument(struct instruction *call, unsigned int argno)
-{
- pseudo_t args[8];
- struct ptr_list *arg_list = (struct ptr_list *) call->arguments;
-
- argno--;
- if (linearize_ptr_list(arg_list, (void *)args, 8) > argno)
- return args[argno];
- return NULL;
-}
-
static void check_memset(struct instruction *insn)
{
- check_byte_count(insn, argument(insn, 3));
+ check_byte_count(insn, ptr_list_nth(insn->arguments, 3));
}
#define check_memcpy check_memset