about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2019-03-28 15:24:35 -0700
committerVineet Gupta <vgupta@synopsys.com>2019-11-01 09:29:21 -0700
commit76db6bd7913b0bd452eb0cd7fe11899abffe90ab (patch)
tree3a16b7d65a6b37908ad410c83be3d039f774cb02
parente8d28fb62972cc4655a6733a322321396b5ec451 (diff)
downloadglibc-76db6bd7913b0bd452eb0cd7fe11899abffe90ab.tar.gz
glibc-76db6bd7913b0bd452eb0cd7fe11899abffe90ab.tar.xz
glibc-76db6bd7913b0bd452eb0cd7fe11899abffe90ab.zip
gcc PR 88409: miscompilation due to missing cc clobber in longlong.h macros
simple test such as below was failing.

| void main(int argc, char *argv[])
| {
|    size_t total_time = 115424;                       // expected 115.424
|    double secs = (double)total_time/(double)1000;
|    printf("%s %d %lf\n", "secs", total_time, secs);  // prints 113.504
|    printf("%d\n", (size_t)secs);
| }

The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem()
which uses the __arc__ specific inline asm macros from longlong.h which
were causing miscompilation.

include/
2019-03-28  Vineet Gupta <vgupta@synopsys.com>

	PR 89877

	* longlong.h [__arc__] (add_ssaaaa): Add cc clobber
	(sub_ddmmss): Likewise.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r--stdlib/longlong.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/stdlib/longlong.h b/stdlib/longlong.h
index 3dd8dc3aa8..1f0ce42042 100644
--- a/stdlib/longlong.h
+++ b/stdlib/longlong.h
@@ -199,7 +199,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
 	   : "%r" ((USItype) (ah)),					\
 	     "rICal" ((USItype) (bh)),					\
 	     "%r" ((USItype) (al)),					\
-	     "rICal" ((USItype) (bl)))
+	     "rICal" ((USItype) (bl))					\
+	   : "cc")
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub.f	%1, %4, %5\n\tsbc	%0, %2, %3"		\
 	   : "=r" ((USItype) (sh)),					\
@@ -207,7 +208,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
 	   : "r" ((USItype) (ah)),					\
 	     "rICal" ((USItype) (bh)),					\
 	     "r" ((USItype) (al)),					\
-	     "rICal" ((USItype) (bl)))
+	     "rICal" ((USItype) (bl))					\
+	   : "cc")
 
 #define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
 #ifdef __ARC_NORM__