Re: Using GS for TLS on x86-64 for target RDOS

2013-05-15 Thread Leif Ekblad

I made the suggested changes, and enclose a new patch.

Change log:
* gcc/config/i386/i386.c: Use DEFAULT_TLS_SEG_REG to access TLS
* gcc/config/i386/i386.h: Define default segment register for TLS
* gcc/config/i386/rdos.h: Added TLS configuration for RDOS

It's been tested with target RDOS, but not with target Linux.

Uros, could you commit the patch if it is acceptable?

Regards,
Leif Ekblad


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: Michael Matz m...@suse.de; gcc-patches@gcc.gnu.org
Sent: Tuesday, May 14, 2013 8:19 PM
Subject: Re: Using GS for TLS on x86-64 for target RDOS



On Tue, May 14, 2013 at 6:45 PM, Leif Ekblad l...@rdos.net wrote:

I've made a patch along these lines  (enclosed).

Change log:
* gcc/config/i386/i386.c: Use DEFAULT_TLS_SEG_REG to access TLS
* gcc/config/i386/i386.h: Define default segment register for TLS
* gcc/config/i386/rdos.h: Added TLS configuration for RDOS


*** gcc-4.9-20130512/gcc/config/i386/i386.h2013-04-29
13:00:10.0 +0200
--- gcc-work/gcc/config/i386/i386.h2013-05-14 13:36:19.041020400 +0200

+ /* The default TLS segment register used by target.  */
+ #define DEFAULT_TLS_SEG_REG TARGET_64BIT ? SEG_FS : SEG_GS

Precedence is a bit tricky with ? ternary operand. Please put the
expression in braces...

*** gcc-4.9-20130512/gcc/config/i386/i386.c2013-05-06
16:53:03.0 +0200
--- gcc-work/gcc/config/i386/i386.c2013-05-14 13:37:14.338020400 +0200

!   || addr.seg != (DEFAULT_TLS_SEG_REG)

... and remove them there.

*** gcc-4.9-20130512/gcc/config/i386/rdos.h2013-01-28
21:42:55.0 +0100
--- gcc-work/gcc/config/i386/rdos.h2013-05-14 13:36:17.940020400 +0200

+ #undef TARGET_TLS_DIRECT_SEG_REFS
+ #define TARGET_TLS_DIRECT_SEG_REFS 1

TARGET_TLS_DIRECT_SEG_REFS_DEFAULT

! #define TARGET_OS_CPP_BUILTINS()\
!   do\
! {   \
!   builtin_define (__RDOS__);  \
!   builtin_assert (system=rdos);   \
! }   \

This looks like unwanted change to me.

The patch is OK for mainline with above changes, if tested on 
x86_64-linux-gnu.


Thanks,
Uros. 


gcc.diff
Description: Binary data


Re: Using GS for TLS on x86-64 for target RDOS

2013-05-14 Thread Leif Ekblad

I've made a patch along these lines  (enclosed).

Change log:
* gcc/config/i386/i386.c: Use DEFAULT_TLS_SEG_REG to access TLS
* gcc/config/i386/i386.h: Define default segment register for TLS
* gcc/config/i386/rdos.h: Added TLS configuration for RDOS

Regards,
Leif Ekblad


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: Michael Matz m...@suse.de
Cc: gcc-patches@gcc.gnu.org; Leif Ekblad l...@rdos.net
Sent: Tuesday, May 14, 2013 11:35 AM
Subject: Re: Using GS for TLS on x86-64 for target RDOS



On Tue, May 14, 2013 at 11:13 AM, Michael Matz m...@suse.de wrote:


On Tue, 14 May 2013, Uros Bizjak wrote:


I'd propose to introduce:

a) #define DEFAULT_TLS_SEG_REG in i386.h to SEG_GS

b) #undef and #define DEFAULT_TLS_SEG_REG in x86-64.h to SEG_FS


This would break -m32.


Uh, yes.

So instead of a) and b), there should be:

#define DEFAULT_TLS_SEG_REG TARGET_64BIT ? SEG_FS : SEG_GS in i386.h.

Uros.

gcc-tls.diff
Description: Binary data


Using GS for TLS on x86-64 for target RDOS

2013-05-13 Thread Leif Ekblad
I would need a way to use GS segment register instead of FS for x86-64 for 
target RDOS since RDOS cannot use FS for TLS. It seems like the code related 
to this is concentrated to two different places:


