/* Agent expression result types.

   Copyright (C) 2023-2024 Free Software Foundation, Inc.

   This file is part of GDB.

   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 3 of the License, 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, see <http://www.gnu.org/licenses/>.  */

/* The AX_RESULT_TYPE macro is used to define a result type that can be
   generated by agent expression evaluation.  The first macro argument is
   the name of an enum entry, and the second is a string that describes
   this result type.  */

AX_RESULT_TYPE (expr_eval_no_error,
		"terror:no error")
AX_RESULT_TYPE (expr_eval_empty_expression,
		"terror:empty expression")
AX_RESULT_TYPE (expr_eval_empty_stack,
		"terror:empty stack")
AX_RESULT_TYPE (expr_eval_stack_overflow,
		"terror:stack overflow")
AX_RESULT_TYPE (expr_eval_stack_underflow,
		"terror:stack underflow")
AX_RESULT_TYPE (expr_eval_unhandled_opcode,
		"terror:unhandled opcode")
AX_RESULT_TYPE (expr_eval_unrecognized_opcode,
		"terror:unrecognized opcode")
AX_RESULT_TYPE (expr_eval_divide_by_zero,
		"terror:divide by zero")
AX_RESULT_TYPE (expr_eval_invalid_goto,
		"terror:invalid goto")
AX_RESULT_TYPE (expr_eval_invalid_memory_access,
		"terror:invalid memory access")
