C standard specifies that array should be declared with a non null size or with * for standard array. Declaration of relocs_info in tcc.h was not respecting this rule. This commit add a R_NUM macro that maps to the R_<ARCH>_NUM macros and declare relocs_info using it. This commit also moves all linker-related macros from <arch>-gen.c files to <arch>-link.c ones.
Unified · Split
| @@ -129,26 +129,6 @@ enum { · 128 unmodified lines | ||
| 129 | 129 | |
| 130 | 130 | #define CHAR_IS_UNSIGNED |
| 131 | 131 | |
| 132 | −/******************************************************/ | |
| 133 | −/* ELF defines */ | |
| 134 | − | |
| 135 | −#define EM_TCC_TARGET EM_ARM | |
| 136 | − | |
| 137 | −/* relocation type for 32 bit data relocation */ | |
| 138 | −#define R_DATA_32 R_ARM_ABS32 | |
| 139 | −#define R_DATA_PTR R_ARM_ABS32 | |
| 140 | −#define R_JMP_SLOT R_ARM_JUMP_SLOT | |
| 141 | −#define R_GLOB_DAT R_ARM_GLOB_DAT | |
| 142 | −#define R_COPY R_ARM_COPY | |
| 143 | − | |
| 144 | −#define ELF_START_ADDR 0x00008000 | |
| 145 | −#define ELF_PAGE_SIZE 0x1000 | |
| 146 | − | |
| 147 | −enum float_abi { | |
| 148 | − ARM_SOFTFP_FLOAT, | |
| 149 | − ARM_HARD_FLOAT, | |
| 150 | −}; | |
| 151 | − | |
| 152 | 132 | /******************************************************/ |
| 153 | 133 | #else /* ! TARGET_DEFS_ONLY */ |
| 154 | 134 | /******************************************************/ |
| @@ -1,7 +1,31 @@ | ||
| 1 | −#include "tcc.h" | |
| 1 | +#ifdef TARGET_DEFS_ONLY | |
| 2 | + | |
| 3 | +#define EM_TCC_TARGET EM_ARM | |
| 4 | + | |
| 5 | +/* relocation type for 32 bit data relocation */ | |
| 6 | +#define R_DATA_32 R_ARM_ABS32 | |
| 7 | +#define R_DATA_PTR R_ARM_ABS32 | |
| 8 | +#define R_JMP_SLOT R_ARM_JUMP_SLOT | |
| 9 | +#define R_GLOB_DAT R_ARM_GLOB_DAT | |
| 10 | +#define R_COPY R_ARM_COPY | |
| 11 | + | |
| 12 | +#define R_NUM R_ARM_NUM | |
| 13 | + | |
| 14 | +#define ELF_START_ADDR 0x00008000 | |
| 15 | +#define ELF_PAGE_SIZE 0x1000 | |
| 16 | + | |
| 2 | 17 | #define HAVE_SECTION_RELOC |
| 3 | 18 | |
| 4 | −ST_DATA struct reloc_info relocs_info[] = { | |
| 19 | +enum float_abi { | |
| 20 | + ARM_SOFTFP_FLOAT, | |
| 21 | + ARM_HARD_FLOAT, | |
| 22 | +}; | |
| 23 | + | |
| 24 | +#else /* !TARGET_DEFS_ONLY */ | |
| 25 | + | |
| 26 | +#include "tcc.h" | |
| 27 | + | |
| 28 | +ST_DATA struct reloc_info relocs_info[R_NUM] = { | |
| 5 | 29 | INIT_RELOC_INFO (R_ARM_PC24, 1, AUTO_GOTPLT_ENTRY, 0) |
| 6 | 30 | INIT_RELOC_INFO (R_ARM_CALL, 1, AUTO_GOTPLT_ENTRY, 0) |
| 7 | 31 | INIT_RELOC_INFO (R_ARM_JUMP24, 1, AUTO_GOTPLT_ENTRY, 0) |
| @@ -248,3 +272,5 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, add · 240 unmodified lines | ||
| 248 | 272 | return; |
| 249 | 273 | } |
| 250 | 274 | } |
| 275 | + | |
| 276 | +#endif /* !TARGET_DEFS_ONLY */ | |
| @@ -40,20 +40,6 @@ · 39 unmodified lines | ||
| 40 | 40 | |
| 41 | 41 | #define CHAR_IS_UNSIGNED |
| 42 | 42 | |
| 43 | −/******************************************************/ | |
| 44 | −/* ELF defines */ | |
| 45 | − | |
| 46 | −#define EM_TCC_TARGET EM_AARCH64 | |
| 47 | − | |
| 48 | −#define R_DATA_32 R_AARCH64_ABS32 | |
| 49 | −#define R_DATA_PTR R_AARCH64_ABS64 | |
| 50 | −#define R_JMP_SLOT R_AARCH64_JUMP_SLOT | |
| 51 | −#define R_GLOB_DAT R_AARCH64_GLOB_DAT | |
| 52 | −#define R_COPY R_AARCH64_COPY | |
| 53 | − | |
| 54 | −#define ELF_START_ADDR 0x00400000 | |
| 55 | −#define ELF_PAGE_SIZE 0x1000 | |
| 56 | − | |
| 57 | 43 | /******************************************************/ |
| 58 | 44 | #else /* ! TARGET_DEFS_ONLY */ |
| 59 | 45 | /******************************************************/ |
| @@ -1,7 +1,25 @@ | ||
| 1 | −#include "tcc.h" | |
| 1 | +#ifdef TARGET_DEFS_ONLY | |
| 2 | + | |
| 3 | +#define EM_TCC_TARGET EM_AARCH64 | |
| 4 | + | |
| 5 | +#define R_DATA_32 R_AARCH64_ABS32 | |
| 6 | +#define R_DATA_PTR R_AARCH64_ABS64 | |
| 7 | +#define R_JMP_SLOT R_AARCH64_JUMP_SLOT | |
| 8 | +#define R_GLOB_DAT R_AARCH64_GLOB_DAT | |
| 9 | +#define R_COPY R_AARCH64_COPY | |
| 10 | + | |
| 11 | +#define R_NUM R_AARCH64_NUM | |
| 12 | + | |
| 13 | +#define ELF_START_ADDR 0x00400000 | |
| 14 | +#define ELF_PAGE_SIZE 0x1000 | |
| 15 | + | |
| 2 | 16 | #define HAVE_SECTION_RELOC |
| 3 | 17 | |
| 4 | −ST_DATA struct reloc_info relocs_info[] = { | |
| 18 | +#else /* !TARGET_DEFS_ONLY */ | |
| 19 | + | |
| 20 | +#include "tcc.h" | |
| 21 | + | |
| 22 | +ST_DATA struct reloc_info relocs_info[R_NUM] = { | |
| 5 | 23 | INIT_RELOC_INFO (R_AARCH64_ABS32, 0, NO_GOTPLT_ENTRY, 0) |
| 6 | 24 | INIT_RELOC_INFO (R_AARCH64_ABS64, 0, NO_GOTPLT_ENTRY, 0) |
| 7 | 25 | INIT_RELOC_INFO (R_AARCH64_MOVW_UABS_G0_NC, 0, NO_GOTPLT_ENTRY, 0) |
| @@ -111,3 +129,5 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, add · 103 unmodified lines | ||
| 111 | 129 | return; |
| 112 | 130 | } |
| 113 | 131 | } |
| 132 | + | |
| 133 | +#endif /* !TARGET_DEFS_ONLY */ | |
| @@ -108,21 +108,6 @@ enum { · 107 unmodified lines | ||
| 108 | 108 | /* maximum alignment (for aligned attribute support) */ |
| 109 | 109 | #define MAX_ALIGN 8 |
| 110 | 110 | |
| 111 | −/******************************************************/ | |
| 112 | −/* ELF defines */ | |
| 113 | − | |
| 114 | −#define EM_TCC_TARGET EM_C60 | |
| 115 | − | |
| 116 | −/* relocation type for 32 bit data relocation */ | |
| 117 | −#define R_DATA_32 R_C60_32 | |
| 118 | −#define R_DATA_PTR R_C60_32 | |
| 119 | −#define R_JMP_SLOT R_C60_JMP_SLOT | |
| 120 | −#define R_GLOB_DAT R_C60_GLOB_DAT | |
| 121 | −#define R_COPY R_C60_COPY | |
| 122 | − | |
| 123 | −#define ELF_START_ADDR 0x00000400 | |
| 124 | −#define ELF_PAGE_SIZE 0x1000 | |
| 125 | − | |
| 126 | 111 | /******************************************************/ |
| 127 | 112 | #else /* ! TARGET_DEFS_ONLY */ |
| 128 | 113 | /******************************************************/ |
| @@ -1,6 +1,25 @@ | ||
| 1 | −#include "tcc.h" | |
| 1 | +#ifdef TARGET_DEFS_ONLY | |
| 2 | + | |
| 3 | +#define EM_TCC_TARGET EM_C60 | |
| 4 | + | |
| 5 | +/* relocation type for 32 bit data relocation */ | |
| 6 | +#define R_DATA_32 R_C60_32 | |
| 7 | +#define R_DATA_PTR R_C60_32 | |
| 8 | +#define R_JMP_SLOT R_C60_JMP_SLOT | |
| 9 | +#define R_GLOB_DAT R_C60_GLOB_DAT | |
| 10 | +#define R_COPY R_C60_COPY | |
| 11 | + | |
| 12 | +#define R_NUM R_C60_NUM | |
| 13 | + | |
| 14 | +#define ELF_START_ADDR 0x00000400 | |
| 15 | +#define ELF_PAGE_SIZE 0x1000 | |
| 16 | + | |
| 2 | 17 | #define HAVE_SECTION_RELOC |
| 3 | 18 | |
| 19 | +#else /* !TARGET_DEFS_ONLY */ | |
| 20 | + | |
| 21 | +#include "tcc.h" | |
| 22 | + | |
| 4 | 23 | void relocate_init(Section *sr) {} |
| 5 | 24 | |
| 6 | 25 | void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, addr_t val) |
| @@ -33,3 +52,5 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, add · 26 unmodified lines | ||
| 33 | 52 | break; |
| 34 | 53 | } |
| 35 | 54 | } |
| 55 | + | |
| 56 | +#endif /* !TARGET_DEFS_ONLY */ | |
| @@ -2456,6 +2456,8 @@ typedef Elf32_Addr Elf32_Conflict; · 2455 unmodified lines | ||
| 2456 | 2456 | #define R_AARCH64_TLS_TPREL64 1030 /* TP-relative offset, 64 bit. */ |
| 2457 | 2457 | #define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */ |
| 2458 | 2458 | #define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ |
| 2459 | +/* Keep this the last entry. */ | |
| 2460 | +#define R_AARCH64_NUM 1033 | |
| 2459 | 2461 | |
| 2460 | 2462 | /* ARM relocs. */ |
| 2461 | 2463 | |
| @@ -2547,6 +2549,8 @@ typedef Elf32_Addr Elf32_Conflict; · 85 unmodified lines | ||
| 2547 | 2549 | #define R_C60_RELATIVE 8 /* Adjust by program base */ |
| 2548 | 2550 | #define R_C60_GOTOFF 9 /* 32 bit offset to GOT */ |
| 2549 | 2551 | #define R_C60_GOTPC 10 /* 32 bit PC relative offset to GOT */ |
| 2552 | +/* Keep this the last entry. */ | |
| 2553 | +#define R_C60_NUM 11 | |
| 2550 | 2554 | |
| 2551 | 2555 | #define R_C60HI16 0x55 /* high 16 bit MVKH embedded */ |
| 2552 | 2556 | #define R_C60LO16 0x54 /* low 16 bit MVKL embedded */ |
| @@ -2900,7 +2904,7 @@ typedef Elf32_Addr Elf32_Conflict; · 347 unmodified lines | ||
| 2900 | 2904 | #define R_X86_64_REX_GOTPCRELX 42 /* like GOTPCRELX, but a REX prefix |
| 2901 | 2905 | is present */ |
| 2902 | 2906 | |
| 2903 | −#define R_X86_64_NUM 39 | |
| 2907 | +#define R_X86_64_NUM 43 | |
| 2904 | 2908 | |
| 2905 | 2909 | |
| 2906 | 2910 | /* AM33 relocations. */ |
| @@ -73,21 +73,6 @@ enum { · 72 unmodified lines | ||
| 73 | 73 | |
| 74 | 74 | #define psym oad |
| 75 | 75 | |
| 76 | −/******************************************************/ | |
| 77 | −/* ELF defines */ | |
| 78 | − | |
| 79 | −#define EM_TCC_TARGET EM_386 | |
| 80 | − | |
| 81 | −/* relocation type for 32 bit data relocation */ | |
| 82 | −#define R_DATA_32 R_386_32 | |
| 83 | −#define R_DATA_PTR R_386_32 | |
| 84 | −#define R_JMP_SLOT R_386_JMP_SLOT | |
| 85 | −#define R_GLOB_DAT R_386_GLOB_DAT | |
| 86 | −#define R_COPY R_386_COPY | |
| 87 | − | |
| 88 | −#define ELF_START_ADDR 0x08048000 | |
| 89 | −#define ELF_PAGE_SIZE 0x1000 | |
| 90 | − | |
| 91 | 76 | /******************************************************/ |
| 92 | 77 | #else /* ! TARGET_DEFS_ONLY */ |
| 93 | 78 | /******************************************************/ |
| @@ -1,8 +1,27 @@ | ||
| 1 | −#include "tcc.h" | |
| 1 | +#ifdef TARGET_DEFS_ONLY | |
| 2 | + | |
| 3 | +#define EM_TCC_TARGET EM_386 | |
| 4 | + | |
| 5 | +/* relocation type for 32 bit data relocation */ | |
| 6 | +#define R_DATA_32 R_386_32 | |
| 7 | +#define R_DATA_PTR R_386_32 | |
| 8 | +#define R_JMP_SLOT R_386_JMP_SLOT | |
| 9 | +#define R_GLOB_DAT R_386_GLOB_DAT | |
| 10 | +#define R_COPY R_386_COPY | |
| 11 | + | |
| 12 | +#define R_NUM R_386_NUM | |
| 13 | + | |
| 14 | +#define ELF_START_ADDR 0x08048000 | |
| 15 | +#define ELF_PAGE_SIZE 0x1000 | |
| 16 | + | |
| 2 | 17 | #define HAVE_SECTION_RELOC |
| 3 | 18 | |
| 19 | +#else /* !TARGET_DEFS_ONLY */ | |
| 20 | + | |
| 21 | +#include "tcc.h" | |
| 22 | + | |
| 4 | 23 | static ElfW_Rel *qrel; /* ptr to next reloc entry reused */ |
| 5 | −ST_DATA struct reloc_info relocs_info[] = { | |
| 24 | +ST_DATA struct reloc_info relocs_info[R_NUM] = { | |
| 6 | 25 | INIT_RELOC_INFO (R_386_32, 0, NO_GOTPLT_ENTRY, 0) |
| 7 | 26 | INIT_RELOC_INFO (R_386_PC32, 1, AUTO_GOTPLT_ENTRY, 0) |
| 8 | 27 | INIT_RELOC_INFO (R_386_PLT32, 1, ALWAYS_GOTPLT_ENTRY, 0) |
| @@ -101,3 +120,5 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, add · 92 unmodified lines | ||
| 101 | 120 | return; |
| 102 | 121 | } |
| 103 | 122 | } |
| 123 | + | |
| 124 | +#endif /* !TARGET_DEFS_ONLY */ | |
| @@ -290,19 +290,24 @@ · 289 unmodified lines | ||
| 290 | 290 | #define TARGET_DEFS_ONLY |
| 291 | 291 | #ifdef TCC_TARGET_I386 |
| 292 | 292 | # include "i386-gen.c" |
| 293 | +# include "i386-link.c" | |
| 293 | 294 | #endif |
| 294 | 295 | #ifdef TCC_TARGET_X86_64 |
| 295 | 296 | # include "x86_64-gen.c" |
| 297 | +# include "x86_64-link.c" | |
| 296 | 298 | #endif |
| 297 | 299 | #ifdef TCC_TARGET_ARM |
| 298 | 300 | # include "arm-gen.c" |
| 301 | +# include "arm-link.c" | |
| 299 | 302 | #endif |
| 300 | 303 | #ifdef TCC_TARGET_ARM64 |
| 301 | 304 | # include "arm64-gen.c" |
| 305 | +# include "arm64-link.c" | |
| 302 | 306 | #endif |
| 303 | 307 | #ifdef TCC_TARGET_C67 |
| 304 | 308 | # include "coff.h" |
| 305 | 309 | # include "c67-gen.c" |
| 310 | +# include "c67-link.c" | |
| 306 | 311 | #endif |
| 307 | 312 | #undef TARGET_DEFS_ONLY |
| 308 | 313 | |
| @@ -1325,7 +1330,7 @@ struct reloc_info { · 1016 unmodified lines | ||
| 1325 | 1330 | |
| 1326 | 1331 | #define INIT_RELOC_INFO(rtype, code_reloc, gotplt_entry, pltoff_addend) \ |
| 1327 | 1332 | [rtype] = {code_reloc, gotplt_entry, pltoff_addend}, |
| 1328 | −ST_DATA struct reloc_info relocs_info[]; | |
| 1333 | +ST_DATA struct reloc_info relocs_info[R_NUM]; | |
| 1329 | 1334 | |
| 1330 | 1335 | ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */ |
| 1331 | 1336 | ST_DATA Section *cur_text_section; /* current section where function code is generated */ |
| @@ -101,21 +101,6 @@ enum { · 100 unmodified lines | ||
| 101 | 101 | /* maximum alignment (for aligned attribute support) */ |
| 102 | 102 | #define MAX_ALIGN 16 |
| 103 | 103 | |
| 104 | −/******************************************************/ | |
| 105 | −/* ELF defines */ | |
| 106 | − | |
| 107 | −#define EM_TCC_TARGET EM_X86_64 | |
| 108 | − | |
| 109 | −/* relocation type for 32 bit data relocation */ | |
| 110 | −#define R_DATA_32 R_X86_64_32 | |
| 111 | −#define R_DATA_PTR R_X86_64_64 | |
| 112 | −#define R_JMP_SLOT R_X86_64_JUMP_SLOT | |
| 113 | −#define R_GLOB_DAT R_X86_64_GLOB_DAT | |
| 114 | −#define R_COPY R_X86_64_COPY | |
| 115 | − | |
| 116 | −#define ELF_START_ADDR 0x400000 | |
| 117 | −#define ELF_PAGE_SIZE 0x200000 | |
| 118 | − | |
| 119 | 104 | /******************************************************/ |
| 120 | 105 | #else /* ! TARGET_DEFS_ONLY */ |
| 121 | 106 | /******************************************************/ |
| @@ -1,8 +1,27 @@ | ||
| 1 | −#include "tcc.h" | |
| 1 | +#ifdef TARGET_DEFS_ONLY | |
| 2 | + | |
| 3 | +#define EM_TCC_TARGET EM_X86_64 | |
| 4 | + | |
| 5 | +/* relocation type for 32 bit data relocation */ | |
| 6 | +#define R_DATA_32 R_X86_64_32 | |
| 7 | +#define R_DATA_PTR R_X86_64_64 | |
| 8 | +#define R_JMP_SLOT R_X86_64_JUMP_SLOT | |
| 9 | +#define R_GLOB_DAT R_X86_64_GLOB_DAT | |
| 10 | +#define R_COPY R_X86_64_COPY | |
| 11 | + | |
| 12 | +#define R_NUM R_X86_64_NUM | |
| 13 | + | |
| 14 | +#define ELF_START_ADDR 0x400000 | |
| 15 | +#define ELF_PAGE_SIZE 0x200000 | |
| 16 | + | |
| 2 | 17 | #define HAVE_SECTION_RELOC |
| 3 | 18 | |
| 19 | +#else /* !TARGET_DEFS_ONLY */ | |
| 20 | + | |
| 21 | +#include "tcc.h" | |
| 22 | + | |
| 4 | 23 | static ElfW_Rel *qrel; /* ptr to next reloc entry reused */ |
| 5 | −ST_DATA struct reloc_info relocs_info[] = { | |
| 24 | +ST_DATA struct reloc_info relocs_info[R_NUM] = { | |
| 6 | 25 | INIT_RELOC_INFO (R_X86_64_64, 0, AUTO_GOTPLT_ENTRY, 0) |
| 7 | 26 | INIT_RELOC_INFO (R_X86_64_32, 0, AUTO_GOTPLT_ENTRY, 0) |
| 8 | 27 | INIT_RELOC_INFO (R_X86_64_32S, 0, AUTO_GOTPLT_ENTRY, 0) |
| @@ -107,3 +126,5 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, char *ptr, addr_t addr, add · 98 unmodified lines | ||
| 107 | 126 | break; |
| 108 | 127 | } |
| 109 | 128 | } |
| 129 | + | |
| 130 | +#endif /* !TARGET_DEFS_ONLY */ | |