diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index a88e42ac0f..035ecaf67a 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -212,6 +212,7 @@ mut: autofree_methods map[int]bool generated_free_methods map[int]bool autofree_scope_stmts []string + use_segfault_handler bool = true } pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string { @@ -267,6 +268,7 @@ pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string { field_data_type: ast.Type(table.find_type_idx('FieldData')) init: strings.new_builder(100) is_cc_msvc: pref.ccompiler == 'msvc' + use_segfault_handler: !('no_segfault_handler' in pref.compile_defines || pref.os == .wasm32) } // anon fn may include assert and thus this needs // to be included before any test contents are written @@ -429,6 +431,9 @@ pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string { mut b := strings.new_builder(640000) b.write_string(g.hashes()) + if g.use_segfault_handler { + b.writeln('\n#define V_USE_SIGNAL_H') + } b.writeln('\n// V comptime_definitions:') b.write_string(g.comptime_definitions.str()) b.writeln('\n// V typedefs:') @@ -575,6 +580,7 @@ fn cgen_process_one_file_cb(p &pool.PoolProcessor, idx int, wid int) &Gen { is_autofree: global_g.pref.autofree referenced_fns: global_g.referenced_fns is_cc_msvc: global_g.is_cc_msvc + use_segfault_handler: global_g.use_segfault_handler } g.gen_file() return g @@ -781,7 +787,9 @@ pub fn (mut g Gen) init() { // we know that this is being called before the multi-threading starts // and this is being called in the main thread, so we can mutate the table mut muttable := unsafe { &ast.Table(g.table) } - muttable.used_fns['v_segmentation_fault_handler'] = true + if g.use_segfault_handler { + muttable.used_fns['v_segmentation_fault_handler'] = true + } muttable.used_fns['eprintln'] = true muttable.used_fns['print_backtrace'] = true muttable.used_fns['exit'] = true @@ -4734,7 +4742,7 @@ fn (mut g Gen) write_init_function() { // ___argv is declared as voidptr here, because that unifies the windows/unix logic g.writeln('void _vinit(int ___argc, voidptr ___argv) {') - if 'no_segfault_handler' !in g.pref.compile_defines || g.pref.os == .wasm32 { + if g.use_segfault_handler { // 11 is SIGSEGV. It is hardcoded here, to avoid FreeBSD compilation errors for trivial examples. g.writeln('#if __STDC_HOSTED__ == 1\n\tsignal(11, v_segmentation_fault_handler);\n#endif') } diff --git a/vlib/v/gen/c/cheaders.v b/vlib/v/gen/c/cheaders.v index bd60204b48..c517d32a15 100644 --- a/vlib/v/gen/c/cheaders.v +++ b/vlib/v/gen/c/cheaders.v @@ -554,7 +554,9 @@ voidptr memdup(voidptr src, int sz); #include // _waccess #include // _wgetcwd + #ifdef V_USE_SIGNAL_H #include // signal and SIGSEGV for segmentation fault handler + #endif #ifdef _MSC_VER // On MSVC these are the same (as long as /volatile:ms is passed)