فهرست منبع

* move smartlink off to before interface
* Reorganize ifdef GDB_VXYZ part
+ Add code for LIBGDB_HAS_GET_STDIN (possibly set in gen-gdblib-inc.sh script).
+ Use GDB_USE_XSTRVPRINTF conditional.

git-svn-id: trunk@23660 -

pierre 12 سال پیش
والد
کامیت
f095c98e76
1فایلهای تغییر یافته به همراه151 افزوده شده و 78 حذف شده
  1. 151 78
      packages/gdbint/src/gdbint.pp

+ 151 - 78
packages/gdbint/src/gdbint.pp

@@ -14,6 +14,7 @@
 unit GdbInt;
 unit GdbInt;
 
 
 {$mode objfpc}
 {$mode objfpc}
+{$smartlink off}
 
 
 {$define NotImplemented}
 {$define NotImplemented}
 
 
@@ -39,94 +40,46 @@ unit GdbInt;
 
 
 interface
 interface
 
 
-{$smartlink off}
 
 
 
 
 { Is create_breakpoint_hook deprecated? }
 { Is create_breakpoint_hook deprecated? }
 { Seem not so for 6.1 }
 { Seem not so for 6.1 }
 {$define GDB_HAS_DEPRECATED_CBPH}
 {$define GDB_HAS_DEPRECATED_CBPH}
 
 
-{ 6.1.x }
-{$ifdef GDB_V601}
-  {$info using gdb 6.1.x}
-  {$define GDB_V6}
-  {$undef GDB_HAS_DEPRECATED_CBPH}
-{$endif def GDB_V601}
-
-{ 6.2.x }
-{$ifdef GDB_V602}
-  {$info using gdb 6.2.x}
-  {$define GDB_V6}
-{$endif def GDB_V602}
-
-{ 6.3.x }
-{$ifdef GDB_V603}
-  {$info using gdb 6.3.x}
-  {$define GDB_V6}
-{$endif def GDB_V603}
-
-{ 6.4.x }
-{$ifdef GDB_V604}
-  {$info using gdb 6.4.x}
-  {$define GDB_V6}
-  {$define GDB_NEEDS_NO_ERROR_INIT}
-{$endif def GDB_V604}
-
-{ 6.5.x }
-{$ifdef GDB_V605}
-  {$info using gdb 6.5.x}
-  {$define GDB_V6}
-  {$define GDB_NEEDS_NO_ERROR_INIT}
-{$endif def GDB_V605}
-
-{ 6.6.x }
-{$ifdef GDB_V606}
-  {$info using gdb 6.6.x}
-  {$define GDB_V6}
-  {$define GDB_USES_BP_LOCATION}
-  {$define GDB_NEEDS_NO_ERROR_INIT}
-  {$define GDB_USES_EXPAT_LIB}
-  {this was wrong, 6.6 doesn't have debug_file_directory }
-  { was define GDB_HAS_DEBUG_FILE_DIRECTORY}
-{$endif def GDB_V606}
 
 
-{ 6.7.x }
-{$ifdef GDB_V607}
-  {$info using gdb 6.7.x}
-  {$define GDB_V6}
-  {$define GDB_USES_BP_LOCATION}
-  {$define GDB_NEEDS_NO_ERROR_INIT}
-  {$define GDB_USES_EXPAT_LIB}
-  {$define GDB_HAS_DEBUG_FILE_DIRECTORY}
-{$endif def GDB_V607}
+{
+  Excatly one
+  GDB_VXYZ macro
+  where XYZ are three numbers
+  needs to defined
+  either inside gdblib.inc or gdbver.inc
+  This corresponds to version
+  X.YZ.patch_level
+}
 
 
-{ 6.8.x }
-{$ifdef GDB_V608}
-  {$info using gdb 6.8.x}
-  {$define GDB_V6}
-  {$define GDB_USES_BP_LOCATION}
-  {$define GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
-  {$define GDB_NEEDS_NO_ERROR_INIT}
-  {$define GDB_USES_EXPAT_LIB}
-  {$define GDB_HAS_DEBUG_FILE_DIRECTORY}
-  {$define GDB_USES_LIBDECNUMBER}
-  // {$define GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
-  {$define GDB_HAS_BP_NONE}
-{$endif def GDB_V608}
+{$undef GDB_VERSION_RECOGNIZED}
 
 
+{ 7.5.x }
 {$ifdef GDB_V705}
 {$ifdef GDB_V705}
-  {$define GDB_V_704}
-  {$define GDB_BO_LOCATION_HAS_COND_BYTECODE}
+  {$info using gdb 7.5.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_VER_GE_705}
+{$endif}
+
+{$ifdef GDB_VER_GE_705}
+  {$define GDB_VER_GE_704}
+  {$define GDB_BP_LOCATION_HAS_COND_BYTECODE}
   {$define GDB_BP_LOCATION_HAS_RELATED_ADDRESS}
   {$define GDB_BP_LOCATION_HAS_RELATED_ADDRESS}
 {$endif}
 {$endif}
 
 
 { 7.4.x }
 { 7.4.x }
 {$ifdef GDB_V704}
 {$ifdef GDB_V704}
   {$info using gdb 7.4.x}
   {$info using gdb 7.4.x}
-  {$define GDB_V_704}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_VER_GE_704}
 {$endif}
 {$endif}
 
 
-{$ifdef GDB_V_704}
+{$ifdef GDB_VER_GE_704}
   {$define GDB_V7}
   {$define GDB_V7}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_HAS_PROGRAM_SPACE}
   {$define GDB_HAS_PROGRAM_SPACE}
