added CIL target
This commit is contained in:
49
tcc.c
49
tcc.c
@ -42,6 +42,15 @@
|
||||
/* preprocessor debug */
|
||||
//#define PP_DEBUG
|
||||
|
||||
/* target selection */
|
||||
//#define TCC_TARGET_I386 /* i386 code generator */
|
||||
//#define TCC_TARGET_IL /* .NET CLI generator */
|
||||
|
||||
/* default target is I386 */
|
||||
#if !defined(TCC_TARGET_I386) && !defined(TCC_TARGET_IL)
|
||||
#define TCC_TARGET_I386
|
||||
#endif
|
||||
|
||||
/* amount of virtual memory associated to a section (currently, we do
|
||||
not realloc them) */
|
||||
#define SECTION_VSIZE (1024 * 1024)
|
||||
@ -460,6 +469,9 @@ extern float strtof (const char *__nptr, char **__endptr);
|
||||
extern long double strtold (const char *__nptr, char **__endptr);
|
||||
#endif
|
||||
|
||||
char *pstrcpy(char *buf, int buf_size, const char *s);
|
||||
char *pstrcat(char *buf, int buf_size, const char *s);
|
||||
|
||||
void sum(int l);
|
||||
void next(void);
|
||||
void next_nomacro(void);
|
||||
@ -524,7 +536,12 @@ static inline int is_float(int t)
|
||||
|
||||
#include "bcheck.c"
|
||||
|
||||
#ifdef TCC_TARGET_I386
|
||||
#include "i386-gen.c"
|
||||
#endif
|
||||
#ifdef TCC_TARGET_IL
|
||||
#include "il-gen.c"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TCC_STATIC
|
||||
|
||||
@ -2404,10 +2421,12 @@ void save_reg(int r)
|
||||
sv.r = VT_LOCAL | VT_LVAL;
|
||||
sv.c.ul = loc;
|
||||
store(r, &sv);
|
||||
/* XXX: x86 specific: need to pop fp register ST0 if saved */
|
||||
#ifdef TCC_TARGET_I386
|
||||
/* x86 specific: need to pop fp register ST0 if saved */
|
||||
if (r == REG_ST0) {
|
||||
o(0xd9dd); /* fstp %st(1) */
|
||||
}
|
||||
#endif
|
||||
/* special long long case */
|
||||
if ((p->t & VT_BTYPE) == VT_LLONG) {
|
||||
sv.c.ul += 4;
|
||||
@ -2677,10 +2696,12 @@ void vrotb(int n)
|
||||
/* pop stack value */
|
||||
void vpop(void)
|
||||
{
|
||||
#ifdef TCC_TARGET_I386
|
||||
/* for x86, we need to pop the FP stack */
|
||||
if ((vtop->r & VT_VALMASK) == REG_ST0) {
|
||||
o(0xd9dd); /* fstp %st(1) */
|
||||
}
|
||||
#endif
|
||||
vtop--;
|
||||
}
|
||||
|
||||
@ -2920,10 +2941,15 @@ void gen_opl(int op)
|
||||
if (op != TOK_EQ) {
|
||||
/* generate non equal test */
|
||||
/* XXX: NOT PORTABLE yet */
|
||||
if (a == 0)
|
||||
if (a == 0) {
|
||||
b = gtst(0, 0);
|
||||
else
|
||||
} else {
|
||||
#ifdef TCC_TARGET_I386
|
||||
b = psym(0x850f, 0);
|
||||
#else
|
||||
error("not implemented");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
/* compare low */
|
||||
gen_op(op);
|
||||
@ -4880,7 +4906,7 @@ void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg)
|
||||
a = gtst(1, 0);
|
||||
b = 0;
|
||||
block(&a, &b, case_sym, def_sym, case_reg);
|
||||
oad(0xe9, d - ind - 5); /* jmp */
|
||||
gjmp_addr(d);
|
||||
gsym(a);
|
||||
gsym_addr(b, d);
|
||||
} else if (tok == '{') {
|
||||
@ -4954,12 +4980,12 @@ void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg)
|
||||
c = ind;
|
||||
gexpr();
|
||||
vpop();
|
||||
oad(0xe9, d - ind - 5); /* jmp */
|
||||
gjmp_addr(d);
|
||||
gsym(e);
|
||||
}
|
||||
skip(')');
|
||||
block(&a, &b, case_sym, def_sym, case_reg);
|
||||
oad(0xe9, c - ind - 5); /* jmp */
|
||||
gjmp_addr(c);
|
||||
gsym(a);
|
||||
gsym_addr(b, c);
|
||||
} else
|
||||
@ -5050,9 +5076,9 @@ void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg)
|
||||
s = sym_push1(&label_stack, tok, VT_FORWARD, 0);
|
||||
/* label already defined */
|
||||
if (s->t & VT_FORWARD)
|
||||
s->c = gjmp(s->c); /* jmp xxx */
|
||||
s->c = gjmp(s->c);
|
||||
else
|
||||
oad(0xe9, s->c - ind - 5); /* jmp xxx */
|
||||
gjmp_addr(s->c);
|
||||
next();
|
||||
skip(';');
|
||||
} else {
|
||||
@ -5449,8 +5475,15 @@ int decl_initializer_alloc(int t, AttributeDef *ad, int r, int has_init)
|
||||
if ((r & VT_VALMASK) == VT_LOCAL) {
|
||||
if (do_bounds_check && (t & VT_ARRAY))
|
||||
loc--;
|
||||
#ifdef TCC_TARGET_IL
|
||||
/* XXX: ugly patch to allocate local variables for IL, just
|
||||
for testing */
|
||||
addr = loc;
|
||||
loc++;
|
||||
#else
|
||||
loc = (loc - size) & -align;
|
||||
addr = loc;
|
||||
#endif
|
||||
/* handles bounds */
|
||||
/* XXX: currently, since we do only one pass, we cannot track
|
||||
'&' operators, so we add only arrays */
|
||||
|
||||
Reference in New Issue
Block a user