[compiler] Prevent empty weak function stubs from being removed

Even with the noinline specifier added by commit 1a260f8, gcc may skip
calls to non-inlinable functions that it knows have no side
effects. This caused the get_cached_dhcpack() call in start_dhcp(),
the weak stub of which has no code in its body, to be removed,
preventing cached DHCP from working.

Fix by adding a __keepme macro to compiler.h expanding to asm(""), as
recommended by gcc's info page, and using it in the weak stub for
get_cached_dhcpack().

Reported-by: Aaron Brooks <aaron@brooks1.net>
Tested-by: Aaron Brooks <aaron@brooks1.net>
Signed-off-by: Joshua Oreman <oremanj@rwcr.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Joshua Oreman
2010-08-18 16:37:22 -07:00
committed by Michael Brown
parent 059c11e1e6
commit 49d6f57005
2 changed files with 9 additions and 1 deletions

View File

@@ -1389,7 +1389,7 @@ static struct sockaddr dhcp_peer = {
/**
* Get cached DHCPACK where none exists
*/
__weak void get_cached_dhcpack ( void ) {}
__weak void get_cached_dhcpack ( void ) { __keepme }
/**
* Start DHCP state machine on a network device