Browse Source

Moved some more enums into Enums.h, removed multiple defs of LH macro, fixed missed initialization in STATE

Artur K 12 years ago
parent
commit
0eab9d1db5
8 changed files with 179 additions and 182 deletions
  1. 158 0
      include/Enums.h
  2. 1 1
      include/StackFrame.h
  3. 0 4
      include/dcc.h
  4. 10 175
      include/icode.h
  5. 1 1
      include/scanner.h
  6. 2 0
      include/state.h
  7. 1 1
      include/types.h
  8. 6 0
      src/scanner.cpp

+ 158 - 0
include/Enums.h

@@ -81,7 +81,165 @@ enum opLoc
     DST,						/* Destination operand	*/
     LHS_OP						/* Left-hand side operand (for HIGH_LEVEL) */
 };
+/* LOW_LEVEL icode flags */
+enum eLLFlags
+{
+
+    B           =0x0000001,    /* uint8_t operands (value implicitly used) */
+    I           =0x0000002,    /* Immed. source */
+    NOT_HLL     =0x0000004,    /* Not HLL inst. */
+    FLOAT_OP    =0x0000008,    /* ESC or WAIT   */
+    SEG_IMMED   =0x0000010,    /* Number is relocated segment value */
+    IMPURE      =0x0000020,    /* Instruction modifies code */
+    WORD_OFF    =0x0000040,    /* Inst has uint16_t offset ie.could be address */
+    TERMINATES  =0x0000080,    /* Instruction terminates program */
+    CASE        =0x0000100,    /* Label as case part of switch */
+    SWITCH      =0x0000200,    /* Treat indirect JMP as switch stmt */
+    TARGET      =0x0000400,    /* Jump target */
+    SYNTHETIC   =0x0000800,    /* Synthetic jump instruction */
+    NO_LABEL    =0x0001000,    /* Immed. jump cannot be linked to a label */
+    NO_CODE     =0x0002000,    /* Hole in Icode array */
+    SYM_USE     =0x0004000,    /* Instruction uses a symbol */
+    SYM_DEF     =0x0008000,    /* Instruction defines a symbol */
+
+    NO_SRC      =0x0010000,    /* Opcode takes no source */
+    NO_OPS      =0x0020000,    /* Opcode takes no operands */
+    IM_OPS      =0x0040000,    /* Opcode takes implicit operands */
+    SRC_B       =0x0080000,    /* Source operand is uint8_t (dest is uint16_t) */
+#define NO_SRC_B    0xF7FFFF    /* Masks off SRC_B */
+    HLL_LABEL   =0x0100000,    /* Icode has a high level language label */
+    IM_DST      =0x0200000,	/* Implicit DST for opcode (SIGNEX) */
+    IM_SRC      =0x0400000,	/* Implicit SRC for opcode (dx:ax)	*/
+    IM_TMP_DST  =0x0800000,	/* Implicit rTMP DST for opcode (DIV/IDIV) */
+
+    JMP_ICODE   =0x1000000,    /* Jmp dest immed.op converted to icode index */
+    JX_LOOP     =0x2000000,	/* Cond jump is part of loop conditional exp */
+    REST_STK    =0x4000000	/* Stack needs to be restored after CALL */
+};
+/* Types of icodes */
+enum icodeType
+{
+    NOT_SCANNED = 0,    /* not even scanned yet */
+    LOW_LEVEL,          /* low-level icode  */
+    HIGH_LEVEL          /* high-level icode */
+};
+
 
