From: Dave Murphy <davem@devkitpro.org>
To: Mike Frysinger <vapier@gentoo.org>
Cc: insight@sourceware.org
Subject: Re: MinGW patches for Insight
Date: Fri, 08 Feb 2008 23:17:00 -0000 [thread overview]
Message-ID: <47ACE302.9030404@devkitpro.org> (raw)
In-Reply-To: <200802081304.01150.vapier@gentoo.org>
[-- Attachment #1: Type: text/plain, Size: 568 bytes --]
Mike Frysinger wrote:
> On Friday 08 February 2008, Dave Murphy wrote:
>
>> I'm still not sure how best to format the changelog entries. Should I be
>> sending a patchset for each directory where changes are made?
>>
>
> you do it based upon the ChangeLog files that already exist. look at the file
> you change, and then walk up directories until you hit the first ChangeLog
> file.
>
Thanks for the advice Mike, much appreciated.
Updated patch with suggested changes attached. I've submitted the ppc
sim patch to the gdb patches list instead.
Dave
[-- Attachment #2: insight-mingw.patch --]
[-- Type: text/plain, Size: 16085 bytes --]
2008-02-07 Dave Murphy <davem@devkitpro.org>
* configure.ac :set tcl configdir to win under mingw
* configure : regenerate
gdb/gdbtk/generic/
2008-02-07 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-07 Dave Murphy <davem@devkitpro.org>
* download.itb (Download::download_it) : check ide_cygwin_path exists
before using on windows
* interface.tcl (_open_file) : ditto
* prefs.tcl : (pref_read) : ditto
* session.tcl : ( _exe_name) : ditto
* srctextwin.itb :
(SrcTextWin::_mtime_changed, SrcTextWin::LoadFromCache) : 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-07 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.11
diff -u -r1.11 download.itb
--- gdb/gdbtk/library/download.itb 23 Dec 2005 18:26:50 -0000 1.11
+++ gdb/gdbtk/library/download.itb 6 Feb 2008 04:30:59 -0000
@@ -207,7 +207,7 @@
}
}
- if {[string compare $tcl_platform(platform) "windows"] == 0} {
+ if {[string compare $tcl_platform(platform) "windows"] == 0 && [llength [info commands ide_cygwin_path]]} {
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.57
diff -u -r1.57 interface.tcl
--- gdb/gdbtk/library/interface.tcl 23 Dec 2005 18:26:50 -0000 1.57
+++ gdb/gdbtk/library/interface.tcl 6 Feb 2008 04:32:56 -0000
@@ -962,7 +962,7 @@
}
# Add the base dir for this file to the source search path.
set root [file dirname $file]
- if {$tcl_platform(platform) == "windows"} {
+ if {$tcl_platform(platform) == "windows" && [llength [info commands ide_cygwin_path]]} {
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.34
diff -u -r1.34 prefs.tcl
--- gdb/gdbtk/library/prefs.tcl 19 Sep 2006 18:39:38 -0000 1.34
+++ gdb/gdbtk/library/prefs.tcl 6 Feb 2008 04:33:48 -0000
@@ -35,7 +35,7 @@
global tcl_platform
if {[info exists env(HOME)]} {
- if {$tcl_platform(platform) == "windows"} {
+ if {$tcl_platform(platform) == "windows" && [llength [info commands ide_cygwin_path]]} {
set home [ide_cygwin_path to_win32 $env(HOME)]
} else {
set home $env(HOME)
Index: gdb/gdbtk/library/session.tcl
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/library/session.tcl,v
retrieving revision 1.16
diff -u -r1.16 session.tcl
--- gdb/gdbtk/library/session.tcl 23 Dec 2005 18:26:50 -0000 1.16
+++ gdb/gdbtk/library/session.tcl 7 Feb 2008 01:59:00 -0000
@@ -21,7 +21,7 @@
global tcl_platform
# Get real directory.
- if {[string compare $tcl_platform(platform) "windows"] == 0} {
+ if {[string compare $tcl_platform(platform) "windows"] == 0 && [llength [info commands ide_cygwin_path]]} {
set path [ide_cygwin_path to_win32 $path]
}
set save [pwd]
Index: gdb/gdbtk/library/srctextwin.itb
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/library/srctextwin.itb,v
retrieving revision 1.42
diff -u -r1.42 srctextwin.itb
--- gdb/gdbtk/library/srctextwin.itb 23 Dec 2005 18:26:50 -0000 1.42
+++ gdb/gdbtk/library/srctextwin.itb 7 Feb 2008 02:04:47 -0000
@@ -891,7 +891,7 @@
} elseif {$f == ""} {
set r 1
} else {
- if {[string compare $tcl_platform(platform) "windows"] == 0} {
+ if {[string compare $tcl_platform(platform) "windows"] == 0 && [llength [info commands ide_cygwin_path]]} {
set f [ide_cygwin_path to_win32 $f]
}
if {[catch {file mtime $f} mtime]} {
@@ -2715,7 +2715,7 @@
# out.
if {$loadingSource} {
- if {[string compare $tcl_platform(platform) "windows"] == 0} {
+ if {[string compare $tcl_platform(platform) "windows"] == 0 && [llength [info commands ide_cygwin_path]]} {
set f [ide_cygwin_path to_win32 $name]
} else {
set f $name
Index: gdb/gdbtk/library/targetselection.itb
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/library/targetselection.itb,v
retrieving revision 1.20
diff -u -r1.20 targetselection.itb
--- gdb/gdbtk/library/targetselection.itb 1 Dec 2006 01:07:55 -0000 1.20
+++ gdb/gdbtk/library/targetselection.itb 7 Feb 2008 00:17:37 -0000
@@ -280,7 +280,13 @@
itcl::body TargetSelection::default_port {} {
global tcl_platform
switch -regexp $tcl_platform(os) {
- Windows { set port com1 }
+ Windows {
+ if { [llength [info commands ide_cygwin_path]] } {
+ set port "/dev/com1"
+ } else {
+ set port "COM1"
+ }
+ }
Linux { set port /dev/ttyS0 }
SunOS { set port /dev/ttya }
AIX { set port /dev/foo1 }
@@ -873,6 +879,11 @@
# METHOD: port_list - return a list of valid ports for Windows
# ------------------------------------------------------------------
itcl::body TargetSelection::port_list {} {
+ if { [llength [info commands ide_cygwin_path]] } {
+ 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 +896,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 +904,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 */
+
\f
/*
*----------------------------------------------------------------------
next prev parent reply other threads:[~2008-02-08 23:17 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-07 8:35 Dave Murphy
2008-02-08 17:24 ` Dave Murphy
2008-02-08 18:05 ` Mike Frysinger
2008-02-08 23:17 ` Dave Murphy [this message]
2008-02-08 23:34 ` Mike Frysinger
2008-02-09 0:03 ` Keith Seitz
2008-02-09 1:24 ` Keith Seitz
2008-02-09 1:55 ` Dave Murphy
2008-02-09 2:32 ` Dave Murphy
2008-03-03 23:28 ` Keith Seitz
2008-03-12 12:31 ` Dave Murphy
2008-02-09 1:51 ` Dave Murphy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47ACE302.9030404@devkitpro.org \
--to=davem@devkitpro.org \
--cc=insight@sourceware.org \
--cc=vapier@gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).