2016-09-18 21:24:54 +00:00
|
|
|
#include "mcg.h"
|
|
|
|
|
|
|
|
static void init_idf();
|
|
|
|
static struct idf* str2idf(char* tg, int cp);
|
|
|
|
|
|
|
|
#define IDF_TYPE struct symbol
|
|
|
|
#define IDF_NAME symbol
|
|
|
|
#include <idf_pkg.spec>
|
|
|
|
#include <idf_pkg.body>
|
|
|
|
|
|
|
|
void symbol_init(void)
|
|
|
|
{
|
|
|
|
init_idf();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool symbol_exists(const char* name)
|
|
|
|
{
|
|
|
|
return !!findidf((char*) name);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct symbol* symbol_get(const char* name)
|
|
|
|
{
|
|
|
|
struct idf* p = str2idf((char*) name, 0);
|
|
|
|
p->symbol.name = p->id_text;
|
|
|
|
return &p->symbol;
|
|
|
|
}
|
|
|
|
|
|
|
|
void symbol_declare(const char* name, bool is_exported, bool is_proc)
|
|
|
|
{
|
|
|
|
struct symbol* s = symbol_get(name);
|
|
|
|
s->is_exported = is_exported;
|
|
|
|
|
|
|
|
if (is_proc)
|
|
|
|
{
|
|
|
|
if (s->section == SECTION_UNKNOWN)
|
|
|
|
s->section = SECTION_TEXT;
|
|
|
|
else if (s->section != SECTION_TEXT)
|
|
|
|
fatal("section mismatch for '%s'", name);
|
|
|
|
}
|
2016-10-29 21:52:17 +00:00
|
|
|
|
|
|
|
if (is_exported)
|
|
|
|
fprintf(outputfile, ".extern %s\n", platform_label(name));
|
2016-09-18 21:24:54 +00:00
|
|
|
}
|
|
|
|
|
2016-09-23 23:04:00 +00:00
|
|
|
struct symbol* symbol_walk(symbol_walker_t* cb, void* user)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i=0; i<IDF_HASHSIZE; i++)
|
|
|
|
{
|
|
|
|
struct idf* idf = IDF_hashtable[i];
|
|
|
|
while (idf)
|
|
|
|
{
|
|
|
|
struct symbol* symbol = &idf->symbol;
|
|
|
|
if (cb(symbol, user))
|
2016-09-23 23:09:32 +00:00
|
|
|
return symbol;
|
2016-09-23 23:04:00 +00:00
|
|
|
idf = idf->id_next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2016-10-05 19:07:29 +00:00
|
|
|
/* vim: set sw=4 ts=4 expandtab : */
|
|
|
|
|