mips/masm/tab.h

98 lines
1.8 KiB
C

/* Copyright (c) 2024 Freya Murphy */
#ifndef __TAB_H__
#define __TAB_H__
#include <stdint.h>
#include <stddef.h>
#include "lex.h"
///
/// Symbol table
///
#define SYM_SEC_STUB (UINT32_MAX)
enum symbol_type {
SYM_LOCAL,
SYM_GLOBAL,
SYM_EXTERN,
};
struct symbol {
// the offset of the symbol in a section
uint32_t offset;
// the index of section the symbol is in
uint32_t secidx;
// index into this table
uint32_t tabidx;
// the name of the symbol
struct string name;
// type
enum symbol_type type;
};
struct symbol_table {
// length in size in sym ammt
size_t len;
size_t size;
// symbols
struct symbol *symbols;
};
/* initalize a symbol table */
int symtab_init(struct symbol_table *symtab);
/* free the symbol table */
void symtab_free(struct symbol_table *symtab);
/* add a symbol to the symbol tbl */
int symtab_push(struct symbol_table *symtab, struct symbol *sym);
/* find a symbol by name in the symbol table */
int symtab_find(struct symbol_table *symtab, struct symbol **sym,
const char *name);
/* find an existing symbol with a name or stub a temp one */
int symtab_find_or_stub(struct symbol_table *symtab, struct symbol **sym,
const struct string *const name);
///
/// Reference table
///
enum reference_type {
REF_NONE,
REF_MIPS_16,
REF_MIPS_26,
REF_MIPS_PC16,
REF_MIPS_LO16,
REF_MIPS_HI16,
};
struct reference {
enum reference_type type;
struct symbol *symbol;
uint32_t offset;
};
struct reference_table {
// size
size_t len;
size_t size;
// references
struct reference *references;
};
/* initalize a reference table */
int reftab_init(struct reference_table *reftab);
/* free the reference table */
void reftab_free(struct reference_table *reftab);
/* add a reference to the reference tbl */
int reftab_push(struct reference_table *reftab, struct reference *ref);
#endif /* __TAB_H__ */