summaryrefslogtreecommitdiffstats
path: root/src/include/compiler.h
diff options
context:
space:
mode:
authorStefan Hajnoczi2010-07-14 11:13:44 +0200
committerMichael Brown2010-07-14 13:55:59 +0200
commit8ee6d216e4aabeeee525430b453733874948eddb (patch)
tree1959785f48651f130048c3573599898a291aa275 /src/include/compiler.h
parent[hci] Continue processing while prompting for shell banner (diff)
downloadipxe-8ee6d216e4aabeeee525430b453733874948eddb.tar.gz
ipxe-8ee6d216e4aabeeee525430b453733874948eddb.tar.xz
ipxe-8ee6d216e4aabeeee525430b453733874948eddb.zip
[build] Mark weak functions noinline
Weak functions whose visibility is hidden may be inlined due to a bug in GCC. Explicitly mark weak functions noinline to work around the problem. This makes the PXE_MENU config option work again, the PXE boot menu was never being called because the compiler inlined a weak stub function. The GCC bug was identified and fixed by Richard Sandiford <rdsandiford@googlemail.com> but in the meantime iPXE needs to implement a workaround. Reported-by: Steve Jones <steve@squaregoldfish.co.uk> Reported-by: Shao Miller <shao.miller@yrdsb.edu.on.ca> Suggested-by: Joshua Oreman <oremanj@rwcr.net> Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/compiler.h')
-rw-r--r--src/include/compiler.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/include/compiler.h b/src/include/compiler.h
index 66e275c2..16165b36 100644
--- a/src/include/compiler.h
+++ b/src/include/compiler.h
@@ -181,8 +181,15 @@ REQUEST_EXPANDED ( CONFIG_SYMBOL );
#ifndef ASSEMBLY
-/** Declare a function as weak (use *before* the definition) */
-#define __weak __attribute__ (( weak ))
+/** Declare a function as weak (use *before* the definition)
+ *
+ * Due to a bug in at least GCC 4.4.4 and earlier, weak symbols may be
+ * inlined if they have hidden visibility (see above for why hidden
+ * visibility is used). This results in the non-weak symbol never
+ * being used, so explicitly mark the function as noinline to prevent
+ * inlining.
+ */
+#define __weak __attribute__ (( weak, noinline ))
#endif