@@ -40,6 +40,13 @@ def handle_insn(self, insn):
4040 self .insn_func_map [type (insn )](insn )
4141
4242 def handle_fn_begin (self , insn ):
43+ if insn .pragma :
44+ if 'event_handler' in insn .pragma :
45+ handler = insn .pragma ['event_handler' ]
46+ conds = ';' .join (map (
47+ lambda i : '%s=%s' % i , handler ['conditions' ].items ()))
48+ self .writer .write_directive ('event_handler' , '%s %s %s' % (
49+ insn .name , handler ['event_name' ], conds ))
4350 self .writer .write_subroutine (insn .name )
4451 self .func_name = insn .name
4552 self .func_store = insn .storage
@@ -472,6 +479,7 @@ def __init__(self, on_instruction):
472479 self .current_function = None
473480 self .loop_attacher = LoopAttacher (None , None , self , None )
474481 self .python_functions = {}
482+ self .pragmas = {}
475483
476484 def import_py_lib (self , lib_exports ):
477485 self .python_functions .update (lib_exports )
@@ -525,6 +533,31 @@ def unique_label(self, label):
525533 self .local_labels [label ] += 1
526534 return IR .Label ('%s_%d' % (label , self .local_labels [label ]))
527535
536+ ### Pragmas
537+
538+ def visit_pragma (self , pragma ):
539+ name , args = pragma .val .split (' ' , 1 )
540+ pragmas = {
541+ 'event_handler' : self .visit_pragma_event_handler ,
542+ 'event_condition' : self .visit_pragma_event_condition ,
543+ }
544+ assert name in pragmas , "Unknown pragma '%s'" % name
545+ pragmas [name ](args )
546+
547+ def visit_pragma_event_handler (self , event_name ):
548+ assert self .current_function is None , "event_handler must be outside of function"
549+ assert 'event_handler' not in self .pragmas , "Multiple event handlers"
550+ self .pragmas ['event_handler' ] = {
551+ 'event_name' : event_name ,
552+ 'conditions' : {}
553+ }
554+
555+ def visit_pragma_event_condition (self , condition ):
556+ assert 'event_handler' in self .pragmas , "Not in event_handler context"
557+ key , operator , value = condition .split (' ' , 2 )
558+ assert operator == '=='
559+ self .pragmas ['event_handler' ]['conditions' ][key ] = value
560+
528561 ### Declarations
529562
530563 def get_name_and_type (self , type , spec ):
@@ -548,10 +581,16 @@ def visit_func_decl(self, decl):
548581
549582 self .local_labels = {}
550583
584+ pragma = {}
585+ # check pragmas
586+ if 'event_handler' in self .pragmas :
587+ pragma ['event_handler' ] = self .pragmas ['event_handler' ]
588+ del self .pragmas ['event_handler' ]
589+
551590 # Enter function scope
552591 with self .scope :
553592 self .emit (IR .FunctionBegin (func_symbol .name ,
554- self .scope .current_storage ))
593+ self .scope .current_storage , pragma ))
555594
556595 params = decl .decl .name_spec .params
557596 # Declare parameter symbols
@@ -647,7 +686,8 @@ def read_list_data(self, list_type, init_list, read_next_element):
647686 child = mem_ref .child
648687 index , offset , v_type = read_next_element (list_type , index , mem_ref )
649688 if child is not None :
650- val = self .visit_list_init_data (v_type , [InitSpec (decl = child , val = init_spec .val )])
689+ val = self .visit_list_init_data (v_type ,
690+ [InitSpec (decl = child , val = init_spec .val )])
651691 elif type (init_spec .val ) == list :
652692 val = self .visit_list_init_data (v_type , init_spec .val )
653693 else :
0 commit comments