tccrun/win64: cleanup runtime function table
- call RtlDeleteFunctionTable
(important for multiple compilations)
- the RUNTIME_FUNCTION* is now at the beginning of the
runtime memory. Therefor when tcc_relocate is called
with user memory, this should be done manually before
it is free'd:
RtlDeleteFunctionTable(*(void**)user_mem);
[ free(user_mem); ]
- x86_64-gen.c: expand char/short return values to int
This commit is contained in:
16
x86_64-gen.c
16
x86_64-gen.c
@ -893,6 +893,22 @@ void gfunc_call(int nb_args)
|
||||
}
|
||||
|
||||
gcall_or_jmp(0);
|
||||
/* other compilers don't clear the upper bits when returning char/short */
|
||||
bt = vtop->type.ref->type.t & (VT_BTYPE | VT_UNSIGNED);
|
||||
if (bt == (VT_BYTE | VT_UNSIGNED))
|
||||
o(0xc0b60f); /* movzbl %al, %eax */
|
||||
else if (bt == VT_BYTE)
|
||||
o(0xc0be0f); /* movsbl %al, %eax */
|
||||
else if (bt == VT_SHORT)
|
||||
o(0x98); /* cwtl */
|
||||
else if (bt == (VT_SHORT | VT_UNSIGNED))
|
||||
o(0xc0b70f); /* movzbl %al, %eax */
|
||||
#if 0 /* handled in gen_cast() */
|
||||
else if (bt == VT_INT)
|
||||
o(0x9848); /* cltq */
|
||||
else if (bt == (VT_INT | VT_UNSIGNED))
|
||||
o(0xc089); /* mov %eax,%eax */
|
||||
#endif
|
||||
vtop--;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user