#include "lang_features.h"
#include "driver/firm_opt.h"
#include "driver/firm_cmdline.h"
+#include "driver/firm_timing.h"
#include "adt/error.h"
#include "wrappergen/write_fluffy.h"
#include "wrappergen/write_caml.h"
obstack_1grow(&cppflags_obst, ' ');
obstack_grow(&cppflags_obst, flags, len);
}
+ obstack_1grow(&cppflags_obst, '\0');
common_flags = obstack_finish(&cppflags_obst);
}
assert(obstack_object_size(&cppflags_obst) == 0);
- obstack_printf(&cppflags_obst, "%s ", PREPROCESSOR);
+
+ const char *preprocessor = getenv("CPARSER_PP");
+ if (preprocessor == NULL)
+ preprocessor = PREPROCESSOR;
+
+ obstack_printf(&cppflags_obst, "%s ", preprocessor);
switch (filetype) {
case FILETYPE_C:
add_flag(&cppflags_obst, "-std=c99");
{
char buf[65536];
- snprintf(buf, sizeof(buf), "%s %s -o %s", ASSEMBLER, in, out);
+ const char *assembler = getenv("CPARSER_AS");
+ if (assembler == NULL)
+ assembler = ASSEMBLER;
+
+ snprintf(buf, sizeof(buf), "%s %s -o %s", assembler, in, out);
if (verbose) {
puts(buf);
}
const char *flags = obstack_finish(&ldflags_obst);
/* construct commandline */
- obstack_printf(&ldflags_obst, "%s ", LINKER);
+ const char *linker = getenv("CPARSER_LINK");
+ if (linker == NULL)
+ linker = LINKER;
+ obstack_printf(&ldflags_obst, "%s ", linker);
obstack_printf(&ldflags_obst, "%s", flags);
obstack_1grow(&ldflags_obst, '\0');
file_list_entry_t *files = NULL;
file_list_entry_t *last_file = NULL;
bool construct_dep_target = false;
+ bool do_timing = false;
struct obstack file_obst;
atexit(free_temp_files);
GET_ARG_AFTER(opt, "-march=");
snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt);
int res = firm_be_option(arch_opt);
- if (res == 0)
+ if (res == 0) {
+ fprintf(stderr, "Unknown architecture '%s'\n", arch_opt);
argument_errors = true;
- else {
+ } else {
snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt);
int res = firm_be_option(arch_opt);
if (res == 0)
mode = PrintCaml;
} else if (streq(option, "print-jna")) {
mode = PrintJna;
+ } else if (streq(option, "time")) {
+ do_timing = true;
} else if (streq(option, "version")) {
print_cparser_version();
exit(EXIT_SUCCESS);
init_ast2firm();
init_mangle();
+ if (do_timing)
+ timer_init();
+
if (construct_dep_target) {
if (outname != 0 && strlen(outname) >= 2) {
get_output_name(dep_target, sizeof(dep_target), outname, ".d");
c_mode |= features_on;
c_mode &= ~features_off;
+ timer_push(TV_PARSING);
init_tokens();
translation_unit_t *const unit = do_parsing(in, filename);
+ timer_pop();
/* prints the AST even if errors occurred */
if (mode == PrintAst) {
continue;
}
+ timer_push(TV_CONSTRUCT);
translation_unit_to_firm(unit);
+ timer_pop();
graph_built:
if (mode == ParseOnly) {
const char *flags = obstack_finish(&ldflags_obst);
/* construct commandline */
- obstack_printf(&file_obst, "%s", LINKER);
+ const char *linker = getenv("CPARSER_LINK");
+ if (linker == NULL)
+ linker = LINKER;
+ obstack_printf(&file_obst, "%s", linker);
for (file_list_entry_t *entry = files; entry != NULL;
entry = entry->next) {
if (entry->type != FILETYPE_OBJECT)
}
}
+ if (do_timing)
+ timer_term(stderr);
+
obstack_free(&cppflags_obst, NULL);
obstack_free(&ldflags_obst, NULL);
obstack_free(&file_obst, NULL);