The gcc/config/i386/i386.c:
11677:seg = TARGET_64BIT ? SEG_FS : SEG_GS;
13526:  if (ix86_decompose_address (x, addr) == 0
 || addr.seg != (TARGET_64BIT ? SEG_FS : SEG_GS)
 || addr.disp == NULL_RTX
 || GET_CODE (addr.disp) != CONST)

Especially the second reference would become hard-to-read if more 
conditionals are added to it.


Perhaps the code could be changed to something like this:

#ifdef TARGET_RDOS
#define GET_TLS_SEG_REG  SEG_GS
#else
#define GET_TLS_SEG_REG TARGET_64BIT ? SEG_FS : SEG_GS
#endif

Then the above could be patched to:
11677:seg = GET_TLS_SEG_REG;
13526:  if (ix86_decompose_address (x, addr) == 0
 || addr.seg != (GET_TLS_SEG_REG)
 || addr.disp == NULL_RTX
 || GET_CODE (addr.disp) != CONST)

Thoughts?

Regards,
Leif Ekblad



Re: [PATCH] Adding target rdos to GCC

2013-01-28 Thread Leif Ekblad

Uros,

That is intentional. The gthr-rdos.h file is part of libgcc. My intention 
was to first patch gcc, then update the patches for newlib, and finally 
libgcc. The gthr-rdos.h file would reference include-files part of newlib, 
so this is kind of circular. I also cannot define the thread model for RDOS 
unless I define this file.


I see a couple of possible solutions:
1. Keep as is. You cannot build libgcc at the current stage anyway, and the 
bootstrap must be built without threading

2. Add an empty gthr-rdos.h file until libgcc is done
3. Remove the threading-model for now, and add it with libgcc instead.

Regards,
Leif Ekblad



- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: Richard Biener rguent...@suse.de; gcc-patches@gcc.gnu.org; H.J. 
Lu hjl.to...@gmail.com; Jakub Jelinek ja...@redhat.com

Sent: Monday, January 28, 2013 8:23 AM
Subject: Re: [PATCH] Adding target rdos to GCC



On Mon, Jan 28, 2013 at 7:50 AM, Leif Ekblad l...@rdos.net wrote:


If the patch is ok, could some maintainer add it to trunk?


There is no gthr-rdos.h file in your patch:

*** gcc-4.8-20121230/config/gthr.m4 2012-10-15 15:10:30.0 +0200
--- gcc-work/config/gthr.m4 2013-01-07 10:14:04.620667900 +0100
***
*** 21,26 
--- 21,27 
 tpf) thread_header=config/s390/gthr-tpf.h ;;
 vxworks) thread_header=config/gthr-vxworks.h ;;
 win32) thread_header=config/i386/gthr-win32.h ;;
+ rdos) thread_header=config/i386/gthr-rdos.h ;;

This file should be part of libgcc, so it needs its own ChangeLog.

Uros. 




Re: [PATCH] Adding target rdos to GCC

2013-01-28 Thread Leif Ekblad


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: Richard Biener rguent...@suse.de; gcc-patches@gcc.gnu.org; H.J. 
Lu hjl.to...@gmail.com; Jakub Jelinek ja...@redhat.com

Sent: Monday, January 28, 2013 9:03 PM
Subject: Re: [PATCH] Adding target rdos to GCC



On Mon, Jan 28, 2013 at 8:57 PM, Leif Ekblad l...@rdos.net wrote:


That is intentional. The gthr-rdos.h file is part of libgcc. My intention
was to first patch gcc, then update the patches for newlib, and finally
libgcc. The gthr-rdos.h file would reference include-files part of 
newlib,
so this is kind of circular. I also cannot define the thread model for 
RDOS

unless I define this file.

I see a couple of possible solutions:
1. Keep as is. You cannot build libgcc at the current stage anyway, and 
the

bootstrap must be built without threading
2. Add an empty gthr-rdos.h file until libgcc is done
3. Remove the threading-model for now, and add it with libgcc instead.


I propose option 3.

Is it enough to remove gthr.m4 change from the patch in this case?

Uros.


Yes, for all practical purposes. There is a reference to thread-file in 
config.gcc, when threading is enabled, which doesn't work for bootstrapping 
the compiler anyway.


Regards,
Leif Ekblad



Re: [PATCH] Adding target rdos to GCC

2013-01-28 Thread Leif Ekblad

That looks good. Thanks, Uros.

