diff options
Diffstat (limited to 'test/DSGraphs/ggfuncptr.c')
-rw-r--r-- | test/DSGraphs/ggfuncptr.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/test/DSGraphs/ggfuncptr.c b/test/DSGraphs/ggfuncptr.c new file mode 100644 index 0000000000..9349124855 --- /dev/null +++ b/test/DSGraphs/ggfuncptr.c @@ -0,0 +1,34 @@ +/* Test resolvable and unresolvable calls through function pointers: + * -- both should be retained in function graphs until resolved or until main + * -- former should get resolved in or before main() and never appear in GG + * -- latter should remain unresolved in main() and copied to GG + * -- globals in GG pointed to by latter should be marked I, but not other nodes + */ + +#include <stdlib.h> + +extern void exit_dummy(int*); + +static int X, M, Z; + +void makeCalls(void(*GpKnown)(int*), void(*GpUnknown)(int*)) +{ + if (Z == 0) GpUnknown(&X); /* pass to exit_dummy: never resolved */ + else GpKnown(&M); /* pass to knownF: resolved in main*/ + ++Z; + printf("&Z = %p\n", &Z); /* "known external": resolved here */ +} + +void knownF(int* Y) +{ + if (Y == 0) knownF(Y); /* direct call to self: resolved here */ +} + +int main(int argc, char** argv) +{ + void(*GpKnown)(int*) = knownF; + void(*GpUnknown)(int*) = exit_dummy; + Z = argc; + makeCalls(GpKnown, GpUnknown); + return 0; +} |