2 * File expr.c - expression handling for Wine internal debugger.
4 * Copyright (C) 1997, Eric Youngdale.
12 #include "wine/winbase16.h"
66 struct datatype * cast;
73 const char * element_name;
85 const char * funcname;
94 #define EXPR_TYPE_CONST 0
95 #define EXPR_TYPE_US_CONST 1
96 #define EXPR_TYPE_SYMBOL 2
97 #define EXPR_TYPE_INTVAR 3
98 #define EXPR_TYPE_BINOP 4
99 #define EXPR_TYPE_UNOP 5
100 #define EXPR_TYPE_STRUCT 6
101 #define EXPR_TYPE_PSTRUCT 7
102 #define EXPR_TYPE_ARRAY 8
103 #define EXPR_TYPE_CALL 9
104 #define EXPR_TYPE_STRING 10
105 #define EXPR_TYPE_CAST 11
107 static char expr_list[4096];
108 static unsigned int next_expr_free = 0;
111 * This is how we turn an expression address into the actual value.
112 * This works well in the 32 bit domain - not sure at all about the
115 #define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
119 DEBUG_GetFreeExpr(void)
123 rtn = (struct expr *) &expr_list[next_expr_free];
125 next_expr_free += sizeof(struct expr);
126 assert(next_expr_free < sizeof(expr_list));
132 DEBUG_FreeExprMem(void)
138 DEBUG_TypeCastExpr(struct datatype * dt, struct expr * exp)
142 ex = DEBUG_GetFreeExpr();
144 ex->type = EXPR_TYPE_CAST;
145 ex->un.cast.cast = dt;
146 ex->un.cast.expr = exp;
151 DEBUG_IntVarExpr(const char* name)
155 ex = DEBUG_GetFreeExpr();
157 ex->type = EXPR_TYPE_INTVAR;
158 ex->un.intvar.name = name;
163 DEBUG_SymbolExpr(const char * name)
167 ex = DEBUG_GetFreeExpr();
169 ex->type = EXPR_TYPE_SYMBOL;
170 ex->un.symbol.name = name;
175 DEBUG_ConstExpr(int value)
179 ex = DEBUG_GetFreeExpr();
181 ex->type = EXPR_TYPE_CONST;
182 ex->un.constant.value = value;
187 DEBUG_StringExpr(const char * str)
191 ex = DEBUG_GetFreeExpr();
193 ex->type = EXPR_TYPE_STRING;
194 ex->un.string.str = str+1;
195 pnt = strrchr(ex->un.string.str, '"');
204 DEBUG_USConstExpr(unsigned int value)
208 ex = DEBUG_GetFreeExpr();
210 ex->type = EXPR_TYPE_CONST;
211 ex->un.u_const.value = value;
216 DEBUG_BinopExpr(int operator_type, struct expr * exp1, struct expr * exp2)
220 ex = DEBUG_GetFreeExpr();
222 ex->type = EXPR_TYPE_BINOP;
223 ex->un.binop.binop_type = operator_type;
224 ex->un.binop.exp1 = exp1;
225 ex->un.binop.exp2 = exp2;
230 DEBUG_UnopExpr(int operator_type, struct expr * exp1)
234 ex = DEBUG_GetFreeExpr();
236 ex->type = EXPR_TYPE_UNOP;
237 ex->un.unop.unop_type = operator_type;
238 ex->un.unop.exp1 = exp1;
243 DEBUG_StructExpr(struct expr * exp, const char * element)
247 ex = DEBUG_GetFreeExpr();
249 ex->type = EXPR_TYPE_STRUCT;
250 ex->un.structure.exp1 = exp;
251 ex->un.structure.element_name = element;
256 DEBUG_StructPExpr(struct expr * exp, const char * element)
260 ex = DEBUG_GetFreeExpr();
262 ex->type = EXPR_TYPE_PSTRUCT;
263 ex->un.structure.exp1 = exp;
264 ex->un.structure.element_name = element;
269 DEBUG_CallExpr(const char * funcname, int nargs, ...)
275 ex = DEBUG_GetFreeExpr();
277 ex->type = EXPR_TYPE_CALL;
278 ex->un.call.funcname = funcname;
279 ex->un.call.nargs = nargs;
282 for(i=0; i < nargs; i++)
284 ex->un.call.arg[i] = va_arg(ap, struct expr *);
290 DBG_VALUE DEBUG_EvalExpr(struct expr * exp)
296 unsigned int cexp[5];
300 struct datatype * type1;
301 struct datatype * type2;
304 rtn.cookie = DV_INVALID;
311 rtn = DEBUG_EvalExpr(exp->un.cast.expr);
312 rtn.type = exp->un.cast.cast;
313 if (DEBUG_GetType(rtn.type) == DT_POINTER)
314 rtn.cookie = DV_TARGET;
316 case EXPR_TYPE_STRING:
317 rtn.type = DEBUG_TypeString;
318 rtn.cookie = DV_HOST;
319 rtn.addr.off = (unsigned int) &exp->un.string.str;
322 case EXPR_TYPE_CONST:
323 rtn.type = DEBUG_TypeIntConst;
324 rtn.cookie = DV_HOST;
325 rtn.addr.off = (unsigned int) &exp->un.constant.value;
328 case EXPR_TYPE_US_CONST:
329 rtn.type = DEBUG_TypeUSInt;
330 rtn.cookie = DV_HOST;
331 rtn.addr.off = (unsigned int) &exp->un.u_const.value;
334 case EXPR_TYPE_SYMBOL:
335 if( !DEBUG_GetSymbolValue(exp->un.symbol.name, -1, &rtn, FALSE) )
337 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.symbol.name);
338 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
341 case EXPR_TYPE_PSTRUCT:
342 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
343 if( exp1.type == NULL )
345 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
347 rtn.cookie = DV_TARGET;
348 rtn.addr.off = DEBUG_TypeDerefPointer(&exp1, &rtn.type);
349 if( rtn.type == NULL )
351 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
353 if (!DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
354 &exp->un.structure.result))
356 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.structure.element_name);
357 RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
361 case EXPR_TYPE_STRUCT:
362 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
363 if( exp1.type == NULL )
365 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
368 if (!DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
369 &exp->un.structure.result))
371 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.structure.element_name);
372 RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
377 * First, evaluate all of the arguments. If any of them are not
378 * evaluable, then bail.
380 for(i=0; i < exp->un.call.nargs; i++)
382 exp1 = DEBUG_EvalExpr(exp->un.call.arg[i]);
383 if( exp1.type == NULL )
387 cexp[i] = DEBUG_GetExprValue(&exp1, NULL);
391 * Now look up the address of the function itself.
393 if( !DEBUG_GetSymbolValue(exp->un.call.funcname, -1, &rtn, FALSE ) )
395 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
399 /* FIXME: NEWDBG NIY */
400 /* Anyway, I wonder how this could work depending on the calling order of
401 * the function (cdecl vs pascal for example)
405 fptr = (int (*)()) rtn.addr.off;
406 switch(exp->un.call.nargs)
409 exp->un.call.result = (*fptr)();
412 exp->un.call.result = (*fptr)(cexp[0]);
415 exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
418 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
421 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
424 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
428 DEBUG_Printf(DBG_CHN_MESG, "Function call no longer implemented\n");
429 /* would need to set up a call to this function, and then restore the current
430 * context afterwards...
432 exp->un.call.result = 0;
434 rtn.type = DEBUG_TypeInt;
435 rtn.cookie = DV_HOST;
436 rtn.addr.off = (unsigned int) &exp->un.call.result;
439 case EXPR_TYPE_INTVAR:
442 DBG_INTVAR* div = DEBUG_GetIntVar(exp->un.intvar.name);
444 if (!div) RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
445 rtn.cookie = DV_HOST;
446 rtn.type = div->type;
447 rtn.addr.off = (unsigned int)div->pval;
448 /* EPP FIXME rtn.addr.seg = ?? */
451 case EXPR_TYPE_BINOP:
452 exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
453 exp2 = DEBUG_EvalExpr(exp->un.binop.exp2);
454 rtn.cookie = DV_HOST;
455 if( exp1.type == NULL || exp2.type == NULL )
457 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
459 if( exp1.type == DEBUG_TypeIntConst && exp2.type == DEBUG_TypeIntConst )
461 rtn.type = exp1.type;
465 rtn.type = DEBUG_TypeInt;
468 rtn.addr.off = (unsigned int) &exp->un.binop.result;
469 switch(exp->un.binop.binop_type)
472 type1 = DEBUG_GetPointerType(exp1.type);
473 type2 = DEBUG_GetPointerType(exp2.type);
476 if( type1 != NULL && type2 != NULL )
478 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
480 else if( type1 != NULL )
482 scale2 = DEBUG_GetObjectSize(type1);
483 rtn.type = exp1.type;
485 else if( type2 != NULL )
487 scale1 = DEBUG_GetObjectSize(type2);
488 rtn.type = exp2.type;
490 exp->un.binop.result = (VAL(exp1) * scale1 + scale2 * VAL(exp2));
493 type1 = DEBUG_GetPointerType(exp1.type);
494 type2 = DEBUG_GetPointerType(exp2.type);
498 if( type1 != NULL && type2 != NULL )
502 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
504 scale3 = DEBUG_GetObjectSize(type1);
506 else if( type1 != NULL )
508 scale2 = DEBUG_GetObjectSize(type1);
509 rtn.type = exp1.type;
512 else if( type2 != NULL )
514 scale1 = DEBUG_GetObjectSize(type2);
515 rtn.type = exp2.type;
517 exp->un.binop.result = (VAL(exp1) - VAL(exp2)) / scale3;
520 rtn.cookie = DV_TARGET;
522 rtn.addr.seg = VAL(exp1);
523 rtn.addr.off = VAL(exp2);
526 exp->un.binop.result = (VAL(exp1) || VAL(exp2));
529 exp->un.binop.result = (VAL(exp1) && VAL(exp2));
532 exp->un.binop.result = (VAL(exp1) | VAL(exp2));
535 exp->un.binop.result = (VAL(exp1) & VAL(exp2));
538 exp->un.binop.result = (VAL(exp1) ^ VAL(exp2));
541 exp->un.binop.result = (VAL(exp1) == VAL(exp2));
544 exp->un.binop.result = (VAL(exp1) > VAL(exp2));
547 exp->un.binop.result = (VAL(exp1) < VAL(exp2));
550 exp->un.binop.result = (VAL(exp1) >= VAL(exp2));
553 exp->un.binop.result = (VAL(exp1) <= VAL(exp2));
556 exp->un.binop.result = (VAL(exp1) != VAL(exp2));
559 exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
562 exp->un.binop.result = ((unsigned) VAL(exp1) >> VAL(exp2));
565 exp->un.binop.result = (VAL(exp1) * VAL(exp2));
570 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
572 exp->un.binop.result = (VAL(exp1) / VAL(exp2));
577 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
579 exp->un.binop.result = (VAL(exp1) % VAL(exp2));
582 DEBUG_ArrayIndex(&exp1, &rtn, VAL(exp2));
585 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
590 exp1 = DEBUG_EvalExpr(exp->un.unop.exp1);
591 rtn.cookie = DV_HOST;
592 if( exp1.type == NULL )
594 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
597 rtn.addr.off = (unsigned int) &exp->un.unop.result;
598 if( exp1.type == DEBUG_TypeIntConst )
600 rtn.type = exp1.type;
604 rtn.type = DEBUG_TypeInt;
606 switch(exp->un.unop.unop_type)
609 exp->un.unop.result = -VAL(exp1);
612 exp->un.unop.result = !VAL(exp1);
615 exp->un.unop.result = ~VAL(exp1);
618 /* FIXME: this is currently buggy.
619 * there is no way to tell were the deref:ed value is...
621 * x is a pointer to struct s, x being on the stack
622 * => exp1 is target, result is target
623 * x is a pointer to struct s, x being optimized into a reg
624 * => exp1 is host, result is target
625 * x is a pointer to internal variable x
626 * => exp1 is host, result is host
627 * so we force DV_TARGET, because dereferencing pointers to
628 * internal variables is very unlikely. a correct fix would be
631 rtn.cookie = DV_TARGET;
632 rtn.addr.off = (unsigned int) DEBUG_TypeDerefPointer(&exp1, &rtn.type);
635 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
638 case EXP_OP_FORCE_DEREF:
639 rtn.cookie = exp1.cookie;
640 rtn.addr.seg = exp1.addr.seg;
641 if (exp1.cookie == DV_TARGET)
642 DEBUG_READ_MEM((void*)exp1.addr.off, &rtn.addr.off, sizeof(rtn.addr.off));
644 memcpy(&rtn.addr.off, (void*)exp1.addr.off, sizeof(rtn.addr.off));
647 /* FIXME: even for a 16 bit entity ? */
648 rtn.type = DEBUG_FindOrMakePointerType(exp1.type);
649 exp->un.unop.result = exp1.addr.off;
652 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
656 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression (%d).\n", exp->type);
657 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
661 assert(rtn.cookie == DV_TARGET || rtn.cookie == DV_HOST);
668 DEBUG_DisplayExpr(const struct expr * exp)
675 DEBUG_Printf(DBG_CHN_MESG, "((");
676 DEBUG_PrintTypeCast(exp->un.cast.cast);
677 DEBUG_Printf(DBG_CHN_MESG, ")");
678 DEBUG_DisplayExpr(exp->un.cast.expr);
679 DEBUG_Printf(DBG_CHN_MESG, ")");
681 case EXPR_TYPE_INTVAR:
682 DEBUG_Printf(DBG_CHN_MESG, "$%s", exp->un.intvar.name);
684 case EXPR_TYPE_US_CONST:
685 DEBUG_Printf(DBG_CHN_MESG, "%ud", exp->un.u_const.value);
687 case EXPR_TYPE_CONST:
688 DEBUG_Printf(DBG_CHN_MESG, "%d", exp->un.u_const.value);
690 case EXPR_TYPE_STRING:
691 DEBUG_Printf(DBG_CHN_MESG, "\"%s\"", exp->un.string.str);
693 case EXPR_TYPE_SYMBOL:
694 DEBUG_Printf(DBG_CHN_MESG, "%s" , exp->un.symbol.name);
696 case EXPR_TYPE_PSTRUCT:
697 DEBUG_DisplayExpr(exp->un.structure.exp1);
698 DEBUG_Printf(DBG_CHN_MESG, "->%s", exp->un.structure.element_name);
700 case EXPR_TYPE_STRUCT:
701 DEBUG_DisplayExpr(exp->un.structure.exp1);
702 DEBUG_Printf(DBG_CHN_MESG, ".%s", exp->un.structure.element_name);
705 DEBUG_Printf(DBG_CHN_MESG, "%s(",exp->un.call.funcname);
706 for(i=0; i < exp->un.call.nargs; i++)
708 DEBUG_DisplayExpr(exp->un.call.arg[i]);
709 if( i != exp->un.call.nargs - 1 )
711 DEBUG_Printf(DBG_CHN_MESG, ", ");
714 DEBUG_Printf(DBG_CHN_MESG, ")");
716 case EXPR_TYPE_BINOP:
717 DEBUG_Printf(DBG_CHN_MESG, "( ");
718 DEBUG_DisplayExpr(exp->un.binop.exp1);
719 switch(exp->un.binop.binop_type)
722 DEBUG_Printf(DBG_CHN_MESG, " + ");
725 DEBUG_Printf(DBG_CHN_MESG, " - ");
728 DEBUG_Printf(DBG_CHN_MESG, ":");
731 DEBUG_Printf(DBG_CHN_MESG, " || ");
734 DEBUG_Printf(DBG_CHN_MESG, " && ");
737 DEBUG_Printf(DBG_CHN_MESG, " | ");
740 DEBUG_Printf(DBG_CHN_MESG, " & ");
743 DEBUG_Printf(DBG_CHN_MESG, " ^ ");
746 DEBUG_Printf(DBG_CHN_MESG, " == ");
749 DEBUG_Printf(DBG_CHN_MESG, " > ");
752 DEBUG_Printf(DBG_CHN_MESG, " < ");
755 DEBUG_Printf(DBG_CHN_MESG, " >= ");
758 DEBUG_Printf(DBG_CHN_MESG, " <= ");
761 DEBUG_Printf(DBG_CHN_MESG, " != ");
764 DEBUG_Printf(DBG_CHN_MESG, " << ");
767 DEBUG_Printf(DBG_CHN_MESG, " >> ");
770 DEBUG_Printf(DBG_CHN_MESG, " * ");
773 DEBUG_Printf(DBG_CHN_MESG, " / ");
776 DEBUG_Printf(DBG_CHN_MESG, " %% ");
779 DEBUG_Printf(DBG_CHN_MESG, "[");
784 DEBUG_DisplayExpr(exp->un.binop.exp2);
785 if( exp->un.binop.binop_type == EXP_OP_ARR )
787 DEBUG_Printf(DBG_CHN_MESG, "]");
789 DEBUG_Printf(DBG_CHN_MESG, " )");
792 switch(exp->un.unop.unop_type)
795 DEBUG_Printf(DBG_CHN_MESG, "-");
798 DEBUG_Printf(DBG_CHN_MESG, "!");
801 DEBUG_Printf(DBG_CHN_MESG, "~");
804 DEBUG_Printf(DBG_CHN_MESG, "*");
807 DEBUG_Printf(DBG_CHN_MESG, "&");
810 DEBUG_DisplayExpr(exp->un.unop.exp1);
813 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
814 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
822 DEBUG_CloneExpr(const struct expr * exp)
827 rtn = (struct expr *) DBG_alloc(sizeof(struct expr));
830 * First copy the contents of the expression itself.
838 rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
840 case EXPR_TYPE_INTVAR:
841 rtn->un.intvar.name = DBG_strdup(exp->un.intvar.name);
843 case EXPR_TYPE_US_CONST:
844 case EXPR_TYPE_CONST:
846 case EXPR_TYPE_STRING:
847 rtn->un.string.str = DBG_strdup(exp->un.string.str);
849 case EXPR_TYPE_SYMBOL:
850 rtn->un.symbol.name = DBG_strdup(exp->un.symbol.name);
852 case EXPR_TYPE_PSTRUCT:
853 case EXPR_TYPE_STRUCT:
854 rtn->un.structure.exp1 = DEBUG_CloneExpr(exp->un.structure.exp1);
855 rtn->un.structure.element_name = DBG_strdup(exp->un.structure.element_name);
858 for(i=0; i < exp->un.call.nargs; i++)
860 rtn->un.call.arg[i] = DEBUG_CloneExpr(exp->un.call.arg[i]);
862 rtn->un.call.funcname = DBG_strdup(exp->un.call.funcname);
864 case EXPR_TYPE_BINOP:
865 rtn->un.binop.exp1 = DEBUG_CloneExpr(exp->un.binop.exp1);
866 rtn->un.binop.exp2 = DEBUG_CloneExpr(exp->un.binop.exp2);
869 rtn->un.unop.exp1 = DEBUG_CloneExpr(exp->un.unop.exp1);
872 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
873 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
882 * Recursively go through an expression tree and free all memory associated
886 DEBUG_FreeExpr(struct expr * exp)
893 DEBUG_FreeExpr(exp->un.cast.expr);
895 case EXPR_TYPE_INTVAR:
896 DBG_free((char *) exp->un.intvar.name);
898 case EXPR_TYPE_US_CONST:
899 case EXPR_TYPE_CONST:
901 case EXPR_TYPE_STRING:
902 DBG_free((char *) exp->un.string.str);
904 case EXPR_TYPE_SYMBOL:
905 DBG_free((char *) exp->un.symbol.name);
907 case EXPR_TYPE_PSTRUCT:
908 case EXPR_TYPE_STRUCT:
909 DEBUG_FreeExpr(exp->un.structure.exp1);
910 DBG_free((char *) exp->un.structure.element_name);
913 for(i=0; i < exp->un.call.nargs; i++)
915 DEBUG_FreeExpr(exp->un.call.arg[i]);
917 DBG_free((char *) exp->un.call.funcname);
919 case EXPR_TYPE_BINOP:
920 DEBUG_FreeExpr(exp->un.binop.exp1);
921 DEBUG_FreeExpr(exp->un.binop.exp2);
924 DEBUG_FreeExpr(exp->un.unop.exp1);
927 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
928 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);