Leif


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: Richard Biener rguent...@suse.de; gcc-patches@gcc.gnu.org; H.J. 
Lu hjl.to...@gmail.com; Jakub Jelinek ja...@redhat.com

Sent: Monday, January 28, 2013 9:45 PM
Subject: Re: [PATCH] Adding target rdos to GCC



On Mon, Jan 28, 2013 at 9:14 PM, Leif Ekblad l...@rdos.net wrote:

That is intentional. The gthr-rdos.h file is part of libgcc. My 
intention

was to first patch gcc, then update the patches for newlib, and finally
libgcc. The gthr-rdos.h file would reference include-files part of
newlib,
so this is kind of circular. I also cannot define the thread model for
RDOS
unless I define this file.

I see a couple of possible solutions:
1. Keep as is. You cannot build libgcc at the current stage anyway, and
the
bootstrap must be built without threading
2. Add an empty gthr-rdos.h file until libgcc is done
3. Remove the threading-model for now, and add it with libgcc instead.



I propose option 3.

Is it enough to remove gthr.m4 change from the patch in this case?


Yes, for all practical purposes. There is a reference to thread-file in
config.gcc, when threading is enabled, which doesn't work for 
bootstrapping

the compiler anyway.


Thanks for pointing it, I have also removed this reference.

Attached is the patch that has been committed to SVN. I have added
missing licence headers to new files and clean whitespace a bit.

2013-01-28  Leif Ekblad  l...@rdos.net

* config.gcc (i[34567]86-*-rdos*, x86_64-*-rdos*): New targets.
* config/i386/i386.h (TARGET_RDOS): New macro.
(DEFAULT_LARGE_SECTION_THRESHOLD): New macro.
* config/i386/i386.c (ix86_option_override_internal): For 64bit
TARGET_RDOS, set ix86_cmodel to CM_MEDIUM_PIC and flag_pic to 1.
* config/i386/i386.opt (mlarge-data-threshold): Initialize to
DEFAULT_LARGE_SECTION_THRESHOLD.
* config/i386/i386.md (R14_REG, R15_REG): New constants.
* config/i386/rdos.h: New file.
* config/i386/rdos64.h: New file.

Thanks,
Uros.





Re: [PATCH] Adding target rdos to GCC

2013-01-27 Thread Leif Ekblad

If the patch is ok, could some maintainer add it to trunk?

Regards,
Leif Ekblad


- Original Message - 
From: Richard Biener rguent...@suse.de

To: Uros Bizjak ubiz...@gmail.com
Cc: Leif Ekblad l...@rdos.net; gcc-patches@gcc.gnu.org; H.J. Lu 
hjl.to...@gmail.com; Jakub Jelinek ja...@redhat.com

Sent: Wednesday, January 09, 2013 9:37 AM
Subject: Re: [PATCH] Adding target rdos to GCC



On Wed, 9 Jan 2013, Uros Bizjak wrote:


On Tue, Jan 8, 2013 at 9:32 PM, Leif Ekblad l...@rdos.net wrote:
 After some new suggestions from Uros, I've made a new diff.


 Change log:
 * config/gthr.m4: Added rdos thread header.
 * gcc/config/i386/i386.c: Provided a way to define a default setting 
 for

 medium memory model and PIC using TARGET_RDOS define.
 * gcc/config/i386/i386.h: Defined TARGET_RDOS macro. Defined default 
 value

 for large-data-threshold.
 * gcc/config/i386/i386.md: Added r14 and r15 register names.
 * gcc/config/i386/i386.opt: Changed initial value for 
 large-data-threshold

 to DEFAULT_LARGE_SECTION_THRESHOLD.
 * gcc/config/i386/rdos.h: Common definitions for target rdos
 * gcc/config/i386/rdos64.h: Specific definitions for 64-bit rdos 
 target.

 * gcc/config.gcc: Added rdos targets

Please use present tense in ChangeLog (see many other entries).

 Tested on target rdos and rdos32.

This is OK for mainline, but the patch needs explicit approval from
Release Managers at this stage.


Ok with me.

Richard. 




Re: [PATCH] Adding target rdos to GCC

2013-01-08 Thread Leif Ekblad

After some new suggestions from Uros, I've made a new diff.

Change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for 
medium memory model and PIC using TARGET_RDOS define.
* gcc/config/i386/i386.h: Defined TARGET_RDOS macro. Defined default value 
for large-data-threshold.

* gcc/config/i386/i386.md: Added r14 and r15 register names.
* gcc/config/i386/i386.opt: Changed initial value for large-data-threshold 
to DEFAULT_LARGE_SECTION_THRESHOLD.

