issue #126 use setjmp/longjmp for error handling

pull/159/head
Dibyendu Majumdar 6 years ago
parent 52800b4be9
commit b1fc484492

@ -2210,45 +2210,48 @@ bool dmrC_omrcompile(int argc, char **argv, JIT_ContextRef module, const char *i
C->codegen = 1; /* Disables macros related to vararg processing */
C->Wdecl = 0;
symlist = dmrC_sparse_initialize(C, argc, argv, &filelist);
int rc = 0;
if (compile(C, module, symlist)) {
/* We need ->phi_users */
/* This flag enables call to dmrC_track_pseudo_death() in
linearize.c which sets
phi_users list on PHISOURCE instructions */
C->dbg_dead = 1;
FOR_EACH_PTR(filelist, file)
{
symlist = dmrC_sparse(C, file);
if (C->die_if_error) {
rc = 1;
break;
}
if (!compile(C, module, symlist)) {
rc = 1;
break;
}
}
END_FOR_EACH_PTR(file);
if (inputbuffer && rc == 0) {
char *buffer = strdup(inputbuffer);
if (!buffer)
rc = 1;
else {
symlist = dmrC_sparse_buffer(C, "buffer", buffer, 0);
free(buffer);
if (C->die_if_error) {
if (!setjmp(C->jmpbuf)) {
symlist = dmrC_sparse_initialize(C, argc, argv, &filelist);
if (compile(C, module, symlist)) {
/* We need ->phi_users */
/* This flag enables call to dmrC_track_pseudo_death() in
linearize.c which sets
phi_users list on PHISOURCE instructions */
C->dbg_dead = 1;
FOR_EACH_PTR(filelist, file)
{
symlist = dmrC_sparse(C, file);
if (C->die_if_error || !symlist) {
rc = 1;
} else if (!compile(C, module, symlist)) {
break;
}
if (!compile(C, module, symlist)) {
rc = 1;
break;
}
}
}
} else
END_FOR_EACH_PTR(file);
if (inputbuffer && rc == 0) {
char *buffer = strdup(inputbuffer);
if (!buffer)
rc = 1;
else {
symlist = dmrC_sparse_buffer(C, "buffer", buffer, 0);
free(buffer);
if (C->die_if_error || !symlist) {
rc = 1;
} else if (!compile(C, module, symlist)) {
rc = 1;
}
}
}
} else
rc = 1;
}
else {
rc = 1;
}
if (rc == 1) {
fprintf(stderr, "Failed to compile given inputs\n");
}

@ -35,6 +35,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include <sys/types.h>
@ -217,7 +218,7 @@ void dmrC_error_die(struct dmr_C *C, struct position pos, const char *fmt, ...)
va_start(args, fmt);
do_warn(C, "error: ", pos, fmt, args);
va_end(args);
exit(1);
longjmp(C->jmpbuf, 1);
}
void dmrC_die(struct dmr_C *C, const char *fmt, ...)
@ -231,7 +232,7 @@ void dmrC_die(struct dmr_C *C, const char *fmt, ...)
va_end(args);
fprintf(stderr, "%s\n", buffer);
exit(1);
longjmp(C->jmpbuf, 1);
}
#define ARCH_LP32 0
@ -1293,6 +1294,8 @@ static struct symbol_list *sparse_tokenstream(struct dmr_C *C, struct token *tok
// Preprocess the stream
token = dmrC_preprocess(C, token);
if (C->die_if_error)
return NULL;
if (C->dump_macro_defs && !builtin)
dmrC_dump_macro_definitions(C);
@ -1452,7 +1455,8 @@ struct symbol_list * dmrC_sparse(struct dmr_C *C, char *filename)
C->has_error = ERROR_PREV_PHASE;
/* Evaluate the complete symbol list */
dmrC_evaluate_symbol_list(C, res);
if (res)
dmrC_evaluate_symbol_list(C, res);
return res;
}
@ -1478,7 +1482,8 @@ struct symbol_list *dmrC_sparse_buffer(struct dmr_C *C, const char *name, char *
}
/* Evaluate the complete symbol list */
dmrC_evaluate_symbol_list(C, res);
if (res)
dmrC_evaluate_symbol_list(C, res);
/* And return it */
return res;

@ -6,6 +6,7 @@
#include <stddef.h>
#include <stdlib.h>
#include <time.h>
#include <setjmp.h>
/*
* Basic helper routine descriptions for 'sparse'.
@ -152,6 +153,8 @@ struct dmr_C {
int codegen;
int has_error;
jmp_buf jmpbuf;
const char *gcc_base_dir;
const char *multiarch_dir;

Loading…
Cancel
Save