authorgravatar for 35231115+Rocknest@users.noreply.github.comRocknest <35231115+Rocknest@users.noreply.github.com> 2020-01-29 23:15:17+02:00
committergravatar for 35231115+Rocknest@users.noreply.github.comRocknest <35231115+Rocknest@users.noreply.github.com> 2020-01-29 23:15:17+02:00
log4a4d6f2be911cae08db434f877a1be2340d262c8
tree96a63a37c71a0f631de4933e61ecad2bed94d9c2
parentb7cd60a354731d61ee3a3184fd4be610382ca1d6

Reorganize definitions


2 files changed, 230 insertions(+), 250 deletions(-)

lib/std/debug.zig+3-248
...@@ -2317,11 +2317,11 @@ fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.Stdcall) c...@@ -2317,11 +2317,11 @@ fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.Stdcall) c
2317 }2317 }
2318}2318}
23192319
2320// zig won't let me use an anon enum here2320// zig won't let me use an anon enum here https://github.com/ziglang/zig/issues/3707
2321fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u8, comptime format: ?[]const u8) noreturn {2321fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u8, comptime format: ?[]const u8) noreturn {
2322 const exception_address = @ptrToInt(info.ExceptionRecord.ExceptionAddress);2322 const exception_address = @ptrToInt(info.ExceptionRecord.ExceptionAddress);
2323 if (comptime windows_exception_context.haveContext) {2323 if (@hasDecl(windows, "CONTEXT")) {
2324 const regs = windows_exception_context.getRegs(info.ContextRecord);2324 const regs = info.ContextRecord.getRegs();
2325 switch (msg) {2325 switch (msg) {
2326 0 => std.debug.warn("{}\n", .{format.?}),2326 0 => std.debug.warn("{}\n", .{format.?}),
2327 1 => std.debug.warn("Segmentation fault at address 0x{x}\n", .{info.ExceptionRecord.ExceptionInformation[1]}),2327 1 => std.debug.warn("Segmentation fault at address 0x{x}\n", .{info.ExceptionRecord.ExceptionInformation[1]}),
...@@ -2341,251 +2341,6 @@ fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u...@@ -2341,251 +2341,6 @@ fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u
2341 }2341 }
2342}2342}
23432343
2344pub const windows_exception_context = switch (builtin.arch) {
2345 .i386 => struct {
2346 pub const haveContext = true;
2347
2348 pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} {
2349 const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr));
2350 return .{.bp = @intCast(usize, ctx.Ebp), .ip = @intCast(usize, ctx.Eip)};
2351 }
2352
2353 pub const CONTEXT = extern struct {
2354 ContextFlags: DWORD,
2355 Dr0: DWORD,
2356 Dr1: DWORD,
2357 Dr2: DWORD,
2358 Dr3: DWORD,
2359 Dr6: DWORD,
2360 Dr7: DWORD,
2361 FloatSave: FLOATING_SAVE_AREA,
2362 SegGs: DWORD,
2363 SegFs: DWORD,
2364 SegEs: DWORD,
2365 SegDs: DWORD,
2366 Edi: DWORD,
2367 Esi: DWORD,
2368 Ebx: DWORD,
2369 Edx: DWORD,
2370 Ecx: DWORD,
2371 Eax: DWORD,
2372 Ebp: DWORD,
2373 Eip: DWORD,
2374 SegCs: DWORD,
2375 EFlags: DWORD,
2376 Esp: DWORD,
2377 SegSs: DWORD,
2378 ExtendedRegisters: [512]BYTE,
2379 };
2380
2381 pub const FLOATING_SAVE_AREA = extern struct {
2382 ControlWord: DWORD,
2383 StatusWord: DWORD,
2384 TagWord: DWORD,
2385 ErrorOffset: DWORD,
2386 ErrorSelector: DWORD,
2387 DataOffset: DWORD,
2388 DataSelector: DWORD,
2389 RegisterArea: [80]BYTE,
2390 Cr0NpxState: DWORD,
2391 };
2392
2393 pub const BYTE = u8;
2394 pub const DWORD = c_ulong;
2395 },
2396 .x86_64 => struct {
2397 pub const haveContext = true;
2398
2399 pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} {
2400 const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr));
2401 return .{.bp = @intCast(usize, ctx.Rbp), .ip = @intCast(usize, ctx.Rip)};
2402 }
2403
2404 pub const CONTEXT = extern struct {
2405 P1Home: DWORD64,
2406 P2Home: DWORD64,
2407 P3Home: DWORD64,
2408 P4Home: DWORD64,
2409 P5Home: DWORD64,
2410 P6Home: DWORD64,
2411 ContextFlags: DWORD,
2412 MxCsr: DWORD,
2413 SegCs: WORD,
2414 SegDs: WORD,
2415 SegEs: WORD,
2416 SegFs: WORD,
2417 SegGs: WORD,
2418 SegSs: WORD,
2419 EFlags: DWORD,
2420 Dr0: DWORD64,
2421 Dr1: DWORD64,
2422 Dr2: DWORD64,
2423 Dr3: DWORD64,
2424 Dr6: DWORD64,
2425 Dr7: DWORD64,
2426 Rax: DWORD64,
2427 Rcx: DWORD64,
2428 Rdx: DWORD64,
2429 Rbx: DWORD64,
2430 Rsp: DWORD64,
2431 Rbp: DWORD64,
2432 Rsi: DWORD64,
2433 Rdi: DWORD64,
2434 R8: DWORD64,
2435 R9: DWORD64,
2436 R10: DWORD64,
2437 R11: DWORD64,
2438 R12: DWORD64,
2439 R13: DWORD64,
2440 R14: DWORD64,
2441 R15: DWORD64,
2442 Rip: DWORD64,
2443 DUMMYUNIONNAME: extern union {
2444 FltSave: XMM_SAVE_AREA32,
2445 FloatSave: XMM_SAVE_AREA32,
2446 DUMMYSTRUCTNAME: extern struct {
2447 Header: [2]M128A,
2448 Legacy: [8]M128A,
2449 Xmm0: M128A,
2450 Xmm1: M128A,
2451 Xmm2: M128A,
2452 Xmm3: M128A,
2453 Xmm4: M128A,
2454 Xmm5: M128A,
2455 Xmm6: M128A,
2456 Xmm7: M128A,
2457 Xmm8: M128A,
2458 Xmm9: M128A,
2459 Xmm10: M128A,
2460 Xmm11: M128A,
2461 Xmm12: M128A,
2462 Xmm13: M128A,
2463 Xmm14: M128A,
2464 Xmm15: M128A,
2465 },
2466 },
2467 VectorRegister: [26]M128A,
2468 VectorControl: DWORD64,
2469 DebugControl: DWORD64,
2470 LastBranchToRip: DWORD64,
2471 LastBranchFromRip: DWORD64,
2472 LastExceptionToRip: DWORD64,
2473 LastExceptionFromRip: DWORD64,
2474 };
2475
2476 pub const XMM_SAVE_AREA32 = extern struct {
2477 ControlWord: WORD,
2478 StatusWord: WORD,
2479 TagWord: BYTE,
2480 Reserved1: BYTE,
2481 ErrorOpcode: WORD,
2482 ErrorOffset: DWORD,
2483 ErrorSelector: WORD,
2484 Reserved2: WORD,
2485 DataOffset: DWORD,
2486 DataSelector: WORD,
2487 Reserved3: WORD,
2488 MxCsr: DWORD,
2489 MxCsr_Mask: DWORD,
2490 FloatRegisters: [8]M128A,
2491 XmmRegisters: [16]M128A,
2492 Reserved4: [96]BYTE,
2493 };
2494
2495 pub const M128A = extern struct {
2496 Low: ULONGLONG,
2497 High: LONGLONG,
2498 };
2499
2500 pub const BYTE = u8;
2501 pub const WORD = u16;
2502 pub const DWORD = u32;
2503 pub const DWORD64 = u64;
2504 pub const LONGLONG = c_longlong;
2505 pub const ULONGLONG = c_ulonglong;
2506 },
2507 .aarch64 => struct {
2508 pub const haveContext = true;
2509
2510 pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} {
2511 const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr));
2512 return .{.bp = @intCast(usize, ctx.Fp), .ip = @intCast(usize, ctx.Pc)};
2513 }
2514
2515 pub const CONTEXT = extern struct {
2516 ContextFlags: ULONG,
2517 Cpsr: ULONG,
2518 DUMMYUNIONNAME: extern union {
2519 DUMMYSTRUCTNAME: extern struct {
2520 X0: DWORD64,
2521 X1: DWORD64,
2522 X2: DWORD64,
2523 X3: DWORD64,
2524 X4: DWORD64,
2525 X5: DWORD64,
2526 X6: DWORD64,
2527 X7: DWORD64,
2528 X8: DWORD64,
2529 X9: DWORD64,
2530 X10: DWORD64,
2531 X11: DWORD64,
2532 X12: DWORD64,
2533 X13: DWORD64,
2534 X14: DWORD64,
2535 X15: DWORD64,
2536 X16: DWORD64,
2537 X17: DWORD64,
2538 X18: DWORD64,
2539 X19: DWORD64,
2540 X20: DWORD64,
2541 X21: DWORD64,
2542 X22: DWORD64,
2543 X23: DWORD64,
2544 X24: DWORD64,
2545 X25: DWORD64,
2546 X26: DWORD64,
2547 X27: DWORD64,
2548 X28: DWORD64,
2549 Fp: DWORD64,
2550 Lr: DWORD64,
2551 },
2552 X: [31]DWORD64,
2553 },
2554 Sp: DWORD64,
2555 Pc: DWORD64,
2556 V: [32]NEON128,
2557 Fpcr: DWORD,
2558 Fpsr: DWORD,
2559 Bcr: [8]DWORD,
2560 Bvr: [8]DWORD64,
2561 Wcr: [2]DWORD,
2562 Wvr: [2]DWORD64,
2563 };
2564
2565 pub const NEON128 = extern union {
2566 DUMMYSTRUCTNAME: extern struct {
2567 Low: ULONGLONG,
2568 High: LONGLONG,
2569 },
2570 D: [2]f64,
2571 S: [4]f32,
2572 H: [8]WORD,
2573 B: [16]BYTE,
2574 };
2575
2576 pub const ULONG = c_ulong;
2577 pub const LONGLONG = c_longlong;
2578 pub const ULONGLONG = c_ulonglong;
2579 pub const BYTE = u8;
2580 pub const WORD = c_ushort;
2581 pub const DWORD = c_ulong;
2582 pub const DWORD64 = c_ulonglong;
2583 },
2584 else => struct {
2585 pub const haveContext = false;
2586 },
2587};
2588
2589pub fn dumpStackPointerAddr(prefix: []const u8) void {2344pub fn dumpStackPointerAddr(prefix: []const u8) void {
2590 const sp = asm (""2345 const sp = asm (""
2591 : [argc] "={rsp}" (-> usize)2346 : [argc] "={rsp}" (-> usize)
lib/std/os/windows/bits.zig+227-2
...@@ -23,7 +23,6 @@ pub const BOOL = c_int;...@@ -23,7 +23,6 @@ pub const BOOL = c_int;
23pub const BOOLEAN = BYTE;23pub const BOOLEAN = BYTE;
24pub const BYTE = u8;24pub const BYTE = u8;
25pub const CHAR = u8;25pub const CHAR = u8;
26pub const DWORD = u32;
27pub const FLOAT = f32;26pub const FLOAT = f32;
28pub const HANDLE = *c_void;27pub const HANDLE = *c_void;
29pub const HCRYPTPROV = ULONG_PTR;28pub const HCRYPTPROV = ULONG_PTR;
...@@ -52,6 +51,8 @@ pub const DWORD_PTR = ULONG_PTR;...@@ -52,6 +51,8 @@ pub const DWORD_PTR = ULONG_PTR;
52pub const UNICODE = false;51pub const UNICODE = false;
53pub const WCHAR = u16;52pub const WCHAR = u16;
54pub const WORD = u16;53pub const WORD = u16;
54pub const DWORD = u32;
55pub const DWORD64 = u64;
55pub const LARGE_INTEGER = i64;56pub const LARGE_INTEGER = i64;
56pub const USHORT = u16;57pub const USHORT = u16;
57pub const SHORT = i16;58pub const SHORT = i16;
...@@ -887,9 +888,233 @@ pub const EXCEPTION_RECORD = extern struct {...@@ -887,9 +888,233 @@ pub const EXCEPTION_RECORD = extern struct {
887 ExceptionInformation: [15]usize,888 ExceptionInformation: [15]usize,
888};889};
889890
891pub usingnamespace switch (builtin.arch) {
892 .i386 => struct {
893 pub const FLOATING_SAVE_AREA = extern struct {
894 ControlWord: DWORD,
895 StatusWord: DWORD,
896 TagWord: DWORD,
897 ErrorOffset: DWORD,
898 ErrorSelector: DWORD,
899 DataOffset: DWORD,
900 DataSelector: DWORD,
901 RegisterArea: [80]BYTE,
902 Cr0NpxState: DWORD,
903 };
904
905 pub const CONTEXT = extern struct {
906 ContextFlags: DWORD,
907 Dr0: DWORD,
908 Dr1: DWORD,
909 Dr2: DWORD,
910 Dr3: DWORD,
911 Dr6: DWORD,
912 Dr7: DWORD,
913 FloatSave: FLOATING_SAVE_AREA,
914 SegGs: DWORD,
915 SegFs: DWORD,
916 SegEs: DWORD,
917 SegDs: DWORD,
918 Edi: DWORD,
919 Esi: DWORD,
920 Ebx: DWORD,
921 Edx: DWORD,
922 Ecx: DWORD,
923 Eax: DWORD,
924 Ebp: DWORD,
925 Eip: DWORD,
926 SegCs: DWORD,
927 EFlags: DWORD,
928 Esp: DWORD,
929 SegSs: DWORD,
930 ExtendedRegisters: [512]BYTE,
931
932 pub fn getRegs(ctx: *const CONTEXT) struct {bp: usize, ip: usize} {
933 return .{.bp = @intCast(usize, ctx.Ebp), .ip = @intCast(usize, ctx.Eip)};
934 }
935 };
936
937 pub const PCONTEXT = *CONTEXT;
938 },
939 .x86_64 => struct {
940 pub const M128A = extern struct {
941 Low: ULONGLONG,
942 High: LONGLONG,
943 };
944
945 pub const XMM_SAVE_AREA32 = extern struct {
946 ControlWord: WORD,
947 StatusWord: WORD,
948 TagWord: BYTE,
949 Reserved1: BYTE,
950 ErrorOpcode: WORD,
951 ErrorOffset: DWORD,
952 ErrorSelector: WORD,
953 Reserved2: WORD,
954 DataOffset: DWORD,
955 DataSelector: WORD,
956 Reserved3: WORD,
957 MxCsr: DWORD,
958 MxCsr_Mask: DWORD,
959 FloatRegisters: [8]M128A,
960 XmmRegisters: [16]M128A,
961 Reserved4: [96]BYTE,
962 };
963
964 pub const CONTEXT = extern struct {
965 P1Home: DWORD64,
966 P2Home: DWORD64,
967 P3Home: DWORD64,
968 P4Home: DWORD64,
969 P5Home: DWORD64,
970 P6Home: DWORD64,
971 ContextFlags: DWORD,
972 MxCsr: DWORD,
973 SegCs: WORD,
974 SegDs: WORD,
975 SegEs: WORD,
976 SegFs: WORD,
977 SegGs: WORD,
978 SegSs: WORD,
979 EFlags: DWORD,
980 Dr0: DWORD64,
981 Dr1: DWORD64,
982 Dr2: DWORD64,
983 Dr3: DWORD64,
984 Dr6: DWORD64,
985 Dr7: DWORD64,
986 Rax: DWORD64,
987 Rcx: DWORD64,
988 Rdx: DWORD64,
989 Rbx: DWORD64,
990 Rsp: DWORD64,
991 Rbp: DWORD64,
992 Rsi: DWORD64,
993 Rdi: DWORD64,
994 R8: DWORD64,
995 R9: DWORD64,
996 R10: DWORD64,
997 R11: DWORD64,
998 R12: DWORD64,
999 R13: DWORD64,
1000 R14: DWORD64,
1001 R15: DWORD64,
1002 Rip: DWORD64,
1003 DUMMYUNIONNAME: extern union {
1004 FltSave: XMM_SAVE_AREA32,
1005 FloatSave: XMM_SAVE_AREA32,
1006 DUMMYSTRUCTNAME: extern struct {
1007 Header: [2]M128A,
1008 Legacy: [8]M128A,
1009 Xmm0: M128A,
1010 Xmm1: M128A,
1011 Xmm2: M128A,
1012 Xmm3: M128A,
1013 Xmm4: M128A,
1014 Xmm5: M128A,
1015 Xmm6: M128A,
1016 Xmm7: M128A,
1017 Xmm8: M128A,
1018 Xmm9: M128A,
1019 Xmm10: M128A,
1020 Xmm11: M128A,
1021 Xmm12: M128A,
1022 Xmm13: M128A,
1023 Xmm14: M128A,
1024 Xmm15: M128A,
1025 },
1026 },
1027 VectorRegister: [26]M128A,
1028 VectorControl: DWORD64,
1029 DebugControl: DWORD64,
1030 LastBranchToRip: DWORD64,
1031 LastBranchFromRip: DWORD64,
1032 LastExceptionToRip: DWORD64,
1033 LastExceptionFromRip: DWORD64,
1034
1035 pub fn getRegs(ctx: *const CONTEXT) struct {bp: usize, ip: usize} {
1036 return .{.bp = @intCast(usize, ctx.Rbp), .ip = @intCast(usize, ctx.Rip)};
1037 }
1038 };
1039
1040 pub const PCONTEXT = *CONTEXT;
1041 },
1042 .aarch64 => struct {
1043 pub const NEON128 = extern union {
1044 DUMMYSTRUCTNAME: extern struct {
1045 Low: ULONGLONG,
1046 High: LONGLONG,
1047 },
1048 D: [2]f64,
1049 S: [4]f32,
1050 H: [8]WORD,
1051 B: [16]BYTE,
1052 };
1053
1054 pub const CONTEXT = extern struct {
1055 ContextFlags: ULONG,
1056 Cpsr: ULONG,
1057 DUMMYUNIONNAME: extern union {
1058 DUMMYSTRUCTNAME: extern struct {
1059 X0: DWORD64,
1060 X1: DWORD64,
1061 X2: DWORD64,
1062 X3: DWORD64,
1063 X4: DWORD64,
1064 X5: DWORD64,
1065 X6: DWORD64,
1066 X7: DWORD64,
1067 X8: DWORD64,
1068 X9: DWORD64,
1069 X10: DWORD64,
1070 X11: DWORD64,
1071 X12: DWORD64,
1072 X13: DWORD64,
1073 X14: DWORD64,
1074 X15: DWORD64,
1075 X16: DWORD64,
1076 X17: DWORD64,
1077 X18: DWORD64,
1078 X19: DWORD64,
1079 X20: DWORD64,
1080 X21: DWORD64,
1081 X22: DWORD64,
1082 X23: DWORD64,
1083 X24: DWORD64,
1084 X25: DWORD64,
1085 X26: DWORD64,
1086 X27: DWORD64,
1087 X28: DWORD64,
1088 Fp: DWORD64,
1089 Lr: DWORD64,
1090 },
1091 X: [31]DWORD64,
1092 },
1093 Sp: DWORD64,
1094 Pc: DWORD64,
1095 V: [32]NEON128,
1096 Fpcr: DWORD,
1097 Fpsr: DWORD,
1098 Bcr: [8]DWORD,
1099 Bvr: [8]DWORD64,
1100 Wcr: [2]DWORD,
1101 Wvr: [2]DWORD64,
1102
1103 pub fn getRegs(ctx: *const CONTEXT) struct {bp: usize, ip: usize} {
1104 return .{.bp = @intCast(usize, ctx.Fp), .ip = @intCast(usize, ctx.Pc)};
1105 }
1106 };
1107
1108 pub const PCONTEXT = *CONTEXT;
1109 },
1110 else => struct {
1111 pub const PCONTEXT = *c_void;
1112 },
1113};
1114
890pub const EXCEPTION_POINTERS = extern struct {1115pub const EXCEPTION_POINTERS = extern struct {
891 ExceptionRecord: *EXCEPTION_RECORD,1116 ExceptionRecord: *EXCEPTION_RECORD,
892 ContextRecord: *c_void,1117 ContextRecord: PCONTEXT,
893};1118};
8941119
895pub const VECTORED_EXCEPTION_HANDLER = fn (ExceptionInfo: *EXCEPTION_POINTERS) callconv(.Stdcall) c_long;1120pub const VECTORED_EXCEPTION_HANDLER = fn (ExceptionInfo: *EXCEPTION_POINTERS) callconv(.Stdcall) c_long;