mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
tccasm: Fix local statics referenced from asms
The assembler uses the ->sym_scope member to walk up the symbols until finding a non-automatic symbol. Since reordering the members of Sym the sym_scope member contains a scope even for local statics. Formerly the use of asm_label for statics was implicitely clearing sym_scope, now we have to do that explicitely. Add a testcase for that, and one I encountered when moving the clearing of sym_scope too deep into the call chain (into put_extern_sym).
This commit is contained in:
parent
9bea88d616
commit
2acb04f7f2
6
tccgen.c
6
tccgen.c
@ -6861,6 +6861,9 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
|
|||||||
sym = sym_push(v, type, r | VT_SYM, 0);
|
sym = sym_push(v, type, r | VT_SYM, 0);
|
||||||
patch_storage(sym, ad, NULL);
|
patch_storage(sym, ad, NULL);
|
||||||
}
|
}
|
||||||
|
/* Local statics have a scope until now (for
|
||||||
|
warnings), remove it here. */
|
||||||
|
sym->sym_scope = 0;
|
||||||
/* update symbol definition */
|
/* update symbol definition */
|
||||||
put_extern_sym(sym, sec, addr, size);
|
put_extern_sym(sym, sec, addr, size);
|
||||||
} else {
|
} else {
|
||||||
@ -7257,6 +7260,9 @@ found:
|
|||||||
tcc_error("unsupported forward __alias__ attribute");
|
tcc_error("unsupported forward __alias__ attribute");
|
||||||
esym = &((ElfW(Sym) *)symtab_section->data)[alias_target->c];
|
esym = &((ElfW(Sym) *)symtab_section->data)[alias_target->c];
|
||||||
tsec.sh_num = esym->st_shndx;
|
tsec.sh_num = esym->st_shndx;
|
||||||
|
/* Local statics have a scope until now (for
|
||||||
|
warnings), remove it here. */
|
||||||
|
sym->sym_scope = 0;
|
||||||
put_extern_sym2(sym, &tsec, esym->st_value, esym->st_size, 0);
|
put_extern_sym2(sym, &tsec, esym->st_value, esym->st_size, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -3205,6 +3205,34 @@ char * get_asm_string (void)
|
|||||||
char * str = ((char*)bug_table) + bug_table[1];
|
char * str = ((char*)bug_table) + bug_table[1];
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This checks another constructs with local labels. */
|
||||||
|
extern unsigned char alld_stuff[];
|
||||||
|
asm(".data\n"
|
||||||
|
".byte 41\n"
|
||||||
|
"alld_stuff:\n"
|
||||||
|
"661:\n"
|
||||||
|
".byte 42\n"
|
||||||
|
"662:\n"
|
||||||
|
".pushsection .data.ignore\n"
|
||||||
|
".long 661b - .\n" /* This reference to 661 generates an external sym
|
||||||
|
which shouldn't somehow overwrite the offset that's
|
||||||
|
already determined for it. */
|
||||||
|
".popsection\n"
|
||||||
|
".byte 662b - 661b\n" /* So that this value is undeniably 1. */);
|
||||||
|
|
||||||
|
void asm_local_label_diff (void)
|
||||||
|
{
|
||||||
|
printf ("asm_local_label_diff: %d %d\n", alld_stuff[0], alld_stuff[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This checks that static local variables are available from assembler. */
|
||||||
|
void asm_local_statics (void)
|
||||||
|
{
|
||||||
|
static int localint = 41;
|
||||||
|
asm("incl %0" : "+m" (localint));
|
||||||
|
printf ("asm_local_statics: %d\n", localint);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned int set;
|
unsigned int set;
|
||||||
@ -3378,6 +3406,8 @@ void asm_test(void)
|
|||||||
asm volatile(".weak override_func3\n.set override_func3, base_func");
|
asm volatile(".weak override_func3\n.set override_func3, base_func");
|
||||||
override_func3();
|
override_func3();
|
||||||
printf("asmstr: %s\n", get_asm_string());
|
printf("asmstr: %s\n", get_asm_string());
|
||||||
|
asm_local_label_diff();
|
||||||
|
asm_local_statics();
|
||||||
#endif
|
#endif
|
||||||
/* Check that we can also load structs of appropriate layout
|
/* Check that we can also load structs of appropriate layout
|
||||||
into registers. */
|
into registers. */
|
||||||
|
Loading…
Reference in New Issue
Block a user