OSDN Git Service

* rtl-c.scm (/use-gcc-stmt-expr?): New function.
authordevans <devans>
Mon, 23 Nov 2009 09:44:48 +0000 (09:44 +0000)
committerdevans <devans>
Mon, 23 Nov 2009 09:44:48 +0000 (09:44 +0000)
(s-sequence): Call it.

cgen/ChangeLog
cgen/rtl-c.scm

index 16a3333..7dfd128 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-22  Doug Evans  <dje@sebabeach.org>
+
+       * rtl-c.scm (/use-gcc-stmt-expr?): New function.
+       (s-sequence): Call it.
+
 2009-11-21  Doug Evans  <dje@sebabeach.org>
 
        * rtl-c.scm (s-sequence): Use gcc's statement expressions for
index 211e181..96d3c70 100644 (file)
                 ))))
 )
 
+;; Subroutine of s-sequence to simplify it.
+;; Return a boolean indicating if GCC's "statement expression" extension
+;; is necessary to implement (sequence MODE ENV EXPR-LIST).
+;; Only use GCC "statement expression" extension if necessary.
+;;
+;; Avoid using statement expressions for
+;; (sequence non-VOID-mode (error "mumble") expr).
+;; Some targets, e.g. cris, use this.
+
+(define (/use-gcc-stmt-expr? mode env expr-list)
+  (if (not (rtx-env-empty? env))
+      #t
+      (case (length expr-list)
+       ((1) #f)
+       ((2) (if (eq? (rtx-name (car expr-list)) 'error)
+                #f
+                #t))
+       (else #t)))
+)
+
 ;; Return a <c-expr> node for a `sequence'.
 ;; MODE is the mode name.
 
                              exprs)
                  "}\n"))
 
-       (let (
-             ;; Don't use GCC extension unless necessary.
-             (use-stmt-expr? (or (not (rtx-env-empty? env))
-                                 (> (length exprs) 1)))
-             )
+       (let ((use-stmt-expr? (/use-gcc-stmt-expr? mode env exprs)))
          (cx:make mode
                   (string-append
                    (if use-stmt-expr? "({ " "(")