On Thu, Nov 15, 2012 at 2:31 AM, Xinliang David Li <davi...@google.com> wrote:
>> ssa_stmt t = q.stmt (NE_EXPR, shadow, 0); >> ssa_stmt a = q.stmt (BIT_AND_EXPR, base_addr, 7); >> ssa_stmt b = q.stmt (shadow_type, a); >> ssa_stmt c = q.stmt (PLUS_EXPR, b, offset); >> ssa_stmt d = q.stmt (GE_EXPR, c, shadow); >> ssa_stmt e = q.stmt (BIT_AND_EXPR, t, d); > > > seq_seq::stmt(...) sounds like a getter interface, not a creator. Sure. They could be named new_stmt() or build_stmt() or something similar. > x = q.new_assignment (...); > x = q.new_call (..); > x.add_arg(..); > x = q.new_icall (..); > > l1 = q.new_label ("xx"); > l2 = q.new_label ("xxx"); > join_l = q.new_label ("..."); > > x = new_if_then_else (cond, l1, l2, join_l); > q.insert_label (l1); > q.new_assignment (...); > q.insert_label(l2); > ... > q.insert_label(join_l); > q.close_if_then_else(x); What I was thinking for if_then_else constructs was something along the lines of: stmt_seq then_body(s1); then_body.add_stmt(s2); stmt_seq else_body(r1); else_body.add_stmt(r2); stmt if_then_else(cond, then_body, else_body); You can then take 'if_then_else' and insert it inside a basic block or an edge. When that happens, the builder takes care of the block/edge splitting for you. >> .. The statement result type is that of the arguments. >> >> .. The type of integral constant arguments is that of the other >> argument. (Which implies that only one argument can be constant.) >> >> .. The 'stmt' method handles linking the statement into the sequence. >> >> .. The 'set_location' method iterates over all statements. >> >> There will be another class of builders for generating GIMPLE >> in normal form (gimple_stmt). We expect that this will mostly >> affect all transformations that need to generate new expressions >> and statements, like instrumentation passes. > > What are the uses of the raw forms? Sorry, what are these "raw forms" that you refer to? >> tree inttype = build_nonstandard_integer_type (POINTER_SIZE, 1); >> record_builder rec ("__asan_global"); >> rec.field ("__beg", const_ptr_type_node); >> rec.field ("__size", inttype); >> rec.field ("__size_with_redzone", inttype); >> rec.field ("__name", const_ptr_type_node); >> rec.field ("__has_dynamic_init", inttype); >> rec.finish (); >> tree ret = rec.as_tree (); > > Again, something like new_field or add_field is more intuitive. Sure. Diego.