compilationPolicy.hpp revision 1472:c18cbe5936b8
1/*
2 * Copyright (c) 2000, 2006, 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// The CompilationPolicy selects which method (if any) should be compiled.
26// It also decides which methods must always be compiled (i.e., are never
27// interpreted).
28
29class CompilationPolicy : public CHeapObj {
30 private:
31  static CompilationPolicy* _policy;
32  // Accumulated time
33  static elapsedTimer       _accumulated_time;
34
35  static bool               _in_vm_startup;
36
37 public:
38  virtual void method_invocation_event(methodHandle m, TRAPS) = 0;
39  virtual void method_back_branch_event(methodHandle m, int branch_bci, int loop_top_bci, TRAPS) = 0;
40  virtual int compilation_level(methodHandle m, int branch_bci) = 0;
41
42  void reset_counter_for_invocation_event(methodHandle method);
43  void reset_counter_for_back_branch_event(methodHandle method);
44
45  static  void set_in_vm_startup(bool in_vm_startup) { _in_vm_startup = in_vm_startup; }
46  static  void completed_vm_startup();
47  static  bool delayCompilationDuringStartup() { return _in_vm_startup; }
48
49  static bool mustBeCompiled(methodHandle m);      // m must be compiled before executing it
50  static bool canBeCompiled(methodHandle m);       // m is allowed to be compiled
51
52  static void set_policy(CompilationPolicy* policy) { _policy = policy; }
53  static CompilationPolicy* policy() { return _policy; }
54
55  // Profiling
56  elapsedTimer* accumulated_time() { return &_accumulated_time; }
57  void print_time() PRODUCT_RETURN;
58};
59
60class SimpleCompPolicy : public CompilationPolicy {
61 public:
62  void method_invocation_event( methodHandle m, TRAPS);
63  void method_back_branch_event(methodHandle m, int branch_bci, int loop_top_bci, TRAPS);
64  int compilation_level(methodHandle m, int branch_bci);
65};
66
67// StackWalkCompPolicy - existing C2 policy
68
69#ifdef COMPILER2
70class StackWalkCompPolicy : public CompilationPolicy {
71 public:
72  void method_invocation_event(methodHandle m, TRAPS);
73  void method_back_branch_event(methodHandle m, int branch_bci, int loop_top_bci, TRAPS);
74  int compilation_level(methodHandle m, int branch_bci);
75
76 private:
77  RFrame* findTopInlinableFrame(GrowableArray<RFrame*>* stack);
78  RFrame* senderOf(RFrame* rf, GrowableArray<RFrame*>* stack);
79
80  // the following variables hold values computed by the last inlining decision
81  // they are used for performance debugging only (print better messages)
82  static const char* _msg;            // reason for not inlining
83
84  static const char* shouldInline   (methodHandle callee, float frequency, int cnt);
85  // positive filter: should send be inlined?  returns NULL (--> yes) or rejection msg
86  static const char* shouldNotInline(methodHandle callee);
87  // negative filter: should send NOT be inlined?  returns NULL (--> inline) or rejection msg
88
89};
90#endif
91