diff --git a/ChangeLog b/ChangeLog index 2429f2da1..3347d73e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-02-22 Vladimir Serbinenko + + 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 * configure.ac: Disable for now -Wstack-protector, -Wunreachable-code diff --git a/grub-core/kern/list.c b/grub-core/kern/list.c index f7c4e6bbe..78005db1e 100644 --- a/grub-core/kern/list.c +++ b/grub-core/kern/list.c @@ -68,3 +68,24 @@ grub_prio_list_insert (grub_prio_list_t *head, grub_prio_list_t nitem) if (! inactive) 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; +} diff --git a/include/grub/list.h b/include/grub/list.h index 54f528a05..63f45c207 100644 --- a/include/grub/list.h +++ b/include/grub/list.h @@ -31,26 +31,8 @@ struct grub_list }; typedef struct grub_list *grub_list_t; -static inline 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; -} - -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; -} +void EXPORT_FUNC(grub_list_push) (grub_list_t *head, grub_list_t item); +void EXPORT_FUNC(grub_list_remove) (grub_list_t item); #define FOR_LIST_ELEMENTS(var, list) for ((var) = (list); (var); (var) = (var)->next)