@@ -142,11 +95,12 @@ interface
   {$ifdef win32}
   {$ifdef win32}
       {$define GDB_USES_LIBADVAPI32}
       {$define GDB_USES_LIBADVAPI32}
   {$endif win32}
   {$endif win32}
-{$endif def GDB_V704}
+{$endif def GDB_VER_GE_704}
 
 
 { 7.3.x }
 { 7.3.x }
 {$ifdef GDB_V703}
 {$ifdef GDB_V703}
   {$info using gdb 7.3.x}
   {$info using gdb 7.3.x}
+  {$define GDB_VERSION_RECOGNIZED}
   {$define GDB_V7}
   {$define GDB_V7}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_HAS_PROGRAM_SPACE}
   {$define GDB_HAS_PROGRAM_SPACE}
@@ -161,11 +115,13 @@ interface
     {$define GDB_BP_LOCATION_HAS_OPS}
     {$define GDB_BP_LOCATION_HAS_OPS}
     {$define GDB_UI_FILE_HAS_WRITE_ASYNC}
     {$define GDB_UI_FILE_HAS_WRITE_ASYNC}
   {$endif GDB_CVS}
   {$endif GDB_CVS}
+  {$define GDB_VERSION_RECOGNIZED}
 {$endif def GDB_V703}
 {$endif def GDB_V703}
 
 
 { 7.2.x }
 { 7.2.x }
 {$ifdef GDB_V702}
 {$ifdef GDB_V702}
   {$info using gdb 7.2.x}
   {$info using gdb 7.2.x}
+  {$define GDB_VERSION_RECOGNIZED}
   {$define GDB_V7}
   {$define GDB_V7}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_HAS_PROGRAM_SPACE}
   {$define GDB_HAS_PROGRAM_SPACE}
@@ -174,6 +130,7 @@ interface
 { 7.1.x }
 { 7.1.x }
 {$ifdef GDB_V701}
 {$ifdef GDB_V701}
   {$info using gdb 7.1.x}
   {$info using gdb 7.1.x}
+  {$define GDB_VERSION_RECOGNIZED}
   {$define GDB_V7}
   {$define GDB_V7}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_HAS_PROGRAM_SPACE}
   {$define GDB_HAS_PROGRAM_SPACE}