* gcc/config/i386/rdos.h: Common definitions for target rdos
* gcc/config/i386/rdos64.h: Specific definitions for 64-bit rdos target.
* gcc/config.gcc: Added rdos targets

Tested on target rdos and rdos32.

Leif Ekblad

- Original Message - 
From: Leif Ekblad l...@rdos.net

To: Uros Bizjak ubiz...@gmail.com; gcc-patches@gcc.gnu.org
Cc: H.J. Lu hjl.to...@gmail.com
Sent: Monday, January 07, 2013 11:13 PM
Subject: Re: [PATCH] Adding target rdos to GCC



Hello Uros,

I tried to use your suggestion and use DEFAULT_SECTION_THRESHOLD
in i386.opt, however this doesn't work for me. It seems the default is
always
65536 regardless of what I define in rdos.h. Therefore, I kept the design
as it was before.

Changing name to TARGET_RDOS seems reasonable, and this has been changed.
The location of the defines are also changed to the positions you 
proposed.


I added another include-file (rdos32.h) for the 32-bit target. Currently,
the
32-bit target is supported with OpenWatcom. While I want to make sure
the header-files compile for both 32- and 64-bits, 32-bit support is not
my primary target right now. I just need a GCC that can build the 32-bit
version.

New change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for
medium memory model and PIC using TARGET_RDOS define. Provided a way to
define a default value for large-data-threshold.
* gcc/config/i386/i386.h: Defined TARGET_RDOS macro. Defined default value
for large-data-threshold.
* gcc/config/i386/i386.md: Added r14 and r15 register names.
* gcc/config/i386/i386.opt: Changed initial value for large-data-threshold
to 0 to allow detection of modification.
* gcc/config/i386/rdos.h: Added new file for 64-bit rdos target.
* gcc/config/i386/rdos32.h: Added new file for 32-bit rdos target.
* gcc/config.gcc: Added rdos targets

Leif Ekblad


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: gcc-patches@gcc.gnu.org
Cc: Leif Ekblad l...@rdos.net; H.J. Lu hjl.to...@gmail.com
Sent: Sunday, January 06, 2013 9:32 PM
Subject: Re: [PATCH] Adding target rdos to GCC



Hello!

Updated patches with the suggestions below, except that the initial 
value

is 0
(which is not meaningful). I also added a setting in rdos target file to
use r15
for PIC instead of rbx.


*** gcc-4.8-20121230/gcc/config/i386/i386.c Thu Dec 27 02:58:06 2012
--- gcc-work/gcc/config/i386/i386.c Sun Jan  6 14:10:34 2013

+   if (ix86_section_threshold == 0)
+ ix86_section_threshold = DEFAULT_SECTION_THRESHOLD;

Please see attached patch on how to initialize an option.

*** gcc-4.8-20121230/gcc/config/i386/i386.h Wed Dec 19 17:04:12 2012
--- gcc-work/gcc/config/i386/i386.h Sun Jan  6 13:24:26 2013

+ #define TARGET_MEDIUM_PIC   0

You should just use TARGET_RDOS here (also, please see attached patch).

+ /* Default threshold for putting data in large sections with x86-64
+medium memory model */
+ #define DEFAULT_SECTION_THRESHOLD 65536

Do not put this define in the middle of i386.h section that deals with
alignment...

*** gcc-4.8-20121230/gcc/config/i386/rdos.h Thu Jan  1 01:00:00 1970
--- gcc-work/gcc/config/i386/rdos.h Sun Jan  6 13:20:12 2013

+ #undef REAL_PIC_OFFSET_TABLE_REGNUM
+ #define REAL_PIC_OFFSET_TABLE_REGNUM  R15_REG

Is this header also used for 32bit target? You should not use REX
registers for 32bit targets.

+ #undef TARGET_MEDIUM_PIC
+ #define TARGET_MEDIUM_PIC   1

TARGET_RDOS

+ #define DEFAULT_SECTION_THRESHOLD0x10

No hex numbers here. Also, you will need to #undef this first to
override the default in i386.h.

*** gcc-4.8-20121230/gcc/config.gcc Thu Nov 22 00:33:40 2012
--- gcc-work/gcc/config.gcc Fri Jan  4 21:08:46 2013

