Alien-TinyCCx
view release on metacpan or search on metacpan
src/tccgen.c view on Meta::CPAN
Sym *s;
s = sym_malloc();
s->asm_label = 0;
s->v = v;
s->type.t = t;
s->type.ref = NULL;
#ifdef _WIN64
s->d = NULL;
#endif
s->c = c;
s->next = NULL;
/* add in stack */
s->prev = *ps;
*ps = s;
return s;
}
/* find a symbol and return its associated structure. 's' is the top
of the symbol stack */
ST_FUNC Sym *sym_find2(Sym *s, int v)
{
/* #ifdef CONFIG_TCC_EXSYMTAB */
v &= ~SYM_EXTENDED;
/* #endif */
while (s) {
/* #ifdef CONFIG_TCC_EXSYMTAB */
if ((s->v & ~SYM_EXTENDED) == v)
/* #else
if (s->v == v)
#endif */
return s;
else if (s->v == -1)
return NULL;
s = s->prev;
}
return NULL;
}
/* structure lookup */
ST_INLN Sym *struct_find(int v)
{
/* #ifdef CONFIG_TCC_EXSYMTAB */
v &= ~SYM_EXTENDED;
/* #endif */
v -= TOK_IDENT;
if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))
return NULL;
return table_ident[v]->sym_struct;
}
/* find an identifier */
ST_INLN Sym *sym_find(int v)
{
/* #ifdef CONFIG_TCC_EXSYMTAB */
int is_extended = v & SYM_EXTENDED;
v &= ~SYM_EXTENDED;
/* #endif */
v -= TOK_IDENT;
/* Does not exist in our table! The best we can do is return null. XXX Maybe
* should warn if this happens with an extended symbol, since that would be
* a sign of an inconsistent internal state. */
if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))
return NULL;
/* #ifdef CONFIG_TCC_EXSYMTAB */
/* If this is an extended symbol table reference, then we need to make sure
* that the extended symbol reference callback gets fired, but only once.
* We'll modify the TokenSym's tok field and remove the flag if the callback
* has been fired, so check if the TokenSym's tok field has the flag.
*/
if (is_extended && (table_ident[v]->tok & SYM_EXTENDED)) {
TokenSym *ts = table_ident[v];
/* Clear the extended symbol flag in the TokenSym. */
ts->tok &= ~SYM_EXTENDED;
/* XXX If we don't have the callback function... throw error? */
if ((ts->sym_identifier != NULL)
&& (ts->sym_identifier->type.t & VT_EXTERN)
&& (tcc_state->symtab_sym_used_callback != NULL))
{
/* Call the function, passing the symbol name. */
tcc_state->symtab_sym_used_callback(ts->str, ts->len,
tcc_state->symtab_callback_data);
}
}
/* #endif */
return table_ident[v]->sym_identifier;
}
/* push a given symbol on the symbol stack */
ST_FUNC Sym *sym_push(int v, CType *type, int r, int c)
{
Sym *s, **ps;
TokenSym *ts;
if (local_stack)
ps = &local_stack;
else {
/* #ifdef CONFIG_TCC_EXSYMTAB */
/* Global symbol stack. This is OK for the local symbol stack, but don't allow
* this for symbols that are in the extended symbol stack. There seem to be
* some issues associated with copying *all* TokenSyms, so this needs to be
* ironed out. For now, I'm removing the check. */
//
// if (v & SYM_EXTENDED) {
// tcc_error("Cannot use name '%s' as a global variable, it is already in the "
// "extended symbol table.", get_tok_str(v, 0));
// }
/* #endif */
ps = &global_stack;
}
/* #ifdef CONFIG_TCC_EXSYMTAB */
v &= ~SYM_EXTENDED;
/* #endif */
s = sym_push2(ps, v, type->t, c);
s->type.ref = type->ref;
s->r = r;
( run in 0.552 second using v1.01-cache-2.11-cpan-39bf76dae61 )