diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-07-16 21:48:38 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-07-16 21:48:38 +0000 |
commit | 71b35cd0fe1c17255e1c49af3e8f592725ed1721 (patch) | |
tree | 7a016441072febce8ba2af14f57dc0f4d0e8e967 /test/Analysis | |
parent | a53e3da92c6dea476c58f99da6d3c5f75be38adc (diff) |
Tests for globals with different kinds of behavior in DS Analysis.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7191 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/DSGraph/globalgraph.c | 80 | ||||
-rw-r--r-- | test/Analysis/DSGraph/globals.c | 43 |
2 files changed, 123 insertions, 0 deletions
diff --git a/test/Analysis/DSGraph/globalgraph.c b/test/Analysis/DSGraph/globalgraph.c new file mode 100644 index 0000000000..cd50d49d7b --- /dev/null +++ b/test/Analysis/DSGraph/globalgraph.c @@ -0,0 +1,80 @@ +#include <stdio.h> + +typedef struct Tree_struct { + int data; + struct Tree_struct *left, *right; +} Tree; + +static Tree T1, T2, T3, T4, T5, T6, T7; +static Tree *Root, *ANode; +static int N = 4107; + +/* forces *Tb->right to be collapsed */ +void makeMore(Tree* Ta, Tree* Tb) +{ + Ta->left = &T1; + Ta->right = &T2; + Tb->left = &T4; + /* Tb->right = &T5; */ + Tb->right = (Tree*) (((char*) &T5) + 5); /* point to fifth byte of T5 */ +} + +/* multiple calls to this should force globals to be merged in TD graph + * but not in globals graph + */ +void makeData(Tree* Ta) +{ + static int N = 101; + Ta->data = N; +} + +void makeRoots() +{ + T1.left = &T2; + makeMore(&T1, &T3); +} + +/* BU graph shows T1.left->{T2}, but TD graph should show T1.left->{T1,T2,T6,H} + * and T.right->{T1,T2,T6,H} */ +void makeAfter1() +{ + T1.left = &T2; +} + +/* BU graph shows: + * T2.right->{H}, H.left->{T6}; H.right->{T2}, T3.left<->T7.left + * + * TD graph and GlobalsGraph should show: + * T2.right->{T1,T2,T6,H} + * H.left->{T1,T2,T6,H}; H.right->{T1,T2,T6,H}. + * T3.left->{T4,T7}, T3.right->{T4,T7}, T7.left->{T3} + */ +void makeAfter2() +{ + Tree* newT = (Tree*) malloc(sizeof(Tree)); + T2.right = newT; /* leaked: do not access T2 in main */ + newT->left = &T6; + newT->right = &T2; + + T3.left = &T7; + T7.left = &T3; +} + +/* BU and TD graphs should have no reachable globals, forcing callers and + * callees to get all globals from GlobalsGraph + */ +void makePass() +{ + makeAfter1(); + makeAfter2(); +} + +int main() +{ + makeRoots(); + T3.right = &T4; + makeData(&T3); + makeData(&T5); + makePass(); + printf("T3.data = %d\n", T3.data); +} diff --git a/test/Analysis/DSGraph/globals.c b/test/Analysis/DSGraph/globals.c new file mode 100644 index 0000000000..f0fb55d21d --- /dev/null +++ b/test/Analysis/DSGraph/globals.c @@ -0,0 +1,43 @@ +/* Test globals used and unused within different parts of a program */ + +#include <stdlib.h> + +extern void exit_dummy(int*); + +static int** G; +static int N, M; + +void +foo(int *Z) /* accesses globals printf and format string, and */ +{ /* N = alloca(int) from test() */ + if (Z == 0) exit_dummy(Z); /* call to external function */ + ++*Z; + printf("N = %d\n", *Z); +} + +void leaf2(int* Y) +{ + if (Y == 0) exit_dummy(Y); /* second call to external function */ +} + +void +test(int* X) /* accesses global G */ +{ /* allocates G = malloc(int*) and N = alloca(int) */ + if (X == 0) + X = &N; + G = (int**) alloca(sizeof(int*)); + *G = &N; + **G = 10; + foo(*G); + leaf2(*G); + *X = **G; + /* free(G); */ +} + +int +main() /* only accesses global N */ +{ + /* N = 0; */ + test(0 /*&N*/); + return 0; +} |