Skip to content

Commit

Permalink
Merge branch 'ptrlist-generic'
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
lucvoo committed Mar 8, 2021
2 parents e0f9048 + f94f4a8 commit 1749410
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 25 deletions.
10 changes: 5 additions & 5 deletions ptrlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down
22 changes: 17 additions & 5 deletions ptrlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)); \
Expand All @@ -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); \
})

////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -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) { \
Expand All @@ -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++; \
Expand Down
6 changes: 3 additions & 3 deletions simplify.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -108,15 +108,15 @@ 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;

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;
Expand Down
13 changes: 1 addition & 12 deletions sparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 1749410

Please sign in to comment.