/**************************************************************************** * dcc project general header * (C) Cristina Cifuentes, Mike van Emmerik ****************************************************************************/ #pragma once //TODO: Remove boolT #include #include #include #include #include "Enums.h" #include "types.h" #include "ast.h" #include "icode.h" #include "locident.h" #include "error.h" #include "graph.h" #include "bundle.h" #include "Procedure.h" #include "BasicBlock.h" class Project; /* CALL GRAPH NODE */ struct CALL_GRAPH { ilFunction proc; /* Pointer to procedure in pProcList */ std::vector outEdges; /* array of out edges */ public: void write(); CALL_GRAPH() : outEdges(0) { } public: void writeNodeCallGraph(int indIdx); bool insertCallGraph(ilFunction caller, ilFunction callee); bool insertCallGraph(Function *caller, ilFunction callee); void insertArc(ilFunction newProc); }; //extern CALL_GRAPH * callGraph; /* Pointer to the head of the call graph */ extern bundle cCode; /* Output C procedure's declaration and code */ /**** Global variables ****/ extern char *asm1_name, *asm2_name; /* Assembler output filenames */ typedef struct { /* Command line option flags */ unsigned verbose : 1; unsigned VeryVerbose : 1; unsigned asm1 : 1; /* Early disassembly listing */ unsigned asm2 : 1; /* Disassembly listing after restruct */ unsigned Map : 1; unsigned Stats : 1; unsigned Interact : 1; /* Interactive mode */ unsigned Calls : 1; /* Follow register indirect calls */ char filename[80]; /* The input filename */ } OPTION; extern OPTION option; /* Command line options */ #include "BinaryImage.h" extern LivenessSet duReg[30]; /* def/use bits for registers */ //extern uint32_t duReg[30]; /* def/use bits for registers */ extern LivenessSet maskDuReg[30]; /* masks off du bits for regs */ /* Registers used by icode instructions */ /* Memory map states */ enum eAreaType { BM_UNKNOWN = 0, /* Unscanned memory */ BM_DATA = 1, /* Data */ BM_CODE = 2, /* Code */ BM_IMPURE = 3 /* Used as Data and Code*/ }; /* Intermediate instructions statistics */ struct STATS { int numBBbef; /* number of basic blocks initially */ int numBBaft; /* number of basic blocks at the end */ int nOrder; /* n-th order */ int numLLIcode; /* number of low-level Icode instructions */ int numHLIcode; /* number of high-level Icode instructions */ int totalLL; /* total number of low-level Icode insts */ int totalHL; /* total number of high-level Icod insts */ }; extern STATS stats; /* Icode statistics */ /**** Global function prototypes ****/ class DccFrontend { void LoadImage(Project &proj); void parse(Project &proj); std::string m_fname; public: DccFrontend(const std::string &fname) : m_fname(fname) { } bool FrontEnd(); /* frontend.c */ }; void udm(void); /* udm.c */ void freeCFG(BB * cfg); /* graph.c */ BB * newBB(BB *, int, int, uint8_t, int, Function *); /* graph.c */ void BackEnd(char *filename, CALL_GRAPH *); /* backend.c */ extern char *cChar(uint8_t c); /* backend.c */ eErrorId scan(uint32_t ip, ICODE &p); /* scanner.c */ void parse (CALL_GRAPH * *); /* parser.c */ extern int strSize (const uint8_t *, char); /* parser.c */ //void disassem(int pass, Function * pProc); /* disassem.c */ void interactDis(Function *, int initIC); /* disassem.c */ bool JmpInst(llIcode opcode); /* idioms.c */ queue::iterator appendQueue(queue &Q, BB *node); /* reducible.c */ void SetupLibCheck(void); /* chklib.c */ void CleanupLibCheck(void); /* chklib.c */ bool LibCheck(Function &p); /* chklib.c */ /* Exported functions from procs.c */ boolT insertCallGraph (CALL_GRAPH *, ilFunction, ilFunction); /* Exported functions from hlicode.c */ char *writeJcond (const HLTYPE &, Function *, int *); char *writeJcondInv (HLTYPE, Function *, int *); /* Exported funcions from locident.c */ boolT checkLongEq (LONG_STKID_TYPE, iICODE, int, Function *, Assignment &asgn, LLInst &atOffset); boolT checkLongRegEq (LONGID_TYPE, iICODE, int, Function *, Assignment &asgn, LLInst &); eReg otherLongRegi(eReg, int, LOCAL_ID *); extern const char *indentStr(int level);