This is the mail archive of the
insight@sourceware.org
mailing list for the Insight project.
Re: MinGW patches for Insight
Keith Seitz wrote:
Keith Seitz wrote:
If I check something in quickly, would you be adverse to updating your
patch? Or I could wait until after this is all committed.
I've committed a change which does this. Instead of adding the "[llength
[info commands ...]]" stuff everywhere, you can simply check if
gdbtk_platform(os) is cygwin or mingw. [gdbtk_platform(platform) will
still be "windows".]
I did misunderstand what you meant with cygwin/mingw, that's excellent
Keith, many many thanks.
My updated patchset is attached, just shout if you need anything else
changed.
Dave
2008-02-09 Dave Murphy <davem@devkitpro.org>
* configure.ac: set tcl configdir to win under mingw
* configure: regenerate
gdb/gdbtk/generic/
2008-02-09 Dave Murphy <davem@devkitpro.org>
* gdbtk-cmds.c: guard <sys/ioctl.h> with HAVE_SYS_IOCTL_H
* gdbtk-hooks.c: ditto
* gdbtk.c: ditto
* gdbtk-interp.c: include <windows.h> 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 <davem@devkitpro.org>
* 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 <davem@devkitpro.org>
* 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 <signal.h>
#include <fcntl.h>
+#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
+#endif
#include <sys/time.h>
#include <sys/stat.h>
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 <signal.h>
#include <fcntl.h>
+#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
+#endif
#include <sys/time.h>
#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 <windows.h>
+#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 <fcntl.h>
#include <sys/stat.h>
+#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
+#endif
#include <sys/time.h>
#include <signal.h>
@@ -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 */
+
/*
*----------------------------------------------------------------------