mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-01 04:20:09 +08:00
win32 defines + new internal file layer
This commit is contained in:
parent
bbd541d760
commit
9c06595a1e
19
bcheck.c
19
bcheck.c
@ -80,10 +80,12 @@ static void libc_free(void *ptr);
|
|||||||
static void install_malloc_hooks(void);
|
static void install_malloc_hooks(void);
|
||||||
static void restore_malloc_hooks(void);
|
static void restore_malloc_hooks(void);
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
static void *saved_malloc_hook;
|
static void *saved_malloc_hook;
|
||||||
static void *saved_free_hook;
|
static void *saved_free_hook;
|
||||||
static void *saved_realloc_hook;
|
static void *saved_realloc_hook;
|
||||||
static void *saved_memalign_hook;
|
static void *saved_memalign_hook;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern char _end;
|
extern char _end;
|
||||||
|
|
||||||
@ -123,8 +125,7 @@ static BoundEntry *__bound_find_region(BoundEntry *e1, void *p)
|
|||||||
return __bound_empty_t2;
|
return __bound_empty_t2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print a bound error and recurse thru 'nb_callers' to get the error
|
/* print a bound error message */
|
||||||
position */
|
|
||||||
static void bound_error(const void *caller, const char *fmt, ...)
|
static void bound_error(const void *caller, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
rt_error((unsigned long)caller, "%s", fmt);
|
rt_error((unsigned long)caller, "%s", fmt);
|
||||||
@ -132,7 +133,7 @@ static void bound_error(const void *caller, const char *fmt, ...)
|
|||||||
|
|
||||||
static void bound_alloc_error(void)
|
static void bound_alloc_error(void)
|
||||||
{
|
{
|
||||||
bound_error(NULL, "not enough memory for bound checking code\n");
|
bound_error(NULL, "not enough memory for bound checking code");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* currently, tcc cannot compile that because we use GNUC extensions */
|
/* currently, tcc cannot compile that because we use GNUC extensions */
|
||||||
@ -406,7 +407,7 @@ void __bound_init(void)
|
|||||||
size = BOUND_T23_SIZE;
|
size = BOUND_T23_SIZE;
|
||||||
mark_invalid(start, size);
|
mark_invalid(start, size);
|
||||||
|
|
||||||
#if !defined(__TINYC__)
|
#if !defined(__TINYC__) && !defined(WIN32)
|
||||||
/* malloc zone is also marked invalid */
|
/* malloc zone is also marked invalid */
|
||||||
start = (unsigned long)&_end;
|
start = (unsigned long)&_end;
|
||||||
size = 128 * 0x100000;
|
size = 128 * 0x100000;
|
||||||
@ -641,6 +642,7 @@ static unsigned long get_region_size(void *p)
|
|||||||
|
|
||||||
static void install_malloc_hooks(void)
|
static void install_malloc_hooks(void)
|
||||||
{
|
{
|
||||||
|
#ifndef WIN32
|
||||||
saved_malloc_hook = __malloc_hook;
|
saved_malloc_hook = __malloc_hook;
|
||||||
saved_free_hook = __free_hook;
|
saved_free_hook = __free_hook;
|
||||||
saved_realloc_hook = __realloc_hook;
|
saved_realloc_hook = __realloc_hook;
|
||||||
@ -649,14 +651,17 @@ static void install_malloc_hooks(void)
|
|||||||
__free_hook = __bound_free;
|
__free_hook = __bound_free;
|
||||||
__realloc_hook = __bound_realloc;
|
__realloc_hook = __bound_realloc;
|
||||||
__memalign_hook = __bound_memalign;
|
__memalign_hook = __bound_memalign;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void restore_malloc_hooks(void)
|
static void restore_malloc_hooks(void)
|
||||||
{
|
{
|
||||||
|
#ifndef WIN32
|
||||||
__malloc_hook = saved_malloc_hook;
|
__malloc_hook = saved_malloc_hook;
|
||||||
__free_hook = saved_free_hook;
|
__free_hook = saved_free_hook;
|
||||||
__realloc_hook = saved_realloc_hook;
|
__realloc_hook = saved_realloc_hook;
|
||||||
__memalign_hook = saved_memalign_hook;
|
__memalign_hook = saved_memalign_hook;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *libc_malloc(size_t size)
|
static void *libc_malloc(size_t size)
|
||||||
@ -693,6 +698,7 @@ void *__bound_malloc(size_t size, const void *caller)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
void *__bound_memalign(size_t size, size_t align, const void *caller)
|
void *__bound_memalign(size_t size, size_t align, const void *caller)
|
||||||
{
|
{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
@ -711,6 +717,7 @@ void *__bound_memalign(size_t size, size_t align, const void *caller)
|
|||||||
__bound_new_region(ptr, size);
|
__bound_new_region(ptr, size);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __bound_free(void *ptr, const void *caller)
|
void __bound_free(void *ptr, const void *caller)
|
||||||
{
|
{
|
||||||
@ -773,7 +780,7 @@ static void bound_dump(void)
|
|||||||
/* some useful checked functions */
|
/* some useful checked functions */
|
||||||
|
|
||||||
/* check that (p ... p + size - 1) lies inside 'p' region, if any */
|
/* check that (p ... p + size - 1) lies inside 'p' region, if any */
|
||||||
static void __bound_check(const void *p, ssize_t size)
|
static void __bound_check(const void *p, size_t size)
|
||||||
{
|
{
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return;
|
return;
|
||||||
@ -805,7 +812,7 @@ void *__bound_memset(void *dst, int c, size_t size)
|
|||||||
return memset(dst, c, size);
|
return memset(dst, c, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* resolve check check syms */
|
/* resolve bound check syms */
|
||||||
typedef struct BCSyms {
|
typedef struct BCSyms {
|
||||||
char *str;
|
char *str;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
262
tcc.c
262
tcc.c
@ -25,11 +25,15 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#ifndef WIN32
|
||||||
#include <sys/ucontext.h>
|
#include <sys/ucontext.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <elf.h>
|
#endif
|
||||||
#include <stab.h>
|
#include "elf.h"
|
||||||
#include <malloc.h>
|
#include "stab.h"
|
||||||
#ifndef CONFIG_TCC_STATIC
|
#ifndef CONFIG_TCC_STATIC
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif
|
#endif
|
||||||
@ -145,15 +149,22 @@ typedef struct AttributeDef {
|
|||||||
#define TYPE_ABSTRACT 1 /* type without variable */
|
#define TYPE_ABSTRACT 1 /* type without variable */
|
||||||
#define TYPE_DIRECT 2 /* type with variable */
|
#define TYPE_DIRECT 2 /* type with variable */
|
||||||
|
|
||||||
typedef struct {
|
#define IO_BUF_SIZE 8192
|
||||||
FILE *file;
|
|
||||||
char *filename;
|
typedef struct BufferedFile {
|
||||||
int line_num;
|
unsigned char *buf_ptr;
|
||||||
} IncludeFile;
|
unsigned char *buf_end;
|
||||||
|
int fd;
|
||||||
|
int line_num; /* current line number - here to simply code */
|
||||||
|
char filename[1024]; /* current filename - here to simply code */
|
||||||
|
unsigned char buffer[IO_BUF_SIZE + 1]; /* extra size for CH_EOB char */
|
||||||
|
} BufferedFile;
|
||||||
|
|
||||||
|
#define CH_EOB 0 /* end of buffer or '\0' char in file */
|
||||||
|
#define CH_EOF (-1) /* end of file */
|
||||||
|
|
||||||
/* parser */
|
/* parser */
|
||||||
FILE *file;
|
struct BufferedFile *file;
|
||||||
int line_num;
|
|
||||||
int ch, ch1, tok, tok1;
|
int ch, ch1, tok, tok1;
|
||||||
CValue tokc, tok1c;
|
CValue tokc, tok1c;
|
||||||
|
|
||||||
@ -185,14 +196,14 @@ int tok_ident;
|
|||||||
TokenSym **table_ident;
|
TokenSym **table_ident;
|
||||||
TokenSym *hash_ident[TOK_HASH_SIZE];
|
TokenSym *hash_ident[TOK_HASH_SIZE];
|
||||||
char token_buf[STRING_MAX_SIZE + 1];
|
char token_buf[STRING_MAX_SIZE + 1];
|
||||||
char *filename, *funcname;
|
char *funcname;
|
||||||
/* contains global symbols which remain between each translation unit */
|
/* contains global symbols which remain between each translation unit */
|
||||||
SymStack extern_stack;
|
SymStack extern_stack;
|
||||||
SymStack define_stack, global_stack, local_stack, label_stack;
|
SymStack define_stack, global_stack, local_stack, label_stack;
|
||||||
|
|
||||||
SValue vstack[VSTACK_SIZE], *vtop;
|
SValue vstack[VSTACK_SIZE], *vtop;
|
||||||
int *macro_ptr, *macro_ptr_allocated;
|
int *macro_ptr, *macro_ptr_allocated;
|
||||||
IncludeFile include_stack[INCLUDE_STACK_SIZE], *include_stack_ptr;
|
BufferedFile *include_stack[INCLUDE_STACK_SIZE], **include_stack_ptr;
|
||||||
int ifdef_stack[IFDEF_STACK_SIZE], *ifdef_stack_ptr;
|
int ifdef_stack[IFDEF_STACK_SIZE], *ifdef_stack_ptr;
|
||||||
char *include_paths[INCLUDE_PATHS_MAX];
|
char *include_paths[INCLUDE_PATHS_MAX];
|
||||||
int nb_include_paths;
|
int nb_include_paths;
|
||||||
@ -316,6 +327,8 @@ int tcc_ext = 1;
|
|||||||
#define TOK_A_SHL 0x81
|
#define TOK_A_SHL 0x81
|
||||||
#define TOK_A_SAR 0x82
|
#define TOK_A_SAR 0x82
|
||||||
|
|
||||||
|
#define TOK_EOF (-1) /* end of file */
|
||||||
|
|
||||||
/* all identificators and strings have token above that */
|
/* all identificators and strings have token above that */
|
||||||
#define TOK_IDENT 256
|
#define TOK_IDENT 256
|
||||||
|
|
||||||
@ -344,8 +357,10 @@ enum {
|
|||||||
TOK_LONG,
|
TOK_LONG,
|
||||||
TOK_REGISTER,
|
TOK_REGISTER,
|
||||||
TOK_SIGNED,
|
TOK_SIGNED,
|
||||||
|
TOK___SIGNED__, /* gcc keyword */
|
||||||
TOK_AUTO,
|
TOK_AUTO,
|
||||||
TOK_INLINE,
|
TOK_INLINE,
|
||||||
|
TOK___INLINE__, /* gcc keyword */
|
||||||
TOK_RESTRICT,
|
TOK_RESTRICT,
|
||||||
|
|
||||||
/* unsupported type */
|
/* unsupported type */
|
||||||
@ -392,9 +407,22 @@ enum {
|
|||||||
TOK___UNUSED__,
|
TOK___UNUSED__,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#define snprintf _snprintf
|
||||||
|
/* currently incorrect */
|
||||||
|
long double strtold(const char *nptr, char **endptr)
|
||||||
|
{
|
||||||
|
return (long double)strtod(nptr, endptr);
|
||||||
|
}
|
||||||
|
float strtof(const char *nptr, char **endptr)
|
||||||
|
{
|
||||||
|
return (float)strtod(nptr, endptr);
|
||||||
|
}
|
||||||
|
#else
|
||||||
/* XXX: need to define this to use them in non ISOC99 context */
|
/* XXX: need to define this to use them in non ISOC99 context */
|
||||||
extern float strtof (const char *__nptr, char **__endptr);
|
extern float strtof (const char *__nptr, char **__endptr);
|
||||||
extern long double strtold (const char *__nptr, char **__endptr);
|
extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
void sum(int l);
|
void sum(int l);
|
||||||
void next(void);
|
void next(void);
|
||||||
@ -495,7 +523,7 @@ static TCCSyms tcc_syms[] = {
|
|||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
void *dlsym(void *handle, char *symbol)
|
void *dlsym(void *handle, const char *symbol)
|
||||||
{
|
{
|
||||||
TCCSyms *p;
|
TCCSyms *p;
|
||||||
p = tcc_syms;
|
p = tcc_syms;
|
||||||
@ -582,25 +610,27 @@ unsigned long long __ldtoull(long double a)
|
|||||||
|
|
||||||
/********************************************************/
|
/********************************************************/
|
||||||
|
|
||||||
/* copy a string and truncate it */
|
/* copy a string and truncate it. */
|
||||||
char *pstrcpy(char *buf, int buf_size, const char *s)
|
char *pstrcpy(char *buf, int buf_size, const char *s)
|
||||||
{
|
{
|
||||||
char *q, *q_end;
|
char *q, *q_end;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
q = buf;
|
if (buf_size > 0) {
|
||||||
q_end = buf + buf_size - 1;
|
q = buf;
|
||||||
while (q < q_end) {
|
q_end = buf + buf_size - 1;
|
||||||
c = *s++;
|
while (q < q_end) {
|
||||||
if (c == '\0')
|
c = *s++;
|
||||||
break;
|
if (c == '\0')
|
||||||
*q++ = c;
|
break;
|
||||||
|
*q++ = c;
|
||||||
|
}
|
||||||
|
*q = '\0';
|
||||||
}
|
}
|
||||||
*q = '\0';
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* strcat and truncate */
|
/* strcat and truncate. */
|
||||||
char *pstrcat(char *buf, int buf_size, const char *s)
|
char *pstrcat(char *buf, int buf_size, const char *s)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
@ -624,12 +654,19 @@ Section *new_section(const char *name, int sh_type, int sh_flags)
|
|||||||
sec->sh_num = ++section_num;
|
sec->sh_num = ++section_num;
|
||||||
sec->sh_type = sh_type;
|
sec->sh_type = sh_type;
|
||||||
sec->sh_flags = sh_flags;
|
sec->sh_flags = sh_flags;
|
||||||
|
#ifdef WIN32
|
||||||
|
/* XXX: currently, a single malloc */
|
||||||
|
data = malloc(SECTION_VSIZE);
|
||||||
|
if (data == NULL)
|
||||||
|
error("could not alloc section '%s'", name);
|
||||||
|
#else
|
||||||
data = mmap(NULL, SECTION_VSIZE,
|
data = mmap(NULL, SECTION_VSIZE,
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS,
|
MAP_PRIVATE | MAP_ANONYMOUS,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
if (data == (void *)(-1))
|
if (data == (void *)(-1))
|
||||||
error("could not mmap section '%s'", name);
|
error("could not mmap section '%s'", name);
|
||||||
|
#endif
|
||||||
sec->data = data;
|
sec->data = data;
|
||||||
sec->data_ptr = data;
|
sec->data_ptr = data;
|
||||||
psec = &first_section;
|
psec = &first_section;
|
||||||
@ -706,11 +743,11 @@ static inline int toup(int c)
|
|||||||
|
|
||||||
void printline(void)
|
void printline(void)
|
||||||
{
|
{
|
||||||
IncludeFile *f;
|
BufferedFile **f;
|
||||||
for(f = include_stack; f < include_stack_ptr; f++)
|
for(f = include_stack; f < include_stack_ptr; f++)
|
||||||
fprintf(stderr, "In file included from %s:%d:\n",
|
fprintf(stderr, "In file included from %s:%d:\n",
|
||||||
f->filename, f->line_num);
|
(*f)->filename, (*f)->line_num);
|
||||||
fprintf(stderr, "%s:%d: ", filename, line_num);
|
fprintf(stderr, "%s:%d: ", file->filename, file->line_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const char *fmt, ...)
|
void error(const char *fmt, ...)
|
||||||
@ -976,39 +1013,94 @@ void sym_undef(SymStack *st, Sym *s)
|
|||||||
s->v = 0;
|
s->v = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no need to put that inline */
|
/* I/O layer */
|
||||||
int handle_eof(void)
|
|
||||||
|
BufferedFile *tcc_open(const char *filename)
|
||||||
{
|
{
|
||||||
if (include_stack_ptr == include_stack)
|
int fd;
|
||||||
return -1;
|
BufferedFile *bf;
|
||||||
/* add end of include file debug info */
|
|
||||||
if (do_debug) {
|
fd = open(filename, O_RDONLY);
|
||||||
put_stabd(N_EINCL, 0, 0);
|
if (fd < 0)
|
||||||
|
return NULL;
|
||||||
|
bf = malloc(sizeof(BufferedFile));
|
||||||
|
if (!bf) {
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
bf->fd = fd;
|
||||||
|
bf->buf_ptr = bf->buffer;
|
||||||
|
bf->buf_end = bf->buffer;
|
||||||
|
bf->buffer[0] = CH_EOB; /* put eob symbol */
|
||||||
|
pstrcpy(bf->filename, sizeof(bf->filename), filename);
|
||||||
|
bf->line_num = 1;
|
||||||
|
return bf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tcc_close(BufferedFile *bf)
|
||||||
|
{
|
||||||
|
close(bf->fd);
|
||||||
|
free(bf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read one char. MUST call tcc_fillbuf if CH_EOB is read */
|
||||||
|
#define TCC_GETC(bf) (*(bf)->buf_ptr++)
|
||||||
|
|
||||||
|
/* fill input buffer and return next char */
|
||||||
|
int tcc_getc_slow(BufferedFile *bf)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
/* only tries to read if really end of buffer */
|
||||||
|
if (bf->buf_ptr >= bf->buf_end) {
|
||||||
|
if (bf->fd != -1) {
|
||||||
|
len = read(bf->fd, bf->buffer, IO_BUF_SIZE);
|
||||||
|
if (len < 0)
|
||||||
|
len = 0;
|
||||||
|
} else {
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
bf->buf_ptr = bf->buffer;
|
||||||
|
bf->buf_end = bf->buffer + len;
|
||||||
|
*bf->buf_end = CH_EOB;
|
||||||
|
}
|
||||||
|
if (bf->buf_ptr < bf->buf_end) {
|
||||||
|
return *bf->buf_ptr++;
|
||||||
|
} else {
|
||||||
|
bf->buf_ptr = bf->buf_end;
|
||||||
|
return CH_EOF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no need to put that inline */
|
||||||
|
void handle_eob(void)
|
||||||
|
{
|
||||||
|
for(;;) {
|
||||||
|
ch1 = tcc_getc_slow(file);
|
||||||
|
if (ch1 != CH_EOF)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (include_stack_ptr == include_stack)
|
||||||
|
return;
|
||||||
|
/* add end of include file debug info */
|
||||||
|
if (do_debug) {
|
||||||
|
put_stabd(N_EINCL, 0, 0);
|
||||||
|
}
|
||||||
|
/* pop include stack */
|
||||||
|
tcc_close(file);
|
||||||
|
include_stack_ptr--;
|
||||||
|
file = *include_stack_ptr;
|
||||||
}
|
}
|
||||||
/* pop include stack */
|
|
||||||
fclose(file);
|
|
||||||
free(filename);
|
|
||||||
include_stack_ptr--;
|
|
||||||
file = include_stack_ptr->file;
|
|
||||||
filename = include_stack_ptr->filename;
|
|
||||||
line_num = include_stack_ptr->line_num;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read next char from current input file */
|
/* read next char from current input file */
|
||||||
static inline void inp(void)
|
static inline void inp(void)
|
||||||
{
|
{
|
||||||
redo:
|
ch1 = TCC_GETC(file);
|
||||||
/* faster than fgetc */
|
/* end of buffer/file handling */
|
||||||
ch1 = getc_unlocked(file);
|
if (ch1 == CH_EOB)
|
||||||
if (ch1 == -1) {
|
handle_eob();
|
||||||
if (handle_eof() < 0)
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
goto redo;
|
|
||||||
}
|
|
||||||
if (ch1 == '\n')
|
if (ch1 == '\n')
|
||||||
line_num++;
|
file->line_num++;
|
||||||
// printf("ch1=%c 0x%x\n", ch1, ch1);
|
// printf("ch1=%c 0x%x\n", ch1, ch1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1219,7 +1311,7 @@ void preprocess(void)
|
|||||||
int size, i, c, v, t, *str, len;
|
int size, i, c, v, t, *str, len;
|
||||||
char buf[1024], *q, *p;
|
char buf[1024], *q, *p;
|
||||||
char buf1[1024];
|
char buf1[1024];
|
||||||
FILE *f;
|
BufferedFile *f;
|
||||||
Sym **ps, *first, *s;
|
Sym **ps, *first, *s;
|
||||||
|
|
||||||
cinp();
|
cinp();
|
||||||
@ -1304,15 +1396,15 @@ void preprocess(void)
|
|||||||
if (c == '\"') {
|
if (c == '\"') {
|
||||||
/* first search in current dir if "header.h" */
|
/* first search in current dir if "header.h" */
|
||||||
size = 0;
|
size = 0;
|
||||||
p = strrchr(filename, '/');
|
p = strrchr(file->filename, '/');
|
||||||
if (p)
|
if (p)
|
||||||
size = p + 1 - filename;
|
size = p + 1 - file->filename;
|
||||||
if (size > sizeof(buf1) - 1)
|
if (size > sizeof(buf1) - 1)
|
||||||
size = sizeof(buf1) - 1;
|
size = sizeof(buf1) - 1;
|
||||||
memcpy(buf1, filename, size);
|
memcpy(buf1, file->filename, size);
|
||||||
buf1[size] = '\0';
|
buf1[size] = '\0';
|
||||||
pstrcat(buf1, sizeof(buf1), buf);
|
pstrcat(buf1, sizeof(buf1), buf);
|
||||||
f = fopen(buf1, "r");
|
f = tcc_open(buf1);
|
||||||
if (f)
|
if (f)
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
@ -1321,7 +1413,7 @@ void preprocess(void)
|
|||||||
strcpy(buf1, include_paths[i]);
|
strcpy(buf1, include_paths[i]);
|
||||||
strcat(buf1, "/");
|
strcat(buf1, "/");
|
||||||
strcat(buf1, buf);
|
strcat(buf1, buf);
|
||||||
f = fopen(buf1, "r");
|
f = tcc_open(buf1);
|
||||||
if (f)
|
if (f)
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
@ -1330,16 +1422,11 @@ void preprocess(void)
|
|||||||
found:
|
found:
|
||||||
/* push current file in stack */
|
/* push current file in stack */
|
||||||
/* XXX: fix current line init */
|
/* XXX: fix current line init */
|
||||||
include_stack_ptr->file = file;
|
*include_stack_ptr++ = file;
|
||||||
include_stack_ptr->filename = filename;
|
|
||||||
include_stack_ptr->line_num = line_num;
|
|
||||||
include_stack_ptr++;
|
|
||||||
file = f;
|
file = f;
|
||||||
filename = strdup(buf1);
|
|
||||||
line_num = 1;
|
|
||||||
/* add include file debug info */
|
/* add include file debug info */
|
||||||
if (do_debug) {
|
if (do_debug) {
|
||||||
put_stabs(filename, N_BINCL, 0, 0, 0);
|
put_stabs(file->filename, N_BINCL, 0, 0, 0);
|
||||||
}
|
}
|
||||||
} else if (tok == TOK_IFNDEF) {
|
} else if (tok == TOK_IFNDEF) {
|
||||||
c = 1;
|
c = 1;
|
||||||
@ -1382,14 +1469,14 @@ void preprocess(void)
|
|||||||
next();
|
next();
|
||||||
if (tok != TOK_CINT)
|
if (tok != TOK_CINT)
|
||||||
error("#line");
|
error("#line");
|
||||||
line_num = tokc.i;
|
file->line_num = tokc.i;
|
||||||
skip_spaces();
|
skip_spaces();
|
||||||
if (ch != '\n') {
|
if (ch != '\n') {
|
||||||
next();
|
next();
|
||||||
if (tok != TOK_STR)
|
if (tok != TOK_STR)
|
||||||
error("#line");
|
error("#line");
|
||||||
/* XXX: potential memory leak */
|
pstrcpy(file->filename, sizeof(file->filename),
|
||||||
filename = strdup(get_tok_str(tok, &tokc));
|
get_tok_str(tok, &tokc));
|
||||||
}
|
}
|
||||||
} else if (tok == TOK_ERROR) {
|
} else if (tok == TOK_ERROR) {
|
||||||
error("#error");
|
error("#error");
|
||||||
@ -2025,10 +2112,10 @@ void macro_subst(int **tok_str, int *tok_len,
|
|||||||
break;
|
break;
|
||||||
/* special macros */
|
/* special macros */
|
||||||
if (tok == TOK___LINE__) {
|
if (tok == TOK___LINE__) {
|
||||||
cval.i = line_num;
|
cval.i = file->line_num;
|
||||||
tok_add2(tok_str, tok_len, TOK_CINT, &cval);
|
tok_add2(tok_str, tok_len, TOK_CINT, &cval);
|
||||||
} else if (tok == TOK___FILE__) {
|
} else if (tok == TOK___FILE__) {
|
||||||
cval.ts = tok_alloc(filename, 0);
|
cval.ts = tok_alloc(file->filename, 0);
|
||||||
tok_add2(tok_str, tok_len, TOK_STR, &cval);
|
tok_add2(tok_str, tok_len, TOK_STR, &cval);
|
||||||
} else if (tok == TOK___DATE__) {
|
} else if (tok == TOK___DATE__) {
|
||||||
cval.ts = tok_alloc("Jan 1 1970", 0);
|
cval.ts = tok_alloc("Jan 1 1970", 0);
|
||||||
@ -3912,8 +3999,10 @@ int parse_btype(int *type_ptr, AttributeDef *ad)
|
|||||||
case TOK_VOLATILE:
|
case TOK_VOLATILE:
|
||||||
case TOK_REGISTER:
|
case TOK_REGISTER:
|
||||||
case TOK_SIGNED:
|
case TOK_SIGNED:
|
||||||
|
case TOK___SIGNED__:
|
||||||
case TOK_AUTO:
|
case TOK_AUTO:
|
||||||
case TOK_INLINE:
|
case TOK_INLINE:
|
||||||
|
case TOK___INLINE__:
|
||||||
case TOK_RESTRICT:
|
case TOK_RESTRICT:
|
||||||
next();
|
next();
|
||||||
break;
|
break;
|
||||||
@ -4665,10 +4754,10 @@ void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg)
|
|||||||
|
|
||||||
/* generate line number info */
|
/* generate line number info */
|
||||||
if (do_debug &&
|
if (do_debug &&
|
||||||
(last_line_num != line_num || last_ind != ind)) {
|
(last_line_num != file->line_num || last_ind != ind)) {
|
||||||
put_stabn(N_SLINE, 0, line_num, ind - func_ind);
|
put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
|
||||||
last_ind = ind;
|
last_ind = ind;
|
||||||
last_line_num = line_num;
|
last_line_num = file->line_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tok == TOK_IF) {
|
if (tok == TOK_IF) {
|
||||||
@ -5339,7 +5428,7 @@ void put_func_debug(int t)
|
|||||||
/* XXX: we put here a dummy type */
|
/* XXX: we put here a dummy type */
|
||||||
snprintf(buf, sizeof(buf), "%s:%c1",
|
snprintf(buf, sizeof(buf), "%s:%c1",
|
||||||
funcname, t & VT_STATIC ? 'f' : 'F');
|
funcname, t & VT_STATIC ? 'f' : 'F');
|
||||||
put_stabs(buf, N_FUN, 0, line_num, ind);
|
put_stabs(buf, N_FUN, 0, file->line_num, ind);
|
||||||
func_ind = ind;
|
func_ind = ind;
|
||||||
last_ind = 0;
|
last_ind = 0;
|
||||||
last_line_num = 0;
|
last_line_num = 0;
|
||||||
@ -5533,13 +5622,11 @@ int tcc_compile_file(const char *filename1)
|
|||||||
Sym *define_start;
|
Sym *define_start;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
|
|
||||||
line_num = 1;
|
|
||||||
funcname = "";
|
funcname = "";
|
||||||
filename = (char *)filename1;
|
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
file = tcc_open(filename1);
|
||||||
if (!file)
|
if (!file)
|
||||||
error("file '%s' not found", filename);
|
error("file '%s' not found", filename1);
|
||||||
include_stack_ptr = include_stack;
|
include_stack_ptr = include_stack;
|
||||||
ifdef_stack_ptr = ifdef_stack;
|
ifdef_stack_ptr = ifdef_stack;
|
||||||
|
|
||||||
@ -5551,7 +5638,8 @@ int tcc_compile_file(const char *filename1)
|
|||||||
getcwd(buf, sizeof(buf));
|
getcwd(buf, sizeof(buf));
|
||||||
pstrcat(buf, sizeof(buf), "/");
|
pstrcat(buf, sizeof(buf), "/");
|
||||||
put_stabs(buf, N_SO, 0, 0, (unsigned long)text_section->data_ptr);
|
put_stabs(buf, N_SO, 0, 0, (unsigned long)text_section->data_ptr);
|
||||||
put_stabs(filename, N_SO, 0, 0, (unsigned long)text_section->data_ptr);
|
put_stabs(file->filename, N_SO, 0, 0,
|
||||||
|
(unsigned long)text_section->data_ptr);
|
||||||
}
|
}
|
||||||
/* define common 'char *' type because it is often used internally
|
/* define common 'char *' type because it is often used internally
|
||||||
for arrays and struct dereference */
|
for arrays and struct dereference */
|
||||||
@ -5564,7 +5652,7 @@ int tcc_compile_file(const char *filename1)
|
|||||||
decl(VT_CONST);
|
decl(VT_CONST);
|
||||||
if (tok != -1)
|
if (tok != -1)
|
||||||
expect("declaration");
|
expect("declaration");
|
||||||
fclose(file);
|
tcc_close(file);
|
||||||
|
|
||||||
/* end of translation unit info */
|
/* end of translation unit info */
|
||||||
if (do_debug) {
|
if (do_debug) {
|
||||||
@ -5993,6 +6081,7 @@ void rt_error(unsigned long pc, const char *fmt, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
/* signal handler for fatal errors */
|
/* signal handler for fatal errors */
|
||||||
static void sig_error(int signum, siginfo_t *siginf, void *puc)
|
static void sig_error(int signum, siginfo_t *siginf, void *puc)
|
||||||
{
|
{
|
||||||
@ -6033,19 +6122,23 @@ static void sig_error(int signum, siginfo_t *siginf, void *puc)
|
|||||||
}
|
}
|
||||||
exit(255);
|
exit(255);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* launch the compiled program with the given arguments */
|
/* launch the compiled program with the given arguments */
|
||||||
int launch_exe(int argc, char **argv)
|
int launch_exe(int argc, char **argv)
|
||||||
{
|
{
|
||||||
Sym *s;
|
Sym *s;
|
||||||
int (*t)();
|
int (*t)();
|
||||||
struct sigaction sigact;
|
|
||||||
|
|
||||||
s = sym_find1(&extern_stack, TOK_MAIN);
|
s = sym_find1(&extern_stack, TOK_MAIN);
|
||||||
if (!s || (s->r & VT_FORWARD))
|
if (!s || (s->r & VT_FORWARD))
|
||||||
error("main() not defined");
|
error("main() not defined");
|
||||||
|
|
||||||
if (do_debug) {
|
if (do_debug) {
|
||||||
|
#ifdef WIN32
|
||||||
|
error("debug mode currently not available for Windows");
|
||||||
|
#else
|
||||||
|
struct sigaction sigact;
|
||||||
/* install TCC signal handlers to print debug info on fatal
|
/* install TCC signal handlers to print debug info on fatal
|
||||||
runtime errors */
|
runtime errors */
|
||||||
sigact.sa_flags = SA_SIGINFO | SA_ONESHOT;
|
sigact.sa_flags = SA_SIGINFO | SA_ONESHOT;
|
||||||
@ -6056,9 +6149,13 @@ int launch_exe(int argc, char **argv)
|
|||||||
sigaction(SIGSEGV, &sigact, NULL);
|
sigaction(SIGSEGV, &sigact, NULL);
|
||||||
sigaction(SIGBUS, &sigact, NULL);
|
sigaction(SIGBUS, &sigact, NULL);
|
||||||
sigaction(SIGABRT, &sigact, NULL);
|
sigaction(SIGABRT, &sigact, NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_bounds_check) {
|
if (do_bounds_check) {
|
||||||
|
#ifdef WIN32
|
||||||
|
error("bound checking currently not available for Windows");
|
||||||
|
#else
|
||||||
int *p, *p_end;
|
int *p, *p_end;
|
||||||
__bound_init();
|
__bound_init();
|
||||||
/* add all known static regions */
|
/* add all known static regions */
|
||||||
@ -6068,6 +6165,7 @@ int launch_exe(int argc, char **argv)
|
|||||||
__bound_new_region((void *)p[0], p[1]);
|
__bound_new_region((void *)p[0], p[1]);
|
||||||
p += 2;
|
p += 2;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
t = (int (*)())s->c;
|
t = (int (*)())s->c;
|
||||||
@ -6077,7 +6175,7 @@ int launch_exe(int argc, char **argv)
|
|||||||
|
|
||||||
void help(void)
|
void help(void)
|
||||||
{
|
{
|
||||||
printf("tcc version 0.9.3 - Tiny C Compiler - Copyright (C) 2001, 2002 Fabrice Bellard\n"
|
printf("tcc version 0.9.4 - Tiny C Compiler - Copyright (C) 2001, 2002 Fabrice Bellard\n"
|
||||||
"usage: tcc [-Idir] [-Dsym[=val]] [-Usym] [-llib] [-g] [-b]\n"
|
"usage: tcc [-Idir] [-Dsym[=val]] [-Usym] [-llib] [-g] [-b]\n"
|
||||||
" [-i infile] infile [infile_args...]\n"
|
" [-i infile] infile [infile_args...]\n"
|
||||||
"\n"
|
"\n"
|
||||||
@ -6103,7 +6201,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* add all tokens */
|
/* add all tokens */
|
||||||
tok_ident = TOK_IDENT;
|
tok_ident = TOK_IDENT;
|
||||||
p = "int\0void\0char\0if\0else\0while\0break\0return\0for\0extern\0static\0unsigned\0goto\0do\0continue\0switch\0case\0const\0volatile\0long\0register\0signed\0auto\0inline\0restrict\0float\0double\0_Bool\0short\0struct\0union\0typedef\0default\0enum\0sizeof\0__attribute__\0define\0include\0ifdef\0ifndef\0elif\0endif\0defined\0undef\0error\0line\0__LINE__\0__FILE__\0__DATE__\0__TIME__\0__VA_ARGS__\0__func__\0main\0section\0__section__\0aligned\0__aligned__\0unused\0__unused__\0";
|
p = "int\0void\0char\0if\0else\0while\0break\0return\0for\0extern\0static\0unsigned\0goto\0do\0continue\0switch\0case\0const\0volatile\0long\0register\0signed\0__signed__\0auto\0inline\0__inline__\0restrict\0float\0double\0_Bool\0short\0struct\0union\0typedef\0default\0enum\0sizeof\0__attribute__\0define\0include\0ifdef\0ifndef\0elif\0endif\0defined\0undef\0error\0line\0__LINE__\0__FILE__\0__DATE__\0__TIME__\0__VA_ARGS__\0__func__\0main\0section\0__section__\0aligned\0__aligned__\0unused\0__unused__\0";
|
||||||
while (*p) {
|
while (*p) {
|
||||||
r = p;
|
r = p;
|
||||||
while (*r++);
|
while (*r++);
|
||||||
|
Loading…
Reference in New Issue
Block a user