This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch i386 pe]: Allow multilib version gas for i386 pe-coff


2009/5/20 H.J. Lu <hjl.tools@gmail.com>:
> On Tue, May 19, 2009 at 3:09 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Tue, May 19, 2009 at 2:47 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> On Tue, May 19, 2009 at 1:31 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>> 2009/5/19 H.J. Lu <hjl.tools@gmail.com>:
>>>>> On Tue, May 19, 2009 at 1:12 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>>>> 2009/5/19 H.J. Lu <hjl.tools@gmail.com>:
>>>>>>> On Tue, May 19, 2009 at 12:24 PM, Dave Korn
>>>>>>> <dave.korn.cygwin@googlemail.com> wrote:
>>>>>>>> H.J. Lu wrote:
>>>>>>>>> On Tue, May 19, 2009 at 11:57 AM, Dave Korn
>>>>>>>>> <dave.korn.cygwin@googlemail.com> wrote:
>>>>>>>>>> H.J. Lu wrote:
>>>>>>>>>>> On Tue, May 19, 2009 at 11:19 AM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>>>>>>>>>> Well, I tried this and I found that in gas/output-file.c obj-coff.h is
>>>>>>>>>>>> included, but the tc-i386.h isn't. So if I move code into tc-i386.h I
>>>>>>>>>>>> get build failures for PE(+) x86/x64
>>>>>>>>>>>>
>>>>>>>>>>>> So, how to continue here?
>>>>>>>>>>>>
>>>>>>>>>>> How does Linux/x86-64 deal with this issue?
>>>>>>>>>> ?HJ, perhaps you can explain the motivation for your change request a bit
>>>>>>>>>> clearer. ?ISTM that ELF does things one way, COFF another. ?All the other COFF
>>>>>>>>>> targets define TARGET_FORMAT in cpu-specific chunks of obj-coff.h, ELF and
>>>>>>>>>> AOUT targets define TARGET_FORMAT in cpu-specific header files. ?This is
>>>>>>>>>> probably just a historical accident, but I'm not sure why that means we should
>>>>>>>>>> try and fix it now for just one single target?
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Those x86 32/64bit processing is handled in tc-i386.[ch] so far. I'd like
>>>>>>>>> to keep this way so that any future changes to x86 won't break x86 32/64bit
>>>>>>>>> processing.
>>>>>>>>
>>>>>>>> ?Hmm, I see what you mean, it's a cpu-thing rather than an object format
>>>>>>>> thing. ?(BTW, did you mean to send this off-list?)
>>>>>>>>
>>>>>>>
>>>>>>> Oops. I didn't mean it.
>>>>>>>
>>>>>>>> ?I guess the next question is "Why doesn't putting them into tc-i386.h work,
>>>>>>>> considering that obj-coff.h begins with a #include of targ-cpu.h"?
>>>>>>>>
>>>>>>>
>>>>>>> That was my question too.
>>>>>>
>>>>>> Well, the answer isn't that hard here. The generated header file
>>>>>> targ-env.h is the reason. For pe(p) it simply includes te-pe(p).h, but
>>>>>> for linux the tc-i386.h file is included by it, too. I didn't
>>>>>> investigate into the reason for this, but this is the answer, why it
>>>>>> didn't break on linux 32/64 target.
>>>>>>
>>>>>
>>>>> Then you should include tc-i386.h in targ-env.h if you want to
>>>>> support --32/--64 on x86.
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> H.J.
>>>>>
>>>>
>>>
>>> Both obj-elf.h and obj-coff.h ?include "targ-cpu.h", which has
>>>
>>> #include "tc-i386.h"
>>>
>>> Why didn't it work for you?
>>>
>>>
>>
>> This patch moves TARGET_FORMAT from obj-coff. to tc-i386.h
>> for x86.
>>
>
> Try this.
>
>
> H.J.
> ---
> 2009-05-19 ?Kai Tietz ?<kai.tietz@onevision.com>
> ? ? ? ? ? ?H.J. Lu ?<hongjiu.lu@intel.com>
>
> ? ? ? ?* config/obj-coff.h (TARGET_FORMAT): Removed for x86 pe-coff.
> ? ? ? ?(COFF_TARGET_FORMAT): Likewise.
>
> ? ? ? ?* config/tc-i386.c (md_longopts): Allow --64 for x86 pe-coff.
> ? ? ? ?(md_parse_option): Likewise.
> ? ? ? ?(md_show_usage): Show option --32/--64 for x86 pe-coff.
> ? ? ? ?(i386_target_format): Use also for x86 pe-coff.
>
> ? ? ? ?* config/tc-i386.h (PE_TARGET_FORMAT): New.
> ? ? ? ?(PE_TARGET_FORMAT64): Likewise.
> ? ? ? ?(TARGET_FORMAT): Defined with i386_target_format for x86
> ? ? ? ?pe-coff.
>

