| //===-- copyprof_reporting.cpp -------------------------------------------===// | |
| // | |
| // 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 implements the reporting mechanisms for CopyProf, generating | |
| /// reports with stack traces when unnecessary object copies are destroyed. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "copyprof_reporting.h" | |
| #include "copyprof_internal.h" | |
| #include "sanitizer_common/sanitizer_common.h" | |
| #include "sanitizer_common/sanitizer_stacktrace.h" | |
| namespace __copyprof { | |
| namespace { | |
| // TODO: Make configurable via flags. | |
| constexpr int kMaxNumStackFrames = 30; | |
| } // namespace | |
| void LogCopyProfReport(uptr pc, uptr bp, uptr obj_size, bool did_allocate) { | |
| // FIXME: replace hard coded object size with flag. | |
| if (obj_size <= 16 || !did_allocate) | |
| return; | |
| UNINITIALIZED BufferedStackTrace stack_trace; | |
| stack_trace.Unwind(pc, bp, /*context=*/nullptr, | |
| common_flags()->fast_unwind_on_fatal, kMaxNumStackFrames); | |
| InternalScopedString output; | |
| output.AppendF( | |
| "[copyprof] Destroyed unnecessary copy amounting to %zu bytes:\n", | |
| (usize)obj_size); | |
| stack_trace.PrintTo(&output); | |
| Printf("%s", output.data()); | |
| } | |
| } // namespace __copyprof |