Add support for gcc v3.x compilers.
[seabios.git] / src / types.h
index 74d9e71b652380f3e079ff7e5259a06c44057331..aa9e12d07c7e07bba46f083889e6cb714595f71c 100644 (file)
@@ -21,7 +21,19 @@ union u64_u32_u {
     u64 val;
 };
 
-#define __VISIBLE __attribute__((externally_visible))
+#ifdef MANUAL_NO_JUMP_TABLE
+# define default case 775324556: asm(""); default
+#endif
+
+#ifdef WHOLE_PROGRAM
+# define __VISIBLE __attribute__((externally_visible))
+#else
+# define __VISIBLE
+#endif
+
+#define UNIQSEC __FILE__ "." __stringify(__LINE__)
+
+#define __ASM(code) asm(".section .text.asm." UNIQSEC "\n\t" code)
 
 #if MODE16 == 1
 // Notes a function as externally visible in the 16bit code chunk.
@@ -29,17 +41,25 @@ union u64_u32_u {
 // Notes a function as externally visible in the 32bit code chunk.
 # define VISIBLE32
 // Designate a variable as (only) visible to 16bit code.
-# define VAR16 __attribute__((section(".data.var16")))
+# define VAR16 __section(".data16." UNIQSEC)
 // Designate a variable as visible to both 32bit and 16bit code.
 # define VAR16_32 VAR16 __VISIBLE
+// Designate a variable visible externally.
+# define VAR16EXPORT __section(".data16.export." UNIQSEC) __VISIBLE
+// Designate a variable at a specific 16bit address
+# define VAR16FIXED(addr) __aligned(1) __VISIBLE __section(".fixedaddr." __stringify(addr))
 // Designate top-level assembler as 16bit only.
-# define ASM16(code) asm(code)
+# define ASM16(code) __ASM(code)
+# define ASM32(code)
 #else
 # define VISIBLE16
 # define VISIBLE32 __VISIBLE
-# define VAR16 __attribute__((section(".discard.var16")))
-# define VAR16_32 VAR16 __VISIBLE __attribute__((weak))
+# define VAR16 __section(".discard.var16." UNIQSEC)
+# define VAR16_32 VAR16 __VISIBLE __weak
+# define VAR16EXPORT VAR16_32
+# define VAR16FIXED(addr) VAR16_32
 # define ASM16(code)
+# define ASM32(code) __ASM(code)
 #endif
 
 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
@@ -51,6 +71,9 @@ union u64_u32_u {
 
 #define NULL ((void *)0)
 
+#define __weak __attribute__((weak))
+#define __section(S) __attribute__((section(S)))
+
 #define PACKED __attribute__((packed))
 #define __aligned(x) __attribute__((aligned(x)))