src/cpu/sparc/vm/register_definitions_sparc.cpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

     1 /*
     2  * Copyright (c) 2002, 2010, 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  */
    25 // make sure the defines don't screw up the declarations later on in this file
    26 #define DONT_USE_REGISTER_DEFINES
    28 #include "precompiled.hpp"
    29 #include "asm/assembler.hpp"
    30 #include "asm/register.hpp"
    31 #include "interp_masm_sparc.hpp"
    32 #include "register_sparc.hpp"
    34 REGISTER_DEFINITION(Register, noreg);
    36 REGISTER_DEFINITION(Register, G0);
    37 REGISTER_DEFINITION(Register, G1);
    38 REGISTER_DEFINITION(Register, G2);
    39 REGISTER_DEFINITION(Register, G3);
    40 REGISTER_DEFINITION(Register, G4);
    41 REGISTER_DEFINITION(Register, G5);
    42 REGISTER_DEFINITION(Register, G6);
    43 REGISTER_DEFINITION(Register, G7);
    45 REGISTER_DEFINITION(Register, O0);
    46 REGISTER_DEFINITION(Register, O1);
    47 REGISTER_DEFINITION(Register, O2);
    48 REGISTER_DEFINITION(Register, O3);
    49 REGISTER_DEFINITION(Register, O4);
    50 REGISTER_DEFINITION(Register, O5);
    51 REGISTER_DEFINITION(Register, O6);
    52 REGISTER_DEFINITION(Register, O7);
    54 REGISTER_DEFINITION(Register, L0);
    55 REGISTER_DEFINITION(Register, L1);
    56 REGISTER_DEFINITION(Register, L2);
    57 REGISTER_DEFINITION(Register, L3);
    58 REGISTER_DEFINITION(Register, L4);
    59 REGISTER_DEFINITION(Register, L5);
    60 REGISTER_DEFINITION(Register, L6);
    61 REGISTER_DEFINITION(Register, L7);
    63 REGISTER_DEFINITION(Register, I0);
    64 REGISTER_DEFINITION(Register, I1);
    65 REGISTER_DEFINITION(Register, I2);
    66 REGISTER_DEFINITION(Register, I3);
    67 REGISTER_DEFINITION(Register, I4);
    68 REGISTER_DEFINITION(Register, I5);
    69 REGISTER_DEFINITION(Register, I6);
    70 REGISTER_DEFINITION(Register, I7);
    72 REGISTER_DEFINITION(Register, FP);
    73 REGISTER_DEFINITION(Register, SP);
    75 REGISTER_DEFINITION(FloatRegister, fnoreg);
    76 REGISTER_DEFINITION(FloatRegister, F0);
    77 REGISTER_DEFINITION(FloatRegister, F1);
    78 REGISTER_DEFINITION(FloatRegister, F2);
    79 REGISTER_DEFINITION(FloatRegister, F3);
    80 REGISTER_DEFINITION(FloatRegister, F4);
    81 REGISTER_DEFINITION(FloatRegister, F5);
    82 REGISTER_DEFINITION(FloatRegister, F6);
    83 REGISTER_DEFINITION(FloatRegister, F7);
    84 REGISTER_DEFINITION(FloatRegister, F8);
    85 REGISTER_DEFINITION(FloatRegister, F9);
    86 REGISTER_DEFINITION(FloatRegister, F10);
    87 REGISTER_DEFINITION(FloatRegister, F11);
    88 REGISTER_DEFINITION(FloatRegister, F12);
    89 REGISTER_DEFINITION(FloatRegister, F13);
    90 REGISTER_DEFINITION(FloatRegister, F14);
    91 REGISTER_DEFINITION(FloatRegister, F15);
    92 REGISTER_DEFINITION(FloatRegister, F16);
    93 REGISTER_DEFINITION(FloatRegister, F17);
    94 REGISTER_DEFINITION(FloatRegister, F18);
    95 REGISTER_DEFINITION(FloatRegister, F19);
    96 REGISTER_DEFINITION(FloatRegister, F20);
    97 REGISTER_DEFINITION(FloatRegister, F21);
    98 REGISTER_DEFINITION(FloatRegister, F22);
    99 REGISTER_DEFINITION(FloatRegister, F23);
   100 REGISTER_DEFINITION(FloatRegister, F24);
   101 REGISTER_DEFINITION(FloatRegister, F25);
   102 REGISTER_DEFINITION(FloatRegister, F26);
   103 REGISTER_DEFINITION(FloatRegister, F27);
   104 REGISTER_DEFINITION(FloatRegister, F28);
   105 REGISTER_DEFINITION(FloatRegister, F29);
   106 REGISTER_DEFINITION(FloatRegister, F30);
   107 REGISTER_DEFINITION(FloatRegister, F31);
   108 REGISTER_DEFINITION(FloatRegister, F32);
   109 REGISTER_DEFINITION(FloatRegister, F34);
   110 REGISTER_DEFINITION(FloatRegister, F36);
   111 REGISTER_DEFINITION(FloatRegister, F38);
   112 REGISTER_DEFINITION(FloatRegister, F40);
   113 REGISTER_DEFINITION(FloatRegister, F42);
   114 REGISTER_DEFINITION(FloatRegister, F44);
   115 REGISTER_DEFINITION(FloatRegister, F46);
   116 REGISTER_DEFINITION(FloatRegister, F48);
   117 REGISTER_DEFINITION(FloatRegister, F50);
   118 REGISTER_DEFINITION(FloatRegister, F52);
   119 REGISTER_DEFINITION(FloatRegister, F54);
   120 REGISTER_DEFINITION(FloatRegister, F56);
   121 REGISTER_DEFINITION(FloatRegister, F58);
   122 REGISTER_DEFINITION(FloatRegister, F60);
   123 REGISTER_DEFINITION(FloatRegister, F62);
   126 REGISTER_DEFINITION(     Register, Otos_i);
   127 REGISTER_DEFINITION(     Register, Otos_l);
   128 REGISTER_DEFINITION(     Register, Otos_l1);
   129 REGISTER_DEFINITION(     Register, Otos_l2);
   130 REGISTER_DEFINITION(FloatRegister, Ftos_f);
   131 REGISTER_DEFINITION(FloatRegister, Ftos_d);
   132 REGISTER_DEFINITION(FloatRegister, Ftos_d1);
   133 REGISTER_DEFINITION(FloatRegister, Ftos_d2);
   136 REGISTER_DEFINITION(Register, G2_thread);
   137 REGISTER_DEFINITION(Register, G6_heapbase);
   138 REGISTER_DEFINITION(Register, G5_method);
   139 REGISTER_DEFINITION(Register, G5_megamorphic_method);
   140 REGISTER_DEFINITION(Register, G5_inline_cache_reg);
   141 REGISTER_DEFINITION(Register, Gargs);
   142 REGISTER_DEFINITION(Register, L7_thread_cache);
   143 REGISTER_DEFINITION(Register, Gframe_size);
   144 REGISTER_DEFINITION(Register, G1_scratch);
   145 REGISTER_DEFINITION(Register, G3_scratch);
   146 REGISTER_DEFINITION(Register, G4_scratch);
   147 REGISTER_DEFINITION(Register, Gtemp);
   148 REGISTER_DEFINITION(Register, Lentry_args);
   150 // JSR 292
   151 REGISTER_DEFINITION(Register, G5_method_type);
   152 REGISTER_DEFINITION(Register, G3_method_handle);
   153 REGISTER_DEFINITION(Register, L7_mh_SP_save);
   155 #ifdef CC_INTERP
   156 REGISTER_DEFINITION(Register, Lstate);
   157 REGISTER_DEFINITION(Register, L1_scratch);
   158 REGISTER_DEFINITION(Register, Lmirror);
   159 REGISTER_DEFINITION(Register, L2_scratch);
   160 REGISTER_DEFINITION(Register, L3_scratch);
   161 REGISTER_DEFINITION(Register, L4_scratch);
   162 REGISTER_DEFINITION(Register, Lscratch);
   163 REGISTER_DEFINITION(Register, Lscratch2);
   164 REGISTER_DEFINITION(Register, L7_scratch);
   165 REGISTER_DEFINITION(Register, I5_savedSP);
   166 #else // CC_INTERP
   167 REGISTER_DEFINITION(Register, Lesp);
   168 REGISTER_DEFINITION(Register, Lbcp);
   169 REGISTER_DEFINITION(Register, Lmonitors);
   170 REGISTER_DEFINITION(Register, Lbyte_code);
   171 REGISTER_DEFINITION(Register, Llast_SP);
   172 REGISTER_DEFINITION(Register, Lscratch);
   173 REGISTER_DEFINITION(Register, Lscratch2);
   174 REGISTER_DEFINITION(Register, LcpoolCache);
   175 REGISTER_DEFINITION(Register, I5_savedSP);
   176 REGISTER_DEFINITION(Register, O5_savedSP);
   177 REGISTER_DEFINITION(Register, IdispatchAddress);
   178 REGISTER_DEFINITION(Register, ImethodDataPtr);
   179 REGISTER_DEFINITION(Register, IdispatchTables);
   180 #endif // CC_INTERP
   181 REGISTER_DEFINITION(Register, Lmethod);
   182 REGISTER_DEFINITION(Register, Llocals);
   183 REGISTER_DEFINITION(Register, Oexception);
   184 REGISTER_DEFINITION(Register, Oissuing_pc);

mercurial