These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / include / compiler.h
index 3f5c913..ca82f95 100644 (file)
  * @{
  */
 
-/** Provide a symbol within this object file */
+/**
+ * Provide a symbol within this object file
+ *
+ * @v symbol           Symbol name
+ */
 #ifdef ASSEMBLY
-#define PROVIDE_SYMBOL( _sym )                         \
-       .section ".provided", "a", @nobits ;            \
-       .hidden _sym ;                                  \
-       .globl  _sym ;                                  \
-       _sym: ;                                         \
+#define PROVIDE_SYMBOL( symbol )                               \
+       .section ".provided", "a", @nobits ;                    \
+       .hidden symbol ;                                        \
+       .globl  symbol ;                                        \
+       symbol: ;                                               \
        .previous
-#else /* ASSEMBLY */
-#define PROVIDE_SYMBOL( _sym )                         \
-       char _sym[0]                                    \
+#else
+#define PROVIDE_SYMBOL( symbol )                               \
+       char symbol[0]                                          \
          __attribute__ (( section ( ".provided" ) ))
-#endif /* ASSEMBLY */
+#endif
 
-/** Require a symbol within this object file
+/**
+ * Request a symbol
+ *
+ * @v symbol           Symbol name
  *
- * The symbol is referenced by a relocation in a discarded section, so
- * if it is not available at link time the link will fail.
+ * Request a symbol to be included within the link.  If the symbol
+ * cannot be found, the link will succeed anyway.
  */
 #ifdef ASSEMBLY
-#define REQUIRE_SYMBOL( _sym )                         \
-       .section ".discard", "a", @progbits ;           \
-       .extern _sym ;                                  \
-       .long   _sym ;                                  \
-       .previous
-#else /* ASSEMBLY */
-#define REQUIRE_SYMBOL( _sym )                         \
-       extern char _sym;                               \
-       static char * _C2 ( _C2 ( __require_, _sym ), _C2 ( _, __LINE__ ) ) \
-               __attribute__ (( section ( ".discard" ), used )) \
-               = &_sym
+#define REQUEST_SYMBOL( symbol )                               \
+       .equ __request_ ## symbol, symbol
+#else
+#define REQUEST_SYMBOL( symbol )                               \
+       __asm__ ( ".equ __request_" #symbol ", " #symbol )
 #endif
 
-/** Request that a symbol be available at runtime
+/**
+ * Require a symbol
+ *
+ * @v symbol           Symbol name
  *
- * The requested symbol is entered as undefined into the symbol table
- * for this object, so the linker will pull in other object files as
- * necessary to satisfy the reference. However, the undefined symbol
- * is not referenced in any relocations, so the link can still succeed
- * if no file contains it.
+ * Require a symbol to be included within the link.  If the symbol
+ * cannot be found, the link will fail.
  *
- * A symbol passed to this macro may not be referenced anywhere
- * else in the file. If you want to do that, see IMPORT_SYMBOL().
+ * To use this macro within a file, you must also specify the file's
+ * "requiring symbol" using the REQUIRING_SYMBOL() or
+ * PROVIDE_REQUIRING_SYMBOL() macros.
  */
 #ifdef ASSEMBLY
-#define REQUEST_SYMBOL( _sym )                         \
-       .equ    __need_ ## _sym, _sym
-#else /* ASSEMBLY */
-#define REQUEST_SYMBOL( _sym )                         \
-       __asm__ ( ".equ\t__need_" #_sym ", " #_sym )
-#endif /* ASSEMBLY */
+#define REQUIRE_SYMBOL( symbol )                               \
+       .reloc __requiring_symbol__, RELOC_TYPE_NONE, symbol
+#else
+#define REQUIRE_SYMBOL( symbol )                               \
+       __asm__ ( ".reloc __requiring_symbol__, "               \
+                 _S2 ( RELOC_TYPE_NONE ) ", " #symbol )
+#endif
 
-/** Set up a symbol to be usable in another file by IMPORT_SYMBOL()
+/**
+ * Specify the file's requiring symbol
+ *
+ * @v symbol           Symbol name
  *
- * The symbol must already be marked as global.
+ * REQUIRE_SYMBOL() works by defining a dummy relocation record
+ * against a nominated "requiring symbol".  The presence of the
+ * nominated requiring symbol will drag in all of the symbols
+ * specified using REQUIRE_SYMBOL().
  */
-#define EXPORT_SYMBOL( _sym )  PROVIDE_SYMBOL ( __export_ ## _sym )
+#ifdef ASSEMBLY
+#define REQUIRING_SYMBOL( symbol )                             \
+       .equ __requiring_symbol__, symbol
+#else
+#define REQUIRING_SYMBOL( symbol )                             \
+       __asm__ ( ".equ __requiring_symbol__, " #symbol )
+#endif
 
-/** Make a symbol usable to this file if available at link time
- *
- * If no file passed to the linker contains the symbol, it will have
- * @c NULL value to future uses. Keep in mind that the symbol value is
- * really the @e address of a variable or function; see the code
- * snippet below.
- *
- * In C using IMPORT_SYMBOL, you must specify the declaration as the
- * second argument, for instance
- *
- * @code
- *   IMPORT_SYMBOL ( my_func, int my_func ( int arg ) );
- *   IMPORT_SYMBOL ( my_var, int my_var );
- *
- *   void use_imports ( void ) {
- *     if ( my_func && &my_var )
- *        my_var = my_func ( my_var );
- *   }
- * @endcode
- *
- * GCC considers a weak declaration to override a strong one no matter
- * which comes first, so it is safe to include a header file declaring
- * the imported symbol normally, but providing the declaration to
- * IMPORT_SYMBOL is still required.
+/**
+ * Provide a file's requiring symbol
  *
- * If no EXPORT_SYMBOL declaration exists for the imported symbol in
- * another file, the behavior will be most likely be identical to that
- * for an unavailable symbol.
+ * If the file contains no symbols that can be used as the requiring
+ * symbol, you can provide a dummy one-byte-long symbol using
+ * PROVIDE_REQUIRING_SYMBOL().
  */
 #ifdef ASSEMBLY
-#define IMPORT_SYMBOL( _sym )                          \
-       REQUEST_SYMBOL ( __export_ ## _sym ) ;          \
-       .weak   _sym
-#else /* ASSEMBLY */
-#define IMPORT_SYMBOL( _sym, _decl )                   \
-       REQUEST_SYMBOL ( __export_ ## _sym ) ;          \
-       extern _decl __attribute__ (( weak ))
+#define PROVIDE_REQUIRING_SYMBOL()                             \
+       .section ".tbl.requiring_symbols", "a", @progbits ;     \
+       __requiring_symbol__:   .byte 0 ;                       \
+       .size __requiring_symbol__, . - __requiring_symbol__ ;  \
+       .previous
+#else
+#define PROVIDE_REQUIRING_SYMBOL()                             \
+       __asm__ ( ".section \".tbl.requiring_symbols\", "       \
+                 "         \"a\", @progbits\n"                 \
+                 "__requiring_symbol__:\t.byte 0\n"            \
+                 ".size __requiring_symbol__, "                \
+                 "      . - __requiring_symbol__\n"            \
+                 ".previous" )
 #endif
 
 /** @} */
 
 #define PREFIX_OBJECT( _prefix ) _C2 ( _prefix, OBJECT )
 #define OBJECT_SYMBOL PREFIX_OBJECT ( obj_ )
-#define REQUEST_EXPANDED( _sym ) REQUEST_SYMBOL ( _sym )
-#define CONFIG_SYMBOL PREFIX_OBJECT ( obj_config_ )
 
 /** Always provide the symbol for the current object (defined by -DOBJECT) */
 PROVIDE_SYMBOL ( OBJECT_SYMBOL );
 
-/** Pull in an object-specific configuration file if available */
-REQUEST_EXPANDED ( CONFIG_SYMBOL );
-
-/** Explicitly require another object */
-#define REQUIRE_OBJECT( _obj ) REQUIRE_SYMBOL ( obj_ ## _obj )
+/**
+ * Request an object
+ *
+ * @v object           Object name
+ *
+ * Request an object to be included within the link.  If the object
+ * cannot be found, the link will succeed anyway.
+ */
+#define REQUEST_OBJECT( object ) REQUEST_SYMBOL ( obj_ ## object )
 
-/** Pull in another object if it exists */
-#define REQUEST_OBJECT( _obj ) REQUEST_SYMBOL ( obj_ ## _obj )
+/**
+ * Require an object
+ *
+ * @v object           Object name
+ *
+ * Require an object to be included within the link.  If the object
+ * cannot be found, the link will fail.
+ *
+ * To use this macro within a file, you must also specify the file's
+ * "requiring symbol" using the REQUIRING_SYMBOL() or
+ * PROVIDE_REQUIRING_SYMBOL() macros.
+ */
+#define REQUIRE_OBJECT( object ) REQUIRE_SYMBOL ( obj_ ## object )
 
 /** @} */
 
@@ -195,14 +207,6 @@ REQUEST_EXPANDED ( CONFIG_SYMBOL );
  */
 #define __weak         __attribute__ (( weak, noinline ))
 
-/** Prevent a function from being optimized away without inlining
- *
- * Calls to functions with void return type that contain no code in their body
- * may be removed by gcc's optimizer even when inlining is inhibited. Placing
- * this macro in the body of the function prevents that from occurring.
- */
-#define __keepme       asm("");
-
 #endif
 
 /** @defgroup dbg Debugging infrastructure
@@ -730,13 +734,24 @@ int __debug_disable;
 #define FILE_LICENCE_MIT \
        PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__mit__ ) )
 
+/** Declare a file as being under GPLv2+ or UBDL
+ *
+ * This licence declaration is applicable when a file states itself to
+ * be licensed under the GNU GPL; "either version 2 of the License, or
+ * (at your option) any later version" and also states that it may be
+ * distributed under the terms of the Unmodified Binary Distribution
+ * Licence (as given in the file COPYING.UBDL).
+ */
+#define FILE_LICENCE_GPL2_OR_LATER_OR_UBDL \
+       PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_or_later_or_ubdl__ ) )
+
 /** Declare a particular licence as applying to a file */
 #define FILE_LICENCE( _licence ) FILE_LICENCE_ ## _licence
 
 /** @} */
 
-/* This file itself is under GPLv2-or-later */
-FILE_LICENCE ( GPL2_OR_LATER );
+/* This file itself is under GPLv2+/UBDL */
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #include <bits/compiler.h>