mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
//===-- sanitizer_stackdepot.h ----------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is shared between AddressSanitizer and ThreadSanitizer
|
|
// run-time libraries.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SANITIZER_STACKDEPOT_H
|
|
#define SANITIZER_STACKDEPOT_H
|
|
|
|
#include "sanitizer_common.h"
|
|
#include "sanitizer_internal_defs.h"
|
|
#include "sanitizer_stacktrace.h"
|
|
|
|
namespace __sanitizer {
|
|
|
|
// StackDepot efficiently stores huge amounts of stack traces.
|
|
struct StackDepotNode;
|
|
struct StackDepotHandle {
|
|
StackDepotNode *node_;
|
|
StackDepotHandle() : node_(nullptr) {}
|
|
explicit StackDepotHandle(StackDepotNode *node) : node_(node) {}
|
|
bool valid() { return node_; }
|
|
u32 id();
|
|
int use_count();
|
|
void inc_use_count_unsafe();
|
|
};
|
|
|
|
const int kStackDepotMaxUseCount = 1U << (SANITIZER_ANDROID ? 16 : 20);
|
|
|
|
StackDepotStats *StackDepotGetStats();
|
|
u32 StackDepotPut(StackTrace stack);
|
|
StackDepotHandle StackDepotPut_WithHandle(StackTrace stack);
|
|
// Retrieves a stored stack trace by the id.
|
|
StackTrace StackDepotGet(u32 id);
|
|
|
|
void StackDepotLockAll();
|
|
void StackDepotUnlockAll();
|
|
|
|
// Instantiating this class creates a snapshot of StackDepot which can be
|
|
// efficiently queried with StackDepotGet(). You can use it concurrently with
|
|
// StackDepot, but the snapshot is only guaranteed to contain those stack traces
|
|
// which were stored before it was instantiated.
|
|
class StackDepotReverseMap {
|
|
public:
|
|
StackDepotReverseMap();
|
|
StackTrace Get(u32 id);
|
|
|
|
private:
|
|
struct IdDescPair {
|
|
u32 id;
|
|
StackDepotNode *desc;
|
|
|
|
static bool IdComparator(const IdDescPair &a, const IdDescPair &b);
|
|
};
|
|
|
|
InternalMmapVector<IdDescPair> map_;
|
|
|
|
// Disallow evil constructors.
|
|
StackDepotReverseMap(const StackDepotReverseMap&);
|
|
void operator=(const StackDepotReverseMap&);
|
|
};
|
|
|
|
} // namespace __sanitizer
|
|
|
|
#endif // SANITIZER_STACKDEPOT_H
|