2008-02-09 Dave Murphy * configure.ac: set tcl configdir to win under mingw * configure: regenerate gdb/gdbtk/generic/ 2008-02-09 Dave Murphy * gdbtk-cmds.c: guard with HAVE_SYS_IOCTL_H * gdbtk-hooks.c: ditto * gdbtk.c: ditto * gdbtk-interp.c: include under mingw32 (gdbtk_start_timer, gdbtk_stop_timer): remove timer calls under mingw (gdbtk_init): include windows specific commands under mingw without cygwin path commands gdb/gdbtk/library/ 2008-02-09 Dave Murphy * download.itb (Download::download_it): only use ide_cygwin_path to_win32 on cygwin * interface.tcl (_open_file): ditto * prefs.tcl (pref_read): ditto * targetselection.itb (TargetSelection::default_port): default to /dev/com1 under cygwin, COM1 under mingw (TargetSelection::port_list): use /dev/com under cygwin, COM under mingw tcl/win 2008-02-09 Dave Murphy * tclWin32Dll.c (TclpCheckStackSpace) : backport EXCEPTION_REGISTRATION code from TCL mainline Index: gdb/configure.ac =================================================================== RCS file: /cvs/src/src/gdb/configure.ac,v retrieving revision 1.64 diff -u -r1.64 configure.ac --- gdb/configure.ac 13 Jan 2008 12:23:05 -0000 1.64 +++ gdb/configure.ac 8 Feb 2008 20:41:52 -0000 @@ -1445,7 +1445,7 @@ AC_SUBST(WIN32LDAPP) case "${host}" in -*-*-cygwin*) +*-*-cygwin* | *-*-mingw* ) configdir="win" ;; *) Index: gdb/gdbtk/generic/gdbtk-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v retrieving revision 1.97 diff -u -r1.97 gdbtk-cmds.c --- gdb/gdbtk/generic/gdbtk-cmds.c 21 Jun 2007 15:18:51 -0000 1.97 +++ gdb/gdbtk/generic/gdbtk-cmds.c 7 Feb 2008 03:43:06 -0000 @@ -57,7 +57,9 @@ #include #include +#ifdef HAVE_SYS_IOCTL_H #include +#endif #include #include Index: gdb/gdbtk/generic/gdbtk-hooks.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-hooks.c,v retrieving revision 1.41 diff -u -r1.41 gdbtk-hooks.c --- gdb/gdbtk/generic/gdbtk-hooks.c 23 Dec 2005 18:23:16 -0000 1.41 +++ gdb/gdbtk/generic/gdbtk-hooks.c 7 Feb 2008 03:43:19 -0000 @@ -51,7 +51,9 @@ #include #include +#ifdef HAVE_SYS_IOCTL_H #include +#endif #include #include "gdb_string.h" Index: gdb/gdbtk/generic/gdbtk-interp.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-interp.c,v retrieving revision 1.8 diff -u -r1.8 gdbtk-interp.c --- gdb/gdbtk/generic/gdbtk-interp.c 23 Dec 2005 18:23:16 -0000 1.8 +++ gdb/gdbtk/generic/gdbtk-interp.c 8 Feb 2008 20:46:44 -0000 @@ -34,6 +34,12 @@ #include "tk.h" #include "gdbtk.h" +#ifdef __MINGW32__ +# define WIN32_LEAN_AND_MEAN +# include +#endif + + static void gdbtk_command_loop (void); static void hack_disable_interpreter_exec (char *, int); Index: gdb/gdbtk/generic/gdbtk.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk.c,v retrieving revision 1.45 diff -u -r1.45 gdbtk.c --- gdb/gdbtk/generic/gdbtk.c 1 Dec 2006 02:09:24 -0000 1.45 +++ gdb/gdbtk/generic/gdbtk.c 7 Feb 2008 06:23:48 -0000 @@ -49,7 +49,9 @@ #include #include +#ifdef HAVE_SYS_IOCTL_H #include +#endif #include #include @@ -63,6 +65,7 @@ extern void _initialize_gdbtk (void); +#ifndef __MINGW32__ /* For unix natives, we use a timer to periodically keep the gui alive. See comments before x_event. */ static sigset_t nullsigmask; @@ -74,6 +77,7 @@ { x_event (signo); } +#endif /* * This variable controls the interaction with an external editor. @@ -262,6 +266,7 @@ { /* first time called, set up all the structs */ first = 0; +#ifndef __MINGW32__ sigemptyset (&nullsigmask); act1.sa_handler = x_event_wrapper; @@ -281,14 +286,17 @@ it_off.it_interval.tv_usec = 0; it_off.it_value.tv_sec = 0; it_off.it_value.tv_usec = 0; +#endif } if (target_should_use_timer (¤t_target)) { if (!gdbtk_timer_going) { +#ifndef __MINGW32__ sigaction (SIGALRM, &act1, NULL); setitimer (ITIMER_REAL, &it_on, NULL); +#endif gdbtk_timer_going = 1; } } @@ -302,8 +310,10 @@ if (gdbtk_timer_going) { gdbtk_timer_going = 0; +#ifndef __MINGW32__ setitimer (ITIMER_REAL, &it_off, NULL); sigaction (SIGALRM, &act2, NULL); +#endif } return; } @@ -510,7 +520,7 @@ * These are the commands to do some Windows Specific stuff... */ -#ifdef __CYGWIN32__ +#ifdef __WIN32__ if (ide_create_messagebox_command (gdbtk_interp) != TCL_OK) error ("messagebox command initialization failed"); /* On Windows, create a sizebox widget command */ @@ -522,6 +532,8 @@ error ("windows print code initialization failed"); if (ide_create_win_grab_command (gdbtk_interp) != TCL_OK) error ("grab support command initialization failed"); +#endif +#ifdef __CYGWIN32__ /* Path conversion functions. */ if (ide_create_cygwin_path_command (gdbtk_interp) != TCL_OK) error ("cygwin path command initialization failed"); Index: gdb/gdbtk/library/download.itb =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/library/download.itb,v retrieving revision 1.12 diff -u -r1.12 download.itb --- gdb/gdbtk/library/download.itb 9 Feb 2008 01:23:42 -0000 1.12 +++ gdb/gdbtk/library/download.itb 9 Feb 2008 02:05:33 -0000 @@ -206,7 +206,7 @@ } } - if {[string compare $gdbtk_platform(platform) "windows"] == 0} { + if {[string compare $gdbtk_platform(os) "cygwin"] == 0} { set f [ide_cygwin_path to_win32 $gdb_exe_name] } else { set f $gdb_exe_name Index: gdb/gdbtk/library/interface.tcl =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/library/interface.tcl,v retrieving revision 1.58 diff -u -r1.58 interface.tcl --- gdb/gdbtk/library/interface.tcl 9 Feb 2008 01:23:42 -0000 1.58 +++ gdb/gdbtk/library/interface.tcl 9 Feb 2008 02:05:55 -0000 @@ -962,7 +962,7 @@ } # Add the base dir for this file to the source search path. set root [file dirname $file] - if {$gdbtk_platform(platform) == "windows"} { + if {$gdbtk_platform(os) == "cygwin"} { set root [ide_cygwin_path to_posix $root] set file [ide_cygwin_path to_posix $file] } Index: gdb/gdbtk/library/prefs.tcl =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/library/prefs.tcl,v retrieving revision 1.35 diff -u -r1.35 prefs.tcl --- gdb/gdbtk/library/prefs.tcl 9 Feb 2008 01:23:42 -0000 1.35 +++ gdb/gdbtk/library/prefs.tcl 9 Feb 2008 02:06:28 -0000 @@ -35,7 +35,7 @@ global gdbtk_platform if {[info exists env(HOME)]} { - if {$gdbtk_platform(platform) == "windows"} { + if {$gdbtk_platform(os) == "cygwin"} { set home [ide_cygwin_path to_win32 $env(HOME)] } else { set home $env(HOME) Index: gdb/gdbtk/library/targetselection.itb =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/library/targetselection.itb,v retrieving revision 1.21 diff -u -r1.21 targetselection.itb --- gdb/gdbtk/library/targetselection.itb 9 Feb 2008 01:23:43 -0000 1.21 +++ gdb/gdbtk/library/targetselection.itb 9 Feb 2008 02:09:53 -0000 @@ -280,7 +280,8 @@ itcl::body TargetSelection::default_port {} { global gdbtk_platform switch -regexp $gdbtk_platform(os) { - cygwin { set port com1 } + cygwin { set port /dev/com1 } + mingw { set port COM1 } Linux { set port /dev/ttyS0 } SunOS { set port /dev/ttya } AIX { set port /dev/foo1 } @@ -873,6 +874,12 @@ # METHOD: port_list - return a list of valid ports for Windows # ------------------------------------------------------------------ itcl::body TargetSelection::port_list {} { + global gdbtk_platform + if {[string compare $gdbtk_platform(os) "cygwin"] == 0} { + set device "/dev/com" + } else { + set device "COM" + } set plist "" # Scan com1 - com8 trying to open each one. # If permission is denied that means it is in use, @@ -885,7 +892,7 @@ # Failed. Find out why. if {[string first "permission denied" $msg] != -1} { # Port is there, but busy right now. That's OK. - lappend plist /dev/com$i + lappend plist $device$i } elseif {$i > 4} { # if we've scanned the first 4 ports, then quit when we find no more set quit 1 @@ -893,7 +900,7 @@ } else { # We got it. Now close it and add to list. close $fd - lappend plist /dev/com$i + lappend plist $device$i } } return $plist Index: tcl/win/tclWin32Dll.c =================================================================== RCS file: /cvs/src/src/tcl/win/tclWin32Dll.c,v retrieving revision 1.11 diff -u -r1.11 tclWin32Dll.c --- tcl/win/tclWin32Dll.c 1 Dec 2006 20:35:55 -0000 1.11 +++ tcl/win/tclWin32Dll.c 7 Feb 2008 05:54:10 -0000 @@ -41,9 +41,21 @@ static int platformId; /* Running under NT, or 95/98? */ #ifdef HAVE_NO_SEH -static void *ESP; -static void *EBP; -#endif /* HAVE_NO_SEH */ +/* + * Unlike Borland and Microsoft, we don't register exception handlers by + * pushing registration records onto the runtime stack. Instead, we register + * them by creating an EXCEPTION_REGISTRATION within the activation record. + */ + +typedef struct EXCEPTION_REGISTRATION { + struct EXCEPTION_REGISTRATION *link; + EXCEPTION_DISPOSITION (*handler)( + struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*); + void *ebp; + void *esp; + int status; +} EXCEPTION_REGISTRATION; +#endif /* * The following function tables are used to dispatch to either the @@ -358,65 +370,102 @@ int TclpCheckStackSpace() { + +#ifdef HAVE_NO_SEH + EXCEPTION_REGISTRATION registration; +#endif int retval = 0; /* - * We can recurse only if there is at least TCL_WIN_STACK_THRESHOLD - * bytes of stack space left. alloca() is cheap on windows; basically - * it just subtracts from the stack pointer causing the OS to throw an - * exception if the stack pointer is set below the bottom of the stack. + * We can recurse only if there is at least TCL_WIN_STACK_THRESHOLD bytes + * of stack space left. alloca() is cheap on windows; basically it just + * subtracts from the stack pointer causing the OS to throw an exception + * if the stack pointer is set below the bottom of the stack. */ #ifdef HAVE_NO_SEH __asm__ __volatile__ ( - "movl %esp, _ESP" "\n\t" - "movl %ebp, _EBP"); - __asm__ __volatile__ ( - "pushl $__except_checkstackspace_handler" "\n\t" - "pushl %fs:0" "\n\t" - "mov %esp, %fs:0"); -#else + /* + * Construct an EXCEPTION_REGISTRATION to protect the call to __alloca + */ + + "leal %[registration], %%edx" "\n\t" + "movl %%fs:0, %%eax" "\n\t" + "movl %%eax, 0x0(%%edx)" "\n\t" /* link */ + "leal 1f, %%eax" "\n\t" + "movl %%eax, 0x4(%%edx)" "\n\t" /* handler */ + "movl %%ebp, 0x8(%%edx)" "\n\t" /* ebp */ + "movl %%esp, 0xc(%%edx)" "\n\t" /* esp */ + "movl %[error], 0x10(%%edx)" "\n\t" /* status */ + + /* + * Link the EXCEPTION_REGISTRATION on the chain + */ + + "movl %%edx, %%fs:0" "\n\t" + + /* + * Attempt a call to __alloca, to determine whether there's sufficient + * memory to be had. + */ + + "movl %[size], %%eax" "\n\t" + "pushl %%eax" "\n\t" + "call __alloca" "\n\t" + + /* + * Come here on a normal exit. Recover the EXCEPTION_REGISTRATION and + * store a TCL_OK status + */ + + "movl %%fs:0, %%edx" "\n\t" + "movl %[ok], %%eax" "\n\t" + "movl %%eax, 0x10(%%edx)" "\n\t" + "jmp 2f" "\n" + + /* + * Come here on an exception. Get the EXCEPTION_REGISTRATION that we + * previously put on the chain. + */ + + "1:" "\t" + "movl %%fs:0, %%edx" "\n\t" + "movl 0x8(%%edx), %%edx" "\n\t" + + /* + * Come here however we exited. Restore context from the + * EXCEPTION_REGISTRATION in case the stack is unbalanced. + */ + + "2:" "\t" + "movl 0xc(%%edx), %%esp" "\n\t" + "movl 0x8(%%edx), %%ebp" "\n\t" + "movl 0x0(%%edx), %%eax" "\n\t" + "movl %%eax, %%fs:0" "\n\t" + + : + /* No outputs */ + : + [registration] "m" (registration), + [ok] "i" (TCL_OK), + [error] "i" (TCL_ERROR), + [size] "i" (TCL_WIN_STACK_THRESHOLD) + : + "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory" + ); + retval = (registration.status == TCL_OK); + +#else /* !HAVE_NO_SEH */ __try { -#endif /* HAVE_NO_SEH */ alloca(TCL_WIN_STACK_THRESHOLD); retval = 1; -#ifdef HAVE_NO_SEH - __asm__ __volatile__ ( - "jmp checkstackspace_pop" "\n" - "checkstackspace_reentry:" "\n\t" - "movl _ESP, %esp" "\n\t" - "movl _EBP, %ebp"); - - __asm__ __volatile__ ( - "checkstackspace_pop:" "\n\t" - "mov (%esp), %eax" "\n\t" - "mov %eax, %fs:0" "\n\t" - "add $8, %esp"); -#else } __except (EXCEPTION_EXECUTE_HANDLER) {} #endif /* HAVE_NO_SEH */ - /* - * Avoid using control flow statements in the SEH guarded block! - */ return retval; } -#ifdef HAVE_NO_SEH -static -__attribute__ ((cdecl,used)) -EXCEPTION_DISPOSITION -_except_checkstackspace_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void *EstablisherFrame, - struct _CONTEXT *ContextRecord, - void *DispatcherContext) -{ - __asm__ __volatile__ ( - "jmp checkstackspace_reentry"); - return 0; /* Function does not return */ -} -#endif /* HAVE_NO_SEH */ + /* *----------------------------------------------------------------------