http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60109
Bug ID: 60109 Summary: __builtin_frame_address does not work as documented on ARM Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: doko at gcc dot gnu.org __builtin_frame_address does not work as documented on ARM. For a value greater or equal to 1 it returns a non null value but the returned pointer does not seem to match a frame. See the attached testcase. With tcc and clang it displays "__builtin_frame_address" while with gcc it first displays "bfa1: %s" and then segfaults if the #if is removed. amd64: $ gcc builtin_frame_address.c && ./a.out str: __builtin_frame_address bfa1: __builtin_frame_address armhf: str: __builtin_frame_address bfa1: %s $ cat builtin_frame_address.c #include <stdio.h> #include <stddef.h> void bfa3(ptrdiff_t str_offset) { printf("bfa3: %s\n", (char *)__builtin_frame_address(3) + str_offset); } void bfa2(ptrdiff_t str_offset) { printf("bfa2: %s\n", (char *)__builtin_frame_address(2) + str_offset); bfa3(str_offset); } void bfa1(ptrdiff_t str_offset) { printf("bfa1: %s\n", (char *)__builtin_frame_address(1) + str_offset); #if defined(__arm__) && !defined(__GNUC__) bfa2(str_offset); #endif } void builtin_frame_address_test(void) { char str[] = "__builtin_frame_address"; char *fp0 = __builtin_frame_address(0); printf("str: %s\n", str); bfa1(str-fp0); } int main(void) { builtin_frame_address_test(); return 0; }