]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / DynamicLoader / POSIX-DYLD / AuxVector.h
1 //===-- AuxVector.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_AuxVector_H_
11 #define liblldb_AuxVector_H_
12
13 // C Includes
14 // C++ Includes
15 #include <vector>
16
17 // Other libraries and framework includes
18 #include "lldb/lldb-forward.h"
19
20 namespace lldb_private {
21 class DataExtractor;
22 }
23
24 /// @class AuxVector
25 /// Represents a processes auxiliary vector.
26 ///
27 /// When a process is loaded on Linux a vector of values is placed onto the
28 /// stack communicating operating system specific information.  On
29 /// construction this class locates and parses this information and provides a
30 /// simple read-only interface to the entries found.
31 class AuxVector {
32
33 public:
34   AuxVector(lldb_private::Process *process);
35
36   struct Entry {
37     uint64_t type;
38     uint64_t value;
39
40     Entry() : type(0), value(0) {}
41   };
42
43   /// Constants describing the type of entry.
44   /// On Linux, running "LD_SHOW_AUXV=1 ./executable" will spew AUX
45   /// information. Added AUXV prefix to avoid potential conflicts with system-
46   /// defined macros
47   enum EntryType {
48     AUXV_AT_NULL = 0,            ///< End of auxv.
49     AUXV_AT_IGNORE = 1,          ///< Ignore entry.
50     AUXV_AT_EXECFD = 2,          ///< File descriptor of program.
51     AUXV_AT_PHDR = 3,            ///< Program headers.
52     AUXV_AT_PHENT = 4,           ///< Size of program header.
53     AUXV_AT_PHNUM = 5,           ///< Number of program headers.
54     AUXV_AT_PAGESZ = 6,          ///< Page size.
55     AUXV_AT_BASE = 7,            ///< Interpreter base address.
56     AUXV_AT_FLAGS = 8,           ///< Flags.
57     AUXV_AT_ENTRY = 9,           ///< Program entry point.
58     AUXV_AT_NOTELF = 10,         ///< Set if program is not an ELF.
59     AUXV_AT_UID = 11,            ///< UID.
60     AUXV_AT_EUID = 12,           ///< Effective UID.
61     AUXV_AT_GID = 13,            ///< GID.
62     AUXV_AT_EGID = 14,           ///< Effective GID.
63     AUXV_AT_CLKTCK = 17,         ///< Clock frequency (e.g. times(2)).
64     AUXV_AT_PLATFORM = 15,       ///< String identifying platform.
65     AUXV_AT_HWCAP = 16,          ///< Machine dependent hints about processor capabilities.
66     AUXV_AT_FPUCW = 18,          ///< Used FPU control word.
67     AUXV_AT_DCACHEBSIZE = 19,    ///< Data cache block size.
68     AUXV_AT_ICACHEBSIZE = 20,    ///< Instruction cache block size.
69     AUXV_AT_UCACHEBSIZE = 21,    ///< Unified cache block size.
70     AUXV_AT_IGNOREPPC = 22,      ///< Entry should be ignored.
71     AUXV_AT_SECURE = 23,         ///< Boolean, was exec setuid-like?
72     AUXV_AT_BASE_PLATFORM = 24,  ///< String identifying real platforms.
73     AUXV_AT_RANDOM = 25,         ///< Address of 16 random bytes.
74     AUXV_AT_EXECFN = 31,         ///< Filename of executable.
75     AUXV_AT_SYSINFO = 32,        ///< Pointer to the global system page used for system
76                                  ///calls and other nice things.
77     AUXV_AT_SYSINFO_EHDR = 33,
78     AUXV_AT_L1I_CACHESHAPE = 34, ///< Shapes of the caches.
79     AUXV_AT_L1D_CACHESHAPE = 35,
80     AUXV_AT_L2_CACHESHAPE = 36,
81     AUXV_AT_L3_CACHESHAPE = 37,
82   };
83
84 private:
85   typedef std::vector<Entry> EntryVector;
86
87 public:
88   typedef EntryVector::const_iterator iterator;
89
90   iterator begin() const { return m_auxv.begin(); }
91   iterator end() const { return m_auxv.end(); }
92
93   iterator FindEntry(EntryType type) const;
94
95   static const char *GetEntryName(const Entry &entry) {
96     return GetEntryName(static_cast<EntryType>(entry.type));
97   }
98
99   static const char *GetEntryName(EntryType type);
100
101   void DumpToLog(lldb_private::Log *log) const;
102
103 private:
104   lldb_private::Process *m_process;
105   EntryVector m_auxv;
106
107   lldb::DataBufferSP GetAuxvData();
108
109   void ParseAuxv(lldb_private::DataExtractor &data);
110 };
111
112 #endif