Hi.
I also needed for one of my CIL modules to access the parent statement of
a
statement, but also the parent of the parent, etc. So I follow up this thread
of discussion.
You can find a possible implementation of obtaining the parents of AST
nodes below -
the code worked well for the few tests that I used. Let me know if you have
comments.
A suggestion (this is actually the main reason I wrote this email): the
ChangeDoChildrenPost is a very useful feature - I used it to build and update
at the end
of the visit the stackStmt. Now I wonder if it is worthy to have a simpler
DoChildrenPost
that would not have the update part of ChangeDoChildrenPost, but simply execute
a "Post"
function after traversing all the children.
(* Since we do not have access to the parent nodes of each node visited, we
* keep track of them.
* Since the CIL visitor performs DFS traversal of the AST, we keep a stack
of
* the parent nodes method vstmt visits - stackStmt[0] = parent of current s
* in stmt, stackStmt[1] = parent of stackStmt[0], etc.
*)
val mutable stackStmt : stmt list = []
method vstmt (s: stmt) : stmt visitAction =
stackStmt <- s :: stackStmt;
match s.skind with
Loop(block, loc, stmt_continue, break_label) ->
ignore(
if List.length stackStmt >= 3 then
let parentStmt = List.hd (List.tl (List.tl stackStmt)) in
E.log " parent3 of Loop is %a\n" Cil.d_stmt parentStmt;
);
ignore(
if List.length stackStmt >= 2 then
let parentStmt = List.hd (List.tl stackStmt) in
E.log " parent2 of Loop is %a\n" Cil.d_stmt parentStmt;
);
ignore(
if List.length stackStmt >= 1 then
let parentStmt = List.hd stackStmt in
E.log " parent1 of Loop is %a\n" Cil.d_stmt parentStmt;
);
ignore(
if List.length block.bstmts > 2 then
let stmt_break = (List.hd (List.tl block.bstmts)) in
E.log " stmt_break is %a\n" Cil.d_stmt stmt_break;
match stmt_break.skind with
If(exp, then_block, else_block, loc) ->
E.log " stmt_break's expression is %a\n" Cil.d_exp exp;
| _ -> E.log "";
);
ChangeDoChildrenPost (s,
fun x -> (
ignore(
E.log "List.length stackStmt=%d\n" (List.length stackStmt);
if List.length stackStmt > 0 then
if (List.hd stackStmt) = s then
stackStmt <- List.tl stackStmt
);
x));
| _ ->
ChangeDoChildrenPost (s,
fun x -> (
ignore(
E.log "List.length stackStmt=%d\n" (List.length stackStmt);
if List.length stackStmt > 0 then
if (List.hd stackStmt) = s then
stackStmt <- List.tl stackStmt
);
x));
Best regards,
Alex
On 01/28/2006 23:07, Matt Harren wrote:
> Hi Roy,
>
> You can add
>
> val mutable currentStmt: stmt = Cil.dummyStmt
>
> to your visitor class, and
>
> currentStmt <- s;
>
> to your vstmt visitor. Now you can access currentStmt while visiting
> instructions. I frequently do something similar to track the current
> fundec, so that I can use it to make temp vars in the visitor.
>
> -- Matt
>
>
>
>
> > -----Original Message-----
> > From: cil-users-admin@...
> > [mailto:cil-users-admin@...] On Behalf Of Roy
> > Sent: Wednesday, January 18, 2006 11:19 AM
> > To: cil-users@...
> > Subject: [CIL users] Access to Parent Structure
> >
> > Howdy,
> >
> > I often want to look through the individual instructions of a
> > program looking for an instruction of interest. Upon finding
> > such an instruction, I then wish to look at (as an example)
> > the other instructions in instruction block that forms the
> > CIL statement containing the instruction of interest.
> >
> > This pattern of wanting access to the parent type (stmt) from
> > a more specialized type (instr) often appears in my code. As
> > such, a lot of my CIL code uses a custom instr visitor siting
> > within the stmt visitor, so that I have easy access to the
> > stmt encompassing an instr. But this seems like a waste.
> >
> > Is there a mechanism for accessing a parent type from a more
> > specialized type in CIL?
> >
> > Peace,
> > -Roy
> >
> >
> >
> > -------------------------------------------------------
> > This SF.net email is sponsored by: Splunk Inc. Do you grep
> > through log files for problems? Stop! Download the new AJAX
> > search engine that makes searching your log files as easy as
> > surfing the web. DOWNLOAD SPLUNK!
> > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&;
> > dat=121642
> > _______________________________________________
> > CIL-users mailing list
> > CIL-users@...
> > https://lists.sourceforge.net/lists/listinfo/cil-users
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
CIL-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cil-users