110d565efSmrg //===-- tsan_stack_trace.cc -----------------------------------------------===//
210d565efSmrg //
310d565efSmrg // This file is distributed under the University of Illinois Open Source
410d565efSmrg // License. See LICENSE.TXT for details.
510d565efSmrg //
610d565efSmrg //===----------------------------------------------------------------------===//
710d565efSmrg //
810d565efSmrg // This file is a part of ThreadSanitizer (TSan), a race detector.
910d565efSmrg //
1010d565efSmrg //===----------------------------------------------------------------------===//
1110d565efSmrg #include "tsan_stack_trace.h"
1210d565efSmrg #include "tsan_rtl.h"
1310d565efSmrg #include "tsan_mman.h"
1410d565efSmrg 
1510d565efSmrg namespace __tsan {
1610d565efSmrg 
VarSizeStackTrace()1710d565efSmrg VarSizeStackTrace::VarSizeStackTrace()
1810d565efSmrg     : StackTrace(nullptr, 0), trace_buffer(nullptr) {}
1910d565efSmrg 
~VarSizeStackTrace()2010d565efSmrg VarSizeStackTrace::~VarSizeStackTrace() {
2110d565efSmrg   ResizeBuffer(0);
2210d565efSmrg }
2310d565efSmrg 
ResizeBuffer(uptr new_size)2410d565efSmrg void VarSizeStackTrace::ResizeBuffer(uptr new_size) {
2510d565efSmrg   if (trace_buffer) {
2610d565efSmrg     internal_free(trace_buffer);
2710d565efSmrg   }
2810d565efSmrg   trace_buffer =
2910d565efSmrg       (new_size > 0)
3010d565efSmrg           ? (uptr *)internal_alloc(MBlockStackTrace,
3110d565efSmrg                                    new_size * sizeof(trace_buffer[0]))
3210d565efSmrg           : nullptr;
3310d565efSmrg   trace = trace_buffer;
3410d565efSmrg   size = new_size;
3510d565efSmrg }
3610d565efSmrg 
Init(const uptr * pcs,uptr cnt,uptr extra_top_pc)3710d565efSmrg void VarSizeStackTrace::Init(const uptr *pcs, uptr cnt, uptr extra_top_pc) {
3810d565efSmrg   ResizeBuffer(cnt + !!extra_top_pc);
3910d565efSmrg   internal_memcpy(trace_buffer, pcs, cnt * sizeof(trace_buffer[0]));
4010d565efSmrg   if (extra_top_pc)
4110d565efSmrg     trace_buffer[cnt] = extra_top_pc;
4210d565efSmrg }
4310d565efSmrg 
ReverseOrder()44*0fc04c29Smrg void VarSizeStackTrace::ReverseOrder() {
45*0fc04c29Smrg   for (u32 i = 0; i < (size >> 1); i++)
46*0fc04c29Smrg     Swap(trace_buffer[i], trace_buffer[size - 1 - i]);
47*0fc04c29Smrg }
48*0fc04c29Smrg 
4910d565efSmrg }  // namespace __tsan
50