Author: labath Date: Tue Jan 29 07:39:27 2019 New Revision: 352507 URL: http://llvm.org/viewvc/llvm-project?rev=352507&view=rev Log: 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. Modified: lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp Modified: lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp?rev=352507&r1=352506&r2=352507&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp Tue Jan 29 07:39:27 2019 @@ -198,6 +198,30 @@ llvm::raw_ostream &breakpad::operator<<( 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<<( 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; Modified: lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h?rev=352507&r1=352506&r2=352507&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h (original) +++ lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h Tue Jan 29 07:39:27 2019 @@ -74,6 +74,21 @@ inline bool operator==(const InfoRecord } llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const InfoRecord &R); +class FileRecord : public Record { +public: + static llvm::Optional<FileRecord> parse(llvm::StringRef Line); + FileRecord(size_t Number, llvm::StringRef Name) + : Record(File), Number(Number), Name(Name) {} + + size_t Number; + llvm::StringRef Name; +}; + +inline bool operator==(const FileRecord &L, const FileRecord &R) { + return L.Number == R.Number && L.Name == R.Name; +} +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const FileRecord &R); + class FuncRecord : public Record { public: static llvm::Optional<FuncRecord> parse(llvm::StringRef Line); @@ -92,6 +107,23 @@ public: bool operator==(const FuncRecord &L, const FuncRecord &R); llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const FuncRecord &R); +class LineRecord : public Record { +public: + static llvm::Optional<LineRecord> parse(llvm::StringRef Line); + LineRecord(lldb::addr_t Address, lldb::addr_t Size, uint32_t LineNum, + size_t FileNum) + : Record(Line), Address(Address), Size(Size), LineNum(LineNum), + FileNum(FileNum) {} + + lldb::addr_t Address; + lldb::addr_t Size; + uint32_t LineNum; + size_t FileNum; +}; + +bool operator==(const LineRecord &L, const LineRecord &R); +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const LineRecord &R); + class PublicRecord : public Record { public: static llvm::Optional<PublicRecord> parse(llvm::StringRef Line); Modified: lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp?rev=352507&r1=352506&r2=352507&view=diff ============================================================================== --- lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp (original) +++ lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp Tue Jan 29 07:39:27 2019 @@ -50,6 +50,13 @@ TEST(InfoRecord, parse) { EXPECT_EQ(llvm::None, InfoRecord::parse("INFO CODE_ID")); } +TEST(FileRecord, parse) { + EXPECT_EQ(FileRecord(47, "foo"), FileRecord::parse("FILE 47 foo")); + EXPECT_EQ(llvm::None, FileRecord::parse("FILE 47")); + EXPECT_EQ(llvm::None, FileRecord::parse("FILE")); + EXPECT_EQ(llvm::None, FileRecord::parse("")); +} + TEST(FuncRecord, parse) { EXPECT_EQ(FuncRecord(true, 0x47, 0x7, 0x8, "foo"), FuncRecord::parse("FUNC m 47 7 8 foo")); @@ -64,6 +71,15 @@ TEST(FuncRecord, parse) { EXPECT_EQ(llvm::None, FuncRecord::parse("FUNC")); } +TEST(LineRecord, parse) { + EXPECT_EQ(LineRecord(0x47, 0x74, 47, 74), LineRecord::parse("47 74 47 74")); + EXPECT_EQ(llvm::None, LineRecord::parse("47 74 47")); + EXPECT_EQ(llvm::None, LineRecord::parse("47 74")); + EXPECT_EQ(llvm::None, LineRecord::parse("47")); + EXPECT_EQ(llvm::None, LineRecord::parse("")); + EXPECT_EQ(llvm::None, LineRecord::parse("FUNC")); +} + TEST(PublicRecord, parse) { EXPECT_EQ(PublicRecord(true, 0x47, 0x8, "foo"), PublicRecord::parse("PUBLIC m 47 8 foo")); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits