mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-24 03:40:09 +08:00
tccrun: resign from "advanced" system calls (memaligh/gettid)
... let's stay compatible
This commit is contained in:
parent
d2f8ceac7a
commit
4e91d38ddc
2
libtcc.c
2
libtcc.c
@ -242,7 +242,7 @@ static void *(*reallocator)(void*, unsigned long) = default_reallocator;
|
||||
|
||||
LIBTCCAPI void tcc_set_realloc(TCCReallocFunc *realloc)
|
||||
{
|
||||
reallocator = realloc;
|
||||
reallocator = realloc ? realloc : default_reallocator;
|
||||
}
|
||||
|
||||
/* in case MEM_DEBUG is #defined */
|
||||
|
4
libtcc.h
4
libtcc.h
@ -10,13 +10,11 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************/
|
||||
/* set custom allocator for all allocations (optional) */
|
||||
|
||||
/* set custom allocator for all allocations (optional), NULL for default. */
|
||||
typedef void *TCCReallocFunc(void *ptr, unsigned long size);
|
||||
LIBTCCAPI void tcc_set_realloc(TCCReallocFunc *my_realloc);
|
||||
|
||||
/*****************************/
|
||||
|
||||
typedef struct TCCState TCCState;
|
||||
|
||||
/* create a new TCC compilation context */
|
||||
|
1
tcc.h
1
tcc.h
@ -1005,7 +1005,6 @@ struct TCCState {
|
||||
void *run_lj, *run_jb; /* sj/lj for tcc_setjmp()/tcc_run() */
|
||||
TCCBtFunc *bt_func;
|
||||
void *bt_data;
|
||||
int run_tid;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TCC_BACKTRACE
|
||||
|
47
tccrun.c
47
tccrun.c
@ -127,15 +127,7 @@ static int rt_mem(TCCState *s1, int size)
|
||||
ptr_diff = (char*)prw - (char*)ptr; /* = size; */
|
||||
//printf("map %p %p %p\n", ptr, prw, (void*)ptr_diff);
|
||||
#else
|
||||
# if !CONFIG_RUNMEM_ALIGNED
|
||||
ptr = tcc_malloc(size += PAGESIZE);
|
||||
# elif _WIN32
|
||||
ptr = _aligned_malloc(size, PAGESIZE);
|
||||
# else
|
||||
ptr = memalign(PAGESIZE, size);
|
||||
# endif
|
||||
if (NULL == ptr)
|
||||
return tcc_error_noabort("tccrun: could not allocate memory");
|
||||
ptr = tcc_malloc(size += PAGESIZE); /* one extra page to align malloc memory */
|
||||
#endif
|
||||
s1->run_ptr = ptr;
|
||||
s1->run_size = size;
|
||||
@ -200,13 +192,7 @@ ST_FUNC void tcc_run_free(TCCState *s1)
|
||||
# ifdef _WIN64
|
||||
win64_del_function_table(s1->run_function_table);
|
||||
# endif
|
||||
# if !CONFIG_RUNMEM_ALIGNED
|
||||
tcc_free(ptr);
|
||||
# elif _WIN32
|
||||
_aligned_free(ptr);
|
||||
# else
|
||||
libc_free(ptr);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -300,7 +286,7 @@ static void cleanup_sections(TCCState *s1)
|
||||
/* 0 = .text rwx other rw */
|
||||
/* 1 = .text rx .rdata r .data/.bss rw */
|
||||
#ifndef CONFIG_RUNMEM_RO
|
||||
# define CONFIG_RUNMEM_RO 1
|
||||
# define CONFIG_RUNMEM_RO 0
|
||||
#endif
|
||||
|
||||
/* relocate code. Return -1 on error, required size if ptr is NULL,
|
||||
@ -377,7 +363,7 @@ redo:
|
||||
align = 64;
|
||||
#endif
|
||||
/* start new page for different permissions */
|
||||
if (CONFIG_RUNMEM_RO || k < 2)
|
||||
if (CONFIG_RUNMEM_RO || k == 0)
|
||||
align = PAGESIZE;
|
||||
}
|
||||
s->sh_addralign = align;
|
||||
@ -556,26 +542,8 @@ static void st_unlink(TCCState *s1)
|
||||
rt_post_sem();
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
# define GETTID() GetCurrentThreadId()
|
||||
#elif defined __linux__
|
||||
# define GETTID() gettid()
|
||||
#elif 0
|
||||
# define GETTID() 1234 // threads not supported
|
||||
#endif
|
||||
|
||||
LIBTCCAPI void *_tcc_setjmp(TCCState *s1, void *p_jmp_buf, void *func, void *p_longjmp)
|
||||
{
|
||||
#ifdef GETTID
|
||||
int tid = GETTID();
|
||||
TCCState *s;
|
||||
rt_wait_sem();
|
||||
for (s = g_s1; s; s = s->next)
|
||||
if (s->run_tid == tid)
|
||||
s->run_tid = -1;
|
||||
s1->run_tid = (int)tid;
|
||||
rt_post_sem();
|
||||
#endif
|
||||
s1->run_lj = p_longjmp;
|
||||
s1->run_jb = p_jmp_buf;
|
||||
#ifdef CONFIG_TCC_BACKTRACE
|
||||
@ -593,14 +561,6 @@ LIBTCCAPI void tcc_set_backtrace_func(TCCState *s1, void *data, TCCBtFunc *func)
|
||||
|
||||
static TCCState *rt_find_state(rt_frame *f)
|
||||
{
|
||||
#ifdef GETTID
|
||||
int tid = GETTID();
|
||||
TCCState *s;
|
||||
for (s = g_s1; s; s = s->next)
|
||||
if (s->run_tid == tid)
|
||||
break;
|
||||
return s;
|
||||
#else
|
||||
TCCState *s;
|
||||
int level;
|
||||
addr_t pc;
|
||||
@ -620,7 +580,6 @@ static TCCState *rt_find_state(rt_frame *f)
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void rt_exit(rt_frame *f, int code)
|
||||
|
Loading…
Reference in New Issue
Block a user