diff options
Diffstat (limited to 'gdb/=rt-changes')
-rw-r--r-- | gdb/=rt-changes | 3338 |
1 files changed, 0 insertions, 3338 deletions
diff --git a/gdb/=rt-changes b/gdb/=rt-changes deleted file mode 100644 index 1eda81c8df4..00000000000 --- a/gdb/=rt-changes +++ /dev/null @@ -1,3338 +0,0 @@ -From: zs01#@andrew.cmu.edu (Zalman Stern) -Date: Sun, 24 May 87 03:20:57 edt -To: rms@prep.ai.mit.edu -Subject: RT diffs for gdb version 2.1 - -Here are the new files, followed by the diffs to old files. The first file below -is ITCMODS which is my attempt to document some of our changes. Unfortunately, -it has not been maintained particularly well and notably does not include info -about our changes to support the HIGH-C compiler. One big change we put in was -to use a number of initialize routines instead of the "linked list of object -modules" that is used on other machines. The RT object file format appears to -have a variable size header before the code, making it very difficult -(impossible?) to get the initialization stuff to work. If you have any -questions, don't hesitate to send me mail. - --Z- - -Only in .: ITCMODS - -blockframe.c: - set_current_frame now takes an extra argument. - RT specific code for interpreting and caching of trace table entries. - Added initialize routine. - -breakpoint.c: - Added new_breakpoint_commands flag to prevent incorrect interpretation of command lists containing a continue statement. - Modified do_breakpoint_commands to know about new_breakpoint_commands. - Modified clear_breakpoint_commands to set new_breakpoint_commands. - Added initialize routine. - -core.c: - RT specific code to find the uarea. - RT specific code to indicate the start of the data segment. - set_current_frame now takes an extra argument. - Added initialize routine. - -dbxread.c: - Added support for the Camphor dynamic loading system. (All under #ifdef CAMPHOR). - Fix for multiple declarations of register variables (i.e. they are declared twice). The fix munges the incorrect declaration (i.e. the one which is not register). - set_rel_command to set relocation offset for camphor loaded files. (Under #ifdef CAMPHOR). - add_file_command to append a file's symbols to the current symbol table instead of replacing it. (Under #ifdef CAMPHOR). - RT specific code to deal with function names being _.foo instead of _foo. - Added initialize routine. - - Feb 8, 1987 Zalman Stern. - Added test in symbol_file_command to see if file was compiled with debugging. If not print an error message instead of dumping core. - Added same test in add_file_command and made it run through BZPATH, CLASSPATH, and PATH in that order (Under #ifdef CAMPHOR). - -environ.c: - Fixed error in calculating new size of a reallocated environment. - -eval.c: - Added initialize routine. - -expread.y: - Moved alloca call out of variable initializations. - -findvar.c: - Added initialize routine. - -firstfile.c: - Added main initialization driver routine. - -frame.h: - Added RT specific declarations to hold frame information, and to deal with trace table caching. - -ibm032-pinsn.c: - New file, contains RT disassembler. - -ibm032-opcode.h: - New file, contains RT opcode definitions. - -infcmd.c - Changed code to use csh instead of sh to avoid the anoyance of the environment bug. - Added initialize routine. - -inflow.c: - Added initialize routine. - -infrun.c: - set_current_frame now takes an extra argument. - Added some code to deal with stopping in the middle of a camphor link. (Under #ifdef CAMPHOR). - Added RT specific code to get the return values from the right registers. Replaces code that was there for RT. - RT specific code to do a "POP_DUMMY_FRAME." Dummy frames are to store more complete state than a normal frame. Makes calling a function in inferior more reliable. Perhaps this should be expanded to other machine types. - Added initialize routine. - - Feb 9, 1987 Zalman Stern. - Added call to select_frame after popping a stack dummy frame in normal_stop. This fixes the bug where you could not print variables without doing a "frame 0" after printing an expression with a function call in it. - -iniitialize.h: - Changed file to use #ifdef's for machine type. Allows one to use same sources for different machines. - -m-ibm032.h: - New file, contains RT specific macros and variables. - -param.h: - Changed file to use #ifdef's for machine type. Allows one to use same sources for different machines. - -pinsn.c: - Changed file to use #ifdef's for machine type. Allows one to use same sources for different machines. - -printcmd.c: - Moved alloca calls out of variable initialization. - Added initialize routine. - -source.c: - Added initialize routine. - -stack.c: - Added initialize routine. - -symmisc.c: - Added initialize routine. - -symtab.c: - RT specific code to deal with function names being _.foo instead of _foo. - Added initialize routine. - -utils.c: - Added comment. - -valarith.c: - Added initialize routine. - -valops.c: - Added initialize routine. - -valprint.c: - Added initialize routine. - -values.c: - Added initialize routine. - -Only in .: ibm032-opcode.h - -/* The opcode table consists of a 256 element array containing an - * instruction mnemonic and an instruction type field. This can be - * indexed directly by the first eight bits of an RT instruction. - * The instruction type consists of a type field and some flags. - * In addition to this, there is an ifdef'd out "instruction" table - * at the end of the file. This is an alphabetical listing of the instructions - * containing mnemonic, opcode, and type. This is useful for modification - * purposes. There is also some code in the ifdef to convert the - * instruction table into an opcode table. - */ - -/* Various useful bit masks. */ -#define ibm032_typeMask 0x0f /* Mask to get actual type info out of instruction type. */ -#define LOW4 0x0f -#define HIGH4 0xf0 -#define LOW16 0x0000ffff -#define HIGH16 0xffff0000 -#define LOW20 0x000fffff -#define LOW24 0x00ffffff - -/* Instruction types consist of a type id in the low 4 bits and flags above that. */ - -/* Flags. */ -#define ibm032_conditional 0x10 -#define ibm032_negative 0x20 - -/* Format types. */ -#define ibm032_JI 0x0 /* Jump immediate. */ -#define ibm032_X 0x1 /* ??? */ - -/* These next ones are in a special bit position. Do not change their defines. */ -#define ibm032_DS0 0x2 /* Data short with no shift for immediate value. */ -#define ibm032_DS1 0x3 /* Data short with 1 bit shift for immediate value. */ -#define ibm032_DS2 0x4 /* Data short with 2 bit shift for immediate value */ -#define ibm032_DSShiftOffset ibm032_DS0 /* Offset to get shift value from ibm032_DS? types. */ - -#define ibm032_RR 0x5 /* R format where second argument is a register */ -#define ibm032_RI 0x6 /* R format where second argument is 4 bit immediate. */ -#define ibm032_BI 0x7 /* Branch immediate. */ -#define ibm032_BA 0x8 /* Branch absolute. */ -#define ibm032_D 0x9 /* Data. */ - -/* What an instruction looks like. */ -struct ibm032_opcode { - char *mnemonic; /* the name. NULL indicates illegal instruction. */ - int type; /* See above. */ -}; - -#define MAXOPCODES 256 /* Pretty well hardwired. */ - -#ifndef BUILDTABLE -/* The actual data. */ -struct ibm032_opcode ibm032_opcodes[] = { - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional | ibm032_negative}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"j%s", ibm032_JI | ibm032_conditional}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"stcs", ibm032_DS0}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sths", ibm032_DS1}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"sts", ibm032_DS2}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lcs", ibm032_DS0}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"lhas", ibm032_DS1}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"cas", ibm032_X}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {"ls", ibm032_DS2}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {"b%s", ibm032_BI | ibm032_conditional | ibm032_negative}, - {"b%sx", ibm032_BI | ibm032_conditional | ibm032_negative}, - {"bala", ibm032_BA}, - {"balax", ibm032_BA}, - {"bali", ibm032_BI}, - {"balix", ibm032_BI}, - {"b%s", ibm032_BI | ibm032_conditional}, - {"b%sx", ibm032_BI | ibm032_conditional}, - {"ais", ibm032_RI}, - {"inc", ibm032_RI}, - {"sis", ibm032_RI}, - {"dec", ibm032_RI}, - {"cis", ibm032_RI}, - {"clrsb", ibm032_RI}, - {"mfs", ibm032_RR}, - {"setsb", ibm032_RI}, - {"clrbu", ibm032_RI}, - {"clrbl", ibm032_RI}, - {"setbu", ibm032_RI}, - {"setbl", ibm032_RI}, - {"mftbiu", ibm032_RI}, - {"mftbil", ibm032_RI}, - {"mttbiu", ibm032_RI}, - {"mttbil", ibm032_RI}, - {"sari", ibm032_RI}, - {"sari16", ibm032_RI}, - {0, 0}, - {0, 0}, - {"lis", ibm032_RI}, - {0, 0}, - {0, 0}, - {0, 0}, - {"sri", ibm032_RI}, - {"sri16", ibm032_RI}, - {"sli", ibm032_RI}, - {"sli16", ibm032_RI}, - {"srpi", ibm032_RI}, - {"srpi16", ibm032_RI}, - {"slpi", ibm032_RI}, - {"slpi16", ibm032_RI}, - {"sar", ibm032_RR}, - {"exts", ibm032_RR}, - {"sf", ibm032_RR}, - {"cl", ibm032_RR}, - {"c", ibm032_RR}, - {"mts", ibm032_RR}, - {"d", ibm032_RR}, - {0, 0}, - {"sr", ibm032_RR}, - {"srp", ibm032_RR}, - {"sl", ibm032_RR}, - {"slp", ibm032_RR}, - {"mftb", ibm032_RR}, - {"tgte", ibm032_RR}, - {"tlt", ibm032_RR}, - {"mttb", ibm032_RR}, - {"svc", ibm032_D}, - {"ai", ibm032_D}, - {"cal16", ibm032_D}, - {"oiu", ibm032_D}, - {"oil", ibm032_D}, - {"nilz", ibm032_D}, - {"nilo", ibm032_D}, - {"xil", ibm032_D}, - {"cal", ibm032_D}, - {"lm", ibm032_D}, - {"lha", ibm032_D}, - {"ior", ibm032_D}, - {"ti", ibm032_D}, - {"l", ibm032_D}, - {"lc", ibm032_D}, - {"tsh", ibm032_D}, - {"lps", ibm032_D}, - {"aei", ibm032_D}, - {"sfi", ibm032_D}, - {"cli", ibm032_D}, - {"ci", ibm032_D}, - {"niuz", ibm032_D}, - {"niuo", ibm032_D}, - {"xiu", ibm032_D}, - {"cau", ibm032_D}, - {"stm", ibm032_D}, - {"lh", ibm032_D}, - {"iow", ibm032_D}, - {"sth", ibm032_D}, - {"st", ibm032_D}, - {"stc", ibm032_D}, - {0, 0}, - {"abs", ibm032_RR}, - {"a", ibm032_RR}, - {"s", ibm032_RR}, - {"o", ibm032_RR}, - {"twoc", ibm032_RR}, - {"n", ibm032_RR}, - {"m", ibm032_RR}, - {"x", ibm032_RR}, - {"b%sr", ibm032_RR | ibm032_conditional | ibm032_negative}, - {"b%srx", ibm032_RR | ibm032_conditional | ibm032_negative}, - {0, 0}, - {"lhs", ibm032_RR}, - {"balr", ibm032_RR}, - {"balrx", ibm032_RR}, - {"b%sr", ibm032_RR | ibm032_conditional}, - {"b%srx", ibm032_RR | ibm032_conditional}, - {"wait", ibm032_RR}, - {"ae", ibm032_RR}, - {"se", ibm032_RR}, - {"ca16", ibm032_RR}, - {"onec", ibm032_RR}, - {"clz", ibm032_RR}, - {0, 0}, - {0, 0}, - {0, 0}, - {"mc03", ibm032_RR}, - {"mc13", ibm032_RR}, - {"mc23", ibm032_RR}, - {"mc33", ibm032_RR}, - {"mc30", ibm032_RR}, - {"mc31", ibm032_RR}, - {"mc32", ibm032_RR}, -}; - -#else -struct ibm032_opcode ibm032_opcodes[MAXOPCODES]; - -struct ibm032_instruction { - char *mnemonic; /* Mnemonic for this instruction */ - char opcode; /* Numerical value of opcode. */ - int type; /* This instructions format. */ -}; - -struct ibm032_instruction ibm032_instructions[] = -{ - {"a", 0xe1, ibm032_RR}, - {"abs", 0xe0, ibm032_RR}, - {"ae", 0xf1, ibm032_RR}, - {"aei", 0xd1, ibm032_D}, - {"ai", 0xc1, ibm032_D}, - {"ais", 0x90, ibm032_RI}, - {"bala", 0x8a, ibm032_BA}, - {"balax", 0x8b, ibm032_BA}, - {"bali", 0x8c, ibm032_BI}, - {"balix", 0x8d, ibm032_BI}, - {"balr", 0xec, ibm032_RR}, - {"balrx", 0xed, ibm032_RR}, - {"b%s", 0x8e, ibm032_BI | ibm032_conditional}, - {"b%sr", 0xee, ibm032_RR | ibm032_conditional}, - {"b%srx", 0xef, ibm032_RR | ibm032_conditional}, - {"b%sx", 0x8f, ibm032_BI | ibm032_conditional}, - {"b%s", 0x88, ibm032_BI | ibm032_conditional | ibm032_negative}, - {"b%sr", 0xe8, ibm032_RR | ibm032_conditional | ibm032_negative}, - {"b%srx", 0xe9, ibm032_RR | ibm032_conditional | ibm032_negative}, - {"b%sx", 0x89, ibm032_BI | ibm032_conditional | ibm032_negative}, - {"c", 0xb4, ibm032_RR}, - {"cal", 0xc8, ibm032_D}, - {"cal16", 0xc2, ibm032_D}, - {"cas", 0x60, ibm032_X}, - {"cau", 0xd8, ibm032_D}, - {"ca16", 0xf3, ibm032_RR}, - {"ci", 0xd4, ibm032_D}, - {"cis", 0x94, ibm032_RI}, - {"cl", 0xb3, ibm032_RR}, - {"cli", 0xd3, ibm032_D}, - {"clrbl", 0x99, ibm032_RI}, - {"clrbu", 0x98, ibm032_RI}, - {"clrsb", 0x95, ibm032_RI}, - {"clz", 0xf5, ibm032_RR}, - {"d", 0xb6, ibm032_RR}, - {"dec", 0x93, ibm032_RI}, - {"exts", 0xb1, ibm032_RR}, - {"inc", 0x91, ibm032_RI}, - {"ior", 0xcb, ibm032_D}, - {"iow", 0xdb, ibm032_D}, - - {"j%s", 0x08, ibm032_JI | ibm032_conditional}, - {"j%s", 0x00, ibm032_JI | ibm032_conditional | ibm032_negative}, - - {"l", 0xcd, ibm032_D}, - {"lc", 0xce, ibm032_D}, - {"lcs", 0x40, ibm032_DS0}, - {"lh", 0xda, ibm032_D}, - {"lha", 0xca, ibm032_D}, - {"lhas", 0x50, ibm032_DS1}, - {"lhs", 0xeb, ibm032_RR}, - {"lis", 0xa4, ibm032_RI}, - {"lm", 0xc9, ibm032_D}, - {"lps", 0xd0, ibm032_D}, - {"ls", 0x70, ibm032_DS2}, - {"m", 0xe6, ibm032_RR}, - {"mc03", 0xf9, ibm032_RR}, - {"mc13", 0xfa, ibm032_RR}, - {"mc23", 0xfb, ibm032_RR}, - {"mc33", 0xfc, ibm032_RR}, - {"mc30", 0xfd, ibm032_RR}, - {"mc31", 0xfe, ibm032_RR}, - {"mc32", 0xff, ibm032_RR}, - {"mfs", 0x96, ibm032_RR}, - {"mftb", 0xbc, ibm032_RR}, - {"mftbil", 0x9d, ibm032_RI}, - {"mftbiu", 0x9c, ibm032_RI}, - {"mts", 0xb5, ibm032_RR}, - {"mttb", 0xbf, ibm032_RR}, - {"mttbil", 0x9f, ibm032_RI}, - {"mttbiu", 0x9e, ibm032_RI}, - {"n", 0xe5, ibm032_RR}, - - {"nilo", 0xc6, ibm032_D}, - {"nilz", 0xc5, ibm032_D}, - {"niuo", 0xd6, ibm032_D}, - {"niuz", 0xd5, ibm032_D}, - {"o", 0xe3, ibm032_RR}, - {"oil", 0xc4, ibm032_D}, - {"oiu", 0xc3, ibm032_D}, - {"onec", 0xf4, ibm032_RR}, - {"s", 0xe2, ibm032_RR}, - {"sar", 0xb0, ibm032_RR}, - {"sari", 0xa0, ibm032_RI}, - {"sari16", 0xa1, ibm032_RI}, - {"se", 0xf2, ibm032_RR}, - {"setbl", 0x9b, ibm032_RI}, - {"setbu", 0x9a, ibm032_RI}, - {"setsb", 0x97, ibm032_RI}, - {"sf", 0xb2, ibm032_RR}, - - {"sfi", 0xd2, ibm032_D}, - - {"sis", 0x92, ibm032_RI}, - {"sl", 0xba, ibm032_RR}, - {"sli", 0xaa, ibm032_RI}, - {"sli16", 0xab, ibm032_RI}, - {"slp", 0xbb, ibm032_RR}, - {"slpi", 0xae, ibm032_RI}, - {"slpi16", 0xaf, ibm032_RI}, - {"sr", 0xb8, ibm032_RR}, - {"sri", 0xa8, ibm032_RI}, - {"sri16", 0xa9, ibm032_RI}, - {"srp", 0xb9, ibm032_RR}, - {"srpi", 0xac, ibm032_RI}, - {"srpi16", 0xad, ibm032_RI}, - - {"st", 0xdd, ibm032_D}, - - {"stc", 0xde, ibm032_D}, - {"stcs", 0x10, ibm032_DS0}, - {"sth", 0xdc, ibm032_D}, - {"sths", 0x20, ibm032_DS1}, - {"stm", 0xd9, ibm032_D}, - {"sts", 0x30, ibm032_DS2}, - {"svc", 0xc0, ibm032_D}, - {"tgte", 0xbd, ibm032_RR}, - {"ti", 0xcc, ibm032_D}, - {"tlt", 0xbe, ibm032_RR}, - {"tsh", 0xcf, ibm032_D}, - {"twoc", 0xe4, ibm032_RR}, - {"wait", 0xf0, ibm032_RR}, - {"x", 0xe7, ibm032_RR}, - {"xil", 0xc7, ibm032_D}, - {"xiu", 0xd7, ibm032_D} -}; - -/* Code to generate the packed opcode table from the instructions table. */ - -#include <stdio.h> - -char *typeNames[] = { - "ibm032_JI", - "ibm032_X", - "ibm032_DS0", - "ibm032_DS1", - "ibm032_DS2", - "ibm032_RR", - "ibm032_RI", - "ibm032_BI", - "ibm032_BA", - "ibm032_D" -}; - -main() -{ - - int i, j, opcode, type; - - for (j = (sizeof(ibm032_instructions) / sizeof(struct ibm032_instruction)); j >= 0; j--) { - opcode = ibm032_instructions[j].opcode; - switch (ibm032_instructions[j].type & ibm032_typeMask) { - case ibm032_JI: - i = 7; - break; - case ibm032_X: - case ibm032_DS0: - case ibm032_DS1: - case ibm032_DS2: - i = 15; - break; - case ibm032_RR: - case ibm032_RI: - default: - i = 0; - break; - } - for (;i >= 0; i--) { - ibm032_opcodes[opcode + i].mnemonic = ibm032_instructions[j].mnemonic; - ibm032_opcodes[opcode + i].type = ibm032_instructions[j].type; - } - } - - printf("struct ibm032_opcode ibm032_opcodes[] = {\n"); - for ( j = 0; j < 256; j++) { - type = ibm032_opcodes[j].type; - if (ibm032_opcodes[j].mnemonic != NULL) - printf(" {\"%s\",\t\t%s%s%s},\n", ibm032_opcodes[j].mnemonic, - typeNames[type & ibm032_typeMask], - (type & ibm032_conditional) ? " | ibm032_conditional" : "", - (type & ibm032_negative) ? " | ibm032_negative" : ""); - else - printf(" {0,\t\t\t0},\n"); - } - printf("};\n"); -} -#endif /* BUILDTABLE */ - -Only in .: ibm032-pinsn.c - -/* Print ibm032 instructions for GDB, the GNU debugger. - Copyright (C) 1986 Free Software Foundation, Inc. - -GDB is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY. No author or distributor accepts responsibility to anyone -for the consequences of using it or for whether it serves any -particular purpose or works at all, unless he says so in writing. -Refer to the GDB General Public License for full details. - -Everyone is granted permission to copy, modify and redistribute GDB, -but only under the conditions described in the GDB General Public -License. A copy of this license is supposed to have been given to you -along with GDB so you can know your rights and responsibilities. It -should be in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. - -In other words, go ahead and share GDB, but don't try to stop -anyone else from sharing it farther. Help stamp out software hoarding! -*/ - -#include <stdio.h> - -#include "defs.h" -#include "param.h" -#include "symtab.h" -#include "ibm032-opcode.h" - -/* ibm032 instructions are never longer than this many bytes. */ -#define MAXLEN 4 - -extern char *reg_names[]; - -static char *mapCondition(); - - -/* Print the ibm032 instruction at address MEMADDR in debugged memory, - on STREAM. Returns length of the instruction, in bytes. */ - -int -print_insn (memaddr, stream) - CORE_ADDR memaddr; - FILE *stream; -{ - unsigned char buffer[MAXLEN]; - int opcodeIndex, instructionBits, type; - char *mnemonic; - - read_memory (memaddr, buffer, MAXLEN); - instructionBits = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]; /* Get it into an int for easy use. */ - - if ((mnemonic = ibm032_opcodes[opcodeIndex = buffer[0]].mnemonic) == NULL) - { - fprintf (stream, "0%o", (instructionBits & HIGH16) >> 16); - return 2; - } - type = ibm032_opcodes[opcodeIndex].type; - if (!(type & ibm032_conditional)) { - fprintf (stream, "%s", mnemonic); - - switch (type) { - - int displacement; /* Used for sign extensions. */ - char *sign; - - case ibm032_X: - fprintf(stream, "\t%s, %s(%s)", reg_names[buffer[0] & LOW4], (buffer[1] & HIGH4) ? (reg_names[(buffer[1] & HIGH4) >> 4]) : "", reg_names[buffer[1] & LOW4]); - return 2; - case ibm032_DS0: - case ibm032_DS1: - case ibm032_DS2: - fprintf(stream, "\t%s, %x", reg_names[(buffer[1] & HIGH4) >> 4], (buffer[0] & LOW4) << (ibm032_opcodes[opcodeIndex].type - ibm032_DSShiftOffset)); /* Hacked to shift imediate field. */ - if (buffer[1] & LOW4) - fprintf(stream, "(%s)", reg_names[buffer[1] & LOW4]); - return 2; - case ibm032_RR: - fprintf(stream, "\t%s, %s", reg_names[(buffer[1] & HIGH4) >> 4], reg_names[buffer[1] & 0x0f]); - return 2; - case ibm032_RI: - fprintf(stream, "\t%s, %x", reg_names[(buffer[1] & HIGH4) >> 4], buffer[1] & LOW4); - return 2; - case ibm032_BI: - fprintf(stream, "\t%s, ", reg_names[(buffer[1] & HIGH4) >> 4]); - displacement = (instructionBits & LOW20); - if ((displacement & (1 << 19)) != 0) /* Cover sign extension. */ - displacement |= 0xfff00000; - print_address(memaddr + (displacement * 2), stream); /* Need sign extension. */ - return 4; - case ibm032_BA: - print_address((instructionBits & LOW24) & ~1, stream); - return 4; - case ibm032_D: - displacement = (instructionBits & LOW16); - if ((displacement & (1 << 15)) != 0) { /* Cover sign extension. */ - displacement = - (displacement | 0xffff0000); - sign = "-"; - } - else - sign = ""; - fprintf(stream, "\t%s, %s, %s%x", reg_names[(buffer[1] & HIGH4) >> 4], reg_names[buffer[1] & LOW4], sign, displacement); - return 4; - } - } - else { /* Conditional branches are hacked. */ - switch (type & 0x0f) { - - int displacement; - - case ibm032_JI: - fprintf(stream, ibm032_opcodes[opcodeIndex].mnemonic, mapCondition(type & ibm032_negative, buffer[0] & LOW4)); - putc('\t', stream); - print_address((buffer[1] << 1) + memaddr, stream); - return 2; - case ibm032_BI: - fprintf(stream, ibm032_opcodes[opcodeIndex].mnemonic, mapCondition(type & ibm032_negative, (buffer[1] & HIGH4) >> 4)); - putc('\t', stream); - displacement = (instructionBits & LOW20); - if ((displacement & (1 << 19)) != 0) /* Cover sign extension. */ - displacement |= 0xfff00000; - print_address((displacement * 2) + memaddr, stream); - return 4; - case ibm032_RR: - fprintf(stream, ibm032_opcodes[opcodeIndex].mnemonic, mapCondition(type & ibm032_negative, (buffer[1] & HIGH4) >> 4)); - fprintf(stream, "\t%s", reg_names[buffer[1] & LOW4]); - return 2; - } - } -} - -/* Converts a 4 bit "conditional specifier" into a semi-meaningful name. */ -static char *mapCondition(negative, conditionBits) - int conditionBits; -{ - - char *condition; - - if (negative) - switch (conditionBits) { - case 0x8: - condition = ""; - break; - case 0x9: - condition = "ge"; - break; - case 0xa: - condition = "ne"; - break; - case 0xb: - condition = "le"; - break; - case 0xc: - condition = "nc"; - break; - case 0xd: /* Reserved. */ - condition = "notbogus"; - break; - case 0xe: - condition = "no"; - break; - case 0xf: - condition = "ntb"; - break; - default: - condition = "notbogus"; - break; - } - else - switch (conditionBits) { - case 0x8: - condition = "nop"; - break; - case 0x9: - condition = "lt"; - break; - case 0xa: - condition = "eq"; - break; - case 0xb: - condition = "gt"; - break; - case 0xc: - condition = "c"; - break; - case 0xd: /* Reserved. */ - condition = "bogus"; - break; - case 0xe: - condition = "o"; - break; - case 0xf: - condition = "tb"; - break; - default: - condition = "bogus"; - break; - } - return condition; -} - -Only in .: m-ibm032.h - -/* Parameters for execution on an IBM RT, for GDB, the GNU debugger. - Copyright (C) 1986 Free Software Foundation, Inc. - -GDB is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY. No author or distributor accepts responsibility to anyone -for the consequences of using it or for whether it serves any -particular purpose or works at all, unless he says so in writing. -Refer to the GDB General Public License for full details. - -Everyone is granted permission to copy, modify and redistribute GDB, -but only under the conditions described in the GDB General Public -License. A copy of this license is supposed to have been given to you -along with GDB so you can know your rights and responsibilities. It -should be in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. - -In other words, go ahead and share GDB, but don't try to stop -anyone else from sharing it farther. Help stamp out software hoarding! -*/ - -/* Define this if the C compiler puts an underscore at the front - of external names before giving them to the linker. */ - -#define NAMES_HAVE_UNDERSCORE - -/* Offset from address of function to start of its code. - Zero on most machines. */ - -#define FUNCTION_START_OFFSET 0 - -/* Advance PC across any function entry prologue instructions - to reach some "real" code. */ - -#define SKIP_PROLOGUE(pc) \ -{ register int op = read_memory_integer (pc, 1) & 0x00ff; \ - if (op == 0xd9) { \ - pc += 4; \ - op = read_memory_integer (pc, 2); \ - if ((op & 0xff00) == 0xc100) { /* pcc prolog add r1, number */ \ - pc += 4; \ - op = read_memory_integer (pc, 1) & 0x00ff; \ - if (op == 0x6e) { /* cas r14, 0 */ \ - pc += 2; \ - op = read_memory_integer (pc, 2) & 0xffff; \ - if (op == 0xc8d1) pc += 4; /* cal r13, junk(r1) */ \ - } \ - } \ - else if ((op & 0xffff) == 0x6e00) { /* hc prolog cas r14, 0 */ \ - pc += 4; \ - op = read_memory_integer(pc, 1) & 0xff; \ - if (op == 0x6d) { /* cas r13 junk, probably */ \ - pc += 2; \ - op = read_memory_integer(pc, 2) & 0xffff; \ - if (op == 0xc811) pc += 4; /* cal r1, foo(r1) */ \ - } \ - } \ - } \ - while (1) { \ - /* now watch for st, sth, stc, and short versions thereof, cas instructions and exts */ \ - /* which are all used to store the parameters from r2-r5 onto the stack or into reg vars */ \ - op = read_memory_integer (pc, 2); \ - if ((op & 0xff00) == 0x3000 && (op & 0xf0) >= 0x20 && (op & 0xf0) <= 0x50) pc += 2; \ - else if ((op & 0xff00) == 0x2300 && (op & 0xf0) >= 0x20 && (op & 0xf0) <= 0x50) pc += 2; \ - else if ((op & 0xff00) == 0x1b00 && (op & 0xf0) >= 0x20 && (op & 0xf0) <= 0x50) pc += 2; \ - else if ((op & 0xff00) == 0x6c00 && (op & 0xf0) >= 0x20 && (op & 0xf0) <= 0x50) pc += 2; \ - else if ((op & 0xff00) == 0xb100) pc += 2; /* extend sign */ \ - else if ((op & 0xff00) == 0xdd00 && (op & 0xf0) >= 0x20 && (op & 0xf0) <= 0x50) pc += 4; \ - else break; \ - } \ -} - -/* Immediately after a function call, return the saved pc. - Can't go through the frames for this because on some machines - the new frame is not set up until the new function executes - some instructions. */ - -#define SAVED_PC_AFTER_CALL(frame) \ -read_register (15) - -/* This is the amount to subtract from u.u_ar0 - to get the offset in the core file of the register values. */ - -#define KERNEL_U_ADDR (0x20000000 - NBPG * (UPAGES)) - -/* Address of end of stack space. */ - -/* extra page is for the "red zone" */ -#define STACK_END_ADDR (0x20000000 - NBPG * (UPAGES+1)) - -/* Stack grows downward. */ - -#define INNER_THAN < - -/* Sequence of bytes for breakpoint instruction. */ - -#define BREAKPOINT {0xbd, 0x00} - -/* Amount PC must be decremented by after a breakpoint. - This is often the number of bytes in BREAKPOINT - but not always. */ - -#define DECR_PC_AFTER_BREAK 0 - -/* Nonzero if instruction at PC is a return instruction. */ - -#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) & 0x00ff == 0xc9) - -/* Return 1 if P points to an invalid floating point value. */ - -#define INVALID_FLOAT(p) 0 /* Just a first guess; not checked */ - -/* Say how long (ordinary) registers are. */ - -#define REGISTER_TYPE long - -/* Number of machine registers */ - -#define NUM_REGS 18 - -/* Initializer for an array of names of registers. - There should be NUM_REGS strings in this initializer. */ - -#define REGISTER_NAMES {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "iar", "mq"} - -/* Register numbers of various important registers. - Note that some of these values are "real" register numbers, - and correspond to the general registers of the machine, - and some are "phony" register numbers which are too large - to be actual register numbers as far as the user is concerned - but do serve to get the desired values when passed to read_register. */ - -#define FP_REGNUM 13 /* Contains address of executing stack frame */ -#define SP_REGNUM 1 /* Contains address of top of stack */ -#define PS_REGNUM 17 /* Contains processor status */ -#define PC_REGNUM 16 /* Contains program counter */ - -#define REGISTER_U_ADDR(addr, blockend, regno) \ -{ addr = blockend + regno * 4; } - -/* Total amount of space needed to store our copies of the machine's - register state, the array `registers'. */ -#define REGISTER_BYTES (NUM_REGS*4) - -/* Index within `registers' of the first byte of the space for - register N. */ - -#define REGISTER_BYTE(N) ((N) * 4) - -/* Number of bytes of storage in the actual machine representation - for register N. On the vax, all regs are 4 bytes. */ - -#define REGISTER_RAW_SIZE(N) 4 - -/* Number of bytes of storage in the program's representation - for register N. On the vax, all regs are 4 bytes. */ - -#define REGISTER_VIRTUAL_SIZE(N) 4 - -/* Largest value REGISTER_RAW_SIZE can have. */ - -#define MAX_REGISTER_RAW_SIZE 4 - -/* Largest value REGISTER_VIRTUAL_SIZE can have. */ - -#define MAX_REGISTER_VIRTUAL_SIZE 4 - -/* Nonzero if register N requires conversion - from raw format to virtual format. */ - -#define REGISTER_CONVERTIBLE(N) 0 - -/* Convert data from raw format for register REGNUM - to virtual format for register REGNUM. */ - -#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO) \ - bcopy ((FROM), (TO), 4); - -/* Convert data from virtual format for register REGNUM - to raw format for register REGNUM. */ - -#define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO) \ - bcopy ((FROM), (TO), 4); - -/* Return the GDB type object for the "standard" data type - of data in register N. */ - -#define REGISTER_VIRTUAL_TYPE(N) builtin_type_int - -/* Describe the pointer in each stack frame to the previous stack frame - (its caller). */ - -/* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - FRAME_CHAIN_COMBINE takes the chain pointer and the frame's nominal address - and produces the nominal address of the caller frame. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. - In that case, FRAME_CHAIN_COMBINE is not used. */ - -/* In the case of the Sun, the frame's nominal address - is the address of a 4-byte word containing the calling frame's address. */ - -#define FRAME_CHAIN(thisframe) (rt_prev_frame(thisframe)) - -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain >= 0x10000000 && chain < 0x20000000) - -#define FRAME_CHAIN_COMBINE(chain, thisframe) (chain) - -/* Define other aspects of the stack frame. */ - -#define FRAME_SAVED_PC(frame) (rt_frame_reg(frame, 15)) - -#define FRAME_ARGS_ADDRESS(fi) (rt_frame_args(fi.frame)) - -#define FRAME_LOCALS_ADDRESS(fi) (fi.frame) - -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -#define FRAME_NUM_ARGS(val, fi) \ -{register struct rt_frame *tf; \ - tf = get_cached_frame(fi.frame); \ - val = -1; \ - if (tf) val = tf->nParms;\ -} - -/* Return number of bytes at start of arglist that are not really args. */ - -#define FRAME_ARGS_SKIP 0 - -/* Put here the code to store, into a struct frame_saved_regs, - the addresses of the saved registers of frame described by FRAME_INFO. - This includes special registers such as pc and fp saved in special - ways in the stack frame. sp is even more special: - the address we return for it IS the sp for the next frame. */ - -#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ -{ register int regnum; \ - register struct rt_frame *tf; \ - register CORE_ADDR next_addr; \ - bzero (&(frame_saved_regs), sizeof (frame_saved_regs)); \ - tf = get_cached_frame((frame_info).frame); \ - if (tf) { \ - for(regnum = tf->firstReg; regnum < 16; regnum++) { \ - (frame_saved_regs).regs[regnum] = tf->firstRLoc+ 4*(regnum - tf->firstReg); \ - } \ - } \ -} - - -/* Things needed for making the inferior call functions. */ - -/* Push an empty stack frame, to record the current PC, etc. */ - -#define PUSH_DUMMY_FRAME \ -{ register CORE_ADDR sp = read_register (SP_REGNUM);\ - register int regnum; \ - sp = push_word (sp, read_register (PC_REGNUM)); \ - for (regnum = 15; regnum >= 0; regnum--) \ - sp = push_word (sp, read_register (regnum)); \ - write_register (FP_REGNUM, sp+64); \ - write_register (SP_REGNUM, sp); } - -/* discard special frame pushed by PUSH_DUMMY_FRAME */ -#define POP_DUMMY_FRAME \ - {register CORE_ADDR sp; \ - register int regnum; \ - sp = read_register(FP_REGNUM)-64; \ - for(regnum = 0; regnum < 16;regnum++) { \ - write_register(regnum, read_memory_integer(sp, 4)); \ - sp += 4; \ - } \ - /* now get the pc */ \ - write_register(PC_REGNUM, read_memory_integer(sp, 4)); \ - sp += 4; \ - } - -/* Discard from the stack the innermost frame, restoring all registers. */ -/* THIS ROUTINE DOES NOT SET R1 (SP_REGNUM) CORRECTLY */ -/* REALLY MUST CONSULT TRACE TBL TO FIND OUT FRAME SIZE */ -#define POP_FRAME \ -{ register CORE_ADDR fp = read_register (FP_REGNUM); \ - register int regnum; \ - register struct rt_frame *tf; \ - tf = (struct rt_frame *) get_cached_frame(fp); \ - if (tf) { \ - for(regnum = tf->firstReg; regnum < 16; regnum++) { \ - write_register(regnum, \ - read_memory_integer (tf->firstRLoc + 4*(regnum-tf->firstReg), 4) \ - ); \ - } \ - write_register(PC_REGNUM, read_register(15)); \ - write_register(SP_REGNUM, tf->firstRLoc + 4*(16-tf->firstReg) + 36); \ - } \ -} - -/* This sequence of words is the instructions - ls r2,0(r1) 2 bytes pick up args - ls r3,4(r1) 2 bytes pick up args - ls r4,8(r1) 2 bytes pick up args - ls r5,c(r1) 2 bytes pick up args - cal r1,16(r1) 4 bytes fix up ap (==sp) - cal16 r15,<low> 4 bytes do call - oiu r15,<high>(r15) 4 - lr r0,r15 2 - ls r15,0(r15) 2 - balr r15 2 - bpt 2 get back to gdb - <4 byte trace table> 4 - -This is 16 bytes. -*/ - -#define CALL_DUMMY {0x70217131, 0x72417351, 0xc8110010, 0xc2f06969, \ - 0xc3ff6969, 0x60f070ff, 0xecffbd00, 0xdf7fdf00} - -#define CALL_DUMMY_LENGTH 32 - -#define CALL_DUMMY_START_OFFSET 0 - -/* Insert the specified number of args and function address - into a call sequence of the above form stored at DUMMYNAME. */ - -#define FIX_CALL_DUMMY(dummyname, fun, nargs) \ -{ *((short *)(((char *)dummyname)+14)) = fun&0xffff; \ -*((short *)(((char *)dummyname)+18)) = (fun>>16)&0xffff; \ -} - -/* Interface definitions for kernel debugger KDB. */ - -/* Map machine fault codes into signal numbers. - First subtract 0, divide by 4, then index in a table. - Faults for which the entry in this table is 0 - are not handled by KDB; the program's own trap handler - gets to handle then. */ - -#define FAULT_CODE_ORIGIN 0 -#define FAULT_CODE_UNITS 4 -#define FAULT_TABLE \ -{ 0, 0, 0, 0, SIGTRAP, 0, 0, 0, \ - 0, SIGTRAP, 0, 0, 0, 0, 0, SIGKILL, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - SIGILL } - -/* Start running with a stack stretching from BEG to END. - BEG and END should be symbols meaningful to the assembler. - This is used only for kdb, which we do not support. */ - -#define INIT_STACK(beg, end) \ -{ } - -/* Push the frame pointer register on the stack. */ -#define PUSH_FRAME_PTR \ -{ } - -/* Copy the top-of-stack to the frame pointer register. */ -#define POP_FRAME_PTR \ -{ } - -/* After KDB is entered by a fault, push all registers - that GDB thinks about (all NUM_REGS of them), - so that they appear in order of ascending GDB register number. - The fault code will be on the stack beyond the last register. */ - -#define PUSH_REGISTERS \ -{ } - -/* Assuming the registers (including processor status) have been - pushed on the stack in order of ascending GDB register number, - restore them and return to the address in the saved PC register. */ - -#define POP_REGISTERS \ -{ } - -Only in .: m-ibm032init.h - -/* This is how the size of an individual .o file's text segment - is rounded on a sun. */ - -#define FILEADDR_ROUND(addr) ((addr + 3) & -4) - -diff -c ../../gnu/gdb/blockframe.c ./blockframe.c -*** ../../gnu/gdb/blockframe.c Sat Apr 4 22:06:18 1987 ---- ./blockframe.c Mon Apr 27 01:06:06 1987 -*************** -*** 53,62 **** - } - - void -! set_current_frame (frame) - FRAME frame; - { - current_frame = frame; - } - - /* Return the frame that called FRAME. ---- 53,67 ---- - } - - void -! set_current_frame (frame, validp) - FRAME frame; -+ int validp; - { - current_frame = frame; -+ #ifdef ibm032 -+ if (validp) -+ recache_frames(); -+ #endif - } - - /* Return the frame that called FRAME. -*************** -*** 291,301 **** - CORE_ADDR pc; - { - register int i; - - /* Note that the last thing in the vector is always _etext. */ - for (i = 0; i < misc_function_count; i++) - { -! if (pc < misc_function_vector[i].address) - return i - 1; - } - return -1; ---- 296,309 ---- - CORE_ADDR pc; - { - register int i; -+ register long j; - - /* Note that the last thing in the vector is always _etext. */ - for (i = 0; i < misc_function_count; i++) - { -! if ((j = misc_function_vector[i].address) < 0) -! continue; -! if (pc < j) - return i - 1; - } - return -1; -*************** -*** 325,333 **** ---- 333,610 ---- - } - } - -+ #ifdef ibm032 -+ /* RT frame format: -+ arg 3 these are not really here, but are in regs -+ arg 2 -+ arg 1 -+ arg 0 -+ resvd 20 bytes -+ rn to r15 saved regs -+ floating regs (at first assume 0 bytes, fix later) -+ locals -+ -+ N.B. r13 points 64 bytes below the end of the locals. -+ */ -+ -+ /* -+ * Routine for ibm032 stack trace. Called after a new frame has been set. Do an entire stack -+ * trace, and squirrel away the information. We need to do this since the ibm032 (rt) does -+ * not have enough info in a known place off of the frame ptr (r13) to do anything useful. -+ * Instead, one also requires the pc, and can then perform various operations to find -+ * out how that procedure built its frame, and thus, to decode it. However, since this is -+ * fairly slow, we only do it after a set_current_frame operation has been performed. -+ */ -+ -+ #define rtTTSize 50 -+ static struct rtTTCache { -+ CORE_ADDR lbound; /* lowest address so far known as using this trace table */ -+ CORE_ADDR ttaddr; /* address of the last '0xdf' in the trace table */ -+ char ttype; /* type of the trace table -- 0 == unused */ -+ } ttcache[rtTTSize]; -+ short ttptr = 0; -+ -+ #define rtSize 50 -+ static struct rt_frame rtFrames[rtSize]; -+ static int rtCount; -+ static CORE_ADDR rt_next_frame, rt_next_pc; -+ -+ static struct rtTTCache *ttfind (addr) -+ CORE_ADDR addr; { -+ register int i; -+ register struct rtTTCache *tp; -+ for(i=0,tp=ttcache;i<rtTTSize;i++,tp++) { -+ if (addr >= tp->lbound && addr <= tp->ttaddr) return tp; -+ } -+ return 0; -+ } -+ -+ static ttadd(lowaddr, ttaddr, type) -+ register CORE_ADDR lowaddr, ttaddr; -+ char type; { -+ register struct rtTTCache *tp; -+ if (tp = ttfind(ttaddr)) { -+ /* possibly increase the bound on this cache element */ -+ if (lowaddr < tp->lbound) tp->lbound = lowaddr; -+ } -+ else { -+ /* add a new element */ -+ tp = &ttcache[ttptr++]; -+ tp->lbound = lowaddr; -+ tp->ttaddr = ttaddr; -+ tp->ttype = type; -+ if (ttptr >= rtTTSize) ttptr = 0; /* keep it in bounds */ -+ } -+ } -+ -+ /* this routine scans for a trace table, and returns 4 bytes: 0 0 <n params> <first saved reg> */ -+ rt_num_regs (pc, tf) -+ register struct rt_frame *tf; -+ CORE_ADDR pc; { -+ register state = 0; -+ register long newpc = pc; -+ register int tc; -+ short nparms, firstreg; -+ short ttype; -+ short optx; -+ long offset; -+ char offtype; -+ struct rtTTCache *tp; -+ CORE_ADDR frame; -+ -+ frame = tf->frame; -+ /* first see if it is in our ttcache */ -+ if (tp = ttfind(pc)) { -+ state = 3; -+ ttype = tp->ttype; -+ newpc = tp->ttaddr; -+ } -+ else { -+ /* state machine to look for 'df' 'xx' 'df' */ -+ while (1) { -+ tc = read_memory_integer(newpc, 2); -+ if (state == 0 && (tc&0xff00) == 0xdf00) { -+ state = 1; -+ ttype = tc & 0xff; -+ } -+ else if (state == 1 && (tc & 0xff00) == 0xdf00) { -+ state = 3; -+ break; -+ } -+ else state = 0; -+ if (newpc - pc > 20000) break; -+ newpc += 2; -+ } -+ if (state == 3) ttadd(pc, newpc, ttype); /* add to cache */ -+ } -+ if (state != 3) { -+ printf("No trace table for pc %x, making one up.\n", pc); -+ tf->nParms = 0; -+ tf->firstReg = 12; -+ tf->firstRLoc = frame+64; -+ rt_next_pc = read_memory_integer(frame+64+12, 4); -+ rt_next_frame = read_memory_integer(frame+64+4, 4); -+ return 0; -+ } -+ /* otherwise newpc is pointing at the last 'df' in the trace table */ -+ else if (ttype == 3) { -+ /* funny trace table found by OBSERVATION (not doc) to be in program prolog */ -+ return -1; /* special value checked by recache_frames */ -+ } -+ else if (ttype == 2) { -+ /* assembly: no registers were saved */ -+ tf->nParms = 0; -+ tf->firstReg = 16; -+ tf->firstRLoc = 0; -+ rt_next_pc = read_register(15); /* where we go back to */ -+ rt_next_frame = frame; -+ tf->frame -= 100; /* hack to eliminate duplicate tags */ -+ return 0; -+ } -+ else if (ttype == 0x7f) { -+ /* special machine state frame saved by STACK_DUMMY */ -+ tf->nParms = 0; -+ tf->firstReg = 16; -+ tf->firstRLoc = 0; -+ rt_next_pc = read_memory_integer(frame + 64 - 64, 4); -+ rt_next_frame = read_memory_integer(frame -64 + 13*4, 4); -+ return 0; -+ } -+ else { -+ /* C program, I hope */ -+ nparms = (read_memory_integer(newpc+2, 1) >> 4) & 0x0f; -+ firstreg = ((tc=read_memory_integer(newpc+1, 1)) >> 4) & 0x0f; -+ optx = ((tc&4)? 1 : 0); /* flags says if floating registers described */ -+ offtype = read_memory_integer(newpc+optx+3, 1) & 0xff; -+ if ((offtype & 0xc0) == 0) { -+ /* 6 bits of local offset */ -+ offset = offtype & 0x3f; -+ } -+ else if ((offtype & 0xc0) == 0x40) { -+ /* 14 bits of local offset */ -+ offset = (offtype & 0x3f) << 8; -+ offset += (read_memory_integer(newpc+optx+4, 1) & 0xff); -+ } -+ else if ((offtype & 0xc0) == 0x80) { -+ /* 22 bits of local offset */ -+ offset = (offtype & 0x3f) << 8; -+ offset += (read_memory_integer(newpc+optx+4, 1) & 0xff); -+ offset <<= 8; -+ offset += (read_memory_integer(newpc+optx+5, 1) & 0xff); -+ } -+ else if ((offtype & 0xc0) == 0xc0) { -+ /* 30 bits of local offset */ -+ offset = (offtype & 0x3f) << 8; -+ offset += (read_memory_integer(newpc+optx+4, 1) & 0xff); -+ offset <<= 8; -+ offset += (read_memory_integer(newpc+optx+5, 1) & 0xff); -+ offset <<= 8; -+ offset += (read_memory_integer(newpc+optx+6, 1) & 0xff); -+ } -+ offset <<= 2; -+ tf->nParms = nparms; -+ tf->firstReg = firstreg; -+ tf->firstRLoc = frame /* initial frame location */ -+ + offset /* to top of frame */ -+ - 36 /* pascal static link, incomings args and linkage */ -+ - (4*(16-firstreg)); /* space used by general regs */ -+ rt_next_pc = read_memory_integer(tf->firstRLoc + 4*(15-firstreg), 4); -+ rt_next_frame = read_memory_integer(tf->firstRLoc + 4*(13-firstreg), 4); -+ return 0; -+ } -+ } -+ -+ recache_frames() { -+ register long i, j; -+ long pc; -+ CORE_ADDR curfp; -+ struct rt_frame *tf; -+ -+ pc = read_pc(); -+ curfp = current_frame; -+ rtCount = 0; -+ /* these next special cases can only occur with frame #0; others can't make calls -+ in these intermediate states. -+ */ -+ /* if pc points at br or brx, we're doing a return, so set the pc to the target */ -+ i=read_memory_integer(pc, 2); -+ if ((i & 0xfe00) == 0xe800) { -+ /* we're looking at a br or brx instruction */ -+ pc = read_register(i&0x0f); -+ } -+ /* also, if pc points at d9xx or c111 we're in the middle of a frame push, and should -+ use r15 for the pc. -+ */ -+ if ((i & 0xff00) == 0xd900 || (i & 0xffff) == 0xc111) { -+ pc = read_register(15); -+ } -+ while (1) { -+ if (curfp <= 0x10000000 || curfp >= 0x20000000) break; -+ if (pc > 0x20000000) break; -+ /* otherwise try to add a new frame structure */ -+ if (rtCount >= rtTTSize) break; -+ tf = &rtFrames[rtCount++]; -+ tf->frame = curfp; -+ tf->pc = pc; -+ i = rt_num_regs(pc, tf); -+ if (i<0) { /* exceptional values */ -+ rtCount--; /* last frame was bogus */ -+ break; -+ } -+ /* now setup for next iteration */ -+ pc = rt_next_pc; -+ curfp = rt_next_frame; -+ } -+ } -+ -+ struct rt_frame *get_cached_frame(aframe) -+ CORE_ADDR aframe; { -+ register int i; -+ for(i=0;i<rtCount;i++) { -+ if (rtFrames[i].frame == aframe) return &rtFrames[i]; -+ } -+ return 0; -+ } -+ -+ long rt_prev_frame(frame) -+ register CORE_ADDR frame; { -+ register int i; -+ for(i=0;i<rtCount-1;i++) { -+ if (rtFrames[i].frame == frame) return rtFrames[i+1].frame; -+ } -+ return 0; -+ } -+ -+ long rt_frame_reg(frame, reg) -+ CORE_ADDR frame; -+ register long reg; { -+ register struct rt_frame *tf; -+ tf = get_cached_frame(frame); -+ if (tf == 0) return 0; -+ if (tf->firstReg > reg) return 0; /* didn't save this one! */ -+ return read_memory_integer(tf->firstRLoc + 4 * (reg - tf->firstReg), 4); -+ } -+ -+ long rt_frame_args(frame) -+ CORE_ADDR frame; { -+ register struct rt_frame *tf; -+ tf = get_cached_frame(frame); -+ if (!tf) return 0; -+ return tf->firstRLoc + 20 + 4*(16 - tf->firstReg); -+ } -+ #endif -+ -+ blockinitialize() {initialize();} -+ - static - initialize () - { -+ #ifdef ibm032 -+ #ifdef CAMPHOR -+ add_com ("recache-frames", class_stack, recache_frames, -+ "Tell debugger to recompute PC/RT stack frame cache\n"); -+ #endif -+ #endif - } - - END_FILE -diff -c ../../gnu/gdb/breakpoint.c ./breakpoint.c -*** ../../gnu/gdb/breakpoint.c Sat Apr 4 22:22:44 1987 ---- ./breakpoint.c Sun Apr 26 23:02:20 1987 -*************** -*** 94,99 **** ---- 94,100 ---- - of last breakpoint hit. */ - - struct command_line *breakpoint_commands; -+ char new_breakpoint_commands = 0; /* Zalman Stern, ITC 1/12/1987 */ - - START_FILE - -*************** -*** 203,210 **** - { - execute_command (breakpoint_commands->line, 0); - /* If command was "cont", breakpoint_commands is 0 now. */ -! if (breakpoint_commands) - breakpoint_commands = breakpoint_commands->next; - } - clear_momentary_breakpoints (); - } ---- 204,213 ---- - { - execute_command (breakpoint_commands->line, 0); - /* If command was "cont", breakpoint_commands is 0 now. */ -! if (breakpoint_commands && !new_breakpoint_commands) /* Zalman Stern, ITC 1/12/1987 */ - breakpoint_commands = breakpoint_commands->next; -+ else /* Zalman Stern, ITC 1/12/1987 */ -+ new_breakpoint_commands = 0; /* Zalman Stern, ITC 1/12/1987 */ - } - clear_momentary_breakpoints (); - } -*************** -*** 215,220 **** ---- 218,225 ---- - void - clear_breakpoint_commands () - { -+ if (breakpoint_commands != 0) /* Zalman Stern, ITC 1/12/1987 */ -+ new_breakpoint_commands = 1; /* Zalman Stern, ITC 1/12/1987 */ - breakpoint_commands = 0; - breakpoint_auto_delete (0); - } -*************** -*** 921,926 **** ---- 926,933 ---- - struct cmd_list_element *enablelist; - - extern struct cmd_list_element *cmdlist; -+ -+ breakinitialize() {initialize();} - - static - initialize () -diff -c ../../gnu/gdb/command.c ./command.c -*** ../../gnu/gdb/command.c Sat Apr 4 22:24:07 1987 ---- ./command.c Sat Apr 25 17:18:15 1987 -*************** -*** 94,100 **** - You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! */ - -- - #include "command.h" - #include <stdio.h> - ---- 94,99 ---- -*************** -*** 388,394 **** - { - if (nfound > 1 && allow_unknown >= 0) - { -! *p = 0; - ambbuf[0] = 0; - for (c = list; c; c = c->next) - if (!strncmp (*line, c->name, p - *line)) ---- 387,393 ---- - { - if (nfound > 1 && allow_unknown >= 0) - { -! *p = 0; - ambbuf[0] = 0; - for (c = list; c; c = c->next) - if (!strncmp (*line, c->name, p - *line)) -diff -c ../../gnu/gdb/core.c ./core.c -*** ../../gnu/gdb/core.c Sat Apr 4 22:27:23 1987 ---- ./core.c Mon Apr 27 13:20:47 1987 -*************** -*** 163,172 **** - int reg_offset; - - /* 4.2bsd-style core dump */ - val = myread (corechan, &u, sizeof u); - if (val < 0) -! perror_with_name (filename); - data_start = exec_data_start; - data_end = data_start + NBPG * u.u_dsize; - stack_start = stack_end - NBPG * u.u_ssize; - data_offset = NBPG * UPAGES; ---- 163,180 ---- - int reg_offset; - - /* 4.2bsd-style core dump */ -+ #ifdef ibm032 -+ /* on ibm032, uarea is at the far end of the u pages */ -+ lseek(corechan, UPAGES*NBPG - sizeof(u), 0); -+ #endif - val = myread (corechan, &u, sizeof u); - if (val < 0) -! perror_with_name (execfile); -! #ifdef ibm032 -! data_start = 0x10000000; -! #else - data_start = exec_data_start; -+ #endif - data_end = data_start + NBPG * u.u_dsize; - stack_start = stack_end - NBPG * u.u_ssize; - data_offset = NBPG * UPAGES; -*************** -*** 208,214 **** - corefile = concat (dirname, "/", filename); - } - -! set_current_frame (read_register (FP_REGNUM)); - select_frame (get_current_frame (), 0); - validate_files (); - } ---- 216,222 ---- - corefile = concat (dirname, "/", filename); - } - -! set_current_frame (read_register (FP_REGNUM), 1); - select_frame (get_current_frame (), 0); - validate_files (); - } -*************** -*** 523,528 **** ---- 531,539 ---- - - #endif /* not NEW_SUN_CORE */ - -+ -+ coreinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/dbxread.c ./dbxread.c -*** ../../gnu/gdb/dbxread.c Sat Apr 4 22:29:54 1987 ---- ./dbxread.c Fri May 15 15:52:24 1987 -*************** -*** 28,33 **** ---- 28,36 ---- - #include "initialize.h" - #include "symtab.h" - #include "param.h" -+ #ifdef CAMPHOR -+ #include "value.h" -+ #endif - - static void add_symbol_to_list (); - static void read_dbx_symtab (); -*************** -*** 89,94 **** ---- 92,109 ---- - int prev_line_number; - }; - -+ /* When dealing with dynamically loaded objects, the symbol table in the sym file -+ does not match where we actually load the files. Thus, gdb has to relocate those -+ symbols during dbxread. This is only used by the camphor support code, and -+ probably should be under an ifdef camphor. */ -+ -+ struct dlreloc -+ { -+ long text; -+ long data; -+ long bss; -+ } dlreloc; -+ - static struct subfile *subfiles; - - static struct subfile *current_subfile; -*************** -*** 1015,1020 **** ---- 1030,1037 ---- - register int i, nbl; - register struct blockvector *bv; - register struct block *b; -+ int j; -+ struct symbol *ts1, *ts2; - - for (s = symtab_list; s; s = s->next) - { -*************** -*** 1025,1034 **** ---- 1042,1238 ---- - b = BLOCKVECTOR_BLOCK (bv, i); - qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b), - sizeof (struct symbol *), compare_symbols); -+ /* Register parms have two decls, but the register one is the only one of interest */ -+ /* So, trash the name of the bad one, since binary srch could get either. Yucko. */ -+ /* doing name this way enables symbol freeing code to keep working */ -+ for(j=1;j<BLOCK_NSYMS(b);j++) -+ { -+ ts1 = BLOCK_SYM(b,j-1); -+ ts2 = BLOCK_SYM(b, j); -+ if (SYMBOL_NAMESPACE(ts1) == VAR_NAMESPACE -+ && SYMBOL_NAMESPACE(ts2) == VAR_NAMESPACE -+ && strcmp(SYMBOL_NAME(ts1), SYMBOL_NAME(ts2)) == 0) -+ {if (SYMBOL_CLASS(ts1) == LOC_REGISTER) -+ {SYMBOL_CLASS(ts2) = LOC_REGISTER; -+ SYMBOL_TYPE(ts2) = SYMBOL_TYPE(ts1); -+ SYMBOL_VALUE(ts2) = SYMBOL_VALUE(ts1); -+ } -+ else if (SYMBOL_CLASS(ts2) == LOC_REGISTER ) -+ {SYMBOL_CLASS(ts1) = LOC_REGISTER; -+ SYMBOL_TYPE(ts1) = SYMBOL_TYPE(ts2); -+ SYMBOL_VALUE(ts1) = SYMBOL_VALUE(ts2); -+ } -+ #ifdef notdef -+ else printf("Check out def of symbol %s\n", SYMBOL_NAME(ts1)); -+ #endif -+ } -+ } - } - } - } - -+ -+ #ifdef CAMPHOR -+ set_rel_command(exp) -+ char *exp; -+ { -+ struct expression *expr = (struct expression *) parse_c_expression (exp); -+ register value val; -+ register long temp; -+ register struct cleanup *old_chain -+ = make_cleanup (free_current_contents, &expr); -+ val = evaluate_expression (expr); -+ temp = value_as_long (val); -+ dlreloc.text = dlreloc.data = dlreloc.bss = temp; -+ printf("Relocation for all segs set to %x.\n", temp); -+ do_cleanups (old_chain); -+ } -+ -+ void -+ add_file_command (name) -+ char *name; -+ { -+ register int desc; -+ struct exec hdr; -+ struct nlist *nlist; -+ char *stringtab; -+ long buffer; -+ register int val; -+ extern void close (); -+ struct cleanup *old_chain; -+ int in_this_dir = 1; -+ struct symtab *symtab_temp; -+ -+ dont_repeat (); -+ -+ if (name == 0) -+ error_no_arg ("file to add symbols from"); -+ -+ if (symtab_list && !query ("Add more symbols from \"%s\"? ", name)) -+ error ("Not confirmed."); -+ -+ if (symfile) -+ free (symfile); -+ symfile = 0; -+ -+ desc = open (name, 0); -+ if (desc < 0) -+ { -+ if ((desc = openp (getenv ("BZPATH"), name, 0, 0)) < 0) -+ if ((desc = openp (getenv ("CLASSPATH"), name, 0, 0)) < 0) -+ desc = openp (getenv ("PATH"), name, 0, 0); -+ -+ in_this_dir = 0; -+ } -+ if (desc < 0) -+ perror_with_name (name); -+ -+ old_chain = make_cleanup (close, desc); -+ -+ val = myread (desc, &hdr, sizeof hdr); -+ if (val < 0) -+ perror_with_name (name); -+ -+ if (N_BADMAG (hdr)) -+ error ("File \"%s\" not in executable format.", name); -+ -+ if (hdr.a_syms == 0) -+ { -+ free_all_symtabs (); /* check this */ -+ return; -+ } -+ -+ /* Now read the string table, all at once. */ -+ val = lseek (desc, N_SYMOFF (hdr) + hdr.a_syms, 0); -+ if (val < 0) -+ perror_with_name (name); -+ val = myread (desc, &buffer, sizeof buffer); -+ if (val < 0) -+ perror_with_name (name); -+ stringtab = (char *) alloca (buffer); -+ bcopy (&buffer, stringtab, sizeof buffer); -+ val = myread (desc, stringtab + sizeof buffer, buffer - sizeof buffer); -+ if (val < 0) -+ perror_with_name (name); -+ -+ #ifdef READ_GDB_SYMSEGS -+ /* That puts us at the symsegs. Read them. */ -+ symseg_chain = read_symsegs (desc, name); -+ hash_symsegs (); -+ #else -+ /* Where people are using the 4.2 ld program, must not check for -+ symsegs, because that ld puts randonm garbage at the end of -+ the output file and that would trigger an error message. */ -+ symseg_chain = 0; -+ #endif -+ -+ /* Position to read the symbol table. Do not read it all at once. */ -+ val = lseek (desc, N_SYMOFF (hdr), 0); -+ if (val < 0) -+ perror_with_name (name); -+ -+ printf ("Reading symbol data from %s...", name); -+ fflush (stdout); -+ -+ init_misc_functions (); -+ make_cleanup (discard_misc_bunches, 0); -+ init_header_files (); -+ make_cleanup (free_header_files, 0); -+ -+ /* Remember symtab_list to check if the added file had any dbx info in it. */ -+ symtab_temp = symtab_list; -+ -+ /* Now that the symbol table data of the executable file are all in core, -+ process them and define symbols accordingly. Closes desc. */ -+ -+ read_dbx_symtab (desc, stringtab, hdr.a_syms / sizeof (struct nlist)); -+ -+ if (symtab_list == symtab_temp) { -+ printf("\n%s not compiled with -g, debugging posibilities are limited.\n", name); -+ fflush(stdout); -+ } -+ else { -+ -+ /* Sort symbols alphabetically within each block. */ -+ -+ sort_syms (); -+ -+ /* Go over the misc functions and install them in vector. */ -+ -+ condense_misc_bunches (); -+ -+ /* Make a default for file to list. */ -+ -+ select_source_symtab (symtab_list); -+ } -+ -+ do_cleanups (old_chain); -+ -+ /* Free the symtabs made by read_symsegs, but not their contents, -+ which have been copied into symtabs on symtab_list. */ -+ while (symseg_chain) -+ { -+ register struct symtab *s = symseg_chain->next; -+ free (symseg_chain); -+ symseg_chain = s; -+ } -+ -+ if (in_this_dir && name[0] != '/') -+ { -+ char dirname[MAXPATHLEN]; -+ -+ getwd (dirname); -+ symfile = concat (dirname, "/", -+ savestring (name, strlen (name))); -+ } -+ else -+ symfile = savestring (name, strlen (name)); -+ -+ printf ("done.\n"); -+ fflush (stdout); -+ } -+ #endif -+ - /* This is the symbol-file command. Read the file, analyze its symbols, - and add a struct symtab to symtab_list. */ - -*************** -*** 1047,1052 **** ---- 1251,1263 ---- - - dont_repeat (); - -+ #ifdef CAMPHOR -+ /* this command does not deal with automatically relocated stuff */ -+ dlreloc.text = 0; -+ dlreloc.data = 0; -+ dlreloc.bss = 0; -+ #endif -+ - if (name == 0) - error_no_arg ("file to read symbols from"); - -*************** -*** 1130,1151 **** - - read_dbx_symtab (desc, stringtab, hdr.a_syms / sizeof (struct nlist)); - - /* Sort symbols alphabetically within each block. */ - -! sort_syms (); - - /* Go over the misc functions and install them in vector. */ - -! condense_misc_bunches (); - - /* Don't allow char * to have a typename (else would get caddr_t.) */ - -! TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0; - - /* Make a default for file to list. */ - -! select_source_symtab (symtab_list); - - symfile = savestring (name, strlen (name)); - - do_cleanups (old_chain); ---- 1341,1372 ---- - - read_dbx_symtab (desc, stringtab, hdr.a_syms / sizeof (struct nlist)); - -+ /* Check to make sure file was compiled with -g. */ -+ -+ if (symtab_list == NULL) { -+ printf("\n%s not compiled with -g, debugging posibilities are limited.\n", name); -+ fflush(stdout); -+ } -+ else { -+ - /* Sort symbols alphabetically within each block. */ - -! sort_syms (); - - /* Go over the misc functions and install them in vector. */ - -! condense_misc_bunches (); - - /* Don't allow char * to have a typename (else would get caddr_t.) */ - -! TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0; - - /* Make a default for file to list. */ - -! select_source_symtab (symtab_list); - -+ } -+ - symfile = savestring (name, strlen (name)); - - do_cleanups (old_chain); -*************** -*** 1204,1209 **** ---- 1425,1440 ---- - { - fread (&buf, sizeof buf, 1, stream); - namestring = buf.n_un.n_strx ? buf.n_un.n_strx + stringtab : 0; -+ #ifdef CAMPHOR -+ if ((buf.n_type & N_TYPE) == N_UNDF) { -+ /* don't screw around with undefined symbols */ -+ } -+ else { -+ if ((buf.n_type & N_TYPE) == N_TEXT) buf.n_value += dlreloc.text; -+ else if ((buf.n_type & N_TYPE) == N_DATA) buf.n_value += dlreloc.data; -+ else if ((buf.n_type & N_TYPE) == N_BSS) buf.n_value += dlreloc.bss; -+ } -+ #endif - if (buf.n_type & N_STAB) - process_one_symbol (buf.n_type, buf.n_desc, - buf.n_value, namestring); -*************** -*** 1356,1361 **** ---- 1587,1596 ---- - } - } - -+ #ifdef ibm032 -+ static char hcState; /* two different, incompatible compilers for the RT */ -+ #endif -+ - static void - process_one_symbol (type, desc, value, name) - int type, desc; -*************** -*** 1363,1369 **** - char *name; - { - register struct context_stack *new; -! - /* Something is wrong if we see real data before - seeing a source file name. */ - ---- 1598,1633 ---- - char *name; - { - register struct context_stack *new; -! char tname[256]; -! /* Now, there are two compilers for the RT, and they are seriously incompatible. -! pcc is just like normal c compilers: stabs for a block occur before the LBRAC -! stab for that same block. Thus this code squirrels them away in the context -! and when the RBRAC is hit, restores local_symbols as of the time the LBRAC -! was encountered, and adds these symbosl to the block that just ended. -! -! However, with the HC compiler, those symbols occur *after* the LBRAC symbol -! declaring the block's start. Totally incompatible, of course. One expects no -! less from IBM. For hc compiled programs, we use the symbols in local_symbols -! *before* the RBRAC command pops the context stack. -! -! Amazingly enough, when we complained to IBM/Palo Alto about this incompatibility, -! they claimed that Mark Linton (original author of dbx) liked the new way better, and -! that he didn't even know that pcc used a different order. Sorta explains some things -! about dbx, n'est-ce pas? Furthermore, of course, IBM doesn't want to change -! either pcc or hc. -! -! Anyway, hc and pcc compiled .o files often co-exist in programs. How do we -! tell which is which? Stupid heuristic which doesn't work with programs -! with no top-level locals or parameters: after seeing a function's start, if we see -! an LBRAC before seeing a variable, then we are using hc, otherwise it is pcc. -! Stupid heuristics are better than none, so we use it. -! -! The variable hcState is used to keep track of this crap. -! 0 ==> saw function symbol -! 1 ==> saw lbrac in state 0, this is hc. -! 2 ==> saw symbol in state 0, this is pcc. -! */ -! - /* Something is wrong if we see real data before - seeing a source file name. */ - -*************** -*** 1384,1389 **** ---- 1648,1656 ---- - also the end of the lexical context for the previous function. */ - new = context_stack; - within_function = 1; -+ #ifdef ibm032 -+ hcState = 0; -+ #endif - if (new) - { - /* Make a block for the local symbols within. */ -*************** -*** 1400,1406 **** ---- 1667,1679 ---- - new->locals = 0; - new->old_blocks = pending_blocks; - new->start_addr = value; -+ #ifdef ibm032 -+ strcpy(tname, "."); -+ strcat(tname, name); -+ new->name = define_symbol(value, tname); -+ #else - new->name = define_symbol (value, name); -+ #endif - local_symbols = 0; - break; - -*************** -*** 1407,1412 **** ---- 1680,1688 ---- - case N_LBRAC: - /* This "symbol" just indicates the start of an inner lexical - context within a function. */ -+ #ifdef ibm032 -+ if (hcState == 0) hcState = 1; -+ #endif - new = (struct context_stack *) xmalloc (sizeof (struct context_stack)); - new->depth = desc; - new->next = context_stack; -*************** -*** 1422,1430 **** - /* This "symbol" just indicates the end of an inner lexical - context that was started with N_RBRAC. */ - new = context_stack; - if (new == 0 || desc != new->depth) - error ("Invalid symbol data: N_LBRAC/N_RBRAC symbol mismatch, symtab pos %d.", symnum); -- local_symbols = new->locals; - context_stack = new->next; - /* If this is not the outermost LBRAC...RBRAC pair in the - function, its local symbols preceded it, and are the ones ---- 1698,1711 ---- - /* This "symbol" just indicates the end of an inner lexical - context that was started with N_RBRAC. */ - new = context_stack; -+ #ifdef ibm032 -+ if (hcState == 2) /* pcc */ -+ local_symbols = new->locals; -+ #else -+ local_symbols = new->locals; -+ #endif - if (new == 0 || desc != new->depth) - error ("Invalid symbol data: N_LBRAC/N_RBRAC symbol mismatch, symtab pos %d.", symnum); - context_stack = new->next; - /* If this is not the outermost LBRAC...RBRAC pair in the - function, its local symbols preceded it, and are the ones -*************** -*** 1443,1448 **** ---- 1724,1733 ---- - new->start_addr + last_source_start_addr, - value + last_source_start_addr); - } -+ #ifdef ibm032 -+ if (hcState == 1 && context_stack->next) /* hc */ -+ local_symbols = new->locals; /* now we get them */ -+ #endif - free (new); - break; - -*************** -*** 1493,1498 **** ---- 1778,1786 ---- - break; - - default: -+ #ifdef ibm032 -+ if (hcState == 0) hcState = 2; -+ #endif - if (name) - define_symbol (value, name); - } -*************** -*** 1553,1558 **** ---- 1841,1849 ---- - Dbx data never actually contains 'l'. */ - case 'l': - SYMBOL_CLASS (sym) = LOC_LOCAL; -+ #ifdef ibm032 -+ if (hcState == 1) value += 1000000; /* temporary hack until rel 3 pcc matches hc */ -+ #endif - SYMBOL_VALUE (sym) = value; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - add_symbol_to_list (sym, &local_symbols); -*************** -*** 1572,1577 **** ---- 1863,1875 ---- - add_symbol_to_list (sym, &local_symbols); - break; - -+ case 'R': -+ SYMBOL_CLASS (sym) = LOC_REGISTER; -+ SYMBOL_VALUE (sym) = value; -+ SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; -+ add_symbol_to_list (sym, &local_symbols); -+ break; -+ - case 'S': - /* Static symbol at top level of file */ - SYMBOL_CLASS (sym) = LOC_STATIC; -*************** -*** 1616,1622 **** - break; - - default: -! error ("Invalid symbol data: unknown symbol-type code `%c' at symtab pos %d.", deftype, symnum); - } - return sym; - } ---- 1914,1928 ---- - break; - - default: -! printf ("Unknown symbol-type code '%c' in dbx symbol table, assuming local.\n", deftype); -! SYMBOL_CLASS (sym) = LOC_LOCAL; -! #ifdef ibm032 -! if (hcState == 1) value += 1000000; /* temporary hack until rel 3 pcc matches hc */ -! #endif -! SYMBOL_VALUE (sym) = value; -! SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; -! add_symbol_to_list (sym, &local_symbols); -! break; - } - return sym; - } -*************** -*** 1741,1746 **** ---- 2047,2056 ---- - (*pp) += 5; - else if (!strncmp (*pp, "r(0,1);0;", 9)) - (*pp) += 9; -+ #if 1 -+ else if ((**pp == 'r') && (!strncmp(*pp + 2, ";0;", 3))) -+ (*pp) += 5; -+ #endif - else break; - - TYPE_CODE (type) = TYPE_CODE_ARRAY; -*************** -*** 1980,1986 **** - rather than -128 which is what I would like. - So use n1 != 0 to prevent char from being taken as unsigned. */ - -! else if (n2 == 0 && n1 == 1) - { - /* an unsigned type */ - if (n3 == (1 << (8 * sizeof (int)))) ---- 2290,2296 ---- - rather than -128 which is what I would like. - So use n1 != 0 to prevent char from being taken as unsigned. */ - -! if (n2 == 0) - { - /* an unsigned type */ - if (n3 == (1 << (8 * sizeof (int)))) -*************** -*** 1989,1994 **** ---- 2299,2306 ---- - return builtin_type_unsigned_short; - if (n3 == (1 << (8 * sizeof (char)))) - return builtin_type_unsigned_char; -+ if (n3 == (1 << (8 * sizeof (char) - 1))) -+ return builtin_type_char; - } - else - { -*************** -*** 2002,2007 **** ---- 2314,2321 ---- - if (n3 == (1 << (8 * sizeof (char) - 1))) - return builtin_type_char; - } -+ if (n2 == 0 && n3 == 1) -+ return builtin_type_void; - error ("Invalid symbol data: range type spec %s at symtab pos %d.", - errp - 1, symnum); - } -*************** -*** 2033,2040 **** ---- 2347,2364 ---- - - /* Read the digits, as far as they go. */ - -+ #if 0 /* Yet another "Compiler sucks" fix. */ - while ((c = *p++) >= '0' && c <= '9') -+ #else -+ while (((c = *p++) >= '0' && c <= '9') || ((end != '\n') && (c == '\n'))) -+ #endif - { -+ #if 1 -+ if (c == '\n') { -+ printf("Ignoring bogus newline in stabs entry. Your compiler should be fixed.\n"); -+ continue; -+ } -+ #endif - n *= 10; - n += c - '0'; - } -*************** -*** 2050,2060 **** ---- 2374,2392 ---- - return n * sign; - } - -+ dbxinitialize() {initialize();} -+ - static - initialize () - { - symfile = 0; - -+ #ifdef CAMPHOR -+ add_com ("add-file", class_files, add_file_command, -+ "Add a new symbol table (in dbx format) from file FILE."); -+ add_com("set-rel", class_files, set_rel_command, -+ "Set relocation for add-file command to NUMBER."); -+ #endif - add_com ("symbol-file", class_files, symbol_file_command, - "Load symbol table (in dbx format) from executable file FILE."); - } -diff -c ../../gnu/gdb/environ.c ./environ.c -*** ../../gnu/gdb/environ.c Sat Apr 4 22:31:16 1987 ---- ./environ.c Sun Apr 26 23:48:05 1987 -*************** -*** 129,135 **** - - if (e->allocated < i) - { -! e->allocated = max (i, e->allocated + 10); - e->vector = (char **) xrealloc (e->vector, - (e->allocated + 1) * sizeof (char *)); - } ---- 129,136 ---- - - if (e->allocated < i) - { -! e->allocated = i + 10; - e->vector = (char **) xrealloc (e->vector, - (e->allocated + 1) * sizeof (char *)); - } -diff -c ../../gnu/gdb/eval.c ./eval.c -*** ../../gnu/gdb/eval.c Sat Apr 4 22:32:36 1987 ---- ./eval.c Mon Apr 27 00:01:27 1987 -*************** -*** 546,551 **** ---- 546,553 ---- - } - } - -+ evalinitialize() {initialize();} -+ - static - initialize () - { } -diff -c ../../gnu/gdb/expread.y ./expread.y -*** ../../gnu/gdb/expread.y Sat Apr 4 22:35:27 1987 ---- ./expread.y Sun Apr 26 23:56:51 1987 -*************** -*** 650,655 **** ---- 650,656 ---- - ; - else - { -+ /*N.B. error does a longjmp, so we do not have to worry about storage */ - err_copy = (char *) alloca (olen + 1); - bcopy (lexptr, err_copy, olen); - err_copy[olen] = 0; -*************** -*** 945,953 **** - { - register int len = sizeof (struct expression) + - expr->nelts * sizeof (union exp_element); -! register struct expression *temp -! = (struct expression *) alloca (len); - register int inpos = expr->nelts, outpos = 0; - - /* Copy the original expression into temp. */ - bcopy (expr, temp, len); ---- 946,955 ---- - { - register int len = sizeof (struct expression) + - expr->nelts * sizeof (union exp_element); -! register struct expression *temp; - register int inpos = expr->nelts, outpos = 0; -+ -+ temp = (struct expression *) alloca(len); - - /* Copy the original expression into temp. */ - bcopy (expr, temp, len); -diff -c ../../gnu/gdb/findvar.c ./findvar.c -*** ../../gnu/gdb/findvar.c Sat Apr 4 22:36:38 1987 ---- ./findvar.c Mon Apr 27 00:01:44 1987 -*************** -*** 359,364 **** ---- 359,366 ---- - return value_cast (lookup_pointer_type (SYMBOL_TYPE (var)), - value_from_long (builtin_type_long, addr)); - } -+ -+ findinitialize() {initialize();} - - static - initialize () -diff -c ../../gnu/gdb/firstfile.c ./firstfile.c -*** ../../gnu/gdb/firstfile.c Sat Apr 4 22:37:06 1987 ---- ./firstfile.c Mon Apr 27 00:02:06 1987 -*************** -*** 125,130 **** ---- 125,152 ---- - static initialize_dummy_1 (); - static initialize_dummy_2 (); - -+ initialize_all_files() { -+ blockinitialize(); -+ breakinitialize(); -+ coreinitialize(); -+ dbxinitialize(); -+ evalinitialize(); -+ findinitialize(); -+ infcmdinitialize(); -+ inflowinitialize(); -+ infruninitialize(); -+ symmiscinitialize(); -+ symtabinitialize(); -+ valarithinitialize(); -+ valopsinitialize(); -+ valprintinitialize(); -+ valuesinitialize(); -+ printcmdinitialize(); -+ sourceinitialize(); -+ stackinitialize(); -+ } -+ -+ #if 0 - initialize_all_files () - { - initialize_next_file ((char *) initialize_dummy_2 -*************** -*** 148,153 **** ---- 170,176 ---- - initialize_dummy_2 () - { - } -+ #endif - - /* This makes the function initialize_next_file. */ - -diff -c ../../gnu/gdb/frame.h ./frame.h -*** ../../gnu/gdb/frame.h Sat Apr 4 22:37:22 1987 ---- ./frame.h Mon Apr 27 00:02:14 1987 -*************** -*** 20,25 **** ---- 20,35 ---- - - /* Note that frame.h requires param.h! */ - -+ #ifdef ibm032 -+ struct rt_frame { -+ CORE_ADDR frame; /* frame address */ -+ CORE_ADDR pc; /* pc we called from */ -+ CORE_ADDR firstRLoc; /* loc'n of first saved general reg */ -+ short nParms; /* number of parameters to this frame */ -+ short firstReg; /* the reg stored at 64(fp) */ -+ }; -+ #endif -+ - #define FRAME CORE_ADDR - - struct frame_info -*************** -*** 62,64 **** ---- 72,77 ---- - extern struct block *get_selected_block (); - extern struct symbol *get_frame_function (); - extern struct symbol *get_pc_function (); -+ #ifdef ibm032 -+ extern struct rt_frame *get_cached_frame(); -+ #endif -diff -c ../../gnu/gdb/infcmd.c ./infcmd.c -*** ../../gnu/gdb/infcmd.c Sat Apr 4 22:47:22 1987 ---- ./infcmd.c Mon Apr 27 00:07:53 1987 -*************** -*** 39,45 **** - /* String containing arguments to give to the program, - with a space added at the front. Just a space means no args. */ - -! static char *inferior_args; - - /* Pid of our debugged inferior, or 0 if no inferior now. */ - ---- 39,45 ---- - /* String containing arguments to give to the program, - with a space added at the front. Just a space means no args. */ - -! static char *inferior_args = NULL; - - /* Pid of our debugged inferior, or 0 if no inferior now. */ - -*************** -*** 112,119 **** - set_args_command (args) - char *args; - { -! free (inferior_args); -! if (!args) args = ""; - inferior_args = concat (" ", args, ""); - } - ---- 112,121 ---- - set_args_command (args) - char *args; - { -! if (inferior_args != NULL) -! free (inferior_args); -! if (!args) -! args = ""; - inferior_args = concat (" ", args, ""); - } - -*************** -*** 171,177 **** - signal (SIGINT, SIG_DFL); */ - - ptrace (0); -! execle ("/bin/sh", "sh", "-c", allargs, 0, - environ_vector (inferior_environ)); - - fprintf (stderr, "Cannot exec /bin/sh: %s.\n", ---- 173,180 ---- - signal (SIGINT, SIG_DFL); */ - - ptrace (0); -! -! execle ("/bin/csh", "csh", "-f", "-c", allargs, 0, - environ_vector (inferior_environ)); - - fprintf (stderr, "Cannot exec /bin/sh: %s.\n", -*************** -*** 473,478 **** ---- 476,482 ---- - - retbuf[0] = stop_r0; - retbuf[1] = stop_r1; -+ - val = value_being_returned (value_type, retbuf); - printf ("Value returned is $%d = ", record_latest_value (val)); - value_print (val, stdout); -*************** -*** 705,710 **** ---- 709,716 ---- - printf ("Contents are relative to selected stack frame.\n"); - } - -+ infcmdinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/inflow.c ./inflow.c -*** ../../gnu/gdb/inflow.c Sat Apr 4 22:56:34 1987 ---- ./inflow.c Mon Apr 27 00:12:10 1987 -*************** -*** 188,194 **** - inferior_pid = 0; - mark_breakpoints_out (); - if (have_core_file_p ()) -! set_current_frame (read_register (FP_REGNUM)); - } - - /* Resume execution of the inferior process. ---- 188,194 ---- - inferior_pid = 0; - mark_breakpoints_out (); - if (have_core_file_p ()) -! set_current_frame (read_register (FP_REGNUM), 1); - } - - /* Resume execution of the inferior process. -*************** -*** 266,271 **** ---- 266,274 ---- - char buf[MAX_REGISTER_RAW_SIZE]; - register int i; - -+ #ifdef ibm032 -+ offset += UPAGES*NBPG - sizeof(u); /* ibm032: ustruct at end of uarea */ -+ #endif - offset = ptrace (3, inferior_pid, offset, 0) - KERNEL_U_ADDR; - for (regno = 0; regno < NUM_REGS; regno++) - { -*************** -*** 291,296 **** ---- 294,303 ---- - register unsigned int regaddr; - char buf[80]; - -+ #ifdef ibm032 -+ offset += UPAGES*NBPG - sizeof(u); /* ibm032: ustruct at end of uarea */ -+ #endif -+ - offset = ptrace (3, inferior_pid, offset, 0) - KERNEL_U_ADDR; - - if (regno >= 0) -*************** -*** 340,347 **** - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ -! register int *buffer = (int *) alloca (count * sizeof (int)); - - /* Read all the longwords */ - for (i = 0; i < count; i++, addr += sizeof (int)) - buffer[i] = ptrace (1, inferior_pid, addr, 0); ---- 347,355 ---- - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ -! register int *buffer; - -+ buffer = (int *) alloca(count * sizeof(int)); - /* Read all the longwords */ - for (i = 0; i < count; i++, addr += sizeof (int)) - buffer[i] = ptrace (1, inferior_pid, addr, 0); -*************** -*** 367,377 **** - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ -! register int *buffer = (int *) alloca (count * sizeof (int)); - extern int errno; - - /* Fill start and end extra bytes of buffer with existing memory data. */ - - buffer[0] = ptrace (1, inferior_pid, addr, 0); - if (count > 1) - buffer[count - 1] ---- 375,386 ---- - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ -! register int *buffer; - extern int errno; - - /* Fill start and end extra bytes of buffer with existing memory data. */ - -+ buffer = (int *) alloca (count * sizeof (int)); - buffer[0] = ptrace (1, inferior_pid, addr, 0); - if (count > 1) - buffer[count - 1] -*************** -*** 388,397 **** - { - errno = 0; - ptrace (4, inferior_pid, addr, buffer[i]); -! if (errno) - return 1; - } -- - return 0; - } - ---- 397,406 ---- - { - errno = 0; - ptrace (4, inferior_pid, addr, buffer[i]); -! if (errno) { - return 1; -+ } - } - return 0; - } - -*************** -*** 421,426 **** ---- 430,437 ---- - } - } - -+ inflowinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/infrun.c ./infrun.c -*** ../../gnu/gdb/infrun.c Sat Apr 4 22:57:15 1987 ---- ./infrun.c Mon Apr 27 00:17:40 1987 -*************** -*** 257,263 **** - pc_changed = 0; - fetch_inferior_registers (); - stop_pc = read_pc (); -! set_current_frame (read_register (FP_REGNUM)); - stop_frame = get_current_frame (); - stop_sp = read_register (SP_REGNUM); - another_trap = 0; ---- 257,271 ---- - pc_changed = 0; - fetch_inferior_registers (); - stop_pc = read_pc (); -! #ifdef CAMPHOR -! /* if we're not going to stop, don't bother with a stack trace */ -! if (WIFSTOPPED(w) && !signal_stop[WSTOPSIG(w)]) -! set_current_frame(read_register(FP_REGNUM), 0); -! else -! set_current_frame(read_register(FP_REGNUM), 1); -! #else -! set_current_frame (read_register (FP_REGNUM), 1); -! #endif - stop_frame = get_current_frame (); - stop_sp = read_register (SP_REGNUM); - another_trap = 0; -*************** -*** 688,700 **** - - /* Save the function value return registers - We might be about to restore their previous contents. */ -! stop_r0 = read_register (0); -! stop_r1 = read_register (1); - - if (stop_stack_dummy) - { - /* Pop the empty frame that contains the stack dummy. */ - POP_FRAME; - select_frame (read_register (FP_REGNUM), 0); - } - } ---- 696,717 ---- - - /* Save the function value return registers - We might be about to restore their previous contents. */ -! #ifdef ibm032 -! stop_r0 = read_register (2); -! stop_r1 = read_register (3); -! #else -! stop_r0 = read_register (0); -! stop_r1 = read_register (1); -! #endif - - if (stop_stack_dummy) - { - /* Pop the empty frame that contains the stack dummy. */ -+ #ifdef ibm032 -+ POP_DUMMY_FRAME; -+ #else - POP_FRAME; -+ #endif - select_frame (read_register (FP_REGNUM), 0); - } - } -*************** -*** 841,846 **** ---- 858,865 ---- - printf ("\nUse the \"handle\" command to change these tables.\n"); - } - -+ infruninitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/initialize.h ./initialize.h -*** ../../gnu/gdb/initialize.h Sat Apr 4 22:58:27 1987 ---- ./initialize.h Sun May 24 00:19:21 1987 -*************** -*** 103,109 **** ---- 103,120 ---- - of the end of one object file's text to the start of the next - object file's text. */ - -+ /* Changed to use ifdefs on the machine type. David Nichols, 11/28/86 */ -+ #ifdef ibm032 -+ #include "m-ibm032init.h" -+ #endif -+ -+ #ifdef vax - #include "m-vaxinit.h" -+ #endif -+ -+ #ifdef sun -+ #include "m-suninit.h" -+ #endif - - /* This is used to make a file's initialization function. - It calls another function named `initialize', which must -diff -c ../../gnu/gdb/main.c ./main.c -*** ../../gnu/gdb/main.c Sat Apr 4 23:11:59 1987 ---- ./main.c Mon Apr 27 00:27:21 1987 -*************** -*** 236,241 **** ---- 236,243 ---- - if (*p) - { - c = lookup_cmd (&p, cmdlist, "", 0); -+ if (c->function == 0) -+ error ("That is not a command, just a help topic."); - if (c->class == (int) class_user) - { - if (*p) -*************** -*** 457,463 **** - - /* Add an element to the list of commands. */ - -! void - add_com (name, class, fun, doc) - char *name; - int class; ---- 459,465 ---- - - /* Add an element to the list of commands. */ - -! struct cmd_list_element * - add_com (name, class, fun, doc) - char *name; - int class; -*************** -*** 464,470 **** - void (*fun) (); - char *doc; - { -! add_cmd (name, class, fun, doc, &cmdlist); - } - - /* Add an alias or abbreviation command to the list of commands. */ ---- 466,473 ---- - void (*fun) (); - char *doc; - { -! -! return add_cmd (name, class, fun, doc, &cmdlist); - } - - /* Add an alias or abbreviation command to the list of commands. */ -*************** -*** 547,552 **** ---- 550,556 ---- - - if (c && c->class == (int) class_user) - free_command_lines (&c->function); -+ - - add_com (comname, class_user, cmds, - (c && c->class == (int) class_user) -diff -c ../../gnu/gdb/param.h ./param.h -*** ../../gnu/gdb/param.h Sat Apr 4 23:15:44 1987 ---- ./param.h Mon Apr 27 00:28:17 1987 -*************** -*** 1 **** ---- 1,19 ---- -+ /* Changed to use ifdefs so we don't have to edit it all the time. -+ David Nichols -+ 28 November 1986 */ -+ -+ #ifdef vax - #include "m-vax.h" -+ #endif -+ -+ #ifdef ibm032 -+ #include "m-ibm032.h" -+ #endif -+ -+ #ifdef sun -+ #ifdef mc68020 -+ #include "m-sun3.h" -+ #else -+ #include "m-sun2.h" -+ #endif -+ #endif -diff -c ../../gnu/gdb/pinsn.c ./pinsn.c -*** ../../gnu/gdb/pinsn.c Sat Apr 4 23:15:58 1987 ---- ./pinsn.c Mon Apr 27 00:28:36 1987 -*************** -*** 1 **** ---- 1,15 ---- -+ /* Changed to use ifdefs so we don't have to edit this. -+ David Nichols -+ 28 Nov 1986 */ -+ -+ #ifdef ibm032 -+ #include "ibm032-pinsn.c" -+ #endif -+ -+ #ifdef vax - #include "vax-pinsn.c" -+ #endif -+ -+ #ifdef sun -+ #include "m68k-pinsn.c" -+ #endif -diff -c ../../gnu/gdb/printcmd.c ./printcmd.c -*** ../../gnu/gdb/printcmd.c Sat Apr 4 23:17:03 1987 ---- ./printcmd.c Mon Apr 27 00:30:52 1987 -*************** -*** 797,804 **** - CORE_ADDR frame; - FILE *stream; - { -! char *space = (char *) alloca (TYPE_LENGTH (SYMBOL_TYPE (var))); - value val = read_var_value (var, frame); - value_print (val, stream); - } - ---- 797,805 ---- - CORE_ADDR frame; - FILE *stream; - { -! char *space; - value val = read_var_value (var, frame); -+ space = (char *) alloca (TYPE_LENGTH (SYMBOL_TYPE (var))); - value_print (val, stream); - } - -*************** -*** 883,888 **** ---- 884,891 ---- - } - } - -+ printcmdinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/source.c ./source.c -*** ../../gnu/gdb/source.c Sat Apr 4 23:17:55 1987 ---- ./source.c Mon Apr 27 00:31:25 1987 -*************** -*** 276,282 **** - if (get_exec_file () != 0 && exec_mtime < st.st_mtime) - printf ("Source file is more recent than executable.\n"); - -! data = (char *) alloca (st.st_size); - myread (desc, data, st.st_size, s->filename); - end = data + st.st_size; - p = data; ---- 276,283 ---- - if (get_exec_file () != 0 && exec_mtime < st.st_mtime) - printf ("Source file is more recent than executable.\n"); - -! data = (char *) alloca(st.st_size); -! - myread (desc, data, st.st_size, s->filename); - end = data + st.st_size; - p = data; -*************** -*** 530,535 **** ---- 531,538 ---- - printf ("Line number %d is out of range for \"%s\".\n", - sal.line, sal.symtab->filename); - } -+ -+ sourceinitialize() {initialize();} - - static - initialize () -diff -c ../../gnu/gdb/stack.c ./stack.c -*** ../../gnu/gdb/stack.c Sun Apr 5 00:28:05 1987 ---- ./stack.c Mon Apr 27 00:31:50 1987 -*************** -*** 511,516 **** ---- 511,517 ---- - - print_stack_frame (selected_frame, selected_frame_level, 1); - } -+ - - static void - return_command (retval_exp) -*************** -*** 538,543 **** ---- 539,546 ---- - frame_command ("0", 1); - } - -+ stackinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/symmisc.c ./symmisc.c -*** ../../gnu/gdb/symmisc.c Sun Apr 5 00:33:16 1987 ---- ./symmisc.c Mon Apr 27 00:37:46 1987 -*************** -*** 504,509 **** ---- 504,511 ---- - return i; - } - -+ symmiscinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/symtab.c ./symtab.c -*** ../../gnu/gdb/symtab.c Sun Apr 5 00:35:45 1987 ---- ./symtab.c Mon Apr 27 00:38:19 1987 -*************** -*** 71,78 **** - strcpy (copy, name); - strcat (copy, ".c"); - for (s = symtab_list; s; s = s->next) -! if (!strcmp (copy, s->filename)) - return s; - - return 0; - } ---- 71,79 ---- - strcpy (copy, name); - strcat (copy, ".c"); - for (s = symtab_list; s; s = s->next) -! if (!strcmp (copy, s->filename)) { - return s; -+ } - - return 0; - } -*************** -*** 703,709 **** - register struct symbol *sym; - register CORE_ADDR pc; - register int i; -! char *copy; - - /* Defaults have defaults. */ - ---- 704,710 ---- - register struct symbol *sym; - register CORE_ADDR pc; - register int i; -! char *copy, *dotcopy; - - /* Defaults have defaults. */ - -*************** -*** 818,825 **** ---- 819,847 ---- - /* Look up that token as a function. - If file specified, use that file's per-file block to start with. */ - -+ #ifdef ibm032 -+ /* RT has stupid dots in front of function names (_.foo), and worse, has bogus _foo -+ symbol to confuse us, too. -+ */ -+ if (*copy != '.') { -+ dotcopy = (char *) alloca (strlen(copy)+2); /* one for the null and one for the dot */ -+ dotcopy[0] = '.'; -+ strcpy(dotcopy+1, copy); -+ sym = lookup_symbol (dotcopy, s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1) : 0, -+ VAR_NAMESPACE); -+ } -+ else { -+ sym = 0; -+ dotcopy = 0; -+ } -+ if (!sym || SYMBOL_CLASS(sym) != LOC_BLOCK) { -+ sym = lookup_symbol (copy, s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1) : 0, -+ VAR_NAMESPACE); -+ } -+ #else - sym = lookup_symbol (copy, s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1) : 0, - VAR_NAMESPACE); -+ #endif - - if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) - { -*************** -*** 835,840 **** ---- 857,875 ---- - if (sym) - error ("%s is not a function.", copy); - -+ #ifdef ibm032 -+ /* try the dot version first */ -+ if (dotcopy) for (i = 0; i < misc_function_count; i++) -+ if (!strcmp (misc_function_vector[i].name, dotcopy)) -+ { -+ value.symtab = 0; -+ value.line = 0; -+ value.pc = misc_function_vector[i].address + FUNCTION_START_OFFSET; -+ if (funfirstline) -+ SKIP_PROLOGUE (value.pc); -+ return value; -+ } -+ #endif - for (i = 0; i < misc_function_count; i++) - if (!strcmp (misc_function_vector[i].name, copy)) - { -*************** -*** 1027,1032 **** ---- 1062,1069 ---- - - return type; - } -+ -+ symtabinitialize() {initialize();} - - static - initialize () -diff -c ../../gnu/gdb/utils.c ./utils.c -*** ../../gnu/gdb/utils.c Sun Apr 5 00:40:01 1987 ---- ./utils.c Mon Apr 27 00:40:01 1987 -*************** -*** 151,156 **** ---- 151,157 ---- - else - err = "unknown error"; - -+ /* ibm032: no core leak or other problems 'cause we alway call error -> longjmps away */ - combined = (char *) alloca (strlen (err) + strlen (string) + 3); - strcpy (combined, string); - strcat (combined, ": "); -diff -c ../../gnu/gdb/valarith.c ./valarith.c -*** ../../gnu/gdb/valarith.c Sun Apr 5 00:40:44 1987 ---- ./valarith.c Fri May 22 20:18:46 1987 -*************** -*** 239,245 **** - COERCE_ARRAY (arg1); - - len = TYPE_LENGTH (VALUE_TYPE (arg1)); -! p = VALUE_CONTENTS (arg1); - - while (--len >= 0) - { ---- 239,245 ---- - COERCE_ARRAY (arg1); - - len = TYPE_LENGTH (VALUE_TYPE (arg1)); -! p = (char *) VALUE_CONTENTS (arg1); - - while (--len >= 0) - { -*************** -*** 281,288 **** - && ((len = TYPE_LENGTH (VALUE_TYPE (arg1))) - == TYPE_LENGTH (VALUE_TYPE (arg2)))) - { -! p1 = VALUE_CONTENTS (arg1); -! p2 = VALUE_CONTENTS (arg2); - while (--len >= 0) - { - if (*p1++ != *p2++) ---- 281,288 ---- - && ((len = TYPE_LENGTH (VALUE_TYPE (arg1))) - == TYPE_LENGTH (VALUE_TYPE (arg2)))) - { -! p1 = (char *) VALUE_CONTENTS (arg1); -! p2 = (char *) VALUE_CONTENTS (arg2); - while (--len >= 0) - { - if (*p1++ != *p2++) -*************** -*** 348,353 **** ---- 348,355 ---- - return value_from_long (VALUE_TYPE (arg1), ~ value_as_long (arg1)); - } - -+ valarithinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/valops.c ./valops.c -*** ../../gnu/gdb/valops.c Sun Apr 5 00:41:32 1987 ---- ./valops.c Fri May 22 20:13:02 1987 -*************** -*** 174,180 **** - /* Return a value just like TOVAL except with the contents of FROMVAL. */ - - val = allocate_value (type); -! bcopy (toval, val, VALUE_CONTENTS (val) - (char *) val); - bcopy (VALUE_CONTENTS (fromval), VALUE_CONTENTS (val), TYPE_LENGTH (type)); - - return val; ---- 174,180 ---- - /* Return a value just like TOVAL except with the contents of FROMVAL. */ - - val = allocate_value (type); -! bcopy (toval, val, (char *) VALUE_CONTENTS (val) - (char *) val); - bcopy (VALUE_CONTENTS (fromval), VALUE_CONTENTS (val), TYPE_LENGTH (type)); - - return val; -*************** -*** 413,419 **** ---- 413,427 ---- - } - else if (code == TYPE_CODE_PTR) - { -+ #ifdef ibm032 -+ /* apparently '_a' pseudoprocedure has lval_memory as its lval type */ -+ if (VALUE_LVAL(function) == lval_memory) -+ funaddr = VALUE_ADDRESS(function); -+ else -+ funaddr = value_as_long (function); -+ #else - funaddr = value_as_long (function); -+ #endif - if (TYPE_CODE (TYPE_TARGET_TYPE (ftype)) - == TYPE_CODE_FUNC) - value_type = TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)); -*************** -*** 429,439 **** - else - /* Handle integer used as address of a function. */ - funaddr = value_as_long (function); -- - value_type = builtin_type_int; - } -! else - error ("Invalid data type for function to be called."); - - /* Create a call sequence customized for this function - and the number of arguments for it. */ ---- 437,447 ---- - else - /* Handle integer used as address of a function. */ - funaddr = value_as_long (function); - value_type = builtin_type_int; - } -! else { - error ("Invalid data type for function to be called."); -+ } - - /* Create a call sequence customized for this function - and the number of arguments for it. */ -*************** -*** 590,595 **** ---- 598,605 ---- - return value_field (arg1, i); - } - -+ valopsinitialize() {initialize();} -+ - static - initialize () - { } -diff -c ../../gnu/gdb/valprint.c ./valprint.c -*** ../../gnu/gdb/valprint.c Sun Apr 5 00:42:28 1987 ---- ./valprint.c Mon Apr 27 00:40:56 1987 -*************** -*** 529,534 **** ---- 529,536 ---- - print_max = atoi (arg); - } - -+ valprintinitialize() {initialize();} -+ - static - initialize () - { -diff -c ../../gnu/gdb/value.h ./value.h -*** ../../gnu/gdb/value.h Sun Apr 5 00:43:44 1987 ---- ./value.h Fri May 22 20:03:32 1987 -*************** -*** 37,43 **** - short repeated; - short repetitions; - short regno; -! char contents[1]; - }; - - typedef struct value *value; ---- 37,43 ---- - short repeated; - short repetitions; - short regno; -! long contents[1]; /* Forces alignment... */ - }; - - typedef struct value *value; -diff -c ../../gnu/gdb/values.c ./values.c -*** ../../gnu/gdb/values.c Sun Apr 5 00:45:14 1987 ---- ./values.c Fri May 22 20:12:40 1987 -*************** -*** 338,344 **** - int offset, bitpos, bitsize; - value newval; - { -! register char *addr = VALUE_CONTENTS (var->value) + offset; - if (bitsize) - modify_field (addr, value_as_long (newval), - bitpos, bitsize); ---- 338,344 ---- - int offset, bitpos, bitsize; - value newval; - { -! register char *addr = (char *) VALUE_CONTENTS (var->value) + offset; - if (bitsize) - modify_field (addr, value_as_long (newval), - bitpos, bitsize); -*************** -*** 733,738 **** ---- 733,740 ---- - write_register (1, retbuf[1]); - } - -+ valuesinitialize() {initialize();} -+ - static - initialize () - { - |