Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'include/elf/sh.h')
-rw-r--r--include/elf/sh.h62
1 files changed, 49 insertions, 13 deletions
diff --git a/include/elf/sh.h b/include/elf/sh.h
index 00a5f2adc..15d460d36 100644
--- a/include/elf/sh.h
+++ b/include/elf/sh.h
@@ -27,13 +27,18 @@
#define EF_SH1 1
#define EF_SH2 2
#define EF_SH3 3
-#define EF_SH_HAS_DSP(flags) ((flags) & 4)
+#define EF_SH_HAS_DSP(flags) (((flags) & EF_SH_MACH_MASK & ~3) == 4)
#define EF_SH_DSP 4
#define EF_SH3_DSP 5
+#define EF_SH4AL_DSP 6
#define EF_SH_HAS_FP(flags) ((flags) & 8)
#define EF_SH3E 8
#define EF_SH4 9
#define EF_SH2E 11
+#define EF_SH4A 12
+
+#define EF_SH4_NOFPU 0x10
+#define EF_SH4A_NOFPU 0x11
/* This one can only mix in objects from other EF_SH5 objects. */
#define EF_SH5 10
@@ -56,6 +61,20 @@
: (((mach1) == EF_SH3E && (mach2) == EF_SH_UNKNOWN) \
|| ((mach2) == EF_SH3E && (mach1) == EF_SH_UNKNOWN)) \
? EF_SH4 \
+ /* ??? SH4? Why not SH3E? */ \
+ : ((((mach1) == EF_SH4_NOFPU || (mach1) == EF_SH4A_NOFPU) \
+ && EF_SH_HAS_DSP (mach2)) \
+ || (((mach2) == EF_SH4_NOFPU || (mach2) == EF_SH4A_NOFPU) \
+ && EF_SH_HAS_DSP (mach1))) \
+ ? EF_SH4AL_DSP \
+ : ((mach1) == EF_SH4_NOFPU && EF_SH_HAS_FP (mach2)) \
+ ? ((mach2) < EF_SH4A) ? EF_SH4 : (mach2) \
+ : ((mach2) == EF_SH4_NOFPU && EF_SH_HAS_FP (mach1)) \
+ ? ((mach1) < EF_SH4A) ? EF_SH4 : (mach1) \
+ : ((mach1) == EF_SH4A_NOFPU && EF_SH_HAS_FP (mach2)) \
+ ? ((mach2) <= EF_SH4A) ? EF_SH4A : (mach2) \
+ : ((mach2) == EF_SH4A_NOFPU && EF_SH_HAS_FP (mach1)) \
+ ? ((mach1) <= EF_SH4A) ? EF_SH4A : (mach1) \
: (((mach1) == EF_SH2E ? 7 : (mach1)) > ((mach2) == EF_SH2E ? 7 : (mach2)) \
? (mach1) : (mach2)))
@@ -83,8 +102,8 @@
#include "elf/reloc-macros.h"
/* Relocations. */
-/* Relocations 25ff are GNU extensions.
- 25..33 are used for relaxation and use the same constants as COFF uses. */
+/* Relocations 10-32 and 128-255 are GNU extensions.
+ 25..32 and 10 are used for relaxation. */
START_RELOC_NUMBERS (elf_sh_reloc_type)
RELOC_NUMBER (R_SH_NONE, 0)
RELOC_NUMBER (R_SH_DIR32, 1)
@@ -96,8 +115,16 @@ START_RELOC_NUMBERS (elf_sh_reloc_type)
RELOC_NUMBER (R_SH_DIR8BP, 7)
RELOC_NUMBER (R_SH_DIR8W, 8)
RELOC_NUMBER (R_SH_DIR8L, 9)
- FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 10)
- FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 24)
+
+ RELOC_NUMBER (R_SH_LOOP_START, 10)
+ RELOC_NUMBER (R_SH_LOOP_END, 11)
+
+ FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 12)
+ FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 21)
+
+ RELOC_NUMBER (R_SH_GNU_VTINHERIT, 22)
+ RELOC_NUMBER (R_SH_GNU_VTENTRY, 23)
+ RELOC_NUMBER (R_SH_SWITCH8, 24)
RELOC_NUMBER (R_SH_SWITCH16, 25)
RELOC_NUMBER (R_SH_SWITCH32, 26)
RELOC_NUMBER (R_SH_USES, 27)
@@ -106,13 +133,19 @@ START_RELOC_NUMBERS (elf_sh_reloc_type)
RELOC_NUMBER (R_SH_CODE, 30)
RELOC_NUMBER (R_SH_DATA, 31)
RELOC_NUMBER (R_SH_LABEL, 32)
- RELOC_NUMBER (R_SH_SWITCH8, 33)
- RELOC_NUMBER (R_SH_GNU_VTINHERIT, 34)
- RELOC_NUMBER (R_SH_GNU_VTENTRY, 35)
- RELOC_NUMBER (R_SH_LOOP_START, 36)
- RELOC_NUMBER (R_SH_LOOP_END, 37)
- FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 38)
- FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 44)
+
+ RELOC_NUMBER (R_SH_DIR16, 33)
+ RELOC_NUMBER (R_SH_DIR8, 34)
+ RELOC_NUMBER (R_SH_DIR8UL, 35)
+ RELOC_NUMBER (R_SH_DIR8UW, 36)
+ RELOC_NUMBER (R_SH_DIR8U, 37)
+ RELOC_NUMBER (R_SH_DIR8SW, 38)
+ RELOC_NUMBER (R_SH_DIR8S, 39)
+ RELOC_NUMBER (R_SH_DIR4UL, 40)
+ RELOC_NUMBER (R_SH_DIR4UW, 41)
+ RELOC_NUMBER (R_SH_DIR4U, 42)
+ RELOC_NUMBER (R_SH_PSHA, 43)
+ RELOC_NUMBER (R_SH_PSHL, 44)
RELOC_NUMBER (R_SH_DIR5U, 45)
RELOC_NUMBER (R_SH_DIR6U, 46)
RELOC_NUMBER (R_SH_DIR6S, 47)
@@ -120,7 +153,10 @@ START_RELOC_NUMBERS (elf_sh_reloc_type)
RELOC_NUMBER (R_SH_DIR10SW, 49)
RELOC_NUMBER (R_SH_DIR10SL, 50)
RELOC_NUMBER (R_SH_DIR10SQ, 51)
- FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 52)
+ FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 52)
+ FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 52)
+ RELOC_NUMBER (R_SH_DIR16S, 53)
+ FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 54)
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143)
RELOC_NUMBER (R_SH_TLS_GD_32, 144)
RELOC_NUMBER (R_SH_TLS_LD_32, 145)