1 /* 2 * Copyright (c) 2018, 2019, 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_OOPS_METHOD_INLINE_HPP 26 #define SHARE_OOPS_METHOD_INLINE_HPP 27 28 #include "oops/method.hpp" 29 30 #include "runtime/atomic.hpp" 31 32 inline address Method::from_compiled_entry() const { 33 return Atomic::load_acquire(&_from_compiled_entry); 34 } 35 36 inline address Method::from_interpreted_entry() const { 37 return Atomic::load_acquire(&_from_interpreted_entry); 38 } 39 40 inline void Method::set_method_data(MethodData* data) { 41 // The store into method must be released. On platforms without 42 // total store order (TSO) the reference may become visible before 43 // the initialization of data otherwise. 44 Atomic::release_store(&_method_data, data); 45 } 46 47 inline CompiledMethod* volatile Method::code() const { 48 assert( check_code(), "" ); 49 return Atomic::load_acquire(&_code); 50 } 51 52 // Write (bci, line number) pair to stream 53 inline void CompressedLineNumberWriteStream::write_pair_regular(int bci_delta, int line_delta) { 54 // bci and line number does not compress into single byte. 55 // Write out escape character and use regular compression for bci and line number. 56 write_byte((jubyte)0xFF); 57 write_signed_int(bci_delta); 58 write_signed_int(line_delta); 59 } 60 61 inline void CompressedLineNumberWriteStream::write_pair_inline(int bci, int line) { 62 int bci_delta = bci - _bci; 63 int line_delta = line - _line; 64 _bci = bci; 65 _line = line; 66 // Skip (0,0) deltas - they do not add information and conflict with terminator. 67 if (bci_delta == 0 && line_delta == 0) return; 68 // Check if bci is 5-bit and line number 3-bit unsigned. 69 if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) { 70 // Compress into single byte. 71 jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta; 72 // Check that value doesn't match escape character. 73 if (value != 0xFF) { 74 write_byte(value); 75 return; 76 } 77 } 78 write_pair_regular(bci_delta, line_delta); 79 } 80 81 inline void CompressedLineNumberWriteStream::write_pair(int bci, int line) { 82 write_pair_inline(bci, line); 83 } 84 85 inline bool Method::has_compiled_code() const { return code() != NULL; } 86 87 inline bool Method::is_empty_method() const { 88 return code_size() == 1 89 && *code_base() == Bytecodes::_return; 90 } 91 92 #endif // SHARE_OOPS_METHOD_INLINE_HPP