Not sure this is exactly what you mean, but static analysers like clang parse code, determine all possible branches the code could take, and check for errors. For example, given the code..
1. if(somefunction()){
2. this_will_break();
3. } else {
4. if(anotherfunction()){
5. printf("%i", str(something));
6. }
7. print("this is fine");
8. }
You will get output along the lines:
Line 1. Taking true branch.
Line 1. Error: Function this_will_break is not defined
Line 4. Taking true branch.
Line 5. Warning: Function passed incompatible type
You could potentially graph these paths, but I don't see why you would want to (it wouldn't really show anything)
Another possibly similar idea is Gprof2Dot, which takes profiling data, and draws a hierarchal Graphviz chart showing how long each function takes to run, which function called it and so on.
A final thing springs to mind, which is nodal based applications like Shake, or Quartz Composer - ways of "programming visually", representing code like Add(Blur(MyImage), Blur(AlphaChannel))
as:
[MyImage]--->[Blur]----\/
[Add]
/\
[AlphaChannel]----------
Those aren't logical graphs, but they are ways of visually representing code, which might possibly give you some ideas.. maybe.. unless I'm totally misunderstanding..