Document make_symbol

This commit is contained in:
Bill Currie 2011-01-25 08:29:00 +09:00
parent 0624408317
commit 49b7c2d527
2 changed files with 22 additions and 0 deletions

View File

@ -210,6 +210,24 @@ symbol_t *copy_symbol (symbol_t *symbol);
*/ */
symtab_t *symtab_flat_copy (symtab_t *symtab, symtab_t *parent); symtab_t *symtab_flat_copy (symtab_t *symtab, symtab_t *parent);
/** Create a global symbol and allocate space for a variable.
If the symbol already exists, it must be of the correct type. If it
is external, it will be converted to the given storage class and
allocatged space from the given defspace, otherwise it will be
returned.
If the symbol is new, it will be allocated space from the given
defspace with the given storage class.
\param name The name of the symbol.
\param type The type of the symbol.
\param space The defspace from which space will be allocated for the
symbol. Ignored for st_extern, must not be null for
others.
\param storage The storage class for the symbol. Only st_extern,
st_global, and st_static are valid.
*/
symbol_t *make_symbol (const char *name, struct type_s *type, symbol_t *make_symbol (const char *name, struct type_s *type,
struct defspace_s *space, enum storage_class_e storage); struct defspace_s *space, enum storage_class_e storage);

View File

@ -151,6 +151,10 @@ make_symbol (const char *name, type_t *type, defspace_t *space,
{ {
symbol_t *sym; symbol_t *sym;
if (storage != st_extern && storage != st_global && storage != st_static)
internal_error (0, "invalid storage class for %s", __FUNCTION__);
if (storage != st_extern && !space)
internal_error (0, "null space for non-external storage");
sym = symtab_lookup (pr.symtab, name); sym = symtab_lookup (pr.symtab, name);
if (!sym) { if (!sym) {
sym = new_symbol_type (name, type); sym = new_symbol_type (name, type);