Index: lib/sanitizer_common/sanitizer_linux.cc =================================================================== --- lib/sanitizer_common/sanitizer_linux.cc +++ lib/sanitizer_common/sanitizer_linux.cc @@ -1562,7 +1562,10 @@ register int *r2 __asm__("r2") = parent_tidptr; register void *r3 __asm__("r3") = newtls; register int *r4 __asm__("r4") = child_tidptr; - register int r7 __asm__("r7") = __NR_clone; + // GCC does not allow to have frame pointer register as a clobber register + // for inline assembler, when flag -fno-omit-frame-pointer is added. By + // default, arm with mthumb mode uses r7 as a frame pointer register. + register int r8 __asm__("r8") = __NR_clone; #if __ARM_ARCH > 4 || defined (__ARM_ARCH_4T__) # define ARCH_HAS_BX @@ -1591,6 +1594,8 @@ */ /* Do the system call */ + "push {r7}\n" + "mov r7, r8\n" "swi 0x0\n" /* if (%r0 != 0) @@ -1607,9 +1612,10 @@ "mov r7, %7\n" "swi 0x0\n" "1:\n" + "pop {r7}\n" "mov %0, r0\n" : "=r"(res) - : "r"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r7), + : "r"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r8), "i"(__NR_exit) : "memory"); return res;