// Linux Proc Status // it's stored as an ascii string in the file llvm::Optional<LinuxProcStatus> LinuxProcStatus::Parse(llvm::ArrayRef<uint8_t> &data) { LinuxProcStatus result; result.proc_status = llvm::StringRef(reinterpret_cast<const char *>(data.data()), data.size()); data = data.drop_front(data.size()); llvm::SmallVector<llvm::StringRef, 0> lines; result.proc_status.split(lines, '\n', 42); // /proc/$pid/status has 41 lines, but why not use 42? for (auto line : lines) { if (line.consume_front("Pid:")) { line = line.trim(); if (!line.getAsInteger(10, result.pid)) return result; } } return llvm::None; }
static Variable::RangeList MakeRangeList(const PdbIndex &index, const LocalVariableAddrRange &range, llvm::ArrayRef<LocalVariableAddrGap> gaps) { lldb::addr_t start = index.MakeVirtualAddress(range.ISectStart, range.OffsetStart); lldb::addr_t end = start + range.Range; Variable::RangeList result; while (!gaps.empty()) { const LocalVariableAddrGap &gap = gaps.front(); lldb::addr_t size = gap.GapStartOffset - start; result.Append(start, size); start += gap.Range; gaps = gaps.drop_front(); } result.Append(start, end - start); return result; }
std::vector<const MinidumpMemoryInfo *> MinidumpMemoryInfo::ParseMemoryInfoList(llvm::ArrayRef<uint8_t> &data) { const MinidumpMemoryInfoListHeader *header; Status error = consumeObject(data, header); if (error.Fail() || header->size_of_header < sizeof(MinidumpMemoryInfoListHeader) || header->size_of_entry < sizeof(MinidumpMemoryInfo)) return {}; data = data.drop_front(header->size_of_header - sizeof(MinidumpMemoryInfoListHeader)); if (header->size_of_entry * header->num_of_entries > data.size()) return {}; std::vector<const MinidumpMemoryInfo *> result; for (uint64_t i = 0; i < header->num_of_entries; ++i) { result.push_back(reinterpret_cast<const MinidumpMemoryInfo *>( data.data() + i * header->size_of_entry)); } return result; }