LLDB mainline
AuxVector.cpp
Go to the documentation of this file.
1//===-- AuxVector.cpp -----------------------------------------------------===//
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#include "AuxVector.h"
10#include <optional>
11
13 ParseAuxv(data);
14}
15
17 lldb::offset_t offset = 0;
18 const size_t value_type_size = data.GetAddressByteSize() * 2;
19 while (data.ValidOffsetForDataOfSize(offset, value_type_size)) {
20 // We're not reading an address but an int that could be 32 or 64 bit
21 // depending on the address size, which is what GetAddress does.
22 const uint64_t type = data.GetAddress(&offset);
23 const uint64_t value = data.GetAddress(&offset);
24 if (type == AUXV_AT_NULL)
25 break;
26 if (type == AUXV_AT_IGNORE)
27 continue;
28
29 m_auxv_entries[type] = value;
30 }
31}
32
33std::optional<uint64_t>
34AuxVector::GetAuxValue(enum EntryType entry_type) const {
35 auto it = m_auxv_entries.find(static_cast<uint64_t>(entry_type));
36 if (it != m_auxv_entries.end())
37 return it->second;
38 return std::nullopt;
39}
40
42 if (!log)
43 return;
44
45 log->PutCString("AuxVector: ");
46 for (auto entry : m_auxv_entries) {
47 LLDB_LOGF(log, " %s [%" PRIu64 "]: %" PRIx64,
48 GetEntryName(static_cast<EntryType>(entry.first)), entry.first,
49 entry.second);
50 }
51}
52
53const char *AuxVector::GetEntryName(EntryType type) const {
54 const char *name = "AT_???";
55
56#define ENTRY_NAME(_type) \
57 _type: \
58 name = &#_type[5]
59 switch (type) {
60 case ENTRY_NAME(AUXV_AT_NULL); break;
61 case ENTRY_NAME(AUXV_AT_IGNORE); break;
62 case ENTRY_NAME(AUXV_AT_EXECFD); break;
63 case ENTRY_NAME(AUXV_AT_PHDR); break;
64 case ENTRY_NAME(AUXV_AT_PHENT); break;
65 case ENTRY_NAME(AUXV_AT_PHNUM); break;
66 case ENTRY_NAME(AUXV_AT_PAGESZ); break;
67 case ENTRY_NAME(AUXV_AT_BASE); break;
68 case ENTRY_NAME(AUXV_AT_FLAGS); break;
69 case ENTRY_NAME(AUXV_AT_ENTRY); break;
70 case ENTRY_NAME(AUXV_AT_NOTELF); break;
71 case ENTRY_NAME(AUXV_AT_UID); break;
72 case ENTRY_NAME(AUXV_AT_EUID); break;
73 case ENTRY_NAME(AUXV_AT_GID); break;
74 case ENTRY_NAME(AUXV_AT_EGID); break;
75 case ENTRY_NAME(AUXV_AT_CLKTCK); break;
76 case ENTRY_NAME(AUXV_AT_PLATFORM); break;
77 case ENTRY_NAME(AUXV_AT_HWCAP); break;
78 case ENTRY_NAME(AUXV_AT_FPUCW); break;
82 case ENTRY_NAME(AUXV_AT_IGNOREPPC); break;
83 case ENTRY_NAME(AUXV_AT_SECURE); break;
85 case ENTRY_NAME(AUXV_AT_RANDOM); break;
86 case ENTRY_NAME(AUXV_AT_HWCAP2); break;
87 case ENTRY_NAME(AUXV_AT_EXECFN); break;
88 case ENTRY_NAME(AUXV_AT_SYSINFO); break;
94 }
95#undef ENTRY_NAME
96
97 return name;
98}
#define ENTRY_NAME(_type)
#define LLDB_LOGF(log,...)
Definition: Log.h:366
std::unordered_map< uint64_t, uint64_t > m_auxv_entries
Definition: AuxVector.h:81
EntryType
Constants describing the type of entry.
Definition: AuxVector.h:26
@ AUXV_AT_DCACHEBSIZE
Data cache block size.
Definition: AuxVector.h:52
@ AUXV_AT_ICACHEBSIZE
Instruction cache block size.
Definition: AuxVector.h:53
@ AUXV_AT_EXECFN
Filename of executable.
Definition: AuxVector.h:60
@ AUXV_AT_SYSINFO_EHDR
Definition: AuxVector.h:63
@ AUXV_AT_L2_CACHESHAPE
Definition: AuxVector.h:66
@ AUXV_AT_IGNORE
Ignore entry.
Definition: AuxVector.h:28
@ AUXV_AT_BASE_PLATFORM
String identifying real platforms.
Definition: AuxVector.h:57
@ AUXV_AT_PAGESZ
Page size.
Definition: AuxVector.h:33
@ AUXV_AT_PHNUM
Number of program headers.
Definition: AuxVector.h:32
@ AUXV_AT_L1I_CACHESHAPE
Shapes of the caches.
Definition: AuxVector.h:64
@ AUXV_AT_UID
UID.
Definition: AuxVector.h:38
@ AUXV_AT_EGID
Effective GID.
Definition: AuxVector.h:41
@ AUXV_AT_L1D_CACHESHAPE
Definition: AuxVector.h:65
@ AUXV_AT_PHDR
Program headers.
Definition: AuxVector.h:30
@ AUXV_AT_ENTRY
Program entry point.
Definition: AuxVector.h:36
@ AUXV_AT_NULL
End of auxv.
Definition: AuxVector.h:27
@ AUXV_AT_SECURE
Boolean, was exec setuid-like?
Definition: AuxVector.h:56
@ AUXV_AT_L3_CACHESHAPE
Definition: AuxVector.h:67
@ AUXV_AT_EUID
Effective UID.
Definition: AuxVector.h:39
@ AUXV_AT_PLATFORM
String identifying platform.
Definition: AuxVector.h:48
@ AUXV_AT_EXECFD
File descriptor of program.
Definition: AuxVector.h:29
@ AUXV_AT_PHENT
Size of program header.
Definition: AuxVector.h:31
@ AUXV_AT_NOTELF
Set if program is not an ELF.
Definition: AuxVector.h:37
@ AUXV_AT_HWCAP2
Extension of AT_HWCAP.
Definition: AuxVector.h:59
@ AUXV_AT_IGNOREPPC
Entry should be ignored.
Definition: AuxVector.h:55
@ AUXV_AT_UCACHEBSIZE
Unified cache block size.
Definition: AuxVector.h:54
@ AUXV_AT_SYSINFO
Pointer to the global system page used for system calls and other nice things.
Definition: AuxVector.h:61
@ AUXV_AT_FLAGS
Flags.
Definition: AuxVector.h:35
@ AUXV_AT_GID
GID.
Definition: AuxVector.h:40
@ AUXV_AT_CLKTCK
Clock frequency (e.g. times(2)).
Definition: AuxVector.h:47
@ AUXV_AT_HWCAP
Machine dependent hints about processor capabilities.
Definition: AuxVector.h:49
@ AUXV_AT_FPUCW
Used FPU control word.
Definition: AuxVector.h:51
@ AUXV_AT_BASE
Interpreter base address.
Definition: AuxVector.h:34
@ AUXV_AT_RANDOM
Address of 16 random bytes.
Definition: AuxVector.h:58
void DumpToLog(lldb_private::Log *log) const
Definition: AuxVector.cpp:41
std::optional< uint64_t > GetAuxValue(enum EntryType entry_type) const
Definition: AuxVector.cpp:34
const char * GetEntryName(EntryType type) const
Definition: AuxVector.cpp:53
AuxVector(const lldb_private::DataExtractor &data)
Definition: AuxVector.cpp:12
void ParseAuxv(const lldb_private::DataExtractor &data)
Definition: AuxVector.cpp:16
An data extractor class.
Definition: DataExtractor.h:48
bool ValidOffsetForDataOfSize(lldb::offset_t offset, lldb::offset_t length) const
Test the availability of length bytes of data from offset.
uint64_t GetAddress(lldb::offset_t *offset_ptr) const
Extract an address from *offset_ptr.
uint32_t GetAddressByteSize() const
Get the current address size.
void PutCString(const char *cstr)
Definition: Log.cpp:135
uint64_t offset_t
Definition: lldb-types.h:85