| OLD | NEW | 
|     1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|     2 // for details. All rights reserved. Use of this source code is governed by a |     2 // for details. All rights reserved. Use of this source code is governed by a | 
|     3 // BSD-style license that can be found in the LICENSE file. |     3 // BSD-style license that can be found in the LICENSE file. | 
|     4  |     4  | 
|     5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |     5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 
|     6 #define VM_INTERMEDIATE_LANGUAGE_H_ |     6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 
|     7  |     7  | 
|     8 #include "vm/allocation.h" |     8 #include "vm/allocation.h" | 
|     9 #include "vm/ast.h" |     9 #include "vm/ast.h" | 
|    10 #include "vm/growable_array.h" |    10 #include "vm/growable_array.h" | 
| (...skipping 1548 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1559 class CatchBlockEntryInstr : public BlockEntryInstr { |  1559 class CatchBlockEntryInstr : public BlockEntryInstr { | 
|  1560  public: |  1560  public: | 
|  1561   CatchBlockEntryInstr(intptr_t block_id, |  1561   CatchBlockEntryInstr(intptr_t block_id, | 
|  1562                        intptr_t try_index, |  1562                        intptr_t try_index, | 
|  1563                        GraphEntryInstr* graph_entry, |  1563                        GraphEntryInstr* graph_entry, | 
|  1564                        const Array& handler_types, |  1564                        const Array& handler_types, | 
|  1565                        intptr_t catch_try_index, |  1565                        intptr_t catch_try_index, | 
|  1566                        const LocalVariable& exception_var, |  1566                        const LocalVariable& exception_var, | 
|  1567                        const LocalVariable& stacktrace_var, |  1567                        const LocalVariable& stacktrace_var, | 
|  1568                        bool needs_stacktrace, |  1568                        bool needs_stacktrace, | 
|  1569                        intptr_t deopt_id) |  1569                        intptr_t deopt_id, | 
 |  1570                        bool should_restore_closure_context = false) | 
|  1570       : BlockEntryInstr(block_id, try_index), |  1571       : BlockEntryInstr(block_id, try_index), | 
|  1571         graph_entry_(graph_entry), |  1572         graph_entry_(graph_entry), | 
|  1572         predecessor_(NULL), |  1573         predecessor_(NULL), | 
|  1573         catch_handler_types_(Array::ZoneHandle(handler_types.raw())), |  1574         catch_handler_types_(Array::ZoneHandle(handler_types.raw())), | 
|  1574         catch_try_index_(catch_try_index), |  1575         catch_try_index_(catch_try_index), | 
|  1575         exception_var_(exception_var), |  1576         exception_var_(exception_var), | 
|  1576         stacktrace_var_(stacktrace_var), |  1577         stacktrace_var_(stacktrace_var), | 
|  1577         needs_stacktrace_(needs_stacktrace) { |  1578         needs_stacktrace_(needs_stacktrace), | 
 |  1579         should_restore_closure_context_(should_restore_closure_context) { | 
|  1578     deopt_id_ = deopt_id; |  1580     deopt_id_ = deopt_id; | 
|  1579   } |  1581   } | 
|  1580  |  1582  | 
|  1581   DECLARE_INSTRUCTION(CatchBlockEntry) |  1583   DECLARE_INSTRUCTION(CatchBlockEntry) | 
|  1582  |  1584  | 
|  1583   virtual intptr_t PredecessorCount() const { |  1585   virtual intptr_t PredecessorCount() const { | 
|  1584     return (predecessor_ == NULL) ? 0 : 1; |  1586     return (predecessor_ == NULL) ? 0 : 1; | 
|  1585   } |  1587   } | 
|  1586   virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { |  1588   virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { | 
|  1587     ASSERT((index == 0) && (predecessor_ != NULL)); |  1589     ASSERT((index == 0) && (predecessor_ != NULL)); | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  1608  |  1610  | 
|  1609  private: |  1611  private: | 
|  1610   friend class BlockEntryInstr;  // Access to predecessor_ when inlining. |  1612   friend class BlockEntryInstr;  // Access to predecessor_ when inlining. | 
|  1611  |  1613  | 
|  1612   virtual void ClearPredecessors() { predecessor_ = NULL; } |  1614   virtual void ClearPredecessors() { predecessor_ = NULL; } | 
|  1613   virtual void AddPredecessor(BlockEntryInstr* predecessor) { |  1615   virtual void AddPredecessor(BlockEntryInstr* predecessor) { | 
|  1614     ASSERT(predecessor_ == NULL); |  1616     ASSERT(predecessor_ == NULL); | 
|  1615     predecessor_ = predecessor; |  1617     predecessor_ = predecessor; | 
|  1616   } |  1618   } | 
|  1617  |  1619  | 
 |  1620   bool should_restore_closure_context() const { | 
 |  1621     ASSERT(exception_var_.is_captured() == stacktrace_var_.is_captured()); | 
 |  1622     ASSERT(!exception_var_.is_captured() || should_restore_closure_context_); | 
 |  1623     return should_restore_closure_context_; | 
 |  1624   } | 
 |  1625  | 
|  1618   GraphEntryInstr* graph_entry_; |  1626   GraphEntryInstr* graph_entry_; | 
|  1619   BlockEntryInstr* predecessor_; |  1627   BlockEntryInstr* predecessor_; | 
|  1620   const Array& catch_handler_types_; |  1628   const Array& catch_handler_types_; | 
|  1621   const intptr_t catch_try_index_; |  1629   const intptr_t catch_try_index_; | 
|  1622   GrowableArray<Definition*> initial_definitions_; |  1630   GrowableArray<Definition*> initial_definitions_; | 
|  1623   const LocalVariable& exception_var_; |  1631   const LocalVariable& exception_var_; | 
|  1624   const LocalVariable& stacktrace_var_; |  1632   const LocalVariable& stacktrace_var_; | 
|  1625   const bool needs_stacktrace_; |  1633   const bool needs_stacktrace_; | 
 |  1634   const bool should_restore_closure_context_; | 
|  1626  |  1635  | 
|  1627   DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr); |  1636   DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr); | 
|  1628 }; |  1637 }; | 
|  1629  |  1638  | 
|  1630  |  1639  | 
|  1631 // If the result of the allocation is not stored into any field, passed |  1640 // If the result of the allocation is not stored into any field, passed | 
|  1632 // as an argument or used in a phi then it can't alias with any other |  1641 // as an argument or used in a phi then it can't alias with any other | 
|  1633 // SSA value. |  1642 // SSA value. | 
|  1634 class AliasIdentity : public ValueObject { |  1643 class AliasIdentity : public ValueObject { | 
|  1635  public: |  1644  public: | 
| (...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2770   DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr); |  2779   DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr); | 
|  2771 }; |  2780 }; | 
|  2772  |  2781  | 
|  2773  |  2782  | 
|  2774 class ClosureCallInstr : public TemplateDefinition<1, Throws> { |  2783 class ClosureCallInstr : public TemplateDefinition<1, Throws> { | 
|  2775  public: |  2784  public: | 
|  2776   ClosureCallInstr(Value* function, |  2785   ClosureCallInstr(Value* function, | 
|  2777                    ClosureCallNode* node, |  2786                    ClosureCallNode* node, | 
|  2778                    ZoneGrowableArray<PushArgumentInstr*>* arguments) |  2787                    ZoneGrowableArray<PushArgumentInstr*>* arguments) | 
|  2779       : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |  2788       : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 
|  2780         ast_node_(*node), |  2789         argument_names_(node->arguments()->names()), | 
 |  2790         token_pos_(node->token_pos()), | 
 |  2791         arguments_(arguments) { | 
 |  2792     SetInputAt(0, function); | 
 |  2793   } | 
 |  2794  | 
 |  2795   ClosureCallInstr(Value* function, | 
 |  2796                    ZoneGrowableArray<PushArgumentInstr*>* arguments, | 
 |  2797                    const Array& argument_names, | 
 |  2798                    TokenPosition token_pos) | 
 |  2799       : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 
 |  2800         argument_names_(argument_names), | 
 |  2801         token_pos_(token_pos), | 
|  2781         arguments_(arguments) { |  2802         arguments_(arguments) { | 
|  2782     SetInputAt(0, function); |  2803     SetInputAt(0, function); | 
|  2783   } |  2804   } | 
|  2784  |  2805  | 
|  2785   DECLARE_INSTRUCTION(ClosureCall) |  2806   DECLARE_INSTRUCTION(ClosureCall) | 
|  2786  |  2807  | 
|  2787   const Array& argument_names() const { return ast_node_.arguments()->names(); } |  2808   const Array& argument_names() const { return argument_names_; } | 
|  2788   virtual TokenPosition token_pos() const { |  2809   virtual TokenPosition token_pos() const { return token_pos_; } | 
|  2789     return ast_node_.token_pos(); |  | 
|  2790   } |  | 
|  2791  |  2810  | 
|  2792   virtual intptr_t ArgumentCount() const { return arguments_->length(); } |  2811   virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 
|  2793   virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |  2812   virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 
|  2794     return (*arguments_)[index]; |  2813     return (*arguments_)[index]; | 
|  2795   } |  2814   } | 
|  2796  |  2815  | 
|  2797   // TODO(kmillikin): implement exact call counts for closure calls. |  2816   // TODO(kmillikin): implement exact call counts for closure calls. | 
|  2798   virtual intptr_t CallCount() const { return 1; } |  2817   virtual intptr_t CallCount() const { return 1; } | 
|  2799  |  2818  | 
|  2800   virtual bool CanDeoptimize() const { return true; } |  2819   virtual bool CanDeoptimize() const { return true; } | 
|  2801  |  2820  | 
|  2802   virtual EffectSet Effects() const { return EffectSet::All(); } |  2821   virtual EffectSet Effects() const { return EffectSet::All(); } | 
|  2803  |  2822  | 
|  2804   PRINT_OPERANDS_TO_SUPPORT |  2823   PRINT_OPERANDS_TO_SUPPORT | 
|  2805  |  2824  | 
|  2806  private: |  2825  private: | 
|  2807   const ClosureCallNode& ast_node_; |  2826   const Array& argument_names_; | 
 |  2827   TokenPosition token_pos_; | 
