Browse Source

--- Merging r19593 into '.':
U packages/gdbint/src/gdbint.pp
--- Merging r19594 into '.':
G packages/gdbint/src/gdbint.pp
--- Merging r19831 into '.':
G packages/gdbint/src/gdbint.pp
--- Merging r20097 into '.':
G packages/gdbint/src/gdbint.pp
--- Merging r21451 into '.':
U packages/gdbint/gen-gdblib-inc.sh

# revisions: 19593,19594,19831,20097,21451
deleted corrected entry 21698 Invalid stream operation
r19593 | pierre | 2011-11-03 17:31:56 +0100 (Thu, 03 Nov 2011) | 1 line
Changed paths:
M /trunk/packages/gdbint/src/gdbint.pp

* Fix longstanding confusion between two gdb functions catch_errors and catch_command_errors fix led to random from_tty parameter value
deleted corrected entry 21698 Invalid stream operation
r19594 | pierre | 2011-11-03 17:38:28 +0100 (Thu, 03 Nov 2011) | 1 line
Changed paths:
M /trunk/packages/gdbint/src/gdbint.pp

Avoid warning on non-i386 CPUs
deleted corrected entry 21698 Invalid stream operation
r19831 | pierre | 2011-12-12 17:48:14 +0100 (Mon, 12 Dec 2011) | 1 line
Changed paths:
M /trunk/packages/gdbint/src/gdbint.pp

* Try to support upcoming GDB 7.4 version
deleted corrected entry 21698 Invalid stream operation
r20097 | pierre | 2012-01-16 23:12:06 +0100 (Mon, 16 Jan 2012) | 1 line
Changed paths:
M /trunk/packages/gdbint/src/gdbint.pp

+ Add some comments and follow main.c more closely
deleted corrected entry 21698 Invalid stream operation
r21451 | pierre | 2012-06-01 16:28:41 +0200 (Fri, 01 Jun 2012) | 1 line
Changed paths:
M /trunk/packages/gdbint/gen-gdblib-inc.sh

Correctly handle implicitlibs="c gcc"

git-svn-id: branches/fixes_2_6@21637 -

marco 13 years ago
parent
commit
75c21e832e
2 changed files with 232 additions and 24 deletions
  1. 1 1
      packages/gdbint/gen-gdblib-inc.sh
  2. 231 23
      packages/gdbint/src/gdbint.pp

+ 1 - 1
packages/gdbint/gen-gdblib-inc.sh

@@ -71,7 +71,7 @@ fi
 opt_handled=1
 while [ $opt_handled -eq 1 ]
 do
-  handle_option $1
+  handle_option "$1"
   if [ $opt_handled -eq 1 ] ; then
     shift
   fi

+ 231 - 23
packages/gdbint/src/gdbint.pp

