Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: src/processor/stackwalker_mips_unittest.cc

Issue 1418453011: [mips64] Support for mips n64 (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Fix accidentally removed lines from Makefile.am Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, Google Inc. 1 // Copyright (c) 2013, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 MockCodeModules modules; 138 MockCodeModules modules;
139 MockSymbolSupplier supplier; 139 MockSymbolSupplier supplier;
140 BasicSourceLineResolver resolver; 140 BasicSourceLineResolver resolver;
141 CallStack call_stack; 141 CallStack call_stack;
142 const vector<StackFrame*>* frames; 142 const vector<StackFrame*>* frames;
143 }; 143 };
144 144
145 class SanityCheck: public StackwalkerMIPSFixture, public Test { }; 145 class SanityCheck: public StackwalkerMIPSFixture, public Test { };
146 146
147 TEST_F(SanityCheck, NoResolver) { 147 TEST_F(SanityCheck, NoResolver) {
148 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
148 stack_section.start() = 0x80000000; 149 stack_section.start() = 0x80000000;
149 stack_section.D32(0).D32(0x0); 150 stack_section.D32(0).D32(0x0);
150 RegionFromSection(); 151 RegionFromSection();
151 raw_context.epc = 0x00400020; 152 raw_context.epc = 0x00400020;
152 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; 153 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000;
153 154
154 StackFrameSymbolizer frame_symbolizer(NULL, NULL); 155 StackFrameSymbolizer frame_symbolizer(NULL, NULL);
155 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, 156 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules,
156 &frame_symbolizer); 157 &frame_symbolizer);
157 // This should succeed, even without a resolver or supplier. 158 // This should succeed, even without a resolver or supplier.
158 vector<const CodeModule*> modules_without_symbols; 159 vector<const CodeModule*> modules_without_symbols;
159 vector<const CodeModule*> modules_with_corrupt_symbols; 160 vector<const CodeModule*> modules_with_corrupt_symbols;
160 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, 161 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
161 &modules_with_corrupt_symbols)); 162 &modules_with_corrupt_symbols));
162 ASSERT_EQ(1U, modules_without_symbols.size()); 163 ASSERT_EQ(1U, modules_without_symbols.size());
163 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); 164 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file());
164 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); 165 ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
165 frames = call_stack.frames(); 166 frames = call_stack.frames();
166 ASSERT_EQ(1U, frames->size()); 167 ASSERT_EQ(1U, frames->size());
167 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); 168 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0));
168 // Check that the values from the original raw context made it 169 // Check that the values from the original raw context made it
169 // through to the context in the stack frame. 170 // through to the context in the stack frame.
170 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); 171 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));
171 } 172 }
172 173
173 class GetContextFrame: public StackwalkerMIPSFixture, public Test { }; 174 class GetContextFrame: public StackwalkerMIPSFixture, public Test { };
174 175
175 TEST_F(GetContextFrame, Simple) { 176 TEST_F(GetContextFrame, Simple) {
177 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
176 stack_section.start() = 0x80000000; 178 stack_section.start() = 0x80000000;
177 stack_section.D32(0).D32(0x0); 179 stack_section.D32(0).D32(0x0);
178 RegionFromSection(); 180 RegionFromSection();
179 raw_context.epc = 0x00400020; 181 raw_context.epc = 0x00400020;
180 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; 182 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000;
181 183
182 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); 184 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
183 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, 185 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules,
184 &frame_symbolizer); 186 &frame_symbolizer);
185 vector<const CodeModule*> modules_without_symbols; 187 vector<const CodeModule*> modules_without_symbols;
186 vector<const CodeModule*> modules_with_corrupt_symbols; 188 vector<const CodeModule*> modules_with_corrupt_symbols;
187 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, 189 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
188 &modules_with_corrupt_symbols)); 190 &modules_with_corrupt_symbols));
189 ASSERT_EQ(1U, modules_without_symbols.size()); 191 ASSERT_EQ(1U, modules_without_symbols.size());
190 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); 192 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file());
191 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); 193 ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
192 frames = call_stack.frames(); 194 frames = call_stack.frames();
193 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); 195 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0));
194 // Check that the values from the original raw context made it 196 // Check that the values from the original raw context made it
195 // through to the context in the stack frame. 197 // through to the context in the stack frame.
196 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); 198 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));
197 } 199 }
198 200
199 // The stackwalker should be able to produce the context frame even 201 // The stackwalker should be able to produce the context frame even
200 // without stack memory present. 202 // without stack memory present.
201 TEST_F(GetContextFrame, NoStackMemory) { 203 TEST_F(GetContextFrame, NoStackMemory) {
204 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
202 raw_context.epc = 0x00400020; 205 raw_context.epc = 0x00400020;
203 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; 206 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000;
204 207
205 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); 208 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
206 StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules, 209 StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules,
207 &frame_symbolizer); 210 &frame_symbolizer);
208 vector<const CodeModule*> modules_without_symbols; 211 vector<const CodeModule*> modules_without_symbols;
209 vector<const CodeModule*> modules_with_corrupt_symbols; 212 vector<const CodeModule*> modules_with_corrupt_symbols;
210 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, 213 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
211 &modules_with_corrupt_symbols)); 214 &modules_with_corrupt_symbols));
212 ASSERT_EQ(1U, modules_without_symbols.size()); 215 ASSERT_EQ(1U, modules_without_symbols.size());
213 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); 216 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file());
214 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); 217 ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
215 frames = call_stack.frames(); 218 frames = call_stack.frames();
216 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); 219 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0));
217 // Check that the values from the original raw context made it 220 // Check that the values from the original raw context made it
218 // through to the context in the stack frame. 221 // through to the context in the stack frame.
219 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); 222 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));
220 } 223 }
221 224
222 class GetCallerFrame: public StackwalkerMIPSFixture, public Test { }; 225 class GetCallerFrame: public StackwalkerMIPSFixture, public Test { };
223 226
224 TEST_F(GetCallerFrame, ScanWithoutSymbols) { 227 TEST_F(GetCallerFrame, ScanWithoutSymbols) {
228 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
225 // When the stack walker resorts to scanning the stack, 229 // When the stack walker resorts to scanning the stack,
226 // only addresses located within loaded modules are 230 // only addresses located within loaded modules are
227 // considered valid return addresses. 231 // considered valid return addresses.
228 // Force scanning through three frames to ensure that the 232 // Force scanning through three frames to ensure that the
229 // stack pointer is set properly in scan-recovered frames. 233 // stack pointer is set properly in scan-recovered frames.
230 stack_section.start() = 0x80000000; 234 stack_section.start() = 0x80000000;
231 uint32_t return_address1 = 0x00400100; 235 uint32_t return_address1 = 0x00400100;
232 uint32_t return_address2 = 0x00400900; 236 uint32_t return_address2 = 0x00400900;
233 Label frame1_sp, frame2_sp; 237 Label frame1_sp, frame2_sp;
234 stack_section 238 stack_section
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | 295 ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC |
292 StackFrameMIPS::CONTEXT_VALID_SP | 296 StackFrameMIPS::CONTEXT_VALID_SP |
293 StackFrameMIPS::CONTEXT_VALID_FP | 297 StackFrameMIPS::CONTEXT_VALID_FP |
294 StackFrameMIPS::CONTEXT_VALID_RA), 298 StackFrameMIPS::CONTEXT_VALID_RA),
295 frame2->context_validity); 299 frame2->context_validity);
296 EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc); 300 EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc);
297 EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]); 301 EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]);
298 } 302 }
299 303
300 TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { 304 TEST_F(GetCallerFrame, ScanWithFunctionSymbols) {
305 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
301 // During stack scanning, if a potential return address 306 // During stack scanning, if a potential return address
302 // is located within a loaded module that has symbols, 307 // is located within a loaded module that has symbols,
303 // it is only considered a valid return address if it 308 // it is only considered a valid return address if it
304 // lies within a function's bounds. 309 // lies within a function's bounds.
305 stack_section.start() = 0x80000000; 310 stack_section.start() = 0x80000000;
306 uint32_t return_address = 0x00500200; 311 uint32_t return_address = 0x00500200;
307 Label frame1_sp; 312 Label frame1_sp;
308 stack_section 313 stack_section
309 // frame 0 314 // frame 0
310 .Append(16, 0) // space 315 .Append(16, 0) // space
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 StackFrameMIPS::CONTEXT_VALID_FP | 364 StackFrameMIPS::CONTEXT_VALID_FP |
360 StackFrameMIPS::CONTEXT_VALID_RA), 365 StackFrameMIPS::CONTEXT_VALID_RA),
361 frame1->context_validity); 366 frame1->context_validity);
362 EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc); 367 EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc);
363 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); 368 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]);
364 EXPECT_EQ("marsupial", frame1->function_name); 369 EXPECT_EQ("marsupial", frame1->function_name);
365 EXPECT_EQ(0x00500100U, frame1->function_base); 370 EXPECT_EQ(0x00500100U, frame1->function_base);
366 } 371 }
367 372
368 TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) { 373 TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) {
374 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
369 // If the stackwalker resorts to stack scanning, it will scan only 375 // If the stackwalker resorts to stack scanning, it will scan only
370 // 1024 bytes of stack which correspondes to maximum size of stack frame. 376 // 1024 bytes of stack which correspondes to maximum size of stack frame.
371 stack_section.start() = 0x80000000; 377 stack_section.start() = 0x80000000;
372 uint32_t return_address1 = 0x00500100; 378 uint32_t return_address1 = 0x00500100;
373 uint32_t return_address2 = 0x00500900; 379 uint32_t return_address2 = 0x00500900;
374 Label frame1_sp, frame2_sp; 380 Label frame1_sp, frame2_sp;
375 stack_section 381 stack_section
376 // frame 0 382 // frame 0
377 .Append(32, 0) // space 383 .Append(32, 0) // space
378 384
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 StackFrameMIPS::CONTEXT_VALID_FP | 436 StackFrameMIPS::CONTEXT_VALID_FP |
431 StackFrameMIPS::CONTEXT_VALID_RA), 437 StackFrameMIPS::CONTEXT_VALID_RA),
432 frame1->context_validity); 438 frame1->context_validity);
433 EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); 439 EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc);
434 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); 440 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]);
435 } 441 }
436 442
437 // Test that set_max_frames_scanned prevents using stack scanning 443 // Test that set_max_frames_scanned prevents using stack scanning
438 // to find caller frames. 444 // to find caller frames.
439 TEST_F(GetCallerFrame, ScanningNotAllowed) { 445 TEST_F(GetCallerFrame, ScanningNotAllowed) {
446 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
440 // When the stack walker resorts to scanning the stack, 447 // When the stack walker resorts to scanning the stack,
441 // only fixed number of frames are allowed to be scanned out from stack 448 // only fixed number of frames are allowed to be scanned out from stack
442 stack_section.start() = 0x80000000; 449 stack_section.start() = 0x80000000;
443 uint32_t return_address1 = 0x00500100; 450 uint32_t return_address1 = 0x00500100;
444 uint32_t return_address2 = 0x00500900; 451 uint32_t return_address2 = 0x00500900;
445 Label frame1_sp, frame2_sp; 452 Label frame1_sp, frame2_sp;
446 stack_section 453 stack_section
447 // frame 0 454 // frame 0
448 .Append(32, 0) // space 455 .Append(32, 0) // space
449 456
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 646
640 // The validity mask to impose on the context frame. 647 // The validity mask to impose on the context frame.
641 int context_frame_validity; 648 int context_frame_validity;
642 }; 649 };
643 650
644 class CFI: public CFIFixture, public Test { }; 651 class CFI: public CFIFixture, public Test { };
645 652
646 // TODO(gordanac): add CFI tests 653 // TODO(gordanac): add CFI tests
647 654
648 TEST_F(CFI, At4004) { 655 TEST_F(CFI, At4004) {
656 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
649 Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP]; 657 Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP];
650 stack_section 658 stack_section
651 // frame0 659 // frame0
652 .Append(24, 0) // space 660 .Append(24, 0) // space
653 .D32(frame1_sp) // stack pointer 661 .D32(frame1_sp) // stack pointer
654 .D32(0x00405510) // return address 662 .D32(0x00405510) // return address
655 .Mark(&frame1_sp); // This effectively sets stack_section.start(). 663 .Mark(&frame1_sp); // This effectively sets stack_section.start().
656 raw_context.epc = 0x00404004; 664 raw_context.epc = 0x00404004;
657 CheckWalk(); 665 CheckWalk();
658 } 666 }
659 667
660 // Check that we reject rules that would cause the stack pointer to 668 // Check that we reject rules that would cause the stack pointer to
661 // move in the wrong direction. 669 // move in the wrong direction.
662 TEST_F(CFI, RejectBackwards) { 670 TEST_F(CFI, RejectBackwards) {
671 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
663 raw_context.epc = 0x40005000; 672 raw_context.epc = 0x40005000;
664 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; 673 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000;
665 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; 674 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510;
666 675
667 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); 676 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
668 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, 677 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules,
669 &frame_symbolizer); 678 &frame_symbolizer);
670 vector<const CodeModule*> modules_without_symbols; 679 vector<const CodeModule*> modules_without_symbols;
671 vector<const CodeModule*> modules_with_corrupt_symbols; 680 vector<const CodeModule*> modules_with_corrupt_symbols;
672 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, 681 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
673 &modules_with_corrupt_symbols)); 682 &modules_with_corrupt_symbols));
674 ASSERT_EQ(0U, modules_without_symbols.size()); 683 ASSERT_EQ(0U, modules_without_symbols.size());
675 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); 684 ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
676 frames = call_stack.frames(); 685 frames = call_stack.frames();
677 ASSERT_EQ(1U, frames->size()); 686 ASSERT_EQ(1U, frames->size());
678 } 687 }
679 688
680 // Check that we reject rules whose expressions' evaluation fails. 689 // Check that we reject rules whose expressions' evaluation fails.
681 TEST_F(CFI, RejectBadExpressions) { 690 TEST_F(CFI, RejectBadExpressions) {
691 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL;
682 raw_context.epc = 0x00407000; 692 raw_context.epc = 0x00407000;
683 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; 693 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000;
684 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; 694 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510;
685 695
686 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); 696 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
687 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, 697 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules,
688 &frame_symbolizer); 698 &frame_symbolizer);
689 vector<const CodeModule*> modules_without_symbols; 699 vector<const CodeModule*> modules_without_symbols;
690 vector<const CodeModule*> modules_with_corrupt_symbols; 700 vector<const CodeModule*> modules_with_corrupt_symbols;
691 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, 701 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
692 &modules_with_corrupt_symbols)); 702 &modules_with_corrupt_symbols));
693 ASSERT_EQ(0U, modules_without_symbols.size()); 703 ASSERT_EQ(0U, modules_without_symbols.size());
694 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); 704 ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
695 frames = call_stack.frames(); 705 frames = call_stack.frames();
696 ASSERT_EQ(1U, frames->size()); 706 ASSERT_EQ(1U, frames->size());
697 } 707 }
OLDNEW
« no previous file with comments | « src/processor/stackwalker_mips64_unittest.cc ('k') | src/tools/linux/md2core/minidump-2-core.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698