+/* LOW_LEVEL icode opcodes */
+enum llIcode
+{
+    iCBW,		/* 0 */
+    iAAA,
+    iAAD,
+    iAAM,
+    iAAS,
+    iADC,
+    iADD,
+    iAND,
+    iBOUND,
+    iCALL,
+    iCALLF,		/* 10 */
+    iCLC,
+    iCLD,
+    iCLI,
+    iCMC,
+    iCMP,
+    iCMPS,
+    iREPNE_CMPS,
+    iREPE_CMPS,
+    iDAA,
+    iDAS,		/* 20 */
+    iDEC,
+    iDIV,
+    iENTER,
+    iESC,
+    iHLT,
+    iIDIV,
+    iIMUL,
+    iIN,
+    iINC,
+    iINS,		/* 30 */
+    iREP_INS,
+    iINT,
+    iIRET,
+    iJB,
+    iJBE,
+    iJAE,
+    iJA,
+    iJE,
+    iJNE,
+    iJL,		/* 40 */
+    iJGE,
+    iJLE,
+    iJG,
+    iJS,
+    iJNS,
+    iJO,
+    iJNO,
+    iJP,
+    iJNP,
+    iJCXZ,		/* 50 */
+    iJMP,
+    iJMPF,
+    iLAHF,
+    iLDS,
+    iLEA,
+    iLEAVE,
+    iLES,
+    iLOCK,
+    iLODS,
+    iREP_LODS,	/* 60 */
+    iLOOP,
+    iLOOPE,
+    iLOOPNE,
+    iMOV,		/* 64 */
+    iMOVS,
+    iREP_MOVS,
+    iMUL,		/* 67 */
+    iNEG,
+    iNOT,
+    iOR,   		/* 70 */
+    iOUT,
+    iOUTS,
+    iREP_OUTS,
+    iPOP,
+    iPOPA,
+    iPOPF,
+    iPUSH,
+    iPUSHA,
+    iPUSHF,
+    iRCL,		/* 80 */
+    iRCR,
+    iROL,
+    iROR,
+    iRET,		/* 84 */
+    iRETF,
+    iSAHF,
+    iSAR,
+    iSHL,
+    iSHR,
+    iSBB,		/* 90 */
+    iSCAS,
+    iREPNE_SCAS,
+    iREPE_SCAS,
+    iSIGNEX,
+    iSTC,
+    iSTD,
+    iSTI,
+    iSTOS,
+    iREP_STOS,
+    iSUB,		/* 100 */
+    iTEST,
+    iWAIT,
+    iXCHG,
+    iXLAT,
+    iXOR,
+    iINTO,
+    iNOP,
+    iREPNE,
+    iREPE,
+    iMOD		/* 110 */
+};
 /* Conditional Expression enumeration nodes and operators               */
 enum condNodeType
 {

+ 1 - 1
include/StackFrame.h

@@ -17,7 +17,7 @@ struct STKSYM
     boolT       hasMacro;	/* This type needs a macro					*/
     char        macro[10];	/* Macro name								*/
     char        name[10];   /* Name for this symbol/argument            */
-    boolT       invalid;	/* Boolean: invalid entry in formal arg list*/
+    bool        invalid;	/* Boolean: invalid entry in formal arg list*/
     STKSYM()
     {
         memset(this,0,sizeof(STKSYM));

+ 0 - 4
include/dcc.h

@@ -160,7 +160,6 @@ void	placeStkArg (ICODE *, COND_EXPR *, int);
 void	adjustActArgType (COND_EXPR *, hlType, Function *);
 
 /* Exported functions from ast.c */
-void	  removeRegFromLong (uint8_t, LOCAL_ID *, COND_EXPR *);
 std::string walkCondExpr (const COND_EXPR *exp, Function * pProc, int *);
 int       hlTypeSize (const COND_EXPR *, Function *);
 hlType	  expType (const COND_EXPR *, Function *);
@@ -178,6 +177,3 @@ int     power2 (int);
 boolT checkLongEq (LONG_STKID_TYPE, iICODE, int, Function *, Assignment &asgn, int);
 boolT checkLongRegEq (LONGID_TYPE, iICODE, int, Function *, COND_EXPR *&, COND_EXPR *&, int);
 uint8_t otherLongRegi (uint8_t, int, LOCAL_ID *);
-void insertIdx (IDX_ARRAY *, int);
-
-

+ 10 - 175
include/icode.h

@@ -6,53 +6,13 @@
 #include <vector>
 #include <list>
 #include <bitset>
+#include <llvm/ADT/ilist.h>
+#include <llvm/ADT/ilist_node.h>
 #include <llvm/MC/MCInst.h>
 #include <llvm/MC/MCAsmInfo.h>
 #include "Enums.h"
 //enum condId;
 struct LOCAL_ID;
-/* LOW_LEVEL icode flags */
-enum eLLFlags
-{
-
-    B           =0x0000001,    /* uint8_t operands (value implicitly used) */
-    I           =0x0000002,    /* Immed. source */
-    NOT_HLL     =0x0000004,    /* Not HLL inst. */
-    FLOAT_OP    =0x0000008,    /* ESC or WAIT   */
-    SEG_IMMED   =0x0000010,    /* Number is relocated segment value */
-    IMPURE      =0x0000020,    /* Instruction modifies code */
-    WORD_OFF    =0x0000040,    /* Inst has uint16_t offset ie.could be address */
-    TERMINATES  =0x0000080,    /* Instruction terminates program */
-    CASE        =0x0000100,    /* Label as case part of switch */
-    SWITCH      =0x0000200,    /* Treat indirect JMP as switch stmt */
-    TARGET      =0x0000400,    /* Jump target */
-    SYNTHETIC   =0x0000800,    /* Synthetic jump instruction */
-    NO_LABEL    =0x0001000,    /* Immed. jump cannot be linked to a label */
-    NO_CODE     =0x0002000,    /* Hole in Icode array */
-    SYM_USE     =0x0004000,    /* Instruction uses a symbol */
-    SYM_DEF     =0x0008000,    /* Instruction defines a symbol */
-
-    NO_SRC      =0x0010000,    /* Opcode takes no source */
-    NO_OPS      =0x0020000,    /* Opcode takes no operands */
-    IM_OPS      =0x0040000,    /* Opcode takes implicit operands */
-    SRC_B       =0x0080000,    /* Source operand is uint8_t (dest is uint16_t) */
-#define NO_SRC_B    0xF7FFFF    /* Masks off SRC_B */
-    HLL_LABEL   =0x0100000,    /* Icode has a high level language label */
-    IM_DST      =0x0200000,	/* Implicit DST for opcode (SIGNEX) */
-    IM_SRC      =0x0400000,	/* Implicit SRC for opcode (dx:ax)	*/
-    IM_TMP_DST  =0x0800000,	/* Implicit rTMP DST for opcode (DIV/IDIV) */
-
-    JMP_ICODE   =0x1000000,    /* Jmp dest immed.op converted to icode index */
-    JX_LOOP     =0x2000000,	/* Cond jump is part of loop conditional exp */
-    REST_STK    =0x4000000	/* Stack needs to be restored after CALL */
-};
-
-/*  Parser flags  */
-#define TO_REG      0x000100    /* rm is source  */
-#define S_EXT       0x000200    /* sign extend   */
-#define OP386       0x000400    /* 386 op-code   */
-#define NSP         0x000800    /* NOT_HLL if SP is src or dst */
-#define ICODEMASK   0xFF00FF    /* Masks off parser flags */
 
 /* LOW_LEVEL icode, DU flag bits */
 enum eDuFlags
@@ -72,130 +32,6 @@ static const char *const wordReg[21] = {"ax", "cx", "dx", "bx", "sp", "bp",
 
 #include "state.h"			// State depends on INDEXBASE, but later need STATE
 
-/* Types of icodes */
-enum icodeType
-{
-    NOT_SCANNED = 0,    /* not even scanned yet */
-    LOW_LEVEL,          /* low-level icode  */
-    HIGH_LEVEL          /* high-level icode */
-};
-
-
-/* LOW_LEVEL icode opcodes */
-enum llIcode
-{
-    iCBW,		/* 0 */
-    iAAA,
-    iAAD,
-    iAAM,
-    iAAS,
-    iADC,
-    iADD,
-    iAND,
-    iBOUND,
-    iCALL,
-    iCALLF,		/* 10 */
-    iCLC,
-    iCLD,
-    iCLI,
-    iCMC,
-    iCMP,
-    iCMPS,
-    iREPNE_CMPS,
-    iREPE_CMPS,
-    iDAA,
-    iDAS,		/* 20 */
-    iDEC,
-    iDIV,
-    iENTER,
-    iESC,
-    iHLT,
-    iIDIV,
-    iIMUL,
-    iIN,
-    iINC,
-    iINS,		/* 30 */
-    iREP_INS,
-    iINT,
-    iIRET,
-    iJB,
-    iJBE,
-    iJAE,
-    iJA,
-    iJE,
-    iJNE,
-    iJL,		/* 40 */
-    iJGE,
-    iJLE,
-    iJG,
-    iJS,
-    iJNS,
-    iJO,
-    iJNO,
-    iJP,
-    iJNP,
-    iJCXZ,		/* 50 */
-    iJMP,
-    iJMPF,
-    iLAHF,
-    iLDS,
-    iLEA,
-    iLEAVE,
-    iLES,
-    iLOCK,
-    iLODS,
-    iREP_LODS,	/* 60 */
-    iLOOP,
-    iLOOPE,
-    iLOOPNE,
-    iMOV,		/* 64 */
-    iMOVS,
-    iREP_MOVS,
-    iMUL,		/* 67 */
-    iNEG,
-    iNOT,
-    iOR,   		/* 70 */
-    iOUT,
-    iOUTS,
-    iREP_OUTS,
-    iPOP,
-    iPOPA,
-    iPOPF,
-    iPUSH,
-    iPUSHA,
-    iPUSHF,
-    iRCL,		/* 80 */
-    iRCR,
-    iROL,
-    iROR,
-    iRET,		/* 84 */
-    iRETF,
-    iSAHF,
-    iSAR,
-    iSHL,
-    iSHR,
-    iSBB,		/* 90 */
-    iSCAS,
-    iREPNE_SCAS,
-    iREPE_SCAS,
-    iSIGNEX,
-    iSTC,
-    iSTD,
-    iSTI,
-    iSTOS,
-    iREP_STOS,
-    iSUB,		/* 100 */
-    iTEST,
-    iWAIT,
-    iXCHG,
-    iXLAT,
-    iXOR,
-    iINTO,
-    iNOP,
-    iREPNE,
-    iREPE,
-    iMOD		/* 110 */
-};
 struct BB;
 struct Function;
 struct STKFRAME;
@@ -379,19 +215,18 @@ struct ICODE
     /* Def/Use of registers and stack variables */
     struct DU_ICODE
     {
+        DU_ICODE()
+        {
+            def.reset();
+            use.reset();
+            lastDefRegi.reset();
+        }
         std::bitset<32> def;        // For Registers: position in bitset is reg index
         std::bitset<32> use;	// For Registers: position in uint32_t is reg index
         std::bitset<32> lastDefRegi;// Bit set if last def of this register in BB
     };
     struct DU1
     {
-        struct DefUse
-        {
-            int Reg; // used register
-            int DefLoc;
-            std::vector<std::list<ICODE>::iterator > useLoc; // use locations [MAX_USES]
-
-        };
         struct Use
         {
             int Reg; // used register
@@ -408,8 +243,8 @@ struct ICODE
 
         };
         int     numRegsDef;             /* # registers defined by this inst */
-        uint8_t	regi[MAX_REGS_DEF];	/* registers defined by this inst   */
-        Use     idx[MAX_REGS_DEF];
+        uint8_t	regi[3];	/* registers defined by this inst   */
+        Use     idx[3];
         //int     idx[MAX_REGS_DEF][MAX_USES];	/* inst that uses this def  */
         bool    used(int regIdx)
         {

+ 1 - 1
include/scanner.h

@@ -2,6 +2,6 @@
  * (C) Cristina Cifuentes, Jeff Ledermann
  */
 
-#define LH(p)  ((int)((uint8_t *)(p))[0] + ((int)((uint8_t *)(p))[1] << 8))
+//#define LH(p)  ((int)((uint8_t *)(p))[0] + ((int)((uint8_t *)(p))[1] << 8))
 /* Extracts reg bits from middle of mod-reg-rm uint8_t */
 #define REG(x)  ((uint8_t)(x & 0x38) >> 3)

+ 2 - 0
include/state.h

@@ -21,7 +21,9 @@ struct STATE
     void checkStartup();
     STATE() : IP(0)
     {
+        JCond.regi=0;
         JCond.immed=0;
+
         memset(r,0,sizeof(int16_t)*INDEXBASE);
         memset(f,0,sizeof(uint8_t)*INDEXBASE);
     }

+ 1 - 1
include/types.h

@@ -34,7 +34,7 @@ typedef unsigned char boolT; /* 8 bits   */
 /* Macro reads a LH word from the image regardless of host convention */
 /* Returns a 16 bit quantity, e.g. C000 is read into an Int as C000 */
 //#define LH(p)  ((int16)((byte *)(p))[0] + ((int16)((byte *)(p))[1] << 8))
-#define LH(p)    ((word)((byte *)(p))[0]  + ((word)((byte *)(p))[1] << 8))
+#define LH(p)    ((uint16_t)((uint8_t *)(p))[0]  + ((uint16_t)((uint8_t *)(p))[1] << 8))
 
 /* Macro reads a LH word from the image regardless of host convention */
 /* Returns a signed quantity, e.g. C000 is read into an Int as FFFFC000 */

+ 6 - 0
src/scanner.cpp

@@ -9,6 +9,12 @@
 
 #include "dcc.h"
 #include "scanner.h"
+/*  Parser flags  */
+#define TO_REG      0x000100    /* rm is source  */
+#define S_EXT       0x000200    /* sign extend   */
+#define OP386       0x000400    /* 386 op-code   */
+#define NSP         0x000800    /* NOT_HLL if SP is src or dst */
+#define ICODEMASK   0xFF00FF    /* Masks off parser flags */
 
 static void rm(int i);
 static void modrm(int i);