summaryrefslogtreecommitdiff
path: root/src/SDCCval.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/SDCCval.h')
-rw-r--r--src/SDCCval.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/SDCCval.h b/src/SDCCval.h
new file mode 100644
index 0000000..5365411
--- /dev/null
+++ b/src/SDCCval.h
@@ -0,0 +1,178 @@
+/*----------------------------------------------------------------------
+ SDCCval.h - value wrapper related header information
+ Written By - Sandeep Dutta . sandeep.dutta@usa.net (1997)
+
+ This program is free software; you can redistribute it and/or modify it
+ 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!
+-------------------------------------------------------------------------*/
+#ifndef SDCCVAL_H
+#define SDCCVAL_H
+
+#include "SDCCsymt.h"
+
+
+/* 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 */
+}
+value;
+
+typedef struct literalList
+{
+ double literalValue;
+ unsigned count;
+ struct literalList *next;
+} literalList;
+
+enum
+{
+ INIT_NODE,
+ INIT_DEEP,
+ INIT_HOLE
+};
+
+/* initializer lists use this structure */
+typedef struct initList
+{
+ int type;
+ int lineno;
+ char *filename;
+ struct designation *designation;
+ union
+ {
+ struct ast *node;
+ struct initList *deep;
+ }
+ init;
+
+ struct initList *next;
+}
+initList;
+
+enum
+ {
+ DESIGNATOR_STRUCT,
+ DESIGNATOR_ARRAY
+ };
+
+/* designated initializers */
+typedef struct designation
+ {
+ int type;
+ int lineno;
+ char *filename;
+ union
+ {
+ struct symbol *tag; /* tag part of structure */
+ int elemno; /* array element (constant expr) */
+ }
+ designator;
+
+ struct designation *next; /* next part of nested designator */
+ }
+designation;
+
+/* return values from checkConstantRange */
+typedef enum
+{
+ CCR_OK, /* evaluate at runtime */
+ CCR_OVL,
+ CCR_ALWAYS_FALSE,
+ CCR_ALWAYS_TRUE
+}
+CCR_RESULT;
+
+#define IS_VARG(x) (x->vArgs)
+
+/* forward definitions for the symbol table related functions */
+value *newValue (void);
+value *constVal (const char *);
+value *constIntVal (const char *);
+value *constCharacterVal (unsigned long v, char type);
+value *constCharVal (unsigned char v);
+value *constBoolVal (bool v);
+value *reverseVal (value *);
+value *reverseValWithType (value *);
+value *copyValue (value *);
+value *copyValueChain (value *);
+value *strVal (const char *);
+value *rawStrVal (const char *, size_t size);
+value *charVal (const char *);
+value *symbolVal (symbol *);
+void printVal (value *);
+double floatFromVal (value *);
+unsigned long ulFromVal (value *);
+unsigned long long ullFromVal (value *);
+
+/* convert a fixed16x16 type to double */
+double doubleFromFixed16x16 (TYPE_TARGET_ULONG value);
+
+/* convert a double type to fixed16x16 */
+TYPE_TARGET_ULONG fixed16x16FromDouble (double value);
+
+CCR_RESULT checkConstantRange (sym_link * var, sym_link * lit, int op, bool exchangeOps);
+value *array2Ptr (value *);
+value *valUnaryPM (value *);
+value *valComplement (value *);
+value *valNot (value *);
+value *valMult (value *, value *);
+value *valDiv (value *, value *);
+value *valMod (value *, value *);
+value *valPlus (value *, value *);
+value *valMinus (value *, value *);
+value *valShift (value *, value *, int);
+value *valCompare (value *, value *, int);
+value *valBitwise (value *, value *, int);
+value *valLogicAndOr (value *, value *, int);
+value *valCastLiteral (sym_link *, double, TYPE_TARGET_ULONGLONG);
+value *valueFromLit (double);
+initList *newiList (int, void *);
+initList *revinit (initList *);
+initList *copyIlist (initList *);
+double list2int (initList *);
+value *list2val (initList *, int);
+struct ast *list2expr (initList *);
+void resolveIvalSym (initList *, sym_link *);
+designation *newDesignation(int, void *);
+designation *revDesignation (designation *);
+designation *copyDesignation (designation *);
+initList *reorderIlist (sym_link *, initList *);
+value *valFromType (sym_link *);
+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, int size);
+literalList *copyLiteralList (literalList * src);
+unsigned long double2ul (double val);
+unsigned char byteOfVal (value *, int);
+int csdOfVal (int *topbit, int *nonzero, unsigned long long *csd_add, unsigned long long *csd_sub, value *val);
+int isEqualVal (value *, int);
+TYPE_TARGET_ULONGLONG ullFromLit (sym_link * lit);
+value * valRecastLitVal (sym_link * dtype, value * val);
+
+#endif