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