diff options
| author | Vadim Chugunov <vadimcn@gmail.com> | 2014-03-19 00:42:02 -0700 |
|---|---|---|
| committer | Vadim Chugunov <vadimcn@gmail.com> | 2014-04-22 18:08:06 -0700 |
| commit | f686e5ebff1a8a30c496ffe38c9cd0fcde6307ce (patch) | |
| tree | cd86e55f1f14e6da75efcaeced791c91804fa386 /src/libstd/rt/backtrace.rs | |
| parent | 6619134d49dc87d61274006be4c0d268658e1c2a (diff) | |
| download | rust-f686e5ebff1a8a30c496ffe38c9cd0fcde6307ce.tar.gz rust-f686e5ebff1a8a30c496ffe38c9cd0fcde6307ce.zip | |
Fixed Win64 build
Diffstat (limited to 'src/libstd/rt/backtrace.rs')
| -rw-r--r-- | src/libstd/rt/backtrace.rs | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/libstd/rt/backtrace.rs b/src/libstd/rt/backtrace.rs index c3bf7a6d12a..85699cdfebc 100644 --- a/src/libstd/rt/backtrace.rs +++ b/src/libstd/rt/backtrace.rs @@ -665,6 +665,89 @@ mod imp { } } + #[cfg(target_arch = "x86_64")] + mod arch { + use libc::{c_longlong, c_ulonglong}; + use libc::types::os::arch::extra::{WORD, DWORD, DWORDLONG}; + + pub struct CONTEXT { + P1Home: DWORDLONG, + P2Home: DWORDLONG, + P3Home: DWORDLONG, + P4Home: DWORDLONG, + P5Home: DWORDLONG, + P6Home: DWORDLONG, + + ContextFlags: DWORD, + MxCsr: DWORD, + + SegCs: WORD, + SegDs: WORD, + SegEs: WORD, + SegFs: WORD, + SegGs: WORD, + SegSs: WORD, + EFlags: DWORD, + + Dr0: DWORDLONG, + Dr1: DWORDLONG, + Dr2: DWORDLONG, + Dr3: DWORDLONG, + Dr6: DWORDLONG, + Dr7: DWORDLONG, + + Rax: DWORDLONG, + Rcx: DWORDLONG, + Rdx: DWORDLONG, + Rbx: DWORDLONG, + Rsp: DWORDLONG, + Rbp: DWORDLONG, + Rsi: DWORDLONG, + Rdi: DWORDLONG, + R8: DWORDLONG, + R9: DWORDLONG, + R10: DWORDLONG, + R11: DWORDLONG, + R12: DWORDLONG, + R13: DWORDLONG, + R14: DWORDLONG, + R15: DWORDLONG, + + Rip: DWORDLONG, + + FltSave: FLOATING_SAVE_AREA, + + VectorRegister: [M128A, .. 26], + VectorControl: DWORDLONG, + + DebugControl: DWORDLONG, + LastBranchToRip: DWORDLONG, + LastBranchFromRip: DWORDLONG, + LastExceptionToRip: DWORDLONG, + LastExceptionFromRip: DWORDLONG, + } + + pub struct M128A { + Low: c_ulonglong, + High: c_longlong + } + + pub struct FLOATING_SAVE_AREA { + _Dummy: [u8, ..512] // FIXME: Fill this out + } + + pub fn init_frame(frame: &mut super::STACKFRAME64, + ctx: &CONTEXT) -> DWORD { + frame.AddrPC.Offset = ctx.Rip as u64; + frame.AddrPC.Mode = super::AddrModeFlat; + frame.AddrStack.Offset = ctx.Rsp as u64; + frame.AddrStack.Mode = super::AddrModeFlat; + frame.AddrFrame.Offset = ctx.Rbp as u64; + frame.AddrFrame.Mode = super::AddrModeFlat; + super::IMAGE_FILE_MACHINE_AMD64 + } + } + struct Cleanup { handle: libc::HANDLE, SymCleanup: SymCleanupFn, |
