8d6536b50c
no-frame-pointer-elim and no-frame-pointer-elim-non-leaf have been deprecated for a while in favour of the newer (and clearer) frame-pointer attribute. Starting with LLVM10 the old attributes are silently ignored, leading to no stack traces in debug mode.
501 lines
17 KiB
Zig
501 lines
17 KiB
Zig
const builtin = @import("builtin");
|
|
const std = @import("std");
|
|
const os = std.os;
|
|
const tests = @import("tests.zig");
|
|
|
|
pub fn addCases(cases: *tests.StackTracesContext) void {
|
|
const source_return =
|
|
\\const std = @import("std");
|
|
\\
|
|
\\pub fn main() !void {
|
|
\\ return error.TheSkyIsFalling;
|
|
\\}
|
|
;
|
|
const source_try_return =
|
|
\\const std = @import("std");
|
|
\\
|
|
\\fn foo() !void {
|
|
\\ return error.TheSkyIsFalling;
|
|
\\}
|
|
\\
|
|
\\pub fn main() !void {
|
|
\\ try foo();
|
|
\\}
|
|
;
|
|
const source_try_try_return_return =
|
|
\\const std = @import("std");
|
|
\\
|
|
\\fn foo() !void {
|
|
\\ try bar();
|
|
\\}
|
|
\\
|
|
\\fn bar() !void {
|
|
\\ return make_error();
|
|
\\}
|
|
\\
|
|
\\fn make_error() !void {
|
|
\\ return error.TheSkyIsFalling;
|
|
\\}
|
|
\\
|
|
\\pub fn main() !void {
|
|
\\ try foo();
|
|
\\}
|
|
;
|
|
const source_dumpCurrentStackTrace =
|
|
\\const std = @import("std");
|
|
\\
|
|
\\fn bar() void {
|
|
\\ std.debug.dumpCurrentStackTrace(@returnAddress());
|
|
\\}
|
|
\\fn foo() void {
|
|
\\ bar();
|
|
\\}
|
|
\\pub fn main() u8 {
|
|
\\ foo();
|
|
\\ return 1;
|
|
\\}
|
|
;
|
|
|
|
// zig fmt: off
|
|
switch (builtin.os) {
|
|
.freebsd => {
|
|
cases.addCase(
|
|
"return",
|
|
source_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in main (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in std.start.main (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try return",
|
|
source_try_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in foo (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in std.start.main (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in std.start.main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try try return return",
|
|
source_try_try_return_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in make_error (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in bar (test)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in foo (test)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in std.start.main (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in std.start.main (test)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in std.start.main (test)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in std.start.main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
},
|
|
.linux => {
|
|
cases.addCase(
|
|
"return",
|
|
source_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in main (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try return",
|
|
source_try_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in foo (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try try return return",
|
|
source_try_try_return_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in make_error (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in bar (test)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in foo (test)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in main (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"dumpCurrentStackTrace",
|
|
source_dumpCurrentStackTrace,
|
|
[_][]const u8{
|
|
// debug
|
|
\\source.zig:7:8: [address] in foo (test)
|
|
\\ bar();
|
|
\\ ^
|
|
\\source.zig:10:8: [address] in main (test)
|
|
\\ foo();
|
|
\\ ^
|
|
\\start.zig:247:29: [address] in std.start.posixCallMainAndExit (test)
|
|
\\ return root.main();
|
|
\\ ^
|
|
\\start.zig:114:5: [address] in std.start._start (test)
|
|
\\ @call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\start.zig:114:5: [address] in std.start._start (test)
|
|
\\ @call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\
|
|
,
|
|
// release-small
|
|
\\
|
|
},
|
|
);
|
|
},
|
|
.macosx => {
|
|
cases.addCase(
|
|
"return",
|
|
source_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in _main.0 (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in _main (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try return",
|
|
source_try_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in _foo (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in _main.0 (test.o)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in _main (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in _main (test.o)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try try return return",
|
|
source_try_try_return_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in _make_error (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in _bar (test.o)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in _foo (test.o)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in _main.0 (test.o)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in _main (test.o)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in _main (test.o)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in _main (test.o)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in _main (test.o)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
},
|
|
.windows => {
|
|
cases.addCase(
|
|
"return",
|
|
source_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in main (test.obj)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
// --disabled-- results in segmenetation fault
|
|
"",
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try return",
|
|
source_try_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:4:5: [address] in foo (test.obj)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in main (test.obj)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
// --disabled-- results in segmenetation fault
|
|
"",
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
cases.addCase(
|
|
"try try return return",
|
|
source_try_try_return_return,
|
|
[_][]const u8{
|
|
// debug
|
|
\\error: TheSkyIsFalling
|
|
\\source.zig:12:5: [address] in make_error (test.obj)
|
|
\\ return error.TheSkyIsFalling;
|
|
\\ ^
|
|
\\source.zig:8:5: [address] in bar (test.obj)
|
|
\\ return make_error();
|
|
\\ ^
|
|
\\source.zig:4:5: [address] in foo (test.obj)
|
|
\\ try bar();
|
|
\\ ^
|
|
\\source.zig:16:5: [address] in main (test.obj)
|
|
\\ try foo();
|
|
\\ ^
|
|
\\
|
|
,
|
|
// release-safe
|
|
// --disabled-- results in segmenetation fault
|
|
"",
|
|
// release-fast
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
,
|
|
// release-small
|
|
\\error: TheSkyIsFalling
|
|
\\
|
|
},
|
|
);
|
|
},
|
|
else => {},
|
|
}
|
|
// zig fmt: off
|
|
}
|