History

more bsd updates

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

herman ten brugge committed 5 years ago

Commit 8f8abcc1 parent 888f4fd7 files · +19 −31Browse files

Unified · Split

7 files
  1. libtcc.c +9 −1
  2. tccelf.c +0 −28
  3. tccgen.c +4 −0
  4. tcctok.h +2 −0
  5. tests/tests2/115_bound_setjmp.c +2 −0
  6. tests/tests2/99_fastcall.c +1 −1
  7. tests/tests2/Makefile +1 −1
libtcc.c+9−1
@@ -890,7 +890,7 @@ LIBTCCAPI TCCState *tcc_new(void) · 889 unmodified lines
890890 tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)");
891891 # if defined(__aarch64__)
892892 /* 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))); }");
894894 # endif
895895 # endif
896896 # if TARGETOS_FreeBSD_kernel
@@ -903,7 +903,11 @@ LIBTCCAPI TCCState *tcc_new(void) · 6 unmodified lines
903903 tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0");
904904 tcc_define_symbol(s, "_Pragma(x)", "");
905905 tcc_define_symbol(s, "__ELF__", "1");
906+#if PTR_SIZE == 4
907+ tcc_define_symbol(s, "__i386__", "1");
908+#else
906909 tcc_define_symbol(s, "__amd64__", "1");
910+#endif
907911 tcc_define_symbol(s, "__builtin_huge_val()", "1e500");
908912 tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f");
909913 tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L");
@@ -957,7 +961,11 @@ LIBTCCAPI TCCState *tcc_new(void) · 47 unmodified lines
957961 tcc_define_symbol(s, "__GNUC_MINOR__", "3");
958962 tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0");
959963 tcc_define_symbol(s, "__GNUC_STDC_INLINE__", "1");
964+#if PTR_SIZE == 4
965+ tcc_define_symbol(s, "__i386__", "1");
966+#else
960967 tcc_define_symbol(s, "__amd64__", "1");
968+#endif
961969 # endif
962970 # else
963971 tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int");
tccelf.c+0−28
@@ -1826,10 +1826,6 @@ struct dyn_inf { · 1825 unmodified lines
18261826 unsigned long data_offset;
18271827 addr_t rel_addr;
18281828 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
18331829 };
18341830
18351831 /* 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
18861882
18871883 /* dynamic relocation table information, for .dynamic section */
18881884 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
18921885
18931886 for(j = 0; j < (phnum == 6 ? 3 : 2); j++) {
18941887 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
19611954 }
19621955 /* update dynamic relocation infos */
19631956 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
19741957 if (dyninf->rel_size == 0)
19751958 dyninf->rel_addr = addr;
19761959 dyninf->rel_size += s->sh_size;
1977−#endif
19781960 }
19791961 addr += s->sh_size;
19801962 if (s->sh_type != SHT_NOBITS)
@@ -2115,15 +2097,6 @@ static void fill_dynamic(TCCState *s1, struct dyn_inf *dyninf) · 134 unmodified lines
21152097 put_dt(dynamic, DT_PLTREL, DT_RELA);
21162098 }
21172099 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);
21272100 #else
21282101 put_dt(dynamic, DT_REL, dyninf->rel_addr);
21292102 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
21352108 put_dt(dynamic, DT_PLTREL, DT_REL);
21362109 }
21372110 put_dt(dynamic, DT_RELCOUNT, 0);
2138−#endif
21392111 #endif
21402112 if (versym_section && verneed_section) {
21412113 /* The dynamic linker can not handle VERSYM without VERNEED */
tccgen.c+4−0
@@ -2008,6 +2008,10 @@ ST_FUNC void gbound_args(int nb_args) · 2007 unmodified lines
20082008 #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
20092009 if (v == TOK_alloca)
20102010 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;
20112015 #endif
20122016 }
20132017 }
tcctok.h+2−0
@@ -309,6 +309,7 @@ · 308 unmodified lines
309309 DEF(TOK___bound_local_new, "__bound_local_new")
310310 DEF(TOK___bound_local_delete, "__bound_local_delete")
311311 DEF(TOK___bound_setjmp, "__bound_setjmp")
312+ DEF(TOK___bound_longjmp, "__bound_longjmp")
312313 DEF(TOK___bound_new_region, "__bound_new_region")
313314 # ifdef TCC_TARGET_PE
314315 # ifdef TCC_TARGET_X86_64
@@ -321,6 +322,7 @@ · 6 unmodified lines
321322 # endif
322323 DEF(TOK_setjmp, "setjmp")
323324 DEF(TOK__setjmp, "_setjmp")
325+ DEF(TOK_longjmp, "longjmp")
324326 #endif
325327
326328 /* Tiny Assembler */
tests/tests2/115_bound_setjmp.c+2−0
@@ -145,8 +145,10 @@ static void check (void) · 144 unmodified lines
145145 }
146146 last_value = value;
147147 switch (value) {
148+#ifndef __FreeBSD__ /* longjmp(jmp_buf, 0) not supported */
148149 case 0:
149150 jump (0);
151+#endif
150152 default:
151153 if (value < 10)
152154 jump (value + 1);
tests/tests2/99_fastcall.c+1−1
@@ -1,7 +1,7 @@
11 #include <stdio.h>
22 #include <assert.h>
33
4−#ifndef _WIN32
4+#if !(defined( _WIN32) || (defined(__FreeBSD__) && defined(__i386__)))
55 #define __fastcall __attribute((fastcall))
66 #endif
77
tests/tests2/Makefile+1−1
@@ -51,10 +51,10 @@ endif · 50 unmodified lines
5151 ifneq (,$(filter OpenBSD FreeBSD NetBSD,$(TARGETOS)))
5252 SKIP += 106_versym.test # no pthread_condattr_setpshared
5353 SKIP += 114_bound_signal.test # libc problem signal/fork
54+ SKIP += 116_bound_setjmp2.test # No TLS_FUNC/TLS_VAR in bcheck.c
5455 endif
5556 ifeq ($(TARGETOS),NetBSD)
5657 SKIP += 113_btdll.test # text relocations
57− SKIP += 115_bound_setjmp.test # longjmp renamed to __longjmp14
5858 endif
5959
6060 # Some tests might need arguments

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t