summaryrefslogtreecommitdiff
path: root/community/fpc/fpc-gdb.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/fpc/fpc-gdb.patch')
-rw-r--r--community/fpc/fpc-gdb.patch737
1 files changed, 737 insertions, 0 deletions
diff --git a/community/fpc/fpc-gdb.patch b/community/fpc/fpc-gdb.patch
new file mode 100644
index 000000000..f46b556bb
--- /dev/null
+++ b/community/fpc/fpc-gdb.patch
@@ -0,0 +1,737 @@
+diff -wbBur fpcbuild-2.6.0/fpcsrc/ide/fp.pas fpcbuild-2.6.0.my/fpcsrc/ide/fp.pas
+--- fpcbuild-2.6.0/fpcsrc/ide/fp.pas 2010-08-20 15:04:44.000000000 +0400
++++ fpcbuild-2.6.0.my/fpcsrc/ide/fp.pas 2013-01-14 20:55:58.472376421 +0400
+@@ -14,6 +14,9 @@
+ **********************************************************************}
+ program FP;
+
++{$LINKLIB libz.so}
++
++
+ {$ifdef Windows}
+ { some windows versions, namely at least XP x64 don't like if the IDE stack
+ is too big }
+diff -wbBur fpcbuild-2.6.0/fpcsrc/packages/gdbint/Makefile fpcbuild-2.6.0.my/fpcsrc/packages/gdbint/Makefile
+--- fpcbuild-2.6.0/fpcsrc/packages/gdbint/Makefile 2011-12-11 00:19:00.000000000 +0400
++++ fpcbuild-2.6.0.my/fpcsrc/packages/gdbint/Makefile 2013-01-14 20:32:15.545303270 +0400
+@@ -2337,10 +2337,12 @@
+ endif
+ ifeq ($(OS_SOURCE),openbsd)
+ override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
++override FPCMAKEOPT+=-FD$(NEW_BINUTILS_PATH)
+ endif
+ ifndef CROSSBOOTSTRAP
+ ifneq ($(BINUTILSPREFIX),)
+ override FPCOPT+=-XP$(BINUTILSPREFIX)
++override FPCMAKEOPT+=-XP$(BINUTILSPREFIX)
+ endif
+ ifneq ($(BINUTILSPREFIX),)
+ override FPCOPT+=-Xr$(RLINKPATH)
+diff -wbBur fpcbuild-2.6.0/fpcsrc/packages/gdbint/src/gdbint.pp fpcbuild-2.6.0.my/fpcsrc/packages/gdbint/src/gdbint.pp
+--- fpcbuild-2.6.0/fpcsrc/packages/gdbint/src/gdbint.pp 2011-12-10 20:50:23.000000000 +0400
++++ fpcbuild-2.6.0.my/fpcsrc/packages/gdbint/src/gdbint.pp 2013-01-14 20:53:27.332331458 +0400
+@@ -17,6 +17,7 @@
+
+ {$define NotImplemented}
+
++{$define GDB_DISABLE_PYTHON}
+ {$define COMPILING_GDBINT_UNIT}
+ {$ifdef USE_GDBLIBINC}
+ {$i gdblib.inc}
+@@ -50,7 +51,6 @@
+ {$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 +58,12 @@
+ {$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 +71,6 @@
+ {$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 +84,6 @@
+ {$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 +94,6 @@
+ {$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 +104,6 @@
+ {$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 +114,64 @@
+ {$define GDB_HAS_BP_NONE}
+ {$endif def GDB_V608}
+
++{ 7.5.x }
++{$ifdef GDB_V705}
++ {$info using gdb 7.5.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}
++ {$ifdef win32}
++ {$define GDB_USES_LIBADVAPI32}
++ {$endif win32}
++{$endif def GDB_V705}
++
++{ 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}
++ {$ifdef win32}
++ {$define GDB_USES_LIBADVAPI32}
++ {$endif win32}
++{$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 +493,11 @@
+ {$LINKLIB libintl.a}
+ {$LINKLIB imagehlp}
+ {$endif not USE_MINGW_GDB}
+- {$LINKLIB kernel32}
++ {$ifdef GDB_USES_LIBADVAPI32}
++ {$LINKLIB advapi32}
++ {$endif GDB_USES_LIBADVAPI32}
+ {$LINKLIB user32}
++ {$LINKLIB kernel32}
+ {$endif win32}
+
+ {$ifdef win64}
+@@ -588,9 +636,11 @@
+ 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 +655,9 @@
+ 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 +669,13 @@
+ 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 +834,16 @@
+ {$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
+@@ -815,8 +881,11 @@
+ jmp_buf = dpmi_jmp_buf;
+ pjmp_buf = pdpmi_jmp_buf;
+
++
+ function setjmp(var rec : jmp_buf) : longint;cdecl;external;
+
++ function malloc(size : longint) : pointer;cdecl;external;
++
+ procedure longjmp(var rec : jmp_buf;return_value : longint);cdecl;external;
+
+ procedure reload_fs;assembler;
+@@ -869,6 +938,13 @@
+ 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,
+@@ -897,9 +973,18 @@
+
+ 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;
+@@ -910,9 +995,15 @@
+ {$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;
+@@ -919,10 +1010,21 @@
+ 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;
+@@ -941,6 +1043,9 @@
+ 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;
+@@ -948,9 +1053,17 @@
+
+ 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}
+@@ -961,10 +1074,10 @@
+ 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}
+@@ -979,6 +1092,11 @@
+ 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);
+@@ -1488,7 +1606,9 @@
+ {$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 }
+@@ -1502,13 +1622,22 @@
+
+ { 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;
+@@ -1516,6 +1645,9 @@
+ 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}
+@@ -1523,7 +1655,10 @@
+ { used for gdb_stdout and gdb_stderr }
+ function xmalloc(size : longint) : pointer;cdecl;external;
+ { used for QueryHook }
+-function xstrvprintf(msg : pchar) : pchar; varargs; cdecl; external;
++{ xvasprintf is present at least from GDB 5.3
++ while xstrvprintf only appears in version 6.2,
++ so only use xvasprintf function }
++function xvasprintf(ret : ppchar; msg : pchar) : pchar; varargs; 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_function(i:CORE_ADDR):psymbol;cdecl;external;
+@@ -2406,11 +2541,15 @@
+ QueryHook:=0
+ else
+ begin
+- if curr_gdb^.reset_command and (pos('Kill',question)>0) then
++ if curr_gdb^.reset_command and ((pos('Kill',question)>0) or
++ (pos('Discard symbol table',question)>0)) then
+ QueryHook:=1
+ else if pos('%',question)>0 then
+ begin
+- local:=xstrvprintf(question,arg);
++ xvasprintf(@local,question,arg);
++ { xvasprintf can failed, in that case local is set to nil }
++ if not assigned(local) then
++ local:=question;
+ QueryHook:=curr_gdb^.Query(local, nil);
+ xfree(local);
+ end
+@@ -2451,7 +2590,12 @@
+ 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
+@@ -2471,7 +2615,11 @@
+ {$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;
+@@ -2479,8 +2627,14 @@
+ 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
+@@ -2498,8 +2652,16 @@
+ 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
++ stripped down version of relocate_gdb_directory function }
++function relocate_gdb_directory(path : pchar) : pchar; cdecl; public;
++begin
++ relocate_gdb_directory:=path;
++end;
++
+ {*****************************************************************************
+ tgdbinterface
+ *****************************************************************************}
+@@ -2528,7 +2690,7 @@
+ 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;
+
+@@ -2609,9 +2771,9 @@
+ 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);
+@@ -2658,6 +2820,8 @@
+ begin
+ {$ifdef cpui386}
+ MaskAllFPUExceptions := control or MaskAllExceptions;
++{$else}
++ MaskAllFPUExceptions:=0;
+ {$endif}
+ end;
+
+@@ -2716,7 +2880,8 @@
+ 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}
+@@ -2973,11 +3138,43 @@
+ c_environ : ppchar;external name '_environ';
+ c_argc : longint;external name '___crt0_argc';
+ c_argv : ppchar;external name '___crt0_argv';
++
++ procedure ReallocateEnvironUsingCMalloc;
++
++ var
++ neededsize , count : longint;
++ penv : pchar;
++ newenv : ppchar;
++ begin
++ if not assigned(c_environ) then
++ neededsize:=0
++ else
++ begin
++ count:=0;
++ penv:=c_environ^;
++ while assigned(penv) do
++ begin
++ inc(count);
++ inc(penv,sizeof(pchar));
++ end;
++ neededsize:=count*sizeof(pchar);
++ end;
++ newenv:=malloc(neededsize);
++ system.move(c_environ,newenv,neededsize);
++ c_environ:=newenv;
++ end;
++
+ {$endif def go32v2}
+ 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;
+
+@@ -2986,13 +3183,28 @@
+ 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;
++ { c_environ:=system.envp; }
++ { DJGPP libC presupposes the c_enivron was malloc'ated }
++ ReallocateEnvironUsingCMalloc;
+ c_argc:=system.argc;
+ c_argv:=system.argv;
+ {$endif def go32v2}
+@@ -3012,8 +3224,25 @@
+ 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);
+@@ -3022,7 +3251,9 @@
+ 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);
+@@ -3034,8 +3265,10 @@
+ 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));
+@@ -3044,6 +3277,31 @@
+ {$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);
+@@ -3069,14 +3327,34 @@
+ 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
+@@ -3086,6 +3364,7 @@
+ 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;