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   // Assembly stub generation helpers
92 
93   static ByteSize last_Java_sp_offset()          { return byte_offset_of(JavaFrameAnchor, _last_Java_sp); }
94   static ByteSize last_Java_pc_offset()          { return byte_offset_of(JavaFrameAnchor, _last_Java_pc); }
95 
96 };
97 
98 #endif // SHARE_RUNTIME_JAVAFRAMEANCHOR_HPP