On Sat, 2021-06-26 at 20:50 +0530, Ankur Saini wrote: > > > On 25-Jun-2021, at 9:04 PM, David Malcolm <dmalc...@redhat.com> > > wrote: > > > > On Fri, 2021-06-25 at 20:33 +0530, Ankur Saini wrote: > > > AIM for today : > > > > > > - try to create an intra-procedural link between the calls the > > > calling > > > and returning snodes > > > - figure out the program point where exploded graph would know > > > about > > > the function calls > > > - figure out how the exploded node will know which function to > > > call > > > - create enodes and eedges for the calls > > > > > > — > > > > > > PROGRESS : > > > > > > - I created an intraprocedural link between where the the > > > splitting is happening to connect the call and returning snodes. > > > like this :- > > > > > > (in supergraph.cc at "supergraph::supergraph (logger *logger)" ) > > > ``` > > > 185 if (cgraph_edge *edge = supergraph_call_edge > > > (fun, stmt)) > > > 186 { > > > 187 m_cgraph_edge_to_caller_prev_node.put(edge, > > > node_for_stmts); > > > 188 node_for_stmts = add_node (fun, bb, as_a > > > <gcall *> (stmt), NULL); > > > 189 m_cgraph_edge_to_caller_next_node.put (edge, > > > node_for_stmts); > > > 190 } > > > 191 else > > > 192 { > > > 193 gcall *call = dyn_cast<gcall *> (stmt); > > > 194 if (call) > > > 195 { > > > 196 supernode *old_node_for_stmts = > > > node_for_stmts; > > > 197 node_for_stmts = add_node (fun, bb, as_a > > > <gcall *> (stmt), NULL); > > > > ^^^^^^^^^^^^^^^^^^^^^ > > Given the dyn_cast of stmt to gcall * at line 193 you can use > > "call" > > here, without the as_a cast, as you've already got "stmt" as a > > gcall * > > as tline 193. > > ok > > > > > You might need to add a hash_map recording the mapping from such > > stmts > > to the edges, like line 189 does. I'm not sure, but you may need > > it > > later. > > but the node is being created if there is no cgraph_edge > corresponding to the call, so to what edge will I map > “node_for_stmts" to ?
Sorry; I think I got confused. Re-reading this part of my email, it doesn't make sense to me. Sorry. [...snip...] > > > > > > > > > > Q. But even if we find out which function to call, how will the > > > analyzer know which snode does that function belong ? > > > > Use this method of supergraph: > > supernode *get_node_for_function_entry (function *fun) const; > > to get the supernode for the entrypoint of a given function. > > > > You can get the function * from a fndecl via DECL_STRUCT_FUNCTION. > > so once we get fndecl, it should be comparatively smooth sailing from > there. > > My attempt to get the value of function pointer from the state : - > > - to access the region model of the state, I tried to access > “m_region_model” of that state. > - now I want to access cluster for a function pointer. > - but when looking at the accessible functions to region model class, > I couldn’t seem to find the fitting one. ( the closest I could find > was “region_model::get_reachable_svalues()” to get a set of all the > svalues reachable from that model ) In general you can use: region_model::get_rvalue to go from a tree to a symbolic value for what the analyzer "thinks" the value of that tree is at that point along the path. If it "knows" that it's a specific function pointer, then IIRC this will return a region_svalue where region_svalue::get_pointee () will (hopefully) point at the function_region representing the memory holding the code of the function. function_region::get_fndecl should then give you the tree for the specific FUNCTION_DECL, from which you can find the supergraph node etc. It looks like region_model::get_fndecl_for_call might already do most of what you need, but it looks like it bails out for the "NULL cgraph_node" case. Maybe that needs fixing, so that it returns the fndecl for that case? That already gets used in some places, so maybe try putting a breakpoint on that and see if fixing that gets you further? Hope this is helpful Dave