Make list_push and list_remove functions rather than inline functions

to decrease size and avoid aliasing violations.

	* include/grub/list.h (grub_list_push): Move to ...
	* grub-core/kern/list.c (grub_list_push): ... here. Don't inline.
	* include/grub/list.h (grub_list_remove): Move to ...
	* grub-core/kern/list.c (grub_list_remove): ... here. Don't inline.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-02-22 05:01:20 +01:00
parent 9d369087a9
commit b00d7fb6c5
3 changed files with 33 additions and 20 deletions

View file

@ -1,3 +1,13 @@
2012-02-22 Vladimir Serbinenko <phcoder@gmail.com>
Make list_push and list_remove functions rather than inline functions
to decrease size and avoid aliasing violations.
* include/grub/list.h (grub_list_push): Move to ...
* grub-core/kern/list.c (grub_list_push): ... here. Don't inline.
* include/grub/list.h (grub_list_remove): Move to ...
* grub-core/kern/list.c (grub_list_remove): ... here. Don't inline.
2012-02-22 Vladimir Serbinenko <phcoder@gmail.com> 2012-02-22 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Disable for now -Wstack-protector, -Wunreachable-code * configure.ac: Disable for now -Wstack-protector, -Wunreachable-code

View file

@ -68,3 +68,24 @@ grub_prio_list_insert (grub_prio_list_t *head, grub_prio_list_t nitem)
if (! inactive) if (! inactive)
nitem->prio |= GRUB_PRIO_LIST_FLAG_ACTIVE; nitem->prio |= GRUB_PRIO_LIST_FLAG_ACTIVE;
} }
void
grub_list_push (grub_list_t *head, grub_list_t item)
{
item->prev = head;
if (*head)
(*head)->prev = &item->next;
item->next = *head;
*head = item;
}
void
grub_list_remove (grub_list_t item)
{
if (item->prev)
*item->prev = item->next;
if (item->next)
item->next->prev = item->prev;
item->next = 0;
item->prev = 0;
}

View file

@ -31,26 +31,8 @@ struct grub_list
}; };
typedef struct grub_list *grub_list_t; typedef struct grub_list *grub_list_t;
static inline void void EXPORT_FUNC(grub_list_push) (grub_list_t *head, grub_list_t item);
grub_list_push (grub_list_t *head, grub_list_t item) void EXPORT_FUNC(grub_list_remove) (grub_list_t item);
{
item->prev = head;
if (*head)
(*head)->prev = &item->next;
item->next = *head;
*head = item;
}
static inline void
grub_list_remove (grub_list_t item)
{
if (item->prev)
*item->prev = item->next;
if (item->next)
item->next->prev = item->prev;
item->next = 0;
item->prev = 0;
}
#define FOR_LIST_ELEMENTS(var, list) for ((var) = (list); (var); (var) = (var)->next) #define FOR_LIST_ELEMENTS(var, list) for ((var) = (list); (var); (var) = (var)->next)