@@ -50,7 +50,6 @@ interface
 {$ifdef GDB_V601}
   {$info using gdb 6.1.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
   {$undef GDB_HAS_DEPRECATED_CBPH}
 {$endif def GDB_V601}
 
@@ -58,14 +57,12 @@ interface
 {$ifdef GDB_V602}
   {$info using gdb 6.2.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
 {$endif def GDB_V602}
 
 { 6.3.x }
 {$ifdef GDB_V603}
   {$info using gdb 6.3.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
 {$endif def GDB_V603}
 
 { 6.4.x }
@@ -73,7 +70,6 @@ interface
   {$info using gdb 6.4.x}
   {$define GDB_V6}
   {$define GDB_NEEDS_NO_ERROR_INIT}
-  {$define GDB_HAS_DB_COMMANDS}
 {$endif def GDB_V604}
 
 { 6.5.x }
@@ -87,7 +83,6 @@ interface
 {$ifdef GDB_V606}
   {$info using gdb 6.6.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
   {$define GDB_USES_BP_LOCATION}
   {$define GDB_NEEDS_NO_ERROR_INIT}
   {$define GDB_USES_EXPAT_LIB}
@@ -98,7 +93,6 @@ interface
 {$ifdef GDB_V607}
   {$info using gdb 6.7.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
   {$define GDB_USES_BP_LOCATION}
   {$define GDB_NEEDS_NO_ERROR_INIT}
   {$define GDB_USES_EXPAT_LIB}
@@ -109,7 +103,6 @@ interface
 {$ifdef GDB_V608}
   {$info using gdb 6.8.x}
   {$define GDB_V6}
-  {$define GDB_HAS_DB_COMMANDS}
   {$define GDB_USES_BP_LOCATION}
   {$define GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
   {$define GDB_NEEDS_NO_ERROR_INIT}
@@ -120,13 +113,41 @@ interface
   {$define GDB_HAS_BP_NONE}
 {$endif def GDB_V608}
 
+{ 7.4.x }
+{$ifdef GDB_V704}
+  {$info using gdb 7.4.x}
+  {$define GDB_V7}
+  {$define GDB_BP_LOCATION_HAS_GDBARCH}
+  {$define GDB_HAS_PROGRAM_SPACE}
+  {$define GDB_NO_UIOUT}
+  {$define GDB_NEEDS_INTERPRETER_SETUP}
+  {$define GDB_NEEDS_SET_INSTREAM}
+  {$define GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
+  {$define GDB_USES_BP_OPS}
+  {$define GDB_BP_TI_HAS_LENGTH}
+  {$define GDB_BP_LOCATION_HAS_REFCOUNT}
+  {$define GDB_BP_LOCATION_HAS_OPS}
+  {$define GDB_UI_FILE_HAS_WRITE_ASYNC}
+{$endif def GDB_V704}
+
 { 7.3.x }
 {$ifdef GDB_V703}
   {$info using gdb 7.3.x}
   {$define GDB_V7}
   {$define GDB_BP_LOCATION_HAS_GDBARCH}
   {$define GDB_HAS_PROGRAM_SPACE}
-{$endif def GDB_V702}
+  {$define GDB_BP_TI_HAS_LENGTH}
+  {$define GDB_BP_LOCATION_HAS_REFCOUNT}
+  {$ifdef GDB_CVS}
+    {$define GDB_NO_UIOUT}
+    {$define GDB_NEEDS_INTERPRETER_SETUP}
+    {$define GDB_NEEDS_SET_INSTREAM}
+    {$define GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
+    {$define GDB_USES_BP_OPS}
+    {$define GDB_BP_LOCATION_HAS_OPS}
+    {$define GDB_UI_FILE_HAS_WRITE_ASYNC}
+  {$endif GDB_CVS}
+{$endif def GDB_V703}
 
 { 7.2.x }
 {$ifdef GDB_V702}
@@ -448,8 +469,9 @@ interface
   {$LINKLIB libintl.a}
   {$LINKLIB imagehlp}
   {$endif not USE_MINGW_GDB}
-  {$LINKLIB kernel32}
+  {$LINKLIB advapi32}
   {$LINKLIB user32}
+  {$LINKLIB kernel32}
 {$endif win32}
 
 {$ifdef win64}
@@ -588,9 +610,11 @@ type
 type
 
   pui_file = ^ui_file;
+  pstdio_file = ^stdio_file;
 
   ui_file_flush_ftype = procedure(stream : pui_file);cdecl;
   ui_file_write_ftype = procedure(stream : pui_file;buf : pchar;len : longint);cdecl;
+  ui_file_write_async_save_ftype = procedure(stream : pui_file;buf : pchar;len : longint);cdecl;
   ui_file_fputs_ftype = procedure(buf : pchar; stream : pui_file);cdecl;
   ui_file_delete_ftype = procedure(stream : pui_file);cdecl;
   ui_file_isatty_ftype = function(stream : pui_file) : longbool;cdecl;
@@ -605,6 +629,9 @@ type
       magic : plongint;
       to_flush  : ui_file_flush_ftype;
       to_write  : ui_file_write_ftype;
+      {$ifdef GDB_UI_FILE_HAS_WRITE_ASYNC}
+      to_write_async_safe   : ui_file_write_async_save_ftype;
+      {$endif}
       to_fputs  : ui_file_fputs_ftype;
       {$ifdef GDB_V6}
       to_read   : ui_file_read_ftype;
@@ -616,6 +643,13 @@ type
       to_data   : pointer;
     end;
 
+  stdio_file = record
+      magic : plongint;
+      _file : P_C_FILE;
+      df : longint;
+      close_p : longint;
+    end;
+
   { used to delete stdio_ui_file  gdb_stdout and gdb_stderr }
   procedure ui_file_delete(stream : pui_file);cdecl;external;
 
@@ -774,10 +808,16 @@ function  inferior_pid : longint;
 {$ifdef GDB_V6}
 type
   ui_out = pointer;
+{$ifndef GDB_NO_UIOUT}
 var
   uiout : ui_out;cvar;external;
+{$else  GDB_NO_UIOUT}
+var
+  cli_uiout : ui_out;cvar;external;
+  current_uiout : ui_out;cvar;external;
+{$endif GDB_NO_UIOUT}
 function cli_out_new (stream : pui_file):ui_out;cdecl;external;
-{$endif}
+{$endif GDB_V6}
 
 {$ifdef go32v2}
   { needed to be sure %fs contains the DOS memory selector
@@ -872,6 +912,13 @@ type
      pCORE_ADDR = ^CORE_ADDR;
      pblock = ^block;
 
+     tframe_id = record
+       stack_addr, code_addr, special_addr : CORE_ADDR;
+       addr_p_flags : byte;{ for three 1 bit flags
+       stack_addr_p, code_addr_p, special_addr_p : cint : 1; }
+       inline_depth : longint;
+     end;
+
      tlanguage = (language_unknown,language_auto,language_c,
        language_cplus,language_java,language_chill,
        language_fortran,language_m2,language_asm,
@@ -900,9 +947,18 @@ type
 
      target_hw_bp_type = (hw_write, hw_read, hw_access, hw_execute);
 
+     { pointer to structures that we don't need }
+     pbp_ops = pointer;
+     pbp_location_ops = pointer;
+     pprogram_space = pointer;
+     pgdbarch = pointer;
+
 {$PACKRECORDS 4}
      pbreakpoint = ^breakpoint;
      breakpoint = record
+{$ifdef GDB_USES_BP_OPS}
+          ops : pbp_ops;
+{$endif GDB_USES_BP_OPS}
           next : pbreakpoint;
           typ : bptype;
           enable : tenable;
@@ -913,19 +969,36 @@ type
 {$else not GDB_USES_BP_LOCATION}
           address : CORE_ADDR;
 {$endif not GDB_USES_BP_LOCATION}
+{$ifndef GDB_USES_BP_OPS}
           line_number : longint;
           source_file : pchar;
+{$endif not GDB_USES_BP_OPS}
           silent : byte;
+{$ifdef GDB_USES_BP_OPS}
+          display_canonical: byte;
+{$endif GDB_USES_BP_OPS}
+
           ignore_count : longint;
 {$ifndef GDB_USES_BP_LOCATION}
           shadow_contents : array[0..15] of char;
           inserted : char;
           duplicate : char;
 {$endif not GDB_USES_BP_LOCATION}
+
           commands : pointer; {^command_line}
+{$ifdef GDB_USES_BP_OPS}
+          frame_id : tframe_id;
+          pspace : pprogram_space;
+{$else not GDB_USES_BP_OPS}
           frame : CORE_ADDR;
           cond : pointer; {^expression}
-          addr_string : ^char;
+{$endif GDB_USES_BP_OPS}
+          addr_string : pchar;
+{$ifdef GDB_USES_BP_OPS}
+          filter : pchar;
+          addr_string_range_end : pchar;
+          gdbarch : pgdbarch;
+{$endif GDB_USES_BP_OPS}
           language : tlanguage;
           input_radix : longint;
           cond_string : ^char;
@@ -944,6 +1017,9 @@ type
      bp_target_info = record
           placed_address_space : pointer;{paddress_space;}
           placed_address : CORE_ADDR;
+{$ifdef GDB_BP_TI_HAS_LENGTH}
+          length : longint;
+{$endif GDB_BP_TI_HAS_LENGTH}
           shadow_contents : array[0..15] of char;
           shadow_len : longint;
           placed_size : longint;
@@ -951,9 +1027,17 @@ type
 
      bp_location = record
          next : pbp_location;
+{$ifdef GDB_BP_LOCATION_HAS_OPS}
+         ops : pbp_location_ops;
+{$endif GDB_BP_LOCATION_HAS_OPS}
+
+{$ifdef GDB_BP_LOCATION_HAS_REFCOUNT}
+        refc : longint;
+{$else}
 {$ifdef GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
          global_next : pbp_location;
 {$endif GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
+{$endif}
          loc_type : bp_loc_type;
          owner : pbreakpoint;
 {$ifdef GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
@@ -964,10 +1048,10 @@ type
          inserted : byte;
          duplicate : byte;
 {$ifdef GDB_BP_LOCATION_HAS_GDBARCH}
-         gdbarch : pointer;{pgdbarch;}
+         gdbarch : pgdbarch;
 {$endif GDB_BP_LOCATION_HAS_GDBARCH}
 {$ifdef GDB_HAS_PROGRAM_SPACE}
-         pspace : pointer;{pprogram_space;}
+         pspace : pprogram_space;
 {$endif GDB_HAS_PROGRAM_SPACE}
          address : CORE_ADDR;
 {$ifdef GDB_BP_LOCATION_HAS_GLOBAL_NEXT}
@@ -982,6 +1066,11 @@ type
          target_info : bp_target_info;
          overlay_target_info : bp_target_info;
          events_till_retirement : longint;
+{$ifdef GDB_USES_BP_OPS}
+        { line and source file are in location }
+          line_number : longint;
+          source_file : pchar;
+{$endif not GDB_USES_BP_OPS}
       end;
 
      tfreecode=(free_nothing,free_contents,free_linetable);
@@ -1491,7 +1580,9 @@ var
   {$endif ndef GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
   current_target : target_ops;cvar;external;
   stop_pc      : CORE_ADDR;cvar;external;
-  { Only used from GDB 5.01 but doesn't hurst otherwise }
+  { Only used from GDB 5.0 but doesn't hurst otherwise }
+  { This global variable is declared in defs.h as external
+    and instanciated in main.c since version 5.0. }
   interpreter_p : pchar;cvar;public;
 
 { we need also to declare some vars }
@@ -1505,13 +1596,22 @@ var
 
 { Whether xdb commands will be handled }
 {$ifdef GDB_HAS_DB_COMMANDS}
+  { These two global variables are declared in defs.h
+    since version 4.18 }
   xdb_commands : longint;cvar;public;
 
 { Whether dbx commands will be handled }
   dbx_commands : longint;cvar;public;
 {$endif GDB_HAS_DB_COMMANDS}
 
+{$ifdef GDB_NEEDS_SET_INSTREAM}
+var
+  instream : P_C_FILE;cvar;external;
+  function gdb_fopen (filename : pchar; mode : pchar) : pui_file;cdecl;external;
+{$endif GDB_NEEDS_SET_INSTREAM}
 var
+  { The four following variables are defined in defs.h 
+    and instanciated in main.c since version 5.0 }
   gdb_stdout : pui_file;cvar;public;
   gdb_stderr : pui_file;cvar;public;
   gdb_stdlog : pui_file;cvar;public;
@@ -1519,6 +1619,9 @@ var
   event_loop_p : longint;cvar;public;
 {$ifdef GDB_V6}
 (* target IO streams *)
+  { The three following variables are declared in defs.h
+    and instanciated in main.c since version 6.0 }
+  gdb_stdin : pui_file;cvar;public;
   gdb_stdtargin : pui_file;cvar;public;
   gdb_stdtargerr : pui_file;cvar;public;
 {$endif}
@@ -2461,7 +2564,12 @@ begin
      last_breakpoint_number:=b.number;
      { function breakpoints have zero as file and as line !!
        but they are valid !! }
+{$ifndef GDB_USES_BP_OPS}
      invalid_breakpoint_line:=(b.line_number<>sym.line) and (b.line_number<>0);
+{$else GDB_USES_BP_OPS}
+     invalid_breakpoint_line:=(b.loc=nil) or
+       ((b.loc^.line_number<>sym.line) and (b.loc^.line_number<>0));
+{$endif GDB_USES_BP_OPS}
 {$ifdef GDB_USES_BP_LOCATION}
      if assigned (b.loc) then
        last_breakpoint_address:=b.loc^.address
@@ -2481,7 +2589,11 @@ end;
 {$ifdef GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
 
 type
+{$ifdef GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
+  breakpoint_created_function_type = procedure (bpp : pbreakpoint); cdecl;
+{$else not GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
   breakpoint_created_function_type = procedure (bpnum : longint); cdecl;
+{$endif not GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
   pobserver = pointer;
 var
   breakpoint_created_observer : pobserver = nil;
@@ -2489,8 +2601,14 @@ var
 function observer_attach_breakpoint_created(create_func : breakpoint_created_function_type) : pobserver;cdecl;external;
 procedure observer_detach_breakpoint_created(pob : pobserver);cdecl;external;
 
-var breakpoint_chain : pbreakpoint ;cvar;external;
 
+{$ifdef GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
+procedure notify_breakpoint_created(bpp : pbreakpoint); cdecl;
+begin
+  CreateBreakpointHook(bpp^);
+end;
+{$else not GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
+var breakpoint_chain : pbreakpoint ;cvar;external;
 
 procedure notify_breakpoint_created(bpnum : longint);cdecl;
 var
@@ -2508,6 +2626,7 @@ begin
         pb:=pb^.next;
     end;
 end;
+{$endif not GDB_NOTIFY_BREAKPOINT_ARG_IS_BREAKPOINT_PTR}
 {$endif def GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
 
 { Avoid loading of main.o object by providing a
@@ -2545,7 +2664,7 @@ begin
   gdb_command('set print object on');
   gdb_command('set print null-stop');
   {$ifdef USE_MINGW_GDB}  // maybe this also should be done for newer cygwin gdbs.
-  gdb_command('set confirm off');
+  //gdb_command('set confirm off');
   {$endif}
 end;
 
@@ -2626,9 +2745,9 @@ end;
 var
    top_level_val : longint;
 
-function catch_errors(func : pointer; command : pchar; from_tty,mask : longint) : longint;cdecl;external;
+function catch_command_errors(func : pointer; command : pchar; from_tty,mask : longint) : longint;cdecl;external;
 
-function gdbint_execute_command(command : pchar; from_tty,mask : longint) : longint;cdecl;
+function gdbint_execute_command(command : pchar; from_tty : longint) : longint;cdecl;
 begin
   gdbint_execute_command:=1;
   execute_command(command,from_tty);
@@ -2675,6 +2794,8 @@ function MaskAllFPUExceptions(control : TFPUState) : TFPUState;
 begin
 {$ifdef cpui386}
   MaskAllFPUExceptions := control or MaskAllExceptions;
+{$else}
+  MaskAllFPUExceptions:=0;
 {$endif}
 end;
 
@@ -2733,7 +2854,8 @@ begin
    begin
      quit_return:=error_return;
      mask:=longint($ffffffff);
-     catch_errors(@gdbint_execute_command,@command,0,mask);
+     catch_command_errors(@gdbint_execute_command,@command,
+       1,mask);
 {$ifdef go32v2}
      reload_fs;
 {$endif go32v2}
@@ -3021,6 +3143,12 @@ var
   current_directory : pchar; cvar; external;
   gdb_dirbuf : array[0..0] of char; cvar; external;
   CurrentDir : AnsiString;
+{$ifdef GDB_NEEDS_INTERPRETER_SETUP}
+  type
+     interpreter_struct_p = pointer; { to opaque type }
+  function interp_lookup (name : pchar) : interpreter_struct_p;cdecl; external;
+  function interp_set (interp : interpreter_struct_p) : longbool;cdecl; external;
+{$endif GDB_NEEDS_INTERPRETER_SETUP}
 const
   DIRBUF_SIZE = 1024;
 
@@ -3029,10 +3157,23 @@ procedure InitLibGDB;
 var
   OldSigInt : SignalHandler;
 {$endif supportexceptions}
+{$ifdef GDB_NEEDS_SET_INSTREAM}
+var
+  dummy_file : pui_file;
+{$endif GDB_NEEDS_SET_INSTREAM}
+
 {$ifdef GDB_INIT_HAS_ARGV0}
 var
   argv0 : pchar;
 {$endif not GDB_INIT_HAS_ARGV0}
+{$ifdef GDB_NEEDS_INTERPRETER_SETUP}
+var
+  interp : interpreter_struct_p;
+{$endif GDB_NEEDS_INTERPRETER_SETUP}
+var
+ save_gdb_stdin,
+ save_gdb_stdout,
+ save_gdb_stderr : pui_file;
 begin
 {$ifdef go32v2}
   { c_environ:=system.envp; }
@@ -3057,8 +3198,25 @@ begin
     ui_file_delete(gdb_stderr);
   if assigned(gdb_stdout) then
     ui_file_delete(gdb_stdout);
+{$ifdef GDB_NEEDS_SET_INSTREAM}
+  if assigned(gdb_stdin) then
+    ui_file_delete(gdb_stdin);
+  gdb_stdin:=mem_fileopen;
+  save_gdb_stdin:=gdb_stdin;
+  dummy_file :=gdb_fopen('dummy.$$$','a');
+  {in captured_main code, this is simply
+   instream:=stdin; but stdin is a highly system dependent macro
+   so that we try to avoid it here }
+  if assigned(dummy_file) then
+    instream:=pstdio_file(dummy_file^.to_data)^._file
+  else
+    instream:=nil;
+{$endif GDB_NEEDS_SET_INSTREAM}
+
   gdb_stderr:=mem_fileopen;
   gdb_stdout:=mem_fileopen;
+  save_gdb_stderr:=gdb_stderr;
+  save_gdb_stdout:=gdb_stdout;
   gdb_stdlog:=gdb_stderr;
   gdb_stdtarg:=gdb_stderr;
   set_ui_file_write(gdb_stdout,@gdbint_ui_file_write);
@@ -3067,7 +3225,9 @@ begin
   error_init;
 {$endif GDB_NEEDS_NO_ERROR_INIT}
 {$ifdef GDB_V6}
-//  gdb_stdtargin := gdb_stdin;
+{$ifdef GDB_NEEDS_SET_INSTREAM}
+  gdb_stdtargin := gdb_stdin;
+{$endif GDB_NEEDS_SET_INSTREAM}
   gdb_stdtargerr := gdb_stderr;
 {$endif}
   GetDir(0, CurrentDir);
@@ -3079,8 +3239,10 @@ begin
   next_exit:=exitproc;
   exitproc:=@DoneLibGDB;
 {$ifdef GDB_V6}
+{$ifndef GDB_NO_UIOUT}
   uiout := cli_out_new (gdb_stdout);
-{$endif}
+{$endif not GDB_NO_UIOUT}
+{$endif GDB_V6}
 {$ifdef GDB_INIT_HAS_ARGV0}
   getmem(argv0,length(paramstr(0))+1);
   strpcopy(argv0,paramstr(0));
@@ -3089,6 +3251,31 @@ begin
 {$else not GDB_INIT_HAS_ARGV0}
   gdb_init;
 {$endif not GDB_INIT_HAS_ARGV0}
+{$ifdef GDB_NEEDS_INTERPRETER_SETUP}
+  { interpreter can only be set after all files are
+    initialized, which is done in gdb_init function. }
+  interp := interp_lookup ('console');
+  interp_set (interp);
+
+  { We need to re-set gdb_stdXX ui_files }
+  if assigned(gdb_stderr) then
+    ui_file_delete(gdb_stderr);
+  if assigned(gdb_stdout) then
+    ui_file_delete(gdb_stdout);
+  if assigned(gdb_stdin) then
+    ui_file_delete(gdb_stdin);
+  gdb_stdin:=save_gdb_stdin;
+  gdb_stderr:=save_gdb_stderr;
+  gdb_stdout:=save_gdb_stdout;
+  gdb_stdlog:=gdb_stderr;
+  gdb_stdtarg:=gdb_stderr;
+  set_ui_file_write(gdb_stdout,@gdbint_ui_file_write);
+  set_ui_file_write(gdb_stderr,@gdbint_ui_file_write);
+{$ifdef GDB_NO_UIOUT}
+  cli_uiout := cli_out_new (gdb_stdout);
+  current_uiout:=cli_uiout;
+{$endif GDB_NO_UIOUT}
+{$endif GDB_NEEDS_INTERPRETER_SETUP}
 {$ifdef supportexceptions}
   {$ifdef unix}
     fpsignal(SIGINT,OldSigInt);
@@ -3114,14 +3301,34 @@ begin
 end;
 
 {$ifdef GDB_HAS_SYSROOT}
-var gdb_sysroot  : pchar; cvar;public;
+  { Here we declare as cvar;public; a bunch of global
+    variables that are defined in main.c source.
+    We must not load main.o otherwise, we will get
+    into multiply defined symbols troubles. }
+var 
+    gdb_sysrootc : char;
+    { used locally only to provide a pchar pointing to '\0' }
+    gdb_sysroot  : pchar; cvar;public; 
+    { gdb_sysroot global variable is declared in defs.h and
+      instanciated in main.c since version 6.0 }
     gdb_datadir  : pchar; cvar;public;
+    { gdb_datadir global variable is declared in defs.h and
+      instanciated in main.c since version 7.0 }
     python_libdir : pchar;cvar;public;
-    gdb_sysrootc : char;
+    { python_libdir global variable is declared in defs.h and instanciated
+      in main.c since version 7.2 }
     return_child_result : longbool;cvar;public;
+    { return_chlid_result global variable is declared in main.h and
+      instanciated in main.c since version 6.4 }
     return_child_result_value : longint;cvar;public;
+    { return_child_result_value global variable is declared in main.h and
+      instanciated in main.c since version 6.4 with a startup value of -1 }
     batch_silent : longbool;cvar;public;
+    { batch_silent global variable is declared in main.h since 7.0, but
+      instanciated in main.c since version 6.4 }
     batch_flag : longbool;cvar;public;
+    { batch_flag global variable is declared in main.h and
+      instanciated in main.c since version 7.2 }
 {$endif}
 {$ifdef GDB_HAS_DEBUG_FILE_DIRECTORY}
 var
@@ -3131,6 +3338,7 @@ var
 begin
 {$ifdef GDB_HAS_SYSROOT}
   gdb_sysrootc := #0;
+  return_child_result_value := -1;
   gdb_sysroot := @gdb_sysrootc;
   gdb_datadir := @gdb_sysrootc;
   python_libdir := @gdb_sysrootc;