00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef lestes__backend_v2__intercode__ge_g_hh__included
00010 #define lestes__backend_v2__intercode__ge_g_hh__included
00011
00012 #include <lestes/backend_v2/common.hh>
00013 #include <lestes/std/map.hh>
00014 #include <lestes/backend_v2/intercode/pi_mem_factory.g.hh>
00015 #include <lestes/md/registers/tm_register_base.g.hh>
00016 #include <lestes/md/types/tm_data_type_base.g.hh>
00017 #include <lestes/md/instructions/tm_instr_base.g.hh>
00018 #include <lestes/md/literals/literal_info_base.g.hh>
00019
00020 #include <lestes/std/objectize_macros.hh>
00021 package(lestes);
00022 package(std);
00023 class object;
00024 end_package(std);
00025 end_package(lestes);
00026
00027 package(lestes);
00028 package(md);
00029 package(literals);
00030 class literal_info_base;
00031 end_package(literals);
00032 end_package(md);
00033 end_package(lestes);
00034
00035 package(lestes);
00036 package(md);
00037 package(instructions);
00038 class tm_instr_base;
00039 end_package(instructions);
00040 end_package(md);
00041 end_package(lestes);
00042
00043 package(lestes);
00044 package(md);
00045 package(types);
00046 class tm_data_type_base;
00047 end_package(types);
00048 end_package(md);
00049 end_package(lestes);
00050
00051 package(lestes);
00052 package(md);
00053 package(registers);
00054 class tm_register_base;
00055 end_package(registers);
00056 end_package(md);
00057 end_package(lestes);
00058
00059 package(lestes);
00060 package(backend_v2);
00061 package(intercode);
00062 class pi_mem_factory;
00063 end_package(intercode);
00064 end_package(backend_v2);
00065 end_package(lestes);
00066
00067 package(lestes);
00068 package(backend_v2);
00069 package(intercode);
00070 class pi_pi;
00071 end_package(intercode);
00072 end_package(backend_v2);
00073 end_package(lestes);
00074
00075 package(lestes);
00076 package(backend_v2);
00077 package(intercode);
00078 class pi_operand;
00079 end_package(intercode);
00080 end_package(backend_v2);
00081 end_package(lestes);
00082
00083 package(lestes);
00084 package(backend_v2);
00085 package(workers);
00086 class basic_block;
00087 end_package(workers);
00088 end_package(backend_v2);
00089 end_package(lestes);
00090
00091 package(lestes);
00092 package(lang);
00093 package(cplus);
00094 package(sem);
00095 class ss_function_declaration;
00096 end_package(sem);
00097 end_package(cplus);
00098 end_package(lang);
00099 end_package(lestes);
00100
00101 package(lestes);
00102 package(backend_v2);
00103 package(intercode);
00104
00105
00106 class visitor_ge_pi2lstring_gen_base;
00107 class visitor_ge_operand2lstring_gen_base;
00108 class ge_pi;
00109 class visitor_ge_pi2lstring_gen_base;
00110 class ge_sp;
00111 class ge_call;
00112 class ge_operand;
00113 class visitor_ge_operand2lstring_gen_base;
00114 class ge_operand_reg;
00115 class ge_operand_mem;
00116 class ge_operand_imm;
00117
00118
00119
00120
00121
00122
00123
00124
00125 class ge_pi : public ::lestes::std::object {
00126 public:
00127
00128 enum kind_type {
00129 PI,
00130 SP,
00131 CALL
00132 };
00133
00134 enum property_id_type {
00135 PROPERTY_SPILLGEN_INFO
00136 };
00137
00138
00139 ptr< ::lestes::md::instructions::tm_instr_base > instruction_get() const;
00140
00141
00142 void instruction_set(const ptr< ::lestes::md::instructions::tm_instr_base > &);
00143
00144
00145 ptr< ::lestes::backend_v2::intercode::pi_pi > pi_source_get() const;
00146
00147
00148 void pi_source_set(const ptr< ::lestes::backend_v2::intercode::pi_pi > &);
00149
00150
00151 ptr< ::lestes::std::vector< srp< ge_operand > > > operands_input_get() const;
00152
00153
00154 void operands_input_set(const ptr< ::lestes::std::vector< srp< ge_operand > > > & );
00155
00156
00157 ptr< ::lestes::std::vector< srp< ge_operand > > > operands_output_get() const;
00158
00159
00160 void operands_output_set(const ptr< ::lestes::std::vector< srp< ge_operand > > > & );
00161
00162
00163 ptr< ::lestes::std::set< srp< ge_pi > > > dependencies_get() const;
00164
00165
00166 void dependencies_set(const ptr< ::lestes::std::set< srp< ge_pi > > > & );
00167
00168
00169 ptr< ::lestes::std::vector< srp< ge_sp > > > jmp_targets_get() const;
00170
00171
00172 void jmp_targets_set(const ptr< ::lestes::std::vector< srp< ge_sp > > > & );
00173
00174
00175 ulint schedule_pos_get() const;
00176
00177
00178 void schedule_pos_set(ulint);
00179
00180
00181 ptr< ::lestes::backend_v2::workers::basic_block > bb_get() const;
00182
00183
00184 void bb_set(const ptr< ::lestes::backend_v2::workers::basic_block > &);
00185
00186
00187 ptr< ::lestes::std::map< ulint, lstring > > properties_get() const;
00188
00189
00190 void properties_set(const ptr< ::lestes::std::map< ulint, lstring > > & );
00191
00192 virtual ge_pi::kind_type kind_get();
00193
00194 bool validate();
00195
00196 virtual lstring accept_visitor_ge_pi2lstring_gen_base( ptr< visitor_ge_pi2lstring_gen_base > v );
00197
00198
00199 static ptr< ge_pi > create (
00200 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00201 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00202 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00203 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00204 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00205 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00206 ulint a__ge_pi__schedule_pos,
00207 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00208 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties);
00209
00210
00211 static ptr< ge_pi > create (
00212 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00213 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source);
00214
00215
00216
00217
00218 virtual ptr<reflection_list> reflection_get() const;
00219
00220 virtual ptr<field_list_list> field_values_get() const;
00221
00222 protected:
00223
00224 ge_pi (
00225 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00226 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00227 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00228 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00229 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00230 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00231 ulint a__ge_pi__schedule_pos,
00232 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00233 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties);
00234
00235
00236 virtual void gc_mark();
00237
00238 private:
00239
00240 srp< ::lestes::md::instructions::tm_instr_base > instruction;
00241
00242
00243
00244
00245 srp< ::lestes::backend_v2::intercode::pi_pi > pi_source;
00246
00247 srp< ::lestes::std::vector< srp< ge_operand > > > operands_input;
00248
00249 srp< ::lestes::std::vector< srp< ge_operand > > > operands_output;
00250
00251
00252
00253
00254
00255 srp< ::lestes::std::set< srp< ge_pi > > > dependencies;
00256
00257 srp< ::lestes::std::vector< srp< ge_sp > > > jmp_targets;
00258
00259 ulint schedule_pos;
00260
00261 srp< ::lestes::backend_v2::workers::basic_block > bb;
00262
00263
00264
00265
00266 srp< ::lestes::std::map< ulint, lstring > > properties;
00267 static ptr<reflection_list> reflection;
00268
00269 };
00270
00271
00272
00273
00274
00275
00276 class ge_sp : public ge_pi {
00277 public:
00278
00279 bool is_jmp_target_get() const;
00280
00281
00282 void is_jmp_target_set(bool);
00283
00284 virtual ge_pi::kind_type kind_get();
00285
00286 virtual lstring accept_visitor_ge_pi2lstring_gen_base( ptr< visitor_ge_pi2lstring_gen_base > v );
00287
00288
00289 static ptr< ge_sp > create (
00290 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00291 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00292 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00293 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00294 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00295 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00296 ulint a__ge_pi__schedule_pos,
00297 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00298 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties,
00299 bool a__ge_sp__is_jmp_target);
00300
00301
00302 static ptr< ge_sp > create (
00303 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00304 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source);
00305
00306
00307
00308
00309 virtual ptr<reflection_list> reflection_get() const;
00310
00311 virtual ptr<field_list_list> field_values_get() const;
00312
00313 protected:
00314
00315 ge_sp (
00316 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00317 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00318 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00319 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00320 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00321 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00322 ulint a__ge_pi__schedule_pos,
00323 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00324 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties,
00325 bool a__ge_sp__is_jmp_target);
00326
00327
00328 virtual void gc_mark();
00329
00330 private:
00331
00332 bool is_jmp_target;
00333 static ptr<reflection_list> reflection;
00334
00335 };
00336
00337
00338
00339 class ge_call : public ge_pi {
00340 public:
00341
00342 ptr< ::lestes::lang::cplus::sem::ss_function_declaration > function_decl_get() const;
00343
00344
00345 void function_decl_set(const ptr< ::lestes::lang::cplus::sem::ss_function_declaration > &);
00346
00347 virtual ge_pi::kind_type kind_get();
00348
00349 virtual lstring accept_visitor_ge_pi2lstring_gen_base( ptr< visitor_ge_pi2lstring_gen_base > v );
00350
00351
00352 static ptr< ge_call > create (
00353 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00354 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00355 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00356 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00357 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00358 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00359 ulint a__ge_pi__schedule_pos,
00360 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00361 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties,
00362 ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__ge_call__function_decl);
00363
00364
00365 static ptr< ge_call > create (
00366 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00367 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00368 ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__ge_call__function_decl);
00369
00370
00371
00372
00373 virtual ptr<reflection_list> reflection_get() const;
00374
00375 virtual ptr<field_list_list> field_values_get() const;
00376
00377 protected:
00378
00379 ge_call (
00380 ptr< ::lestes::md::instructions::tm_instr_base > a__ge_pi__instruction,
00381 ptr< ::lestes::backend_v2::intercode::pi_pi > a__ge_pi__pi_source,
00382 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_input,
00383 ptr< ::lestes::std::vector< srp< ge_operand > > > a__ge_pi__operands_output,
00384 ptr< ::lestes::std::set< srp< ge_pi > > > a__ge_pi__dependencies,
00385 ptr< ::lestes::std::vector< srp< ge_sp > > > a__ge_pi__jmp_targets,
00386 ulint a__ge_pi__schedule_pos,
00387 ptr< ::lestes::backend_v2::workers::basic_block > a__ge_pi__bb,
00388 ptr< ::lestes::std::map< ulint, lstring > > a__ge_pi__properties,
00389 ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__ge_call__function_decl);
00390
00391
00392 virtual void gc_mark();
00393
00394 private:
00395
00396 srp< ::lestes::lang::cplus::sem::ss_function_declaration > function_decl;
00397 static ptr<reflection_list> reflection;
00398
00399 };
00400
00401
00402
00403 class ge_operand : public ::lestes::std::object {
00404 public:
00405
00406 enum kind_type {
00407 REGISTER,
00408 MEMORY,
00409 IMMEDIATE
00410 };
00411
00412
00413 ptr< ::lestes::md::types::tm_data_type_base > type_get() const;
00414
00415
00416 void type_set(const ptr< ::lestes::md::types::tm_data_type_base > &);
00417
00418
00419 ptr< ge_pi > origin_get() const;
00420
00421
00422 void origin_set(const ptr< ge_pi > &);
00423
00424
00425 ptr< ::lestes::backend_v2::intercode::pi_operand > pi_source_get() const;
00426
00427
00428 void pi_source_set(const ptr< ::lestes::backend_v2::intercode::pi_operand > &);
00429
00430
00431 virtual ge_operand::kind_type kind_get() abstract;
00432
00433 virtual lstring accept_visitor_ge_operand2lstring_gen_base( ptr< visitor_ge_operand2lstring_gen_base > v ) abstract;
00434
00435
00436
00437 virtual ptr<reflection_list> reflection_get() const;
00438
00439 virtual ptr<field_list_list> field_values_get() const;
00440
00441 protected:
00442
00443 ge_operand (
00444 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00445 ptr< ge_pi > a__ge_operand__origin,
00446 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source);
00447
00448
00449 virtual void gc_mark();
00450
00451 private:
00452
00453 srp< ::lestes::md::types::tm_data_type_base > type;
00454
00455 srp< ge_pi > origin;
00456
00457 srp< ::lestes::backend_v2::intercode::pi_operand > pi_source;
00458 static ptr<reflection_list> reflection;
00459
00460 };
00461
00462
00463
00464 class ge_operand_reg : public ge_operand {
00465 public:
00466
00467 ptr< ::lestes::std::map< srp< ge_pi >, ulint > > assigned_registers_get() const;
00468
00469
00470 void assigned_registers_set(const ptr< ::lestes::std::map< srp< ge_pi >, ulint > > & );
00471
00472
00473 virtual ge_operand::kind_type kind_get();
00474
00475 virtual lstring accept_visitor_ge_operand2lstring_gen_base( ptr< visitor_ge_operand2lstring_gen_base > v );
00476
00477
00478 static ptr< ge_operand_reg > create (
00479 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00480 ptr< ge_pi > a__ge_operand__origin,
00481 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00482 ptr< ::lestes::std::map< srp< ge_pi >, ulint > > a__ge_operand_reg__assigned_registers);
00483
00484
00485 static ptr< ge_operand_reg > create (
00486 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00487 ptr< ge_pi > a__ge_operand__origin,
00488 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source);
00489
00490
00491
00492
00493 virtual ptr<reflection_list> reflection_get() const;
00494
00495 virtual ptr<field_list_list> field_values_get() const;
00496
00497 protected:
00498
00499 ge_operand_reg (
00500 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00501 ptr< ge_pi > a__ge_operand__origin,
00502 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00503 ptr< ::lestes::std::map< srp< ge_pi >, ulint > > a__ge_operand_reg__assigned_registers);
00504
00505
00506 virtual void gc_mark();
00507
00508 private:
00509
00510 srp< ::lestes::std::map< srp< ge_pi >, ulint > > assigned_registers;
00511 static ptr<reflection_list> reflection;
00512
00513 };
00514
00515
00516
00517 class ge_operand_mem : public ge_operand {
00518 public:
00519
00520 ptr< ::lestes::backend_v2::intercode::pi_mem_factory > factory_get() const;
00521
00522
00523 void factory_set(const ptr< ::lestes::backend_v2::intercode::pi_mem_factory > &);
00524
00525
00526 virtual ge_operand::kind_type kind_get();
00527
00528 virtual lstring accept_visitor_ge_operand2lstring_gen_base( ptr< visitor_ge_operand2lstring_gen_base > v );
00529
00530
00531 static ptr< ge_operand_mem > create (
00532 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00533 ptr< ge_pi > a__ge_operand__origin,
00534 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00535 ptr< ::lestes::backend_v2::intercode::pi_mem_factory > a__ge_operand_mem__factory);
00536
00537
00538
00539
00540 virtual ptr<reflection_list> reflection_get() const;
00541
00542 virtual ptr<field_list_list> field_values_get() const;
00543
00544 protected:
00545
00546 ge_operand_mem (
00547 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00548 ptr< ge_pi > a__ge_operand__origin,
00549 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00550 ptr< ::lestes::backend_v2::intercode::pi_mem_factory > a__ge_operand_mem__factory);
00551
00552
00553 virtual void gc_mark();
00554
00555 private:
00556
00557 srp< ::lestes::backend_v2::intercode::pi_mem_factory > factory;
00558 static ptr<reflection_list> reflection;
00559
00560 };
00561
00562
00563
00564 class ge_operand_imm : public ge_operand {
00565 public:
00566
00567 ptr< ::lestes::md::literals::literal_info_base > value_get() const;
00568
00569
00570 void value_set(const ptr< ::lestes::md::literals::literal_info_base > &);
00571
00572
00573 virtual ge_operand::kind_type kind_get();
00574
00575 virtual lstring accept_visitor_ge_operand2lstring_gen_base( ptr< visitor_ge_operand2lstring_gen_base > v );
00576
00577
00578 static ptr< ge_operand_imm > create (
00579 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00580 ptr< ge_pi > a__ge_operand__origin,
00581 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00582 ptr< ::lestes::md::literals::literal_info_base > a__ge_operand_imm__value);
00583
00584
00585
00586
00587 virtual ptr<reflection_list> reflection_get() const;
00588
00589 virtual ptr<field_list_list> field_values_get() const;
00590
00591 protected:
00592
00593 ge_operand_imm (
00594 ptr< ::lestes::md::types::tm_data_type_base > a__ge_operand__type,
00595 ptr< ge_pi > a__ge_operand__origin,
00596 ptr< ::lestes::backend_v2::intercode::pi_operand > a__ge_operand__pi_source,
00597 ptr< ::lestes::md::literals::literal_info_base > a__ge_operand_imm__value);
00598
00599
00600 virtual void gc_mark();
00601
00602 private:
00603
00604 srp< ::lestes::md::literals::literal_info_base > value;
00605 static ptr<reflection_list> reflection;
00606
00607 };
00608
00609
00610 end_package(intercode);
00611 end_package(backend_v2);
00612 end_package(lestes);
00613
00614 package(lestes);
00615 package(std);
00616 specialize_objectize_for_enum( ::lestes::backend_v2::intercode::ge_pi::kind_type );
00617 specialize_objectize_for_enum( ::lestes::backend_v2::intercode::ge_pi::property_id_type );
00618 specialize_objectize_for_enum( ::lestes::backend_v2::intercode::ge_operand::kind_type );
00619 end_package(std);
00620 end_package(lestes);
00621
00622 #endif // lestes__backend_v2__intercode__ge_g_hh__included