LCOV - code coverage report
Current view: top level - js/src/jit - StupidAllocator.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 10 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
       2             :  * vim: set ts=8 sts=4 et sw=4 tw=99:
       3             :  * This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : 
       7             : #ifndef jit_StupidAllocator_h
       8             : #define jit_StupidAllocator_h
       9             : 
      10             : #include "jit/RegisterAllocator.h"
      11             : 
      12             : // Simple register allocator that only carries registers within basic blocks.
      13             : 
      14             : namespace js {
      15             : namespace jit {
      16             : 
      17           0 : class StupidAllocator : public RegisterAllocator
      18             : {
      19             :     static const uint32_t MAX_REGISTERS = AnyRegister::Total;
      20             :     static const uint32_t MISSING_ALLOCATION = UINT32_MAX;
      21             : 
      22           0 :     struct AllocatedRegister {
      23             :         AnyRegister reg;
      24             : 
      25             :         // The type of the value in the register.
      26             :         LDefinition::Type type;
      27             : 
      28             :         // Virtual register this physical reg backs, or MISSING_ALLOCATION.
      29             :         uint32_t vreg;
      30             : 
      31             :         // id of the instruction which most recently used this register.
      32             :         uint32_t age;
      33             : 
      34             :         // Whether the physical register is not synced with the backing stack slot.
      35             :         bool dirty;
      36             : 
      37           0 :         void set(uint32_t vreg, LInstruction* ins = nullptr, bool dirty = false) {
      38           0 :             this->vreg = vreg;
      39           0 :             this->age = ins ? ins->id() : 0;
      40           0 :             this->dirty = dirty;
      41           0 :         }
      42             :     };
      43             : 
      44             :     // Active allocation for the current code position.
      45             :     mozilla::Array<AllocatedRegister, MAX_REGISTERS> registers;
      46             :     uint32_t registerCount;
      47             : 
      48             :     // Type indicating an index into registers.
      49             :     typedef uint32_t RegisterIndex;
      50             : 
      51             :     // Information about each virtual register.
      52             :     Vector<LDefinition*, 0, SystemAllocPolicy> virtualRegisters;
      53             : 
      54             :   public:
      55           0 :     StupidAllocator(MIRGenerator* mir, LIRGenerator* lir, LIRGraph& graph)
      56           0 :       : RegisterAllocator(mir, lir, graph)
      57             :     {
      58           0 :     }
      59             : 
      60             :     MOZ_MUST_USE bool go();
      61             : 
      62             :   private:
      63             :     MOZ_MUST_USE bool init();
      64             : 
      65             :     void syncForBlockEnd(LBlock* block, LInstruction* ins);
      66             :     void allocateForInstruction(LInstruction* ins);
      67             :     void allocateForDefinition(LInstruction* ins, LDefinition* def);
      68             : 
      69             :     LAllocation* stackLocation(uint32_t vreg);
      70             : 
      71             :     RegisterIndex registerIndex(AnyRegister reg);
      72             : 
      73             :     AnyRegister ensureHasRegister(LInstruction* ins, uint32_t vreg);
      74             :     RegisterIndex allocateRegister(LInstruction* ins, uint32_t vreg);
      75             : 
      76             :     void syncRegister(LInstruction* ins, RegisterIndex index);
      77             :     void evictRegister(LInstruction* ins, RegisterIndex index);
      78             :     void evictAliasedRegister(LInstruction* ins, RegisterIndex index);
      79             :     void loadRegister(LInstruction* ins, uint32_t vreg, RegisterIndex index, LDefinition::Type type);
      80             : 
      81             :     RegisterIndex findExistingRegister(uint32_t vreg);
      82             : 
      83             :     bool allocationRequiresRegister(const LAllocation* alloc, AnyRegister reg);
      84             :     bool registerIsReserved(LInstruction* ins, AnyRegister reg);
      85             : };
      86             : 
      87             : } // namespace jit
      88             : } // namespace js
      89             : 
      90             : #endif /* jit_StupidAllocator_h */

Generated by: LCOV version 1.13