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

Side by Side Diff: src/ppc/assembler-ppc.h

Issue 2732273003: Disentangle assembler from isolate. (Closed)
Patch Set: Address feedback. Created 3 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/objects.cc ('k') | src/ppc/assembler-ppc.cc » ('j') | 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 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // for a detailed comment on the layout (globals.h). 390 // for a detailed comment on the layout (globals.h).
391 // 391 //
392 // If the provided buffer is NULL, the assembler allocates and grows its own 392 // If the provided buffer is NULL, the assembler allocates and grows its own
393 // buffer, and buffer_size determines the initial buffer size. The buffer is 393 // buffer, and buffer_size determines the initial buffer size. The buffer is
394 // owned by the assembler and deallocated upon destruction of the assembler. 394 // owned by the assembler and deallocated upon destruction of the assembler.
395 // 395 //
396 // If the provided buffer is not NULL, the assembler uses the provided buffer 396 // If the provided buffer is not NULL, the assembler uses the provided buffer
397 // for code generation and assumes its size to be buffer_size. If the buffer 397 // for code generation and assumes its size to be buffer_size. If the buffer
398 // is too small, a fatal error occurs. No deallocation of the buffer is done 398 // is too small, a fatal error occurs. No deallocation of the buffer is done
399 // upon destruction of the assembler. 399 // upon destruction of the assembler.
400 Assembler(Isolate* isolate, void* buffer, int buffer_size); 400 Assembler(Isolate* isolate, void* buffer, int buffer_size)
401 : Assembler(IsolateData(isolate), buffer, buffer_size) {}
402 Assembler(IsolateData isolate_data, void* buffer, int buffer_size);
401 virtual ~Assembler() {} 403 virtual ~Assembler() {}
402 404
403 // GetCode emits any pending (non-emitted) code and fills the descriptor 405 // GetCode emits any pending (non-emitted) code and fills the descriptor
404 // desc. GetCode() is idempotent; it returns the same result if no other 406 // desc. GetCode() is idempotent; it returns the same result if no other
405 // Assembler functions are invoked in between GetCode() calls. 407 // Assembler functions are invoked in between GetCode() calls.
406 void GetCode(CodeDesc* desc); 408 void GetCode(CodeDesc* desc);
407 409
408 // Label operations & relative jumps (PPUM Appendix D) 410 // Label operations & relative jumps (PPUM Appendix D)
409 // 411 //
410 // Takes a branch opcode (cc) and a label (L) and generates 412 // Takes a branch opcode (cc) and a label (L) and generates
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 int pc_offset, int offset, ConstantPoolEntry::Access access, 457 int pc_offset, int offset, ConstantPoolEntry::Access access,
456 ConstantPoolEntry::Type type)); 458 ConstantPoolEntry::Type type));
457 459
458 // Return the address in the constant pool of the code target address used by 460 // Return the address in the constant pool of the code target address used by
459 // the branch/call instruction at pc, or the object in a mov. 461 // the branch/call instruction at pc, or the object in a mov.
460 INLINE(static Address target_constant_pool_address_at( 462 INLINE(static Address target_constant_pool_address_at(
461 Address pc, Address constant_pool, ConstantPoolEntry::Access access, 463 Address pc, Address constant_pool, ConstantPoolEntry::Access access,
462 ConstantPoolEntry::Type type)); 464 ConstantPoolEntry::Type type));
463 465
464 // Read/Modify the code target address in the branch/call instruction at pc. 466 // Read/Modify the code target address in the branch/call instruction at pc.
467 // The isolate argument is unused (and may be nullptr) when skipping flushing.
465 INLINE(static Address target_address_at(Address pc, Address constant_pool)); 468 INLINE(static Address target_address_at(Address pc, Address constant_pool));
466 INLINE(static void set_target_address_at( 469 INLINE(static void set_target_address_at(
467 Isolate* isolate, Address pc, Address constant_pool, Address target, 470 Isolate* isolate, Address pc, Address constant_pool, Address target,
468 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED)); 471 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED));
469 INLINE(static Address target_address_at(Address pc, Code* code)); 472 INLINE(static Address target_address_at(Address pc, Code* code));
470 INLINE(static void set_target_address_at( 473 INLINE(static void set_target_address_at(
471 Isolate* isolate, Address pc, Code* code, Address target, 474 Isolate* isolate, Address pc, Code* code, Address target,
472 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED)); 475 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED));
473 476
474 // Return the code target address at a call site from the return address 477 // Return the code target address at a call site from the return address
(...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 constant_pool_entry_sharing_blocked_nesting_--; 1365 constant_pool_entry_sharing_blocked_nesting_--;
1363 } 1366 }
1364 bool is_constant_pool_entry_sharing_blocked() const { 1367 bool is_constant_pool_entry_sharing_blocked() const {
1365 return constant_pool_entry_sharing_blocked_nesting_ > 0; 1368 return constant_pool_entry_sharing_blocked_nesting_ > 0;
1366 } 1369 }
1367 1370
1368 bool has_exception() const { return internal_trampoline_exception_; } 1371 bool has_exception() const { return internal_trampoline_exception_; }
1369 1372
1370 bool is_trampoline_emitted() const { return trampoline_emitted_; } 1373 bool is_trampoline_emitted() const { return trampoline_emitted_; }
1371 1374
1372 private:
1373 // Code generation 1375 // Code generation
1374 // The relocation writer's position is at least kGap bytes below the end of 1376 // The relocation writer's position is at least kGap bytes below the end of
1375 // the generated instructions. This is so that multi-instruction sequences do 1377 // the generated instructions. This is so that multi-instruction sequences do
1376 // not have to check for overflow. The same is true for writes of large 1378 // not have to check for overflow. The same is true for writes of large
1377 // relocation info entries. 1379 // relocation info entries.
1378 static constexpr int kGap = 32; 1380 static constexpr int kGap = 32;
1379 1381
1382 RelocInfoWriter reloc_info_writer;
1383
1384 private:
1380 // Repeated checking whether the trampoline pool should be emitted is rather 1385 // Repeated checking whether the trampoline pool should be emitted is rather
1381 // expensive. By default we only check again once a number of instructions 1386 // expensive. By default we only check again once a number of instructions
1382 // has been generated. 1387 // has been generated.
1383 int next_trampoline_check_; // pc offset of next buffer check. 1388 int next_trampoline_check_; // pc offset of next buffer check.
1384 1389
1385 // Emission of the trampoline pool may be blocked in some code sequences. 1390 // Emission of the trampoline pool may be blocked in some code sequences.
1386 int trampoline_pool_blocked_nesting_; // Block emission if this is not zero. 1391 int trampoline_pool_blocked_nesting_; // Block emission if this is not zero.
1387 int no_trampoline_pool_before_; // Block emission before this pc offset. 1392 int no_trampoline_pool_before_; // Block emission before this pc offset.
1388 1393
1389 // Do not share constant pool entries. 1394 // Do not share constant pool entries.
1390 int constant_pool_entry_sharing_blocked_nesting_; 1395 int constant_pool_entry_sharing_blocked_nesting_;
1391 1396
1392 // Relocation info generation 1397 // Relocation info generation
1393 // Each relocation is encoded as a variable size value 1398 // Each relocation is encoded as a variable size value
1394 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize; 1399 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize;
1395 RelocInfoWriter reloc_info_writer;
1396 std::vector<DeferredRelocInfo> relocations_; 1400 std::vector<DeferredRelocInfo> relocations_;
1397 1401
1398 // The bound position, before this we cannot do instruction elimination. 1402 // The bound position, before this we cannot do instruction elimination.
1399 int last_bound_pos_; 1403 int last_bound_pos_;
1400 // Optimizable cmpi information. 1404 // Optimizable cmpi information.
1401 int optimizable_cmpi_pos_; 1405 int optimizable_cmpi_pos_;
1402 CRegister cmpi_cr_; 1406 CRegister cmpi_cr_;
1403 1407
1404 ConstantPoolBuilder constant_pool_builder_; 1408 ConstantPoolBuilder constant_pool_builder_;
1405 1409
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 friend class CodePatcher; 1486 friend class CodePatcher;
1483 friend class BlockTrampolinePoolScope; 1487 friend class BlockTrampolinePoolScope;
1484 friend class EnsureSpace; 1488 friend class EnsureSpace;
1485 }; 1489 };
1486 1490
1487 1491
1488 class EnsureSpace BASE_EMBEDDED { 1492 class EnsureSpace BASE_EMBEDDED {
1489 public: 1493 public:
1490 explicit EnsureSpace(Assembler* assembler) { assembler->CheckBuffer(); } 1494 explicit EnsureSpace(Assembler* assembler) { assembler->CheckBuffer(); }
1491 }; 1495 };
1496
1497 class PatchingAssembler : public Assembler {
1498 public:
1499 PatchingAssembler(IsolateData isolate_data, byte* address, int instructions);
1500 ~PatchingAssembler();
1501
1502 void FlushICache(Isolate* isolate);
1503 };
1504
1492 } // namespace internal 1505 } // namespace internal
1493 } // namespace v8 1506 } // namespace v8
1494 1507
1495 #endif // V8_PPC_ASSEMBLER_PPC_H_ 1508 #endif // V8_PPC_ASSEMBLER_PPC_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/ppc/assembler-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698