]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/elf-core/ThreadElfCore.h
Merge lldb trunk r321017 to contrib/llvm/tools/lldb.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / elf-core / ThreadElfCore.h
1 //===-- ThreadElfCore.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 #ifndef liblldb_ThreadElfCore_h_
11 #define liblldb_ThreadElfCore_h_
12
13 #include "Plugins/Process/elf-core/RegisterUtilities.h"
14 #include "lldb/Target/Thread.h"
15 #include "lldb/Utility/DataExtractor.h"
16 #include "llvm/ADT/DenseMap.h"
17 #include <string>
18
19 struct compat_timeval {
20   alignas(8) uint64_t tv_sec;
21   alignas(8) uint64_t tv_usec;
22 };
23
24 // PRSTATUS structure's size differs based on architecture.
25 // This is the layout in the x86-64 arch.
26 // In the i386 case we parse it manually and fill it again
27 // in the same structure
28 // The gp registers are also a part of this struct, but they are handled
29 // separately
30
31 #undef si_signo
32 #undef si_code
33 #undef si_errno
34
35 struct ELFLinuxPrStatus {
36   int32_t si_signo;
37   int32_t si_code;
38   int32_t si_errno;
39
40   int16_t pr_cursig;
41
42   alignas(8) uint64_t pr_sigpend;
43   alignas(8) uint64_t pr_sighold;
44
45   uint32_t pr_pid;
46   uint32_t pr_ppid;
47   uint32_t pr_pgrp;
48   uint32_t pr_sid;
49
50   compat_timeval pr_utime;
51   compat_timeval pr_stime;
52   compat_timeval pr_cutime;
53   compat_timeval pr_cstime;
54
55   ELFLinuxPrStatus();
56
57   lldb_private::Status Parse(const lldb_private::DataExtractor &data,
58                              const lldb_private::ArchSpec &arch);
59
60   // Return the bytesize of the structure
61   // 64 bit - just sizeof
62   // 32 bit - hardcoded because we are reusing the struct, but some of the
63   // members are smaller -
64   // so the layout is not the same
65   static size_t GetSize(const lldb_private::ArchSpec &arch);
66 };
67
68 static_assert(sizeof(ELFLinuxPrStatus) == 112,
69               "sizeof ELFLinuxPrStatus is not correct!");
70
71 struct ELFLinuxSigInfo {
72   int32_t si_signo;
73   int32_t si_code;
74   int32_t si_errno;
75
76   ELFLinuxSigInfo();
77
78   lldb_private::Status Parse(const lldb_private::DataExtractor &data,
79                              const lldb_private::ArchSpec &arch);
80
81   // Return the bytesize of the structure
82   // 64 bit - just sizeof
83   // 32 bit - hardcoded because we are reusing the struct, but some of the
84   // members are smaller -
85   // so the layout is not the same
86   static size_t GetSize(const lldb_private::ArchSpec &arch);
87 };
88
89 static_assert(sizeof(ELFLinuxSigInfo) == 12,
90               "sizeof ELFLinuxSigInfo is not correct!");
91
92 // PRPSINFO structure's size differs based on architecture.
93 // This is the layout in the x86-64 arch case.
94 // In the i386 case we parse it manually and fill it again
95 // in the same structure
96 struct ELFLinuxPrPsInfo {
97   char pr_state;
98   char pr_sname;
99   char pr_zomb;
100   char pr_nice;
101   alignas(8) uint64_t pr_flag;
102   uint32_t pr_uid;
103   uint32_t pr_gid;
104   int32_t pr_pid;
105   int32_t pr_ppid;
106   int32_t pr_pgrp;
107   int32_t pr_sid;
108   char pr_fname[16];
109   char pr_psargs[80];
110
111   ELFLinuxPrPsInfo();
112
113   lldb_private::Status Parse(const lldb_private::DataExtractor &data,
114                              const lldb_private::ArchSpec &arch);
115
116   // Return the bytesize of the structure
117   // 64 bit - just sizeof
118   // 32 bit - hardcoded because we are reusing the struct, but some of the
119   // members are smaller -
120   // so the layout is not the same
121   static size_t GetSize(const lldb_private::ArchSpec &arch);
122 };
123
124 static_assert(sizeof(ELFLinuxPrPsInfo) == 136,
125               "sizeof ELFLinuxPrPsInfo is not correct!");
126
127 struct ThreadData {
128   lldb_private::DataExtractor gpregset;
129   std::vector<lldb_private::CoreNote> notes;
130   lldb::tid_t tid;
131   int signo = 0;
132   int prstatus_sig = 0;
133   std::string name;
134 };
135
136 class ThreadElfCore : public lldb_private::Thread {
137 public:
138   ThreadElfCore(lldb_private::Process &process, const ThreadData &td);
139
140   ~ThreadElfCore() override;
141
142   void RefreshStateAfterStop() override;
143
144   lldb::RegisterContextSP GetRegisterContext() override;
145
146   lldb::RegisterContextSP
147   CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
148
149   void ClearStackFrames() override;
150
151   static bool ThreadIDIsValid(lldb::tid_t thread) { return thread != 0; }
152
153   const char *GetName() override {
154     if (m_thread_name.empty())
155       return NULL;
156     return m_thread_name.c_str();
157   }
158
159   void SetName(const char *name) override {
160     if (name && name[0])
161       m_thread_name.assign(name);
162     else
163       m_thread_name.clear();
164   }
165
166 protected:
167   //------------------------------------------------------------------
168   // Member variables.
169   //------------------------------------------------------------------
170   std::string m_thread_name;
171   lldb::RegisterContextSP m_thread_reg_ctx_sp;
172
173   int m_signo;
174
175   lldb_private::DataExtractor m_gpregset_data;
176   std::vector<lldb_private::CoreNote> m_notes;
177
178   bool CalculateStopInfo() override;
179 };
180
181 #endif // liblldb_ThreadElfCore_h_