hotspot/src/share/vm/ci/ciUtilities.hpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 7397 5b173b4ca846
child 18073 f02460441ddc
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 7397
diff changeset
     2
 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4571
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4571
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4571
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_CI_CIUTILITIES_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_CI_CIUTILITIES_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "ci/ciEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// The following routines and definitions are used internally in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// compiler interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// Add a ci native entry wrapper?
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// Bring the compilation thread into the VM state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
#define VM_ENTRY_MARK                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  CompilerThread* thread=CompilerThread::current(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  ThreadInVMfromNative __tiv(thread);       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  ResetNoHandleMark rnhm;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  HandleMarkCleaner __hm(thread);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  Thread* THREAD = thread;                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  debug_only(VMNativeEntryWrapper __vew;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// Bring the compilation thread into the VM state.  No handle mark.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
#define VM_QUICK_ENTRY_MARK                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  CompilerThread* thread=CompilerThread::current(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  ThreadInVMfromNative __tiv(thread);       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
/*                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
 * [TODO] The NoHandleMark line does nothing but declare a function prototype \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
 * The NoHandkeMark constructor is NOT executed. If the ()'s are   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
 * removed, causes the NoHandleMark assert to trigger. \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
 * debug_only(NoHandleMark __hm();)         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
 */                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  Thread* THREAD = thread;                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  debug_only(VMNativeEntryWrapper __vew;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
#define EXCEPTION_CONTEXT \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  CompilerThread* thread=CompilerThread::current(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  Thread* THREAD = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
#define CURRENT_ENV                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  ciEnv::current()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
// where current thread is THREAD
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
#define CURRENT_THREAD_ENV                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  ciEnv::current(thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#define IS_IN_VM                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  ciEnv::is_in_vm()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
#define ASSERT_IN_VM                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  assert(IS_IN_VM, "must be in vm state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
#define GUARDED_VM_ENTRY(action)            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  {if (IS_IN_VM) { action } else { VM_ENTRY_MARK; { action }}}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 7397
diff changeset
    83
#define GUARDED_VM_QUICK_ENTRY(action)      \
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 7397
diff changeset
    84
  {if (IS_IN_VM) { action } else { VM_QUICK_ENTRY_MARK; { action }}}
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 7397
diff changeset
    85
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
// Redefine this later.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#define KILL_COMPILE_ON_FATAL_(result)           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  THREAD);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  if (HAS_PENDING_EXCEPTION) {                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    if (PENDING_EXCEPTION->klass() ==            \
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 1
diff changeset
    91
        SystemDictionary::ThreadDeath_klass()) { \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
      /* Kill the compilation. */                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
      fatal("unhandled ci exception");           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
      return (result);                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    }                                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    CLEAR_PENDING_EXCEPTION;                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    return (result);                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  }                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  (0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#define KILL_COMPILE_ON_ANY                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  THREAD);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  if (HAS_PENDING_EXCEPTION) {                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    fatal("unhandled ci exception");             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    CLEAR_PENDING_EXCEPTION;                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  }                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
(0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
inline const char* bool_to_str(bool b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  return ((b) ? "true" : "false");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
const char* basictype_to_str(BasicType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
const char  basictype_to_char(BasicType t);
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   116
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   117
#endif // SHARE_VM_CI_CIUTILITIES_HPP