/* * Copyright (c) 1987 Fujitsu * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* debugPrint.c -- Routines to print out things for debugging purposes. Chip Morningstar -- Lucasfilm Ltd. 5-November-1984 */ #include "macrossTypes.h" #include "macrossGlobals.h" #include "debugPrint.h" #include "y.tab.h" /* Print out the parse-tree. */ int tablevel = 0; /* Fundamental nop print operation */ #define nullPrint(thing) if (thing==NULL) { tab(); printf("()\n"); return; } /* For keeping nested structures looking pretty */ void tab(void) { int n; n = tablevel; while (n-- > 0) printf(" "); } /* The following routines print readable strings for the values of various enumerated types and pre-defined constants. Each contains a static table of strings that must be kept consistent with the type or set of definitions that it represents. */ void printAssignmentKind(assignmentKindType assignmentKind) { /* This table MUST be maintained congruently with the definition of the enumerated type 'assignmentKindType'. */ static char *assignmentTable[] = { "ASSIGN_ASSIGN", "ADD_ASSIGN", "SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "MOD_ASSIGN", "AND_ASSIGN", "OR_ASSIGN", "XOR_ASSIGN", "LEFT_SHIFT_ASSIGN", "RIGHT_SHIFT_ASSIGN", "NO_ASSIGN", }; printf("%s", assignmentTable[(int)assignmentKind]); } void printExpressionKind(expressionTermKindType kind) { /* This table MUST be maintained congruently with the definition of the enumerated type 'expressionTermKindType'. */ static char *expressionKindTable[] = { "identifier expr", "function call expr", "number expr", "subexpression", "unop expr", "binop expr", "preop expr", "postop expr", "here", "assignment expr", "condition code expr", "string expr", "value", "array expr", }; printf("%s", expressionKindTable[(int)kind]); } stringType * statementKindString(statementKindType kind) { /* This table MUST be maintained congruently with the definition of the enumerated type 'statementKindType'. */ static char *statementKindTable[] = { "if", "while", "do_while", "do_until", "word", "dbyte", "byte", "string", "struct", "instruction", "define", "undefine", "mif", "freturn", "mfor", "mdo_while", "mdo_until", "include", "extern", "start", "align", "org", "rel", "perform", "block", "mwhile", "mdefine", "null", "group", "macro", "function", "variable", "mvariable", "constrain", "assert", "mswitch", "long", "target", }; return(statementKindTable[(int)kind]); } void printStatementKind(statementKindType kind) { printf("%s", statementKindString(kind)); } /* These routines collectively print expressions and values. */ void printValue(valueType *value) { /* This table MUST be maintained congruently with the definition of the enumerated type 'valueKindType'. */ static char *valueKindTable[NUM_OF_VALUE_KINDS] = { "ABSOLUTE_VALUE", "DATA_VALUE", "RELOCATABLE_VALUE", "BSS_VALUE", "STRUCT_VALUE", "FIELD_VALUE", "MACRO_VALUE", "OPERAND_VALUE", "STRING_VALUE", "CONDITION_VALUE", "UNDEFINED_VALUE", "FUNCTION_VALUE", "BLOCK_VALUE", "BUILT_IN_FUNCTION_VALUE", "ARRAY_VALUE", "FAIL", }; if (value != NULL) { printf("(%s: %d==0x%x ", valueKindTable[(int)value-> kindOfValue], value->value, value->value); printOperandKind(value->addressMode); printf(")"); } else printf("(no value)"); } void printSymbol(symbolTableEntryType *symbol) { /* This table MUST be maintained congruent with the definition of the enumerated type 'symbolUsageKindType'. */ static char *symbolUsageTable[] = { "STRUCT_NAME_SYMBOL", "STRUCT_FIELD_SYMBOL", "MACRO_SYMBOL", "ARGUMENT_SYMBOL", "LABEL_SYMBOL", "EXTERNAL_SYMBOL", "VARIABLE_SYMBOL", "MVARIABLE_SYMBOL", "UNKNOWN_SYMBOL", "DEAD_SYMBOL", "FUNCTION_SYMBOL", "BUILT_IN_FUNCTION_SYMBOL", "NESTED_UNKNOWN_SYMBOL", "DEFINE_SYMBOL", "MDEFINE_SYMBOL", "UNKNOWN_FUNCTION_SYMBOL", "UNKNOWN_MACRO_SYMBOL", }; nullPrint(symbol); tab(); printf("(symbol: %s ", symbol->symbolName); printValue(symbol->context->value); printf(" %d %s", symbol->context->attributes, symbolUsageTable[(int)symbol->context->usage]); if (symbol->context->pushedContexts != NULL) printf(" ..."); printf(")\n"); } void printArgumentDefinitionList(argumentDefinitionListType *list) { nullPrint(list); tab(); printf("(arguments:\n"); tablevel++; while (list != NULL) { printSymbol(list->theArgument); list = list->nextArgument; } tablevel--; tab(); printf(")\n"); } void printBlock(blockType *block) { nullPrint(block); tab(); printf("(block:\n"); tablevel++; printStatement(block); tablevel--; tab(); printf(")\n"); } void printArrayTerm(arrayTermType *arrayTerm) { nullPrint(arrayTerm); tab(); printf("(array\n"); tablevel++; printExpression(arrayTerm->arrayName); printExpression(arrayTerm->arrayIndex); tablevel--; tab(); printf(")\n"); } void printAssignmentTerm(binopTermType *assignmentTerm) { nullPrint(assignmentTerm); tab(); printf("(assignment ["); printAssignmentKind(assignmentTerm->binop); printf("]\n"); tablevel++; printExpression(assignmentTerm->leftArgument); printExpression(assignmentTerm->rightArgument); tablevel--; tab(); printf(")\n"); } void printBinopTerm(binopTermType *binopTerm) { nullPrint(binopTerm); tab(); printf("(binop ["); printToken(binopTerm->binop); printf("]\n"); tablevel++; printExpression(binopTerm->leftArgument); if (binopTerm->binop == SELECT) printIdentifier(binopTerm->rightArgument); else printExpression(binopTerm->rightArgument); tablevel--; tab(); printf(")\n"); } void printFunctionCall(functionCallTermType *functionCall) { nullPrint(functionCall); tab(); printf("(function call %s\n", functionCall->functionName-> symbolName); tablevel++; printOperandList(functionCall->parameters); tablevel--; tab(); printf(")\n"); } void printHere(void) { tab(); printf("(here)\n"); } void printIdentifier(symbolTableEntryType *identifier) { nullPrint(identifier); printSymbol(identifier); } void printNumber(numberTermType number) { tab(); printf("(number: %d)\n", number); } void printPostopTerm(postOpTermType *postopTerm) { nullPrint(postopTerm); tab(); printf("(postop ["); printToken(postopTerm->postOp); printf("]\n"); tablevel++; printExpression(postopTerm->postOpArgument); tablevel--; tab(); printf(")\n"); } void printPreopTerm(preOpTermType *preopTerm) { nullPrint(preopTerm); tab(); printf("(preop ["); printToken(preopTerm->preOp); printf("]\n"); tablevel++; printExpression(preopTerm->preOpArgument); tablevel--; tab(); printf(")\n"); } void printUnopTerm(unopTermType *unopTerm) { nullPrint(unopTerm); tab(); printf("(unop ["); printToken(unopTerm->unop); printf("]\n"); tablevel++; printExpression(unopTerm->unopArgument); tablevel--; tab(); printf(")\n"); } void printExpression(expressionType *expression) { nullPrint(expression); tab(); printf("(expression: ["); printExpressionKind(expression->kindOfTerm); printf("]\n"); tablevel++; switch (expression->kindOfTerm) { case ARRAY_EXPR: printArrayTerm(expression->expressionTerm.arrayUnion); break; case ASSIGN_EXPR: printAssignmentTerm(expression->expressionTerm.binopUnion); break; case BINOP_EXPR: printBinopTerm(expression->expressionTerm.binopUnion); break; case CONDITION_CODE_EXPR: printCondition(expression->expressionTerm.conditionTypeUnion); break; case FUNCTION_CALL_EXPR: printFunctionCall(expression->expressionTerm.functionCallUnion); break; case HERE_EXPR: printHere(); break; case IDENTIFIER_EXPR: printIdentifier(expression->expressionTerm.symbolTableUnion); break; case NUMBER_EXPR: printNumber(expression->expressionTerm.numberUnion); break; case POSTOP_EXPR: printPostopTerm(expression->expressionTerm.postOpUnion); break; case PREOP_EXPR: printPreopTerm(expression->expressionTerm.preOpUnion); break; case STRING_EXPR: tab(); printf("%s\n", expression->expressionTerm); break; case SUBEXPRESSION_EXPR: printExpression(expression->expressionTerm.expressionUnion); break; case UNOP_EXPR: printUnopTerm(expression->expressionTerm.unopUnion); break; case VALUE_EXPR: printValue(expression->expressionTerm.valueUnion); break; default: printf("eh? funny expression kind %d\n", expression->kindOfTerm); break; } tablevel--; tab(); printf(")\n"); } void printExpressionList(expressionListType *expressionList) { while (expressionList != NULL) { printExpression(expressionList->theExpression); expressionList = expressionList->nextExpression; } } void printIdentifierList(identifierListType *identifierList) { nullPrint(identifierList); printSymbol(identifierList->theSymbol); if (identifierList->nextIdentifier != NULL) printIdentifierList(identifierList->nextIdentifier); } /* These routines collectively print statements and statement fragments. */ void printCase(caseType *aCase) { tab(); printf("(case:\n"); tablevel++; if (aCase->caseTags == NULL) { tab(); printf("(default case)\n"); } else { printExpressionList(aCase->caseTags); } tablevel--; tab(); printf(")\n"); tab(); printf("(body:\n"); tablevel++; printBlock(aCase->caseBody); tablevel--; tab(); printf(")\n"); } void printCaseList(caseListType *caseList) { tab(); printf("(cases:\n"); tablevel++; while (caseList != NULL) { printCase(caseList->theCase); caseList = caseList->nextCase; } tablevel--; tab(); printf(")\n"); } void printMacro(macroTableEntryType *macroInstruction) { nullPrint(macroInstruction); tab(); printf("(macro: %s)\n", macroInstruction->macroName); } void printOpcode(opcodeTableEntryType *opcode) { nullPrint(opcode); tab(); printf("(opcode: %s)\n", opcode->mnemonic); } void printOperandList(operandListType *operandList) { nullPrint(operandList); printOperand(operandList); if (operandList->nextOperand != NULL) printOperandList(operandList->nextOperand); } void printAlignStatement(alignStatementBodyType *alignStatement) { nullPrint(alignStatement); printExpression(alignStatement); } void printAssertStatement(assertStatementBodyType *assertStatement) { nullPrint(assertStatement); printExpression(assertStatement->condition); printExpression(assertStatement->message); } void printBlockStatement(blockStatementBodyType *blockStatement) { nullPrint(blockStatement); printExpressionList(blockStatement); } void printByteStatement(byteStatementBodyType *byteStatement) { nullPrint(byteStatement); printExpressionList(byteStatement); } void printConstrainStatement(constrainStatementBodyType *constrainStatement) { nullPrint(constrainStatement); printExpression(constrainStatement->constraint); printBlock(constrainStatement->constrainedBlock); } void printDbyteStatement(dbyteStatementBodyType *dbyteStatement) { nullPrint(dbyteStatement); printExpressionList(dbyteStatement); } void printDefineStatement(defineStatementBodyType *defineStatement) { nullPrint(defineStatement); printSymbol(defineStatement->theSymbol); printExpression(defineStatement->theValue); } void printDoUntilStatement(doUntilStatementBodyType *doUntilStatement) { nullPrint(doUntilStatement); printBlock(doUntilStatement->doUntilLoop); tab(); printf("(condition: "); printCondition(doUntilStatement->doUntilCondition); printf(")\n"); } void printDoWhileStatement(doWhileStatementBodyType *doWhileStatement) { nullPrint(doWhileStatement); printBlock(doWhileStatement->doWhileLoop); tab(); printf("(condition: "); printCondition(doWhileStatement->doWhileCondition); printf(")\n"); } void printExternStatement(externStatementBodyType *externStatement) { nullPrint(externStatement); printIdentifierList(externStatement); } void printFreturnStatement(freturnStatementBodyType *freturnStatement) { nullPrint(freturnStatement); printExpression(freturnStatement); } void printFunctionStatement(functionStatementBodyType *functionStatement) { nullPrint(functionStatement); tab();printf("(function name: %s)\n",functionStatement->functionName); printArgumentDefinitionList(functionStatement->theArguments); printBlock(functionStatement->theBlock); } void printIfStatement(ifStatementBodyType *ifStatement) { nullPrint(ifStatement); tab(); printf("(condition: "); printCondition(ifStatement->ifCondition); printf(")\n"); printBlock(ifStatement->consequence); tab(); printf("(else:\n"); tablevel++; printIfStatement(ifStatement->continuation.blockUnion); tablevel--; tab(); printf(")\n"); } void printIncludeStatement(includeStatementBodyType *includeStatement) { nullPrint(includeStatement); printExpression(includeStatement); } void printInstructionStatement(instructionStatementBodyType *instructionStatement) { nullPrint(instructionStatement); switch(instructionStatement->kindOfInstruction) { case OPCODE_INSTRUCTION: printOpcode(instructionStatement->theInstruction.opcodeUnion); break; case MACRO_INSTRUCTION: printMacro(instructionStatement->theInstruction.macroUnion); break; default: printf("huh? instruction type=%d\n", instructionStatement-> kindOfInstruction); break; } printOperandList(instructionStatement->theOperands); } void printLongStatement(longStatementBodyType *longStatement) { nullPrint(longStatement); printExpressionList(longStatement); } void printMacroStatement(macroStatementBodyType *macroStatement) { nullPrint(macroStatement); tab(); printf("(macro name: %s)\n", macroStatement->theMacro); printArgumentDefinitionList(macroStatement->theArguments); printBlock(macroStatement->theBlock); } void printMdefineStatement(defineStatementBodyType *mdefineStatement) { nullPrint(mdefineStatement); printSymbol(mdefineStatement->theSymbol); printExpression(mdefineStatement->theValue); } void printMdoUntilStatement(mdoUntilStatementBodyType *mdoUntilStatement) { nullPrint(mdoUntilStatement); printBlock(mdoUntilStatement->mdoUntilLoop); printExpression(mdoUntilStatement->mdoUntilCondition); } void printMdoWhileStatement(mdoWhileStatementBodyType *mdoWhileStatement) { nullPrint(mdoWhileStatement); printBlock(mdoWhileStatement->mdoWhileLoop); printExpression(mdoWhileStatement->mdoWhileCondition); } void printMforStatement(mforStatementBodyType *mforStatement) { nullPrint(mforStatement); printExpression(mforStatement->initExpression); printExpression(mforStatement->testExpression); printExpression(mforStatement->incrExpression); printBlock(mforStatement->forLoop); } void printMifStatement(mifStatementBodyType *mifStatement) { nullPrint(mifStatement); printExpression(mifStatement->mifCondition); printBlock(mifStatement->mifConsequence); tab(); printf("(melse:\n"); tablevel++; printMifStatement(mifStatement->mifContinuation.mifContinuationBodyUnion); tablevel--; tab(); printf(")\n"); } void printMswitchStatement(mswitchStatementBodyType *mswitchStatement) { nullPrint(mswitchStatement); printExpression(mswitchStatement->switchExpression); printCaseList(mswitchStatement->cases); } void printMvariableStatement(mvariableStatementBodyType *mvariableStatement) { nullPrint(mvariableStatement); printSymbol(mvariableStatement->theSymbol); printExpression(mvariableStatement->theValue); } void printMwhileStatement(mwhileStatementBodyType *mwhileStatement) { nullPrint(mwhileStatement); printExpression(mwhileStatement->mwhileCondition); printBlock(mwhileStatement->mwhileLoop); } void printOrgStatement(orgStatementBodyType *orgStatement) { nullPrint(orgStatement); printExpression(orgStatement); } void printPerformStatement(performStatementBodyType *performStatement) { nullPrint(performStatement); printExpression(performStatement); } void printRelStatement(relStatementBodyType *relStatement) { /* there's nothing here... */ } void printStartStatement(startStatementBodyType *startStatement) { nullPrint(startStatement); printExpression(startStatement); } void printStringStatement(stringStatementBodyType *stringStatement) { nullPrint(stringStatement); printExpressionList(stringStatement); } void printStructStatement(structStatementBodyType *structStatement) { nullPrint(structStatement); printSymbol(structStatement->structName); printBlock(structStatement->structBody); } void printTargetStatement(targetStatementBodyType *targetStatement) { nullPrint(targetStatement); printExpression(targetStatement); } void printUndefineStatement(undefineStatementBodyType *undefineStatement) { nullPrint(undefineStatement); printIdentifierList(undefineStatement); } void printVariableStatement(variableStatementBodyType *variableStatement) { nullPrint(variableStatement); printSymbol(variableStatement->theSymbol); printExpression(variableStatement->theValue); } void printWhileStatement(whileStatementBodyType *whileStatement) { nullPrint(whileStatement); tab(); printf("(condition: "); printCondition(whileStatement->whileCondition); printf(")\n"); printBlock(whileStatement->whileLoop); } void printWordStatement(wordStatementBodyType *wordStatement) { nullPrint(wordStatement); printExpressionList(wordStatement); } void printLabelList(labelListType *labelList) { nullPrint(labelList); tab(); printf("(\n"); tablevel++; while (labelList != NULL) { printSymbol(labelList->theLabel); labelList = labelList->nextLabel; } tablevel--; tab(); printf(")\n"); } void printStatementBody(statementKindType kind, statementBodyType body) { switch (kind) { case ALIGN_STATEMENT: printAlignStatement(body.alignUnion); break; case ASSERT_STATEMENT: printAssertStatement(body.assertUnion); break; case BLOCK_STATEMENT: printBlockStatement(body.blockUnion); break; case BYTE_STATEMENT: printByteStatement(body.byteUnion); break; case CONSTRAIN_STATEMENT: printConstrainStatement(body.constrainUnion); break; case DBYTE_STATEMENT: printDbyteStatement(body.dbyteUnion); break; case DEFINE_STATEMENT: printDefineStatement(body.defineUnion); break; case DO_UNTIL_STATEMENT: printDoUntilStatement(body.doUntilUnion); break; case DO_WHILE_STATEMENT: printDoWhileStatement(body.doWhileUnion); break; case EXTERN_STATEMENT: printExternStatement(body.externUnion); break; case FRETURN_STATEMENT: printFreturnStatement(body.freturnUnion); break; case FUNCTION_STATEMENT: printFunctionStatement(body.functionUnion); break; case GROUP_STATEMENT: printBlock(body.groupUnion); break; case IF_STATEMENT: printIfStatement(body.ifUnion); break; case INCLUDE_STATEMENT: printIncludeStatement(body.includeUnion); break; case INSTRUCTION_STATEMENT: printInstructionStatement(body.instructionUnion); break; case LONG_STATEMENT: printLongStatement(body.longUnion); break; case MACRO_STATEMENT: printMacroStatement(body.macroUnion); break; case MDEFINE_STATEMENT: printMdefineStatement(body.defineUnion); break; case MDO_UNTIL_STATEMENT: printMdoUntilStatement(body.mdoUntilUnion); break; case MDO_WHILE_STATEMENT: printMdoWhileStatement(body.mdoWhileUnion); break; case MFOR_STATEMENT: printMforStatement(body.mforUnion); break; case MIF_STATEMENT: printMifStatement(body.mifUnion); break; case MSWITCH_STATEMENT: printMswitchStatement(body.mswitchUnion); break; case MVARIABLE_STATEMENT: printMvariableStatement(body.mvariableUnion); break; case MWHILE_STATEMENT: printMwhileStatement(body.mwhileUnion); break; case NULL_STATEMENT: /* do nothing */ break; case ORG_STATEMENT: printOrgStatement(body.orgUnion); break; case PERFORM_STATEMENT: printPerformStatement(body.performUnion); break; case REL_STATEMENT: printRelStatement(body.relUnion); break; case START_STATEMENT: printStartStatement(body.startUnion); break; case STRING_STATEMENT: printStringStatement(body.stringUnion); break; case STRUCT_STATEMENT: printStructStatement(body.structUnion); break; case TARGET_STATEMENT: printTargetStatement(body.targetUnion); break; case UNDEFINE_STATEMENT: printUndefineStatement(body.undefineUnion); break; case VARIABLE_STATEMENT: printVariableStatement(body.variableUnion); break; case WHILE_STATEMENT: printWhileStatement(body.whileUnion); break; case WORD_STATEMENT: printWordStatement(body.wordUnion); break; default: printf("Say what? statement kind=%d\n", kind); break; } } void printStatement(statementType *statement) { nullPrint(statement); tab(); printf("(statement["); printStatementKind(statement->kindOfStatement); printf("]: \n"); tablevel++; printLabelList(statement->labels); printStatementBody(statement->kindOfStatement, statement->statementBody); tablevel--; tab(); printf(")\n"); if (statement->nextStatement != NULL) printStatement(statement->nextStatement); } /* Other debug print routines. */ void printPendingFixupList(fixupListType *fixupList) { printf("fixup list: ("); tablevel++; while (fixupList != NULL) { printExpression(fixupList->theFixupExpression); fixupList = fixupList->nextFixup; } tablevel--; printf(")\n"); } void printCreateFixup(expressionType *expression, addressType location, fixupKindType kindOfFixup) { static char *fixupStringTable[] = { "BYTE FIXUP", "WORD FIXUP", "NO FIXUP", "OPERAND FIXUP", "BYTE RELATIVE FIXUP", "DBYTE FIXUP", "NO FIXUP (OK)", "LONG FIXUP", "WORD RELATIVE FIXUP", }; printf("created fixup: expr=0x%x at 0x%x (%s)\n", expression, location, fixupStringTable[(int)kindOfFixup]); } /* Print internal code buffers. */ void printExpressionBuffer(void) { int line; int i; printf("expression length = %d:\n", expressionBufferSize); for (line=0; linecodeStartAddress); end = bufferPosition(codeSegment->codeEndAddress); printf("buffer 0x%x:\n", bufferNum*CODE_BUFFER_SIZE); for (line=0; lineend){ /* skip it -- no code here */ } else { printf(" %4x:", bufferNum*CODE_BUFFER_SIZE + line); for (i=line; iend) printf(" "); else printf(" %2x", (*(codeSegment->codeBuffer))[i]); } printf("\n"); } } } void printCodeBufferSection(codeRegionType *codeBufferSection) { bool anyCodeThereFlag; int i; anyCodeThereFlag = FALSE; for (i=0; icodeSegments[i] != NULL) { printOneCodeBuffer(codeBufferSection->codeSegments[i], i); anyCodeThereFlag = TRUE; } if (!anyCodeThereFlag) printf("no code in section\n"); printf("\n"); } void printCodeBuffers(void) { printf("absolute code:\n"); printCodeBufferSection(&absoluteCodeRegion); printf("relocatable code:\n"); printCodeBufferSection(&relocatableCodeRegion); }