blob: 6480aef109c66885fdd9dc87c556291254c7e34c [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- Symbolize.h ----------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Header for LLVM symbolization library.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H
15#define LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H
16
17#include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
18#include "llvm/Object/Binary.h"
19#include "llvm/Object/ObjectFile.h"
20#include "llvm/Support/Error.h"
21#include <algorithm>
22#include <cstdint>
23#include <map>
24#include <memory>
25#include <string>
26#include <utility>
27#include <vector>
28
29namespace llvm {
30namespace symbolize {
31
32using namespace object;
33
34using FunctionNameKind = DILineInfoSpecifier::FunctionNameKind;
35
36class LLVMSymbolizer {
37public:
38 struct Options {
39 FunctionNameKind PrintFunctions;
40 bool UseSymbolTable : 1;
41 bool Demangle : 1;
42 bool RelativeAddresses : 1;
43 std::string DefaultArch;
44 std::vector<std::string> DsymHints;
45
46 Options(FunctionNameKind PrintFunctions = FunctionNameKind::LinkageName,
47 bool UseSymbolTable = true, bool Demangle = true,
48 bool RelativeAddresses = false, std::string DefaultArch = "")
49 : PrintFunctions(PrintFunctions), UseSymbolTable(UseSymbolTable),
50 Demangle(Demangle), RelativeAddresses(RelativeAddresses),
51 DefaultArch(std::move(DefaultArch)) {}
52 };
53
54 LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {}
55
56 ~LLVMSymbolizer() {
57 flush();
58 }
59
60 Expected<DILineInfo> symbolizeCode(const std::string &ModuleName,
61 uint64_t ModuleOffset,
62 StringRef DWPName = "");
63 Expected<DIInliningInfo> symbolizeInlinedCode(const std::string &ModuleName,
64 uint64_t ModuleOffset,
65 StringRef DWPName = "");
66 Expected<DIGlobal> symbolizeData(const std::string &ModuleName,
67 uint64_t ModuleOffset);
68 void flush();
69
70 static std::string
71 DemangleName(const std::string &Name,
72 const SymbolizableModule *DbiModuleDescriptor);
73
74private:
75 // Bundles together object file with code/data and object file with
76 // corresponding debug info. These objects can be the same.
77 using ObjectPair = std::pair<ObjectFile *, ObjectFile *>;
78
79 /// Returns a SymbolizableModule or an error if loading debug info failed.
80 /// Only one attempt is made to load a module, and errors during loading are
81 /// only reported once. Subsequent calls to get module info for a module that
82 /// failed to load will return nullptr.
83 Expected<SymbolizableModule *>
84 getOrCreateModuleInfo(const std::string &ModuleName, StringRef DWPName = "");
85
86 ObjectFile *lookUpDsymFile(const std::string &Path,
87 const MachOObjectFile *ExeObj,
88 const std::string &ArchName);
89 ObjectFile *lookUpDebuglinkObject(const std::string &Path,
90 const ObjectFile *Obj,
91 const std::string &ArchName);
92
93 /// \brief Returns pair of pointers to object and debug object.
94 Expected<ObjectPair> getOrCreateObjectPair(const std::string &Path,
95 const std::string &ArchName);
96
97 /// \brief Return a pointer to object file at specified path, for a specified
98 /// architecture (e.g. if path refers to a Mach-O universal binary, only one
99 /// object file from it will be returned).
100 Expected<ObjectFile *> getOrCreateObject(const std::string &Path,
101 const std::string &ArchName);
102
103 std::map<std::string, std::unique_ptr<SymbolizableModule>> Modules;
104
105 /// \brief Contains cached results of getOrCreateObjectPair().
106 std::map<std::pair<std::string, std::string>, ObjectPair>
107 ObjectPairForPathArch;
108
109 /// \brief Contains parsed binary for each path, or parsing error.
110 std::map<std::string, OwningBinary<Binary>> BinaryForPath;
111
112 /// \brief Parsed object file for path/architecture pair, where "path" refers
113 /// to Mach-O universal binary.
114 std::map<std::pair<std::string, std::string>, std::unique_ptr<ObjectFile>>
115 ObjectForUBPathAndArch;
116
117 Options Opts;
118};
119
120} // end namespace symbolize
121} // end namespace llvm
122
123#endif // LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H