Applied patch #2762516
[fw/sdcc] / src / SDCCval.h
index fbb0dbcc8c0bc57cb0efbdf47fd06fc35613e2a6..61217835db23848e3b47236efe06e4d959df406a 100644 (file)
@@ -6,35 +6,47 @@
   under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 2, or (at your option) any
   later version.
-  
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
-  
+
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-  
+
   In other words, you are welcome to use, share and improve this program.
   You are forbidden to forbid anyone else to use, share and improve
-  what you give them.   Help stamp out software-hoarding!  
+  what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 #ifndef SDCCVAL_H
 #define SDCCVAL_H
 
 #include "SDCCsymt.h"
 
+
+/* double to unsigned long conversion */
+/*
+ * See ISO/IEC 9899, chapter 6.3.1.4 Real floating and integer:
+ * If the value of the integral part cannot be represented by the integer type, the behavior is undefined.
+ * This shows up on Mac OS X i386 platform which useus SSE unit instead of the x87 FPU for floating-point operations
+ */
+/*
+ * on Mac OS X ppc (long) 2147483648.0 equals to 2147483647, so we explicitely convert it to 0x80000000
+ * on other known platforms (long) 2147483648.0 equals to -2147483648
+ */
+#define double2ul(val)  (((val) < 0) ? (((val) < -2147483647.0) ? 0x80000000UL : (unsigned long) -((long) -(val))) : (unsigned long) (val))
+
 /* value wrapper */
 typedef struct value
   {
-    char name[SDCC_NAME_MAX + 1];      /* operand accessing this value */
-    sym_link *type;            /* start of type chain     */
-    sym_link *etype;           /* end of type chain       */
-    symbol *sym;               /* Original Symbol         */
-    struct value *next;                /* used in initializer list */
-    unsigned vArgs:1;          /* arg list ended with variable arg           */
-
+    char name[SDCC_NAME_MAX + 1]; /* operand accessing this value     */
+    sym_link *type;               /* start of type chain              */
+    sym_link *etype;              /* end of type chain                */
+    symbol *sym;                  /* Original Symbol                  */
+    struct value *next;           /* used in initializer list         */
+    unsigned vArgs:1;             /* arg list ended with variable arg */
   }
 value;
 
@@ -45,7 +57,6 @@ typedef struct literalList
     struct literalList *next;
 } literalList;
 
-
 enum
   {
     INIT_NODE,
@@ -61,8 +72,8 @@ typedef struct initList
     char *filename;
     union
       {
-       struct ast *node;
-       struct initList *deep;
+        struct ast *node;
+        struct initList *deep;
       }
     init;
 
@@ -80,12 +91,12 @@ typedef enum
   }
 CCR_RESULT;
 
-#define  IS_VARG(x)            (x->vArgs)
+#define  IS_VARG(x)             (x->vArgs)
 
 /* forward definitions for the symbol table related functions */
-void initValue ();
-value *newValue ();
+value *newValue (void);
 value *constVal (const char *);
+value *constCharVal (unsigned char);
 value *reverseVal (value *);
 value *reverseValWithType (value *);
 value *copyValue (value *);
@@ -95,6 +106,7 @@ value *charVal (const char *);
 value *symbolVal (symbol *);
 void printVal (value *);
 double floatFromVal (value *);
+unsigned long ulFromVal (value *);
 
 /* convert a fixed16x16 type to double */
 double doubleFromFixed16x16(TYPE_TARGET_ULONG value);
@@ -126,13 +138,13 @@ value *list2val (initList *);
 struct ast *list2expr (initList *);
 void resolveIvalSym (initList *, sym_link *);
 value *valFromType (sym_link *);
-value *constFloatVal (char *);
-value *constFixed16x16Val (char *);
+value *constFloatVal (const char *);
+value *constFixed16x16Val (const char *);
 int getNelements (sym_link *, initList *);
 value *valForArray (struct ast *);
 value *valForStructElem (struct ast *, struct ast *);
 value *valForCastAggr (struct ast *, sym_link *, struct ast *, int);
 value *valForCastArr (struct ast * , sym_link *);
-bool convertIListToConstList(initList *src, literalList **lList);
+bool convertIListToConstList(initList *src, literalList **lList, int size);
 literalList *copyLiteralList(literalList *src);
 #endif