|  2808   ZoneGrowableArray<PushArgumentInstr*>* arguments_; |  2828   ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 
|  2809  |  2829  | 
|  2810   DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); |  2830   DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); | 
|  2811 }; |  2831 }; | 
|  2812  |  2832  | 
|  2813  |  2833  | 
|  2814 class InstanceCallInstr : public TemplateDefinition<0, Throws> { |  2834 class InstanceCallInstr : public TemplateDefinition<0, Throws> { | 
|  2815  public: |  2835  public: | 
|  2816   InstanceCallInstr(TokenPosition token_pos, |  2836   InstanceCallInstr(TokenPosition token_pos, | 
|  2817                     const String& function_name, |  2837                     const String& function_name, | 
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3257         ic_data_(NULL), |  3277         ic_data_(NULL), | 
|  3258         token_pos_(token_pos), |  3278         token_pos_(token_pos), | 
|  3259         function_(function), |  3279         function_(function), | 
|  3260         argument_names_(argument_names), |  3280         argument_names_(argument_names), | 
|  3261         arguments_(arguments), |  3281         arguments_(arguments), | 
|  3262         result_cid_(kDynamicCid), |  3282         result_cid_(kDynamicCid), | 
|  3263         is_known_list_constructor_(false), |  3283         is_known_list_constructor_(false), | 
|  3264         identity_(AliasIdentity::Unknown()) { |  3284         identity_(AliasIdentity::Unknown()) { | 
|  3265     ic_data_ = GetICData(ic_data_array); |  3285     ic_data_ = GetICData(ic_data_array); | 
|  3266     ASSERT(function.IsZoneHandle()); |  3286     ASSERT(function.IsZoneHandle()); | 
 |  3287     ASSERT(!function.IsNull()); | 
|  3267     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap()); |  3288     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap()); | 
|  3268   } |  3289   } | 
|  3269  |  3290  | 
|  3270   StaticCallInstr(TokenPosition token_pos, |  3291   StaticCallInstr(TokenPosition token_pos, | 
|  3271                   const Function& function, |  3292                   const Function& function, | 
|  3272                   const Array& argument_names, |  3293                   const Array& argument_names, | 
|  3273                   ZoneGrowableArray<PushArgumentInstr*>* arguments, |  3294                   ZoneGrowableArray<PushArgumentInstr*>* arguments, | 
|  3274                   intptr_t deopt_id) |  3295                   intptr_t deopt_id) | 
|  3275       : TemplateDefinition(deopt_id), |  3296       : TemplateDefinition(deopt_id), | 
|  3276         ic_data_(NULL), |  3297         ic_data_(NULL), | 
|  3277         token_pos_(token_pos), |  3298         token_pos_(token_pos), | 
|  3278         function_(function), |  3299         function_(function), | 
|  3279         argument_names_(argument_names), |  3300         argument_names_(argument_names), | 
|  3280         arguments_(arguments), |  3301         arguments_(arguments), | 
|  3281         result_cid_(kDynamicCid), |  3302         result_cid_(kDynamicCid), | 
|  3282         is_known_list_constructor_(false), |  3303         is_known_list_constructor_(false), | 
|  3283         identity_(AliasIdentity::Unknown()) { |  3304         identity_(AliasIdentity::Unknown()) { | 
|  3284     ASSERT(function.IsZoneHandle()); |  3305     ASSERT(function.IsZoneHandle()); | 
 |  3306     ASSERT(!function.IsNull()); | 
|  3285     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap()); |  3307     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap()); | 
|  3286   } |  3308   } | 
|  3287  |  3309  | 
|  3288   // ICData for static calls carries call count. |  3310   // ICData for static calls carries call count. | 
|  3289   const ICData* ic_data() const { return ic_data_; } |  3311   const ICData* ic_data() const { return ic_data_; } | 
|  3290   bool HasICData() const { |  3312   bool HasICData() const { | 
|  3291     return (ic_data() != NULL) && !ic_data()->IsNull(); |  3313     return (ic_data() != NULL) && !ic_data()->IsNull(); | 
|  3292   } |  3314   } | 
|  3293  |  3315  | 
|  3294   DECLARE_INSTRUCTION(StaticCall) |  3316   DECLARE_INSTRUCTION(StaticCall) | 
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3476   bool is_last_; |  3498   bool is_last_; | 
|  3477   const TokenPosition token_pos_; |  3499   const TokenPosition token_pos_; | 
|  3478  |  3500  | 
|  3479   DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr); |  3501   DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr); | 
|  3480 }; |  3502 }; | 
|  3481  |  3503  | 
|  3482  |  3504  | 
|  3483 class NativeCallInstr : public TemplateDefinition<0, Throws> { |  3505 class NativeCallInstr : public TemplateDefinition<0, Throws> { | 
|  3484  public: |  3506  public: | 
|  3485   explicit NativeCallInstr(NativeBodyNode* node) |  3507   explicit NativeCallInstr(NativeBodyNode* node) | 
|  3486       : ast_node_(*node), |  3508       : native_name_(&node->native_c_function_name()), | 
 |  3509         function_(&node->function()), | 
|  3487         native_c_function_(NULL), |  3510         native_c_function_(NULL), | 
|  3488         is_bootstrap_native_(false) { } |  3511         is_bootstrap_native_(false), | 
 |  3512         link_lazily_(node->link_lazily()), | 
 |  3513         token_pos_(node->token_pos()) { } | 
 |  3514  | 
 |  3515   NativeCallInstr(const String* name, | 
 |  3516                   const Function* function, | 
 |  3517                   bool link_lazily, | 
 |  3518                   TokenPosition position) | 
 |  3519       : native_name_(name), | 
 |  3520         function_(function), | 
 |  3521         native_c_function_(NULL), | 
 |  3522         is_bootstrap_native_(false), | 
 |  3523         link_lazily_(link_lazily), | 
 |  3524         token_pos_(position) { } | 
|  3489  |  3525  | 
|  3490   DECLARE_INSTRUCTION(NativeCall) |  3526   DECLARE_INSTRUCTION(NativeCall) | 
|  3491  |  3527  | 
|  3492   virtual TokenPosition token_pos() const { |  3528   const String& native_name() const { return *native_name_; } | 
|  3493     return ast_node_.token_pos(); |  3529   const Function& function() const { return *function_; } | 
|  3494   } |  3530   NativeFunction native_c_function() const { return native_c_function_; } | 
|  3495  |  3531   bool is_bootstrap_native() const { return is_bootstrap_native_; } | 
|  3496   const Function& function() const { return ast_node_.function(); } |  3532   bool link_lazily() const { return link_lazily_; } | 
|  3497  |  3533   virtual TokenPosition token_pos() const { return token_pos_; } | 
|  3498   const String& native_name() const { |  | 
|  3499     return ast_node_.native_c_function_name(); |  | 
|  3500   } |  | 
|  3501  |  | 
|  3502   NativeFunction native_c_function() const { |  | 
|  3503     return native_c_function_; |  | 
|  3504   } |  | 
|  3505  |  | 
|  3506   bool is_bootstrap_native() const { |  | 
|  3507     return is_bootstrap_native_; |  | 
|  3508   } |  | 
|  3509  |  | 
|  3510   bool link_lazily() const { |  | 
|  3511     return ast_node_.link_lazily(); |  | 
|  3512   } |  | 
|  3513  |  3534  | 
|  3514   virtual bool CanDeoptimize() const { return false; } |  3535   virtual bool CanDeoptimize() const { return false; } | 
|  3515  |  3536  | 
|  3516   virtual EffectSet Effects() const { return EffectSet::All(); } |  3537   virtual EffectSet Effects() const { return EffectSet::All(); } | 
|  3517  |  3538  | 
|  3518   void SetupNative(); |  3539   void SetupNative(); | 
|  3519  |  3540  | 
|  3520   PRINT_OPERANDS_TO_SUPPORT |  3541   PRINT_OPERANDS_TO_SUPPORT | 
|  3521  |  3542  | 
|  3522  private: |  3543  private: | 
|  3523   void set_native_c_function(NativeFunction value) { |  3544   void set_native_c_function(NativeFunction value) { | 
|  3524     native_c_function_ = value; |  3545     native_c_function_ = value; | 
|  3525   } |  3546   } | 
|  3526  |  3547  | 
|  3527   void set_is_bootstrap_native(bool value) { is_bootstrap_native_ = value; } |  3548   void set_is_bootstrap_native(bool value) { is_bootstrap_native_ = value; } | 
|  3528  |  3549  | 
|  3529   const NativeBodyNode& ast_node_; |  3550   const String* native_name_; | 
 |  3551   const Function* function_; | 
|  3530   NativeFunction native_c_function_; |  3552   NativeFunction native_c_function_; | 
|  3531   bool is_bootstrap_native_; |  3553   bool is_bootstrap_native_; | 
 |  3554   bool link_lazily_; | 
 |  3555   const TokenPosition token_pos_; | 
|  3532  |  3556  | 
|  3533   DISALLOW_COPY_AND_ASSIGN(NativeCallInstr); |  3557   DISALLOW_COPY_AND_ASSIGN(NativeCallInstr); | 
|  3534 }; |  3558 }; | 
|  3535  |  3559  | 
|  3536  |  3560  | 
|  3537 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { |  3561 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { | 
|  3538  public: |  3562  public: | 
|  3539   DebugStepCheckInstr(TokenPosition token_pos, |  3563   DebugStepCheckInstr(TokenPosition token_pos, | 
|  3540                       RawPcDescriptors::Kind stub_kind) |  3564                       RawPcDescriptors::Kind stub_kind) | 
|  3541       : token_pos_(token_pos), |  3565       : token_pos_(token_pos), | 
| (...skipping 4758 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  8300   LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const {    \ |  8324   LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const {    \ | 
|  8301     UNIMPLEMENTED();                                                          \ |  8325     UNIMPLEMENTED();                                                          \ | 
|  8302     return NULL;                                                              \ |  8326     return NULL;                                                              \ | 
|  8303   }                                                                           \ |  8327   }                                                                           \ | 
|  8304   void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |  8328   void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 
|  8305  |  8329  | 
|  8306  |  8330  | 
|  8307 }  // namespace dart |  8331 }  // namespace dart | 
|  8308  |  8332  | 
|  8309 #endif  // VM_INTERMEDIATE_LANGUAGE_H_ |  8333 #endif  // VM_INTERMEDIATE_LANGUAGE_H_ | 
| OLD | NEW |