blob: 8583b6a36e630227e3e878d5728e66d777e60f4d [file] [log] [blame]
Alexey Samsonov8df3a072015-10-29 22:21:37 +00001//===-- SymbolizableObjectFile.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// This file declares the SymbolizableObjectFile class.
11//
12//===----------------------------------------------------------------------===//
13#ifndef LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
14#define LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
15
16#include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
17#include <map>
18
19namespace llvm {
20class DataExtractor;
21}
22
23namespace llvm {
24namespace symbolize {
25
26class SymbolizableObjectFile : public SymbolizableModule {
27public:
28 static ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
29 create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
30
31 DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind,
32 bool UseSymbolTable) const override;
33 DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset,
34 FunctionNameKind FNKind,
35 bool UseSymbolTable) const override;
Alexey Samsonov76f7ecb2015-10-29 23:49:19 +000036 DIGlobal symbolizeData(uint64_t ModuleOffset) const override;
Alexey Samsonov8df3a072015-10-29 22:21:37 +000037
38 // Return true if this is a 32-bit x86 PE COFF module.
39 bool isWin32Module() const override;
40
41 // Returns the preferred base of the module, i.e. where the loader would place
42 // it in memory assuming there were no conflicts.
43 uint64_t getModulePreferredBase() const override;
44
45private:
Reid Klecknerc038e2d2015-11-13 17:00:36 +000046 bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind,
47 bool UseSymbolTable) const;
48
Alexey Samsonov8df3a072015-10-29 22:21:37 +000049 bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address,
50 std::string &Name, uint64_t &Addr,
51 uint64_t &Size) const;
52 // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd
53 // (function descriptor) section and OpdExtractor refers to its contents.
54 std::error_code addSymbol(const object::SymbolRef &Symbol,
55 uint64_t SymbolSize,
56 DataExtractor *OpdExtractor = nullptr,
57 uint64_t OpdAddress = 0);
58 std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj);
59
60 object::ObjectFile *Module;
61 std::unique_ptr<DIContext> DebugInfoContext;
62
63 struct SymbolDesc {
64 uint64_t Addr;
65 // If size is 0, assume that symbol occupies the whole memory range up to
66 // the following symbol.
67 uint64_t Size;
68 friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
69 return s1.Addr < s2.Addr;
70 }
71 };
72 std::map<SymbolDesc, StringRef> Functions;
73 std::map<SymbolDesc, StringRef> Objects;
74
75 SymbolizableObjectFile(object::ObjectFile *Obj,
76 std::unique_ptr<DIContext> DICtx);
77};
78
79} // namespace symbolize
80} // namespace llvm
81
82#endif // LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H