aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/obj-coff.h14
-rw-r--r--gas/config/tc-i386.c33
-rw-r--r--gas/config/te-pep.h10
3 files changed, 53 insertions, 4 deletions
diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h
index 8d10b4d..d2b2125 100644
--- a/gas/config/obj-coff.h
+++ b/gas/config/obj-coff.h
@@ -55,16 +55,30 @@
#endif
#ifdef TC_I386
+#ifndef TE_PEP
+#include "coff/x86_64.h"
+#else
#include "coff/i386.h"
+#endif
#ifdef TE_PE
+#ifdef TE_PEP
+extern const char * x86_64_target_format (void);
+#define TARGET_FORMAT x86_64_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"
+#else
#define TARGET_FORMAT "coff-i386"
#endif
#endif
+#endif
#ifdef TC_M68K
#include "coff/m68k.h"
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index f85aed3..1e8534a 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -5766,9 +5766,10 @@ const char *md_shortopts = "qn";
#define OPTION_MARCH (OPTION_MD_BASE + 3)
#define OPTION_MTUNE (OPTION_MD_BASE + 4)
-struct option md_longopts[] = {
+struct option md_longopts[] =
+{
{"32", no_argument, NULL, OPTION_32},
-#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
{"64", no_argument, NULL, OPTION_64},
#endif
{"divide", no_argument, NULL, OPTION_DIVIDE},
@@ -5812,14 +5813,18 @@ md_parse_option (int c, char *arg)
/* -s: On i386 Solaris, this tells the native assembler to use
.stab instead of .stab.excl. We always use .stab anyhow. */
break;
-
+#endif
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
case OPTION_64:
{
const char **list, **l;
list = bfd_target_list ();
for (l = list; *l != NULL; l++)
- if (strncmp (*l, "elf64-x86-64", 12) == 0)
+ if ( strncmp (*l, "elf64-x86-64", 12) == 0
+ || strcmp (*l, "coff-x86-64") == 0
+ || strcmp (*l, "pe-x86-64") == 0
+ || strcmp (*l, "pei-x86-64") == 0)
{
default_arch = "x86_64";
break;
@@ -5927,6 +5932,26 @@ md_show_usage (stream)
}
+#if defined(TE_PEP)
+const char *
+x86_64_target_format (void)
+{
+ if (strcmp (default_arch, "x86_64") == 0)
+ {
+ set_code_flag (CODE_64BIT);
+ return COFF_TARGET_FORMAT;
+ }
+ else if (strcmp (default_arch, "i386") == 0)
+ {
+ set_code_flag (CODE_32BIT);
+ return "coff-i386";
+ }
+
+ as_fatal (_("Unknown architecture"));
+ return NULL;
+}
+#endif
+
#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
|| defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
diff --git a/gas/config/te-pep.h b/gas/config/te-pep.h
new file mode 100644
index 0000000..164b22d
--- /dev/null
+++ b/gas/config/te-pep.h
@@ -0,0 +1,10 @@
+#define TE_PEP
+#define COFF_WITH_pex64
+
+#define TE_PE
+#define LEX_AT (LEX_BEGIN_NAME | LEX_NAME) /* Can have @'s inside labels. */
+
+/* The PE format supports long section names. */
+#define COFF_LONG_SECTION_NAMES
+
+#include "obj-format.h"