+ i[34567]86-*-rdos*)
+ tm_file=${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h
newlib-stdint.h
+ ;;

You forgot to include i386/rdos.h here (other headers too?). It is
needed at least for TARGET_EXECUTABLE_SUFFIX define.

Uros.





gcc-base.diff
Description: Binary data


Re: [PATCH] Adding target rdos to GCC

2013-01-07 Thread Leif Ekblad

Hello Uros,

I tried to use your suggestion and use DEFAULT_SECTION_THRESHOLD
in i386.opt, however this doesn't work for me. It seems the default is 
always

65536 regardless of what I define in rdos.h. Therefore, I kept the design
as it was before.

Changing name to TARGET_RDOS seems reasonable, and this has been changed.
The location of the defines are also changed to the positions you proposed.

I added another include-file (rdos32.h) for the 32-bit target. Currently, 
the

32-bit target is supported with OpenWatcom. While I want to make sure
the header-files compile for both 32- and 64-bits, 32-bit support is not
my primary target right now. I just need a GCC that can build the 32-bit
version.

New change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for 
medium memory model and PIC using TARGET_RDOS define. Provided a way to 
define a default value for large-data-threshold.
* gcc/config/i386/i386.h: Defined TARGET_RDOS macro. Defined default value 
for large-data-threshold.

* gcc/config/i386/i386.md: Added r14 and r15 register names.
* gcc/config/i386/i386.opt: Changed initial value for large-data-threshold 
to 0 to allow detection of modification.

* gcc/config/i386/rdos.h: Added new file for 64-bit rdos target.
* gcc/config/i386/rdos32.h: Added new file for 32-bit rdos target.
* gcc/config.gcc: Added rdos targets

Leif Ekblad


- Original Message - 
From: Uros Bizjak ubiz...@gmail.com

To: gcc-patches@gcc.gnu.org
Cc: Leif Ekblad l...@rdos.net; H.J. Lu hjl.to...@gmail.com
Sent: Sunday, January 06, 2013 9:32 PM
Subject: Re: [PATCH] Adding target rdos to GCC



Hello!

Updated patches with the suggestions below, except that the initial value 
is 0
(which is not meaningful). I also added a setting in rdos target file to 
use r15

for PIC instead of rbx.


*** gcc-4.8-20121230/gcc/config/i386/i386.c Thu Dec 27 02:58:06 2012
--- gcc-work/gcc/config/i386/i386.c Sun Jan  6 14:10:34 2013

+   if (ix86_section_threshold == 0)
+ ix86_section_threshold = DEFAULT_SECTION_THRESHOLD;

Please see attached patch on how to initialize an option.

*** gcc-4.8-20121230/gcc/config/i386/i386.h Wed Dec 19 17:04:12 2012
--- gcc-work/gcc/config/i386/i386.h Sun Jan  6 13:24:26 2013

+ #define TARGET_MEDIUM_PIC   0

You should just use TARGET_RDOS here (also, please see attached patch).

+ /* Default threshold for putting data in large sections with x86-64
+medium memory model */
+ #define DEFAULT_SECTION_THRESHOLD 65536

Do not put this define in the middle of i386.h section that deals with
alignment...

*** gcc-4.8-20121230/gcc/config/i386/rdos.h Thu Jan  1 01:00:00 1970
--- gcc-work/gcc/config/i386/rdos.h Sun Jan  6 13:20:12 2013

+ #undef REAL_PIC_OFFSET_TABLE_REGNUM
+ #define REAL_PIC_OFFSET_TABLE_REGNUM  R15_REG

Is this header also used for 32bit target? You should not use REX
registers for 32bit targets.

+ #undef TARGET_MEDIUM_PIC
+ #define TARGET_MEDIUM_PIC   1

TARGET_RDOS

+ #define DEFAULT_SECTION_THRESHOLD0x10

No hex numbers here. Also, you will need to #undef this first to
override the default in i386.h.

*** gcc-4.8-20121230/gcc/config.gcc Thu Nov 22 00:33:40 2012
--- gcc-work/gcc/config.gcc Fri Jan  4 21:08:46 2013

+ i[34567]86-*-rdos*)
+ tm_file=${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h
newlib-stdint.h
+ ;;

You forgot to include i386/rdos.h here (other headers too?). It is
needed at least for TARGET_EXECUTABLE_SUFFIX define.

Uros.



gcc-base.diff
Description: Binary data


Re: [PATCH] Adding target rdos to GCC

2013-01-06 Thread Leif Ekblad
Updated patches with the suggestions below, except that the initial value is 
0
(which is not meaningful). I also added a setting in rdos target file to use 
r15

for PIC instead of rbx.

New change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for 
medium memory model and PIC. Provided a way to define a default value for 
large-data-threshold.
* gcc/config/i386/i386.h: Defined default value for medium memory model  
PIC. Defined default value for large-data-threshold.

* gcc/config/i386/i386.md: Added r14 and r15 register names.
* gcc/config/i386/i386.opt: Changed initial value for large-data-threshold 
to 0 to allow detection of modification.

* gcc/config/i386/rdos.h: Added new file for rdos target definition.
* gcc/config.gcc: Added rdos target

Tested for target rdos and rdos32.

Regards,
Leif Ekblad


- Original Message - 
From: H.J. Lu hjl.to...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: GCC Patches gcc-patches@gcc.gnu.org
Sent: Friday, January 04, 2013 11:32 PM
Subject: Re: [PATCH] Adding target rdos to GCC



On Fri, Jan 4, 2013 at 2:22 PM, Leif Ekblad l...@rdos.net wrote:

Change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for
medium memory model and PIC. Provided a way to define a default value for
large-data-threshold.
* gcc/config/i386/i386.h: Defined default value for medium memory model 
PIC.
* gcc/config/i386/rdos.h: Added new file for rdos target definition.
* gcc/config.gcc: Added rdos target

The change to gthr.m4 requires rebuilding the configure scripts.

Tested with target rdos and rdos32. Is this ok for trunk?

Regards,
Leif Ekblad


+ #ifdef TARGET_SECTION_THRESHOLD
+   ix86_section_threshold = TARGET_SECTION_THRESHOLD;
+ #endif

You should

1. Add DEFAULT_SECTION_THRESHOLD and set it to
65536.
2. Change the init value of  ix86_section_threshold to -1.
3. Set ix86_section_threshold to DEFAULT_SECTION_THRESHOLD
if it is -1.


--
H.J. 


gcc.diff
Description: Binary data


[PATCH] Adding target rdos to GCC

2013-01-04 Thread Leif Ekblad

Change log:
* config/gthr.m4: Added rdos thread header.
* gcc/config/i386/i386.c: Provided a way to define a default setting for 
medium memory model and PIC. Provided a way to define a default value for 
large-data-threshold.
* gcc/config/i386/i386.h: Defined default value for medium memory model  
PIC.

* gcc/config/i386/rdos.h: Added new file for rdos target definition.
* gcc/config.gcc: Added rdos target

The change to gthr.m4 requires rebuilding the configure scripts.

Tested with target rdos and rdos32. Is this ok for trunk?

Regards,
Leif Ekblad


gcc.diff
Description: Binary data


Re: [RFC PATCH, i386]: Use %r15 for REAL_PIC_OFFSET_TABLE_REGNUM on x86_64

2013-01-04 Thread Leif Ekblad
OK. I know I can do that, but I would need to do it for every syscall since 
every syscall can potentially clobber rbx.


Also, it is very strange that it is only one of the inlines the compiler 
complains about. I have another inline (which uses rbx as input), but that 
doesn't generate any error:


#define RdosUserGateEbxEdiEcxParRetEax(nr, rbx, rdi, rcx, res) do { \
 register int _id asm(r14) = nr; \
 register typeof(rbx) _rbx asm(rbx) = (rbx); \
 register typeof(rdi) _rdi asm(rdi) = (rdi); \
 register typeof(rcx) _rcx asm(r8) = (rcx); \
 register int _size asm(r12) = (rcx); \
 asm volatile ( \
   syscall\n\t \
   jnc 1f\n\t \
   xorq %%rax,%%rax\n\t \
   1: \n\t \
   : =a (res) :  r (_id), r (_rbx), r (_rdi), r (_rcx), r 
(_size) : rdx, rsi \

 ); \
} while(0);


