| /* { dg-do compile } */ |
| |
| /* Ensure the sanitizer can handle very large offsets (i.e. that the hooks |
| handle offsets too large for the relevant instructions). |
| Just want to make sure this compiles without an ICE. */ |
| #ifndef ASIZE |
| # define ASIZE 0x10000000000UL |
| #endif |
| |
| typedef __UINT64_TYPE__ uint64_t; |
| |
| #if __LONG_MAX__ < 8 * ASIZE |
| # undef ASIZE |
| # define ASIZE 4096 |
| #endif |
| |
| extern void abort (void); |
| |
| int __attribute__((noinline)) |
| foo (const char *s) |
| { |
| if (!s) |
| return 1; |
| if (s[0] != 'a') |
| abort (); |
| s += ASIZE - 1; |
| if (s[0] != 'b') |
| abort (); |
| return 0; |
| } |
| |
| int (*fn) (const char *) = foo; |
| |
| int __attribute__((noinline)) |
| bar (void) |
| { |
| char s[ASIZE]; |
| s[0] = 'a'; |
| s[ASIZE - 1] = 'b'; |
| foo (s); |
| foo (s); |
| return 0; |
| } |
| |
| int __attribute__((noinline)) |
| baz (long i) |
| { |
| if (i) |
| return fn (0); |
| else |
| { |
| char s[ASIZE]; |
| s[0] = 'a'; |
| s[ASIZE - 1] = 'b'; |
| foo (s); |
| foo (s); |
| return fn (0); |
| } |
| } |
| |
| int __attribute__((noinline)) |
| very_large_offset (int *p) |
| { |
| char init_array[(uint64_t)0xfefefef]; |
| char other_array[(uint64_t)0xfefefef]; |
| return (int)init_array[p[1]] + (int)other_array[p[0]]; |
| } |
| |