tccgen: nocode_wanted alternatively
tccgen.c: remove any 'nocode_wanted' checks, except in - greloca(), disables output elf symbols and relocs - get_reg(), will return just the first suitable reg) - save_regs(), will do nothing Some minor adjustments were made where nocode_wanted is set. xxx-gen.c: disable code output directly where it happens in functions: - g(), output disabled - gjmp(), will do nothing - gtst(), dto.
This commit is contained in:
34
x86_64-gen.c
34
x86_64-gen.c
@ -145,6 +145,8 @@ static int func_ret_sub;
|
||||
ST_FUNC void g(int c)
|
||||
{
|
||||
int ind1;
|
||||
if (nocode_wanted)
|
||||
return;
|
||||
ind1 = ind + 1;
|
||||
if (ind1 > cur_text_section->data_allocated)
|
||||
section_realloc(cur_text_section, ind1);
|
||||
@ -213,9 +215,6 @@ void gsym(int t)
|
||||
gsym_addr(t, ind);
|
||||
}
|
||||
|
||||
/* psym is used to put an instruction with a data field which is a
|
||||
reference to a symbol. It is in fact the same as oad ! */
|
||||
#define psym oad
|
||||
|
||||
static int is64_type(int t)
|
||||
{
|
||||
@ -227,18 +226,18 @@ static int is64_type(int t)
|
||||
/* instruction + 4 bytes data. Return the address of the data */
|
||||
ST_FUNC int oad(int c, int s)
|
||||
{
|
||||
int ind1;
|
||||
|
||||
int t;
|
||||
if (nocode_wanted)
|
||||
return s;
|
||||
o(c);
|
||||
ind1 = ind + 4;
|
||||
if (ind1 > cur_text_section->data_allocated)
|
||||
section_realloc(cur_text_section, ind1);
|
||||
write32le(cur_text_section->data + ind, s);
|
||||
s = ind;
|
||||
ind = ind1;
|
||||
return s;
|
||||
t = ind;
|
||||
gen_le32(s);
|
||||
return t;
|
||||
}
|
||||
|
||||
/* generate jmp to a label */
|
||||
#define gjmp2(instr,lbl) oad(instr,lbl)
|
||||
|
||||
ST_FUNC void gen_addr32(int r, Sym *sym, long c)
|
||||
{
|
||||
if (r & VT_SYM)
|
||||
@ -1703,7 +1702,7 @@ void gfunc_epilog(void)
|
||||
/* generate a jump to a label */
|
||||
int gjmp(int t)
|
||||
{
|
||||
return psym(0xe9, t);
|
||||
return gjmp2(0xe9, t);
|
||||
}
|
||||
|
||||
/* generate a jump to a fixed address */
|
||||
@ -1749,7 +1748,10 @@ ST_FUNC void gtst_addr(int inv, int a)
|
||||
ST_FUNC int gtst(int inv, int t)
|
||||
{
|
||||
int v = vtop->r & VT_VALMASK;
|
||||
if (v == VT_CMP) {
|
||||
|
||||
if (nocode_wanted) {
|
||||
;
|
||||
} else if (v == VT_CMP) {
|
||||
/* fast case : can jump directly since flags are set */
|
||||
if (vtop->c.i & 0x100)
|
||||
{
|
||||
@ -1766,11 +1768,11 @@ ST_FUNC int gtst(int inv, int t)
|
||||
else
|
||||
{
|
||||
g(0x0f);
|
||||
t = psym(0x8a, t); /* jp t */
|
||||
t = gjmp2(0x8a, t); /* jp t */
|
||||
}
|
||||
}
|
||||
g(0x0f);
|
||||
t = psym((vtop->c.i - 16) ^ inv, t);
|
||||
t = gjmp2((vtop->c.i - 16) ^ inv, t);
|
||||
} else if (v == VT_JMP || v == VT_JMPI) {
|
||||
/* && or || optimization */
|
||||
if ((v & 1) == inv) {
|
||||
|
||||
Reference in New Issue
Block a user