compiler_options.h revision 754ddad084ccb610d0cf486f6131bdc69bae5bc6
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
18#define ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
19
20namespace art {
21
22class CompilerOptions {
23 public:
24  enum CompilerFilter {
25    kVerifyNone,          // Skip verification and compile nothing except JNI stubs.
26    kInterpretOnly,       // Compile nothing except JNI stubs.
27    kProfiled,            // Compile based on profile.
28    kSpace,               // Maximize space savings.
29    kBalanced,            // Try to get the best performance return on compilation investment.
30    kSpeed,               // Maximize runtime performance.
31    kEverything           // Force compilation (Note: excludes compilaton of class initializers).
32  };
33
34  // Guide heuristics to determine whether to compile method if profile data not available.
35#if ART_SMALL_MODE
36  static const CompilerFilter kDefaultCompilerFilter = kProfiled;
37#else
38  static const CompilerFilter kDefaultCompilerFilter = kSpeed;
39#endif
40  static const size_t kDefaultHugeMethodThreshold = 10000;
41  static const size_t kDefaultLargeMethodThreshold = 600;
42  static const size_t kDefaultSmallMethodThreshold = 60;
43  static const size_t kDefaultTinyMethodThreshold = 20;
44  static const size_t kDefaultNumDexMethodsThreshold = 900;
45
46  CompilerOptions() :
47    compiler_filter_(kDefaultCompilerFilter),
48    huge_method_threshold_(kDefaultHugeMethodThreshold),
49    large_method_threshold_(kDefaultLargeMethodThreshold),
50    small_method_threshold_(kDefaultSmallMethodThreshold),
51    tiny_method_threshold_(kDefaultTinyMethodThreshold),
52    num_dex_methods_threshold_(kDefaultNumDexMethodsThreshold),
53    generate_gdb_information_(false),
54    generate_helper_trampolines_(false)
55#ifdef ART_SEA_IR_MODE
56    , sea_ir_mode_(false)
57#endif
58    {}
59
60  CompilerOptions(CompilerFilter compiler_filter,
61                  size_t huge_method_threshold,
62                  size_t large_method_threshold,
63                  size_t small_method_threshold,
64                  size_t tiny_method_threshold,
65                  size_t num_dex_methods_threshold,
66                  bool generate_gdb_information,
67                  bool generate_helper_trampolines
68#ifdef ART_SEA_IR_MODE
69                  , bool sea_ir_mode
70#endif
71                  ) :  // NOLINT(whitespace/parens)
72    compiler_filter_(compiler_filter),
73    huge_method_threshold_(huge_method_threshold),
74    large_method_threshold_(large_method_threshold),
75    small_method_threshold_(small_method_threshold),
76    tiny_method_threshold_(tiny_method_threshold),
77    num_dex_methods_threshold_(num_dex_methods_threshold),
78    generate_gdb_information_(generate_gdb_information),
79    generate_helper_trampolines_(generate_helper_trampolines)
80#ifdef ART_SEA_IR_MODE
81    , sea_ir_mode_(sea_ir_mode)
82#endif
83    {}
84
85  CompilerFilter GetCompilerFilter() const {
86    return compiler_filter_;
87  }
88
89  void SetCompilerFilter(CompilerFilter compiler_filter) {
90    compiler_filter_ = compiler_filter;
91  }
92
93  bool IsCompilationEnabled() const {
94    return ((compiler_filter_ != CompilerOptions::kVerifyNone) &&
95            (compiler_filter_ != CompilerOptions::kInterpretOnly));
96  }
97
98  bool IsVerificationEnabled() const {
99    return (compiler_filter_ != CompilerOptions::kVerifyNone);
100  }
101
102  size_t GetHugeMethodThreshold() const {
103    return huge_method_threshold_;
104  }
105
106  size_t GetLargeMethodThreshold() const {
107    return large_method_threshold_;
108  }
109
110  size_t GetSmallMethodThreshold() const {
111    return small_method_threshold_;
112  }
113
114  size_t GetTinyMethodThreshold() const {
115    return tiny_method_threshold_;
116  }
117
118  bool IsHugeMethod(size_t num_dalvik_instructions) const {
119    return num_dalvik_instructions > huge_method_threshold_;
120  }
121
122  bool IsLargeMethod(size_t num_dalvik_instructions) const {
123    return num_dalvik_instructions > large_method_threshold_;
124  }
125
126  bool IsSmallMethod(size_t num_dalvik_instructions) const {
127    return num_dalvik_instructions > small_method_threshold_;
128  }
129
130  bool IsTinyMethod(size_t num_dalvik_instructions) const {
131    return num_dalvik_instructions > tiny_method_threshold_;
132  }
133
134  size_t GetNumDexMethodsThreshold() const {
135    return num_dex_methods_threshold_;
136  }
137
138#ifdef ART_SEA_IR_MODE
139  bool GetSeaIrMode();
140#endif
141
142  bool GetGenerateGDBInformation() const {
143    return generate_gdb_information_;
144  }
145
146  bool GenerateHelperTrampolines() const {
147    return generate_helper_trampolines_;
148  }
149
150 private:
151  CompilerFilter compiler_filter_;
152  size_t huge_method_threshold_;
153  size_t large_method_threshold_;
154  size_t small_method_threshold_;
155  size_t tiny_method_threshold_;
156  size_t num_dex_methods_threshold_;
157  bool generate_gdb_information_;
158  bool generate_helper_trampolines_;
159
160#ifdef ART_SEA_IR_MODE
161  bool sea_ir_mode_;
162#endif
163};
164
165}  // namespace art
166
167#endif  // ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
168