static void fout(Parser* p, char* fmt, ...)
{
- (void)p, (void)fmt;
va_list args;
va_start(args, fmt);
- vfprintf(stdout, fmt, args);
+ vfprintf(p->out, fmt, args);
va_end(args);
}
-
void declare_record_type(Parser* p, Type* type)
{
if (!type->name)
# Now build and test it
$CCCMD -o cerisec src/*.c "backend/ssa"/*.c \
-&& (./cerisec tests/Module.m | tee test.l) \
-&& llc test.l
+&& ./cerisec tests/Module.m \
rm -f Module
LexFile* file;
Tok tok;
char* name;
+ char* outpath;
+ FILE* out;
long curr_reg;
size_t scope;
size_t blockid;
// src/stdlib.c
void fatal(char* estr);
void* emalloc(size_t size);
+char* strmcat(char* first, ...);
// src/fs.c
void fs_init(void);
char* fs_read(char* path);
char* fs_modname(char* path);
char* fs_modfind(Parser* p, char* path);
+bool fs_exists(char* path);
// src/lex.c
void lexfile(Parser* ctx, char* path);
size_t Num_Paths = 0;
char** Paths = NULL;
-static char* strmcat(char* first, ...) {
- va_list args;
- /* calculate the length of the final string */
- size_t len = strlen(first);
- va_start(args, first);
- for (char* s = NULL; (s = va_arg(args, char*));)
- len += strlen(s);
- va_end(args);
- /* allocate the final string and copy the args into it */
- char *str = malloc(len+1), *curr = str;
- while (first && *first) *(curr++) = *(first++);
- va_start(args, first);
- for (char* s = NULL; (s = va_arg(args, char*));)
- while (s && *s) *(curr++) = *(s++);
- va_end(args);
- /* null terminate and return */
- *curr = '\0';
- return str;
-}
-
void fs_init(void)
{
/* get path variable */
{
char* retpath = NULL;
char* full_path = strmcat(path, "/", name, ".m", 0);
- if (access(full_path, F_OK) == 0)
+ if (fs_exists(full_path))
{
retpath = full_path;
}
}
return path;
}
+
+bool fs_exists(char* path)
+{
+ return (access(path, F_OK) == 0);
+}
+
EXIT_RULE();
}
+static char* get_fpath(char* base, char ext)
+{
+ char* path = strdup(base);
+ path[strlen(path)-1] = ext;
+ return path;
+}
+
static void init_parser(Parser* p, char* path)
{
char* fcontents = fs_read(path);
p->file->fbeg = fcontents;
p->file->fpos = fcontents;
p->curr_reg = 0;
+ p->outpath = get_fpath(path, 'l');
+ p->out = fopen(p->outpath, "wb");
if (p->name == NULL)
{
fatal("could not determine module name from path");
init_parser(&p, path);
codegen_init(&p);
module(&p);
+ fclose(p.out);
+
+ char* asm_path = get_fpath(path, 's');
+// char* c_path = get_fpath(path, 'c');
+ char* obj_path = get_fpath(path, 'o');
+
+ /* run llc to generate assembly listing */
+ char* llc_cmd = strmcat("llc -o \"", asm_path , "\" \"", p.outpath, "\"", 0);
+ printf("%s\n", llc_cmd);
+ if (system(llc_cmd) != 0)
+ {
+ fatal("assembler failed");
+ }
+ remove(p.outpath);
+
+ char* as_cmd = strmcat("cc -c -o \"", obj_path, "\" \"", asm_path, "\" ",
+// (fs_exists(c_path) ? strmcat("\"", c_path, "\"", 0) : ""),
+ 0);
+ printf("%s\n", as_cmd);
+ if (system(as_cmd) != 0)
+ {
+ fatal("assembler failed");
+ }
+ remove(asm_path);
}
if (!ptr) fatal("malloc()");
return ptr;
}
+
+char* strmcat(char* first, ...)
+{
+ va_list args;
+ /* calculate the length of the final string */
+ size_t len = strlen(first);
+ va_start(args, first);
+ for (char* s = NULL; (s = va_arg(args, char*));)
+ len += strlen(s);
+ va_end(args);
+ /* allocate the final string and copy the args into it */
+ char *str = emalloc(len+1), *curr = str;
+ while (first && *first) *(curr++) = *(first++);
+ va_start(args, first);
+ for (char* s = NULL; (s = va_arg(args, char*));)
+ while (s && *s) *(curr++) = *(s++);
+ va_end(args);
+ /* null terminate and return */
+ *curr = '\0';
+ return str;
+}
+++ /dev/null
-a
-b
-c
-
-// c = ...