summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/compiler.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/include/compiler.h b/src/include/compiler.h
index f481f38a..ea81fc89 100644
--- a/src/include/compiler.h
+++ b/src/include/compiler.h
@@ -179,6 +179,42 @@ REQUEST_EXPANDED ( CONFIG_SYMBOL );
/** Select file identifier for errno.h (if used) */
#define ERRFILE PREFIX_OBJECT ( ERRFILE_ )
+/**
+ * @defgroup weakmacros Macros to manage weak symbol definitions
+ *
+ * Weak symbols allow one to reference a function in another file
+ * without necessarily requiring that file to be linked in. In their
+ * native form, the function will be @c NULL if its file is not linked
+ * in; these macros provide an inline wrapper that returns an
+ * appropriate error indication or default value.
+ *
+ * @{
+ */
+#ifndef ASSEMBLY
+
+/** Mangle @a name into its weakly-referenced implementation */
+#define __weak_impl( name ) _w_ ## name
+
+/**
+ * Declare a weak function with inline safety wrapper
+ *
+ * @v ret Return type of weak function
+ * @v name Name of function to expose
+ * @v proto Parenthesized list of arguments with types
+ * @v args Parenthesized list of argument names
+ * @v dfl Value to return if weak function is not available
+ */
+#define __weak_decl( ret, name, proto, args, dfl ) \
+ ret __weak_impl( name ) proto __attribute__ (( weak )); \
+ static inline ret name proto { \
+ if ( __weak_impl( name ) ) \
+ return __weak_impl( name ) args; \
+ return dfl; \
+ }
+
+#endif
+/** @} */
+
/** @defgroup dbg Debugging infrastructure
* @{
*/