[Lldb-commits] [PATCH] D66633: Breakpad: Add support for parsing STACK WIN records
This revision was automatically updated to reflect the committed changes. Closed by commit rL369892: Breakpad: Add support for parsing STACK WIN records (authored by labath, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D66633/new/ https://reviews.llvm.org/D66633 Files: lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp Index: lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp === --- lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp +++ lldb/trunk/unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp @@ -20,6 +20,7 @@ EXPECT_EQ(Record::Func, Record::classify("FUNC")); EXPECT_EQ(Record::Public, Record::classify("PUBLIC")); EXPECT_EQ(Record::StackCFI, Record::classify("STACK CFI")); + EXPECT_EQ(Record::StackWin, Record::classify("STACK WIN")); // Any obviously incorrect lines will be classified as such. EXPECT_EQ(llvm::None, Record::classify("STACK")); @@ -119,3 +120,34 @@ EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo")); EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47")); } + +TEST(StackWinRecord, parse) { + EXPECT_EQ( + StackWinRecord(0x47, 0x8, 3, 4, 5, llvm::StringRef("$eip $esp ^ =")), + StackWinRecord::parse("STACK WIN 4 47 8 1 2 3 4 5 6 1 $eip $esp ^ =")); + + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 0 47 8 1 0 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, +StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0 0 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 3 47 8 1 0 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, +StackWinRecord::parse("STACK WIN 3 47 8 1 0 0 0 0 0 0 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 4 47 8 1 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("")); + EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo")); + EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47")); +} Index: lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp === --- lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp +++ lldb/trunk/source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp @@ -16,7 +16,19 @@ using namespace lldb_private::breakpad; namespace { -enum class Token { Unknown, Module, Info, CodeID, File, Func, Public, Stack, CFI, Init }; +enum class Token { + Unknown, + Module, + Info, + CodeID, + File, + Func, + Public, + Stack, + CFI, + Init, + Win, +}; } template @@ -33,6 +45,7 @@ .Case("STACK", Token::Stack) .Case("CFI", Token::CFI) .Case("INIT", Token::Init) + .Case("WIN", Token::Win) .Default(Token::Unknown); } @@ -127,6 +140,8 @@ switch (Tok) { case Token::CFI: return Record::StackCFI; +case Token::Win: + return Record::StackWin; default: return llvm::None; } @@ -134,13 +149,13 @@ case Token::Unknown: // Optimistically assume that any unrecognised token means this is a line // record, those don't have a special keyword and start directly with a -// hex number. CODE_ID should never be at the start of a line, but if it -// is, it can be treated the same way as a garbled line record. +// hex number. return Record::Line; case Token::CodeID: case Token::CFI: case Token::Init: + case Token::Win: // These should never appear at the start of a valid record. return llvm::None; } @@ -390,6 +405,81 @@ return OS << " " << R.UnwindRules; } +llvm::Optional StackWinRecord::parse(llvm::StringRef Line) { + // STACK WIN type rva code_size prologue_size epilogue_size parameter_size + // saved_register_size local_size max_stack_size has_program_string + //
[Lldb-commits] [PATCH] D66633: Breakpad: Add support for parsing STACK WIN records
markmentovai accepted this revision. markmentovai added a comment. LGTM too. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D66633/new/ https://reviews.llvm.org/D66633 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D66633: Breakpad: Add support for parsing STACK WIN records
amccarth accepted this revision. amccarth added a comment. This revision is now accepted and ready to land. LGTM. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D66633/new/ https://reviews.llvm.org/D66633 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D66633: Breakpad: Add support for parsing STACK WIN records
labath created this revision. labath added reviewers: amccarth, markmentovai. The fields that aren't useful for us right now are simply ignored. https://reviews.llvm.org/D66633 Files: source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp Index: unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp === --- unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp +++ unittests/ObjectFile/Breakpad/BreakpadRecordsTest.cpp @@ -20,6 +20,7 @@ EXPECT_EQ(Record::Func, Record::classify("FUNC")); EXPECT_EQ(Record::Public, Record::classify("PUBLIC")); EXPECT_EQ(Record::StackCFI, Record::classify("STACK CFI")); + EXPECT_EQ(Record::StackWin, Record::classify("STACK WIN")); // Any obviously incorrect lines will be classified as such. EXPECT_EQ(llvm::None, Record::classify("STACK")); @@ -119,3 +120,34 @@ EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo")); EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47")); } + +TEST(StackWinRecord, parse) { + EXPECT_EQ( + StackWinRecord(0x47, 0x8, 3, 4, 5, llvm::StringRef("$eip $esp ^ =")), + StackWinRecord::parse("STACK WIN 4 47 8 1 2 3 4 5 6 1 $eip $esp ^ =")); + + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 0 47 8 1 0 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, +StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0 0 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 3 47 8 1 0 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, +StackWinRecord::parse("STACK WIN 3 47 8 1 0 0 0 0 0 0 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse( +"STACK WIN 4 47 8 1 0 0 0 0 1 $eip $esp ^ =")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1 0")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8 1")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47 8")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4 47")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN 4")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK WIN")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("STACK")); + EXPECT_EQ(llvm::None, StackWinRecord::parse("")); + EXPECT_EQ(llvm::None, StackCFIRecord::parse("FILE 47 foo")); + EXPECT_EQ(llvm::None, StackCFIRecord::parse("42 47")); +} Index: source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h === --- source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h +++ source/Plugins/ObjectFile/Breakpad/BreakpadRecords.h @@ -20,7 +20,7 @@ class Record { public: - enum Kind { Module, Info, File, Func, Line, Public, StackCFI }; + enum Kind { Module, Info, File, Func, Line, Public, StackCFI, StackWin }; /// Attempt to guess the kind of the record present in the argument without /// doing a full parse. The returned kind will always be correct for valid @@ -157,6 +157,29 @@ bool operator==(const StackCFIRecord , const StackCFIRecord ); llvm::raw_ostream <<(llvm::raw_ostream , const StackCFIRecord ); +class StackWinRecord : public Record { +public: + static llvm::Optional parse(llvm::StringRef Line); + + StackWinRecord(lldb::addr_t RVA, lldb::addr_t CodeSize, + lldb::addr_t ParameterSize, lldb::addr_t SavedRegisterSize, + lldb::addr_t LocalSize, llvm::StringRef ProgramString) + : Record(StackWin), RVA(RVA), CodeSize(CodeSize), +ParameterSize(ParameterSize), SavedRegisterSize(SavedRegisterSize), +LocalSize(LocalSize), ProgramString(ProgramString) {} + + enum class FrameType : uint8_t { FPO = 0, FrameData = 4 }; + lldb::addr_t RVA; + lldb::addr_t CodeSize; + lldb::addr_t ParameterSize; + lldb::addr_t SavedRegisterSize; + lldb::addr_t LocalSize; + llvm::StringRef ProgramString; +}; + +bool operator==(const StackWinRecord , const StackWinRecord ); +llvm::raw_ostream <<(llvm::raw_ostream , const StackWinRecord ); + } // namespace breakpad } // namespace lldb_private Index: source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp === --- source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp +++ source/Plugins/ObjectFile/Breakpad/BreakpadRecords.cpp @@ -16,7 +16,19 @@ using namespace lldb_private::breakpad; namespace { -enum class Token { Unknown, Module, Info, CodeID, File, Func, Public, Stack, CFI, Init }; +enum class Token { + Unknown, +