[Lldb-commits] [PATCH] D62500: Add support to read aux vector values

Greg Clayton via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Jun 3 10:00:46 PDT 2019


clayborg added inline comments.


================
Comment at: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp:91-92
                 m_process ? m_process->GetID() : LLDB_INVALID_PROCESS_ID);
-
-  m_auxv.reset(new AuxVector(m_process));
+  DataExtractor auxv_data(m_process->GetAuxvData(), m_process->GetByteOrder(),
+                          m_process->GetAddressByteSize());
+  m_auxv = llvm::make_unique<AuxVector>(auxv_data);
----------------
We should change Process::GetAuxvData() to return a DataExtractor to avoid this kind of code.


================
Comment at: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp:94
+  m_auxv = llvm::make_unique<AuxVector>(auxv_data);
   if (log)
     log->Printf("DynamicLoaderPOSIXDYLD::%s pid %" PRIu64 " reloaded auxv data",
----------------
Process can't be NULL ever in a DynamicLoader. It should be a reference, but there may have been complications making that happen for some reason since if you have a member variables "Process &m_process;" it has to be initialized in the contructor? Can't remember. Since process owns the dynamic loader plug-in you can assume "m_process" is always valid and not NULL.


================
Comment at: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp:181-182
 
-  m_auxv.reset(new AuxVector(m_process));
+  DataExtractor auxv_data(m_process->GetAuxvData(), m_process->GetByteOrder(),
+                          m_process->GetAddressByteSize());
+  m_auxv = llvm::make_unique<AuxVector>(auxv_data);
----------------
We should change Process::GetAuxvData() to return a DataExtractor to avoid this kind of code.


================
Comment at: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp:183
+                          m_process->GetAddressByteSize());
+  m_auxv = llvm::make_unique<AuxVector>(auxv_data);
 
----------------
Use std::move?
```
m_auxv = llvm::make_unique<AuxVector>(std::move(auxv_data));
```


================
Comment at: lldb/source/Plugins/Process/Utility/AuxVector.cpp:11
 
-using namespace lldb;
-using namespace lldb_private;
+AuxVector::AuxVector(lldb_private::DataExtractor &data) { ParseAuxv(data); }
 
----------------
Not a big fan of constructors doing parsing work. No way to return an error unless you build that into the AuxVector class (AuxVector::GetError()).


================
Comment at: lldb/source/Plugins/Process/Utility/AuxVector.cpp:13-20
+static bool ReadUInt(lldb_private::DataExtractor &data,
+                     lldb::offset_t *offset_ptr, uint64_t *value) {
   lldb::offset_t saved_offset = *offset_ptr;
-  *value = data.GetMaxU64(offset_ptr, byte_size);
+  // We're not reading an address but an int that could be 32 or 64 bit
+  // depending on the address size, which is what GetAddress does.
+  *value = data.GetAddress(offset_ptr);
   return *offset_ptr != saved_offset;
----------------
Remove this function and just call "data.GetAddress(offset_ptr)"?


================
Comment at: lldb/source/Plugins/Process/Utility/AuxVector.cpp:24-28
+  while (true) {
+    uint64_t type = 0;
+    uint64_t value = 0;
+    if (!ReadUInt(data, &offset, &type) || !ReadUInt(data, &offset, &value))
       break;
----------------
```
const size_t value_type_size = data.GetAddressByteSize() * 2;
while (data.ValidOffsetForDataOfSize(value_type_size)) {
  const uint64_t type = data.GetAddress(&offset);
  const uint64_t value = data.GetAddress(&offset);
  if (type == AUXV_AT_NULL)
    ...
```



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62500/new/

https://reviews.llvm.org/D62500





More information about the lldb-commits mailing list