1 2 string tls_var = "tls_string"; 3 4 __gshared string data_var = "data_string"; 5 6 __gshared string bss_var; 7 8 struct Range 9 { 10 const(void)* bot; 11 const(void)* top; // consider inclusive 12 addPtrRange13 void addPtr(const(void)* p) 14 { 15 if (!bot || p < bot) 16 bot = p; 17 if (!top || p > top) 18 top = p; 19 } 20 intersectRange21 bool intersect(Range other) 22 { 23 return (bot <= other.top && top >= other.bot); 24 } 25 } 26 testStrings()27void testStrings() 28 { 29 // check that the strings don't overlap with the variables 30 Range tls; 31 Range data; 32 Range bss; 33 Range cdata; 34 35 static string local_tls_var = "tls_string"; 36 static __gshared string local_data_var = "data_string"; 37 static __gshared string local_bss_var; 38 39 tls.addPtr(&tls_var); 40 tls.addPtr(&local_tls_var); 41 42 data.addPtr(&data_var); 43 data.addPtr(&local_data_var); 44 45 bss.addPtr(&bss_var); 46 bss.addPtr(&local_bss_var); 47 48 cdata.addPtr(tls_var.ptr); 49 cdata.addPtr(local_tls_var.ptr); 50 cdata.addPtr(data_var.ptr); 51 cdata.addPtr(local_data_var.ptr); 52 53 assert(!cdata.intersect(tls), "overlap with tls"); 54 assert(!cdata.intersect(data), "overlap with data"); 55 assert(!cdata.intersect(bss), "overlap with bss"); 56 } 57 main()58void main() 59 { 60 testStrings(); 61 } 62