================ @@ -791,26 +812,101 @@ void MinidumpFileBuilder::AddLinuxFileStreams( size_t size = memory_buffer->getBufferSize(); if (size == 0) continue; - AddDirectory(stream, size); + error = AddDirectory(stream, size); + if (error.Fail()) + return error; m_data.AppendData(memory_buffer->getBufferStart(), size); } } + + return error; } -Status MinidumpFileBuilder::Dump(lldb::FileUP &core_file) const { - constexpr size_t header_size = sizeof(llvm::minidump::Header); - constexpr size_t directory_size = sizeof(llvm::minidump::Directory); +Status MinidumpFileBuilder::AddMemoryList(SaveCoreStyle core_style) { + Status error; + + Process::CoreFileMemoryRanges ranges_32; + Process::CoreFileMemoryRanges ranges_64; + error = m_process_sp->CalculateCoreFileSaveRanges( + SaveCoreStyle::eSaveCoreStackOnly, ranges_32); + if (error.Fail()) + return error; + + std::set<addr_t> stack_start_addresses; + for (const auto &core_range : ranges_32) + stack_start_addresses.insert(core_range.range.start()); + + uint64_t total_size = + ranges_32.size() * sizeof(llvm::minidump::MemoryDescriptor); + for (const auto &core_range : ranges_32) + total_size += core_range.range.size(); + + if (total_size >= UINT32_MAX) { + error.SetErrorStringWithFormat("Unable to write minidump. Stack memory " + "exceeds 32b limit. (Num Stacks %zu)", + ranges_32.size()); + return error; + } + + Process::CoreFileMemoryRanges all_core_memory_ranges; + if (core_style != SaveCoreStyle::eSaveCoreStackOnly) { + error = m_process_sp->CalculateCoreFileSaveRanges(core_style, + all_core_memory_ranges); + if (error.Fail()) + return error; + } + + + // We need to calculate the MemoryDescriptor size in the worst case + // Where all memory descriptors are 64b. We also leave some additional padding + // So that we convert over to 64b with space to spare. This does not waste + // space in the dump But instead converts some memory from being in the + // memorylist_32 to the memorylist_64. + total_size += 256 + (all_core_memory_ranges.size() - stack_start_addresses.size()) * + sizeof(llvm::minidump::MemoryDescriptor_64); + for (const auto &core_range : all_core_memory_ranges) { + addr_t size_to_add = + core_range.range.size() + sizeof(llvm::minidump::MemoryDescriptor); + if (stack_start_addresses.count(core_range.range.start()) > 0) + // Don't double save stacks. + continue; + + if (total_size + size_to_add < UINT32_MAX) { + ranges_32.push_back(core_range); + total_size += core_range.range.size(); + total_size += sizeof(llvm::minidump::MemoryDescriptor); + } else { + ranges_64.push_back(core_range); + } + } + + error = AddMemoryList_32(ranges_32); + if (error.Fail()) + return error; + + // Add the remaining memory as a 64b range. + if (ranges_64.size() > 0) { ---------------- clayborg wrote:
``` if (!ranges_64.empty()) { ``` https://github.com/llvm/llvm-project/pull/95312 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits