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

Side by Side Diff: src/assembler.cc

Issue 1011613003: Fix RelocInfo::Mode enum wrt LAST_STANDARD_NONCOMPACT_ENUM. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comment Created 5 years, 9 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
« no previous file with comments | « src/assembler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems 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 notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 // 00 [6 bits pc delta] 285 // 00 [6 bits pc delta]
286 // or 286 // or
287 // pc-jump (variable length): 287 // pc-jump (variable length):
288 // 01 1111 11, 288 // 01 1111 11,
289 // [7 bits data] 0 289 // [7 bits data] 0
290 // ... 290 // ...
291 // [7 bits data] 1 291 // [7 bits data] 1
292 // (Bits 6..31 of pc delta, with leading zeroes 292 // (Bits 6..31 of pc delta, with leading zeroes
293 // dropped, and last non-zero chunk tagged with 1.) 293 // dropped, and last non-zero chunk tagged with 1.)
294 294
295
296 #ifdef DEBUG
297 const int kMaxStandardNonCompactModes = 14;
298 #endif
299
300 const int kTagBits = 2; 295 const int kTagBits = 2;
301 const int kTagMask = (1 << kTagBits) - 1; 296 const int kTagMask = (1 << kTagBits) - 1;
302 const int kExtraTagBits = 4; 297 const int kExtraTagBits = 4;
303 const int kLocatableTypeTagBits = 2; 298 const int kLocatableTypeTagBits = 2;
304 const int kSmallDataBits = kBitsPerByte - kLocatableTypeTagBits; 299 const int kSmallDataBits = kBitsPerByte - kLocatableTypeTagBits;
305 300
306 const int kEmbeddedObjectTag = 0; 301 const int kEmbeddedObjectTag = 0;
307 const int kCodeTargetTag = 1; 302 const int kCodeTargetTag = 1;
308 const int kLocatableTag = 2; 303 const int kLocatableTag = 2;
309 const int kDefaultTag = 3; 304 const int kDefaultTag = 3;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 void RelocInfoWriter::Write(const RelocInfo* rinfo) { 440 void RelocInfoWriter::Write(const RelocInfo* rinfo) {
446 RelocInfo::Mode rmode = rinfo->rmode(); 441 RelocInfo::Mode rmode = rinfo->rmode();
447 if (rmode != RelocInfo::POSITION) { 442 if (rmode != RelocInfo::POSITION) {
448 FlushPosition(); 443 FlushPosition();
449 } 444 }
450 #ifdef DEBUG 445 #ifdef DEBUG
451 byte* begin_pos = pos_; 446 byte* begin_pos = pos_;
452 #endif 447 #endif
453 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES); 448 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES);
454 DCHECK(rinfo->pc() - last_pc_ >= 0); 449 DCHECK(rinfo->pc() - last_pc_ >= 0);
455 DCHECK(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM - RelocInfo::LAST_COMPACT_ENUM
456 <= kMaxStandardNonCompactModes);
457 // Use unsigned delta-encoding for pc. 450 // Use unsigned delta-encoding for pc.
458 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_); 451 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_);
459 452
460 // The two most common modes are given small tags, and usually fit in a byte. 453 // The two most common modes are given small tags, and usually fit in a byte.
461 if (rmode == RelocInfo::EMBEDDED_OBJECT) { 454 if (rmode == RelocInfo::EMBEDDED_OBJECT) {
462 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); 455 WriteTaggedPC(pc_delta, kEmbeddedObjectTag);
463 } else if (rmode == RelocInfo::CODE_TARGET) { 456 } else if (rmode == RelocInfo::CODE_TARGET) {
464 WriteTaggedPC(pc_delta, kCodeTargetTag); 457 WriteTaggedPC(pc_delta, kCodeTargetTag);
465 DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize); 458 DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize);
466 } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 459 } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); 497 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
505 WriteExtraTaggedData(rinfo->data(), kCommentTag); 498 WriteExtraTaggedData(rinfo->data(), kCommentTag);
506 DCHECK(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize); 499 DCHECK(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize);
507 } else if (RelocInfo::IsConstPool(rmode) || RelocInfo::IsVeneerPool(rmode)) { 500 } else if (RelocInfo::IsConstPool(rmode) || RelocInfo::IsVeneerPool(rmode)) {
508 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); 501 WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
509 WriteExtraTaggedPoolData(static_cast<int>(rinfo->data()), 502 WriteExtraTaggedPoolData(static_cast<int>(rinfo->data()),
510 RelocInfo::IsConstPool(rmode) ? kConstPoolTag 503 RelocInfo::IsConstPool(rmode) ? kConstPoolTag
511 : kVeneerPoolTag); 504 : kVeneerPoolTag);
512 } else { 505 } else {
513 DCHECK(rmode > RelocInfo::LAST_COMPACT_ENUM); 506 DCHECK(rmode > RelocInfo::LAST_COMPACT_ENUM);
507 DCHECK(rmode <= RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM);
508 STATIC_ASSERT(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM -
509 RelocInfo::LAST_COMPACT_ENUM <=
510 kPoolExtraTag);
514 int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM - 1; 511 int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM - 1;
515 // For all other modes we simply use the mode as the extra tag. 512 // For all other modes we simply use the mode as the extra tag.
516 // None of these modes need a data component. 513 // None of these modes need a data component.
517 DCHECK(saved_mode < kPoolExtraTag); 514 DCHECK(0 <= saved_mode && saved_mode < kPoolExtraTag);
518 WriteExtraTaggedPC(pc_delta, saved_mode); 515 WriteExtraTaggedPC(pc_delta, saved_mode);
519 } 516 }
520 last_pc_ = rinfo->pc(); 517 last_pc_ = rinfo->pc();
521 last_mode_ = rmode; 518 last_mode_ = rmode;
522 #ifdef DEBUG 519 #ifdef DEBUG
523 DCHECK(begin_pos - pos_ <= kMaxSize); 520 DCHECK(begin_pos - pos_ <= kMaxSize);
524 #endif 521 #endif
525 } 522 }
526 523
527 524
(...skipping 1146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 RecordRelocInfo(RelocInfo::JS_RETURN); 1671 RecordRelocInfo(RelocInfo::JS_RETURN);
1675 } 1672 }
1676 1673
1677 1674
1678 void Assembler::RecordDebugBreakSlot() { 1675 void Assembler::RecordDebugBreakSlot() {
1679 positions_recorder()->WriteRecordedPositions(); 1676 positions_recorder()->WriteRecordedPositions();
1680 EnsureSpace ensure_space(this); 1677 EnsureSpace ensure_space(this);
1681 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 1678 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT);
1682 } 1679 }
1683 } } // namespace v8::internal 1680 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/assembler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698