comparison lwasm/main.c @ 372:90de73ba0cac

Created a useful debug framework and adjusted lw_expr_print() to return a "static" dynamic string
author lost@starbug
date Thu, 22 Apr 2010 18:19:06 -0600
parents 6b33faa21a0a
children d99322ef6f21
comparison
equal deleted inserted replaced
371:9c24d9d485b9 372:90de73ba0cac
41 char *program_name; 41 char *program_name;
42 42
43 static struct argp_option options[] = 43 static struct argp_option options[] =
44 { 44 {
45 { "output", 'o', "FILE", 0, "Output to FILE"}, 45 { "output", 'o', "FILE", 0, "Output to FILE"},
46 { "debug", 'd', 0, 0, "Set debug mode"}, 46 { "debug", 'd', "LEVEL", OPTION_ARG_OPTIONAL, "Set debug mode"},
47 { "format", 'f', "TYPE", 0, "Select output format: decb, raw, obj, os9"}, 47 { "format", 'f', "TYPE", 0, "Select output format: decb, raw, obj, os9"},
48 { "list", 'l', "FILE", OPTION_ARG_OPTIONAL, "Generate list [to FILE]"}, 48 { "list", 'l', "FILE", OPTION_ARG_OPTIONAL, "Generate list [to FILE]"},
49 { "decb", 'b', 0, 0, "Generate DECB .bin format output, equivalent of --format=decb"}, 49 { "decb", 'b', 0, 0, "Generate DECB .bin format output, equivalent of --format=decb"},
50 { "raw", 'r', 0, 0, "Generate raw binary format output, equivalent of --format=raw"}, 50 { "raw", 'r', 0, 0, "Generate raw binary format output, equivalent of --format=raw"},
51 { "obj", 0x100, 0, 0, "Generate proprietary object file format for later linking, equivalent of --format=obj" }, 51 { "obj", 0x100, 0, 0, "Generate proprietary object file format for later linking, equivalent of --format=obj" },
73 lw_free(as -> output_file); 73 lw_free(as -> output_file);
74 as -> output_file = lw_strdup(arg); 74 as -> output_file = lw_strdup(arg);
75 break; 75 break;
76 76
77 case 'd': 77 case 'd':
78 as -> debug_level++; 78 if (!arg)
79 as -> debug_level = 50;
80 else
81 as -> debug_level = atoi(arg);
79 break; 82 break;
80 83
81 case 'l': 84 case 'l':
82 if (as -> list_file) 85 if (as -> list_file)
83 lw_free(as -> list_file); 86 lw_free(as -> list_file);
188 { "finalize", do_pass6 }, 191 { "finalize", do_pass6 },
189 { "emit", do_pass7 }, 192 { "emit", do_pass7 },
190 { NULL, NULL } 193 { NULL, NULL }
191 }; 194 };
192 195
193 extern void dump_state(asmstate_t *as, FILE *fp);
194 196
195 int main(int argc, char **argv) 197 int main(int argc, char **argv)
196 { 198 {
197 int passnum; 199 int passnum;
198 200
219 221
220 input_init(&asmstate); 222 input_init(&asmstate);
221 223
222 for (passnum = 0; passlist[passnum].fn; passnum++) 224 for (passnum = 0; passlist[passnum].fn; passnum++)
223 { 225 {
224 fprintf(stderr, "Doing pass %d (%s)\n", passnum, passlist[passnum].passname); 226 debug_message(&asmstate, 50, "Doing pass %d (%s)\n", passnum, passlist[passnum].passname);
225 (passlist[passnum].fn)(&asmstate); 227 (passlist[passnum].fn)(&asmstate);
226 fprintf(stderr, "After pass %d (%s):\n", passnum, passlist[passnum].passname); 228 debug_message(&asmstate, 50, "After pass %d (%s)\n", passnum, passlist[passnum].passname);
227 dump_state(&asmstate, stderr); 229 dump_state(&asmstate);
228 230
229 if (asmstate.errorcount > 0) 231 if (asmstate.errorcount > 0)
230 { 232 {
231 lwasm_show_errors(&asmstate); 233 lwasm_show_errors(&asmstate);
232 exit(1); 234 exit(1);