On Fri, Nov 16, 2012 at 5:13 AM, Diego Novillo <dnovi...@google.com> wrote: > 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);
That looks good. The interface should also allow user to specify branch prob. It is probably useful to consider support creating if-then-else with multiple conditions with short circuit semantics. The interface should look very similar. thanks, David > > 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.