This implements support for FreeBSD on aarch64 This partial implements support on FreeBSD(32). This still needs fixing i386_gen.c because small structures on this target are passed in registers. Add aligned 16 to __int128_t for FreeBSD Support __i386__ on FreeBSD/NetBSD Fix testcase 115 on FreeBSD/NetBSD Disable testcase 116 on *BSD* because TLS_FUNC/TLS_VAR not set in bcheck.c Remove FreeBSD/FreeBSD_kernel code from tccelf.c
Unified · Split
| @@ -890,7 +890,7 @@ LIBTCCAPI TCCState *tcc_new(void) · 889 unmodified lines | |||
| 890 | tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)"); | 890 | tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)"); |
| 891 | # if defined(__aarch64__) | 891 | # if defined(__aarch64__) |
| 892 | /* FIXME, __int128_t is used by setjump */ | 892 | /* FIXME, __int128_t is used by setjump */ |
| 893 | tcc_define_symbol(s, "__int128_t", "struct { unsigned char _dummy[16]; }"); | 893 | tcc_define_symbol(s, "__int128_t", "struct { unsigned char _dummy[16] __attribute((aligned(16))); }"); |
| 894 | # endif | 894 | # endif |
| 895 | # endif | 895 | # endif |
| 896 | # if TARGETOS_FreeBSD_kernel | 896 | # if TARGETOS_FreeBSD_kernel |
| @@ -903,7 +903,11 @@ LIBTCCAPI TCCState *tcc_new(void) · 6 unmodified lines | |||
| 903 | tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0"); | 903 | tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0"); |
| 904 | tcc_define_symbol(s, "_Pragma(x)", ""); | 904 | tcc_define_symbol(s, "_Pragma(x)", ""); |
| 905 | tcc_define_symbol(s, "__ELF__", "1"); | 905 | tcc_define_symbol(s, "__ELF__", "1"); |
| 906 | #if PTR_SIZE == 4 | ||
| 907 | tcc_define_symbol(s, "__i386__", "1"); | ||
| 908 | #else | ||
| 906 | tcc_define_symbol(s, "__amd64__", "1"); | 909 | tcc_define_symbol(s, "__amd64__", "1"); |
| 910 | #endif | ||
| 907 | tcc_define_symbol(s, "__builtin_huge_val()", "1e500"); | 911 | tcc_define_symbol(s, "__builtin_huge_val()", "1e500"); |
| 908 | tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f"); | 912 | tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f"); |
| 909 | tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L"); | 913 | tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L"); |
| @@ -957,7 +961,11 @@ LIBTCCAPI TCCState *tcc_new(void) · 47 unmodified lines | |||
| 957 | tcc_define_symbol(s, "__GNUC_MINOR__", "3"); | 961 | tcc_define_symbol(s, "__GNUC_MINOR__", "3"); |
| 958 | tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0"); | 962 | tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0"); |
| 959 | tcc_define_symbol(s, "__GNUC_STDC_INLINE__", "1"); | 963 | tcc_define_symbol(s, "__GNUC_STDC_INLINE__", "1"); |
| 964 | #if PTR_SIZE == 4 | ||
| 965 | tcc_define_symbol(s, "__i386__", "1"); | ||
| 966 | #else | ||
| 960 | tcc_define_symbol(s, "__amd64__", "1"); | 967 | tcc_define_symbol(s, "__amd64__", "1"); |
| 968 | #endif | ||
| 961 | # endif | 969 | # endif |
| 962 | # else | 970 | # else |
| 963 | tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int"); | 971 | tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int"); |
| @@ -1826,10 +1826,6 @@ struct dyn_inf { · 1825 unmodified lines | |||
| 1826 | unsigned long data_offset; | 1826 | unsigned long data_offset; |
| 1827 | addr_t rel_addr; | 1827 | addr_t rel_addr; |
| 1828 | addr_t rel_size; | 1828 | addr_t rel_size; |
| 1829 | #if PTR_SIZE == 4 && (TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel) | ||
| 1830 | addr_t bss_addr; | ||
| 1831 | addr_t bss_size; | ||
| 1832 | #endif | ||
| 1833 | }; | 1829 | }; |
| 1834 | 1830 | ||
| 1835 | /* Assign sections to segments and decide how are sections laid out when loaded | 1831 | /* Assign sections to segments and decide how are sections laid out when loaded |
| @@ -1886,9 +1882,6 @@ static int layout_sections(TCCState *s1, ElfW(Phdr) *phdr, int phnum, · 50 unmodified lines | |||
| 1886 | 1882 | ||
| 1887 | /* dynamic relocation table information, for .dynamic section */ | 1883 | /* dynamic relocation table information, for .dynamic section */ |
| 1888 | dyninf->rel_addr = dyninf->rel_size = 0; | 1884 | dyninf->rel_addr = dyninf->rel_size = 0; |
| 1889 | #if PTR_SIZE == 4 && (TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel) | ||
| 1890 | dyninf->bss_addr = dyninf->bss_size = 0; | ||
| 1891 | #endif | ||
| 1892 | 1885 | ||
| 1893 | for(j = 0; j < (phnum == 6 ? 3 : 2); j++) { | 1886 | for(j = 0; j < (phnum == 6 ? 3 : 2); j++) { |
| 1894 | Section *relocplt = s1->got ? s1->got->relocplt : NULL; | 1887 | Section *relocplt = s1->got ? s1->got->relocplt : NULL; |
| @@ -1961,20 +1954,9 @@ static int layout_sections(TCCState *s1, ElfW(Phdr) *phdr, int phnum, · 66 unmodified lines | |||
| 1961 | } | 1954 | } |
| 1962 | /* update dynamic relocation infos */ | 1955 | /* update dynamic relocation infos */ |
| 1963 | if (s->sh_type == SHT_RELX && s != relocplt) { | 1956 | if (s->sh_type == SHT_RELX && s != relocplt) { |
| 1964 | #if PTR_SIZE == 4 && (TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel) | ||
| 1965 | if (!strcmp(strsec->data + s->sh_name, ".rel.got")) { | ||
| 1966 | dyninf->rel_addr = addr; | ||
| 1967 | dyninf->rel_size += s->sh_size; /* XXX only first rel. */ | ||
| 1968 | } | ||
| 1969 | if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) { | ||
| 1970 | dyninf->bss_addr = addr; | ||
| 1971 | dyninf->bss_size = s->sh_size; /* XXX only first rel. */ | ||
| 1972 | } | ||
| 1973 | #else | ||
| 1974 | if (dyninf->rel_size == 0) | 1957 | if (dyninf->rel_size == 0) |
| 1975 | dyninf->rel_addr = addr; | 1958 | dyninf->rel_addr = addr; |
| 1976 | dyninf->rel_size += s->sh_size; | 1959 | dyninf->rel_size += s->sh_size; |
| 1977 | #endif | ||
| 1978 | } | 1960 | } |
| 1979 | addr += s->sh_size; | 1961 | addr += s->sh_size; |
| 1980 | if (s->sh_type != SHT_NOBITS) | 1962 | if (s->sh_type != SHT_NOBITS) |
| @@ -2115,15 +2097,6 @@ static void fill_dynamic(TCCState *s1, struct dyn_inf *dyninf) · 134 unmodified lines | |||
| 2115 | put_dt(dynamic, DT_PLTREL, DT_RELA); | 2097 | put_dt(dynamic, DT_PLTREL, DT_RELA); |
| 2116 | } | 2098 | } |
| 2117 | put_dt(dynamic, DT_RELACOUNT, 0); | 2099 | put_dt(dynamic, DT_RELACOUNT, 0); |
| 2118 | #else | ||
| 2119 | #if PTR_SIZE == 4 && (TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel) | ||
| 2120 | if (s1->got) | ||
| 2121 | put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr); | ||
| 2122 | put_dt(dynamic, DT_PLTRELSZ, dyninf->rel_size); | ||
| 2123 | put_dt(dynamic, DT_JMPREL, dyninf->rel_addr); | ||
| 2124 | put_dt(dynamic, DT_PLTREL, DT_REL); | ||
| 2125 | put_dt(dynamic, DT_REL, dyninf->bss_addr); | ||
| 2126 | put_dt(dynamic, DT_RELSZ, dyninf->bss_size); | ||
| 2127 | #else | 2100 | #else |
| 2128 | put_dt(dynamic, DT_REL, dyninf->rel_addr); | 2101 | put_dt(dynamic, DT_REL, dyninf->rel_addr); |
| 2129 | put_dt(dynamic, DT_RELSZ, dyninf->rel_size); | 2102 | put_dt(dynamic, DT_RELSZ, dyninf->rel_size); |
| @@ -2135,7 +2108,6 @@ static void fill_dynamic(TCCState *s1, struct dyn_inf *dyninf) · 5 unmodified lines | |||
| 2135 | put_dt(dynamic, DT_PLTREL, DT_REL); | 2108 | put_dt(dynamic, DT_PLTREL, DT_REL); |
| 2136 | } | 2109 | } |
| 2137 | put_dt(dynamic, DT_RELCOUNT, 0); | 2110 | put_dt(dynamic, DT_RELCOUNT, 0); |
| 2138 | #endif | ||
| 2139 | #endif | 2111 | #endif |
| 2140 | if (versym_section && verneed_section) { | 2112 | if (versym_section && verneed_section) { |
| 2141 | /* The dynamic linker can not handle VERSYM without VERNEED */ | 2113 | /* The dynamic linker can not handle VERSYM without VERNEED */ |
| @@ -2008,6 +2008,10 @@ ST_FUNC void gbound_args(int nb_args) · 2007 unmodified lines | |||
| 2008 | #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 | 2008 | #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 |
| 2009 | if (v == TOK_alloca) | 2009 | if (v == TOK_alloca) |
| 2010 | func_bound_add_epilog = 1; | 2010 | func_bound_add_epilog = 1; |
| 2011 | #endif | ||
| 2012 | #if TARGETOS_NetBSD | ||
| 2013 | if (v == TOK_longjmp) /* undo rename to __longjmp14 */ | ||
| 2014 | sv->sym->asm_label = TOK___bound_longjmp; | ||
| 2011 | #endif | 2015 | #endif |
| 2012 | } | 2016 | } |
| 2013 | } | 2017 | } |
| @@ -309,6 +309,7 @@ · 308 unmodified lines | |||
| 309 | DEF(TOK___bound_local_new, "__bound_local_new") | 309 | DEF(TOK___bound_local_new, "__bound_local_new") |
| 310 | DEF(TOK___bound_local_delete, "__bound_local_delete") | 310 | DEF(TOK___bound_local_delete, "__bound_local_delete") |
| 311 | DEF(TOK___bound_setjmp, "__bound_setjmp") | 311 | DEF(TOK___bound_setjmp, "__bound_setjmp") |
| 312 | DEF(TOK___bound_longjmp, "__bound_longjmp") | ||
| 312 | DEF(TOK___bound_new_region, "__bound_new_region") | 313 | DEF(TOK___bound_new_region, "__bound_new_region") |
| 313 | # ifdef TCC_TARGET_PE | 314 | # ifdef TCC_TARGET_PE |
| 314 | # ifdef TCC_TARGET_X86_64 | 315 | # ifdef TCC_TARGET_X86_64 |
| @@ -321,6 +322,7 @@ · 6 unmodified lines | |||
| 321 | # endif | 322 | # endif |
| 322 | DEF(TOK_setjmp, "setjmp") | 323 | DEF(TOK_setjmp, "setjmp") |
| 323 | DEF(TOK__setjmp, "_setjmp") | 324 | DEF(TOK__setjmp, "_setjmp") |
| 325 | DEF(TOK_longjmp, "longjmp") | ||
| 324 | #endif | 326 | #endif |
| 325 | 327 | ||
| 326 | /* Tiny Assembler */ | 328 | /* Tiny Assembler */ |
| @@ -145,8 +145,10 @@ static void check (void) · 144 unmodified lines | |||
| 145 | } | 145 | } |
| 146 | last_value = value; | 146 | last_value = value; |
| 147 | switch (value) { | 147 | switch (value) { |
| 148 | #ifndef __FreeBSD__ /* longjmp(jmp_buf, 0) not supported */ | ||
| 148 | case 0: | 149 | case 0: |
| 149 | jump (0); | 150 | jump (0); |
| 151 | #endif | ||
| 150 | default: | 152 | default: |
| 151 | if (value < 10) | 153 | if (value < 10) |
| 152 | jump (value + 1); | 154 | jump (value + 1); |
| @@ -1,7 +1,7 @@ | |||
| 1 | #include <stdio.h> | 1 | #include <stdio.h> |
| 2 | #include <assert.h> | 2 | #include <assert.h> |
| 3 | 3 | ||
| 4 | #ifndef _WIN32 | 4 | #if !(defined( _WIN32) || (defined(__FreeBSD__) && defined(__i386__))) |
| 5 | #define __fastcall __attribute((fastcall)) | 5 | #define __fastcall __attribute((fastcall)) |
| 6 | #endif | 6 | #endif |
| 7 | 7 | ||
| @@ -51,10 +51,10 @@ endif · 50 unmodified lines | |||
| 51 | ifneq (,$(filter OpenBSD FreeBSD NetBSD,$(TARGETOS))) | 51 | ifneq (,$(filter OpenBSD FreeBSD NetBSD,$(TARGETOS))) |
| 52 | SKIP += 106_versym.test # no pthread_condattr_setpshared | 52 | SKIP += 106_versym.test # no pthread_condattr_setpshared |
| 53 | SKIP += 114_bound_signal.test # libc problem signal/fork | 53 | SKIP += 114_bound_signal.test # libc problem signal/fork |
| 54 | SKIP += 116_bound_setjmp2.test # No TLS_FUNC/TLS_VAR in bcheck.c | ||
| 54 | endif | 55 | endif |
| 55 | ifeq ($(TARGETOS),NetBSD) | 56 | ifeq ($(TARGETOS),NetBSD) |
| 56 | SKIP += 113_btdll.test # text relocations | 57 | SKIP += 113_btdll.test # text relocations |
| 57 | SKIP += 115_bound_setjmp.test # longjmp renamed to __longjmp14 | ||
| 58 | endif | 58 | endif |
| 59 | 59 | ||
| 60 | # Some tests might need arguments | 60 | # Some tests might need arguments |