src/hotspot/share/gc/shared/c1/barrierSetC1.hpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58273 08a5148e7c4e
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49906
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     1
/*
53529
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
49906
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     4
 *
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     8
 *
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    13
 * accompanied this code).
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    14
 *
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    18
 *
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    21
 * questions.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    22
 *
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    23
 */
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    24
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    25
#ifndef SHARE_GC_SHARED_C1_BARRIERSETC1_HPP
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    26
#define SHARE_GC_SHARED_C1_BARRIERSETC1_HPP
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    27
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    28
#include "c1/c1_Decorators.hpp"
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    29
#include "c1/c1_LIRGenerator.hpp"
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    30
#include "c1/c1_Instruction.hpp"
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    31
#include "c1/c1_LIR.hpp"
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    32
#include "memory/allocation.hpp"
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    33
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    34
class LIRGenerator;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    35
class LIRItem;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    36
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    37
// The LIRAddressOpr comprises either a LIRItem or a LIR_Opr to describe elements
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    38
// of an access in the C1 Access API. Both of them allow asking for the opr() which
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    39
// will correspond to either _item.result() or _opr if there is no _item.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    40
class LIRAddressOpr: public StackObj {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    41
  LIRItem* _item;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    42
  LIR_Opr  _opr;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    43
public:
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    44
  LIRAddressOpr(LIRItem& item) : _item(&item), _opr(NULL) {}
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    45
  LIRAddressOpr(LIR_Opr opr) : _item(NULL), _opr(opr) {}
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    46
  LIRAddressOpr(const LIRAddressOpr& other) : _item(other._item), _opr(other._opr) {}
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    47
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    48
  LIRItem& item() const {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    49
    assert(_item != NULL, "sanity");
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    50
    return *_item;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    51
  }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    52
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    53
  LIR_Opr opr() const {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    54
    if (_item == NULL) {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    55
      return _opr;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    56
    } else {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    57
      return _item->result();
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    58
    }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    59
  }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    60
};
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    61
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    62
// The LIRAccess class wraps shared context parameters required for performing
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    63
// the right access in C1. This includes the address of the offset and the decorators.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    64
class LIRAccess: public StackObj {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    65
  LIRGenerator* _gen;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    66
  DecoratorSet  _decorators;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    67
  LIRAddressOpr _base;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    68
  LIRAddressOpr _offset;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    69
  BasicType     _type;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    70
  LIR_Opr       _resolved_addr;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    71
  CodeEmitInfo* _patch_emit_info;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    72
  CodeEmitInfo* _access_emit_info;
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    73
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    74
public:
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    75
  LIRAccess(LIRGenerator* gen, DecoratorSet decorators,
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    76
            LIRAddressOpr base, LIRAddressOpr offset, BasicType type,
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    77
            CodeEmitInfo* patch_emit_info = NULL, CodeEmitInfo* access_emit_info = NULL) :
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    78
    _gen(gen),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    79
    _decorators(AccessInternal::decorator_fixup(decorators)),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    80
    _base(base),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    81
    _offset(offset),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    82
    _type(type),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    83
    _resolved_addr(NULL),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    84
    _patch_emit_info(patch_emit_info),
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    85
    _access_emit_info(access_emit_info) {}
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    86
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    87
  void load_base()   { _base.item().load_item(); }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    88
  void load_offset() { _offset.item().load_nonconstant(); }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    89
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    90
  void load_address() {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    91
    load_base();
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    92
    load_offset();
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    93
  }
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
    94
53529
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
    95
  LIRGenerator* gen() const              { return _gen; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
    96
  CodeEmitInfo*& patch_emit_info()       { return _patch_emit_info; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
    97
  CodeEmitInfo*& access_emit_info()      { return _access_emit_info; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
    98
  LIRAddressOpr& base()                  { return _base; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
    99
  LIRAddressOpr& offset()                { return _offset; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   100
  BasicType type() const                 { return _type; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   101
  LIR_Opr resolved_addr() const          { return _resolved_addr; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   102
  void set_resolved_addr(LIR_Opr addr)   { _resolved_addr = addr; }
58273
08a5148e7c4e 8230505: Replace JVM type comparisons to T_OBJECT and T_ARRAY with call to is_reference_type
lfoltan
parents: 55590
diff changeset
   103
  bool is_oop() const                    { return is_reference_type(_type); }
53529
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   104
  DecoratorSet decorators() const        { return _decorators; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   105
  void clear_decorators(DecoratorSet ds) { _decorators &= ~ds; }
37c8fcc76699 8217717: ZGC: Broken oop map in C1 load barrier stub
pliden
parents: 51487
diff changeset
   106
  bool is_raw() const                    { return (_decorators & AS_RAW) != 0; }
49906
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   107
};
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   108
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   109
// The BarrierSetC1 class is the main entry point for the GC backend of the Access API in C1.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   110
// It is called by the LIRGenerator::access_* functions, which is the main entry poing for
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   111
// access calls in C1.
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   112
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   113
class BarrierSetC1: public CHeapObj<mtGC> {
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   114
protected:
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   115
  virtual LIR_Opr resolve_address(LIRAccess& access, bool resolve_in_register);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   116
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   117
  virtual void generate_referent_check(LIRAccess& access, LabelObj* cont);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   118
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   119
  // Accesses with resolved address
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   120
  virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   121
  virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   122
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   123
  virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   124
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   125
  virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   126
  virtual LIR_Opr atomic_add_at_resolved(LIRAccess& access, LIRItem& value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   127
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   128
public:
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   129
  virtual void store_at(LIRAccess& access, LIR_Opr value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   130
  virtual void load_at(LIRAccess& access, LIR_Opr result);
51408
59269a19f108 8208582: Introduce native oop barriers in C1 for OopHandle
eosterlund
parents: 49906
diff changeset
   131
  virtual void load(LIRAccess& access, LIR_Opr result);
49906
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   132
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   133
  virtual LIR_Opr atomic_cmpxchg_at(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   134
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   135
  virtual LIR_Opr atomic_xchg_at(LIRAccess& access, LIRItem& value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   136
  virtual LIR_Opr atomic_add_at(LIRAccess& access, LIRItem& value);
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   137
51487
f791e6fb8040 8209667: Explicit barriers for C1/LIR
rkennke
parents: 51408
diff changeset
   138
  virtual LIR_Opr resolve(LIRGenerator* gen, DecoratorSet decorators, LIR_Opr obj);
f791e6fb8040 8209667: Explicit barriers for C1/LIR
rkennke
parents: 51408
diff changeset
   139
55590
05dac93510c0 8226822: GC interface for C1 runtime calls
rkennke
parents: 53529
diff changeset
   140
  virtual const char* rtcall_name_for_address(address entry) { return NULL; }
05dac93510c0 8226822: GC interface for C1 runtime calls
rkennke
parents: 53529
diff changeset
   141
49906
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   142
  virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob) {}
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   143
};
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   144
4bb58f644e4e 8201543: Modularize C1 GC barriers
eosterlund
parents:
diff changeset
   145
#endif // SHARE_GC_SHARED_C1_BARRIERSETC1_HPP