diff options
| author | Pavel Labath <pavel@labath.sk> | 2019-01-29 15:39:27 +0000 |
|---|---|---|
| committer | Pavel Labath <pavel@labath.sk> | 2019-01-29 15:39:27 +0000 |
| commit | b1f28579ac548e4ec24a4a1bbe5b938c6bab05f2 (patch) | |
| tree | 4ccf21f381c635a329652a8d2348ebd87081b602 /lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp | |
| parent | 1527c0e7273bfd684d411608425bf72451bd7957 (diff) | |
| download | bcm5719-llvm-b1f28579ac548e4ec24a4a1bbe5b938c6bab05f2.tar.gz bcm5719-llvm-b1f28579ac548e4ec24a4a1bbe5b938c6bab05f2.zip | |
BreakpadRecords: Add parsing code for FILE and LINE records
The two records aren't used by anything yet, but this part can be
separated out easily, so I am comitting it separately to simplify
reviews of the followup patch.
llvm-svn: 352507
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp')
| -rw-r--r-- | lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp b/lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp index c0b2ac9e6d9..511b984261b 100644 --- a/lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp +++ b/lldb/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp @@ -198,6 +198,30 @@ llvm::raw_ostream &breakpad::operator<<(llvm::raw_ostream &OS, return OS << "INFO CODE_ID " << R.ID.GetAsString(); } +llvm::Optional<FileRecord> FileRecord::parse(llvm::StringRef Line) { + // FILE number name + llvm::StringRef Str; + std::tie(Str, Line) = getToken(Line); + if (toToken(Str) != Token::File) + return llvm::None; + + size_t Number; + std::tie(Str, Line) = getToken(Line); + if (!to_integer(Str, Number)) + return llvm::None; + + llvm::StringRef Name = Line.trim(); + if (Name.empty()) + return llvm::None; + + return FileRecord(Number, Name); +} + +llvm::raw_ostream &breakpad::operator<<(llvm::raw_ostream &OS, + const FileRecord &R) { + return OS << "FILE " << R.Number << " " << R.Name; +} + static bool parsePublicOrFunc(llvm::StringRef Line, bool &Multiple, lldb::addr_t &Address, lldb::addr_t *Size, lldb::addr_t &ParamSize, llvm::StringRef &Name) { @@ -259,6 +283,41 @@ llvm::raw_ostream &breakpad::operator<<(llvm::raw_ostream &OS, R.ParamSize, R.Name); } +llvm::Optional<LineRecord> LineRecord::parse(llvm::StringRef Line) { + lldb::addr_t Address; + llvm::StringRef Str; + std::tie(Str, Line) = getToken(Line); + if (!to_integer(Str, Address, 16)) + return llvm::None; + + lldb::addr_t Size; + std::tie(Str, Line) = getToken(Line); + if (!to_integer(Str, Size, 16)) + return llvm::None; + + uint32_t LineNum; + std::tie(Str, Line) = getToken(Line); + if (!to_integer(Str, LineNum)) + return llvm::None; + + size_t FileNum; + std::tie(Str, Line) = getToken(Line); + if (!to_integer(Str, FileNum)) + return llvm::None; + + return LineRecord(Address, Size, LineNum, FileNum); +} + +bool breakpad::operator==(const LineRecord &L, const LineRecord &R) { + return L.Address == R.Address && L.Size == R.Size && L.LineNum == R.LineNum && + L.FileNum == R.FileNum; +} +llvm::raw_ostream &breakpad::operator<<(llvm::raw_ostream &OS, + const LineRecord &R) { + return OS << llvm::formatv("{0:x-} {1:x-} {2} {3}", R.Address, R.Size, + R.LineNum, R.FileNum); +} + llvm::Optional<PublicRecord> PublicRecord::parse(llvm::StringRef Line) { bool Multiple; lldb::addr_t Address, ParamSize; |

