]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/source/Plugins/Process/minidump/MinidumpTypes.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / source / Plugins / Process / minidump / MinidumpTypes.h
1 //===-- MinidumpTypes.h -----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef liblldb_MinidumpTypes_h_
10 #define liblldb_MinidumpTypes_h_
11
12
13 #include "lldb/Utility/Status.h"
14
15 #include "llvm/ADT/ArrayRef.h"
16 #include "llvm/ADT/BitmaskEnum.h"
17 #include "llvm/ADT/Optional.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/BinaryFormat/Minidump.h"
21 #include "llvm/Support/ConvertUTF.h"
22 #include "llvm/Support/Endian.h"
23
24 // C includes
25 // C++ includes
26
27 // Reference:
28 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms679293(v=vs.85).aspx
29 // https://chromium.googlesource.com/breakpad/breakpad/
30
31 namespace lldb_private {
32
33 namespace minidump {
34
35 using namespace llvm::minidump;
36
37 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
38
39 enum class CvSignature : uint32_t {
40   Pdb70 = 0x53445352, // RSDS
41   ElfBuildId = 0x4270454c, // BpEL (Breakpad/Crashpad minidumps)
42 };
43
44 // Reference:
45 // https://crashpad.chromium.org/doxygen/structcrashpad_1_1CodeViewRecordPDB70.html
46 struct CvRecordPdb70 {
47   struct {
48     llvm::support::ulittle32_t Data1;
49     llvm::support::ulittle16_t Data2;
50     llvm::support::ulittle16_t Data3;
51     uint8_t Data4[8];
52   } Uuid;
53   llvm::support::ulittle32_t Age;
54   // char PDBFileName[];
55 };
56 static_assert(sizeof(CvRecordPdb70) == 20,
57               "sizeof CvRecordPdb70 is not correct!");
58
59 enum class MinidumpMiscInfoFlags : uint32_t {
60   ProcessID = (1 << 0),
61   ProcessTimes = (1 << 1),
62   LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ ProcessTimes)
63 };
64
65 template <typename T>
66 Status consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object) {
67   Status error;
68   if (Buffer.size() < sizeof(T)) {
69     error.SetErrorString("Insufficient buffer!");
70     return error;
71   }
72
73   Object = reinterpret_cast<const T *>(Buffer.data());
74   Buffer = Buffer.drop_front(sizeof(T));
75   return error;
76 }
77
78 struct MinidumpMemoryDescriptor64 {
79   llvm::support::ulittle64_t start_of_memory_range;
80   llvm::support::ulittle64_t data_size;
81
82   static std::pair<llvm::ArrayRef<MinidumpMemoryDescriptor64>, uint64_t>
83   ParseMemory64List(llvm::ArrayRef<uint8_t> &data);
84 };
85 static_assert(sizeof(MinidumpMemoryDescriptor64) == 16,
86               "sizeof MinidumpMemoryDescriptor64 is not correct!");
87
88 // TODO misc2, misc3 ?
89 // Reference:
90 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
91 struct MinidumpMiscInfo {
92   llvm::support::ulittle32_t size;
93   // flags1 represents what info in the struct is valid
94   llvm::support::ulittle32_t flags1;
95   llvm::support::ulittle32_t process_id;
96   llvm::support::ulittle32_t process_create_time;
97   llvm::support::ulittle32_t process_user_time;
98   llvm::support::ulittle32_t process_kernel_time;
99
100   static const MinidumpMiscInfo *Parse(llvm::ArrayRef<uint8_t> &data);
101
102   llvm::Optional<lldb::pid_t> GetPid() const;
103 };
104 static_assert(sizeof(MinidumpMiscInfo) == 24,
105               "sizeof MinidumpMiscInfo is not correct!");
106
107 // The /proc/pid/status is saved as an ascii string in the file
108 class LinuxProcStatus {
109 public:
110   llvm::StringRef proc_status;
111   lldb::pid_t pid;
112
113   static llvm::Optional<LinuxProcStatus> Parse(llvm::ArrayRef<uint8_t> &data);
114
115   lldb::pid_t GetPid() const;
116
117 private:
118   LinuxProcStatus() = default;
119 };
120
121 } // namespace minidump
122 } // namespace lldb_private
123 #endif // liblldb_MinidumpTypes_h_