ack/mach/proto/mcg/symbol.c
2016-10-29 23:52:17 +02:00

66 lines
1.2 KiB
C

#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);
}
if (is_exported)
fprintf(outputfile, ".extern %s\n", platform_label(name));
}
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))
return symbol;
idf = idf->id_next;
}
}
return NULL;
}
/* vim: set sw=4 ts=4 expandtab : */