1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* A concatenation of varinfo1 .. varinfo4 in a shared object.  This
3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   is to check for correct functionality in a non-zero-biased ELF
4b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   executable. */
5b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
6b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Relevant compile flags are:
7b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
8b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   -Wall -g -I$prefix/include/valgrind
9b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
10b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   eg -Wall -g -I`pwd`/Inst/include/valgrind
11b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj*/
12b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
13b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h>
14b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdlib.h>
15b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <assert.h>
16b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "memcheck/memcheck.h"
17b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
18b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Cause memcheck to complain about the address "a" and so to print
19b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   its best guess as to what "a" actually is.  a must be
20b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   addressible. */
21b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
22b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid croak ( void* aV )
23b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
24b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  char* a = (char*)aV;
25b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  char* undefp = malloc(1);
26b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  char saved = *a;
27b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  assert(undefp);
28b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  *a = *undefp;
2906bc722457ffe12e056d2f40d0d2f5c8711b541fflorian  (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
30b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  *a = saved;
31b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  free(undefp);
32b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
33b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
34b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h>
35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* ------------ varinfo1 ------------ */
37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint global_u1;
39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint global_i1 = 17;
41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjchar global_u2[10];
43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjchar global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 };
45b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic int varinfo1_main ( void )
48b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  int local;
50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  char* onheap = malloc(3);
51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  assert(onheap);
52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak(onheap+1);
53b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  free(onheap);
54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( &global_u1 );
56b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( &global_i1 );
57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( &global_u2[3] );
58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( &global_i2[7] );
59b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( &local );
60b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return 0;
61b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
62b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
63b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* ------------ varinfo2 ------------ */
64b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
65b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic void foo2 ( void )
66b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
67b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  int var;
68b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  var = 1;
69b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  { char var[10];
70b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj    var[6] = 4;
71b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj    croak( &var[7] );
72b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj    { struct { double foo; float bar; } var;
73b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      croak ( 2 + (char*)&var.bar );
74b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj    }
75b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  }
76b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( 1 + (char*)&var );
77b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
78b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
79b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic int varinfo2_main ( void )
80b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
81b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  foo2();
82b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return 0;
83b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
84b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
85b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* ------------ varinfo3 ------------ */
86b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
87b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_def[10]    = {0,0,0,0,0, 0,0,0,0,0};
88b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj       char nonstatic_global_def[10] = {0,0,0,0,0, 0,0,0,0,0};
89b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_undef[10];
90b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj       char nonstatic_global_undef[10];
91b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
92b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic void bar3 ( char* p1, char* p2, char* p3, char* p4 )
93b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
94b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p1);
95b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p2);
96b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p3);
97b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p4);
98b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
99b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
100b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic void foo3 ( void )
101b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
102b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   static char static_local_def[10]    = {0,0,0,0,0, 0,0,0,0,0};
103b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj          char nonstatic_local_def[10] = {0,0,0,0,0, 0,0,0,0,0};
104b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   static char static_local_undef[10];
105b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj          char nonstatic_local_undef[10];
106b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 1 + (char*)&static_global_def );
107b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 2 + (char*)&nonstatic_global_def );
108b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 3 + (char*)&static_global_undef );
109b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 4 + (char*)&nonstatic_global_undef );
110b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   bar3( 5 + (char*)&static_local_def,
111b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         6 + (char*)&nonstatic_local_def,
112b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         7 + (char*)&static_local_undef,
113b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         8 + (char*)&nonstatic_local_undef );
114b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
115b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
116b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic int varinfo3_main ( void )
117b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
118b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  foo3();
119b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return 0;
120b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
121b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
122b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* ------------ varinfo4 ------------ */
123b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
124b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <string.h>
125b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
126b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef struct { short c1; char* c2[3]; } XX;
127b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
128b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef
129b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   struct _str { int bing; int bong; XX xyzzy[77]; }
130b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Str;
131b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
132b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
133b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic int blah4 ( int x, int y )
134b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
135b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  Str a[10];
136b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  memset(a, 0, sizeof(a));
137b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak(1 + (char*)(&a[3].xyzzy[x*y].c1));
138b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( (char*)(&a[5].bong) );
139b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) );
140b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  memset(a, 0, sizeof(a));
141b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return a[3].xyzzy[x*y].c1;
142b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
143b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline))
144b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic int varinfo4_main ( void )
145b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
146b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  fprintf(stderr, "answer is %d\n", blah4(3,7) );
147b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return 0;
148b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
149e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippestatic void inlinetest(void);
150b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* ------------ varinfo5 ------------ */
151b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
152b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid varinfo5_main ( void )
153b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
154b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   varinfo1_main();
155b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   varinfo2_main();
156b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   varinfo3_main();
157b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   varinfo4_main();
158e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   inlinetest();
159e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe}
160e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe
161e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe#define INLINE    inline __attribute__((always_inline))
162e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe
163e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippeINLINE void fun_c(int argc) {
164e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   croak(&argc);
165e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe}
166e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe
167e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippeINLINE void fun_b(int argb) {
168e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   fun_c(argb);
169e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe}
170e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe
171e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippeINLINE void fun_a(int *arga) {
172e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   fun_b(*arga);
173e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe}
174e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe
175e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippevoid inlinetest(void)
176e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe{
177e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   int i = 1;
178e2d41dc65a214f6950f42d0b02cd9cc2d932d927philippe   fun_a(&i);
179b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
180