]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r308421, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / DynamicLoader / POSIX-DYLD / AuxVector.cpp
1 //===-- AuxVector.cpp -------------------------------------------*- 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 #include "AuxVector.h"
11 #include "lldb/Target/Process.h"
12 #include "lldb/Utility/DataBufferHeap.h"
13 #include "lldb/Utility/DataExtractor.h"
14 #include "lldb/Utility/Log.h"
15
16 using namespace lldb;
17 using namespace lldb_private;
18
19 static bool GetMaxU64(DataExtractor &data, lldb::offset_t *offset_ptr,
20                       uint64_t *value, unsigned int byte_size) {
21   lldb::offset_t saved_offset = *offset_ptr;
22   *value = data.GetMaxU64(offset_ptr, byte_size);
23   return *offset_ptr != saved_offset;
24 }
25
26 static bool ParseAuxvEntry(DataExtractor &data, AuxVector::Entry &entry,
27                            lldb::offset_t *offset_ptr, unsigned int byte_size) {
28   if (!GetMaxU64(data, offset_ptr, &entry.type, byte_size))
29     return false;
30
31   if (!GetMaxU64(data, offset_ptr, &entry.value, byte_size))
32     return false;
33
34   return true;
35 }
36
37 DataBufferSP AuxVector::GetAuxvData() {
38   if (m_process)
39     return m_process->GetAuxvData();
40   else
41     return DataBufferSP();
42 }
43
44 void AuxVector::ParseAuxv(DataExtractor &data) {
45   const unsigned int byte_size = m_process->GetAddressByteSize();
46   lldb::offset_t offset = 0;
47
48   for (;;) {
49     Entry entry;
50
51     if (!ParseAuxvEntry(data, entry, &offset, byte_size))
52       break;
53
54     if (entry.type == AUXV_AT_NULL)
55       break;
56
57     if (entry.type == AUXV_AT_IGNORE)
58       continue;
59
60     m_auxv.push_back(entry);
61   }
62 }
63
64 AuxVector::AuxVector(Process *process) : m_process(process) {
65   DataExtractor data;
66   Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER));
67
68   data.SetData(GetAuxvData());
69   data.SetByteOrder(m_process->GetByteOrder());
70   data.SetAddressByteSize(m_process->GetAddressByteSize());
71
72   ParseAuxv(data);
73
74   if (log)
75     DumpToLog(log);
76 }
77
78 AuxVector::iterator AuxVector::FindEntry(EntryType type) const {
79   for (iterator I = begin(); I != end(); ++I) {
80     if (I->type == static_cast<uint64_t>(type))
81       return I;
82   }
83
84   return end();
85 }
86
87 void AuxVector::DumpToLog(Log *log) const {
88   if (!log)
89     return;
90
91   log->PutCString("AuxVector: ");
92   for (iterator I = begin(); I != end(); ++I) {
93     log->Printf("   %s [%" PRIu64 "]: %" PRIx64, GetEntryName(*I), I->type,
94                 I->value);
95   }
96 }
97
98 const char *AuxVector::GetEntryName(EntryType type) {
99   const char *name = "AT_???";
100
101 #define ENTRY_NAME(_type) \
102   _type:                  \
103   name = #_type + 5
104   switch (type) {
105     case ENTRY_NAME(AUXV_AT_NULL);           break;
106     case ENTRY_NAME(AUXV_AT_IGNORE);         break;
107     case ENTRY_NAME(AUXV_AT_EXECFD);         break;
108     case ENTRY_NAME(AUXV_AT_PHDR);           break;
109     case ENTRY_NAME(AUXV_AT_PHENT);          break;
110     case ENTRY_NAME(AUXV_AT_PHNUM);          break;
111     case ENTRY_NAME(AUXV_AT_PAGESZ);         break;
112     case ENTRY_NAME(AUXV_AT_BASE);           break;
113     case ENTRY_NAME(AUXV_AT_FLAGS);          break;
114     case ENTRY_NAME(AUXV_AT_ENTRY);          break;
115     case ENTRY_NAME(AUXV_AT_NOTELF);         break;
116     case ENTRY_NAME(AUXV_AT_UID);            break;
117     case ENTRY_NAME(AUXV_AT_EUID);           break;
118     case ENTRY_NAME(AUXV_AT_GID);            break;
119     case ENTRY_NAME(AUXV_AT_EGID);           break;
120     case ENTRY_NAME(AUXV_AT_CLKTCK);         break;
121     case ENTRY_NAME(AUXV_AT_PLATFORM);       break;
122     case ENTRY_NAME(AUXV_AT_HWCAP);          break;
123     case ENTRY_NAME(AUXV_AT_FPUCW);          break;
124     case ENTRY_NAME(AUXV_AT_DCACHEBSIZE);    break;
125     case ENTRY_NAME(AUXV_AT_ICACHEBSIZE);    break;
126     case ENTRY_NAME(AUXV_AT_UCACHEBSIZE);    break;
127     case ENTRY_NAME(AUXV_AT_IGNOREPPC);      break;
128     case ENTRY_NAME(AUXV_AT_SECURE);         break;
129     case ENTRY_NAME(AUXV_AT_BASE_PLATFORM);  break;
130     case ENTRY_NAME(AUXV_AT_RANDOM);         break;
131     case ENTRY_NAME(AUXV_AT_EXECFN);         break;
132     case ENTRY_NAME(AUXV_AT_SYSINFO);        break;
133     case ENTRY_NAME(AUXV_AT_SYSINFO_EHDR);   break;
134     case ENTRY_NAME(AUXV_AT_L1I_CACHESHAPE); break;
135     case ENTRY_NAME(AUXV_AT_L1D_CACHESHAPE); break;
136     case ENTRY_NAME(AUXV_AT_L2_CACHESHAPE);  break;
137     case ENTRY_NAME(AUXV_AT_L3_CACHESHAPE);  break;
138     }
139 #undef ENTRY_NAME
140
141     return name;
142 }