| 1 |
34 |
Agner |
/**************************** error.h ************************************
|
| 2 |
|
|
* Author: Agner Fog
|
| 3 |
|
|
* Date created: 2017-04-17
|
| 4 |
|
|
* Last modified: 2021-03-30
|
| 5 |
|
|
* Version: 1.11
|
| 6 |
|
|
* Project: Binary tools for ForwardCom instruction set
|
| 7 |
|
|
* Module: error.h
|
| 8 |
|
|
* Description:
|
| 9 |
|
|
* Header file for error handler error.cpp
|
| 10 |
|
|
*
|
| 11 |
|
|
* Copyright 2006-2021 GNU General Public License http://www.gnu.org/licenses
|
| 12 |
|
|
*****************************************************************************/
|
| 13 |
|
|
#pragma once
|
| 14 |
|
|
|
| 15 |
|
|
// Error id numbers, general errors
|
| 16 |
|
|
const int ERR_MULTIPLE_COMMANDS = 100;
|
| 17 |
|
|
const int ERR_OUTFILE_IGNORED = 101;
|
| 18 |
|
|
const int ERR_EMPTY_OPTION = 102;
|
| 19 |
|
|
const int ERR_UNKNOWN_OPTION = 103;
|
| 20 |
|
|
const int ERR_UNKNOWN_ERROR_NUM = 104;
|
| 21 |
|
|
const int ERR_MULTIPLE_IO_FILES = 105;
|
| 22 |
|
|
const int ERR_DUMP_NOT_SUPPORTED = 106;
|
| 23 |
|
|
const int ERR_INPUT_FILE = 107;
|
| 24 |
|
|
const int ERR_OUTPUT_FILE = 108;
|
| 25 |
|
|
const int ERR_UNKNOWN_FILE_TYPE = 109;
|
| 26 |
|
|
const int ERR_FILE_SIZE = 110;
|
| 27 |
|
|
const int ERR_FILE_NAME_LONG = 111;
|
| 28 |
|
|
const int ERR_FILES_SAME_NAME = 112;
|
| 29 |
|
|
const int ERR_TOO_MANY_RESP_FILES = 112;
|
| 30 |
|
|
|
| 31 |
|
|
const int ERR_MEMORY_ALLOCATION = 120;
|
| 32 |
|
|
const int ERR_CONTAINER_INDEX = 121;
|
| 33 |
|
|
const int ERR_CONTAINER_OVERFLOW = 122;
|
| 34 |
|
|
const int ERR_INDEX_OUT_OF_RANGE = 123;
|
| 35 |
|
|
|
| 36 |
|
|
const int ERR_ELF_RECORD_SIZE = 130;
|
| 37 |
|
|
const int ERR_ELF_SYMTAB_MISSING = 131;
|
| 38 |
|
|
const int ERR_ELF_INDEX_RANGE = 132;
|
| 39 |
|
|
const int ERR_ELF_UNKNOWN_SECTION = 133;
|
| 40 |
|
|
const int ERR_ELF_STRING_TABLE = 134;
|
| 41 |
|
|
const int ERR_ELF_NO_SECTIONS = 135;
|
| 42 |
|
|
|
| 43 |
|
|
const int ERR_INSTRUCTION_LIST_SYNTAX = 140;
|
| 44 |
|
|
const int ERR_INSTRUCTION_LIST_QUOTE = 141;
|
| 45 |
|
|
|
| 46 |
|
|
const int ERR_LIBRARY_FILE_TYPE = 200;
|
| 47 |
|
|
const int ERR_LIBRARY_FILE_CORRUPT = 201;
|
| 48 |
|
|
const int ERR_DUPLICATE_NAME_COMMANDL = 202;
|
| 49 |
|
|
const int ERR_DUPLICATE_NAME_IN_LIB = 203;
|
| 50 |
|
|
const int ERR_DUPLICATE_SYMBOL_IN_LIB = 204;
|
| 51 |
|
|
const int ERR_NO_SYMTAB_IN_LIB = 205;
|
| 52 |
|
|
const int ERR_MEMBER_NOT_FOUND_DEL = 206;
|
| 53 |
|
|
const int ERR_MEMBER_NOT_FOUND_EXTRACT = 207;
|
| 54 |
|
|
const int ERR_LIBRARY_LIST_ONLY = 208;
|
| 55 |
|
|
const int ERR_LIBRARY_MEMBER_TYPE = 209;
|
| 56 |
|
|
|
| 57 |
|
|
const int ERR_LINK_LIST_ONLY = 300;
|
| 58 |
|
|
const int ERR_LINK_FILE_TYPE = 301;
|
| 59 |
|
|
const int ERR_LINK_FILE_TYPE_LIB = 302;
|
| 60 |
|
|
const int ERR_LINK_FILE_TYPE_EXE = 303;
|
| 61 |
|
|
const int ERR_LINK_COMMUNAL = 304;
|
| 62 |
|
|
const int ERR_LINK_DUPLICATE_SYMBOL = 305;
|
| 63 |
|
|
const int ERR_LINK_DIFFERENT_BASE = 306;
|
| 64 |
|
|
const int ERR_LINK_MISALIGNED_TARGET = 307;
|
| 65 |
|
|
const int ERR_LINK_OVERFLOW = 308;
|
| 66 |
|
|
const int ERR_LINK_RELOCATION_OVERFLOW = 309;
|
| 67 |
|
|
const int ERR_LINK_REGUSE = 310;
|
| 68 |
|
|
const int ERR_LINK_MODULE_NOT_FOUND = 311;
|
| 69 |
|
|
const int ERR_EVENT_SIZE = 312;
|
| 70 |
|
|
const int ERR_REL_SYMBOL_NOT_FOUND = 313;
|
| 71 |
|
|
const int ERR_CANT_RELINK_MODULE = 314;
|
| 72 |
|
|
const int ERR_CANT_RELINK_LIBRARY = 315;
|
| 73 |
|
|
const int ERR_RELINK_MODULE_NOT_FOUND = 316;
|
| 74 |
|
|
const int ERR_RELINK_LIBRARY_NOT_FOUND = 317;
|
| 75 |
|
|
const int ERR_RELINK_BASE_POINTER_MOD = 318;
|
| 76 |
|
|
const int ERR_INPUT_NOT_RELINKABLE = 319;
|
| 77 |
|
|
const int ERR_LINK_UNRESOLVED = 320;
|
| 78 |
|
|
const int ERR_LINK_UNRESOLVED_WARN = 321;
|
| 79 |
|
|
|
| 80 |
|
|
const int ERR_TOO_MANY_ERRORS = 500;
|
| 81 |
|
|
const int ERR_BIG_ENDIAN = 501;
|
| 82 |
|
|
const int ERR_INTERNAL = 502;
|
| 83 |
|
|
|
| 84 |
|
|
|
| 85 |
|
|
// Error id numbers during assembly
|
| 86 |
|
|
const int ERR_CONTROL_CHAR = 0x100; // illegal control character
|
| 87 |
|
|
const int ERR_ILLEGAL_CHAR = 0x101; // illegal character
|
| 88 |
|
|
const int ERR_COMMENT_BEGIN = 0x102; // unmatched comment begin
|
| 89 |
|
|
const int ERR_COMMENT_END = 0x103; // unmatched comment end
|
| 90 |
|
|
const int ERR_BRACKET_BEGIN = 0x104; // unmatched begin bracket
|
| 91 |
|
|
const int ERR_BRACKET_END = 0x105; // unmatched end bracket
|
| 92 |
|
|
const int ERR_QUOTE_BEGIN = 0x106; // unmatched quote begin
|
| 93 |
|
|
const int ERR_QUESTION_MARK = 0x108; // unmatched '?'
|
| 94 |
|
|
const int ERR_COLON = 0x109; // unmatched ':'
|
| 95 |
|
|
const int ERR_SYMBOL_DEFINED = 0x10A; // symbol already defined
|
| 96 |
|
|
const int ERR_SYMBOL_UNDEFINED = 0x10B; // symbol not defined
|
| 97 |
|
|
const int ERR_UNFINISHED_VAR = 0x10C; // unfinished variable declaration
|
| 98 |
|
|
const int ERR_MISSING_EXPR = 0x10D; // unfinished variable declaration
|
| 99 |
|
|
const int ERR_MULTIDIMENSIONAL = 0x110; // multidimensional array not allowed
|
| 100 |
|
|
const int ERR_CONFLICT_ARRAYSZ = 0x111; // conflicting array size
|
| 101 |
|
|
const int ERR_CONFLICT_TYPE = 0x112; // conflicting array type
|
| 102 |
|
|
const int ERR_CONDITION = 0x113; // incorrect condition for ?: operator
|
| 103 |
|
|
const int ERR_OVERFLOW = 0x114; // overflow in asseble-time calculation
|
| 104 |
|
|
const int ERR_WRONG_TYPE = 0x115; // wrong type for operator
|
| 105 |
|
|
const int ERR_WRONG_TYPE_VAR = 0x116; // wrong or mismatched type for variable
|
| 106 |
|
|
const int ERR_WRONG_OPERANDS = 0x117; // wrong operands for this instruction
|
| 107 |
|
|
const int ERR_MISSING_DESTINATION = 0x118; // destination required
|
| 108 |
|
|
const int ERR_NO_DESTINATION = 0x119; // should not have destination
|
| 109 |
|
|
const int ERR_NOT_OP_AMBIGUOUS = 0x11A; // '!' operator on register or memory is ambiguous
|
| 110 |
|
|
const int ERR_TOO_COMPLEX = 0x11B; // expression is too complex for a single instruction
|
| 111 |
|
|
const int ERR_MASK_NOT_REGISTER = 0x11C; // mask must be a register
|
| 112 |
|
|
const int ERR_FALLBACK_WRONG = 0x11D; // fallback must be a register or zero
|
| 113 |
|
|
const int ERR_CONSTANT_TOO_LARGE = 0x11E; // immediate constant too large for specified type
|
| 114 |
|
|
const int ERR_ALIGNMENT = 0x11F; // alignment too high or not a power of 2
|
| 115 |
|
|
const int ERR_SECTION_DIFFERENT_TYPE = 0x120; // redefinition of section is different type
|
| 116 |
|
|
const int ERR_EXPECT_COLON = 0x121; // expect colon after label
|
| 117 |
|
|
const int ERR_STRING_TYPE = 0x122; // string must have type int8
|
| 118 |
|
|
const int ERR_NONZERO_IN_BSS = 0x123; // nonzero value in uninitialized section
|
| 119 |
|
|
const int ERR_SYMBOL_REDEFINED = 0x124; // symbol has been assigned more than one value
|
| 120 |
|
|
const int ERR_EXPORT_EXPRESSION = 0x125; // cannot export expression
|
| 121 |
|
|
const int ERR_CANNOT_EXPORT = 0x126; // cannot export this type of symbol
|
| 122 |
|
|
const int ERR_CODE_WO_SECTION = 0x127; // code without section
|
| 123 |
|
|
const int ERR_DATA_WO_SECTION = 0x128; // data without section
|
| 124 |
|
|
const int ERR_MIX_DATA_AND_CODE = 0x129; // mixing data and code in same section
|
| 125 |
|
|
const int ERR_MUST_BE_CONSTANT = 0x12A; // option value must be constant
|
| 126 |
|
|
const int ERR_MEM_COMPONENT_TWICE = 0x140; // component of memory operand specified twice
|
| 127 |
|
|
const int ERR_SCALE_FACTOR = 0x141; // wrong scale factor
|
| 128 |
|
|
const int ERR_MUST_BE_GP = 0x142; // length or broadcast must be general purpose register
|
| 129 |
|
|
const int ERR_LIMIT_AND_OFFSET = 0x143; // cannot have both limit and offset
|
| 130 |
|
|
const int ERR_NOT_INSIDE_MEM = 0x144; // mask option not allowed inside memory operand
|
| 131 |
|
|
const int ERR_TOO_MANY_OPERANDS = 0x145; // too many operands
|
| 132 |
|
|
const int ERR_TOO_FEW_OPERANDS = 0x146; // too many operands
|
| 133 |
|
|
const int ERR_OPERANDS_WRONG_ORDER = 0x147; // operands in wrong order
|
| 134 |
|
|
const int ERR_BOTH_MEM_AND_IMMEDIATE = 0x148; // cannot have both memory operand and immediate constant
|
| 135 |
|
|
const int ERR_BOTH_MEM_AND_OPTIONS = 0x149; // cannot have both memory operand and options
|
| 136 |
|
|
const int ERR_UNFINISHED_INSTRUCTION = 0x14A; // unfinished instruction code
|
| 137 |
|
|
const int ERR_TYPE_MISSING = 0x14B; // type must be specified
|
| 138 |
|
|
const int ERR_MASK_FALLBACK_TYPE = 0x14C; // mask and fallback must have same type as destination
|
| 139 |
|
|
const int ERR_NEG_INDEX_LENGTH = 0x14D; // length must be the same as negative index
|
| 140 |
|
|
const int ERR_INDEX_AND_LENGTH = 0x14E; // cannot have length/broadcast and index
|
| 141 |
|
|
const int ERR_MASK_REGISTER = 0x14F; // mask register number > 6
|
| 142 |
|
|
const int ERR_LIMIT_TOO_HIGH = 0x150; // limit on memory operand too high
|
| 143 |
|
|
const int ERR_NO_INSTRUCTION_FIT = 0x151; // no version of this instruction fits the specified operands
|
| 144 |
|
|
const int ERR_CANNOT_SWAP_VECT = 0x152; // cannot change the order of vector registers
|
| 145 |
|
|
const int ERR_EXPECT_JUMP_TARGET = 0x158; // expecting jump target
|
| 146 |
|
|
const int ERR_JUMP_TARGET_MISALIGN = 0x159; // jump target offset must be divisible by 4
|
| 147 |
|
|
const int ERR_ABS_RELOCATION = 0x15a; // absolute address not allowed here
|
| 148 |
|
|
const int ERR_ABS_RELOCATION_WARN = 0x15b; // absolute address allowed, but not recommended. make warning
|
| 149 |
|
|
const int ERR_RELOCATION_DOMAIN = 0x15c; // cannot calculate difference between two symbols in different domains
|
| 150 |
|
|
const int ERR_WRONG_REG_TYPE = 0x160; // wrong type for register operand
|
| 151 |
|
|
const int ERR_CONFLICT_OPTIONS = 0x161; // conflicting options on memory operand
|
| 152 |
|
|
const int ERR_VECTOR_OPTION = 0x162; // vector option applied to non-vector operands
|
| 153 |
|
|
const int ERR_LENGTH_OPTION_MISS = 0x163; // vector memory operand must have scalar, length, or broadcast option
|
| 154 |
|
|
const int ERR_DEST_BROADCAST = 0x164; // memory destination operand cannot have broadcast
|
| 155 |
|
|
const int ERR_OFFSET_TOO_LARGE = 0x165; // address offset too large
|
| 156 |
|
|
const int ERR_LIMIT_TOO_LARGE = 0x166; // index limit too large
|
| 157 |
|
|
const int ERR_IMMEDIATE_TOO_LARGE = 0x167; // instruction format does not have space for full-size constant and option/signbits
|
| 158 |
|
|
const int ERR_TOO_LARGE_FOR_JUMP = 0x168; // jump instruction does not have space for full-size constant
|
| 159 |
|
|
const int ERR_CANNOT_HAVE_OPTION = 0x169; // this instruction cannot have options
|
| 160 |
|
|
const int ERR_CANNOT_HAVEFALLBACK1 = 0x16A; // cannot have fallback register
|
| 161 |
|
|
const int ERR_CANNOT_HAVEFALLBACK2 = 0x16B; // cannot have fallback != destination with this memory operand
|
| 162 |
|
|
const int ERR_3OP_AND_FALLBACK = 0x16C; // cannot have fallback != destination with three operands
|
| 163 |
|
|
const int ERR_3OP_AND_MEM = 0x16D; // the first source register must be the same as the destination when there is a memory operand with index or vector
|
| 164 |
|
|
const int ERR_R28_30_BASE = 0x16E; // cannot use r28-r30 as base pointer with more than 8 bits offset
|
| 165 |
|
|
const int ERR_NO_BASE = 0x16F; // memory operand has no base pointer
|
| 166 |
|
|
const int ERR_MEM_WO_BRACKET = 0x170; // memory operand requires [] bracket
|
| 167 |
|
|
const int ERR_UNKNOWN = 0x171; // unknown error during assembly
|
| 168 |
|
|
const int ERR_UNMATCHED_END = 0x210; // unmatched end
|
| 169 |
|
|
const int ERR_SECTION_MISS_END = 0x211; // missing end of section
|
| 170 |
|
|
const int ERR_FUNCTION_MISS_END = 0x212; // missing end of function
|
| 171 |
|
|
const int ERR_ELSE_WO_IF = 0x222; // else without if
|
| 172 |
|
|
const int ERR_EXPECT_PARENTHESIS = 0x223; // expecting parenthesis after if, for, while, switch
|
| 173 |
|
|
const int ERR_EXPECT_BRACKET = 0x224; // expecting bracket after if, for, while, switch()
|
| 174 |
|
|
const int ERR_EXPECT_LOGICAL = 0x225; // expecting logical expression in if() or while()
|
| 175 |
|
|
const int ERR_MEM_NOT_ALLOWED = 0x226; // cannot have memory operand
|
| 176 |
|
|
//const int ERR_MUST_BE_POW2 = 0x227; // constant must have only one bit set
|
| 177 |
|
|
const int ERR_WHILE_EXPECTED = 0x228; // 'while' expected after 'do'
|
| 178 |
|
|
const int ERR_MISPLACED_BREAK = 0x229; // nothing: to break out of
|
| 179 |
|
|
const int ERR_MISPLACED_CONTINUE = 0x22A; // no loop to continue
|
| 180 |
|
|
|
| 181 |
|
|
|
| 182 |
|
|
|
| 183 |
|
|
// Structure for defining error message texts
|
| 184 |
|
|
struct SErrorText {
|
| 185 |
|
|
int errorNumber; // Error number
|
| 186 |
|
|
int status; // bit 0-3 = severity: 0 = ignore, 1 = warning, 2 = error, 9 = abort
|
| 187 |
|
|
// bit 8 = error number not found
|
| 188 |
|
|
char const * text; // Error text
|
| 189 |
|
|
};
|
| 190 |
|
|
|
| 191 |
|
|
// General error routine for reporting warning and error messages to STDERR output
|
| 192 |
|
|
class CErrorReporter {
|
| 193 |
|
|
public:
|
| 194 |
|
|
CErrorReporter(); // Default constructor
|
| 195 |
|
|
static SErrorText *FindError(int ErrorNumber);// Search for error in ErrorTexts
|
| 196 |
|
|
void submit(int ErrorNumber); // Print error message
|
| 197 |
|
|
void submit(int ErrorNumber, int extra); // Print error message with extra info
|
| 198 |
|
|
void submit(int ErrorNumber, int, int); // Print error message with two extra numbers inserted
|
| 199 |
|
|
void submit(int ErrorNumber, char const * extra); // Print error message with extra info
|
| 200 |
|
|
void submit(int ErrorNumber, char const *, char const *); // Print error message with two extra text fields inserted
|
| 201 |
|
|
void submit(int ErrorNumber, char const * extra1, char const * extra2, char const * extra3);// Print error message with three extra text fields
|
| 202 |
|
|
void submit(int ErrorNumber, int, char const *); // Print error message with two extra text fields inserted
|
| 203 |
|
|
int number(); // Get number of errors
|
| 204 |
|
|
int getWorstError(); // Get highest warning or error number encountered
|
| 205 |
|
|
void clearError(int ErrorNumber); // Ignore further occurrences of this error
|
| 206 |
|
|
protected:
|
| 207 |
|
|
int numErrors; // Number of errors detected
|
| 208 |
|
|
int numWarnings; // Number of warnings detected
|
| 209 |
|
|
int worstError; // Highest error number encountered
|
| 210 |
|
|
int maxWarnings; // Max number of warning messages to pring
|
| 211 |
|
|
int maxErrors; // Max number of error messages to print
|
| 212 |
|
|
void handleError(SErrorText * err, char const * text); // Used by submit function
|
| 213 |
|
|
};
|
| 214 |
|
|
|
| 215 |
|
|
extern CErrorReporter err; // Error handling object is in error.cpp
|
| 216 |
|
|
extern SErrorText errorTexts[]; // List of error texts
|
| 217 |
|
|
|
| 218 |
|
|
|