1 //===-- tsan_stack_trace.cc -----------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of ThreadSanitizer (TSan), a race detector.
10 //===----------------------------------------------------------------------===//
11 //#include "sanitizer_common/sanitizer_placement_new.h"
12 #include "tsan_stack_trace.h"
14 #include "tsan_mman.h"
18 StackTrace::StackTrace()
24 StackTrace::StackTrace(uptr
*buf
, uptr cnt
)
32 StackTrace::~StackTrace() {
36 void StackTrace::Reset() {
45 void StackTrace::Init(const uptr
*pcs
, uptr cnt
) {
53 s_
= (uptr
*)internal_alloc(MBlockStackTrace
, cnt
* sizeof(s_
[0]));
56 internal_memcpy(s_
, pcs
, cnt
* sizeof(s_
[0]));
59 void StackTrace::ObtainCurrent(ThreadState
*thr
, uptr toppc
) {
61 n_
= thr
->shadow_stack_pos
- thr
->shadow_stack
;
62 if (n_
+ !!toppc
== 0)
67 if (n_
+ !!toppc
> c_
) {
68 start
= n_
- c_
+ !!toppc
;
72 // Cap potentially huge stacks.
73 if (n_
+ !!toppc
> kTraceStackSize
) {
74 start
= n_
- kTraceStackSize
+ !!toppc
;
75 n_
= kTraceStackSize
- !!toppc
;
77 s_
= (uptr
*)internal_alloc(MBlockStackTrace
,
78 (n_
+ !!toppc
) * sizeof(s_
[0]));
80 for (uptr i
= 0; i
< n_
; i
++)
81 s_
[i
] = thr
->shadow_stack
[start
+ i
];
88 void StackTrace::CopyFrom(const StackTrace
& other
) {
90 Init(other
.Begin(), other
.Size());
93 bool StackTrace::IsEmpty() const {
97 uptr
StackTrace::Size() const {
101 uptr
StackTrace::Get(uptr i
) const {
106 const uptr
*StackTrace::Begin() const {
110 } // namespace __tsan