1 /*
  2  * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_RUNTIME_VFRAME_HP_HPP
 26 #define SHARE_RUNTIME_VFRAME_HP_HPP
 27 
 28 #include "runtime/vframe.hpp"
 29 
 30 class compiledVFrame: public javaVFrame {
 31 
 32   friend class EscapeBarrier;
 33 
 34  public:
 35   // JVM state
 36   Method*                      method()             const;
 37   int                          bci()                const;
 38   bool                         should_reexecute()   const;
 39   StackValueCollection*        locals()             const;
 40   StackValueCollection*        expressions()        const;
 41   GrowableArray<MonitorInfo*>* monitors()           const;
 42   int                          vframe_id()          const { return _vframe_id; }
 43   bool                         has_ea_local_in_scope() const;
 44   bool                         arg_escape()         const; // at call with arg escape in parameter list
 45 
 46   void set_locals(StackValueCollection* values) const;
 47 
 48   // Virtuals defined in vframe
 49   bool is_compiled_frame() const { return true; }
 50   vframe* sender() const;
 51   bool is_top() const;
 52 
 53   // Casting
 54   static compiledVFrame* cast(vframe* vf) {
 55     assert(vf == NULL || vf->is_compiled_frame(), "must be compiled frame");
 56     return (compiledVFrame*) vf;
 57   }
 58 
 59   void update_deferred_value(BasicType type, int index, jvalue value);
 60 
 61   // After object deoptimization, that is object reallocation and relocking, we
 62   // create deferred updates for all objects in scope. No new update will be
 63   // created if a deferred update already exists.
 64   void create_deferred_updates_after_object_deoptimization();
 65 
 66  public:
 67   // Constructors
 68   compiledVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread, CompiledMethod* nm);
 69 
 70   // Update a local in a compiled frame. Update happens when deopt occurs
 71   void update_local(BasicType type, int index, jvalue value);
 72 
 73   // Update an expression stack value in a compiled frame. Update happens when deopt occurs
 74   void update_stack(BasicType type, int index, jvalue value);
 75 
 76   // Update a lock value in a compiled frame. Update happens when deopt occurs
 77   void update_monitor(int index, MonitorInfo* value);
 78 
 79   // Returns the active nmethod
 80   CompiledMethod*  code() const;
 81 
 82   // Returns the scopeDesc
 83   ScopeDesc* scope() const { return _scope; }
 84 
 85   // Return the compiledVFrame for the desired scope
 86   compiledVFrame* at_scope(int decode_offset, int vframe_id);
 87 
 88   // Returns SynchronizationEntryBCI or bci() (used for synchronization)
 89   int raw_bci() const;
 90 
 91  protected:
 92   ScopeDesc* _scope;
 93   int _vframe_id;
 94 
 95   //StackValue resolve(ScopeValue* sv) const;
 96   StackValue *create_stack_value(ScopeValue *sv) const;
 97 
 98  private:
 99   compiledVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread, ScopeDesc* scope, int vframe_id);
100 
101 #ifndef PRODUCT
102  public:
103   void verify() const;
104 #endif
105 };
106 
107 #endif // SHARE_RUNTIME_VFRAME_HP_HPP