113 if (is_interpreter(request)) {
114 fp = frame_link(request);
115 }
116 request._sample_bcp = nullptr;
117 return fp;
118 }
119
120 static bool build(JfrSampleRequest& request, intptr_t* fp, JavaThread* jt);
121
122 static bool build_for_interpreter(JfrSampleRequest& request, JavaThread* jt) {
123 assert(is_interpreter(request), "invariant");
124 assert(jt != nullptr, "invariant");
125 if (!fp_in_stack(request, jt)) {
126 return false;
127 }
128 if (is_valid_interpreter_frame(request, jt)) {
129 // Set fp as sp for interpreter frames.
130 request._sample_sp = request._sample_bcp;
131 // Get real bcp.
132 void* const bcp = interpreter_frame_bcp(request);
133 // Setting bcp = 1 marks the sample request to represent a native method.
134 request._sample_bcp = bcp != nullptr ? bcp : reinterpret_cast<address>(1);
135 return true;
136 }
137 intptr_t* fp = sender_for_interpreter_frame(request, jt);
138 if (request._sample_pc == nullptr || request._sample_sp == nullptr) {
139 return false;
140 }
141 return build(request, fp, jt);
142 }
143
144 // Attempt to build a Jfr sample request.
145 static bool build(JfrSampleRequest& request, intptr_t* fp, JavaThread* jt) {
146 assert(request._sample_sp != nullptr, "invariant");
147 assert(request._sample_pc != nullptr, "invariant");
148 assert(jt != nullptr, "invariant");
149 assert(jt->thread_state() == _thread_in_Java || jt->thread_state() == _thread_in_native, "invariant");
150
151 // 1. Interpreter frame?
152 if (is_interpreter(request)) {
153 request._sample_bcp = fp;
154 return build_for_interpreter(request, jt);
|
113 if (is_interpreter(request)) {
114 fp = frame_link(request);
115 }
116 request._sample_bcp = nullptr;
117 return fp;
118 }
119
120 static bool build(JfrSampleRequest& request, intptr_t* fp, JavaThread* jt);
121
122 static bool build_for_interpreter(JfrSampleRequest& request, JavaThread* jt) {
123 assert(is_interpreter(request), "invariant");
124 assert(jt != nullptr, "invariant");
125 if (!fp_in_stack(request, jt)) {
126 return false;
127 }
128 if (is_valid_interpreter_frame(request, jt)) {
129 // Set fp as sp for interpreter frames.
130 request._sample_sp = request._sample_bcp;
131 // Get real bcp.
132 void* const bcp = interpreter_frame_bcp(request);
133 // Setting bcp == JfrSampleRequestFrameType::INTERPRETER marks the sample request to represent an interpreted native method.
134 request._sample_bcp = bcp != nullptr ? bcp : reinterpret_cast<address>(JfrSampleRequestFrameType::INTERPRETER);
135 return true;
136 }
137 intptr_t* fp = sender_for_interpreter_frame(request, jt);
138 if (request._sample_pc == nullptr || request._sample_sp == nullptr) {
139 return false;
140 }
141 return build(request, fp, jt);
142 }
143
144 // Attempt to build a Jfr sample request.
145 static bool build(JfrSampleRequest& request, intptr_t* fp, JavaThread* jt) {
146 assert(request._sample_sp != nullptr, "invariant");
147 assert(request._sample_pc != nullptr, "invariant");
148 assert(jt != nullptr, "invariant");
149 assert(jt->thread_state() == _thread_in_Java || jt->thread_state() == _thread_in_native, "invariant");
150
151 // 1. Interpreter frame?
152 if (is_interpreter(request)) {
153 request._sample_bcp = fp;
154 return build_for_interpreter(request, jt);
|