blob: ceca3f8e8738df80d27c37c9677f3d4fca5b2990 [file] [log] [blame]
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +00001//===-- tsan_stack_trace.cc -----------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is a part of ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +000013#include "tsan_stack_trace.h"
14#include "tsan_rtl.h"
15#include "tsan_mman.h"
16
17namespace __tsan {
18
Alexey Samsonov40733a82014-11-03 22:23:44 +000019VarSizeStackTrace::VarSizeStackTrace()
20 : StackTrace(nullptr, 0), trace_buffer(nullptr) {}
21
22VarSizeStackTrace::~VarSizeStackTrace() {
23 ResizeBuffer(0);
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +000024}
25
Alexey Samsonov40733a82014-11-03 22:23:44 +000026void VarSizeStackTrace::ResizeBuffer(uptr new_size) {
27 if (trace_buffer) {
28 internal_free(trace_buffer);
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +000029 }
Alexey Samsonov40733a82014-11-03 22:23:44 +000030 trace_buffer =
31 (new_size > 0)
32 ? (uptr *)internal_alloc(MBlockStackTrace,
33 new_size * sizeof(trace_buffer[0]))
34 : nullptr;
35 trace = trace_buffer;
36 size = new_size;
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +000037}
38
Alexey Samsonov40733a82014-11-03 22:23:44 +000039void VarSizeStackTrace::Init(const uptr *pcs, uptr cnt, uptr extra_top_pc) {
40 ResizeBuffer(cnt + !!extra_top_pc);
41 internal_memcpy(trace_buffer, pcs, cnt * sizeof(trace_buffer[0]));
42 if (extra_top_pc)
43 trace_buffer[cnt] = extra_top_pc;
Dmitry Vyukovbde4c9c2014-05-29 13:50:54 +000044}
45
46} // namespace __tsan