+
+ if self.modelbuilder.toolcontext.opt_invocation_metrics.value then
+ v.add_decl("long count_invoke_by_tables;")
+ v.add_decl("long count_invoke_by_direct;")
+ v.add_decl("long count_invoke_by_inline;")
+ v.compiler.header.add_decl("extern long count_invoke_by_tables;")
+ v.compiler.header.add_decl("extern long count_invoke_by_direct;")
+ v.compiler.header.add_decl("extern long count_invoke_by_inline;")
+ end
+
+ if self.modelbuilder.toolcontext.opt_isset_checks_metrics.value then
+ v.add_decl("long count_attr_reads = 0;")
+ v.add_decl("long count_isset_checks = 0;")
+ v.compiler.header.add_decl("extern long count_attr_reads;")
+ v.compiler.header.add_decl("extern long count_isset_checks;")
+ end
+
+ v.add_decl("void sig_handler(int signo)\{")
+ v.add_decl("printf(\"Caught signal : %s\\n\", strsignal(signo));")
+ v.add_decl("show_backtrace(signo);")
+ v.add_decl("\}")
+
+ v.add_decl("void show_backtrace (int signo) \{")
+ if ost == "nitstack" or ost == "libunwind" then
+ v.add_decl("char* opt = getenv(\"NIT_NO_STACK\");")
+ v.add_decl("unw_cursor_t cursor;")
+ v.add_decl("if(opt==NULL)\{")
+ v.add_decl("unw_context_t uc;")
+ v.add_decl("unw_word_t ip;")
+ v.add_decl("char* procname = malloc(sizeof(char) * 100);")
+ v.add_decl("unw_getcontext(&uc);")
+ v.add_decl("unw_init_local(&cursor, &uc);")
+ v.add_decl("printf(\"-------------------------------------------------\\n\");")
+ v.add_decl("printf(\"-- Stack Trace ------------------------------\\n\");")
+ v.add_decl("printf(\"-------------------------------------------------\\n\");")
+ v.add_decl("while (unw_step(&cursor) > 0) \{")
+ v.add_decl(" unw_get_proc_name(&cursor, procname, 100, &ip);")
+ if ost == "nitstack" then
+ v.add_decl(" const char* recv = get_nit_name(procname, strlen(procname));")
+ v.add_decl(" if (recv != NULL)\{")
+ v.add_decl(" printf(\"` %s\\n\", recv);")
+ v.add_decl(" \}else\{")
+ v.add_decl(" printf(\"` %s\\n\", procname);")
+ v.add_decl(" \}")
+ else
+ v.add_decl(" printf(\"` %s \\n\",procname);")
+ end
+ v.add_decl("\}")
+ v.add_decl("printf(\"-------------------------------------------------\\n\");")
+ v.add_decl("free(procname);")
+ v.add_decl("\}")
+ end
+ v.add_decl("exit(signo);")
+ v.add_decl("\}")
+