Ok, this patch works fine (I tested it for all three targets).  I just
noticed a small hick-up here about including of coff/x86_64.h and
coff/i386.h, which I fixed in the patch attached, too.

Kai


-- 
|  (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
Index: src/gas/config/obj-coff.h
===================================================================
--- src.orig/gas/config/obj-coff.h
+++ src/gas/config/obj-coff.h
@@ -55,22 +55,12 @@
 #endif
 
 #ifdef TC_I386
-#ifndef TE_PEP
+#ifdef TE_PEP
 #include "coff/x86_64.h"
 #else
 #include "coff/i386.h"
 #endif
 
-#ifdef TE_PE
-#ifdef TE_PEP
-extern const char *i386_target_format (void);
-#define TARGET_FORMAT i386_target_format ()
-#define COFF_TARGET_FORMAT "pe-x86-64"
-#else
-#define TARGET_FORMAT "pe-i386"
-#endif
-#endif
-
 #ifndef TARGET_FORMAT
 #ifdef TE_PEP
 #define TARGET_FORMAT "coff-x86-64"
Index: src/gas/config/tc-i386.c
===================================================================
--- src.orig/gas/config/tc-i386.c
+++ src/gas/config/tc-i386.c
@@ -8018,7 +8018,8 @@ const char *md_shortopts = "qn";
 struct option md_longopts[] =
 {
   {"32", no_argument, NULL, OPTION_32},
-#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
+#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
   {"64", no_argument, NULL, OPTION_64},
 #endif
   {"divide", no_argument, NULL, OPTION_DIVIDE},
@@ -8071,7 +8072,8 @@ md_parse_option (int c, char *arg)
 	 .stab instead of .stab.excl.  We always use .stab anyhow.  */
       break;
 #endif
-#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
+#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
     case OPTION_64:
       {
 	const char **list, **l;
@@ -8258,7 +8260,8 @@ md_show_usage (stream)
   fprintf (stream, _("\
   -s                      ignored\n"));
 #endif
-#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
+#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
   fprintf (stream, _("\
   --32/--64               generate 32bit/64bit code\n"));
 #endif
@@ -8305,7 +8308,8 @@ md_show_usage (stream)
 }
 
 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
-     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (TE_PEP))
+     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
 
 /* Pick the target format to use.  */
 
@@ -8362,10 +8366,9 @@ i386_target_format (void)
     as_fatal (_("Unknown architecture"));
   switch (OUTPUT_FLAVOR)
     {
-#ifdef TE_PEP
+#if defined (TE_PE) || defined (TE_PEP)
     case bfd_target_coff_flavour:
-      return flag_code == CODE_64BIT ? COFF_TARGET_FORMAT : "pe-i386";
-      break;
+      return flag_code == CODE_64BIT ? PE_TARGET_FORMAT64 : PE_TARGET_FORMAT;
 #endif
 #ifdef OBJ_MAYBE_AOUT
     case bfd_target_aout_flavour:
Index: src/gas/config/tc-i386.h
===================================================================
--- src.orig/gas/config/tc-i386.h
+++ src/gas/config/tc-i386.h
@@ -70,14 +70,15 @@ extern unsigned long i386_mach (void);
 #define ELF_TARGET_FORMAT64	"elf64-x86-64"
 #endif
 
+#define PE_TARGET_FORMAT "pe-i386"
+#define PE_TARGET_FORMAT64 "pe-x86-64"
+
 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
-     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
+     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
 extern const char *i386_target_format (void);
 #define TARGET_FORMAT i386_target_format ()
 #else
-#ifdef OBJ_ELF
-#define TARGET_FORMAT		ELF_TARGET_FORMAT
-#endif
 #ifdef OBJ_AOUT
 #define TARGET_FORMAT		AOUT_TARGET_FORMAT
 #endif

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]