diff options
author | Ken Raeburn <raeburn@cygnus> | 1995-05-23 00:09:34 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1995-05-23 00:09:34 +0000 |
commit | 4761bb029a85d6a85cd8b041b1a28a94ddf0f516 (patch) | |
tree | 8bf956a0c40e053c60d5bdc194fb3aae395f9b46 /gas/as.c | |
parent | cac390d444e084a7965d889f9b7792aedff08fd7 (diff) | |
download | gdb-4761bb029a85d6a85cd8b041b1a28a94ddf0f516.zip gdb-4761bb029a85d6a85cd8b041b1a28a94ddf0f516.tar.gz gdb-4761bb029a85d6a85cd8b041b1a28a94ddf0f516.tar.bz2 |
more emulation fixes
Diffstat (limited to 'gas/as.c')
-rw-r--r-- | gas/as.c | 97 |
1 files changed, 97 insertions, 0 deletions
@@ -104,6 +104,90 @@ Options:\n\ md_show_usage (stream); } +#ifdef USE_EMULATIONS +#define EMULATION_ENVIRON "AS_EMULATION" + +extern struct emulation mipsbelf, mipslelf, mipself; +extern struct emulation mipsbecoff, mipslecoff, mipsecoff; + +static const char *emulation_name; +static struct emulation *const emulations[] = { EMULATIONS }; +static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]); + +static void +select_emulation_mode (argc, argv) + int argc; + char **argv; +{ + int i; + char *p, *em = 0; + + for (i = 1; i < argc; i++) + if (!strncmp ("--em", argv[i], 4)) + break; + + if (i == argc) + goto do_default; + + p = strchr (argv[i], '='); + if (p) + p++; + else + p = argv[i+1]; + + if (!p || !*p) + as_fatal ("missing emulation mode name"); + em = p; + + do_default: + if (em == 0) + em = getenv (EMULATION_ENVIRON); + if (em == 0) + em = DEFAULT_EMULATION; + + if (em) + { + for (i = 0; i < n_emulations; i++) + if (!strcmp (emulations[i]->name, em)) + break; + if (i == n_emulations) + as_fatal ("unrecognized emulation name `%s'", em); + this_emulation = emulations[i]; + } + else + this_emulation = emulations[0]; + + this_emulation->init (); +} + +const char * +default_emul_bfd_name () +{ + abort (); +} + +void +common_emul_init () +{ + this_format = this_emulation->format; + + if (this_emulation->leading_underscore == 2) + this_emulation->leading_underscore = this_format->dfl_leading_underscore; + + if (this_emulation->default_endian != 2) + target_big_endian = this_emulation->default_endian; + + if (this_emulation->fake_label_name == 0) + { + if (this_emulation->leading_underscore) + this_emulation->fake_label_name = "L0\001"; + else + /* What other parameters should we test? */ + this_emulation->fake_label_name = ".L0\001"; + } +} +#endif + /* * Since it is easy to do here we interpret the special arg "-" * to mean "use stdin" and we set that argv[] pointing to "". @@ -153,6 +237,8 @@ parse_args (pargc, pargv) {"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}, #define OPTION_VERBOSE (OPTION_STD_BASE + 5) {"verbose", no_argument, NULL, OPTION_VERBOSE}, +#define OPTION_EMULATION (OPTION_STD_BASE + 6) + {"emulation", required_argument, NULL, OPTION_EMULATION}, }; /* Construct the option lists from the standard list and the @@ -237,6 +323,12 @@ parse_args (pargc, pargv) print_version_id (); exit (EXIT_SUCCESS); + case OPTION_EMULATION: + /* Already handled; ignore it this time, except error checking. */ + if (strcmp (optarg, this_emulation->name)) + as_fatal ("multiple emulation names specified"); + break; + case OPTION_DUMPCONFIG: fprintf (stderr, "alias = %s\n", TARGET_ALIAS); fprintf (stderr, "canonical = %s\n", TARGET_CANONICAL); @@ -370,10 +462,15 @@ main (argc, argv) out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME; + hex_init (); #ifdef BFD_ASSEMBLER bfd_init (); #endif +#ifdef USE_EMULATIONS + select_emulation_mode (argc, argv); +#endif + PROGRESS (1); symbol_begin (); frag_init (); |