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
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# endif894# endif
895# endif895# endif
896# if TARGETOS_FreeBSD_kernel896# 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# endif969# endif
962# else970# else
963 tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int");971 tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int");
tccelf.c+0−28
@@ -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 loaded1831/* 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#else2100#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#endif2111#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 */
tccgen.c+4−0
@@ -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_642008#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#endif2015#endif
2012 }2016 }
2013}2017}
tcctok.h+2−0
@@ -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_PE314# ifdef TCC_TARGET_PE
314# ifdef TCC_TARGET_X86_64315# ifdef TCC_TARGET_X86_64
@@ -321,6 +322,7 @@ · 6 unmodified lines
321# endif322# 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#endif326#endif
325 327
326/* Tiny Assembler */328/* Tiny Assembler */
tests/tests2/115_bound_setjmp.c+2−0
@@ -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);
tests/tests2/99_fastcall.c+1−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 _WIN324#if !(defined( _WIN32) || (defined(__FreeBSD__) && defined(__i386__)))
5#define __fastcall __attribute((fastcall))5#define __fastcall __attribute((fastcall))
6#endif6#endif
7 7
tests/tests2/Makefile+1−1
@@ -51,10 +51,10 @@ endif · 50 unmodified lines
51ifneq (,$(filter OpenBSD FreeBSD NetBSD,$(TARGETOS)))51ifneq (,$(filter OpenBSD FreeBSD NetBSD,$(TARGETOS)))
52 SKIP += 106_versym.test # no pthread_condattr_setpshared52 SKIP += 106_versym.test # no pthread_condattr_setpshared
53 SKIP += 114_bound_signal.test # libc problem signal/fork53 SKIP += 114_bound_signal.test # libc problem signal/fork
54 SKIP += 116_bound_setjmp2.test # No TLS_FUNC/TLS_VAR in bcheck.c
54endif55endif
55ifeq ($(TARGETOS),NetBSD)56ifeq ($(TARGETOS),NetBSD)
56 SKIP += 113_btdll.test # text relocations57 SKIP += 113_btdll.test # text relocations
57 SKIP += 115_bound_setjmp.test # longjmp renamed to __longjmp14
58endif58endif
59 59
60# Some tests might need arguments60# 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