@@ -184,6 +141,7 @@ interface
 { 7.0.x }
 { 7.0.x }
 {$ifdef GDB_V700}
 {$ifdef GDB_V700}
   {$info using gdb 7.0.x}
   {$info using gdb 7.0.x}
+  {$define GDB_VERSION_RECOGNIZED}
   {$define GDB_V7}
   {$define GDB_V7}
   {$ifdef GDB_CVS}
   {$ifdef GDB_CVS}
     {$define GDB_BP_LOCATION_HAS_GDBARCH}
     {$define GDB_BP_LOCATION_HAS_GDBARCH}
@@ -208,9 +166,92 @@ interface
   {$define GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
   {$define GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
   {$define GDB_TARGET_CLOSE_HAS_PTARGET_ARG}
   {$define GDB_TARGET_CLOSE_HAS_PTARGET_ARG}
   {$define GDB_HAS_BP_NONE}
   {$define GDB_HAS_BP_NONE}
+  {$define GDB_USE_XSTRVPRINTF}
 {$endif def GDB_V7}
 {$endif def GDB_V7}
 
 
 
 
+{ 6.8.x }
+{$ifdef GDB_V608}
+  {$info using gdb 6.8.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$define GDB_USES_BP_LOCATION}
+  {$define GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
+  {$define GDB_NEEDS_NO_ERROR_INIT}
+  {$define GDB_USES_EXPAT_LIB}
+  {$define GDB_HAS_DEBUG_FILE_DIRECTORY}
+  {$define GDB_USES_LIBDECNUMBER}
+  // {$define GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
+  {$define GDB_HAS_BP_NONE}
+{$endif def GDB_V608}
+
+{ 6.7.x }
+{$ifdef GDB_V607}
+  {$info using gdb 6.7.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$define GDB_USES_BP_LOCATION}
+  {$define GDB_NEEDS_NO_ERROR_INIT}
+  {$define GDB_USES_EXPAT_LIB}
+  {$define GDB_HAS_DEBUG_FILE_DIRECTORY}
+{$endif def GDB_V607}
+
+{ 6.6.x }
+{$ifdef GDB_V606}
+  {$info using gdb 6.6.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$define GDB_USES_BP_LOCATION}
+  {$define GDB_NEEDS_NO_ERROR_INIT}
+  {$define GDB_USES_EXPAT_LIB}
+  {$define GDB_HAS_DEBUG_FILE_DIRECTORY}
+{$endif def GDB_V606}
+
+{ 6.5.x }
+{$ifdef GDB_V605}
+  {$info using gdb 6.5.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$define GDB_NEEDS_NO_ERROR_INIT}
+{$endif def GDB_V605}
+
+{ 6.4.x }
+{$ifdef GDB_V604}
+  {$info using gdb 6.4.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$define GDB_NEEDS_NO_ERROR_INIT}
+{$endif def GDB_V604}
+
+{ 6.3.x }
+{$ifdef GDB_V603}
+  {$info using gdb 6.3.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+{$endif def GDB_V603}
+
+{ 6.2.x }
+{$ifdef GDB_V602}
+  {$info using gdb 6.2.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+{$endif def GDB_V602}
+
+{ 6.1.x }
+{$ifdef GDB_V601}
+  {$info using gdb 6.1.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+  {$undef GDB_HAS_DEPRECATED_CBPH}
+{$endif def GDB_V601}
+
+{ 6.0.x }
+{$ifdef GDB_V600}
+  {$info using gdb 6.0.x}
+  {$define GDB_VERSION_RECOGNIZED}
+  {$define GDB_V6}
+{$endif def GDB_V600}
+
 {$ifdef GDB_V6}
 {$ifdef GDB_V6}
   {$define GDB_HAS_SYSROOT}
   {$define GDB_HAS_SYSROOT}
   {$define GDB_HAS_DB_COMMANDS}
   {$define GDB_HAS_DB_COMMANDS}
@@ -218,6 +259,10 @@ interface
   {$define GDB_INIT_HAS_ARGV0}
   {$define GDB_INIT_HAS_ARGV0}
 {$endif GDB_V6}
 {$endif GDB_V6}
 
 
+{$ifdef GDB_VERSION_RECOGNIZED}
+  {$warning no recognized GDB_VXYZ conditional found, linking might fail. }
+{$endif}
+
 
 
 {$ifdef GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
 {$ifdef GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
   {$define DO_NOT_USE_CBPH}
   {$define DO_NOT_USE_CBPH}
@@ -437,9 +482,9 @@ interface
 {$ifdef NotImplemented}
 {$ifdef NotImplemented}
   {$undef NotImplemented}
   {$undef NotImplemented}
   {$LINKLIB libgdb.a}
   {$LINKLIB libgdb.a}
- {$ifdef GDB_HAS_SIM}
-  {$LINKLIB libsim.a}
- {$endif GDB_HAS_SIM}
+  {$ifdef GDB_HAS_SIM}
+   {$LINKLIB libsim.a}
+  {$endif GDB_HAS_SIM}
   {$LINKLIB libbfd.a}
   {$LINKLIB libbfd.a}
   {$LINKLIB libreadline.a}
   {$LINKLIB libreadline.a}
   {$LINKLIB libopcodes.a}
   {$LINKLIB libopcodes.a}
@@ -1063,7 +1108,7 @@ type
          owner : pbreakpoint;
          owner : pbreakpoint;
 {$ifdef GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
 {$ifdef GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
          cond : pointer;{pexpression;}
          cond : pointer;{pexpression;}
-{$ifdef GDB_BO_LOCATION_HAS_COND_BYTECODE}
+{$ifdef GDB_BP_LOCATION_HAS_COND_BYTECODE}
          cond_bytecode : pagent_expr;
          cond_bytecode : pagent_expr;
          condition_changed : tcondition_status;
          condition_changed : tcondition_status;
          cmd_bytecode : pagent_expr;
          cmd_bytecode : pagent_expr;
@@ -1641,9 +1686,17 @@ var
 var
 var
   instream : P_C_FILE;cvar;external;
   instream : P_C_FILE;cvar;external;
   function gdb_fopen (filename : pchar; mode : pchar) : pui_file;cdecl;external;
   function gdb_fopen (filename : pchar; mode : pchar) : pui_file;cdecl;external;
+{$ifdef LIBGDB_HAS_GET_STDIN}
+  { this function is generated by the gen-libgdb-inc.sh script
+    in a object called gdb_get_stdin.o added to the libgdb.a archive }
+  function gdb_get_stdin : P_C_FILE; cdecl; external;
+var
+  saved_command_line : pchar;cvar;external; { defined in top.c source }
+  saved_command_line_size : longint;cvar;external; {defined in top.c source }
+{$endif}
 {$endif GDB_NEEDS_SET_INSTREAM}
 {$endif GDB_NEEDS_SET_INSTREAM}
 var
 var
-  { The four following variables are defined in defs.h 
+  { The four following variables are defined in defs.h
     and instanciated in main.c since version 5.0 }
     and instanciated in main.c since version 5.0 }
   gdb_stdout : pui_file;cvar;public;
   gdb_stdout : pui_file;cvar;public;
   gdb_stderr : pui_file;cvar;public;
   gdb_stderr : pui_file;cvar;public;
@@ -1665,7 +1718,11 @@ function  xmalloc(size : longint) : pointer;cdecl;external;
 { xvasprintf is present at least from GDB 5.3
 { xvasprintf is present at least from GDB 5.3
   while xstrvprintf only appears in version 6.2,
   while xstrvprintf only appears in version 6.2,
   so only use xvasprintf function }
   so only use xvasprintf function }
+{$ifdef GDB_USE_XSTRVPRINTF}
+function xstrvprintf(msg : pchar) : pchar; varargs; cdecl; external;
+{$else}
 function xvasprintf(ret : ppchar; msg : pchar) : pchar; varargs; cdecl; external;
 function xvasprintf(ret : ppchar; msg : pchar) : pchar; varargs; cdecl; external;
+{$endif}
 procedure xfree(p : pointer); cdecl; external;
 procedure xfree(p : pointer); cdecl; external;
 function  find_pc_line(i:CORE_ADDR;l:longint):symtab_and_line;cdecl;external;
 function  find_pc_line(i:CORE_ADDR;l:longint):symtab_and_line;cdecl;external;
 function  find_pc_function(i:CORE_ADDR):psymbol;cdecl;external;
 function  find_pc_function(i:CORE_ADDR):psymbol;cdecl;external;
@@ -2047,6 +2104,13 @@ begin
     stop_breakpoint_number:=num;
     stop_breakpoint_number:=num;
 end;
 end;
 
 
+procedure annotate_breakpoints_changed;cdecl;public;
+begin
+{$ifdef Verbose}
+  Debug('|breakpoints_changed|');
+{$endif}
+end;
+
 
 
 procedure annotate_watchpoint(num:longint);cdecl;public;
 procedure annotate_watchpoint(num:longint);cdecl;public;
 begin
 begin
@@ -2553,7 +2617,11 @@ begin
         QueryHook:=1
         QueryHook:=1
       else if pos('%',question)>0 then
       else if pos('%',question)>0 then
         begin
         begin
+{$ifdef GDB_USE_XSTRVPRINTF}
+          local:=xstrvprintf(question,arg);
+{$else}
           xvasprintf(@local,question,arg);
           xvasprintf(@local,question,arg);
+{$endif}
           { xvasprintf can failed, in that case local is set to nil }
           { xvasprintf can failed, in that case local is set to nil }
           if not assigned(local) then
           if not assigned(local) then
             local:=question;
             local:=question;
@@ -3236,6 +3304,10 @@ begin
     ui_file_delete(gdb_stdin);
     ui_file_delete(gdb_stdin);
   gdb_stdin:=mem_fileopen;
   gdb_stdin:=mem_fileopen;
   save_gdb_stdin:=gdb_stdin;
   save_gdb_stdin:=gdb_stdin;
+{$ifdef LIBGDB_HAS_GET_STDIN}
+  instream:=gdb_get_stdin;
+  saved_command_line:=xmalloc(saved_command_line_size);
+{$else}
   dummy_file :=gdb_fopen('dummy.$$$','a');
   dummy_file :=gdb_fopen('dummy.$$$','a');
   {in captured_main code, this is simply
   {in captured_main code, this is simply
    instream:=stdin; but stdin is a highly system dependent macro
    instream:=stdin; but stdin is a highly system dependent macro
@@ -3244,6 +3316,7 @@ begin
     instream:=pstdio_file(dummy_file^.to_data)^._file
     instream:=pstdio_file(dummy_file^.to_data)^._file
   else
   else
     instream:=nil;
     instream:=nil;
+{$endif}
 {$endif GDB_NEEDS_SET_INSTREAM}
 {$endif GDB_NEEDS_SET_INSTREAM}
 
 
   gdb_stderr:=mem_fileopen;
   gdb_stderr:=mem_fileopen;
@@ -3338,10 +3411,10 @@ end;
     variables that are defined in main.c source.
     variables that are defined in main.c source.
     We must not load main.o otherwise, we will get
     We must not load main.o otherwise, we will get
     into multiply defined symbols troubles. }
     into multiply defined symbols troubles. }
-var 
+var
     gdb_sysrootc : char;
     gdb_sysrootc : char;
     { used locally only to provide a pchar pointing to '\0' }
     { used locally only to provide a pchar pointing to '\0' }
-    gdb_sysroot  : pchar; cvar;public; 
+    gdb_sysroot  : pchar; cvar;public;
     { gdb_sysroot global variable is declared in defs.h and
     { gdb_sysroot global variable is declared in defs.h and
       instanciated in main.c since version 6.0 }
       instanciated in main.c since version 6.0 }
     gdb_datadir  : pchar; cvar;public;
     gdb_datadir  : pchar; cvar;public;