eval.h

来自「一个很有名的硬件模拟器。可以模拟CPU」· C头文件 代码 · 共 208 行

H
208
字号
/* expr.h - expression evaluator interfaces *//* SimpleScalar(TM) Tool Suite * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. * All Rights Reserved.  *  * THIS IS A LEGAL DOCUMENT, BY USING SIMPLESCALAR, * YOU ARE AGREEING TO THESE TERMS AND CONDITIONS. *  * No portion of this work may be used by any commercial entity, or for any * commercial purpose, without the prior, written permission of SimpleScalar, * LLC (info@simplescalar.com). Nonprofit and noncommercial use is permitted * as described below. *  * 1. SimpleScalar is provided AS IS, with no warranty of any kind, express * or implied. The user of the program accepts full responsibility for the * application of the program and the use of any results. *  * 2. Nonprofit and noncommercial use is encouraged. SimpleScalar may be * downloaded, compiled, executed, copied, and modified solely for nonprofit, * educational, noncommercial research, and noncommercial scholarship * purposes provided that this notice in its entirety accompanies all copies. * Copies of the modified software can be delivered to persons who use it * solely for nonprofit, educational, noncommercial research, and * noncommercial scholarship purposes provided that this notice in its * entirety accompanies all copies. *  * 3. ALL COMMERCIAL USE, AND ALL USE BY FOR PROFIT ENTITIES, IS EXPRESSLY * PROHIBITED WITHOUT A LICENSE FROM SIMPLESCALAR, LLC (info@simplescalar.com). *  * 4. No nonprofit user may place any restrictions on the use of this software, * including as modified by the user, by any other authorized user. *  * 5. Noncommercial and nonprofit users may distribute copies of SimpleScalar * in compiled or executable form as set forth in Section 2, provided that * either: (A) it is accompanied by the corresponding machine-readable source * code, or (B) it is accompanied by a written offer, with no time limit, to * give anyone a machine-readable copy of the corresponding source code in * return for reimbursement of the cost of distribution. This written offer * must permit verbatim duplication by anyone, or (C) it is distributed by * someone who received only the executable form, and is accompanied by a * copy of the written offer of source code. *  * 6. SimpleScalar was developed by Todd M. Austin, Ph.D. The tool suite is * currently maintained by SimpleScalar LLC (info@simplescalar.com). US Mail: * 2395 Timbercrest Court, Ann Arbor, MI 48105. *  * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. */#ifndef EVAL_H#define EVAL_H#include <stdio.h>#include "host.h"#include "misc.h"#include "machine.h"/* forward declarations */struct eval_state_t;struct eval_value_t;/* an identifier evaluator, when an evaluator is instantiated, the user   must supply a function of this type that returns the value of identifiers   encountered in expressions */typedef struct eval_value_t		  /* value of the identifier */(*eval_ident_t)(struct eval_state_t *es); /* ident string in es->tok_buf *//* expression tokens */enum eval_token_t {  tok_ident,		/* user-valued identifiers */  tok_const,		/* numeric literals */  tok_plus,		/* `+' */  tok_minus,		/* `-' */  tok_mult,		/* `*' */  tok_div,		/* `/' */  tok_oparen,		/* `(' */  tok_cparen,		/* `)' */  tok_eof,		/* end of file */  tok_whitespace,	/* ` ', `\t', `\n' */  tok_invalid		/* unrecognized token */};/* an evaluator state record */struct eval_state_t {  char *p;			/* ptr to next char to consume from expr */  char *lastp;			/* save space for token peeks */  eval_ident_t f_eval_ident;	/* identifier evaluator */  void *user_ptr;		/* user-supplied argument pointer */  char tok_buf[512];		/* text of last token returned */  enum eval_token_t peek_tok;	/* peek buffer, for one token look-ahead */};/* evaluation errors */enum eval_err_t {  ERR_NOERR,			/* no error */  ERR_UPAREN,			/* unmatched parenthesis */  ERR_NOTERM,			/* expression term is missing */  ERR_DIV0,			/* divide by zero */  ERR_BADCONST,			/* badly formed constant */  ERR_BADEXPR,			/* badly formed constant */  ERR_UNDEFVAR,			/* variable is undefined */  ERR_EXTRA,			/* extra characters at end of expression */  ERR_NUM};/* expression evaluation error, this must be a global */extern enum eval_err_t eval_error /* = ERR_NOERR */;/* enum eval_err_t -> error description string map */extern char *eval_err_str[ERR_NUM];/* expression value types */enum eval_type_t {  et_int,			/* signed integer result */  et_uint,			/* unsigned integer result */  et_addr,			/* address value */#ifdef HOST_HAS_QWORD  et_qword,			/* unsigned qword length integer result */  et_sqword,			/* signed qword length integer result */#endif /* HOST_HAS_QWORD */  et_float,			/* single-precision floating point value */  et_double,			/* double-precision floating point value */  et_symbol,			/* non-numeric result (!allowed in exprs)*/  et_NUM};/* non-zero if type is an integral type */#ifdef HOST_HAS_QWORD#define EVAL_INTEGRAL(TYPE)						\  ((TYPE) == et_int || (TYPE) == et_uint || (TYPE) == et_addr		\   || (TYPE) == et_qword || (TYPE) == et_sqword)#else /* !HOST_HAS_QWORD */#define EVAL_INTEGRAL(TYPE)						\  ((TYPE) == et_int || (TYPE) == et_uint || (TYPE) == et_addr)#endif /* HOST_HAS_QWORD *//* enum eval_type_t -> expression type description string map */extern char *eval_type_str[et_NUM];/* an expression value */struct eval_value_t {  enum eval_type_t type;		/* type of expression value */  union {    int as_int;				/* value for type == et_int */    unsigned int as_uint;		/* value for type == et_uint */    md_addr_t as_addr;			/* value for type == et_addr */#ifdef HOST_HAS_QWORD    qword_t as_qword;			/* value for type == ec_qword */    sqword_t as_sqword;			/* value for type == ec_sqword */#endif /* HOST_HAS_QWORD */    float as_float;			/* value for type == et_float */    double as_double;			/* value for type == et_double */    char *as_symbol;			/* value for type == et_symbol */  } value;};/* * expression value arithmetic conversions *//* eval_value_t (any numeric type) -> double */double eval_as_double(struct eval_value_t val);/* eval_value_t (any numeric type) -> float */float eval_as_float(struct eval_value_t val);#ifdef HOST_HAS_QWORD/* eval_value_t (any numeric type) -> qword_t */qword_t eval_as_qword(struct eval_value_t val);/* eval_value_t (any numeric type) -> sqword_t */sqword_t eval_as_sqword(struct eval_value_t val);#endif /* HOST_HAS_QWORD *//* eval_value_t (any numeric type) -> md_addr_t */md_addr_t eval_as_addr(struct eval_value_t val);/* eval_value_t (any numeric type) -> unsigned int */unsigned int eval_as_uint(struct eval_value_t val);/* eval_value_t (any numeric type) -> int */int eval_as_int(struct eval_value_t val);/* create an evaluator */struct eval_state_t *			/* expression evaluator */eval_new(eval_ident_t f_eval_ident,	/* user ident evaluator */	 void *user_ptr);		/* user ptr passed to ident fn *//* delete an evaluator */voideval_delete(struct eval_state_t *es);	/* evaluator to delete *//* evaluate an expression, if an error occurs during evaluation, the   global variable eval_error will be set to a value other than ERR_NOERR */struct eval_value_t			/* value of the expression */eval_expr(struct eval_state_t *es,	/* expression evaluator */	  char *p,			/* ptr to expression string */	  char **endp);			/* returns ptr to 1st unused char *//* print an expression value */voideval_print(FILE *stream,		/* output stream */	   struct eval_value_t val);	/* expression value to print */#endif /* EVAL_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?