1 /*
  2  * Copyright (c) 2002, 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_JAVAFRAMEANCHOR_HPP
 26 #define SHARE_RUNTIME_JAVAFRAMEANCHOR_HPP
 27 
 28 #include "runtime/orderAccess.hpp"
 29 #include "utilities/globalDefinitions.hpp"
 30 #include "utilities/macros.hpp"
 31 
 32 //
 33 // An object for encapsulating the machine/os dependent part of a JavaThread frame state
 34 //
 35 class JavaThread;
 36 class MacroAssembler;
 37 class ProgrammableUpcallHandler;
 38 class ZeroFrame;
 39 
 40 class JavaFrameAnchor {
 41 // Too many friends...
 42 friend class CallNativeDirectNode;
 43 friend class OptoRuntime;
 44 friend class Runtime1;
 45 friend class StubAssembler;
 46 friend class CallRuntimeDirectNode;
 47 friend class MacroAssembler;
 48 friend class LIR_Assembler;
 49 friend class GraphKit;
 50 friend class StubGenerator;
 51 friend class JavaThread;
 52 friend class frame;
 53 friend class VMStructs;
 54 friend class JVMCIVMStructs;
 55 friend class BytecodeInterpreter;
 56 friend class JavaCallWrapper;
 57 friend class ProgrammableUpcallHandler;
 58 
 59  private:
 60   //
 61   // Whenever _last_Java_sp != NULL other anchor fields MUST be valid!
 62   // The stack may not be walkable [check with walkable() ] but the values must be valid.
 63   // The profiler apparently depends on this.
 64   //
 65   intptr_t* volatile _last_Java_sp;
 66 
 67   // Whenever we call from Java to native we can not be assured that the return
 68   // address that composes the last_Java_frame will be in an accessible location
 69   // so calls from Java to native store that pc (or one good enough to locate
 70   // the oopmap) in the frame anchor. Since the frames that call from Java to
 71   // native are never deoptimized we never need to patch the pc and so this
 72   // is acceptable.
 73   volatile  address _last_Java_pc;
 74 
 75   // tells whether the last Java frame is set
 76   // It is important that when last_Java_sp != NULL that the rest of the frame
 77   // anchor (including platform specific) all be valid.
 78 
 79   bool has_last_Java_frame() const                   { return _last_Java_sp != NULL; }
 80   // This is very dangerous unless sp == NULL
 81   // Invalidate the anchor so that has_last_frame is false
 82   // and no one should look at the other fields.
 83   void zap(void)                                     { _last_Java_sp = NULL; }
 84 
 85 #include CPU_HEADER(javaFrameAnchor)
 86 
 87 public:
 88   JavaFrameAnchor()                              { clear(); }
 89   JavaFrameAnchor(JavaFrameAnchor *src)          { copy(src); }
 90 
 91   void set_last_Java_pc(address pc)              { _last_Java_pc = pc; }  // FIXME
 92 
 93   // Assembly stub generation helpers
 94 
 95   static ByteSize last_Java_sp_offset()          { return byte_offset_of(JavaFrameAnchor, _last_Java_sp); }
 96   static ByteSize last_Java_pc_offset()          { return byte_offset_of(JavaFrameAnchor, _last_Java_pc); }
 97 
 98 };
 99 
100 #endif // SHARE_RUNTIME_JAVAFRAMEANCHOR_HPP