inline int RdosWriteFile(int Handle, void *Buf, int Size)
{
   int res;
   RdosUserGateEbxEdiEcxParRetEax(usergate_read_file, Handle, Buf, Size, 
res);

   return res;
}

Why is not this inline causing the problem? Might that be because it will 
not use rbx, but instead another register? OTOH, the code seems to work and 
rbx is not assigned to PIC at the point of the call, but to the defined 
parameter.


Regards,
Leif Ekblad


- Original Message - 
From: Jakub Jelinek ja...@redhat.com

To: Leif Ekblad l...@rdos.net
Cc: Uros Bizjak ubiz...@gmail.com; Richard Henderson r...@redhat.com; 
Andi Kleen a...@firstfloor.org; Mike Frysinger vap...@gentoo.org; 
gcc-patches@gcc.gnu.org; j...@suse.cz; H.J. Lu hjl.to...@gmail.com

Sent: Friday, January 04, 2013 10:42 PM
Subject: Re: [RFC PATCH, i386]: Use %r15 for REAL_PIC_OFFSET_TABLE_REGNUM on 
x86_64




On Fri, Jan 04, 2013 at 10:39:05PM +0100, Leif Ekblad wrote:

I just tried the patch, but it seems to produce some problems for
me. The other patch which used a 64-bit specific register (r15)
instead of rbx was easier to adapt to. The problem for me is that
syscalls might clobber higher-half of all 32-bit registers, and that
I cannot use the stack to preserve rbx in the call because of the
red-zone.


