mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
Fix assignment to/from volatile types
Code like this was broken: char volatile vi = i; See testcase, happens in ideosyncratic legacy code sprinkling volatile all over.
This commit is contained in:
parent
8fc5a6a2a4
commit
80343ab7d8
@ -223,6 +223,8 @@ ST_FUNC void load(int r, SValue *sv)
|
|||||||
ft = sv->type.t;
|
ft = sv->type.t;
|
||||||
fc = sv->c.i;
|
fc = sv->c.i;
|
||||||
|
|
||||||
|
ft &= ~(VT_VOLATILE | VT_CONSTANT);
|
||||||
|
|
||||||
v = fr & VT_VALMASK;
|
v = fr & VT_VALMASK;
|
||||||
if (fr & VT_LVAL) {
|
if (fr & VT_LVAL) {
|
||||||
if (v == VT_LLOCAL) {
|
if (v == VT_LLOCAL) {
|
||||||
@ -298,6 +300,7 @@ ST_FUNC void store(int r, SValue *v)
|
|||||||
ft = v->type.t;
|
ft = v->type.t;
|
||||||
fc = v->c.i;
|
fc = v->c.i;
|
||||||
fr = v->r & VT_VALMASK;
|
fr = v->r & VT_VALMASK;
|
||||||
|
ft &= ~(VT_VOLATILE | VT_CONSTANT);
|
||||||
bt = ft & VT_BTYPE;
|
bt = ft & VT_BTYPE;
|
||||||
/* XXX: incorrect if float reg to reg */
|
/* XXX: incorrect if float reg to reg */
|
||||||
if (bt == VT_FLOAT) {
|
if (bt == VT_FLOAT) {
|
||||||
|
@ -119,6 +119,8 @@ int isid(int c);
|
|||||||
void funny_line_continuation (int, ..\
|
void funny_line_continuation (int, ..\
|
||||||
. );
|
. );
|
||||||
|
|
||||||
|
char via_volatile (char);
|
||||||
|
|
||||||
#define A 2
|
#define A 2
|
||||||
#define N 1234 + A
|
#define N 1234 + A
|
||||||
#define pf printf
|
#define pf printf
|
||||||
@ -693,6 +695,8 @@ int main(int argc, char **argv)
|
|||||||
callsave_test();
|
callsave_test();
|
||||||
builtin_frame_address_test();
|
builtin_frame_address_test();
|
||||||
intdiv_test();
|
intdiv_test();
|
||||||
|
if (via_volatile (42) != 42)
|
||||||
|
printf ("via_volatile broken\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2848,3 +2852,10 @@ void builtin_frame_address_test(void)
|
|||||||
bfa1(str-fp0);
|
bfa1(str-fp0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char via_volatile (char i)
|
||||||
|
{
|
||||||
|
char volatile vi;
|
||||||
|
vi = i;
|
||||||
|
return vi;
|
||||||
|
}
|
||||||
|
@ -369,6 +369,8 @@ void load(int r, SValue *sv)
|
|||||||
ft = sv->type.t & ~VT_DEFSIGN;
|
ft = sv->type.t & ~VT_DEFSIGN;
|
||||||
fc = sv->c.i;
|
fc = sv->c.i;
|
||||||
|
|
||||||
|
ft &= ~(VT_VOLATILE | VT_CONSTANT);
|
||||||
|
|
||||||
#ifndef TCC_TARGET_PE
|
#ifndef TCC_TARGET_PE
|
||||||
/* we use indirect access via got */
|
/* we use indirect access via got */
|
||||||
if ((fr & VT_VALMASK) == VT_CONST && (fr & VT_SYM) &&
|
if ((fr & VT_VALMASK) == VT_CONST && (fr & VT_SYM) &&
|
||||||
@ -532,6 +534,7 @@ void store(int r, SValue *v)
|
|||||||
ft = v->type.t;
|
ft = v->type.t;
|
||||||
fc = v->c.i;
|
fc = v->c.i;
|
||||||
fr = v->r & VT_VALMASK;
|
fr = v->r & VT_VALMASK;
|
||||||
|
ft &= ~(VT_VOLATILE | VT_CONSTANT);
|
||||||
bt = ft & VT_BTYPE;
|
bt = ft & VT_BTYPE;
|
||||||
|
|
||||||
#ifndef TCC_TARGET_PE
|
#ifndef TCC_TARGET_PE
|
||||||
|
Loading…
Reference in New Issue
Block a user