diff options
author | max42 <max42@yandex-team.com> | 2023-06-30 03:37:03 +0300 |
---|---|---|
committer | max42 <max42@yandex-team.com> | 2023-06-30 03:37:03 +0300 |
commit | fac2bd72b4b31ec3238292caf8fb2a8aaa6d6c4a (patch) | |
tree | b8cbc1deb00309c7f1a7ab6df520a76cf0b5c6d7 /library/cpp/dwarf_backtrace/backtrace.cpp | |
parent | 7bf166b1a7ed0af927f230022b245af618e998c1 (diff) | |
download | ydb-fac2bd72b4b31ec3238292caf8fb2a8aaa6d6c4a.tar.gz |
YT-19324: move YT provider to ydb/library/yql
This commit is formed by the following script: https://paste.yandex-team.ru/6f92e4b8-efc5-4d34-948b-15ee2accd7e7/text.
This commit has zero effect on all projects that depend on YQL.
The summary of changes:
- `yql/providers/yt -> ydb/library/yql/providers/yt `- the whole implementation of YT provider is moved into YDB code base for further export as a part of YT YQL plugin shared library;
- `yql/providers/stat/{expr_nodes,uploader} -> ydb/library/yql/providers/stat/{expr_nodes,uploader}` - a small interface without implementation and the description of stat expr nodes;
- `yql/core/extract_predicate/ut -> ydb/library/yql/core/extract_predicate/ut`;
- `yql/core/{ut,ut_common} -> ydb/library/yql/core/{ut,ut_common}`;
- `yql/core` is gone;
- `yql/library/url_preprocessing -> ydb/library/yql/core/url_preprocessing`.
**NB**: all new targets inside `ydb/` are under `IF (NOT CMAKE_EXPORT)` clause which disables them from open-source cmake generation and ya make build. They will be enabled in the subsequent commits.
Diffstat (limited to 'library/cpp/dwarf_backtrace/backtrace.cpp')
-rw-r--r-- | library/cpp/dwarf_backtrace/backtrace.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/library/cpp/dwarf_backtrace/backtrace.cpp b/library/cpp/dwarf_backtrace/backtrace.cpp new file mode 100644 index 0000000000..a955d07249 --- /dev/null +++ b/library/cpp/dwarf_backtrace/backtrace.cpp @@ -0,0 +1,62 @@ +#include "backtrace.h" + +#include <contrib/libs/backtrace/backtrace.h> + +#include <util/generic/yexception.h> +#include <util/system/type_name.h> +#include <util/system/execpath.h> + +namespace NDwarf { + namespace { + struct TContext { + TCallback& Callback; + int Counter = 0; + TMaybe<TError> Error; + }; + + void HandleLibBacktraceError(void* data, const char* msg, int errnum) { + auto* context = reinterpret_cast<TContext*>(data); + context->Error = TError{.Code = errnum, .Message=msg}; + } + + int HandleLibBacktraceFrame(void* data, uintptr_t pc, const char* filename, int lineno, const char* function) { + auto* context = reinterpret_cast<TContext*>(data); + TLineInfo lineInfo{ + .FileName = filename != nullptr ? filename : "???", + .Line = lineno, + .Col = 0, // libbacktrace doesn't provide column numbers, so fill this field with a dummy value. + .FunctionName = function != nullptr ? CppDemangle(function) : "???", + .Address = pc, + .Index = context->Counter++, + }; + return static_cast<int>(context->Callback(lineInfo)); + } + } + + TMaybe<TError> ResolveBacktrace(TArrayRef<const void* const> backtrace, TCallback callback) { + TContext context{.Callback = callback}; + // Intentionally never freed (see https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/backtrace/backtrace.h?rev=6789902#L80). + static auto* state = backtrace_create_state( + GetPersistentExecPath().c_str(), + 1 /* threaded */, + HandleLibBacktraceError, + &context /* data for the error callback */ + ); + if (nullptr == state) { + static const auto initError = context.Error; + return initError; + } + for (const void* address : backtrace) { + int status = backtrace_pcinfo( + state, + reinterpret_cast<uintptr_t>(address) - 1, // last byte of the call instruction + HandleLibBacktraceFrame, + HandleLibBacktraceError, + &context /* data for both callbacks */); + if (0 != status) { + break; + } + } + return context.Error; + } +} |