Of course you can use the stack, just subtract the red zone size (plus
whatever you need) from %rsp first, then save to stack, do syscall,
then restore from stack and finally increment %rsp back.

Jakub 




Re: [RFC PATCH, i386]: Use %r15 for REAL_PIC_OFFSET_TABLE_REGNUM on x86_64

2012-12-24 Thread Leif Ekblad
In the case of cpuid, the code is hardly performance sensitive, and probably 
runs only at startup. An alternative solution for the broken code here is to 
move the result from rbx to another register, and to save/restore rbx. 
Currently, this is the only place in libgcc and newlib affected by this 
problem.


Leif Ekblad

- Original Message - 
From: Andi Kleen a...@firstfloor.org

To: Uros Bizjak ubiz...@gmail.com
Cc: gcc-patches@gcc.gnu.org; Richard Henderson r...@redhat.com; Jakub 
Jelinek ja...@redhat.com; j...@suse.cz; H.J. Lu hjl.to...@gmail.com

Sent: Monday, December 24, 2012 10:32 PM
Subject: Re: [RFC PATCH, i386]: Use %r15 for REAL_PIC_OFFSET_TABLE_REGNUM on 
x86_64




Uros Bizjak ubiz...@gmail.com writes:


Hello!

Currently, we use %rbx as REAL_PIC_OFFSET_TABLE_REGNUM on x86_64.
Since this register gets marked as fixed reg in
ix86_conditional_register_usage, we get into troubles with insns that
use %rbx (cmpxchg, cpuid). According to x86_64 psABI, we are free to
use any register, so attached patch changes %rbx with %r15 (also
following the example in the psABI). This patch has no implications on
small code model (that doesn't use REAL_PIC_OFFSET_TABLE_REGNUM
anyway), but on medium and large code model fixes usage of cpuid.h
(please see PR 55712 [1]) and avoids a pair of xchgs around cmpxchg or
cpuid instructions.


So everyone who worked around this and use r15 now broke.

It would be probably better to just teach the register allocator
to spill those registers as needed, to handle some asm() statement.
Not sure how hard that would be.

-Andi

--
a...@linux.intel.com -- Speaking for myself only 




x86-64 medium memory model

2012-12-12 Thread Leif Ekblad
I'm working on OS-adaptations for an OS that would use x86-64 applications 
that are located above 4G, but not in the upper area. Binutils provide a 
function to be able to set the start of text to above 4G, but there are 
problems with GCC when using this memory model.


The first issue has to do with creating a cross-compiler that defaults to 
medium memory model using PIC. While there are switches to achieve this on 
command line (-mcmodel=medium -fpic), this is inconvinient since everything 
ported must be changed to add these switches, including libgcc and newlib. 
The cross-compiler instead should default to this memory model.


One possibility to achieve this is to add a new .h-file in the 
gcc/config/i386 directory. However, further inspection of the source 
indicates there is no macro that can be redefined to achieve this. One 
possibility is to add such a macro in gcc/config/i386.h, and implement it in 
gcc/config/i386.c.


Here is a simple patch to do this:

diff -u -r -N gcc-4.8-20121202/gcc/config/i386/i386.h 
gcc-work/gcc/config/i386/i386.h
--- gcc-4.8-20121202/gcc/config/i386/i386.h 2012-11-23 17:02:10.0 
+0100

+++ gcc-work/gcc/config/i386/i386.h 2012-12-08 12:17:40.0 +0100
@@ -86,6 +86,8 @@
#define TARGET_LP64 TARGET_ABI_64
#define TARGET_X32 TARGET_ABI_X32

