home *** CD-ROM | disk | FTP | other *** search
- {
- $Id: gdb.pas,v 1.1.1.1 1998/03/25 11:18:13 root Exp $
- Copyright (c) 1996-98 by Florian Klaempfl
-
- This units contains special support for the GDB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- ****************************************************************************
- }
- unit gdb;
-
- interface
-
- uses
- {$ifdef i386}
- i386,
- {$endif i386}
- strings,cobjects,globals,aasm;
-
- {stab constants }
- Const
- N_GSYM = $20;
- N_STSYM = 38; {initialized const }
- N_LCSYM = 40; {non initialized variable}
- N_Function = $22; {function or const }
- N_TextLine = $44;
- N_DataLine = $46;
- N_BssLine = $48;
- N_RSYM = $40; { register variable }
- N_LSYM = $80;
- N_PSYM = 160;
- N_SourceFile = $64;
- N_IncludeFile = $84;
- N_BINCL = $82;
- N_EINCL = $A2;
- N_EXCL = $C2;
-
- type
- pai_stabs = ^tai_stabs;
-
- tai_stabs = object(tai)
- str : pchar;
- constructor init(_str : pchar);
- destructor done; virtual;
- end;
-
- pai_stabn = ^tai_stabn;
-
- tai_stabn = object(tai)
- str : pchar;
- constructor init(_str : pchar);
- destructor done; virtual;
- end;
-
- pai_stab_function_name = ^tai_stab_function_name;
-
- tai_stab_function_name = object(tai)
- str : pchar;
- constructor init(_str : pchar);
- destructor done; virtual;
- end;
-
- const DBX_counter : plongint = nil;
- do_count_dbx : boolean = false;
- { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
- "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
- { this is the register order for GDB }
-
- {$ifdef i386}
- {tregister = (R_NO,R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
- R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
- R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
- for an easier assembler generation
- R_DEFAULT_SEG,R_CS,R_DS,R_ES,R_FS,R_GS,R_SS,
- R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7); }
- GDB_i386index : array[tregister] of shortint =
- (-1,0,1,2,3,4,5,6,7,0,1,2,3,4,5,7,0,1,2,3,0,1,2,3,
- -1,10,12,13,14,15,11,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- { I think, GDB doesn't know MMX (FK) }
- -1,-1,-1,-1,-1,-1,-1,-1);
- {$endif i386}
-
- implementation
-
- {$IfDef DBX}
-
- { to use N_EXCL we have to count the character in the stabs for
- N_BINCL to N_EINCL
- Code comes from stabs.c for ld
- if (type == N_BINCL)
- (
- bfd_vma val;
- int nest;
- bfd_byte *incl_sym;
- struct stab_link_includes_entry *incl_entry;
- struct stab_link_includes_totals *t;
- struct stab_excl_list *ne;
-
- val = 0;
- nest = 0;
- for (incl_sym = sym + STABSIZE;
- incl_sym < symend;
- incl_sym += STABSIZE)
- (
- int incl_type;
-
- incl_type = incl_sym[TYPEOFF];
- if (incl_type == 0)
- break;
- else if (incl_type == N_EINCL)
- (
- if (nest == 0)
- break;
- --nest;
- )
- else if (incl_type == N_BINCL)
- ++nest;
- else if (nest == 0)
- (
- const char *str;
-
- str = ((char *) stabstrbuf
- + stroff
- + bfd_get_32 (abfd, incl_sym + STRDXOFF));
- for (; *str != '\0'; str++)
- (
- val += *str;
- if (*str == '(')
- (
- Skip the file number.
- ++str;
- while (isdigit ((unsigned char) *str))
- ++str;
- --str;
- )
- )
- )
- ) }
-
-
- procedure count_dbx(st : pchar);
- var i : longint;
- do_count : boolean;
- begin
- do_count := false;
- if dbx_counter = nil then
- else
- begin
- {$IfDef ExtDebug }
- Comment(V_Info,'Counting '+st);
- Comment(V_Info,'count = '+tostr(dbx_counter^));
- Comment(V_Info,'addr = '+tostr(longint(dbx_counter)));
- {$EndIf ExtDebug }
- for i:=0 to strlen(st) do
- begin
- if st[i] = '"' then
- if do_count then exit
- else do_count := true
- else
- if do_count then
- begin
- dbx_counter^ := dbx_counter^+byte(st[i]);
- if st[i] = '(' then
- begin
- inc(i);
- while st[i] in ['0'..'9'] do inc(i);
- dec(i);
- end;
- end;
- end;
- end;
- end;
-
- {$EndIf DBX}
-
- constructor tai_stabs.init(_str : pchar);
-
- begin
- inherited init;
- typ:=ait_stabs;
- str:=_str;
- {$IfDef DBX}
- if do_count_dbx then
- begin
- count_dbx(str);
- do_count_dbx := false;
- end;
- {$EndIf DBX}
- end;
-
- destructor tai_stabs.done;
-
- begin
- strdispose(str);
- inherited done;
- end;
-
- constructor tai_stabn.init(_str : pchar);
-
- begin
- inherited init;
- typ:=ait_stabn;
- str:=_str;
- end;
-
- destructor tai_stabn.done;
-
- begin
- strdispose(str);
- inherited done;
- end;
-
- constructor tai_stab_function_name.init(_str : pchar);
-
- begin
- inherited init;
- typ:=ait_stab_function_name;
- str:=_str;
- end;
-
- destructor tai_stab_function_name.done;
-
- begin
- strdispose(str);
- inherited done;
- end;
- end.
-
- {
- $Log: gdb.pas,v $
- Revision 1.1.1.1 1998/03/25 11:18:13 root
- * Restored version
-
- Revision 1.5 1998/03/10 01:17:18 peter
- * all files have the same header
- * messages are fully implemented, EXTDEBUG uses Comment()
- + AG... files for the Assembler generation
-
- Revision 1.4 1998/03/02 01:48:33 peter
- * renamed target_DOS to target_GO32V1
- + new verbose system, merged old errors and verbose units into one new
- verbose.pas, so errors.pas is obsolete
-
- Revision 1.3 1998/02/13 10:35:01 daniel
- * Made Motorola version compilable.
- * Fixed optimizer
-
- Revision 1.2 1997/11/28 18:14:32 pierre
- working version with several bug fixes
-
- Revision 1.1.1.1 1997/11/27 08:32:56 michael
- FPC Compiler CVS start
-
- }
-