File: unwind_fb.cpp

package info (click to toggle)
pytorch-cuda 2.6.0%2Bdfsg-7
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 161,620 kB
  • sloc: python: 1,278,832; cpp: 900,322; ansic: 82,710; asm: 7,754; java: 3,363; sh: 2,811; javascript: 2,443; makefile: 597; ruby: 195; xml: 84; objc: 68
file content (42 lines) | stat: -rw-r--r-- 1,425 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#if defined(__linux__) && (defined(__x86_64__) || defined(__aarch64__)) && \
    defined(__has_include) &&                                              \
    __has_include("ext/stdio_filebuf.h") && defined(FBCODE_CAFFE2)
#include <c10/util/flat_hash_map.h>
#include <llvm/DebugInfo/Symbolize/Symbolize.h>
#include <torch/csrc/profiler/unwind/unwind.h>

namespace torch::unwind {

std::vector<Frame> symbolize(const std::vector<void*>& frames, Mode mode) {
  static std::mutex symbolize_mutex;
  static llvm::symbolize::LLVMSymbolizer symbolizer;
  static ska::flat_hash_map<void*, Frame> frame_map_;

  std::lock_guard<std::mutex> guard(symbolize_mutex);
  std::vector<Frame> results;
  results.reserve(frames.size());
  for (auto addr : frames) {
    if (!frame_map_.count(addr)) {
      auto frame = Frame{"??", "<unwind unsupported>", 0};
      auto maybe_library = libraryFor(addr);
      if (maybe_library) {
        auto libaddress = maybe_library->second - 1;
        auto r = symbolizer.symbolizeCode(
            maybe_library->first,
            {libaddress, llvm::object::SectionedAddress::UndefSection});
        if (r) {
          frame.filename = r->FileName;
          frame.funcname = r->FunctionName;
          frame.lineno = r->Line;
        }
      }
      frame_map_[addr] = std::move(frame);
    }
    results.emplace_back(frame_map_[addr]);
  }
  return results;
}

} // namespace torch::unwind

#endif