+#define TARGET_MEDIUM_PIC   0
+
/* SSE4.1 defines round instructions */
#define OPTION_MASK_ISA_ROUND OPTION_MASK_ISA_SSE4_1
#define TARGET_ISA_ROUND ((ix86_isa_flags  OPTION_MASK_ISA_ROUND) != 0)

diff -u -r -N gcc-4.8-20121202/gcc/config/i386/i386.c 
gcc-work/gcc/config/i386/i386.c
--- gcc-4.8-20121202/gcc/config/i386/i386.c 2012-12-02 00:43:52.0 
+0100

+++ gcc-work/gcc/config/i386/i386.c 2012-12-11 21:43:48.0 +0100
@@ -3235,6 +3235,8 @@
  DLL, and is essentially just as efficient as direct addressing.  */
  if (TARGET_64BIT  DEFAULT_ABI == MS_ABI)
 ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
+  else if (TARGET_64BIT  TARGET_MEDIUM_PIC)
+ix86_cmodel = CM_MEDIUM_PIC, flag_pic = 1;
  else if (TARGET_64BIT)
 ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
  else

It can be used like this:

+#undef TARGET_MEDIUM_PIC
+#define TARGET_MEDIUM_PIC 1

Next, with this issue fixed, there is still another problem in libgcc when 
using a cross-compiler compiled with this memory model:


../../gcc-work/libgcc/. -I../../../gcc-work/libgcc/../gcc -I../../../gcc-work/libgcc/../include 
-DHAVE_CC_TLS -o cpuinfo.o -MT cpuinfo.o -MD -MP -MF cpuinfo.dep -c 
../../../gcc-work/libgcc/config/i386/cpuinfo.c -fvisibility=hidden -DHIDE_EXPORTS

In file included from ../../../gcc-work/libgcc/config/i386/cpuinfo.c:21:0:
../../../gcc-work/libgcc/config/i386/cpuinfo.c: In function 
'get_available_features':
../../../gcc-work/libgcc/config/i386/cpuinfo.c:236:7: error: inconsistent 
operand constraints in an 'asm'

__cpuid_count (7, 0, eax, ebx, ecx, edx);
^
../../../gcc-work/libgcc/static-object.mk:17: recipe for target `cpuinfo.o' 
failed

make[1]: *** [cpuinfo.o] Error 1
make[1]: Lämnar katalogen /usr/src/build-gcc-noheader/rdos/libgcc
Makefile:10619: recipe for target `all-target-libgcc' failed
make: *** [all-target-libgcc] Error 2

My guess is that __cpuid_count uses 32-bit addressing when it should be 
using 64-bit addressing. I have no patch for this as I don't understand what 
is going on here well enough, but __cpuid_count is defined in 
gcc/config/i386/cpuid.h.


In order to be able to continue to test the medium memory model I'd need 
patches to be applied to fix these issues.


Regards,
Leif Ekblad
RDOS Development



Re: x86-64 medium memory model

2012-12-12 Thread Leif Ekblad
The small memory model will not do since I want to put data at other 
distinct addresses above 4G. I also want to place the heap at yet another 
address interval. This way it becomes easy to separate out code, data and 
heap references, and making sure that pointers are valid. The primary reason 
for not using below 2G or the last 2G, is because such numbers are formed 
naturally when doing 32-bit arithmetics, and thus could be executed by 
chance from corrupt data.


If I understand it correctly, the PIE option is very similar to the PIC 
option, and will not make it possible to use any address for both code and 
data.


Additionally, when I tried the small memory model with a start address of 
text above 4G, the linker complains about 32-bit fixups overflowing.


Leif Ekblad


- Original Message - 
From: H.J. Lu hjl.to...@gmail.com

To: Leif Ekblad l...@rdos.net
Cc: GCC Patches gcc-patches@gcc.gnu.org; GCC Mailing List 
g...@gcc.gnu.org

Sent: Wednesday, December 12, 2012 9:59 PM
Subject: Re: x86-64 medium memory model



On Wed, Dec 12, 2012 at 12:56 PM, Leif Ekblad l...@rdos.net wrote:
I'm working on OS-adaptations for an OS that would use x86-64 
applications

that are located above 4G, but not in the upper area. Binutils provide a
function to be able to set the start of text to above 4G, but there are
problems with GCC when using this memory model.



Have you tried PIE with small model?  You can place your
binaries above 4G with better performance.

--
H.J.