<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div>Hi everybody,</div><div><br></div><div>I am trying to write a recursive AST visitor that detects all read/write accesses of global</div><div>variables within the body of a given function declaration.</div><div><br></div><div>My Questions are:</div><div><br></div><div>1) How to detect read/write accesses (for a given function) in a simple way?</div><div>2) How to detect if a variable is global?<br></div><div><br></div><div>Currently I am experimenting with the following code...is it going into the right direction?</div><div><br></div><div>I hope someone can help...?</div><div><br></div><div>Thanks in advance!!!</div><div>Peter<br></div><div><br></div><div>bool VisitFunctionDecl (clang::FunctionDecl* decl)<br>{<span class="tab"></span><span class="tab">   <br>    if
 (decl->isThisDeclarationADefinition() && decl->hasBody())<br>    {<br></span></div><div>    clang::Stmt *stmt = decl->getBody();<br>    <br>        for (clang::Stmt::child_iterator I = stmt->child_begin(), E = stmt->child_end(); I!=E; ++I)<br>        {<br>            if (clang::Stmt *child = *I) <br>            {<br>                if (child->getStmtClass()==clang::Stmt::BinaryOperatorClass)<br>                {<br>                    clang::BinaryOperator* B = llvm::cast<clang::BinaryOperator>(child);<br>   
                 if (B->isAssignmentOp())<br>                    {</div><div><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    clang::CompoundAssignOperator *assign_opterator = llvm::cast<clang::CompoundAssignOperator>(B);<br><br>                        clang::Expr *lhs = assign_opterator->getLHS();<br>                        clang::Expr *rhs = assign_opterator->getRHS();</span></div><div><br><span
 class="tab"></span></div><div><br></div><div><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    //So far so good</span></div><div><br><span class="tab"></span></div><div><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    //For the left hand side I can probably do the following.</span></div><div><br><span class="tab"></span></div><div><span class="tab">                        if(lhs->getStmtClass() == clang::Expr::DeclRefExprClass)<br>   
                     {<br>                            clang::DeclRefExpr *lExpr = llvm::cast<clang::DeclRefExpr>(lhs);<br>                            clang::ValueDecl *lValue = lExpr->getDecl();</span></div><div><span class="tab"><br></span></div><div><span class="tab">                          </span><span class="tab">   //How to find out if the lvalue is global ??</span><span class="tab">                   <br></span></div><div><span class="tab">    </span><span
 class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    </span><span class="tab">    ...<br></span></div></div></body></html>