30 #include "ci/ciUtilities.hpp"
31 #include "compiler/methodMatcher.hpp"
32 #include "compiler/compilerOracle.hpp"
33 #include "oops/oop.inline.hpp"
34 #include "utilities/exceptions.hpp"
35
36 // Directives flag name, type, default value, compile command name
37 #define compilerdirectives_common_flags(cflags) \
38 cflags(Enable, bool, false, X) \
39 cflags(Exclude, bool, false, X) \
40 cflags(BreakAtExecute, bool, false, X) \
41 cflags(BreakAtCompile, bool, false, X) \
42 cflags(Log, bool, false, X) \
43 cflags(PrintAssembly, bool, PrintAssembly, PrintAssembly) \
44 cflags(PrintInlining, bool, PrintInlining, PrintInlining) \
45 cflags(PrintNMethods, bool, PrintNMethods, PrintNMethods) \
46 cflags(ReplayInline, bool, false, ReplayInline) \
47 cflags(DumpReplay, bool, false, DumpReplay) \
48 cflags(DumpInline, bool, false, DumpInline) \
49 cflags(CompilerDirectivesIgnoreCompileCommands, bool, CompilerDirectivesIgnoreCompileCommands, X) \
50 cflags(DisableIntrinsic, ccstr, DisableIntrinsic, DisableIntrinsic)
51
52 #ifdef COMPILER1
53 #define compilerdirectives_c1_flags(cflags)
54 #else
55 #define compilerdirectives_c1_flags(cflags)
56 #endif
57
58 #ifdef COMPILER2
59 #define compilerdirectives_c2_flags(cflags) \
60 cflags(BlockLayoutByFrequency, bool, BlockLayoutByFrequency, BlockLayoutByFrequency) \
61 cflags(PrintOptoAssembly, bool, PrintOptoAssembly, PrintOptoAssembly) \
62 cflags(PrintIntrinsics, bool, PrintIntrinsics, PrintIntrinsics) \
63 cflags(TraceOptoPipelining, bool, false, TraceOptoPipelining) \
64 cflags(TraceOptoOutput, bool, false, TraceOptoOutput) \
65 cflags(TraceSpilling, bool, TraceSpilling, TraceSpilling) \
66 cflags(Vectorize, bool, false, Vectorize) \
67 cflags(VectorizeDebug, bool, false, VectorizeDebug) \
68 cflags(CloneMapDebug, bool, false, CloneMapDebug) \
69 cflags(DoReserveCopyInSuperWordDebug, bool, false, DoReserveCopyInSuperWordDebug) \
70 NOT_PRODUCT( cflags(IGVPrintLevel, intx, PrintIdealGraphLevel, IGVPrintLevel)) \
83 static int _depth;
84
85 static void pop_inner(); // no lock version of pop
86 public:
87 static void init();
88 static DirectiveSet* getMatchingDirective(methodHandle mh, AbstractCompiler* comp);
89 static DirectiveSet* getDefaultDirective(AbstractCompiler* comp);
90 static void push(CompilerDirectives* directive);
91 static void pop();
92 static void clear();
93 static void print(outputStream* st);
94 static void release(DirectiveSet* set);
95 static void release(CompilerDirectives* dir);
96 };
97
98 class DirectiveSet : public CHeapObj<mtCompiler> {
99 private:
100 InlineMatcher* _inlinematchers;
101 CompilerDirectives* _directive;
102
103 public:
104 DirectiveSet(CompilerDirectives* directive);
105 ~DirectiveSet();
106 CompilerDirectives* directive();
107 bool parse_and_add_inline(char* str, const char*& error_msg);
108 void append_inline(InlineMatcher* m);
109 bool should_inline(ciMethod* inlinee);
110 bool should_not_inline(ciMethod* inlinee);
111 void print_inline(outputStream* st);
112 DirectiveSet* compilecommand_compatibility_init(methodHandle method);
113 bool is_exclusive_copy() { return _directive == NULL; }
114 bool matches_inline(methodHandle method, int inline_action);
115 static DirectiveSet* clone(DirectiveSet const* src);
116 bool is_intrinsic_disabled(methodHandle method);
117 void finalize();
118
119 typedef enum {
120 #define enum_of_flags(name, type, dvalue, cc_flag) name##Index,
121 compilerdirectives_common_flags(enum_of_flags)
122 compilerdirectives_c2_flags(enum_of_flags)
124 number_of_flags
125 } flags;
126
127 bool _modified[number_of_flags];
128
129 #define flag_store_definition(name, type, dvalue, cc_flag) type name##Option;
130 compilerdirectives_common_flags(flag_store_definition)
131 compilerdirectives_c2_flags(flag_store_definition)
132 compilerdirectives_c1_flags(flag_store_definition)
133
134 // Casting to get the same function signature for all setters. Used from parser.
135 #define set_function_definition(name, type, dvalue, cc_flag) void set_##name(void* value) { type val = *(type*)value; name##Option = val; _modified[name##Index] = 1; }
136 compilerdirectives_common_flags(set_function_definition)
137 compilerdirectives_c2_flags(set_function_definition)
138 compilerdirectives_c1_flags(set_function_definition)
139
140 void print_intx(outputStream* st, ccstr n, intx v, bool mod) { if (mod) { st->print("%s:" INTX_FORMAT " ", n, v); } }
141 void print_bool(outputStream* st, ccstr n, bool v, bool mod) { if (mod) { st->print("%s:%s ", n, v ? "true" : "false"); } }
142 void print_double(outputStream* st, ccstr n, double v, bool mod) { if (mod) { st->print("%s:%f ", n, v); } }
143 void print_ccstr(outputStream* st, ccstr n, ccstr v, bool mod) { if (mod) { st->print("%s:%s ", n, v); } }
144
145 void print(outputStream* st) {
146 print_inline(st);
147 st->print(" ");
148 #define print_function_definition(name, type, dvalue, cc_flag) print_##type(st, #name, this->name##Option, true);//(bool)_modified[name##Index]);
149 compilerdirectives_common_flags(print_function_definition)
150 compilerdirectives_c2_flags(print_function_definition)
151 compilerdirectives_c1_flags(print_function_definition)
152 st->cr();
153 }
154 };
155
156 class CompilerDirectives : public CHeapObj<mtCompiler> {
157 private:
158 CompilerDirectives* _next;
159 BasicMatcher* _match;
160 int _ref_count;
161
162 public:
163
|
30 #include "ci/ciUtilities.hpp"
31 #include "compiler/methodMatcher.hpp"
32 #include "compiler/compilerOracle.hpp"
33 #include "oops/oop.inline.hpp"
34 #include "utilities/exceptions.hpp"
35
36 // Directives flag name, type, default value, compile command name
37 #define compilerdirectives_common_flags(cflags) \
38 cflags(Enable, bool, false, X) \
39 cflags(Exclude, bool, false, X) \
40 cflags(BreakAtExecute, bool, false, X) \
41 cflags(BreakAtCompile, bool, false, X) \
42 cflags(Log, bool, false, X) \
43 cflags(PrintAssembly, bool, PrintAssembly, PrintAssembly) \
44 cflags(PrintInlining, bool, PrintInlining, PrintInlining) \
45 cflags(PrintNMethods, bool, PrintNMethods, PrintNMethods) \
46 cflags(ReplayInline, bool, false, ReplayInline) \
47 cflags(DumpReplay, bool, false, DumpReplay) \
48 cflags(DumpInline, bool, false, DumpInline) \
49 cflags(CompilerDirectivesIgnoreCompileCommands, bool, CompilerDirectivesIgnoreCompileCommands, X) \
50 cflags(DisableIntrinsic, ccstrlist, DisableIntrinsic, DisableIntrinsic)
51
52 #ifdef COMPILER1
53 #define compilerdirectives_c1_flags(cflags)
54 #else
55 #define compilerdirectives_c1_flags(cflags)
56 #endif
57
58 #ifdef COMPILER2
59 #define compilerdirectives_c2_flags(cflags) \
60 cflags(BlockLayoutByFrequency, bool, BlockLayoutByFrequency, BlockLayoutByFrequency) \
61 cflags(PrintOptoAssembly, bool, PrintOptoAssembly, PrintOptoAssembly) \
62 cflags(PrintIntrinsics, bool, PrintIntrinsics, PrintIntrinsics) \
63 cflags(TraceOptoPipelining, bool, false, TraceOptoPipelining) \
64 cflags(TraceOptoOutput, bool, false, TraceOptoOutput) \
65 cflags(TraceSpilling, bool, TraceSpilling, TraceSpilling) \
66 cflags(Vectorize, bool, false, Vectorize) \
67 cflags(VectorizeDebug, bool, false, VectorizeDebug) \
68 cflags(CloneMapDebug, bool, false, CloneMapDebug) \
69 cflags(DoReserveCopyInSuperWordDebug, bool, false, DoReserveCopyInSuperWordDebug) \
70 NOT_PRODUCT( cflags(IGVPrintLevel, intx, PrintIdealGraphLevel, IGVPrintLevel)) \
83 static int _depth;
84
85 static void pop_inner(); // no lock version of pop
86 public:
87 static void init();
88 static DirectiveSet* getMatchingDirective(methodHandle mh, AbstractCompiler* comp);
89 static DirectiveSet* getDefaultDirective(AbstractCompiler* comp);
90 static void push(CompilerDirectives* directive);
91 static void pop();
92 static void clear();
93 static void print(outputStream* st);
94 static void release(DirectiveSet* set);
95 static void release(CompilerDirectives* dir);
96 };
97
98 class DirectiveSet : public CHeapObj<mtCompiler> {
99 private:
100 InlineMatcher* _inlinematchers;
101 CompilerDirectives* _directive;
102
103 static ccstrlist canonicalize_disableintrinsic(ccstrlist option_value);
104
105 public:
106 DirectiveSet(CompilerDirectives* directive);
107 ~DirectiveSet();
108 CompilerDirectives* directive();
109 bool parse_and_add_inline(char* str, const char*& error_msg);
110 void append_inline(InlineMatcher* m);
111 bool should_inline(ciMethod* inlinee);
112 bool should_not_inline(ciMethod* inlinee);
113 void print_inline(outputStream* st);
114 DirectiveSet* compilecommand_compatibility_init(methodHandle method);
115 bool is_exclusive_copy() { return _directive == NULL; }
116 bool matches_inline(methodHandle method, int inline_action);
117 static DirectiveSet* clone(DirectiveSet const* src);
118 bool is_intrinsic_disabled(methodHandle method);
119 void finalize();
120
121 typedef enum {
122 #define enum_of_flags(name, type, dvalue, cc_flag) name##Index,
123 compilerdirectives_common_flags(enum_of_flags)
124 compilerdirectives_c2_flags(enum_of_flags)
126 number_of_flags
127 } flags;
128
129 bool _modified[number_of_flags];
130
131 #define flag_store_definition(name, type, dvalue, cc_flag) type name##Option;
132 compilerdirectives_common_flags(flag_store_definition)
133 compilerdirectives_c2_flags(flag_store_definition)
134 compilerdirectives_c1_flags(flag_store_definition)
135
136 // Casting to get the same function signature for all setters. Used from parser.
137 #define set_function_definition(name, type, dvalue, cc_flag) void set_##name(void* value) { type val = *(type*)value; name##Option = val; _modified[name##Index] = 1; }
138 compilerdirectives_common_flags(set_function_definition)
139 compilerdirectives_c2_flags(set_function_definition)
140 compilerdirectives_c1_flags(set_function_definition)
141
142 void print_intx(outputStream* st, ccstr n, intx v, bool mod) { if (mod) { st->print("%s:" INTX_FORMAT " ", n, v); } }
143 void print_bool(outputStream* st, ccstr n, bool v, bool mod) { if (mod) { st->print("%s:%s ", n, v ? "true" : "false"); } }
144 void print_double(outputStream* st, ccstr n, double v, bool mod) { if (mod) { st->print("%s:%f ", n, v); } }
145 void print_ccstr(outputStream* st, ccstr n, ccstr v, bool mod) { if (mod) { st->print("%s:%s ", n, v); } }
146 void print_ccstrlist(outputStream* st, ccstr n, ccstr v, bool mod) { print_ccstr(st, n, v, mod); }
147
148 void print(outputStream* st) {
149 print_inline(st);
150 st->print(" ");
151 #define print_function_definition(name, type, dvalue, cc_flag) print_##type(st, #name, this->name##Option, true);//(bool)_modified[name##Index]);
152 compilerdirectives_common_flags(print_function_definition)
153 compilerdirectives_c2_flags(print_function_definition)
154 compilerdirectives_c1_flags(print_function_definition)
155 st->cr();
156 }
157 };
158
159 class CompilerDirectives : public CHeapObj<mtCompiler> {
160 private:
161 CompilerDirectives* _next;
162 BasicMatcher* _match;
163 int _ref_count;
164
165 public:
166
|