From 0b077fa3a720c53504d5cda7e0e48001aca36ac8 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 19 Oct 2009 02:09:59 +0000 Subject: [PATCH] add a binutils variant based on a binutils snapshot and codesourcery g++ enhancements (compiles, but fails to link the kernel) SVN-Revision: 18060 --- toolchain/binutils/Config.in | 14 +- toolchain/binutils/Makefile | 8 + .../000-codesourcery_2009q1_203.patch | 32363 ++++++++++++++++ .../patches/2.19.1+cs/110-arm-eabi-conf.patch | 22 + .../2.19.1+cs/111-pr7093.elf32-arm.c.patch | 13 + .../patches/2.19.1+cs/120-sh-conf.patch | 40 + .../2.19.1+cs/300-001_ld_makefile_patch.patch | 22 + .../300-012_check_ldrunpath_length.patch | 20 + 8 files changed, 32499 insertions(+), 3 deletions(-) create mode 100644 toolchain/binutils/patches/2.19.1+cs/000-codesourcery_2009q1_203.patch create mode 100644 toolchain/binutils/patches/2.19.1+cs/110-arm-eabi-conf.patch create mode 100644 toolchain/binutils/patches/2.19.1+cs/111-pr7093.elf32-arm.c.patch create mode 100644 toolchain/binutils/patches/2.19.1+cs/120-sh-conf.patch create mode 100644 toolchain/binutils/patches/2.19.1+cs/300-001_ld_makefile_patch.patch create mode 100644 toolchain/binutils/patches/2.19.1+cs/300-012_check_ldrunpath_length.patch diff --git a/toolchain/binutils/Config.in b/toolchain/binutils/Config.in index 6b0791deb3..544f62bdc1 100644 --- a/toolchain/binutils/Config.in +++ b/toolchain/binutils/Config.in @@ -2,7 +2,7 @@ choice prompt "Binutils Version" if TOOLCHAINOPTS - default BINUTILS_VERSION_2_18 if TARGET_avr32 + default BINUTILS_VERSION_2_18 if avr32 default BINUTILS_VERSION_2_19_1 help Select the version of binutils you wish to use. @@ -11,8 +11,15 @@ choice bool "binutils 2.18" config BINUTILS_VERSION_2_19_1 - depends !TARGET_avr32 + depends !avr32 bool "binutils 2.19.1" + + config BINUTILS_VERSION_CS + depends !avr32 + depends !ubicom32 + depends BROKEN + bool "binutils 2.19.1+20090205 with CodeSourcery enhancements" + endchoice config EXTRA_BINUTILS_CONFIG_OPTIONS @@ -27,5 +34,6 @@ config BINUTILS_VERSION prompt "Binutils Version" if (TOOLCHAINOPTS && NULL) default "2.18" if BINUTILS_VERSION_2_18 default "2.19.1" if BINUTILS_VERSION_2_19_1 - default "2.18" if TARGET_avr32 + default "2.19.1+cs" if BINUTILS_VERSION_CS + default "2.18" if avr32 default "2.19.1" diff --git a/toolchain/binutils/Makefile b/toolchain/binutils/Makefile index c9da2cfd78..7073507dee 100644 --- a/toolchain/binutils/Makefile +++ b/toolchain/binutils/Makefile @@ -8,6 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=binutils PKG_VERSION:=$(call qstrip,$(CONFIG_BINUTILS_VERSION)) +BIN_VERSION:=$(PKG_VERSION) PKG_SOURCE_URL:=@GNU/binutils/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 @@ -18,6 +19,13 @@ endif ifeq ($(PKG_VERSION),2.19.1) PKG_MD5SUM:=09a8c5821a2dfdbb20665bc0bd680791 endif +ifeq ($(PKG_VERSION),2.19.1+cs) + BIN_VERSION:=20090205 + PKG_SOURCE:=$(PKG_NAME)-$(BIN_VERSION).tar.bz2 + PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources + PKG_MD5SUM:=040740e8c864dd1a15886753f9c0bc0b + HOST_BUILD_DIR:=$(BUILD_DIR_TOOLCHAIN)/binutils-$(BIN_VERSION) +endif PATCH_DIR:=./patches/$(PKG_VERSION) diff --git a/toolchain/binutils/patches/2.19.1+cs/000-codesourcery_2009q1_203.patch b/toolchain/binutils/patches/2.19.1+cs/000-codesourcery_2009q1_203.patch new file mode 100644 index 0000000000..9fd4a45aec --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/000-codesourcery_2009q1_203.patch @@ -0,0 +1,32363 @@ +--- /dev/null ++++ b/ChangeLog.csl +@@ -0,0 +1,5630 @@ ++2009-05-21 Maxim Kuvyrkov ++ ++ gas/ ++ * config/tc-m68k.c (mcf52235_ctrl): Remove non-existent CACR, ACR[01]. ++ (mcf53017_ctrl): Fix RAMBAR. ++ ++2009-04-30 Nathan Sidwell ++ ++ * release-notes-csl.xml: Add arm* TARGET for -mauto-it note. ++ ++2009-04-23 Andrew Stubbs ++ ++ Issue #5328 ++ ++ * release-notes-csl.xml: Document bug fix. ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_fix_exidx_coverage): Don't attempt to ++ fix discarded sections. ++ ++2009-04-22 Daniel Jacobowitz ++ ++ Issue #4502 ++ ++ * release-notes-csl.xml (Assembler fix for -mauto-it): New note. ++ ++ gas/ ++ * config/tc-arm.c (handle_it_state): Use force_automatic_it_block_close ++ to close the previous IT block. Only close the next IT block if we ++ opened a new one for an IT-only instruction. ++ ++2009-04-22 Nathan Sidwell ++ ++ Issue 5271 ++ ++ Backport 2009-04-22 Nathan Sidwell ++ ld/testsuite/ ++ * ld-scripts/rgn-at1.d: Cope with larger padding on sections. ++ * ld-scripts/rgn-at2.d: Likewise. ++ * ld-scripts/rgn-at3.d: Likewise. ++ ++ Backport 2009-04-03 Nathan Sidwell ++ ld/testuite/ ++ * ld-scripts/rgn-at.s: Use explicit .section pseudos. ++ ++2009-04-21 Andrew Jenner ++ ++ Issue #5270 ++ ++ * ld/testsuite/ld-elf/eh5.d: Accept 0b as well as 1b for the ++ personality byte in the augmentation data. ++ ++2009-04-20 Daniel Gutson ++ ++ Issue #5050 ++ ++ binutils/ ++ * readelf.c (get_arm_section_type_name): Added support for ++ new sections headers. ++ ++ include/elf ++ * arm.h: (SHT_ARM_DEBUGOVERLAY): New define. ++ (SHT_ARM_OVERLAYSECTION): New define. ++ ++ * release-notes-csl.xml: Document. ++ ++2009-04-15 Nathan Froyd ++ ++ * release-notes-csl.xml: Fix typo. ++ ++2009-04-14 Daniel Jacobowitz ++ ++ Issue #1956, #2786, #5144 ++ * release-notes-csl.xml (Mapping symbols): New note. ++ ++ gas/testsuite/ ++ * gas/arm/mapdir.d, gas/arm/mapdir.s: New files. ++ ++ gas/ ++ * config/tc-arm.c (make_mapping_symbol): New function, from ++ mapping_state. Save mapping symbols in the frag. ++ (insert_data_mapping_symbol): New. ++ (mapping_state): Use make_mapping_symbol. ++ (mapping_state_2): New. Provide dummy definition. ++ (opcode_select): Do not call mapping_state. ++ (s_bss): Call md_elf_section_change_hook instead of mapping_state. ++ (arm_handle_align): Update use of tc_frag_data. ++ Call insert_data_mapping_symbol. ++ (arm_init_frag): Update use of tc_frag_data. Call ++ mapping_state_2. ++ (check_mapping_symbols): New function. ++ (arm_adjust_symtab): Use check_mapping_symbols. ++ * config/tc-arm.h (struct arm_frag_type): New. ++ (TC_FRAG_TYPE): Change to struct arm_frag_type. ++ (TC_FRAG_INIT): Pass max_chars. ++ (arm_init_frag): Update prototype. ++ ++ ld/testsuite/ ++ * ld-arm/thumb2-bl-blx-interwork.d: Correct disassembly. ++ * ld-arm/script-type.sym: Add an additional $a mapping symbol. ++ ++ binutils/testsuite/ ++ * binutils-all/arm/thumb2-cond.s: Use instructions. ++ ++2009-04-12 Daniel Jacobowitz ++ ++ Issue #5185 ++ ++ * release-notes-csl.xml (Incorrect placement of linker-generated ++ functions): New note. ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_next_input_section): Skip flags without ++ SEC_CODE. ++ (group_sections): Handle empty lists. ++ ++2009-04-09 Daniel Jacobowitz ++ ++ Issue #4849 ++ ++ * release-notes-csl.xml (Assembler floating point format): New note. ++ ++ gas/testsuite/ ++ * gas/arm/mapmisc.d: Correct expected output for .double and .dcb.d. ++ ++2009-04-09 Daniel Gutson ++ ++ Issue #4502 ++ ++ gas/testsuite/ ++ * gas/arm/arm-it-auto.d: fixed test case dump. ++ ++2009-04-09 Catherine Moore ++ ++ gas/ ++ * config/tc-mips.c (check_for_24k_errata): Adjust if block. ++ Remove return. ++ ++2009-04-09 Daniel Gutson ++ Issue #4502 ++ ++ gas/ ++ * config/tc-arm.c (do_automatic_it): New variable. ++ (it_instruction_type): New enum. ++ (arm_it): New field. ++ (it_state): New enum. ++ (current_it): New struct and global variable. ++ (current_it_compatible): New function. ++ (conditional_insn): New function. ++ (set_it_insn_type): New macro. ++ (set_it_insn_type_last): New macro. ++ (do_t_add_sub): Call automatic IT machinery functions. ++ (do_t_arit3): Likewise. ++ (do_t_arit3c): Likewise. ++ (do_t_blx): Likewise. ++ (do_t_branch): Likewise. ++ (do_t_bkpt): Likewise. ++ (do_t_branch23): Likewise. ++ (do_t_bx): Likewise. ++ (do_t_bxj): Likewise. ++ (do_t_cps): Likewise. ++ (do_t_cpsi): Likewise. ++ (do_t_cbz): Likewise. ++ (do_t_it): Likewise. ++ (encode_thumb2_ldmstm): Likewise. ++ (do_t_ldst): Likewise. ++ (do_t_mov_cmp): Likewise. ++ (do_t_mvn_tst): Likewise. ++ (do_t_mul): Likewise. ++ (do_t_neg): Likewise. ++ (do_t_setend): Likewise. ++ (do_t_shift): Likewise. ++ (do_t_tb): Likewise. ++ (output_it_inst): New function. ++ (new_automatic_it_block): New function. ++ (close_automatic_it_block): New function. ++ (current_it_add_mask): New function. ++ (it_fsm_pre_encode): New function. ++ (handle_it_state): New function. ++ (it_fsm_post_encode): New function. ++ (force_automatic_it_block_close): New function. ++ (in_it_block): New function. ++ (md_assemble): Call automatic IT block machinery functions. ++ (arm_frob_label): Likewise. ++ (arm_opts): New element. ++ * doc/c-arm.texi: New option -mauto-it. ++ ++ gas/testsuite/ ++ * gas/arm/arm-it-auto.d: New test. ++ * gas/arm/arm-it-auto.s: New file. ++ * gas/arm/thumb2_it_auto.d: New test. ++ * gas/arm/thumb2_it_bad.l: Error message updated. ++ * gas/arm/thumb2_it_bad_auto.d: New test. ++ * gas/arm/thumb2_it.d: Comment added. ++ * gas/arm/thumb2_it_bad.d: Comment added. ++ ++ * release-notes-csl.xml: Document. ++ ++2009-04-08 Daniel Gutson ++ ++ gas/testsuite/ ++ * gas/arm/thumb2_it.d: Removed obsolete regex. ++ ++2009-04-08 Paul Brook ++ ++ Issue #5162 ++ bfd/ ++ * elf32-arm.c (make_branch_to_a8_stub): Ignore long branch stubs. ++ ++2009-04-08 Catherine Moore ++ ++ Issue #4593 ++ ++ gas/ ++ * config/tc-mips.c (mips_fix_24k): Declare. ++ (check_for_24k_errata): New. ++ (mips_cleanup): Call check_for_24k_errata. ++ (start_noreorder): Likewise. ++ (md_mips_end): Likewise. ++ (s_change_sec): Likewise. ++ (s_change_section): Likewise. ++ (append_insn): Call check_for_24k_errata. Prevent ++ ERET/DERET instructions from being moved into delay ++ slots. ++ (OPTION_FIX_24K): New. ++ (OPTION_NO_FIX_24k): New. ++ (md_longopts): Add "mfix-24k" and "mno-fix-24k". ++ (md_parse_option): Handle fix-24k options. ++ (md_show_usage): Display fix-24k options. ++ * doc/c-mips.texi: Document. ++ * testsuite/gas/mips/mips.exp: Run new tests. ++ * testsuite/gas/mips/eret.s: New test. ++ * testsuite/gas/mips/eret.d: New test output. ++ * testsuite/gas/mips/eret.l: New test output. ++ ++ * release-notes-csl.xml: New note. ++ ++2009-04-08 Nathan Froyd ++ ++ Issue #5170 ++ ++ * release-notes-csl.xml (tlbilx encoding fix): New note. ++ ++ Backport from mainline: ++ ++ gas/ ++ 2009-04-07 Peter Bergner ++ ++ * ppc-opc.c (powerpc_opcodes) <"tlbilxlpid", "tlbilxpid", "tlbilxva", ++ "tlbilx">: Use secondary opcode "18" as per the ISA 2.06 documentation. ++ Reorder entries so the extended mnemonics are listed before tlbilx. ++ ++ opcodes/ ++ 2009-04-07 Peter Bergner ++ ++ * gas/ppc/e500mc.d: Update to match extended mnemonics. ++ ++2009-04-06 Daniel Gutson ++ ++ Issue #5124 ++ ++ gas/ ++ * config/tc-arm.c (arm_frag_align_code): Fixed the string message. ++ * config/tc-arm.h (MAX_MEM_ALIGNMENT_BYTES): New macro. ++ (MAX_MEM_FOR_RS_ALIGN_CODE): Macro changed to use the above. ++ ++ gas/testsuite/ ++ * gas/arm/align64.d: New file. ++ * gas/arm/align64.s: New file. ++ ++ * release-notes-csl.xml: Document. ++ ++2009-04-06 Andrew Jenner ++ ++ bfd/ ++ * elf32-arm.c: Move sysdep.h to start of file. ++ ++2009-04-06 Kazu Hirata ++ ++ Backport from FSF: ++ ld/ ++ 2009-04-06 Kazu Hirata ++ * ld.texinfo (-L): Mention that -L options do not affect how ld ++ searches for a linker script unless -T option is specified. ++ * ldfile.c (ldfile_find_command_file): Append the path obtained ++ from the program name to the search path instead of ++ prepending. Add a new parameter "default_only". Restrict the ++ search to the default script location if the new parameter is ++ true. ++ (ldfile_open_command_file_1): New. ++ (ldfile_open_command_file): Call ldfile_open_command_file_1. ++ (ldfile_open_default_command_file): New. ++ ++ * ldfile.c (ldfile_find_command_file): Initialize result. ++ ++2009-04-05 Kazu Hirata ++ ++ Issue #5010 ++ binutils/ ++ * objcopy.c (maybe_sign_extend_vma): New. ++ (setup_section): Call maybe_sign_extend_vma after manipulating ++ addresses. ++ ++ * release-notes-csl.xml: Mention the bug fix above. ++ ++2009-04-03 Julian Brown ++ ++ * release-notes-csl.xml (Cortex-A8 erratum workaround enabled ++ for ARMv7-A): Add note. ++ ++2009-04-03 Julian Brown ++ ++ ld/ ++ * emultempl/armelf.em (OPTION_NO_FIX_CORTEX_A8): New. ++ (PARSE_AND_LIST_LONGOPTS): Add --no-fix-cortex-a8 option. Remove ++ argument from --fix-cortex-a8. ++ (PARSE_AND_LIST_OPTIONS): Adjust for --[no-]fix-cortex-a8 syntax. ++ (PARSE_FIX_CORTEX_A8, PARSE_NO_FIX_CORTEX_A8): Handle ++ --[no-]fix-cortex-a8 syntax. ++ * ld.texinfo (--fix-cortex-a8): Document. ++ ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_set_cortex_a8_fix): Re-enable fix by ++ default on ARM v7-A. ++ ++2009-04-03 Nathan Sidwell ++ ++ Issue #5022 ++ ld/ ++ * ldlang.c (lang_leave_output_section_statement): Set lma_region ++ if it is not overridden and section is for the same vma region as ++ the previous section. ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-at.exp: New. ++ * ld-scripts/rgn-at.s: New. ++ * ld-scripts/rgn-at1.d: New. ++ * ld-scripts/rgn-at1.t: New. ++ * ld-scripts/rgn-at2.d: New. ++ * ld-scripts/rgn-at2.t: New. ++ * ld-scripts/rgn-at3.d: New. ++ * ld-scripts/rgn-at3.t: New. ++ ++ * release-notes-csl.xml: Add note. ++ ++2009-04-02 Nathan Sidwell ++ ++ Issues #4842, #5076 ++ gas/ ++ * config/tc-armlinux-eabi.h (FPU_DEFAULT): Default to plain VFP. ++ * config/tc-armeabi.h (FPU_DEFAULT): Likewise. ++ * config/tc-arm.c (md_begin): If FPU_DEFAULT is set, don't infer ++ the default FPU from the processor. ++ ++ gas/testsuite/ ++ * gas/arm/attr-mcpu.d: Add -mfpu=neon. ++ ++ * release-notes-csl.xml: Add note. ++ ++2009-03-31 Paul Brook ++ ++ Issue #1531 ++ ++ bfd/ ++ * bfd-in.h (elf32_arm_fix_exidx_coverage): Add prototype. ++ * bfd-in2.h: Regenerate. ++ * elf32-arm.c (arm_unwind_edit_type, arm_unwind_table_edit): Define. ++ (_arm_elf_section_data): Add text and exidx fields. ++ (add_unwind_table_edit, get_arm_elf_section_data, adjust_exidx_size, ++ insert_cantunwind_after, elf32_arm_fix_exidx_coverage, offset_prel31, ++ copy_exidx_entry): New functions. ++ (elf32_arm_write_section): Fixup .ARM.exidx contents. ++ ++ ld/ ++ * emultempl/armelf.em (compare_output_sec_vma): New function. ++ (gld${EMULATION_NAME}_finish): Add exidx munging code. ++ ++ ld/testsuite/ ++ * ld-arm/arm.ld: Add .ARM.exidx and .ARM.extab. ++ * ld-arm/arm-elf.exp: Add unwind-[1-4]. ++ * ld-arm/unwind-1.d: New test. ++ * ld-arm/unwind-1.s: New test. ++ * ld-arm/unwind-2.d: New test. ++ * ld-arm/unwind-2.s: New test. ++ * ld-arm/unwind-3.d: New test. ++ * ld-arm/unwind-3.s: New test. ++ * ld-arm/unwind-4.d: New test. ++ * ld-arm/unwind-4.s: New test. ++ ++2009-03-30 Andrew Jenner ++ ++ ld/ ++ * emultempl/octeonelf.em: Source mipself.em. ++ ++ gas/ ++ * config/tc-arm.c: Move as.h to start of file. ++ ++2009-03-30 Joseph Myers ++ ++ Issue #5084 ++ ++ Backport from FSF: ++ ++ gas/testsuite/ ++ * gas/arm/mapsecs.d, gas/arm/mapsecs.s: New. ++ ++ opcodes/ ++ * arm-dis.c (print_insn): Also check section matches in backwards ++ search for mapping symbol. ++ ++2009-03-30 Julian Brown ++ ++ bfd/ ++ * elf32-arm.c (a8_erratum_fix): Add r_type, st_type, sym_name, ++ non_a8_stub fields. ++ (find_thumb_glue): Add forward declaration. ++ (elf32_arm_size_stubs): Improve integration of Cortex-A8 erratum ++ workaround and ARM/Thumb interworking. ++ ++ ld/testsuite/ ++ * ld-arm/cortex-a8-fix-b.s: Update for text at 0x8f00. ++ * ld-arm/cortex-a8-fix-bl.s: Likewise. ++ * ld-arm/cortex-a8-fix-bcc.s: Likewise. ++ * ld-arm/cortex-a8-fix-blx.s: Likewise. ++ * ld-arm/cortex-a8-fix-b.d: Update. ++ * ld-arm/cortex-a8-fix-bl.d: Update. ++ * ld-arm/cortex-a8-fix-bcc.d: Update. ++ * ld-arm/cortex-a8-fix-blx.d: Update. ++ * ld-arm/cortex-a8-arm-target.s: New. ++ * ld-arm/cortex-a8-thumb-target.s: New. ++ * ld-arm/cortex-a8-fix-b-rel.s: New. ++ * ld-arm/cortex-a8-fix-b-rel-arm.d: New. ++ * ld-arm/cortex-a8-fix-b-rel-thumb.d: New. ++ * ld-arm/cortex-a8-fix-bl-rel.s: New. ++ * ld-arm/cortex-a8-fix-bl-rel-arm.d: New. ++ * ld-arm/cortex-a8-fix-bl-rel-thumb.d: New. ++ * ld-arm/cortex-a8-fix-bcc-rel.s: New. ++ * ld-arm/cortex-a8-fix-bcc-rel-thumb.d: New. ++ * ld-arm/cortex-a8-fix-blx-rel.s: New. ++ * ld-arm/cortex-a8-fix-blx-rel-arm.d: New. ++ * ld-arm/cortex-a8-fix-blx-rel-thumb.d: New. ++ * ld-arm/arm-elf.exp: Move text section to 0x8f00 in existing ++ Cortex-A8 erratum workaround tests, and add above new tests. ++ ++2009-03-29 Mark Mitchell ++ ++ Backport: ++ ++ 2009-03-28 Mark Mitchell ++ bfd/ ++ * coff-arm.c (coff_arm_merge_private_bfd_data): Use "error:", not ++ "ERROR:", in error messages. ++ * cpu-arm.c (bfd_arm_merge_machines): Likewise. ++ * elf-attrs.c (_bfd_elf_merge_object_attributes): Likewise. ++ * elf32-arm.c (tag_cpu_arch_combine): Likewise. ++ (elf32_arm_merge_eabi_attributes): Likewise. ++ (elf32_arm_merge_private_bfd_data): Likewise. ++ ++2009-03-24 Daniel Jacobowitz ++ ++ bfd/ ++ * elf32-arm.c (INTERWORK_FLAG): Check BFD_LINKER_CREATED. ++ ++2009-03-22 Mark Mitchell ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armelftests): Use -EL for Cortex-A8 tests. ++ ++2009-03-20 Julian Brown ++ ++ * release-notes-csl.xml (Erratum workaround for Cortex-A8 processors): ++ Add note. ++ ++2009-03-20 Julian Brown ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (Cortex-A8 erratum fix, b.w) ++ (Cortex-A8 erratum fix, bl.w, Cortex-A8 erratum fix, bcc.w) ++ (Cortex-A8 erratum fix, blx.w): Pass --fix-cortex-a8 option. ++ ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_set_cortex_a8_fix): Disable fix by ++ default in all cases. ++ ++2009-03-20 Julian Brown ++ ++ gas/ ++ * config/tc-arm.c (do_t_blx): Always use BFD_RELOC_THUMB_PCREL_BLX. ++ (md_pcrel_from_section): Align address for BLX. ++ (tc_gen_reloc): Change BFD_RELOC_THUMB_PCREL_BLX relocations to ++ BFD_RELOC_THUMB_PCREL_BRANCH23 for EABI v4+. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armeabitests): Add thumb2-bl-blx-interwork test. ++ * ld-arm/thumb2-bl-blx-interwork.s: New. ++ * ld-arm/thumb2-bl-blx-interwork.d: New. ++ ++2009-03-20 Andrew Stubbs ++ ++ * release-note-csl.xml: Document issue #4250 changes. ++ ++2009-03-20 Daniel Jacobowitz ++ ++ * release-notes-csl.xml (Incorrect linker-generated functions): New ++ note. ++ ++2009-03-19 Daniel Jacobowitz ++ ++ Issue #4727 ++ ++ ld/ ++ * emultempl/armelf.em (bfd_for_interwork, arm_elf_after_open) ++ (arm_elf_set_bfd_for_interworking): Delete. ++ (arm_elf_before_allocation): Do not set the interworking BFD. ++ Move allocation inside not-dynamic block. ++ (arm_elf_create_output_section_statements): Create glue sections ++ and set the interworking BFD here. ++ (LDEMUL_AFTER_OPEN): Delete. ++ ++ ld/testsuite/ ++ * ld-arm/farcall-mix.d, ld-arm/farcall-mix2.d, ++ ld-arm/farcall-group-size2.d, ld-arm/farcall-group.d: Update for ++ linker changes. ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_write_section): Declare early. ++ (elf32_arm_size_stubs): Skip non-stub sections in the stub BFD. ++ (arm_allocate_glue_section_space): Exclude empty sections. ++ (ARM_GLUE_SECTION_FLAGS): Add SEC_LINKER_CREATED. ++ (bfd_elf32_arm_add_glue_sections_to_bfd): Do not skip the stub ++ BFD. ++ (elf32_arm_output_glue_section, elf32_arm_final_link): New. ++ (elf32_arm_merge_eabi_attributes): Skip the stub BFD. ++ (elf32_arm_size_dynamic_sections): Allocate interworking ++ sections here. ++ (bfd_elf32_bfd_final_link): Define. ++ ++2009-03-18 Daniel Gutson ++ ++ Issue #4753 ++ ++ gas/ ++ * doc/c-arm.texi: Added entries for cpus ARM Cortex-M0 and Cortex-M1. ++ ++2009-03-18 Andrew Stubbs ++ ++ Issue #4250 ++ ++ gas/ ++ * config/tc-arm.c (md_apply_fix): Check BFD_RELOC_ARM_IMMEDIATE and ++ BFD_RELOC_ARM_ADRL_IMMEDIATE value is in the correct section. ++ Check BFD_RELOC_ARM_ADRL_IMMEDIATE has a defined symbol. ++ ++ gas/testsuites/ ++ * gas/arm/adr-invalid.d: New file. ++ * gas/arm/adr-invalid.l: New file. ++ * gas/arm/adr-invalid.s: New file. ++ ++2009-03-17 Daniel Gutson ++ ++ Issue #4753 ++ ++ gas/ ++ * config/tc-arm.c (arm_cpus): Added cortex-m0. ++ ++2009-03-17 Daniel Jacobowitz ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_check_relocs): Correct symbian_p test. ++ ++2009-03-16 Daniel Gutson ++ ++ Issue #4753 ++ ++ * gas/config/tc-arm.c (arm_cpus): Added cortex-m0. ++ ++2009-03-16 Julian Brown ++ ++ ld/ ++ * emultempl/armelf.em (fix_cortex_a8): New. ++ (arm_elf_before_allocation): Call bfd_elf32_arm_set_cortex_a8_fix. ++ (arm_elf_create_output_section_statements): Add fix_cortex_a8 to ++ bfd_elf32_arm_set_target_relocs. ++ (OPTION_FIX_CORTEX_A8): New. ++ (PARSE_AND_LIST_LONGOPTS): Add fix-cortex-a8 options. ++ (PARSE_AND_LIST_OPTIONS): Add fix-cortex-a8 option. ++ (PARSE_AND_LIST_ARGS_CASES): Handle OPTION_FIX_CORTEX_A8. ++ ++ bfd/ ++ * elf32-arm.c (stub_reloc_type): Remove. ++ (THUMB32_INSN, THUMB32_B_INSN): New macros. ++ (insn_sequence): Change type of reloc_type. ++ (elf32_arm_stub_a8_veneer_b_cond, elf32_arm_stub_a8_veneer_b) ++ (elf32_arm_stub_a8_veneer_blx): New stub sequences. ++ (elf32_arm_stub_type): Add arm_stub_a8_veneer_b_cond, ++ arm_stub_a8_veneer_b, arm_stub_a8_veneer_bl and ++ arm_stub_a8_veneer_blx. ++ (_arm_elf_section_data): Add target_addend field. ++ (a8_erratum_fix, a8_erratum_reloc): New structs. ++ (elf32_arm_link_hash_table): Add a8_erratum_fixes, ++ num_a8_erratum_fixes, fix_cortex_a8. ++ (elf32_arm_link_hash_table_create): Zero fix_cortex_a8. ++ (elf32_arm_final_link_relocate): Add forward declaration. ++ (arm_build_one_stub): Add support for THUMB32_TYPE, Thumb-2 ++ relocations, multiple relocations per stub. ++ (find_stub_size_and_template): New. ++ (arm_size_one_stub): Use find_stub_size_and_template. ++ (a8_reloc_compare): New. ++ (elf32_arm_size_stubs): Add Cortex-A8 erratum workaround support. ++ (bfd_elf32_arm_set_cortex_a8_fix): New. ++ (bfd_elf32_arm_set_target_relocs): Add fix_cortex_a8 argument. ++ (arm_map_one_stub): Add THUMB32_TYPE support. ++ (a8_branch_to_stub_data): New. ++ (make_branch_to_a8_stub): New. ++ (elf32_arm_write_section): Add Cortex-A8 erratum workaround support. ++ * bfd-in.h (bfd_elf32_arm_set_cortex_a8_fix): New. ++ * bfd-in2.h: Regenerate. ++ ++ ld/testsuite/ ++ * ld-arm/cortex-a8-fix-b.s: New. ++ * ld-arm/cortex-a8-fix-b.d: New. ++ * ld-arm/cortex-a8-fix-bl.s: New. ++ * ld-arm/cortex-a8-fix-bl.d: New. ++ * ld-arm/cortex-a8-fix-bcc.s: New. ++ * ld-arm/cortex-a8-fix-bcc.d: New. ++ * ld-arm/cortex-a8-fix-blx.s: New. ++ * ld-arm/cortex-a8-fix-blx.d: New. ++ ++2009-03-16 Andrew Stubbs ++ ++ * release-notes-csl.xml: Document linker bug fix. ++ ++2009-03-16 Andrew Stubbs ++ ++ bfd/ ++ * dwarf2.c (read_section): Always use rawsize, if available. ++ ++ Backport ++ 2009-03-16 Alan Modra ++ * simple.c (bfd_simple_get_relocated_section_contents): Use larger ++ of rawsize and size for buffer. ++ ++2009-03-12 Andrew Stubbs ++ ++ bfd/ ++ * dwarf2.c (read_section): Always check the offset, even when the ++ section has been read before. ++ ++2009-03-11 Joseph Myers ++ ++ binutils/testsuite/ ++ * binutils-all/objdump.W, binutils-all/objdump.s: Don't match ++ literal "tmpdir/" in expected output. ++ ++2009-03-09 Catherine Moore ++ ++ Issue #4861 ++ ++ Backport from FSF: ++ ++ 2009-03-03 Alan Modra ++ ++ * objdump.c (disassemble_section): Mask address before sign ++ extending. ++ ++2009-03-08 Mark Mitchell ++ ++ ld/testsuite/ ++ * ld-elfcomm/elfcomm.exp: Compile with -fcommon. ++ ++2009-03-06 Catherine Moore ++ ++ Issue # 4861 ++ ++ Backport from FSF: ++ ++ 2009-03-05 Nick Clifton ++ ++ * objdump.c (disassemble_section): If the computed next offset is ++ not beyond the current offset then just continue to the end. ++ ++2009-03-05 Joseph Myers ++ ++ Issue #4808 ++ ++ Backport from FSF: ++ ++ gas/ ++ 2009-03-05 Joseph Myers ++ * read.c (s_fill, s_space, s_float_space, float_cons, stringer, ++ s_incbin): Call md_cons_align (1). ++ ++ gas/testsuite/ ++ 2009-03-05 Joseph Myers ++ * gas/arm/mapmisc.d, gas/arm/mapmisc.dat, gas/arm/mapmisc.s: New. ++ ++2009-03-01 Mark Mitchell ++ ++ Issue #4781 ++ ++ * release-notes-csl.xml: Document change. ++ gas/ ++ * config/tc-arm.c (md_assemble): Allow barrier instructions on ++ ARMv6-M cores. ++ gas/testsuite/ ++ * arm/archv6m.s: Add dmb, dsb, and isb. ++ * arm/archv6m.d: Likewise. ++ ++2009-02-24 Sandra Loosemore ++ ++ Issue #2369 ++ Patch applied simultaneously on mainline. ++ ++ ld/ ++ * ld.texinfo (Options): Correct typos in example. Recommend ++ using joined forms of syntax for passing options with arguments ++ from a driver. ++ (-a): Use consistent syntax for documenting option arguments. ++ Clean up indexing and markup. ++ (-A/--architecture): Likewise. ++ (-f/--auxiliary): Likewise. ++ (-F/--filter): Likewise. ++ (-fini): Likewise. ++ (-G/--gpsize): Likewise. ++ (-h/-soname):Likewise. ++ (-init): Likewise. ++ (-l/--library): Likewise. ++ (-L/--library-path): Likewise. ++ (-m): Likewise. ++ (--defsym): Likewise. ++ (-I/--dynamic-linker): Likewise. ++ (-Map): Likewise. ++ (--oformat): Likewise. ++ (--retain-symbols-file): Likewise. ++ (-rpath): Likewise. ++ (-rpath-link): Likewise. ++ (--sort-common): Likewise. ++ (--sort-section): Likewise. ++ (--split-by-file): Likewise. ++ (--split-by-reloc): Likewise. ++ (--sysroot): Likewise. ++ (--section-start): Likewise. ++ (-Tbss, -Tdata, -Ttext): Likewise. ++ (-Ttext-segment): Likewise. ++ (--version-script): Likewise. ++ (--wrap): Likewise. ++ ++2009-02-24 Maxim Kuvyrkov ++ ++ Revert: ++ ++ 2009-02-19 Maxim Kuvyrkov ++ Issue #4600 ++ ++ bfd/ ++ * elf.c (_bfd_elf_map_sections_to_segments): Fix sanity check. ++ ++ 2008-03-25 Maxim Kuvyrkov ++ ++ bfd/ ++ ++ * elf.c (_bfd_elf_map_sections_to_segments): Check user's ++ mapping of section to segments. ++ ++2009-02-22 Mark Mitchell ++ ++ * release-notes-csl.xml: Document change. ++ gas/ ++ * config/tc-arm.c (warn_deprecated_sp): New macro. ++ (do_t_mov_cmp): Permit R13 as the second ++ argument to "cmp.n". ++ gas/testsuite/ ++ * gas/arm/thumb2_bad_reg.s: Update. ++ * gas/arm/thumb2_bad_reg.l: Likewise. ++ ++2009-02-23 Daniel Jacobowitz ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_stub_long_branch_any_any_pic): Rename ++ to elf32_arm_stub_long_branch_any_arm_pic. ++ (elf32_arm_stub_long_branch_any_thumb_pic): New. ++ (enum elf32_arm_stub_type, arm_type_of_stub) ++ (arm_size_one_stub): Handle any to ARM PIC and any to Thumb PIC ++ separately. ++ ++ ld/testsuite/ ++ * ld-arm/farcall-arm-thumb-blx-pic-veneer.d, ++ ld-arm/farcall-arm-thumb-pic-veneer.d, ++ ld-arm/farcall-thumb-thumb-blx-pic-veneer.d: Update for fixed ++ Thumb PIC stub. ++ ++2009-02-23 Joseph Myers ++ ++ bfd/ ++ * elf32-arm.c (PREV_SEC): Update comment. ++ (group_sections): Rename argument to stubs_always_after_branch. ++ Reverse the list and place stubs at the end of input sections. ++ Undefine NEXT_SEC. ++ (elf32_arm_size_stubs): Update to use stubs_always_after_branch. ++ ++ ld/ ++ * ld.texinfo (ARM): Document changed meaning of --stub-group-size. ++ * emultempl/armelf.em (hook_in_stub): Insert after the input section. ++ (elf32_arm_add_stub_section): Update comment. ++ (PARSE_AND_LIST_OPTIONS): Update help for --stub-group-size. ++ ++2009-02-23 Daniel Jacobowitz ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armeabitests): Update duplicate test names. ++ Use normal output files for big-endian. ++ * ld-arm/farcall-arm-arm-be.d, ld-arm/farcall-thumb-arm-be.d: Delete. ++ * ld-arm/farcall-arm-arm-be8.d, ld-arm/farcall-arm-arm-pic-veneer.d, ++ ld-arm/farcall-arm-arm.d, ld-arm/farcall-arm-thumb-blx-pic-veneer.d, ++ ld-arm/farcall-arm-thumb-blx.d, ld-arm/farcall-arm-thumb-pic-veneer.d, ++ ld-arm/farcall-arm-thumb.d, ld-arm/farcall-group-size2.d, ++ ld-arm/farcall-group.d, ld-arm/farcall-mix.d, ld-arm/farcall-mix2.d, ++ ld-arm/farcall-thumb-arm-be8.d, ++ ld-arm/farcall-thumb-arm-blx-pic-veneer.d, ++ ld-arm/farcall-thumb-arm-blx.d, ld-arm/farcall-thumb-arm-short.d, ++ ld-arm/farcall-thumb-arm.d, ++ ld-arm/farcall-thumb-thumb-blx-pic-veneer.d, ++ ld-arm/farcall-thumb-thumb-blx.d, ld-arm/farcall-thumb-thumb-m.d, ++ ld-arm/farcall-thumb-thumb.d, ld-arm/thumb2-bl-as-thumb1-bad.d, ++ ld-arm/thumb2-bl-bad.d: Update for moved stubs. ++ ++2009-02-23 Daniel Jacobowitz ++ ++ Backport: ++ ++ 2009-02-23 Daniel Jacobowitz ++ ++ bfd/ ++ * elf32-arm.c (arm_build_one_stub): Initialize stub_reloc_offset. ++ Fix formatting. ++ (arm_size_one_stub): Remove unnecessary break. ++ (arm_map_one_stub): Fix formatting. Return after BFD_FAIL. ++ ++ 2009-02-23 Daniel Jacobowitz ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armeabitests): Run new tests. Correct BE8 output ++ filename. ++ * ld-arm/farcall-arm-arm-be.d, ld-arm/farcall-thumb-arm-be.d: New. ++ ++ 2009-02-23 Christophe Lyon ++ ++ bfd/ ++ * elf32-arm.c (stub_insn_type): New type. ++ (stub_reloc_type): Likewise. ++ (insn_sequence): Likewise. ++ (elf32_arm_stub_long_branch_any_any): Encode using insn_sequence. ++ (elf32_arm_stub_long_branch_v4t_arm_thumb): Likewise. ++ (elf32_arm_stub_long_branch_thumb_only): Likewise. ++ (elf32_arm_stub_long_branch_v4t_thumb_arm): Likewise. ++ (elf32_arm_stub_short_branch_v4t_thumb_arm): Likewise. ++ (elf32_arm_stub_long_branch_any_any_pic): Likewise. ++ (elf32_arm_stub_hash_entry): Add new helper fields. ++ (stub_hash_newfunc): Initialize these new fields. ++ (arm_build_one_stub): Encode Arm and Thumb instructions separately ++ to take endianness into account. ++ (arm_size_one_stub): Compute size of stubs using insn_sequence. ++ (arm_map_one_stub): Code is now more generic, thanks to ++ insn_sequence. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Add new farcall-thumb-arm-be8 test. ++ * ld-arm/farcall-thumb-arm-be8.d: New expected result. ++ * ld-arm/farcall-arm-arm-be8.d: Replace wildcards by instructions. ++ ++ 2009-02-23 Christophe Lyon ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_stub_long_branch_thumb_only): Fix stub ++ code. ++ (elf32_arm_stub_long_branch_v4t_thumb_arm): Likewise. ++ (arm_type_of_stub): Use Thumb-only long branch stub (non-PIC) when ++ BLX is not available. Fix typo in warning message. Add comments ++ and improve formatting. ++ (arm_build_one_stub): Adjust to new ++ elf32_arm_stub_long_branch_v4t_thumb_arm stub. ++ (arm_map_one_stub): Likewise. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Rewrite non-EABI variants of ++ thumb2-bl-as-thumb1-bad and thumb2-bl-bad tests, which now ++ pass. farcall-thumb-thumb now passes in EABI mode. ++ * ld-arm/farcall-thumb-arm-pic-veneer.d: Fixed name, source, as ++ and ld flags to match intended test. ++ * ld-arm/farcall-thumb-arm.d: New expected result. ++ * ld-arm/farcall-thumb-thumb-m.d: Likewise. ++ * ld-arm/farcall-thumb-thumb-m-pic-veneer.d: Fixed name and ld ++ flags. ++ * ld-arm/farcall-thumb-thumb-pic-veneer.d: Likewise. ++ * ld-arm/farcall-thumb-thumb.d: New expected result, this test is ++ now expected to pass. ++ * ld-arm/thumb2-bl-as-thumb1-bad-noeabi.d: Likewise. ++ * ld-arm/thumb2-bl-bad-noeabi.d: Likewise. ++ * ld-arm/thumb2-bl-as-thumb1-bad.d: Update addresses according to ++ new use. ++ * ld-arm/thumb2-bl-as-thumb1-bad.s: Update comment. ++ ++ 2009-02-18 Christophe Lyon ++ ++ bfd/ ++ * elf32-arm.c (arm_build_one_stub): Fix relocation target for pic ++ stub. Catch default case error. ++ (arm_map_one_stub): Add missing Thumb mapping symbol. ++ ++ ld/testsuite/ ++ * ld-arm/farcall-arm-arm-pic-veneer.d, ++ ld-arm/farcall-arm-thumb-blx-pic-veneer.d, ++ ld-arm/farcall-arm-thumb-pic-veneer.d, ++ ld-arm/farcall-thumb-arm-blx-pic-veneer.d, ++ ld-arm/farcall-thumb-thumb-blx-pic-veneer.d: Fix expected stub ++ target. ++ ++ 2009-02-16 Christophe Lyon ++ ++ bfd/ ++ * elf32-arm.c (arm_long_branch_stub, ++ arm_thumb_v4t_long_branch_stub, ++ arm_thumb_thumb_long_branch_stub, ++ arm_thumb_arm_v4t_long_branch_stub, ++ arm_thumb_arm_v4t_short_branch_stub, ++ arm_pic_long_branch_stub): ++ Renamed to elf32_arm_stub_long_branch_any_any, ++ elf32_arm_stub_long_branch_v4t_arm_thumb, ++ elf32_arm_stub_long_branch_thumb_only, ++ elf32_arm_stub_long_branch_v4t_thumb_arm, ++ elf32_arm_stub_short_branch_v4t_thumb_arm, ++ elf32_arm_stub_long_branch_any_any_pic. ++ (arm_stub_long_branch, arm_thumb_v4t_stub_long_branch, ++ arm_thumb_thumb_stub_long_branch, ++ arm_thumb_arm_v4t_stub_long_branch, ++ arm_thumb_arm_v4t_stub_short_branch, arm_stub_pic_long_branch): ++ Renamed to arm_stub_long_branch_any_any, ++ arm_stub_long_branch_v4t_arm_thumb, ++ arm_stub_long_branch_thumb_only, ++ arm_stub_long_branch_v4t_thumb_arm, ++ arm_stub_short_branch_v4t_thumb_arm, ++ arm_stub_long_branch_any_any_pic. ++ ++2009-02-22 Mark Mitchell ++ ++ Issue #4694 ++ * release-notes-csl.xml: Document fix. ++ Backport: ++ libiberty/ ++ 2009-02-21 Mark Mitchell ++ * make-temp-file.c (): Include on Windows. ++ (choose_tmpdir): On Windows, use GetTempPath. ++ ++2009-02-19 Maxim Kuvyrkov ++ ++ Issue #4600 ++ ++ bfd/ ++ * elf.c (_bfd_elf_map_sections_to_segments): Fix sanity check. ++ ++2009-02-18 Nathan Sidwell ++ ++ Issue #4577 ++ gas/ ++ * config/tc-arm.c (do_nop): Generate v6k nops whenever possible. ++ (arm_handle_align): Generate v6k ARM, thumb2 wide & narrow nops ++ whenever possible. ++ ++ gas/testsuite/ ++ * gas/arm/align.s, gas/arm/align.d: New. ++ * gas/arm/thumb32.d, gas/arm/arch6zk.d, gas/arm/arch6zk.s, ++ arm/thumb2_relax.d: Adjust for align changes. ++ ++2009-02-05 Joseph Myers ++ ++ bfd/ ++ * elf.c: Revert local version of issue 3598 patch. ++ ++2009-02-05 Joseph Myers ++ ++ bfd/ ++ * elflink.c: Resync with upstream. ++ ++ binutils/ ++ * sysdep.h: Resync with upstream. ++ ++2009-02-05 Joseph Myers ++ ++ gas/ ++ * config/tc-m68k.c: Resync whitespace with upstream. ++ * config/tc-mips.c: Remove duplicate 74kf3_2 entry. ++ ++ gas/testsuite/ ++ * gas/arm/backslash-at.d: Resync with upstream. ++ ++ include/opcode/ ++ * mips.h: Remove relics of old Octeon support. ++ ++2009-02-05 Joseph Myers ++ ++ gas/ ++ * config/tc-mips.c: Remove relics of old Octeon support. Adjust ++ error checking in line with ++ . ++ ++ gas/testsuite/ ++ * gas/mips/octeon1.l, gas/mips/octeon3.d, gas/mips/octeon3.s: ++ Update for assembler changes. ++ ++ opcodes/ ++ * mips-dis.c: Remove relics of old Octeon support. ++ * mips-opc.c: Restore Octeon sync instructions. ++ ++2009-02-04 Maxim Kuvyrkov ++ ++ Clean up m68k TLS implementation after upstream contribution. ++ ++ ld/testsuite/ ++ * ld-m68k/tls-gd-ie-1.d: Update. ++ * ld-m68k/tls-gd-3.d, ld-m68k/tls-gd-3.s: Move to gas testsuite. ++ * ld-m68k/m68k.exp (merge isa-a isa-a:nodiv): Fix test. ++ (tls-*): Run only for m68k-*-linux* targets. ++ ++ gas/testsuite/ ++ * gas/m68k/tls-gd-3.d, gas/m68k/tls-gd-3.s: New test. ++ * gas/m68k/all.exp: Run it. ++ ++ gas/ ++ * config/tc-m68k.c: Fix whitespace. ++ ++ bfd/ ++ * elf32-m68k.c: Fix formatting. ++ (elf_m68k_relocate_section): Remove duplicate code. Use ++ SYMBOL_REFERENCES_LOCAL. ++ (elf_m68k_finish_dynamic_symbol): Use SYMBOL_REFERENCES_LOCAL. ++ ++2009-02-04 Andrew Jenner ++ ++ gas/ ++ * configure.tgt: Handle mips-montavista-elf. ++ ++2009-02-03 Kazu Hirata ++ ++ config/ ++ * mh-mingw (BOOT_CFLAGS): Remove -D__USE_MINGW_ACCESS. ++ (CFLAGS): Comment out. ++ ++ libiberty/ ++ * cygpath.c (msvcrt_dll): Change the return type to HMODULE. ++ (msvcrt_fopen): Use HMODULE for the return value from msvcrt_dll.OB ++ ++2009-02-03 Joseph Myers ++ ++ Issue #4540 ++ ++ bfd/ ++ * elfxx-mips.c (_bfd_mips_elf_section_processing): Remove special ++ .sbss handling. ++ ++2009-02-02 Kazu Hirata ++ ++ gprof/ ++ * gprof.h: Include gconfig.h. #undef PACKAGE. ++ ++ ld/ ++ * gprof.h: Include config.h. ++ ++2009-01-30 Catherine Moore ++ ++ bfd/ ++ elf32-m68k.c (elf_m68k_relocate_section): Pass relocation ++ type to elf_m68k_init_got_entry_key. ++ ++2009-01-29 Joseph Myers ++ ++ bfd/ ++ * elf32-arm.c: Resync whitespace with upstream. ++ ++ gas/ ++ * doc/c-mips.texi: Remove duplicate 74kf3_2 entry. ++ ++ ld/ ++ * configure.in: Replace AC_ERROR with AC_MSG_ERROR. ++ * emultempl/m68kelf.em: Resync whitespace with upstream. ++ ++2009-01-29 Catherine Moore ++ ++ bfd/ ++ elfxx-mips.c (mips_elf_calculate_relocation): Add check ++ for (h != NULL). ++ ++2009-01-28 Joseph Myers ++ ++ bfd/ ++ * elfxx-mips.c (mips_mach_extensions): Remove duplicate Octeon ++ entry. ++ ++ gas/ ++ * config/tc-mips.c (CPU_HAS_DROR): Remove Octeon handling. ++ (CPU_HAS_INS): Remove. ++ ++ gas/testsuite/ ++ * gas/mips/mips.exp: Resync whitespace with upstream. ++ ++ include/elf/ ++ * mips.h: Resync whitespace with upstream. ++ ++ include/opcode/ ++ * mips.h (OPCODE_IS_MEMBER): Remove duplicate Octeon check. ++ ++ opcodes/ ++ * mips-opc.c (mips_builtin_opcodes): Remove duplicate pop ++ instruction. ++ ++2009-01-28 Joseph Myers ++ ++ * config.sub: Remove XLR targets. ++ * configure.ac: Move mips*-sde-elf* case to upstream location. ++ Don't add target-sdemdi. ++ * configure: Regenerate. ++ ++ bfd/ ++ * elf.c: Remove duplicate if conditional. ++ * elf32-m68k.c: Remove conflict marker. ++ * elfxx-mips.c: Resync whitespace with upstream. Remove duplicate ++ comment. ++ ++ config/ ++ * mt-sde: Revert difference from upstream. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Remove duplicate runs of some tests. ++ ++ opcodes/ ++ * ppc-dis.c: Remove duplicate if conditional. ++ ++2009-01-25 Maxim Kuvyrkov ++ ++ bfd/ ++ * elf32-m68k.c (elf_m68k_finalize_got_offsets): Fix condition. ++ ++2009-01-25 Maxim Kuvyrkov ++ ++ bfd/ ++ * elf32-m68k.c (struct elf_m68k_finalize_got_offsets_arg): Remove ++ use_neg_got_offsets_p field. ++ (elf_m68k_finalize_got_offsets_1, elf_m68k_finalize_got_offsets): ++ Update, don't use not initialized data, initialize data before ++ using it. ++ ++2009-01-21 Andrew Stubbs ++ ++ Issue #4300 ++ ++ gas/ ++ * config/tc-arm.c (attributes_set_explicitly): New array. ++ (s_arm_eabi_attribute): Check return value from s_vendor_attribute. ++ (cpu_arch): Add ARM_ARCH_V5T. ++ (aeabi_set_attribute_int): New function. ++ (aeabi_set_attribute_string): New function. ++ (aeabi_set_public_attributes): Set attributes according to the user's ++ intentions, rather than the actual state of the binary. ++ Use aeabi_set_attribute_int and aeabi_set_attribute_string instead of ++ bfd_elf_add_proc_attr_int and bfd_elf_add_proc_attr_string. ++ Support WMMXv2. Use attribute names instead of numbers. ++ * read.c (s_vendor_attribute): Change return type to int. ++ Return the tag number that was set. ++ * read.h (s_vendor_attribute): Change return type to int. ++ ++ gas/testsuite/ ++ * gas/arm/attr-cpu-directive.d: New file. ++ * gas/arm/attr-cpu-directive.s: New file. ++ * gas/arm/attr-default.d: New file. ++ * gas/arm/attr-march-all.d: New file. ++ * gas/arm/attr-march-armv1.d: New file. ++ * gas/arm/attr-march-armv2.d: New file. ++ * gas/arm/attr-march-armv2a.d: New file. ++ * gas/arm/attr-march-armv2s.d: New file. ++ * gas/arm/attr-march-armv3.d: New file. ++ * gas/arm/attr-march-armv3m.d: New file. ++ * gas/arm/attr-march-armv4.d: New file. ++ * gas/arm/attr-march-armv4t.d: New file. ++ * gas/arm/attr-march-armv4txm.d: New file. ++ * gas/arm/attr-march-armv4xm.d: New file. ++ * gas/arm/attr-march-armv5.d: New file. ++ * gas/arm/attr-march-armv5t.d: New file. ++ * gas/arm/attr-march-armv5te.d: New file. ++ * gas/arm/attr-march-armv5tej.d: New file. ++ * gas/arm/attr-march-armv5texp.d: New file. ++ * gas/arm/attr-march-armv5txm.d: New file. ++ * gas/arm/attr-march-armv6-m.d: New file. ++ * gas/arm/attr-march-armv6.d: New file. ++ * gas/arm/attr-march-armv6j.d: New file. ++ * gas/arm/attr-march-armv6k.d: New file. ++ * gas/arm/attr-march-armv6kt2.d: New file. ++ * gas/arm/attr-march-armv6t2.d: New file. ++ * gas/arm/attr-march-armv6z.d: New file. ++ * gas/arm/attr-march-armv6zk.d: New file. ++ * gas/arm/attr-march-armv6zkt2.d: New file. ++ * gas/arm/attr-march-armv6zt2.d: New file. ++ * gas/arm/attr-march-armv7-a.d: New file. ++ * gas/arm/attr-march-armv7-m.d: New file. ++ * gas/arm/attr-march-armv7-r.d: New file. ++ * gas/arm/attr-march-armv7.d: New file. ++ * gas/arm/attr-march-armv7a.d: New file. ++ * gas/arm/attr-march-armv7m.d: New file. ++ * gas/arm/attr-march-armv7r.d: New file. ++ * gas/arm/attr-march-iwmmxt.d: New file. ++ * gas/arm/attr-march-iwmmxt2.d: New file. ++ * gas/arm/attr-march-marvell-f.d: New file. ++ * gas/arm/attr-march-xscale.d: New file. ++ * gas/arm/attr-mcpu.d: New file. ++ * gas/arm/attr-mfpu-arm1020e.d: New file. ++ * gas/arm/attr-mfpu-arm1020t.d: New file. ++ * gas/arm/attr-mfpu-arm1136jf-s.d: New file. ++ * gas/arm/attr-mfpu-arm1136jfs.d: New file. ++ * gas/arm/attr-mfpu-arm7500fe.d: New file. ++ * gas/arm/attr-mfpu-fpa.d: New file. ++ * gas/arm/attr-mfpu-fpa10.d: New file. ++ * gas/arm/attr-mfpu-fpa11.d: New file. ++ * gas/arm/attr-mfpu-fpe.d: New file. ++ * gas/arm/attr-mfpu-fpe2.d: New file. ++ * gas/arm/attr-mfpu-fpe3.d: New file. ++ * gas/arm/attr-mfpu-maverick.d: New file. ++ * gas/arm/attr-mfpu-neon-fp16.d: New file. ++ * gas/arm/attr-mfpu-neon.d: New file. ++ * gas/arm/attr-mfpu-softfpa.d: New file. ++ * gas/arm/attr-mfpu-softvfp+vfp.d: New file. ++ * gas/arm/attr-mfpu-softvfp.d: New file. ++ * gas/arm/attr-mfpu-vfp.d: New file. ++ * gas/arm/attr-mfpu-vfp10-r0.d: New file. ++ * gas/arm/attr-mfpu-vfp10.d: New file. ++ * gas/arm/attr-mfpu-vfp3.d: New file. ++ * gas/arm/attr-mfpu-vfp9.d: New file. ++ * gas/arm/attr-mfpu-vfpv2.d: New file. ++ * gas/arm/attr-mfpu-vfpv3-d16.d: New file. ++ * gas/arm/attr-mfpu-vfpv3.d: New file. ++ * gas/arm/attr-mfpu-vfpxd.d: New file. ++ * gas/arm/attr-order.d: Update Tag_ARM_ISA_use and Tag_THUMB_ISA_use. ++ * gas/arm/attr-override-cpu-directive.d: New file. ++ * gas/arm/attr-override-cpu-directive.s: New file. ++ * gas/arm/attr-override-mcpu.d: New file. ++ * gas/arm/attr-override-mcpu.s: New file. ++ * gas/arm/blank.s: New file. ++ * gas/arm/eabi_attr_1.d: Update Tag_ARM_ISA_use and Tag_THUMB_ISA_use. ++ ++ ld/testsuite/ ++ * ld-arm/attr-merge-3.attr: Update following gas change. ++ * ld-arm/attr-merge-2.attr: Update Tag_ARM_ISA_use and ++ Tag_THUMB_ISA_use following gas changes. ++ * ld-arm/attr-merge-4.attr: Likewise. ++ * ld-arm/attr-merge-5.attr: Likewise. ++ * ld-arm/attr-merge-arch-1.attr: Likewise. ++ * ld-arm/attr-merge-arch-2.attr: Likewise. ++ * ld-arm/attr-merge-unknown-2.d: Likewise. ++ * ld-arm/attr-merge-unknown-2r.d: Likewise. ++ * ld-arm/attr-merge-unknown-3.d: Likewise. ++ * ld-arm/attr-merge-wchar-00-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-00.d: Likewise. ++ * ld-arm/attr-merge-wchar-02-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-02.d: Likewise. ++ * ld-arm/attr-merge-wchar-04-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-04.d: Likewise. ++ * ld-arm/attr-merge-wchar-20-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-20.d: Likewise. ++ * ld-arm/attr-merge-wchar-22-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-22.d: Likewise. ++ * ld-arm/attr-merge-wchar-24-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-40-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-40.d: Likewise. ++ * ld-arm/attr-merge-wchar-42-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-44-nowarn.d: Likewise. ++ * ld-arm/attr-merge-wchar-44.d: Likewise. ++ * ld-arm/attr-merge.attr: Likewise. ++ ++2009-01-21 Andrew Stubbs ++ ++ bfd/ ++ * elf-attrs.c (is_default_attr): Substitute magic numbers with macros. ++ (obj_attr_size): Likewise. ++ (write_obj_attribute): Likewise. ++ (_bfd_elf_copy_obj_attributes): Likewise. ++ (_bfd_elf_parse_attributes): Likewise. ++ * elf-bfd.h (ATTR_TYPE_FLAG_INT_VAL): New define. ++ (ATTR_TYPE_FLAG_STR_VAL, ATTR_TYPE_FLAG_NO_DEFAULT): New defines. ++ (ATTR_TYPE_HAS_INT_VAL, ATTR_TYPE_HAS_STR_VAL): New defines. ++ (ATTR_TYPE_HAS_NO_DEFAULT): New define. ++ * elf32-arm.c (elf32_arm_obj_attrs_arg_type): Replace magic numbers ++ with macros. ++ ++2009-01-06 Andrew Stubbs ++ ++ * release-notes-csl.xml: Document ARM attributes improvements. ++ ++2009-01-01 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ 2008-12-23 Nick Clifton ++ PR 7093 ++ * elf32-arm.c (bfd_elf32_arm_init_maps): Only process ARM ELF ++ object files. ++ ++2008-12-24 Andrew Stubbs ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armeabitests): Add EABI attribute merging 3, ++ EABI attribute merging 4, and EABI attribute merging 5, ++ EABI attribute arch merging 1, EABI attribute arch merging 1 reversed, ++ EABI attribute arch merging 2, EABI attribute arch merging 2 reversed. ++ Add attr-merge-unknown-1, attr-merge-unknown-2, attr-merge-unknown-2r, ++ and attr-merge-unknown-3 dump tests. ++ * ld-arm/arch-v6.s: New file. ++ * ld-arm/arch-v6k.s: New file. ++ * ld-arm/arch-v6t2.s: New file. ++ * ld-arm/attr-merge-3.attr: New file. ++ * ld-arm/attr-merge-3a.s: New file. ++ * ld-arm/attr-merge-3b.s: New file. ++ * ld-arm/attr-merge-4.attr: New file. ++ * ld-arm/attr-merge-4a.s: New file. ++ * ld-arm/attr-merge-4b.s: New file. ++ * ld-arm/attr-merge-5.attr: New file. ++ * ld-arm/attr-merge-5.s: New file. ++ * ld-arm/attr-merge-arch-1.attr: New file. ++ * ld-arm/attr-merge-arch-2.attr: New file. ++ * ld-arm/attr-merge-unknown-1.d: New file. ++ * ld-arm/attr-merge-unknown-1.s: New file. ++ * ld-arm/attr-merge-unknown-2.d: New file. ++ * ld-arm/attr-merge-unknown-2.s: New file. ++ * ld-arm/attr-merge-unknown-2r.d: New file. ++ * ld-arm/attr-merge-unknown-3.d: New file. ++ * ld-arm/blank.s: New file. ++ ++2008-12-24 Andrew Stubbs ++ ++ bfd/ ++ * elf-attrs.c (vendor_set_obj_attr_contents): Support tag ordering. ++ * elf-bfd.h (elf_backend_data): Add obj_attrs_order. ++ * elf32-arm.c (elf32_arm_obj_attrs_order): New function. ++ (elf_backend_obj_attrs_order): New define. ++ * elfxx-target.h (elf_backend_obj_attrs_order): New define. ++ (elfNN_bed): Add elf_backend_obj_attrs_order. ++ ++ gas/testsuite/ ++ * gas/arm/attr-order.d: New file. ++ * gas/arm/attr-order.s: New file. ++ ++2008-12-24 Andrew Stubbs ++ ++ bfd/ ++ * elf-attrs.c (is_default_attr): Support defaultless attributes. ++ (bfd_elf_add_obj_attr_int): Get type from _bfd_elf_obj_attrs_arg_type. ++ (bfd_elf_add_obj_attr_string): Likewise. ++ (bfd_elf_add_obj_attr_int_string): Likewise. ++ (_bfd_elf_parse_attributes): Allow for unknown flag bits in type. ++ * elf-bfd.h (struct obj_attribute): Document new flag bit. ++ * elf32-arm.c (elf32_arm_obj_attrs_arg_type): Specify that ++ Tag_nodefaults has no default value. ++ (elf32_arm_merge_eabi_attributes): Modify the Tag_nodefaults ++ comment to reflect the new state. ++ ++ gas/ ++ * read.c (s_vendor_attribute): Allow for unknown flag bits in type. ++ ++2008-12-24 Andrew Stubbs ++ Daniel Jacobowitz ++ ++ Issue #1581 ++ ++ gas/ ++ * config/tc-arm.c (arm_copy_symbol_attributes): New function. ++ * config/tc-arm.h (arm_copy_symbol_attributes): New prototype. ++ (CONVERT_SYMBOLIC_ATTRIBUTE): New define. ++ * read.c (s_vendor_attribute): Add support for symbolic tag names. ++ Improve string parser. ++ * doc/c-arm.texi (ARM Machine Directives): Document ++ .eabi_attribute symbolic tag names. ++ ++ gas/testsuite/ ++ * gas/arm/attr-syntax.d: New file. ++ * gas/arm/attr-syntax.s: New file. ++ ++2008-12-24 Andrew Stubbs ++ Julian Brown ++ ++ bfd/ ++ * elf-bfd.h (NUM_KNOWN_OBJ_ATTRIBUTES): Set to 71 to include all known ++ ARM attributes in ABI 2.07. ++ * elf32-arm.c (get_secondary_compatible_arch): New function. ++ (set_secondary_compatible_arch): New function. ++ (tag_cpu_arch_combine): New function. ++ (elf32_arm_copy_one_eabi_other_attribute): Delete function. ++ (elf32_arm_copy_eabi_other_attribute_list): Delete function. ++ (elf32_arm_merge_eabi_attributes): Rename order_312 to order_021 to ++ make it fit with order_01243. ++ Add support for Tag_also_compatible_with, ++ Tag_CPU_unaligned_access, Tag_T2EE_use, Tag_Virtualization_use, ++ Tag_MPextension_use, Tag_nodefaults and Tag_conformance. ++ Improve/tidy up support for Tag_CPU_raw_name, Tag_CPU_name, ++ Tag_CPU_arch, Tag_ABI_HardFP_use, Tag_VFP_HP_extension, ++ Tag_ABI_FP_denormal, Tag_ABI_PCS_GOT_use, Tag_ABI_align8_needed, ++ Tag_VFP_arch and Tag_ABI_FP_16bit_format. ++ Rework the way unknown attributes are handled. ++ Defer errors until all attributes have been processed. ++ ++ gas/ ++ * config/tc-arm.c (cpu_arch): Change ARM_ARCH_V6M to 11. ++ ++ include/elf/ ++ * arm.h (TAG_CPU_ARCH_V6_M, TAG_CPU_ARCH_V6S_M): New defines. ++ (MAX_TAG_CPU_ARCH, TAG_CPU_ARCH_V4T_PLUS_V6_M): New defines. ++ (Tag_NEON_arch): Rename to Tag_Advanced_SIMD_arch to match ARM ABI ++ version 2.07. ++ (Tag_undefined39, Tag_nodefaults): New enum values. ++ (Tag_also_compatible_with, Tag_T2EE_use): Likewise. ++ (Tag_conformance, Tag_Virtualization_use): Likewise. ++ (Tag_undefined69, Tag_MPextension_use): Likewise. ++ ++2008-12-24 Andrew Stubbs ++ ++ bfd/ ++ * elf-attrs.c (bfd_elf_add_obj_attr_compat): Rename to ++ bfd_elf_add_obj_attr_int_string. ++ Read Tag_compatibility from its new location in the attribute array, ++ rather than the attribute list. ++ (_bfd_elf_copy_obj_attributes): bfd_elf_add_obj_attr_compat -> ++ bfd_elf_add_obj_attr_int_string. ++ (_bfd_elf_parse_attributes): Likewise. ++ (_bfd_elf_merge_object_attributes): There's now only one ++ Tag_compatibility, and it's in the array, not the list. ++ * elf-bfd.h (NUM_KNOWN_OBJ_ATTRIBUTES): Set to 33 to include ++ Tag_compatibility. ++ (bfd_elf_add_obj_attr_compat): Rename to ++ bfd_elf_add_obj_attr_int_string. ++ (bfd_elf_add_proc_attr_compat): Rename to ++ bfd_elf_add_proc_attr_int_string. ++ elf32-arm.c (elf32_arm_merge_eabi_attributes): Explicitly don't handle ++ Tag_compatibility. ++ ++ gas/ ++ * read.c (s_vendor_attribute): bfd_elf_add_obj_attr_compat -> ++ bfd_elf_add_obj_attr_int_string. ++ ++2008-12-11 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (m68k_cpus): Add 51jm. ++ ++2008-12-09 Andrew Stubbs ++ ++ binutils/ ++ * readelf.c (arm_attr_tag_CPU_arch): Add "v6-M" and "v6S-M". ++ (arm_attr_tag_WMMX_arch): Add "WMMXv2". ++ (arm_attr_tag_NEON_arch): Rename to ... ++ (arm_attr_tag_Advanced_SIMD_arch): ... official name. ++ (arm_attr_tag_ABI_PCS_config): Rename to ... ++ (arm_attr_tag_PCS_config): ... official name. ++ (arm_attr_tag_ABI_PCS_RO_DATA): Rename to ... ++ (arm_attr_tag_ABI_PCS_RO_data): ... official name. ++ (arm_attr_tag_ABI_FP_denormal): Add "Sign only". ++ (arm_attr_tag_CPU_unaligned_access): New array. ++ (arm_attr_tag_T2EE_use): New array. ++ (arm_attr_tag_Virtualization_use): New array. ++ (arm_attr_tag_MPextension_use): New array. ++ (arm_attr_publ): NEON_arch -> Advanced_SIMD_arch. ++ ABI_PCS_config -> PCS_config. ++ ABI_PCS_RO_DATA -> ABI_PCS_RO_data. ++ Add CPU_unaligned_access, nodefaults, also_compatible_with, ++ T2EE_use, conformance, Virtualization_use and MPextension_use. ++ (display_arm_attribute): Handle Tag_nodefaults and ++ Tag_also_compatible_with. ++ ++2008-12-01 Daniel Jacobowitz ++ ++ Issue #2968 ++ * release-notes-csl.xml: Document attribute fix. ++ ++ bfd/ ++ * elf-attrs.c (elf_new_obj_attr, bfd_elf_get_obj_attr_int): Correct ++ comments. ++ (_bfd_elf_merge_object_attributes): Support final Tag_compatibility. ++ ++2008-11-30 Maxim Kuvyrkov ++ ++ bfd/ ++ * elf32-m68k.c (elf_m68k_relocate_section): Fix indentation, ++ adjust relocation when appropriate. ++ ++2008-11-24 Joseph Myers ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_final_link_relocate): Do not turn ++ branches to undefine weak symbols into branches to the next ++ instruction if creating PLT entries for those symbols. ++ ++ ld/testsuite/ ++ * ld-arm/thumb2-bl-undefweak.d, ld-arm/thumb2-bl-undefweak.s: New. ++ * ld-arm/arm-elf.exp: Run thumb2-bl-undefweak test. ++ ++2008-11-14 Catheirne Moore ++ ++ opcodes/ ++ * mips-opc.c (sync, sync.p, sync.l, synci): Remove duplicates. ++ ++2008-11-12 Catherine Moore ++ ++ gas/testsuite/ ++ * gas/mips/mips.exp (mips32-sync): Only run for mips targets. ++ ++2008-11-09 Catherine Moore ++ ++ Issue #4135 ++ ++ Backport from mainline: ++ ++ 2008-11-06 Chao-ying Fu ++ ++ opcodes/ ++ * mips-opc.c (synciobdma, syncs, syncw, syncws): Move these ++ before sync. ++ (sync): New instruction with 5-bit sync type. ++ * mips-dis.c (print_insn_args: Add case '1' to print 5-bit values. ++ ++ gas/ ++ * config/tc-mips.c (validate_mips_insn): Add case '1'. ++ (mips_ip): Add case '1' to process sync type. ++ ++ gas/testsuite/ ++ * gas/mips/mips32-sync.d, gas/mip/mips32-sync.s: New tests. ++ * gas/mips/mips.exp: Run them. ++ ++ include/opcode/ ++ * mips.h: Doucument '1' for 5-bit sync type. ++ ++2008-11-07 Catherine Moore ++ ++ Issue #3827 ++ ++ * bfd/elfxx-mips.c (_bfd_mips_elf_always_size_sections): Move ++ the sizing of the nonpic to pic stubs prior to the check for ++ the presence of a dynamic object. ++ ++2008-10-24 Maxim Kuvyrkov ++ ++ gas/ ++ * config/tc-m68k.c (md_pseudo_table): Use .long instead of .word ++ to handle TLS debug information. ++ (m68k_elf_cons): Remove workaround. ++ ++2008-10-24 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (m68k_elf_cons): Force used. ++ ++2008-10-23 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (md_pseudo_table): Disable .word override for ++ now. ++ ++2008-10-13 Sandra Loosemore ++ ++ * release-notes-csl.xsl (Bug fix for assembly listing): ++ Conditionalize for windows host. ++ (Bug fix for objdump on Windows): Likewise. ++ ++2008-10-13 Andrew Stubbs ++ ++ Issue #3536 ++ ++ Backport from mainline: ++ bfd/ ++ 2008-10-08 Alan Modra ++ ++ * elf.c (assign_file_positions_for_load_sections): When checking ++ a segment for contents, don't assume that a non-TLS nobits section ++ must only be followed by nobits sections. ++ ++2008-10-13 Nathan Sidwell ++ ++ gas/ ++ * config/tc-mips.c (mips_cpu_info_table): Add ice9. ++ ++2008-10-11 Maxim Kuvyrkov ++ ++ M68K NPTL support. ++ gas/ ++ * config/tc-m68k.c (m68k_elf_cons): New static function. ++ (md_pseudo_table): Use it. ++ (md_apply_fix): Fix to set thread local flag. ++ (m68k_elf_suffix): New static function; helper for m68k_elf_cons. ++ ++ gas/testsuite/ ++ * gas/m68k/tls-1.s: Remove. ++ ++ bfd/ ++ * elf32-m68k.c: Handle 2-slot GOT entries. Rename variables and ++ fields from n_entries to n_slots where appropriate, update comments. ++ (struct elf_m68k_got_entry.type): Move field to ... ++ (struct elf_m68k_got_entry_key): ... here. Update all uses. ++ (struct elf_m68k_got): Update comments. ++ (elf_m68k_reloc_got_tls_p): Rename to elf_m68k_reloc_tls_p, handle ++ all relocations. Update all uses. ++ (elf_m68k_init_got, elf_m68k_init_got_entry_key): Update. ++ (elf_m68k_got_entry_hash, elf_m68k_got_entry_eq): Update, ++ handle key->type. ++ (ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT): Update name, update all uses. ++ (ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT): Same. ++ (elf_m68k_get_got_entry, elf_m68k_update_got_entry_type): Update. ++ (elf_m68k_remove_got_entry_type, elf_m68k_add_entry_to_got): Update. ++ (elf_m68k_can_merge_gots_1, elf_m68k_can_merge_gots): Update. ++ (elf_m68k_merge_gots_1, elf_m68k_merge_gots): Update. ++ (struct elf_m68k_finalize_got_offsets_arg: n_ldm_entries): New field. ++ (elf_m68k_finalize_got_offsets_1, elf_m68k_finalize_got_offsets): ++ Update, handle TLS_LDM entries. ++ (struct elf_m68k_partition_multi_got_arg): Add slots_relas_diff ++ field, remove obsoleted local_n_entries field. ++ (elf_m68k_partition_multi_got_2): New static function. ++ (elf_m68k_partition_multi_got_1, elf_m68k_partition_multi_got): Use it, ++ update. ++ (elf_m68k_remove_got_entry): Update. ++ (elf_m68k_install_rela, dtpoff_base, tpoff): New static functions. ++ (elf_m68k_relocate_section, elf_m68k_finish_dynamic_symbol): ++ Handle TLS relocations. ++ ++ ld/testsuite/ ++ * ld-m68k/tls-gd-1.d, ld-m68k/tls-gd-2.d, ld-m68k/tls-gd-3.d: ++ New tests. ++ * ld-m68k/tls-gd-ie-1.d, ld-m68k/tls-ie-1.d: New tests. ++ * ld-m68k/tls-ld-1.d, ld-m68k/tls-ld-2.d: New tests. ++ * ld-m68k/tls-ld-1.s, ld-m68k/tls-ld-2.s, ld-m68k/tls-le-1.s: ++ New test sources. ++ * ld-m68k/tls-no-1.s, ld-m68k/tls-gd-ie-1.s, ld-m68k/tls-gd-1.s: ++ New test sources. ++ * ld-m68k/tls-gd-2.s, ld-m68k/tls-gd-3.s, ld-m68k/tls-ie-1.s: ++ New test sources. ++ * ld-m68k/m68k.exp: Run new tests. ++ ++2008-10-10 Nathan Froyd ++ ++ binutils/ ++ * readelf.c (display_mips_gnu_attribute): Move Power-specific ++ block of code... ++ (display_power_gnu_attribute): ...here. Oops. ++ ++2008-10-10 Nathan Froyd ++ ++ Issue #3928 ++ ++ Backport: ++ ++ include/elf/ ++ 2008-10-10 Nathan Froyd ++ * ppc.h: Add Tag_GNU_Power_ABI_Struct_Return. ++ ++ bfd/ ++ 2008-10-10 Nathan Froyd ++ * elf32-ppc.c (ppc_elf_merge_obj_attributes): Merge ++ Tag_GNU_Power_ABI_Struct_Return. ++ ++ binutils/ ++ 2008-10-10 Nathan Froyd ++ * readelf.c (display_power_gnu_attribute): Decode ++ Tag_GNU_Power_ABI_Struct_Return. ++ ++ ld/testsuite/ ++ 2008-10-10 Nathan Froyd ++ * ld-powerpc/gnu-attr-12-1.s: New file. ++ * ld-powerpc/gnu-attr-12-2.s: New file. ++ * ld-powerpc/gnu-attr-12-11.d: New file. ++ * ld-powerpc/gnu-attr-12-21.d: New file. ++ * ld-powerpc/powerpc.exp: Run new dump tests. ++ ++ ++2008-10-09 Joseph Myers ++ ++ bfd/ ++ * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Add ++ copy_link_hash_symbol_type initializers. ++ ++2008-10-09 Joseph Myers ++ ++ Backport: ++ ++ bfd/ ++ 2008-02-17 Mark Kettenis ++ * elf.c (swap_out_syms): Avoid preprocessing directive within ++ macro arg. ++ ++2008-10-03 Kazu Hirata ++ ++ Issue 1365 ++ gas/ ++ * listing.c (buffer_line): Open the source file with FOPEN_RB. ++ Manually process line ends. ++ ++ * release-notes-csl.xml: Add a release note about the ++ assembler bug. ++ ++2008-09-26 Julian Brown ++ ++ * release-notes-csl.xml (Mixed-case NEON register aliases): Add note. ++ ++2008-09-25 Maciej W. Rozycki ++ ++ Issue #3634 ++ gas/testsuite/ ++ * gas/mips/mips.exp: Move the "ice9a" test to the target ++ section. ++ ++2008-09-25 Joseph Myers ++ ++ bfd/ ++ * libbfd-in.h (_bfd_nolink_bfd_copy_link_hash_symbol_type): ++ Define. ++ * libbfd.h: Regenerate. ++ ++2008-09-25 Julian Brown ++ ++ Issue #3893 ++ ++ gas/ ++ * config/tc-arm.c (create_neon_reg_alias): Fix case-sensitivity for ++ Neon register aliases. ++ ++2008-09-17 Catherine Moore ++ ++ gas/ ++ * config/tc-arm.c (aeabi_set_public_attributes): Fix setting ++ of attribute 12 for neon fpus. Set attributes 36 and 38 for ++ neon-fp16 fpus. ++ ++ binutils/ ++ * readelf.c (arm_attr_tag_ABI_FP_16bit_format): New. ++ (arm_attr_tag_VFP_HP_extension): New. ++ (arm_attr_public_tag arm_attr_public_tags): Support new ++ attributes. ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_merge_eabi_attributes): Merge ++ half-precision attributes. ++ (elf32_arm_copy_one_eabi_other_attribute): New. ++ (elf32_arm_copy_other_attribute_list): New. ++ ++2008-09-24 Andrew Stubbs ++ ++ Issue #3598 ++ ++ * release-notes-csl.xml: Document. ++ ++ bfd/ ++ * elf.c (elf_fake_sections): Find the signature symbol for ++ SHT_GROUP sections when doing objcopy/strip. ++ ++2008-09-24 Joseph Myers ++ ++ ld/ ++ * emulparams/elf64ppc.sh (OTHER_GOT_RELOC_SECTIONS): Add .rela.opd ++ and .rela.branch_lt. ++ ++2008-09-13 Maciej W. Rozycki ++ Daniel Gutson ++ ++ Issue #3634 ++ gas/ ++ * config/tc-mips.c (ICE9A_MOVNDS): New macro. ++ (MAX_NOPS): Rename to... ++ (MAX_HIST_INSNS): ... this. Adjust references and comments ++ accordingly. ++ (mips_fix_ice9a): New variable. ++ (ice9a_fp_stall_hazard_p): New function. ++ (ice9a_fp_round_hazard_p): New function. ++ (ice9a_movnd_workaround_p): Likewise. ++ (ice9a_insn_accesses_f30_p): Likewise. ++ (check_for_ice9a): Likewise. ++ (mips_cleanup): Likewise. ++ (nops_for_insn): Call check_for_ice9a(). ++ (OPTION_FIX_ICE9A): New macro. ++ (OPTION_NO_FIX_ICE9A): Likewise. ++ (OPTION_MISC_BASE): Adjust accordingly. ++ (md_longopts): Add "mfix-ice9a" and "mno-fix-ice9a". ++ (md_parse_option): Handle OPTION_FIX_ICE9A and ++ OPTION_NO_FIX_ICE9A. ++ (md_show_usage): Document "-mfix-ice9a". ++ * config/tc-mips.h (mips_cleanup): New declaration. ++ (md_cleanup): New macro. ++ * doc/c-mips.texi (MIPS Opts): Document "-mfix-ice9a" and ++ "-mno-fix-ice9a". ++ * doc/as.texinfo (Target MIPS options): Likewise. ++ ++ gas/testsuite/ ++ * gas/mips/ice9a.l: New test for the "-mfix-ice9a" option. ++ * gas/mips/ice9a.s: Source for the new test. ++ * gas/mips/mips.exp: Run the new test. ++ ++2008-09-22 Catherine Moore ++ ++ Issue #3806 ++ * release-notes-csl.xml: Document. ++ ++2008-09-22 Catherine Moore ++ ++ Issue #3806 ++ bfd/ ++ * elfxx-mips.c (allocate_dynrelocs): Avoid a copy_reloc if ++ dynamic sections have not been created. ++ ++2008-09-13 Catherine Moore ++ ++ gas/testsuite/ ++ * gas/arm/half-prec-neon.d: New. ++ * gas/arm/half-prec-neon.s: New. ++ * gas/arm/half-prec-vfp3.d: New. ++ * gas/arm/half-prec-vfp3.s: New. ++ * gas/arm/half-prec-psyntax.d: New. ++ * gas/arm/half-prec-psyntax.s: New. ++ ++ gas/ ++ * config/tc-arm.c (neon_type_mask): Renumber. ++ (type_chk_of_el_type): Handle F_F16. ++ (neon_cvt_flavour): Recognize half-precision conversions. ++ (do_neon_cvt): New shapes NS_QD and NS_DQ. Encode half-precision ++ conversions. ++ (do_neon_cvtt): Encode the T bit. ++ (asm_opcode_insns): vcvt, vcvtt support. ++ (arm_option_cpu_value): Add neon-fp16 support. ++ ++ include/ ++ * opcode/arm.h (FPU_NEON_FP16): New. ++ (FPU_ARCH_NEON_FP16): New. ++ * elf/arm.h (Tag_ABI_FP_16bit_format): Define. ++ ++ opcodes/ ++ * arm-dis.c (coprocessor_opcodes): Add half-precision vcvt ++ instructions. ++ (neon_opcodes): Likewise. ++ (print_insn_coprocessor): Print 't' or 'b' for ++ vcvt instructions. ++ ++2008-09-10 Mark Mitchell ++ ++ * release-notes-csl.xml: Mention recent improvements. ++ ++2008-09-09 Mark Mitchell ++ ++ Issue #2882 ++ gas/ ++ * config/tc-arm.c (BAD_SP): Define. ++ (s_arm_unwind_fnstart): Use REG_SP. ++ (s_arm_unwind_setfp): Likewise. ++ (reject_bad_reg): New macro. ++ (do_co_reg): Check for bad registers. ++ (do_co_reg2c): Likewise. ++ (do_srs): Use REG_SP. ++ (do_t_add_sub): Check for bad registers. ++ (do_t_adr): Likewise. ++ (do_t_arit3): Likewise. ++ (do_t_arit3c): Likewise. ++ (do_t_bfc): Likewise. ++ (do_t_bfi): Likewise. ++ (do_t_bfx): Likewise. ++ (do_t_blx): Likewise. ++ (do_t_bx): Likewise. ++ (do_t_bxj): Likewise. ++ (do_t_clz): Likewise. ++ (do_t_div): Likewise. ++ (do_t_mla): Likewise. ++ (do_t_mlal): Likewise. ++ (do_t_mov_cmp): Likewise. ++ (do_t_mov16): Likewise. ++ (do_t_mvn_tst): Likewise. ++ (do_t_mrs): Likewise. ++ (do_t_msr): Likewise. ++ (do_t_mul): Likewise. ++ (do_t_mull): Likewise. ++ (do_t_orn): Likewise. ++ (do_t_pkhbt): Likewise. ++ (do_t_pld): Likewise. ++ (do_t_rbit): Likewise. ++ (do_t_rev): Likewise. ++ (do_t_rrx): Likewise. ++ (do_t_rsb): Likewise. ++ (do_t_shift): Likewise. ++ (do_t_simd): Likewise. ++ (do_t_ssat): Likewise. ++ (do_t_ssat16): Likewise. ++ (do_t_sxtah): Likewise. ++ (do_t_sxth): Likewise. ++ (do_t_tb): Likewise. ++ (do_t_usat): Likewise. ++ (do_t_usat16): Likewise. ++ (nysn_insert_sp): Use REG_SP. ++ gas/testsuite/ ++ * gas/arm/copro.s: Avoid using r15 where not permitted. ++ * gas/arm/copro.d: Adjust accordingly. ++ * gas/arm/thumb2_bad_reg.s: New. ++ * gas/arm/thumb2_bad_reg.l: Likewise. ++ * gas/arm/thumb2_bad_reg.d: Likewise. ++ ++2008-09-10 Maxim Kuvyrkov ++ ++ gas/testsuite/ ++ * gas/m68k/br-isac.d: Fix whitespace. ++ ++2008-09-09 Mark Mitchell ++ ++ gas/ ++ * config/tc-arm.c (do_t_orn): New function. ++ (do_t_rrx): Likewise. ++ (insns): Add orn and rrx. ++ gas/testsuite/ ++ * gas/arm/thumb32.s: Add tests for orn and rrx. ++ * gas/arm/thumb32.d: Adjust accordingly. ++ * gas/arm/thumb32.l: Likewise. ++ * gas/arm/thumb2_invert.s: Add tests for orn and orr. ++ * gas/arm/thumb2_invert.d: Adjust accordingly. ++ * gas/arm/tcompat.s: Add tests for rrx. ++ * gas/arm/tcompat.d: Adjust accordingly. ++ ++2008-09-09 Mark Mitchell ++ ++ gas/ ++ * config/tc-arm.c (insns): Add qasx, qsax, shasx, shsax, ssax, ++ uasx, uhasx, uhsx, uqasx, uqsax, usax. ++ gas/testsuite/ ++ * gas/arm/thumb32.s (qadd): Add tests for them. ++ * gas/arm/thumb32.d: Adjust accordingly. ++ ++2008-09-09 Mark Mitchell ++ ++ gas/ ++ * config/tc-arm.c (insns): Correct encoding of qadd, qdadd, qsub, ++ qdsub in Thumb-2 mode. ++ opcodes/ ++ * arm-dis.c (thumb32_opcodes): Correct decoding for qadd, qdadd, ++ qsub, and qdsub. ++ gas/testsuite/ ++ * gas/arm/thumb32.s (qadd): Add qadd, qdadd, qsub, and qdsub. ++ * gas/arm/thumb32.d: Likewise. ++ ++2008-09-09 Nathan Sidwell ++ ++ Issue #3318 ++ ld/testsuite/ ++ * ld-arm/mixed-lib.d, ld-arm/armthumb-lib.d: Loosen regexp. ++ ++2008-09-08 Daniel Jacobowitz ++ ++ Issue #2348, #3206 ++ ++ * release-notes-csl.xml: Add release note for DWARF 3 support. ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2008-09-08 H.J. Lu ++ Daniel Jacobowitz ++ ++ PR ld/3191 ++ * dwarf2.c (struct adjusted_section): Renamed from struct ++ loadable_section. ++ (struct dwarf2_debug): Adjust for renaming. Add version field. ++ (read_attribute_value): Correctly handle DW_FORM_ref_addr for ++ DWARF3. ++ (find_abstract_instance_name): Pass a pointer to ++ attribute instead of offset. For DW_FORM_ref_addr, get the ++ entry at the offset from the .debug_info section. ++ (scan_unit_for_symbols): Update. ++ (parse_comp_unit): Allow DWARF3. Save the version. ++ (unset_sections): Update for renaming. ++ (place_sections): Likewise. Set new VMAs for DWARF sections ++ also. ++ ++2008-09-08 Nathan Sidwell ++ ++ gas/ ++ * doc/c-arm.texi (ARM Directives): Document .2byte, .4byte, ++ .8byte, .bss, .even, .extend, .ldouble, .packed, .secrel32 ++ directives. ++ ++2008-09-06 Nathan Sidwell ++ ++ gas/ ++ * config/m68k-parse.h (CPUCR): New register name. ++ * config/tc-m68k.c (mcf51qe_ctrl): Rename to ... ++ (mcf51_ctrl): ... here. Add CPUCR. ++ (mcf52259_ctrl, mcf53017_ctrl): New. ++ (mcf5307_ctrl): Reorder canonically. ++ (m68k_cpus): Add 51, 51ac, 51cn, 51em, 5225x, 5301x. ++ (m68k_ip): Add CPUCR case. ++ (init_table): Add CPUCR. ++ ++ opcodes/ ++ * m68k-opc.c (m68k_opcodes): Add stldsr insn. ++ ++ gas/testsuite/ ++ * gas/m68k/br-isac.s: Add stldsr test case ++ * gas/m68k/br-isac.d: Add stldsr test case ++ ++2008-09-05 Nathan Sidwell ++ ++ Issue #1441 ++ * release-notes-csl.xml: Copy note for issue #2963. ++ ++ Issue #3213 ++ gprof/ ++ 2004-09-07 David Ung ++ * hist.c (hist_read_rec): Load profiling rate into hz_int. ++ (hist_write_hist): Write hz_int into file. ++ (print_header): Adjust header for total_time >= 100000. ++ (print_line): Use wider fields it total_time >= 100000. ++ (hist_print): Skip excluded symbols when finding the highest ++ execution time in order to calculate the scaling factor. ++ * gprof.h (hz): Now optionally a floating-point variable. ++ (hz_int): New variable, always integral. ++ * gprof.c (hz): Now optionally a floating-point variable. ++ (hz_int): New variable, always integral. ++ * gmon_io.c (gmon_out_read): Load profiling rate initially into ++ hz_int, not hz. Finally convert hz_int into floating-point hz ++ variable, where a negative hz_int is converted to a reciprocal to ++ handle cycles/count instead of counts/sec. ++ (gmon_out_write): Write hz_int to file, not hz. ++ * cg_print.c: (child_max): New variable to store maximum time ++ value. ++ (self_wid): New var to hold width of self time field in report. ++ (child_wid): New var to hold width of child time field. ++ (prec): New var to hold precision of time fields. ++ (print_header): Adjust headers for wider fields. ++ (print_cycle): Use child_wid, self_wid and prec to format output. ++ (print_members): Similarly. ++ (print_parents): Similarly. ++ (print_children): Similarly. ++ (print_line): Similarly. ++ (cg_print): Find maximum child time, then determine child/self ++ field widths and precision to cope with times >= 100000. ++ ++2008-09-05 Nathan Sidwell ++ ++ gas/ ++ * doc/c-arm.texi (ARM Directives): Alphabetize. ++ ++2008-09-05 Nathan Sidwell ++ ++ Issue #1737 ++ gas/ ++ * doc/c-arm.texi (): Document -mwarn-deprecated. ++ * config/tc-arm.c (WARN_DEPRECATED): Remove. Replace with ... ++ (warn_on_deprecated): ... this. ++ (opcode_lookup, md_assemble): Check it before warning. ++ (arm_opts): Add m[no-]warn-deprecated. ++ (md_parse_option): Replace WARN_DEPRECATED with ++ warn_on_deprecated. ++ ++2008-09-05 Daniel Jacobowitz ++ ++ Backport from mainline: ++ ++ binutils/ ++ 2008-09-05 Daniel Jacobowitz ++ ++ * readelf.c (load_specific_debug_section): New function, from ++ load_debug_section. ++ (load_debug_section): Use load_specific_debug_section. ++ (display_debug_section): Use load_specific_debug_section. Check for ++ multiple sections with the same name. ++ ++2008-09-04 Nathan Sidwell ++ ++ Issue #3213 ++ gprof/ ++ Format changes extracted from David Ung's histogram patch. ++ * cg_print.c (print_header, print_line): Fix formatting. ++ * hist.c (read_histogram_header, hist_read_rec, hist_print, ++ find_histogram_for_pc): Likewise. ++ ++2008-09-03 Nathan Froyd ++ ++ Issue #3614 ++ ++ bfd/ ++ * elf32-ppc.c (ppc_elf_relocate_section): Continue processing ++ relocations if the output section is NULL; this guards against ++ relocations against global undefined symbols bombing out. ++ ++2008-09-02 Nathan Sidwell ++ ++ Issue #3213 ++ gprof/ ++ 2005-10-12 Nigel Stephens ++ * mips.c (mips_find_call): Traverse MIPS16 functions, identifiable ++ by an odd address. Indicate in debug message when we're ++ traversing a mips16 function. ++ (mips_find_call): Use "restore" as end of function marker, not ++ "save". ++ * corefile.c (core_init): Set min_insn_size to 2 for MIPS. ++ (core_create_function_syms): Make the address of MIPS16 symbols ++ odd in the gprof symbol table, since after this point we can't ++ access the original bfd symbol information. ++ ++2008-08-29 Julian Brown ++ ++ ld/ ++ * ld.texinfo (--fix-janus-2cc): Document new option. ++ ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_janus_2cc_erratum_scan): Use correct ++ insn when checking for PC operand. ++ ++2008-08-28 Julian Brown ++ ++ ld/ ++ * emultempl/armelf.em (fix_janus_2cc): New variable. ++ (arm_elf_before_allocation): Call ++ bfd_elf32_arm_validate_janus_2cc_fix and ++ bfd_elf32_arm_janus_2cc_erratum_scan. ++ (arm_elf_after_allocation): Call bfd_elf32_arm_fix_veneer_locations ++ not bfd_elf32_arm_vfp11_fix_veneer_locations. ++ (arm_elf_create_output_section_statements): Add fix_janus_2cc ++ argument. ++ (PARSE_AND_LIST_PROLOGUE): Add OPTION_FIX_JANUS_2CC. ++ (PARSE_AND_LIST_LONGOPTS): Add fix-janus-2cc option. ++ (PARSE_AND_LIST_OPTIONS): Likewise. (PARSE_AND_LIST_CASES): Add ++ OPTION_FIX_JANUS_2CC case. ++ * emulparams/armelf.sh (OTHER_TEXT_SECTIONS): Add .janus_2cc_veneer ++ section. ++ ++ bfd/ ++ * bfd-in.h (bfd_elf32_arm_validate_janus_2cc_fix): Add prototype. ++ (bfd_elf32_arm_janus_2cc_erratum_scan): Add prototype. ++ (bfd_elf32_arm_vfp11_fix_veneer_locations): Rename to... ++ (bfd_elf32_arm_fix_veneer_locations): This. ++ (bfd_elf32_arm_set_target_relocs): Update prototype. ++ * bfd-in2.h: Regenerate. ++ * elf32-arm.c (VFP11_ERRATUM_VENEER_ENTRY_NAME): Adjust format. ++ (JANUS_2CC_ERRATUM_VENEER_SECTION_NAME) ++ (JANUS_2CC_ERRATUM_VENEER_ENTRY_NAME, MAX_ERRATUM_SYMBOL_LENGTH): ++ New macros. ++ (elf32_vfp11_erratum_type): Rename to... ++ (elf32_cpu_erratum_type): This. Add Janus 2CC entries. ++ (elf32_vfp11_erratum_list): Rename to... ++ (elf32_cpu_erratum_list): This. Rename vfp_insn field to orig_insn. ++ (_arm_elf_section_data): Update type of erratumlist field. ++ (elf32_arm_link_hash_table): Add janus_2cc_erratum_glue_size, ++ fix_janus_2cc fields. Rename num_vfp11_fixes to num_errata_fixes. ++ (elf32_arm_link_hash_table_create): Initialise above fields. ++ (JANUS_2CC_ERRATUM_VENEER_SIZE): New macro. ++ (bfd_elf32_arm_allocate_interworking_sections): Initialise Janus ++ 2CC erratum veneer section. ++ (record_vfp11_erratum_veneer): Rename to... ++ (record_cpu_erratum_veneer): This. Add argument for type of erratum ++ to record. Expand to handle Janus 2CC erratum. ++ (bfd_elf32_arm_add_glue_sections_to_bfd): Make Janus 2CC erratum ++ veneer section. ++ (bfd_elf32_arm_validate_janus_2cc_fix): New. ++ (bfd_elf32_arm_vfp11_erratum_scan): Update for new type and field ++ names. Call record_cpu_erratum_veneer instead of ++ record_vfp11_erratum_veneer. ++ (bfd_elf32_arm_vfp11_fix_veneer_locations): Rename to... ++ (bfd_elf32_arm_fix_veneer_locations): This. Add Janus 2CC erratum ++ support. ++ (bfd_elf32_arm_janus_2cc_erratum_scan): New. ++ (bfd_elf32_arm_set_target_relocs): Add fix_janus_2cc option. Handle. ++ (elf32_arm_size_dynamic_sections): Call ++ bfd_elf32_arm_janus_2cc_erratum_scan. ++ (elf32_arm_write_section): Add Janus 2CC erratum support. ++ ++2008-08-21 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (mcf52277_ctrl): New. ++ (m68k_cpus): Add 52274, 52277. ++ ++2008-08-17 Catherine Moore ++ ++ bfd/ ++ * elfxx-mips.c (_bfd_mips_elf_final_link): Write out the ++ non-pic to pic stubs. ++ ++2008-08-08 Catherine Moore ++ ++ opcodes/ ++ * mips-opc.c (jalx): Allow for ISA1 and above. ++ ++ gas/ ++ * testsuite/gas/mips/mips-no-jalx.l: Remove. ++ * testsuite/gas/mips/mips-no-jalx.s: Remove. ++ * testsuite/gas/mips/mips.exp: Remove invocation of mips-no-jalx. ++ ++ ++2008-08-03 Catherine Moore ++ ++ * release-notes-csl.xml: Add missing "/" to . ++ Change csl-target to csl_target. Change mips*- to mips*-*. ++ ++2008-07-31 Kazu Hirata ++ ++ Backport from mainline: ++ binutils/ ++ 2008-04-28 M Thomas ++ Nick Clifton ++ ++ PR binutils/6449 ++ * objdump.c (slurp_file): Open the file in binary mode. ++ * ar.c: Remove conditional definition of O_BINARY. ++ * bin2.c: Likewise. ++ * rename.c: Likewise. ++ * strings.c: Likewise. ++ * sysdep.h: Add conditional definition of O_BINARY. ++ ++2008-07-29 Paul Brook ++ Mark Mitchell ++ ++ gas/ ++ * config/tc-arm.c (do_t_mul): In Thumb-2 mode, use 16-bit encoding ++ of MUL when possible. ++ gas/testsuite/ ++ * gas/arm/thumb2_mul.s: New file. ++ * gas/arm/thumb2_mul.d: Likewise. ++ * gas/arm/thumb2_mul-bad.s: Likewise. ++ * gas/arm/thumb2_mul-bad.d: Likewise. ++ * gas/arm/thumb2_mul-bad.l: Likewise. ++ * gas/arm/t16-bad.s: Add tests for"mul" with high registers. ++ * gas/arm/t16-bad.l: Update accordingly. ++ ++ * release-notes-csl.xml: Document. ++ ++2008-07-28 Catherine Moore ++ ++ Issue #3380 ++ * release-notes-csl.xml: Document. ++ ++ Issue #3166 ++ * release-notes-csl.xml: Document. ++ ++2008-07-28 Daniel Jacobowitz ++ ++ Issue #3380 ++ bfd/ ++ * elfxx-mips.c (mips_elf_calculate_relocation): Avoid generating ++ relocations for undefined weak symbols with non-default visibility. ++ (_bfd_mips_elf_check_relocs): Use possibly_dynamic_relocs for ++ global symbols in shared libraries. ++ (allocate_dynrelocs): New function. ++ (_bfd_mips_elf_adjust_dynamic_symbol): Do not handle ++ possibly_dynamic_relocs here. ++ (_bfd_mips_elf_size_dynamic_sections): Call allocate_dynrelocs. ++ ++2008-07-27 Maxim Kuvyrkov ++ ++ ld/testsuite/ ++ * ld-m68k/got-multigot-12-13-14-34-35-ok.d: Update. ++ * ld-m68k/got-multigot-14-ok.d: Update. ++ * ld-m68k/m68k.exp: Update. ++ * ld-m68k/got-negative-12-13-14-34-ok.d: Update. ++ * ld-m68k/got-negative-14-ok.d: Update. ++ ++ gas/testsuite/ ++ * gas/m68k/tls-1.s: New. ++ ++ gas/ ++ * config/m68k-parse.h (enum pic_relocation): Add values for TLS ++ relocations. ++ * config/m68k-parse.y (yylex): Parse TLS relocations. ++ * config/tc-m68k.c (get_reloc_code, tc_m68k_fix_adjustable) ++ (tc_gen_reloc): Handle TLS relocations. ++ ++ include/elf/ ++ * m68k.h: Map TLS relocations to numbers. ++ ++ bfd/ ++ * bfd-in2.h: Regenerate. ++ * elf32-m68k.c (HOWTO): Add TLS relocations. ++ (reloc_map): Map BFD_RELOC_68K_TLS_* to R_68K_TLS_*. ++ (enum elf_m68k_got_offset_size): New enum. ++ (struct elf_m68k_got_entry: type) Move from nested union up. ++ (elf_m68k_reloc_got_type, elf_m68k_reloc_got_offset_size) ++ (elf_m68k_reloc_got_n_entries, elf_m68k_reloc_got_tls_p): New static ++ functions. ++ (struct elf_m68k_got): merge rel_8o_n_entries and rel_8o_16o_n_entries ++ fields into n_entries array. ++ (elf_m68k_init_got): Simplify, update all uses. ++ (elf_m68k_init_got_entry_key): Handle R_68K_TLS_LDM32 reloc. ++ (ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT) ++ (ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT): Adjust to handle 2-slot ++ GOT entries. ++ (elf_m68k_get_got_entry): Update. ++ (elf_m68k_update_got_entry_type): Rewrite to handle TLS GOT entries, ++ simplify. ++ (elf_m68k_remove_got_entry_type): Simplify. ++ (elf_m68k_add_entry_to_got, elf_m68k_can_merge_gots_1) ++ (elf_m68k_can_merge_gots): Update. ++ (struct elf_m68k_finalize_got_offsets_arg) ++ (elf_m68k_finalize_got_offsets_1, elf_m68k_finalize_got_offsets): ++ Rewrite to handle 2-slot GOT entries, simplify. ++ (elf_m68k_partition_multi_got_1, elf_m68k_partition_multi_got): Update. ++ (elf_m68k_remove_got_entry_type): Update. ++ (elf_m68k_check_relocs): Handle TLS relocations. Remove unnecessary ++ update of sgot->size and srelgot->size. ++ (elf_m68k_gc_sweep_hook): Update. ++ (elf_m68k_relocate_section): Add dummy handling of TLS relocations. ++ * reloc.c (BFD_RELOC_68K_TLS_*): Declare TLS relocations. ++ * libbfd.h (bfd_reloc_code_real_names): Add BFD_RELOC_68K_TLS_*. ++ ++2008-07-27 Maxim Kuvyrkov ++ ++ bfd/ ++ * elf32-m68k.c: Apply cosmetic differences from FSF mainline. ++ ++2008-07-26 Maxim Kuvyrkov ++ ++ Backport: ++ ++ ld/testsuite/ ++ 2008-07-11 H.J. Lu ++ ++ * ld-m68k/got-12.s: Removed. ++ * ld-m68k/got-13.s: Likewise. ++ * ld-m68k/got-14.s: Likewise. ++ * ld-m68k/got-15.s: Likewise. ++ * ld-m68k/got-34.s: Likewise. ++ * ld-m68k/got-35.s: Likewise. ++ * ld-m68k/xgot-15.s: Likewise. ++ ++ * ld-m68k/got-multigot-12-13-14-34-35-ok.d: Remove #source ++ and expected relocations. ++ * ld-m68k/got-multigot-14-ok.d: Likewise. ++ * ld-m68k/got-negative-12-13-14-34-ok.d: Likewise. ++ * ld-m68k/got-negative-14-ok.d: Likewise. ++ * ld-m68k/got-single-12-ok.d: Likewise. ++ * ld-m68k/got-xgot-12-13-14-15-34-35-ok.d: Likewise. ++ * ld-m68k/got-xgot-15-ok.d: Likewise. ++ ++ * ld-m68k/got-multigot-15-er.d: Remove #source. ++ * ld-m68k/got-negative-12-13-14-35-er.d: Likewise. ++ * ld-m68k/got-negative-15-er.d: Likewise. ++ * ld-m68k/got-single-13-er.d: Likewise. ++ ++ * ld-m68k/m68k.exp: Move GOT tests to ... ++ * ld-m68k/m68k-got.exp: This. New. ++ ++2008-07-26 Maxim Kuvyrkov ++ ++ Backport: ++ ++ bfd/ ++ 2008-06-29 Andreas Schwab ++ * elf32-m68k.c (elf_m68k_relocate_section): Don't ignore existing ++ addend on _GLOBAL_OFFSET_TABLE_. ++ ++ ld/testsuite/ ++ 2008-06-29 Andreas Schwab ++ * ld-m68k/got-1.s: New file. ++ * ld-m68k/got-1.d: New dump test. ++ * ld-m68k/m68k.exp: Run it. ++ ++2008-07-24 Joseph Myers ++ ++ * config.sub: Allow mips64octeon* targets. ++ ++ NOT ASSIGNED TO FSF ++ COPYRIGHT CAVIUM ++ bfd/ ++ * config.bfd: Handle mips64octeon*-*-elf*. ++ ++ gas/ ++ * configure.tgt: Handle mips-wrs-elf*. ++ ++ ld/ ++ * configure.tgt: Handle mips64octeon*-*-elf*. ++ * Makefile.am (ALL_EMULATIONS): Add Octeon emulations. ++ (eelf32ebocteon.c, eelf32elocteon.c, eelf32ebocteonn32.c, ++ eelf32elocteonn32.c, eelf64ebocteon.c, eelf64elocteon.c): New. ++ * Makefile.in: Regenerate. ++ * scripttempl/elf.sc: Add ${OCTEON_SPECIAL_SECTIONS}. ++ * emulparams/elf32ebocteon.sh, emulparams/elf32ebocteonn32.sh, ++ emulparams/elf32elocteon.sh, emulparams/elf32elocteonn32.sh, ++ emulparams/elf64ebocteon.sh, emulparams/elf64elocteon.sh, ++ emultempl/octeonelf.em: New. ++ ++2008-07-18 Joseph Myers ++ ++ Backport: ++ ++ bfd/ ++ 2008-07-18 Joseph Myers ++ * bfd-in.h (bfd_elf32_arm_set_target_relocs): Add new parameter. ++ * bfd-in2.h: Regenerate. ++ * elf32-arm.c (struct elf_arm_obj_tdata): Add field ++ no_wchar_size_warning. ++ (bfd_elf32_arm_set_target_relocs): Add new parameter ++ no_wchar_warn. ++ (elf32_arm_merge_eabi_attributes): Give a warning, not an error, ++ for conflicting wchar_t attributes. Do not warn if ++ --no-wchar-size-warning. Make diagnostic text more specific. ++ ++ ld/ ++ 2008-07-18 Joseph Myers ++ * ld.texinfo (--no-wchar-size-warning): Document new ARM option. ++ * emultempl/armelf.em (no_wchar_size_warning): New. ++ (arm_elf_create_output_section_statements): Pass ++ no_wchar_size_warning to arm_elf_create_output_section_statements. ++ (OPTION_NO_WCHAR_SIZE_WARNING): New. ++ (PARSE_AND_LIST_LONGOPTS): Add no-wchar-size-warning. ++ (PARSE_AND_LIST_OPTIONS): List --no-wchar-size-warning. ++ (PARSE_AND_LIST_ARGS_CASES): Handle --no-wchar-size-warning. ++ ++ ld/testsuite/ ++ 2008-07-18 Joseph Myers ++ * ld-arm/attr-merge-wchar-0.s,ld-arm/attr-merge-wchar-2.s, ++ ld-arm/attr-merge-wchar-4.s, ld-arm/attr-merge-wchar-00-nowarn.d, ++ ld-arm/attr-merge-wchar-00.d, ld-arm/attr-merge-wchar-02-nowarn.d, ++ ld-arm/attr-merge-wchar-02.d, ld-arm/attr-merge-wchar-04-nowarn.d, ++ ld-arm/attr-merge-wchar-04.d, ld-arm/attr-merge-wchar-20-nowarn.d, ++ ld-arm/attr-merge-wchar-20.d, ld-arm/attr-merge-wchar-22-nowarn.d, ++ ld-arm/attr-merge-wchar-22.d, ld-arm/attr-merge-wchar-24-nowarn.d, ++ ld-arm/attr-merge-wchar-24.d, ld-arm/attr-merge-wchar-40-nowarn.d, ++ ld-arm/attr-merge-wchar-40.d, ld-arm/attr-merge-wchar-42-nowarn.d, ++ ld-arm/attr-merge-wchar-42.d, ld-arm/attr-merge-wchar-44-nowarn.d, ++ ld-arm/attr-merge-wchar-44.d: New. ++ * ld-arm/arm-elf.exp: Run new tests. ++ ++2008-07-10 Joseph Myers ++ ++ config/ ++ * mh-mingw (LDFLAGS): Append to rather than replacing previous ++ value. ++ ++2008-07-08 Stan Shebs ++ ++ BE8 disassembly. ++ include/ ++ * dis-asm.h (struct disassemble_info): Add endian_code field. ++ opcodes/ ++ * dis-init.c (init_disassemble_info): Init endian_code field. ++ * arm-dis.c (print_insn): Disassemble code according to ++ setting of endian_code. ++ (print_insn_big_arm): Detect when BE8 extension flag has been set. ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Use objdump -d for arm-be8 test. ++ * ld-arm/arm-be8.d: Change to test disassembly. ++ ++2008-07-02 Joseph Myers ++ ++ ld/ ++ * ld.h (args_type): Add error_poison_system_directories. ++ * ld.texinfo (--error-poison-system-directories): Document. ++ * ldfile.c (ldfile_add_library_path): Check ++ command_line.error_poison_system_directories. ++ * ldmain.c (main): Initialize ++ command_line.error_poison_system_directories. ++ * lexsup.c (enum option_values): Add ++ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES. ++ (ld_options): Add --error-poison-system-directories. ++ (parse_args): Handle new option. ++ ++2008-06-30 Joseph Myers ++ ++ config/ ++ * mh-mingw (BOOT_CFLAGS): Do not use -D__USE_MINGW_ACCESS. ++ ++2008-06-14 Catherine Moore ++ ++ Issue #3166 ++ bfd/ ++ * elfxx-mips.c (bfd_mips_elf_maybe_create_non_pic_to_pic_stubs_section): ++ Set SEC_LINKER_CREATED for the stub section. ++ ++2008-06-09 Paul Brook ++ ++ Backport from FSF. ++ bfd/ ++ * elf32-arm.c (elf32_arm_merge_private_bfd_data): Allow BE8 shared ++ libraries. ++ ++2008-06-06 Paul Brook ++ ++ Backport from FSF. ++ bfd/ ++ * elf32-arm.c (elf32_arm_merge_private_bfd_data): Reject BE8 input. ++ ++2008-06-03 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (do_t_rbit): Populate both rm fields. ++ gas/testsuite/ ++ * gas/arm/thumb32.d: Update expected output. ++ ++2008-06-02 Nathan Froyd ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-over8.s: Use .section .bss instead of .bss. ++ ++2008-05-23 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c (arm_fix_adjustable): Don't adjust MOVW/MOVT ++ relocations. ++ ++ gas/testsuite/ ++ * gas/arm/movw-local.d: New test. ++ * gas/arm/movw-local.s: New test. ++ ++2008-05-23 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (parse_cond): Covert to lowercase before matching. ++ ++2008-05-20 Nathan Froyd ++ ++ Backport from mainline: ++ ++ 2008-03-31 Edmar Wienskoski ++ bfd/ ++ * archures.c: Add bfd_mach_ppc_e500mc. ++ * bfd-in2.h: Regenerate. ++ ++ gas/ ++ * config/tc-ppc.c (parse_cpu): Handle "e500mc". Extend "e500" to ++ accept e500mc instructions. ++ (md_show_usage): Document -me500mc. ++ ++ gas/testsuite/ ++ * gas/ppc/e500mc.s, gas/ppc/e500mc.d: New test. ++ * gas/ppc/ppc.exp: Run the new test ++ ++ include/opcode/ ++ * ppc.h: (PPC_OPCODE_E500MC): New. ++ ++ opcodes/ ++ * ppc-dis.c (powerpc_dialect): Handle "e500mc". Extend "e500" to ++ accept Power E500MC instructions. ++ (print_ppc_disassembler_options): Document -Me500mc. ++ * ppc-opc.c: (DUIS, DUI, T): New. ++ (XRT, XRTRA): Likewise. ++ (E500MC): Likewise. ++ (powerpc_opcodes): Add new Power E500MC instructions. ++ ++2008-05-15 Nathan Sidwell ++ ++ ld/testsuite/ ++ Backport 2008-05-02 H.J. Lu ++ PR ld/6475 ++ * ld-scripts/rgn-over8-ok.d: Accept any alignment. ++ ++2008-05-09 Catherine Moore ++ ++ From binutils-mips: ++ Issue #2963 ++ gas/ ++ * config/tc-mips.c (mips_frob_file): Don't match MIPS16 relocs ++ with non-MIPS16 relocs. ++ ++ gas/testsuite/ ++ * gas/mips/mips16-hilo-match.s: New test. ++ * gas/mips/mip16-hilo-match.d: New test output. ++ * gas/mips/mips.exp: Run mips16-hilo-match. ++ ++2008-05-05 Catherine Moore ++ ++ From binutils-mips: ++ 2008-04-04 Catherine Moore ++ gas/testsuite/ ++ * gas/mips/mips.exp (ulw2-eb-ilocks, elw2-el-ilocks, uld2-el, ++ uld2-eb, mips64): Disable for octeon. ++ ++2008-04-29 Daniel Jacobowitz ++ ++ Issue #2950 ++ * release-notes-csl.xml: Document Symbian relocation fix. ++ ++ Backport from FSF: ++ 2008-04-29 Daniel Jacobowitz ++ bfd/ ++ * elf.c (_bfd_elf_get_dynamic_reloc_upper_bound) ++ (_bfd_elf_canonicalize_dynamic_reloc): Find dynamic relocations ++ even if they are not loaded. ++ * elflink.c (_bfd_elf_init_2_index_sections): Set data_index_section ++ first. ++ ++ 2008-04-29 Daniel Jacobowitz ++ ld/testsuite/ ++ * ld-arm/symbian-seg1.s, ld-arm/symbian-seg1.d: New files. ++ * ld-arm/arm-elf.exp: Run symbian-seg1. ++ ++2008-04-28 Nathan Sidwell ++ ++ Issue #2928 ++ * release-notes-csl.xml: Document. ++ ++ ld/ ++ * ldlang.c (lang_size_sections_1): Don't check LMA overflow on ++ non-load sections. ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-over.exp: Allow -ok file names to pass. ++ * ld-scripts/rgn-over8.s: New. ++ * ld-scripts/rgn-over8.t: New. ++ * ld-scripts/rgn-over8-ok.d: New. ++ ++2008-04-24 Maxim Kuvyrkov ++ ++ * elfxx-mips.c (_bfd_mips_elf_check_relocs): Don't reject R_MIPS_HI16 ++ relocations when they are a part of compound relocation. ++ ++2008-04-07 Andrew Jenner ++ ++ ld/ ++ * emultempl/armelf.em: Correct formatting of help text for ++ --no-enum-size-warning option. ++ ++2008-03-28 Catherine Moore ++ ++ Backport: ++ 2008-03-26 Daniel Jacobowitz ++ ld/testsuite/ ++ * ld-elf/flags1.d: Adjust for MIPS text alignment. ++ ++2008-03-28 Daniel Jacobowitz ++ ++ bfd/ ++ * elfxx-mips.c (_bfd_mips_elf_create_nonpic_dynamic_sections): New. ++ (_bfd_mips_elf_create_dynamic_sections): Use it. ++ (_bfd_mips_elf_check_relocs): Likewise. Reject shared libraries with ++ non-PIC relocations. ++ (_bfd_mips_elf_merge_private_bfd_data): Skip dynamic objects. ++ ++2008-03-28 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (parse_neon_mov): Parse register before immediate ++ to avoid spurious symbols. ++ ++2008-03-27 Joseph Myers ++ ++ ld/testsuite/ ++ * ld-elfcomm/elfcomm.exp: Run $READELF not readelf. ++ ++2008-03-27 Daniel Jacobowitz ++ ++ gas/ ++ * config/tc-mips.c (md_begin): Disable -G for abicalls even without ++ PIC. ++ ++2008-03-27 Nathan Sidwell ++ ++ Issue #2742 ++ gas/ ++ * config/tc-m68k.c (md_convert_frag_1): Replace as_fatal with ++ as_bad_where. ++ ++2008-03-26 Daniel Jacobowitz ++ ++ Issue #2682 ++ bfd/ ++ * elfxx-mips.c (mips_elf_record_got_page_entry): Update comment. ++ (_bfd_mips_elf_check_relocs): Update comments. Always call ++ mips_elf_record_got_page_entry for R_MIPS_GOT_PAGE. ++ ++2008-03-26 Nathan Sidwell ++ ++ Issue #2691 ++ config/ ++ * mt-sde (CFLAGS_FOR_TARGET, CXXFLAGS_FOR_TARGET): Replace ++ -minterlink-mips16 with -fno-optimize-sibling-calls. ++ ++ convert/ ++ * Makefile.am (convert.o): Add convert.c. ++ * Makefile.in: Rebuilt. ++ ++2008-03-25 Maxim Kuvyrkov ++ ++ bfd/ ++ ++ * elf.c (_bfd_elf_map_sections_to_segments): Check user's ++ mapping of section to segments. ++ ++2008-03-24 Kazu Hirata ++ ++ libiberty/ ++ * cygpath.c (cygpath): Special-case the empty path. ++ ++2008-03-20 Nathan Sidwell ++ ++ convert/ ++ * Makefile.am (convert.o): Fix dependency typo. ++ * Makefile.in: Rebuilt. ++ ++2008-03-18 Daniel Jacobowitz ++ ++ libiberty/ ++ * cygpath.c (chdir): New function. ++ ++2008-03-14 Mark Shinwell ++ Daniel Jacobowitz ++ Catherine Moore ++ ++ bfd/ ++ * bfd-in.h (bfd_mips_elf_set_non_pic): New prototype. ++ (bfd_mips_elf_check_non_pic): New prototype. ++ * bfd-in2.h: Regenerate. ++ * elf32-mips.c (elf_mips_copy_howto): New. ++ (elf_mips_jump_slot_howto): New. ++ (bfd_elf32_bfd_reloc_type_lookup): Handle BFD_RELOC_MIPS_COPY ++ and BFD_RELOC_MIPS_JUMP_SLOT. ++ (bfd_elf32_bfd_reloc_name_lookup): Handle new copy and jump slot ++ relocations. ++ (mips_elf32_rtype_to_howto): Likewise. ++ (elf_backend_want_plt_sym): Define. Remove definition in VxWorks ++ clause. ++ (elf_backend_plt_readonly): Likewise. ++ (elf_backend_write_section): Define. ++ (elf_backend_plt_sym_val): Define, except for VxWorks. ++ (mips_vxworks_copy_howto_rela): Delete. ++ (mips_vxworks_jump_slot_howto_rela): Delete. ++ (mips_vxworks_bfd_reloc_type_lookup): Delete. ++ (mips_vxworks_bfd_reloc_name_lookup): Delete. ++ (mips_vxworks_rtype_to_howto): Delete. ++ (elf_backend_got_symbol_offset): Remove legacy definition. ++ (elf_backend_want_dynbss): Remove unnecessary definition. ++ (bfd_elf32_bfd_reloc_type_lookup): Delete macro definition for ++ VxWorks. ++ (bfd_elf32_bfd_reloc_name_lookup): Likewise. ++ (elf_backend_mips_rtype_to_howto): Likewise. ++ (elf_backend_adjust_dynamic_symbol): Define to new function. ++ * elfxx-mips.c (mips_elf_link_hash_entry): Add plt_entry_offset and ++ has_non_pic_to_pic_stub members. Delete is_relocation_target ++ member. ++ (mips_elf_link_hash_table): Add is_non_pic, non_pic_bfd, ++ snonpictopic and large_plt_entry_size members. Update comments. ++ (NON_PIC_P): New. ++ (NON_PIC_TO_PIC_STUB_SECTION_NAME): New. ++ (MIPS_NONPIC_LARGE_PLT_THRESHOLD): New. ++ (mips_non_pic_exec_plt0_entry): New. ++ (mips_non_pic_exec_plt_entry): New. ++ (mips_non_pic_large_exec_plt_entry): New. ++ (mips_non_pic_to_pic_stub): New. ++ (mips_elf_link_hash_newfunc): Initialize new members. ++ (mips_elf_create_got_section): Don't create .got.plt for VxWorks. ++ (mips_elf_calculate_relocation): Handle cases for filling in ++ references to non-PIC to PIC call stubs and non-PIC PLT entries. ++ (_bfd_mips_elf_create_dynamic_sections): Create .plt, .rel.plt, ++ .dynbss and .rel.bss sections for non-PIC. Create .got.plt for ++ non-PIC and VxWorks. ++ (_bfd_mips_elf_check_relocs): Update comments. Check if we have ++ the first non-PIC file encountered during an executable link. ++ Don't add dynamic relocations for non-PIC. Remove ++ is_relocation_target assignment. Set non_got_ref as appropriate. ++ (mips_elf_next_plt_entry_size): New. ++ (mips_elf_create_old_style_stub): New. ++ (_bfd_mips_elf_adjust_dynamic_symbol): Call worker function to ++ handle VxWorks and non-PIC cases. Move code for creating old-style ++ .MIPS.stubs entries to mips_elf_create_old_style_stub. ++ (_bfd_mips_vxworks_adjust_dynamic_symbol): Rename to... ++ (_bfd_mips_plt_adjust_dynamic_symbol): ...this. New. Extend code ++ to handle the non-PIC ABI. ++ (mips_elf_maybe_create_non_pic_to_pic_stub): New. ++ (_bfd_mips_elf_always_size_sections): Identify symbols requiring ++ non-PIC to PIC call stubs. Allocate space for any such stubs. ++ (_bfd_mips_elf_size_dynamic_sections): Allocate space for delay slot ++ in a PLT section. Update comments. Add dynamic tags for non-PIC ++ if required. ++ (_bfd_mips_elf_finish_dynamic_symbol): Fill in .plt, .got.plt and ++ .rel.plt entries for symbols with PLT entries under non-PIC. ++ Tighten bound on h->plt.offset for old-style stubs. Emit copy ++ relocations if required. ++ (mips_non_pic_finish_plt): New. ++ (_bfd_mips_elf_finish_dynamic_sections): Handle DT_MIPS_PLTGOT ++ and DT_MIPS_RWPLT dynamic tags. Rework code handling DT_PLTGOT ++ dynamic tag. Adjust assertions for DT_PLTREL, DT_PLTRELSZ and ++ DT_JMPREL. Call mips_non_pic_finish_plt. ++ (_bfd_mips_elf_copy_indirect_symbol): Copy new members. ++ (_bfd_mips_elf_link_hash_table_create): Initialize new members. ++ (_bfd_mips_elf_merge_private_bfd_data): Remove extraneous ++ braces. ++ (_bfd_mips_elf_get_target_dtag): Handle DT_MIPS_PLTGOT and ++ DT_MIPS_RWPLT cases. ++ (_bfd_mips_elf_plt_sym_val): New. ++ (mips_elf_nonpic_stub): New. ++ (_bfd_mips_elf_begin_write_processing): New. ++ (bfd_mips_elf_maybe_create_non_pic_to_pic_stubs_section): New. ++ (_bfd_mips_post_process_headers): Set correct ABI version for ++ non-PIC. ++ * elfxx-mips.h (_bfd_mips_vxworks_adjust_dynamic_symbol): Rename to... ++ (_bfd_mips_plt_adjust_dynamic_symbol): ...this. New prototype. ++ (_bfd_mips_nonpic_finish_dynamic_symbol): New. ++ (_bfd_mips_elf_plt_sym_val): New prototype. ++ (_bfd_mips_elf_begin_write_processing): New prototype. ++ (bfd_mips_elf_maybe_create_non_pic_to_pic_stubs_section): New ++ prototype. ++ (_bfd_mips_post_process_headers): New prototype. ++ (elf_backend_post_process_headers): Define. ++ (elf_backend_begin_write_processing): Define. ++ * elflink.c (_bfd_elf_merge_symbol): Correct typo. ++ * reloc.c (MIPS ELF relocation): Add reference to non-PIC. ++ ++ binutils/ ++ * readelf.c (get_mips_dynamic_type): Handle DT_MIPS_PLTGOT ++ and DT_MIPS_RWPLT. ++ (get_mips_symbol_other): Handle STO_MIPS_PLT. ++ ++ gas/ ++ * config/tc-mips.c (mips_nonpic_option): New. ++ (md_longopts): Add mnon-pic-abicalls entry. ++ (md_parse_option): Add OPTION_NON_PIC_ABICALLS case. ++ (mips_elf_final_processing): Check mips_nonpic_option. ++ ++ include/ ++ * elf/mips.h (DT_MIPS_PLTGOT): New. ++ (DT_MIPS_RWPLT): New. ++ (STO_MIPS_PLT): New. ++ ++ ld/ ++ * emulparams/elf32btsmip.sh: Update comment. ++ (GOT): Define. ++ (GOTPLT): Define. ++ (DATA_GOTPLT): Define. ++ * emulparams/elf32ebmipvxworks.sh (GOT): Unset. ++ (GOTPLT): Likewise. ++ (DATA_GOTPLT): Likewise. ++ * emulparams/elf32elmipvxworks.sh (GOT): Unset. ++ (GOTPLT): Likewise. ++ (DATA_GOTPLT): Likewise. ++ * emultempl/mipself.em: Include elfxx-mips.h. ++ (mips_after_open): New. ++ (LDEMUL_AFTER_OPEN): Define. ++ * scripttempl/elf.sc: Update comments. Handle DATA_GOT and ++ DATA_GOTPLT. ++ ++2008-03-12 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (no_mac): New. ++ (m68k_extensions): Point to it for mac entry. ++ (m68k_set_extension): Allow for disabling different set of flags. ++ ++2008-03-11 Catherine Moore ++ ++ bfd/ ++ * elf.c ( _bfd_elf_print_private_bfd_data): Call ++ elf_backend_get_target_dtag if defined. ++ * elf32-mips.c (elf_backend_get_target_dtag): Define. ++ * elf64-mips.c: Likewise. ++ * elfn32-mips.c: Likewise. ++ * elfxx-mips.c (_bfd_mips_elf_get_target_dtag): New. ++ * elfxx-mips.h (_bfd_mips_elf_get_target_dtag): Declare. ++ * elf-bfd.h (elf_backend_get_target_dtag): Add prototype. ++ * elfxx-target.h (elf_backend_get_target_dtag): Add default. ++ (elf_backend_data): Add elf_backend_get_target_dtag. ++ ++2008-03-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ 2008-03-11 Thiemo Seufer ++ ++ convert/ ++ * bin.c, conv.texi, convert.c, elf.h, elfio.c, elfmips.h, ++ elfout.c, idtbin.c, lsifast.c, mipsflash.c, srec.c, stagbin.c: ++ Update license to GPL v3. ++ ++2008-03-07 Julian Brown ++ ++ convert/ ++ * convert.c (conv-version.h): Include. ++ (getopt.h): Include. ++ (usage): Add error argument. Print to stdout/stderr depending on ++ setting. Exit according to setting. Print bug URL. ++ (parselist): Add argument to usage() calls. ++ (long_opts): New array. ++ (main): Use getopt_long. Add argument to usage() invocations. ++ Handle --help, --version options. ++ * configure.ac (ACX_PKGVERSION, ACX_BUGURL): Add. ++ * Makefile.am (ACLOCAL_AMFLAGS): Add. ++ (conv_SOURCES): Add conv-version.h. ++ (conv-version.h): Add build rule. ++ (convert.c): Add dependency on conv-version.h. ++ * version.h: New. ++ * Makefile.in: Regenerate. ++ * configure.ac: Regenerate. ++ * aclocal.m4: Regenerate. ++ ++2008-03-07 Julian Brown ++ ++ convert/ ++ * Makefile.am (install-exec-local): Don't install "conv" binary with ++ no target triplet. ++ * Makefile.in: Regenerate. ++ ++2008-03-06 Joseph Myers ++ ++ ld/testsuite/ ++ * lib/ld-lib.exp (check_gc_sections_available): Return 0 for ++ *-*-mingw*. ++ ++2008-03-06 Maxim Kuvyrkov ++ ++ bfd/ ++ ++ * elf32-m68k.c (elf_m68k_get_bfd2got_entry): Handle search mode. ++ (elf_m68k_relocate_section): Fix to handle _GLOBAL_OFFSET_TABLE_ ++ relocations in case of empty local/global GOT. ++ ++2008-03-04 Mark Shinwell ++ Sandra Loosemore ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_final_link_relocate): Use correct formula ++ for sign-extending 16-bit offsets in MOVW/MOVT relocations. ++ ++2008-03-02 Joseph Myers ++ ++ ld/ ++ * emulparams/m68kelf.sh (GENERATE_PIE_SCRIPT): Define. ++ ++2008-02-29 Paul Brook ++ ++ bfd/ ++ * elf32-arm.c (insert_thumb_branch): Rewrite. Handle b.w. ++ (elf32_thumb_to_arm_stub): Adjust for new insert_thumb_branch. ++ ++ ld/testsuite/ ++ * ld-arm/arm-app.r: Updated expected outpu for new test. ++ * ld-arm/arm-elf.exp (armeabitests): Add thumb2-b-interwork. ++ * ld-arm/thumb2-b-interwork.d: New test. ++ * ld-arm/thumb2-b-interwork.s: New test. ++ ++2008-02-29 Julian Brown ++ ++ convert/ ++ * config.h.in: Regenerate. ++ ++2008-02-29 Julian Brown ++ ++ convert/ ++ * convert.c (xmalloc): Remove (duplicate definition in libiberty). ++ ++2008-02-28 Julian Brown ++ ++ * configure.ac (mips*-sde-elf*): Merge duplicated cases into one. ++ Test --with-newlib for !yes rather than no. ++ * Makefile.def (all-convert): Add dependency on libiberty to fix ++ parallel make. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ ++ convert/ ++ * Makefile.in: Disable HTML documentation, and HTML and PDF ++ documentation installation. ++ * Makefile.am: Regenerate. ++ * configure: Regenerate. ++ * aclocal.m4: Regenerate. ++ ++2008-02-28 Julian Brown ++ ++ Revert: (moved to separate module) ++ ++ 2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ * sdemdi: New directory. SDE/MDI glue. ++ * Makefile.def: Add sdemdi target module. ++ ++ sdemdi/ ++ * ChangeLog: New. ++ * configure.ac: New. ++ * Makefile.am: New. ++ * config-ml.in: New. ++ * crt0.S: New. ++ * fileio.c: New. ++ * m32cache.S: New. ++ * mdi.h: New. ++ * mdilow.S: New. ++ * mdisyscall.S: New. ++ * mdixcpt.h: New. ++ * rtpxlite.c: New. ++ * rtpxliteasm.S: New. ++ * rtpxstub.c: New. ++ * sdemdi32.ld: New. ++ * sdemdi32hi.ld: New. ++ * sdemdi64.ld: New. ++ * sdemdi64hi.ld: New. ++ * simlow.S: New. ++ ++2008-02-28 Maxim Kuvyrkov ++ ++ Fix testcase to handle hack for SDElib below. ++ Don't push upstream. ++ ++ gas/testsuite/ ++ ++ * gas/mips/set-arch.d: Expect ehb. ++ ++2008-02-27 Paul Brook ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_check_relocs): Only set h->needs_plt for ++ branch/call relocations. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armelftests): Add arm-app-movw. ++ ++2008-02-27 Paul Brook ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp (armelftests): Use arm.ld in movw-merge. ++ ++2008-02-26 Joseph Myers ++ ++ Backport: ++ ++ binutils/testsuite/ ++ 2008-02-26 Joseph Myers ++ * config/default.exp (gcc_gas_flag, dlltool_gas_flag): Define to ++ empty for testing an installed toolchain. ++ ++2008-02-25 Sandra Loosemore ++ ++ binutils/ ++ Reapply: ++ 2006-05-17 Carlos O'Donell ++ ++ * doc/binutils.texi: Use "Binutils Index" for index name. ++ ++2008-02-23 Maxim Kuvyrkov ++ ++ * release-notes-csl.xml (ColdFire multi-GOT support): Fix release ++ note to not include uClinux. ++ ++2008-02-20 Mark Mitchell ++ ++ ld/testsuite/ ++ * ld-elf/seg.d: Expect .reginfo section on MIPS. ++ ++2008-02-16 Paul Brook ++ ++ Merged from //mirrors/binutils/trunk revision 193546. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ 2005-03-21 Maciej W. Rozycki ++ ++ * config/tc-mips.c (append_insn): Disable swapping of MIPS16 ++ branches as it breaks DWARF-2 line information. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ bfd/ ++ * elfxx-mips.c (mips_elf_merge_obj_attributes): Add support for ++ -mips32r2 -mfp64. ++ * readelf.c (display_mips_gnu_attribute): Add 64-bit float tag support. ++ ++ include/ ++ * elf/mips.h (Tag_GNU_MIPS_ABI_FP): Update comment. ++ ++ ld/testsuite/ ++ * ld-mips-elf/mips-elf.exp: Add run-dump-tests for attr-gnu-4-04, ++ attr-gnu-4-05, attr-gnu-4-15, attr-gnu-4-24, attr-gnu-4-25, ++ attr-gnu-4-34, attr-gnu-4-35, attr-gnu-4-40, attr-gnu-4-42, ++ attr-gnu-4-43, attr-gnu-4-44, attr-gnu-4-45, attr-gnu-4-51. ++ * ld-mips-elf/attr-gnu-4-14.d: Fix warning. ++ * ld-mips-elf/attr-gnu-4-41.d: Likewise. ++ * ld-mips-elf/attr-gnu-4-5.s: New. ++ * ld-mips-elf/attr-gnu-4-04.d: New. ++ * ld-mips-elf/attr-gnu-4-05.d: New. ++ * ld-mips-elf/attr-gnu-4-15.d: New. ++ * ld-mips-elf/attr-gnu-4-24.d: New. ++ * ld-mips-elf/attr-gnu-4-25.d: New. ++ * ld-mips-elf/attr-gnu-4-34.d: New. ++ * ld-mips-elf/attr-gnu-4-35.d: New. ++ * ld-mips-elf/attr-gnu-4-40.d: New. ++ * ld-mips-elf/attr-gnu-4-42.d: New. ++ * ld-mips-elf/attr-gnu-4-43.d: New. ++ * ld-mips-elf/attr-gnu-4-44.d: New. ++ * ld-mips-elf/attr-gnu-4-45.d: New. ++ * ld-mips-elf/attr-gnu-4-51.d: New. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ 2004-09-09 Nigel Stephens ++ ++ bfd/ ++ * ihex.c (ihex_write_object_contents): Truncate address to 32 bits ++ if the top 32 bits are a simple sign extension of the bottom. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ gas/ ++ * config/tc-mips.c (OPTION_MIPS16E, OPTION_NOMIPS16E): Add ++ backward-compatibility options for SDE. ++ (OPTION_COMPAT_ARCH_BASE): Bump to +16. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ * sdemdi: New directory. SDE/MDI glue. ++ * Makefile.def: Add sdemdi target module. ++ ++ sdemdi/ ++ * ChangeLog: New. ++ * configure.ac: New. ++ * Makefile.am: New. ++ * config-ml.in: New. ++ * crt0.S: New. ++ * fileio.c: New. ++ * m32cache.S: New. ++ * mdi.h: New. ++ * mdilow.S: New. ++ * mdisyscall.S: New. ++ * mdixcpt.h: New. ++ * rtpxlite.c: New. ++ * rtpxliteasm.S: New. ++ * rtpxstub.c: New. ++ * sdemdi32.ld: New. ++ * sdemdi32hi.ld: New. ++ * sdemdi64.ld: New. ++ * sdemdi64hi.ld: New. ++ * simlow.S: New. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ * convert: New directory. Elf to binary converter. ++ ++ convert/ ++ * ChangeLog: New. ++ * Makefile.am: New. ++ * Makefile.def: New. ++ * acinclude.m4: New. ++ * configure.ac: New. ++ * convert.c: New. ++ * sysdep.h: New. ++ * srec.c: New. ++ * elf.h: New. ++ * stagbin.c: New. ++ * elfmips.h: New. ++ * alloca.c: New. ++ * bin.c: New. ++ * mipsflash.c: New. ++ * idtbin.c: New. ++ * elfout.c: New. ++ * lsifast.c: New. ++ * elfio.c: New. ++ * conv.1: New. ++ * conv.texi: New. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS (This patch is a hack to make SDElib happy); ++ don't push upstream: ++ ++ 2004-10-06 David Ung ++ ++ * mips-opc.c: Change membership to I1 for instructions ssnop and ++ ehb. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS: ++ ++ * config/mt-sde (CFLAGS_FOR_TARGET): Add -mno-gpopt. ++ (CXXFLAGS_FOR_TARGET): Likewise. ++ * configure.ac (mips*-sde-elf*): Remove libgloss and libiberty when not ++ building Newlib. Add sde-conv host tool and MDI glue library. ++ * configure: Regenerate. ++ ++2008-02-11 Julian Brown ++ ++ Merge from MIPS/backport from FSF: ++ ++ 2007-09-14 Alan Modra ++ ++ bfd/ ++ * opncls.c (find_separate_debug_file): Ensure bfd_set_error has ++ been called on all error return paths. ++ (bfd_fill_in_gnu_debuglink_section): Use bfd_malloc, not malloc. ++ Clear padding after filename ++ ++ 2007-09-14 Alan Modra ++ ++ bfd/ ++ * format.c (bfd_check_format_matches): Record matching targets even ++ when "matching" is NULL to allow bfd_associated_vector matches. ++ Consolidate error return code. Consolidate ok return code. Always ++ restore original target and format on error. ++ ++2008-02-02 Sandra Loosemore ++ ++ * release-notes-csl.xml: Fix mistaken uses of &csl_prod; to use ++ &csl_sgxx; instead. ++ ++2008-02-01 Maxim Kuvyrkov ++ ++ ld/testsuite/ ++ ++ * ld-m68k/got-12.s: Remove .ident. ++ * ld-m68k/got-13.s: Ditto. ++ * ld-m68k/got-14.s: Ditto. ++ * ld-m68k/got-15.s: Ditto. ++ * ld-m68k/got-34.s: Ditto. ++ * ld-m68k/got-35.s: Ditto. ++ * ld-m68k/xgot-15.s: Ditto. ++ ++2008-02-01 Maxim Kuvyrkov ++ ++ Add -mxgot tests to ld. ++ ++ ld/testsuite/ ++ ++ * ld-m68k/xgot-15.s: New source. ++ * ld-m68k/got-xgot-15-ok.d: New test. ++ * ld-m68k/got-xgot-12-13-14-15-34-35-ok.d: New test. ++ * ld-m68k/m68k.exp: Run new tests. ++ ++2008-01-29 Julian Brown ++ ++ gas/ ++ * read.c (cons_worker): Report error if user tries to specify string ++ after .byte, etc. directive. ++ ++2008-01-28 Paul Brook ++ ++ ld/ ++ * emultempl/armelf.em (OPTION_FIX_V4BX_INTERWORKING): Define. ++ (PARSE_AND_LIST_LONGOPTS): Add fix-v4bx-interworking. ++ (PARSE_AND_LIST_OPTIONS): Ditto. ++ (PARSE_AND_LIST_ARGS_CASES): Handle OPTION_FIX_V4BX_INTERWORKING. ++ * emulparams/armelf.sh (OTHER_TEXT_SECTIONS): Add .v4_bx. ++ * emulparams/armelf_linux.sh (OTHER_TEXT_SECTIONS): Ditto. ++ * emulparams/armnto.sh (OTHER_TEXT_SECTIONS): Ditto. ++ * ld.texinfo: Document --fix-v4bx-interworking. ++ ++ ld/testsuite/ ++ * ld-arm/armv4-bx.d: New test. ++ * ld-arm/armv4-bx.s: New test. ++ * ld-arm/arm.ld: Add .v4bx. ++ * ld-arm/arm-elf.exp: Add armv4-bx. ++ ++ gas/testsuite/ ++ * gas/arm/thumb.d: Exclude EABI targets. ++ * gas/arm/arch4t.d: Exclude EABI targts. ++ * gas/arm/v4bx.d: New test. ++ * gas/arm/v4bx.s: New test. ++ * gas/arm/thumb-eabi.d: New test. ++ * gas/arm/arch4t-eabi.d: New test. ++ ++ gas/ ++ * config/tc-arm.c (fix_v4bx): New variable. ++ (do_bx): Generate V4BX relocations. ++ (md_assemble): Allow bx on v4 codes when fix_v4bx. ++ (md_apply_fix): Handle BFD_RELOC_ARM_V4BX. ++ (tc_gen_reloc): Ditto. ++ (OPTION_FIX_V4BX): Define. ++ (md_longopts): Add fix-v4bx. ++ (md_parse_option): Handle OPTION_FIX_V4BX. ++ (md_show_usage): Document --fix-v4bx. ++ * doc/c-arm.texi: Document --fix-v4bx. ++ ++ bfd/ ++ * reloc.c: Add BFD_RELOC_ARM_V4BX. ++ * elf32-arm.c (elf32_arm_reloc_map): Add BFD_RELOC_ARM_V4BX. ++ (ARM_BX_GLUE_SECTION_NAME, ARM_BX_GLUE_SECTION_NAME): Define. ++ (elf32_arm_link_hash_table): Add bx_glue_size and bx_glue_offset. ++ Update comment for fix_v4bx. ++ (elf32_arm_link_hash_table_create): Zero bx_glue_size and ++ bx_glue_offset. ++ (ARM_BX_VENEER_SIZE, armbx1_tst_insn, armbx2_moveq_insn, ++ armbx3_bx_insn): New. ++ (bfd_elf32_arm_allocate_interworking_sections): Allocate BX veneer ++ section. ++ (bfd_elf32_arm_add_glue_sections_to_bfd): Ditto. ++ (bfd_elf32_arm_process_before_allocation): Record BX veneers. ++ (record_arm_bx_glue, elf32_arm_bx_glue): New functions. ++ (elf32_arm_final_link_relocate): Handle BX veneers. ++ (elf32_arm_output_arch_local_syms): Output mapping symbol for .v4_bx. ++ * bfd-in2.h: Regenerate. ++ * libbfd.h: Regenerate. ++ ++2008-01-28 Maxim Kuvyrkov ++ ++ Handle weakdefs in copy_indirect hook. ++ ++ bfd/ ++ ++ elf32-m68k.c (elf_m68k_copy_indirect_symbol): Handle weakdefs. ++ ++2008-01-26 Maxim Kuvyrkov ++ ++ Multi-GOT support for m68k. ++ ++ * release-notes-csl.xml: Document feature. ++ ++ bfd/ ++ ++ * elf32-m68k.c (struct elf_m68k_link_hash_entry: got_entry_key, ++ glist): New fields. ++ (struct elf_m68k_got_entry_key, struct elf_m68k_got_entry, ++ struct elf_m68k_got, struct elf_m68k_bfd2got_entry, ++ struct elf_m68k_multi_got): New data structures. ++ (struct elf_m68k_link_hash_table: local_gp_p, use_neg_got_offsets_p, ++ allow_multigot_p, multi_got_): New fields. ++ (elf_m68k_multi_got): New macro. ++ (elf_m68k_link_hash_newfunc): Initialize new fields of ++ struct elf_m68k_link_hash_entry. ++ (elf_m68k_link_hash_table_create): Initialize new fields of ++ struct elf_m68k_link_hash_table. ++ (elf_m68k_link_hash_table_free): New static function implementing hook. ++ (elf_m68k_init_got, elf_m68k_clear_got, elf_m68k_create_empty_got): New ++ static functions for struct elf_m68k_got. ++ (elf_m68k_init_got_entry_key, elf_m68k_got_entry_hash, ++ elf_m68k_got_entry_eq): New static functions for ++ struct elf_m68k_got_entry. ++ (ELF_M68K_REL_8O_MAX_N_ENTRIES_IN_GOT, ++ ELF_M68K_REL_8O_16O_MAX_N_ENTRIES_IN_GOT): New macros. ++ (enum elf_m68k_get_entry_howto): New enum. ++ (elf_m68k_get_got_entry, elf_m68k_update_got_entry_type, ++ elf_m68k_remove_got_entry_type): New static functions for ++ struct elf_m68k_got_entry. ++ (elf_m68k_add_entry_to_got): New static function. ++ (elf_m68k_bfd2got_entry_hash, elf_m68k_bfd2got_entry_eq, ++ elf_m68k_bfd2got_entry_del, elf_m68k_get_bfd2got_entry): New static ++ functions for struct elf_m68k_bfd2got_entry. ++ (struct elf_m68k_can_merge_gots_arg, elf_m68k_can_merge_gots_1, ++ elf_m68k_can_merge_gots): New traversal. ++ (struct elf_m68k_merge_gots_arg, elf_m68k_merge_gots_1, ++ elf_m68k_merge_gots): Ditto. ++ (struct elf_m68k_finalize_got_offsets_arg, ++ elf_m68k_finalize_got_offsets_1, elf_m68k_finalize_got_offsets): Ditto. ++ (struct elf_m68k_partition_multi_got_arg, ++ elf_m68k_partition_multi_got_1, elf_m68k_init_symndx2h_1, ++ elf_m68k_partition_multi_got): Ditto. ++ (elf_m68k_find_got_entry_ptr, elf_m68k_remove_got_entry): New static ++ functions. ++ (elf_m68k_copy_indirect_symbol): New static function implementing ++ a hook. ++ (elf_m68k_check_relocs): Update to add entries to multi-GOT. ++ (elf_m68k_gc_sweep_hook): Update to remove entries from multi-GOT. ++ (elf_m68k_always_size_sections): Assign BFDs to GOTs. ++ (elf_m68k_relocate_section): Update to properly handle GOT relocations. ++ (elf_m68k_finish_dynamic_symbol): Update to traverse all GOT entries ++ of a global symbol. ++ (bfd_elf_m68k_set_target_options): New function. ++ (bfd_elf32_bfd_link_hash_table_free): Define hook. ++ (bfd_elf32_bfd_final_link): Change expansion to bfd_elf_final_link ++ to skip generic calculation of GOT offsets. ++ (elf_backend_copy_indirect_symbol): Define hook. ++ ++ * bfd-in.h (bfd_elf_m68k_set_target_options): Declare function. ++ * bfd-in2.h: Regenerate. ++ ++ ld/ ++ ++ * configure.in (--enable-got): New option. Handle it. ++ * configure: Regenerate. ++ * config.in: Regenerate. ++ ++ * emultempl/m68kelf.em: (got_handling_target_default): New shell ++ variable. ++ (GOT_HANDLING_TARGET_DEFAULT): New macro. ++ (GOT_HANDLING_DEFAULT): New macro. Initialize it from configure ++ option if one was given. ++ (got_handling): New static variable. ++ (elf_m68k_create_output_section_statements): New static function ++ implementing hook. ++ (PARSE_AND_LIST_PROLOGUE): Define shell variable. ++ (OPTION_GOT): New macro. ++ (PARSE_AND_LIST_LONGOPTS): Define shell variable. Specify ++ --got option. ++ (got): New linker option. ++ (PARSE_AND_LIST_OPTIONS): Define shell variable. Print help string ++ for --got option. ++ (PARSE_AND_LIST_ARGS_CASES): Define shell variable. Handle --got ++ option. ++ ++ * ld.texinfo: Document --got= option. ++ * gen-doc.texi: Add M68K. ++ ++ ld/testsuite/ ++ ++ * ld-m68k/got-12.s: New file. ++ * ld-m68k/got-13.s: New file. ++ * ld-m68k/got-14.s: New file. ++ * ld-m68k/got-15.s: New file. ++ * ld-m68k/got-34.s: New file. ++ * ld-m68k/got-35.s: New file. ++ * ld-m68k/got-single-12-ok.d: New dump test. ++ * ld-m68k/got-single-13-er.d: New dump test. ++ * ld-m68k/got-negative-14-ok.d: New dump test. ++ * ld-m68k/got-negative-15-er.d: New dump test. ++ * ld-m68k/got-negative-12-13-14-34-ok.d: New dump test. ++ * ld-m68k/got-negative-12-13-14-35-er.d: New dump test. ++ * ld-m68k/got-multigot-14-ok.d: New dump test. ++ * ld-m68k/got-multigot-15-er.d: New dump test. ++ * ld-m68k/got-multigot-12-13-14-34-35-ok.d: New dump test. ++ * ld-m68k/m68k.exp: Run new tests. ++ ++2008-01-25 Joseph Myers ++ ++ include/ ++ * libiberty.h (cygpath): Declare. ++ ++ libiberty/ ++ * cygpath.c (cygpath): Remove static. Return int. ++ * pex-win32.c (pex_win32_open_read, pex_win32_open_write): Use ++ open not _open. ++ ++2008-01-22 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c (arm_cpu_option_table): Add cortex-a9. ++ ++ gas/doc/ ++ * c-arm.texi: Add cortex-a9. ++ ++2008-01-22 Paul Brook ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_relocate_section): Handle MOVW and MOVT ++ relocations. Improve safety check for other weird relocations. ++ * elf32-arm.c (elf32_arm_howto_table): Fix masks for MOVW/MOVT. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Add movw-merge. ++ * ld-arm/movw-merge.d: New test. ++ * ld-arm/movw-merge.s: New test. ++ ++2008-01-09 Joseph Myers ++ ++ * configure.ac (host_makefile_frag): Use config/mh-mingw on ++ *-mingw32*. ++ * configure: Regenerate. ++ ++ config/ ++ * config/mh-mingw: New. ++ ++2008-01-07 Joseph Myers ++ ++ NOT ASSIGNED TO FSF ++ COPYRIGHT CAVIUM ++ Merge from Cavium binutils-2.16.1.diff.gz: ++ ++ gas/ ++ * config/tc-mips.c (macro): Support M_SAA_AB and M_SAAD_AB. ++ ++ gas/testsuite/ ++ * gas/mips/mips.exp: Add octeon_saa_saad test. ++ * gas/mips/octeon_saa_saad.d: New. ++ * gas/mips/octeon_saa_saad.s: New. ++ ++ include/opcode/ ++ * mips.h (M_SAA_AB, M_SAAD_AB): New. ++ ++ opcodes/ ++ * mips-opc.c (mips_builtin_opcodes): Add saa and saad ++ instructions. ++ ++2008-01-03 Catherine Moore ++ ++ gas/ ++ * config/tc-mips.c (mips_ip): Check operands on jalr instruction. ++ ++ gas/testsuite ++ * gas/mips/jalr.s: New test. ++ * gas/mips/jalr.l: New test output. ++ * gas/mips/mips.exp: Run new test. ++ ++2007-12-19 Nathan Sidwell ++ ++ Issue #2297 ++ ld/testsuite/ ++ * ld-elf/seg.t: New. ++ * ld-elf/seg.d: New. ++ * ld-elf/seg.s: New. ++ ++2007-12-12 Paul Brook ++ ++ Backport from FSF. ++ 2007-09-15 Alan Modra ++ * configure.ac: Correct makeinfo version check. ++ * configure: Regenerate. ++ ++2007-12-12 Paul Brook ++ ++ gas/ ++ * doc/c-arm.texi: Document new VFP -mfpu= options. ++ * config/tc-arm.c (arm_option_cpu_value): Rename vfp3-d16 to ++ vfpv3-d16. Add vfpv2 and vfpv3. ++ ++ gas/testsuite/ ++ * gas/arm/vfpv3-d16-bad.d: Rename vfp3-d16 to vfpv3-d16. ++ ++2007-12-11 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c (fpu_vfp_ext_d32): New vairable. ++ (parse_vfp_reg_list, encode_arm_vfp_reg): Use it. ++ (arm_option_cpu_value): Add vfpv3-d16. ++ (aeabi_set_public_attributes): Handle Tag_VFP_arch=VFPV3-D16. ++ ++ gas/testsuite/ ++ * gas/arm/vfpv3-d16-bad.d: New test. ++ * gas/arm/vfpv3-d16-bad.l: New test. ++ ++ include/opcode/ ++ * arm.h (FPU_VFP_EXT_D32, FPU_VFP_V3D16, FPU_ARCH_VFP_V3D16): Define. ++ ++ binutils/ ++ * readelf.c (arm_attr_tag_VFP_arch): Add "VFPv3-D16". ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_merge_eabi_attributes): Handle new ++ Tag_VFP_arch values. ++ ++2007-12-10 Catherine Moore ++ ++ Issue #2285 ++ bfd/ ++ * elf.c (bfd_copy_private_symbol_data): Do not copy if ++ the shndx is zero. ++ ++ gas/testsuite/ ++ * elf/elf.exp: Exceute symtab test. ++ * elf/symtab.s: New test. ++ * elf/symtab.d: New test output file. ++ ++ * release-notes-csl.xml: Document fix. ++ ++2007-11-29 Mark Shinwell ++ ++ include/opcode/ ++ * mips.h (INSN_LOONGSON_2E, INSN_LOONGSON_2F, ++ INSN_OCTEON): Rearrange masks so Loongson flags match ++ upstream. ++ ++2007-11-28 Nathan Sidwell ++ ++ Issue #2297 ++ include/elf/ ++ * internal.h (ELF_IS_SECTION_IN_SEGMENT): Adjust to cope with ++ segments at the end of memory. ++ ++2007-11-13 Joseph Myers ++ ++ Backport: ++ bfd/ ++ 2007-11-05 Alan Modra ++ * merge.c (sec_merge_hash_lookup): Revert last change. ++ (record_section): Likewise. ++ (_bfd_merge_sections): Likewise. ++ (_bfd_merged_section_offset): Properly handle NULL secinfo. ++ (_bfd_add_merge_section): Allocate extra space for a zero ++ terminator on SEC_STRINGS sections. ++ ++ ld/testsuite/ ++ 2007-11-05 Alan Modra ++ * ld-elf/merge3.d, ld-elf/merge3.s: Delete. ++ ++2007-11-06 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (do_mull): Allow overlapping Rm for armv6. ++ ++ gas/testsuite/ ++ * gas/arm/mul-overlap.s: Add umull and smlal. ++ * gas/arm/mul-overlap.l: Update expected results. ++ ++2007-10-30 Joseph Myers ++ ++ bfd/ ++ * merge.c (sec_merge_hash_lookup): Add parameter sec_end. Check ++ for unterminated strings. All callers changed. ++ (_bfd_write_merged_section, _bfd_merged_section_offset): Handle ++ NULL secinfo from merge failures. ++ ++ ld/testsuite/ ++ * ld-elf/merge3.d, ld-elf/merge3.s: New. ++ ++2007-10-24 Joseph Myers ++ ++ bfd/ ++ * elfxx-mips.c (_bfd_mips_elf_modify_segment_map): Do not add ++ PT_NULL header when not linking. ++ ++2007-10-18 Joseph Myers ++ ++ NOT ASSIGNED TO FSF ++ COPYRIGHT RAZA ++ * config.sub (mipsisa64xlr, ipsisa64xlrel): Add new machine names. ++ ++ bfd/ ++ * aoutx.h (NAME (aout, machine_type)): Handle bfd_mach_mips_xlr. ++ * archures.c (bfd_mach_mips_xlr): New. ++ * cpu-mips.c (I_xlr): New enum value. ++ (arch_info_struct): Add XLR entry. ++ * elfxx-mips.c (_bfd_elf_mips_mach): Handle E_MIPS_MACH_XLR. ++ (mips_set_isa_flags): Handle bfd_mach_mips_xlr. ++ (mips_mach_extensions): Add XLR entry. ++ * bfd-in2.h: Regenerate. ++ ++ binutils/ ++ * readelf.c (get_machine_flags): Handle E_MIPS_MACH_XLR. ++ ++ gas/ ++ * config/tc-mips.c (macro): Handle XLR instructions. ++ (mips_cpu_info_table): Add xlr. ++ * doc/c-mips.texi (MIPS architecture options): Add xlr to list of ++ -march options. ++ ++ gas/testsuite/ ++ * gas/mips/xlr-ext.d, /gas/mips/xlr-ext.s: New. ++ * gas/mips/mips.exp (xlr): New arch. ++ (xlr-ext): Run test. ++ ++ include/elf/ ++ * mips.h (E_MIPS_MACH_XLR): Define. ++ ++ include/opcode/ ++ * mips.h (INSN_XLR, CPU_XLR): Define. ++ (OPCODE_IS_MEMBER): Handle XLR. ++ (M_MSGSND, M_MSGLD, M_MSGLD_T, M_MSGWAIT, M_MSGWAIT_T): Define ++ enum values. ++ ++ opcodes/ ++ * mips-dis.c (mips_cp0_names_xlr, mips_cp0sel_names_xlr): New. ++ (mips_arch_choices): Add XLR entry. ++ * mips-opc.c (XLR): Define. ++ (mips_builtin_opcodes): Add XLR opcodes. ++ ++2007-10-17 Nathan Sidwell ++ ++ opcodes/ ++ * m68k-opc.c (m68k_opcodes): Correct move sr and ccr masks for ++ coldfire. ++ ++ gas/testsuite/ ++ * gas/m68k/mcf-movsr.s: New. ++ * gas/m68k/mcf-movsr.d: New. ++ * gas/m68k/all.exp: Add mcf-movsr test. ++ ++2007-10-09 Daniel Jacobowitz ++ ++ bfd/ ++ * elfxx-mips.c (mips_elf_sort_hash_table_f): Handle forced ++ local symbols specially. ++ (mips_elf_set_global_got_offset): Skip forced local symbols. ++ ++ Revert: ++ 2007-10-04 Joseph Myers ++ bfd/ ++ * elfxx-mips.c (struct mips_got_info): Add forced_local_count. ++ (struct mips_elf_hash_sort_data): Add forced_local and ++ prev_forced_local. ++ (mips_elf_sort_hash_table): Subtract g->forced_local_count in ++ computing hsd.min_got_dynindx. Initialize hsd.forced_local and ++ hsd.prev_forced_local. Set g->forced_local_count after sorting. ++ (mips_elf_sort_hash_table_f): Count forced-local symbols. Handle ++ them as unreferenced where allowed for in calculation of ++ min_got_dynindx. ++ (mips_elf_make_got_per_bfd, mips_elf_multi_got, ++ mips_elf_create_got_section): Initialize forced_local_count. ++ (_bfd_mips_elf_always_size_sections): Subtract forced_local_count ++ in calculating global_gotno. ++ (_bfd_mips_elf_final_link): Subtract forced_local_count in ++ assertion. ++ (mips_elf_set_global_got_offset): Check for forced-local symbols ++ before assigning global GOT offsets. ++ ++2007-10-05 Daniel Jacobowitz ++ ++ * release-notes-csl.xml: Add lost . ++ ++2007-10-05 Carlos O'Donell ++ ++ binutils/ ++ * resrc.c (read_rc_file): Rename e to edit, and c to dir. ++ Pass dir to windres_add_include_dir. Add comments. ++ (close_input_stream): Check pclose error, and call fatal if ++ the preprocessor failed. ++ * windres.c (windres_add_include_dir): Assert that p is non-NULL, ++ and not an empty string. ++ ++2007-10-04 Joseph Myers ++ ++ bfd/ ++ * elfxx-mips.c (struct mips_got_info): Add forced_local_count. ++ (struct mips_elf_hash_sort_data): Add forced_local and ++ prev_forced_local. ++ (mips_elf_sort_hash_table): Subtract g->forced_local_count in ++ computing hsd.min_got_dynindx. Initialize hsd.forced_local and ++ hsd.prev_forced_local. Set g->forced_local_count after sorting. ++ (mips_elf_sort_hash_table_f): Count forced-local symbols. Handle ++ them as unreferenced where allowed for in calculation of ++ min_got_dynindx. ++ (mips_elf_make_got_per_bfd, mips_elf_multi_got, ++ mips_elf_create_got_section): Initialize forced_local_count. ++ (_bfd_mips_elf_always_size_sections): Subtract forced_local_count ++ in calculating global_gotno. ++ (_bfd_mips_elf_final_link): Subtract forced_local_count in ++ assertion. ++ (mips_elf_set_global_got_offset): Check for forced-local symbols ++ before assigning global GOT offsets. ++ ++ ld/testsuite/ ++ * ld-mips-elf/multi-got-hidden-1.d, ++ ld-mips-elf/multi-got-hidden-1.s, ++ ld-mips-elf/multi-got-hidden-2.d, ++ ld-mips-elf/multi-got-hidden-2.s: New. ++ * ld-mips-elf/mips-elf.exp: Run multi-got-hidden tests. ++ ++2007-10-01 Carlos O'Donell ++ ++ Backport: ++ binutils/ ++ 2007-09-17 Alon Bar-Lev ++ ++ PR binutils/4987 ++ * resrc.c: (read_rc_file): Move 'filename' default initialization ++ to start of function. ++ ++2007-09-28 Carlos O'Donell ++ ++ Backport: ++ gas/ ++ 2007-09-24 Carlos O'Donell ++ * config/tc-mips.c (s_align): Set max_alignment to 28. ++ gas/testsuite/ ++ 2007-09-24 Carlos O'Donell ++ * gas/mips/align.s, gas/mips/align.d: New test. ++ * gas/mips/mips.exp: Run it. ++ ++2007-09-25 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c: Enforce register constraints on Thumb-1 add. ++ ++ gas/testsuite/ ++ * gas/arm/t16-bad.s: Add low reg non flags setting add. ++ * gas/arm/t16-bad.l: Update expected output. ++ * gas/arm/archv6m.s: Add low reg non flags setting add. ++ * gas/arm/archv6m.d: Update expected output. ++ ++2007-09-24 Daniel Jacobowitz ++ ++ Backport: ++ bfd/ ++ 2007-09-24 Daniel Jacobowitz ++ * elf.c (assign_file_positions_for_load_sections): Trust ++ p_align_valid. ++ (copy_elf_program_header): Copy PT_NULL segments. ++ ++2007-09-24 Daniel Jacobowitz ++ ++ gas/testsuite/ ++ * gas/mips/loongson-2f.d: Specify a 64-bit ABI. ++ * gas/mips/loongson-2e.d: Likewise. ++ ++2007-09-21 Joseph Myers ++ ++ * release-notes-csl.xml: Add release notes for GOT patch. ++ ++ ld/testsuite/ ++ * ld-mips-elf/got-page-3.d: Assemble with -mips3. ++ ++2007-09-21 Joseph Myers ++ ++ Backport from ++ : ++ ++ bfd/ ++ 2007-09-21 Richard Sandiford ++ * elfxx-mips.c (mips_got_page_range): New structure. ++ (mips_got_page_entry): Likewise. ++ (mips_got_info): Add page_gotno and got_page_entries fields. ++ (mips_elf_got_per_bfd_arg): Add max_pages field. Delete ++ primary_count and current_count fields. ++ (mips_got_page_entry_hash, mips_got_page_entry_eq): New functions. ++ (mips_elf_pages_for_range, mips_elf_record_got_page_entry): Likewise. ++ (mips_elf_get_got_for_bfd): New function, split out from ++ mips_elf_make_got_per_bfd. Initialize the page_gotno and ++ got_page_entries fields when creating a new GOT structure. ++ (mips_elf_make_got_pages_per_bfd): New function. ++ (mips_elf_merge_got_with): New function, split out from ++ mips_elf_make_got_per_bfd. Merge page entries as well as ++ non-page entries. Use the minimum of max_pages and the sum ++ of the page_gotnos to estimate the number of page entries. ++ (mips_elf_merge_gots): Use the minimum of max_pages and the ++ bfd's page_gotno to estimate the number of page entries. ++ Use the above functions. ++ (mips_elf_multi_got): Add page entries as well as non-page entries ++ to the individual per-bfd GOTs. Initialize got_per_bfd_arg.max_pages. ++ Initialize the page_gotno and got_page_entries fields when creating ++ a new primary GOT. Use the minimum of pages and page_gotno when ++ adding the number of pages entries to local_gotno. ++ (mips_elf_create_got_section): Initialize the page_gotno and ++ got_page_entries fields of the GOT structure. ++ (mips_elf_rel_relocation_p, mips_elf_read_rel_addend) ++ (mips_elf_add_lo16_rel_addend, mips_elf_get_section_contents): New ++ functions, split out from... ++ (_bfd_mips_elf_relocate_section): ...here. ++ (_bfd_mips_elf_check_relocs): Record GOT page entries too. ++ (_bfd_mips_relax_section): Use mips_elf_get_section_contents. ++ (_bfd_mips_elf_always_size_sections): Use the smaller of the ++ loadable_size- and page_gotno-derived estimates. ++ ++ ld/testsuite/ ++ 2007-09-21 Richard Sandiford ++ Joseph Myers ++ * ld-mips-elf/got-page-1.d, ld-mips-elf/got-page-1.s, ++ * ld-mips-elf/got-page-2.d, ld-mips-elf/got-page-2.s, ++ * ld-mips-elf/got-page-3.d, ld-mips-elf/got-page-3a.s, ++ * ld-mips-elf/got-page-3b.s, ld-mips-elf/got-page-3c.s, ++ * ld-mips-elf/got-page-1.ld: New tests. ++ * ld-mips-elf/mips-elf.exp: Run them. ++ * ld-mips-elf/multi-got-1.d, ld-mips-elf/multi-got-no-shared.d, ++ * ld-mips-elf/tls-hidden2-got.d, ld-mips-elf/tls-hidden2.d, ++ * ld-mips-elf/tls-hidden3.d, ld-mips-elf/tls-hidden3.got, ++ * ld-mips-elf/tls-hidden3.r, ld-mips-elf/tls-hidden4.got, ++ * ld-mips-elf/tls-hidden4.r, ld-mips-elf/tls-multi-got-1.d, ++ * ld-mips-elf/tls-multi-got-1.got, ld-mips-elf/tls-multi-got-1.r, ++ * ld-mips-elf/tlsbin-o32.d, ld-mips-elf/tlsbin-o32.got, ++ * ld-mips-elf/tlsdyn-o32-1.d, ld-mips-elf/tlsdyn-o32-1.got, ++ * ld-mips-elf/tlsdyn-o32-2.d, ld-mips-elf/tlsdyn-o32-2.got, ++ * ld-mips-elf/tlsdyn-o32-3.d, ld-mips-elf/tlsdyn-o32-3.got, ++ * ld-mips-elf/tlsdyn-o32.d, ld-mips-elf/tlsdyn-o32.got, ++ * ld-mips-elf/tlslib-o32-hidden.got, ld-mips-elf/tlslib-o32-ver.got, ++ * ld-mips-elf/tlslib-o32.d, ld-mips-elf/tlslib-o32.got: Update for ++ GOT allocation changes. ++ ++2007-09-19 Daniel Jacobowitz ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-over.s: Use sections .txt and .dat. ++ * ld-scripts/rgn-over1.t, ld-scripts/rgn-over2.t, ++ ld-scripts/rgn-over3.t, ld-scripts/rgn-over4.t, ld-scripts/rgn-over5.t, ++ ld-scripts/rgn-over6.t, ld-scripts/rgn-over7.t: Discard other ++ sections. Handle changed names. ++ * ld-scripts/rgn-over1.d, ld-scripts/rgn-over2.d, ++ ld-scripts/rgn-over3.d, ld-scripts/rgn-over4.d, ld-scripts/rgn-over5.d, ++ ld-scripts/rgn-over6.d, ld-scripts/rgn-over7.d: Expect discarded ++ sections and changed names. ++ ++2007-09-19 Daniel Jacobowitz ++ ++ bfd/ ++ * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections): Make sure .got ++ will be output. ++ ++2007-09-18 Maxim Kuvyrkov ++ ++ * release-notes-csl.xml (ColdFire 51QE support): New. ++ ++2007-09-07 Nathan Froyd ++ ++ gas/ ++ * config/tc-ppc.c (parse_cpu): Handle -mpmr option. ++ ++2007-08-31 Joseph Myers ++ ++ Revert: ++ 2007-06-04 Joseph Myers ++ bfd/ ++ * elflink.c (bfd_elf_link_record_dynamic_symbol): Do not set ++ dynindx for indirect symbols. ++ ++2007-08-30 Brooks Moses ++ ++ Add files missing from 2007-08-20 merge from FSF trunk: ++ * ld/emultempl/cr16elf.em: New. ++ * ld/testsuite/ld-elf/dl2a.list: New. ++ * ld/testsuite/ld-ia64/merge1.d: New. ++ * ld/testsuite/ld-ia64/merge1.s: New. ++ * ld/testsuite/ld-ia64/merge2.d: New. ++ * ld/testsuite/ld-ia64/merge2.s: New. ++ * ld/testsuite/ld-ia64/merge3.d: New. ++ * ld/testsuite/ld-ia64/merge3.s: New. ++ * ld/testsuite/ld-ia64/merge4.d: New. ++ * ld/testsuite/ld-ia64/merge4.s: New. ++ * ld/testsuite/ld-ia64/merge5.d: New. ++ * ld/testsuite/ld-ia64/merge5.s: New. ++ * ld/testsuite/ld-pe/secrel_64.d: New. ++ * compile: New. ++ * lt~obsolete.m4: New. ++ ++2007-08-30 Daniel Jacobowitz ++ ++ ld/testsuite/ ++ * ld-elf/weak-dyn-1.rd: Resolve merge conflict. ++ ++2007-08-29 Daniel Jacobowitz ++ ++ Issue #1771 ++ Backport: ++ 2007-08-29 Daniel Jacobowitz ++ gas/ ++ * dwarf2dbg.c (dwarf2_directive_loc): Emit duplicate .loc directives. ++ ++ gas/testsuite/ ++ * gas/lns/lns-duplicate.d, gas/lns/lns-duplicate.s: New. ++ * gas/lns/lns.exp: Run lns-duplicate. ++ ++2007-08-28 Mark Shinwell ++ Joseph Myers ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-over1.d: Disallow space before "ld" at start of ++ line, not ":". ++ * ld-scripts/rgn-over2.d: Likewise. ++ * ld-scripts/rgn-over3.d: Likewise. ++ * ld-scripts/rgn-over4.d: Likewise. ++ * ld-scripts/rgn-over5.d: Likewise. ++ * ld-scripts/rgn-over6.d: Likewise. ++ * ld-scripts/rgn-over7.d: Likewise. ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_compare_mapping): Compare first on vma, ++ then on type. ++ ++ binutils/testsuite/ ++ * binutils-all/ar.exp (long_filenames): Delete temporary files on ++ the host. ++ * binutils-all/arm/objdump.exp: Only check "which $OBJDUMP" if ++ host is local. ++ * binutils-all/objcopy.exp: Use ${srecfile} to get the name of the ++ srec file to be passed to binutils_run. ++ (objcopy_test_readelf): Use remote_exec. ++ * binutils-all/readelf.exp (readelf_find_size): Use remote_exec. ++ (readelf_test): Likewise. ++ (readelf_wi_test): Likewise. ++ * lib/utils-lib.exp (run_dump_test): Only check "which $binary" if ++ host is local. Use remote_exec. Use $tempfile not ++ tmpdir/bintest.o. ++ ++ gas/ ++ * as.c (main): Flush stderr before printing listings to ensure ++ consistent output order across platforms. ++ ++ gas/testsuite/ ++ * lib/gas-defs.exp (gas_version): Use remote_* functions instead ++ of exec. ++ (gas_host_run): New. ++ (gas_run): Use gas_host_run. ++ (gas_start): Likewise. ++ (run_dump_test): Likewise. ++ (objdump): Use gas_host_run. ++ (objdump_start_no_subdir): Likewise. ++ * lib/gas-dg.exp (gas-dg-test): Use "remote_file host delete". ++ * lib/run: Remove. ++ * gas/macros/macros.exp: Download app4b.s to host. ++ * gas/i386/i386.exp (gas_64_check): Use gas_host_run. ++ (gas_32_check): Likewise. ++ * gas/maxq10/maxq10.exp (gas_64_check): Likewise ++ (gas_32_check): Likewise. ++ * gas/maxq20/maxq20.exp (gas_64_check): Likewise ++ (gas_32_check): Likewise. ++ * gas/sparc/sparc.exp (gas_64_check): Likewise. ++ * gas/cfi/cfi.exp: Likewise. ++ * gas/elf/elf.exp (run_list_test): Likewise. Use temporary file ++ for readelf output in place of pipe. ++ * gas/all/gas.exp: Download incbin.dat to host. ++ (do_comment): Allow \r\r\n. ++ ++ ld/ ++ * ldlang.c (sort_sections_by_lma): Sort by internal id after lma ++ for stable sort. ++ ++ ld/testsuite/ ++ * ld-elfcomm/elfcomm.exp: Use run_host_cmd. Only check "which ++ $CC" if host is local. ++ * ld-checks/checks.exp: Use run_host_cmd. ++ * ld-elf/exclude.exp: Likewise. ++ * ld-elf/elf.exp: Download merge.ld if host is remote. ++ * ld-elf/binutils.exp (binutils_test): Use remote_exec. ++ * ld-elf/tls_common.exp: Use run_host_cmd. ++ * lib/ld-lib.exp (ld_version): Only check "which $ld" if host is ++ local. Use remote_exec. ++ (run_host_cmd): New. ++ (run_host_cmd_yesno): New. ++ (default_ld_relocate): Use run_host_cmd_yesno. ++ (default_ld_link): Likewise. ++ (default_ld_simple_link): Use run_host_cmd. ++ (default_ld_compile): Only check "which $ccprog" if host is local. ++ Use remote_file and remote_exec. ++ (default_ld_assemble): Only check "which $as" if host is local. ++ Use run_host_cmd. ++ (default_ld_nm): Use remote_exec, remote_upload and remote_file. ++ (run_dump_test): Use remote_exec, remote_upload and remote_file. ++ Only check "which $binary" if host is local. ++ (run_ld_link_tests): Use remote_exec, remote_upload and ++ remote_file. ++ * ld-selective/selective.exp: Only check "which $CXX" if host is ++ local. Use remote_exec. ++ * ld-scripts/phdrs.exp: Only check "which $objdump" if host is ++ local. Use run_host_cmd. ++ * ld-scripts/phdrs2.exp: Likewise. ++ * ld-scripts/weak.exp: Likewise. ++ * ld-undefined/weak-undef.exp: Likewise. ++ * ld-scripts/crossref.exp: Only check "which $CC" if host is local. ++ Use run_host_cmd. ++ * ld-scripts/map-address.exp: Upload map_address.map if host is ++ remote. ++ * ld-srec/srec.exp (run_srec_tests): Use run_host_cmd. Only check ++ "which $CC" and "which $CXX" if host is local. ++ * ld-undefined/undefined.exp: Only check "which $CC" if host is ++ local. Use remote_file and run_host_cmd. ++ * config/default.exp: Use remote_exec to create tmpdir. ++ ++2007-08-28 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (m68k_ip): Add mcfisa_c case. ++ (m68k_elf_final_processing): Add EF_M68K_CF_ISA_C_NODIV. ++ ++ include/elf/ ++ * m68k.h (EF_M68K_CF_ISA_C_NODIV): New. ++ ++ bfd/ ++ * elf32-m68k.c (elf32_m68k_object_p): Add EF_M68K_CF_ISA_C_NODIV. ++ (elf32_m68k_print_private_bfd_data): Likewise. ++ ++2007-08-25 Mark Shinwell ++ ++ Add files missing from previous commit: ++ gas/testsuite/ ++ * gas/mips/loongson-2e.d: New. ++ * gas/mips/loongson-2e.s: New. ++ * gas/mips/loongson-2f.d: New. ++ * gas/mips/loongson-2f.s: New. ++ ++2007-08-25 Mark Shinwell ++ ++ * release-notes-csl.xml ++ (Loongson-2E and Loongson-2F processor support): New. ++ ++2007-08-25 Mark Shinwell ++ ++ bfd/ ++ * archures.c (bfd_mach_mips_loongson_2e): New. ++ (bfd_mach_mips_loongson_2f): New. ++ * bfd-in2.h (bfd_mach_mips_loongson_2e): New. ++ (bfd_mach_mips_loongson_2f): New. ++ * cpu-mips.c: Add I_loongson_2e and I_loongson_2f to ++ anonymous enum. ++ (arch_info_struct): Add Loongson-2E and Loongson-2F entries. ++ * elfxx-mips.c (_bfd_elf_mips_mach): Handle Loongson-2E ++ and Loongson-2F flags. ++ (mips_set_isa_flags): Likewise. ++ (mips_mach_extensions): Add Loongson-2E and Loongson-2F ++ entries. ++ ++ binutils/ ++ * readelf.c (get_machine_flags): Handle Loongson-2E and -2F ++ flags. ++ ++ gas/ ++ * config/tc-mips.c (mips_cpu_info_table): Add loongson2e ++ and loongson2f entries. ++ * doc/c-mips.texi: Document -march=loongson{2e,2f} options. ++ ++ gas/testsuite/ ++ * gas/mips/mips.exp: Add loongson-2e and -2f tests. ++ * gas/mips/loongson-2e.d: New. ++ * gas/mips/loongson-2e.s: New. ++ * gas/mips/loongson-2f.d: New. ++ * gas/mips/loongson-2f.s: New. ++ ++ include/elf/ ++ * mips.h (E_MIPS_MACH_LS2E): New. ++ (E_MIPS_MACH_LS2F): New. ++ ++ include/opcode/ ++ * mips.h (INSN_LOONGSON_2E): New. ++ (INSN_LOONGSON_2F): New. ++ (CPU_LOONGSON_2E): New. ++ (CPU_LOONGSON_2F): New. ++ (OPCODE_IS_MEMBER): Update for Loongson-2E and -2F flags. ++ ++ opcodes/ ++ * mips-dis.c (mips_arch_choices): Add Loongson-2E and -2F ++ entries. ++ * mips-opc.c (IL2E): New. ++ (IL2F): New. ++ (mips_builtin_opcodes): Add Loongson-2E and -2F instructions. ++ Allow movz and movn for Loongson-2E and -2F. Add movnz entry. ++ Move coprocessor encodings to the end of the table. Allow ++ certain MIPS V .ps instructions on the Loongson-2E and -2F. ++ ++2007-08-24 Maxim Kuvyrkov ++ ++ Rename 51QE to 51qe. ++ ++ binutils/ ++ ++ * gas/config/tc-m68k.c (mcf51QE_ctrl): Rename to mcf51qe_ctrl. ++ (m68k_cpus): Update. ++ ++2007-08-24 Mark Shinwell ++ ++ include/opcode/ ++ * mips.h (INSN_ISA*): Redefine certain values as an ++ enumeration. Update comments. ++ (mips_isa_table): New. ++ (ISA_MIPS*): Redefine to match enumeration. ++ (OPCODE_IS_MEMBER): Modify to correctly test new INSN_ISA* ++ values. ++ ++ opcodes/ ++ * mips-opc.c (I3_32, I3_33, I4_32, I4_33, I5_33): New. ++ (mips_builtin_opcodes): Use these new I* values. ++ ++2007-08-23 Nathan Sidwell ++ ++ bfd/ ++ * archures.c: Add bfd_mach_mcf_isa_c_nodiv, ++ bfd_mach_mcf_isa_c_nodiv_mac & bfd_mach_mcf_isa_c_nodiv_emac. ++ * bfd/ieee.c (ieee_write_processor): Update coldfire architecture ++ list. ++ * bfd-in2.h: Rebuilt. ++ * cpu-m68k.c (arch_info_struct): Add isa_c nodiv architectures. ++ (m68k_arch_features): Likewise. ++ ++2007-08-22 Daniel Jacobowitz ++ ++ * release-notes-csl.xml: Mention GDB support for MIPS -msoft-float ++ tags. ++ ++2007-08-21 Maxim Kuvyrkov ++ ++ Add ColdFire V1 devices. ++ ++ binutils/gas ++ ++ * config/tc-m68k.c (mcf51QE_ctrl): Define 51QE control registers. ++ (m68k_cpus): Define 51QE cpu. ++ ++2007-08-20 Brooks Moses ++ ++ Merged from //mirrors/binutils/trunk revision 179541. ++ ++2007-08-16 Daniel Jacobowitz ++ ++ * release-notes-csl.xml: Mention MIPS linker warnings. ++ ++2007-08-16 Daniel Jacobowitz ++ ++ ld/testsuite/ ++ * ld-powerpc/attr-gnu-8-31.d, ld-powerpc/attr-gnu-8-1.s, ++ ld-powerpc/attr-gnu-8-11.d, ld-powerpc/attr-gnu-8-3.s: New. ++ ++ include/elf/ ++ * ppc.h (Tag_GNU_Power_ABI_Vector): New. ++ ++ binutils/ ++ * readelf.c (display_power_gnu_attribute): Handle ++ Tag_GNU_Power_ABI_Vector. ++ ++ bfd/ ++ * elf32-ppc.c (ppc_elf_merge_obj_attributes): Handle ++ Tag_GNU_Power_ABI_Vector. ++ ++2007-08-11 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-08-11 Richard Sandiford ++ ++ * config.bfd (sh-*-vxworks): Define targ_underscore to "yes". ++ ++2007-08-09 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (relaxed_symbol_addr): Compensate for alignment. ++ ++ gas/testsuite/ ++ * gas/arm/relax_load_align.d: new test. ++ * gas/arm/relax_load_align.s: new test. ++ ++2007-08-07 Kazu Hirata ++ ++ Backport from mainline: ++ ld/testsuite/ ++ 2007-05-17 Paul Brook ++ * ld-elf/multibss1.s: Use %nobits instead of @nobits. ++ ++2007-08-03 Daniel Jacobowitz ++ ++ Backport from mainline: ++ ld/testsuite/ ++ 2007-08-03 Daniel Jacobowitz ++ * ld-srec/srec.exp: XFAIL for powerpc*-*-*. ++ ++2007-07-23 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-07-23 Richard Sandiford ++ ++ * elflink.c (_bfd_elf_fix_symbol_flags): Only assert the type ++ of weakdef->root.type if weakdef has no regular definition. ++ ++ ld/testsuite/ ++ 2007-07-23 Richard Sandiford ++ ++ * ld-elf/weak-dyn-1a.s, ld-elf/weak-dyn-1b.s, ld-elf/weak-dyn-1.ld, ++ * ld-elf/weak-dyn-1.rd: New test. ++ * ld-elf/elf.exp: Run it. ++ ++2007-07-18 Zack Weinberg ++ ++ Issue 1494 ++ ld/ ++ * ldlang.c (lang_check_section_addresses): Also report size of ++ overflow for any overflowed memory regions. ++ (os_region_check): Diagnose an overflowed region only once per ++ region. Do not reset region->current on overflow. ++ ++ ld/testsuite/ ++ * ld-scripts/rgn-over.exp: New driver. ++ * ld-scripts/rgn-over.s: New file. ++ * ld-scripts/rgn-over1.d, ld-scripts/rgn-over1.t ++ * ld-scripts/rgn-over2.d, ld-scripts/rgn-over2.t ++ * ld-scripts/rgn-over3.d, ld-scripts/rgn-over3.t ++ * ld-scripts/rgn-over4.d, ld-scripts/rgn-over4.t ++ * ld-scripts/rgn-over5.d, ld-scripts/rgn-over5.t ++ * ld-scripts/rgn-over6.d, ld-scripts/rgn-over6.t ++ * ld-scripts/rgn-over7.d, ld-scripts/rgn-over7.t: ++ New test cases. ++ ++2007-07-13 Nathan Sidwell ++ ++ ld/testsuite/ ++ * ld-scripts/assert.t: Tweak to avoid relying on empty's VMA being ++ zero. ++ ++2007-07-12 Nathan Sidwell ++ ++ #1765 ++ ld/ ++ * scripttempl/pe.sc: Don't include .gcc_except_table and ++ .eh_frame on partial links. ++ ++2007-07-09 Nathan Sidwell ++ ++ Issue 1702 ++ bfd/ ++ * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Don't eliminate ++ copy relocs on vxworks. ++ ++2007-07-05 Kazu Hirata ++ ++ Issue 1775 ++ gas/ ++ * config/m68k-parse.h (m68k_register): Use MBO instead of MBB. ++ (last_movec_reg): Change to MBO. ++ * config/tc-m68k.c (fido_ctrl): Use MBO instead of MBB. ++ (m68k_ip): Use MBO instead of MBO. ++ (init_table): Use MBO instead of MBO. Add an entry for mbo. ++ ++ gas/testsuite/ ++ * gas/m68k/fido.s: Add tests for %mbo. ++ * gas/m68k/fido.d: Update accordingly. ++ ++ opcodes/ ++ * m68k-dis.c (print_insn_arg): Use %mbo instead of %mbb. ++ ++ * release-notes-csl.xml: Add a note for the addition of %mbo. ++ ++2007-07-05 Nathan Sidwell ++ ++ * opcodes/ppc-opc (PPC7450): New. ++ (powerpc_opcodes): Use it in dcba. ++ ++2007-07-04 Richard Sandiford ++ ++ gas/ ++ * config/tc-mips.c (mips_cpu_info_table): Add 74kf3_2. ++ * doc/c-mips.texi: Document it. ++ ++2007-07-04 Richard Sandiford ++ ++ gas/ ++ * config/tc-mips.c (mips_cpu_info_table): Add new entries for ++ {24k,24ke,34k,74k}f{2_1,1_1,x}. ++ * doc/c-mips.texi: Document them. ++ ++2007-07-03 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_merge_eabi_attributes): Copy type from ++ input attributes if value has been copied. ++ ++ ld/testsuite/ ++ * ld-arm/attr-merge-2a.s, ld-arm/attr-merge-2b.s, ++ ld-arm/attr-merge-2.attr: New. ++ * ld-arm/arm-elf.exp (armelftests): Add new test. ++ ++2007-07-02 Nathan Froyd ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elf32-ppc.c (ppc_elf_info_to_howto): Check for invalid relocation ++ types. ++ ++2007-07-02 Paul Brook ++ ++ Backport from FSF. ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_process_before_allocation): Suppress ++ call veneers for call relocations against undefined symbols. ++ (elf32_arm_final_link_relocate): Turn call to undefined symbol ++ into a jump to the next instruction. ++ ++ ld/testuite/ ++ * ld-arm/arm-elf.exp (armelftests): Add callweak. ++ * ld-arm/callweak.d: New test. ++ * ld-arm/callweak.s: New test. ++ ++2007-07-02 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elfxx-mips.c (mips_elf_calculate_relocation): Handle ++ R_MIPS_TLS_DTPREL32 and R_MIPS_TLS_DTPREL64. ++ * elf64-mips.c (mips_elf64_howto_table_rela): Support ++ R_MIPS_TLS_DTPREL64. ++ ++ gas/ ++ * config/tc-mips.c (s_dtprelword, s_dtpreldword, ++ s_dtprel_internal): New. ++ (mips_pseudo_table): Add .dtprelword and .dtpreldword. ++ (md_apply_fix): Handle BFD_RELOC_MIPS_TLS_DTPREL32 and ++ BFD_RELOC_MIPS_TLS_DTPREL64. ++ ++2007-06-29 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elf32-ppc.c (ppc_elf_merge_obj_attributes): New. ++ (ppc_elf_merge_private_bfd_data): Call it. ++ ++ binutils/ ++ * readelf.c (display_power_gnu_attribute, process_power_specific): ++ New. ++ (process_arch_specific): Call process_power_specific. ++ ++ include/elf/ ++ * ppc.h (Tag_GNU_Power_ABI_FP): Define. ++ ++ ld/testsuite/ ++ * ld-powerpc/attr-gnu-4-0.s, ld-powerpc/attr-gnu-4-00.d, ++ ld-powerpc/attr-gnu-4-01.d, ld-powerpc/attr-gnu-4-02.d, ++ ld-powerpc/attr-gnu-4-1.s, ld-powerpc/attr-gnu-4-10.d, ++ ld-powerpc/attr-gnu-4-11.d, ld-powerpc/attr-gnu-4-12.d, ++ ld-powerpc/attr-gnu-4-13.d, ld-powerpc/attr-gnu-4-2.s, ++ ld-powerpc/attr-gnu-4-20.d, ld-powerpc/attr-gnu-4-21.d, ++ ld-powerpc/attr-gnu-4-22.d, ld-powerpc/attr-gnu-4-3.s, ++ ld-powerpc/attr-gnu-4-31.d: New. ++ * ld-powerpc/powerpc.exp: Run these new tests. ++ ++2007-06-29 Joseph Myers ++ ++ Backport from FSF: ++ ++ gas/ ++ * as.c (main): Only call create_obj_attrs_section if IS_ELF. ++ ++2007-06-29 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elfxx-mips.c (mips_elf_merge_obj_attributes): New. ++ (_bfd_mips_elf_merge_private_bfd_data): Call it. ++ ++ binutils/ ++ * readelf.c (display_mips_gnu_attribute): New. ++ (process_mips_specific): Call process_attributes. ++ ++ include/elf/ ++ * mips.h (Tag_GNU_MIPS_ABI_FP): Define. ++ ++ ld/testsuite/ ++ * ld-mips-elf/attr-gnu-4-0.s, ld-mips-elf/attr-gnu-4-00.d, ++ ld-mips-elf/attr-gnu-4-01.d, ld-mips-elf/attr-gnu-4-02.d, ++ ld-mips-elf/attr-gnu-4-03.d, ld-mips-elf/attr-gnu-4-1.s, ++ ld-mips-elf/attr-gnu-4-10.d, ld-mips-elf/attr-gnu-4-11.d, ++ ld-mips-elf/attr-gnu-4-12.d, ld-mips-elf/attr-gnu-4-13.d, ++ ld-mips-elf/attr-gnu-4-14.d, ld-mips-elf/attr-gnu-4-2.s, ++ ld-mips-elf/attr-gnu-4-20.d, ld-mips-elf/attr-gnu-4-21.d, ++ ld-mips-elf/attr-gnu-4-22.d, ld-mips-elf/attr-gnu-4-23.d, ++ ld-mips-elf/attr-gnu-4-3.s, ld-mips-elf/attr-gnu-4-30.d, ++ ld-mips-elf/attr-gnu-4-31.d, ld-mips-elf/attr-gnu-4-32.d, ++ ld-mips-elf/attr-gnu-4-33.d, ld-mips-elf/attr-gnu-4-4.s, ++ ld-mips-elf/attr-gnu-4-41.d: New. ++ * ld-mips-elf/mips-elf.exp: Run these new tests. ++ ++2007-06-29 Joseph Myers ++ ++ Backport from FSF: ++ ++ bfd/ ++ * elf-attrs.c: New. ++ * Makefile.am (BFD32_BACKENDS): Add elf-attrs.lo. ++ (BFD32_BACKENDS_CFILES): Add elf-attrs.c. ++ (elf-attrs.lo): Generate dependencies. ++ * Makefile.in: Regenerate. ++ * configure.in (elf): Add elf-attrs.lo. ++ * configure: Regenerate. ++ * elf-bfd.h (struct elf_backend_data): Add entries for object ++ attributes. ++ (NUM_KNOWN_OBJ_ATTRIBUTES, obj_attribute, obj_attribute_list, ++ OBJ_ATTR_PROC, OBJ_ATTR_GNU, OBJ_ATTR_FIRST, OBJ_ATTR_LAST, ++ Tag_NULL, Tag_File, Tag_Section, Tag_Symbol, Tag_compatibility): ++ New. ++ (struct elf_obj_tdata): Add entries for object attributes. ++ (elf_known_obj_attributes, elf_other_obj_attributes, ++ elf_known_obj_attributes_proc, elf_other_obj_attributes_proc): ++ New. ++ (bfd_elf_obj_attr_size, bfd_elf_set_obj_attr_contents, ++ bfd_elf_get_obj_attr_int, bfd_elf_add_obj_attr_int, ++ bfd_elf_add_proc_attr_int, bfd_elf_add_obj_attr_string, ++ bfd_elf_add_proc_attr_string, bfd_elf_add_obj_attr_compat, ++ bfd_elf_add_proc_attr_compat, _bfd_elf_attr_strdup, ++ _bfd_elf_copy_obj_attributes, _bfd_elf_obj_attrs_arg_type, ++ _bfd_elf_parse_attributes, _bfd_elf_merge_object_attributes): New. ++ * elf.c (_bfd_elf_copy_private_bfd_data): Copy object attributes. ++ (bfd_section_from_shdr): Handle attributes sections. ++ * elflink.c (bfd_elf_final_link): Handle attributes sections. ++ * elfxx-target.h (elf_backend_obj_attrs_vendor, ++ elf_backend_obj_attrs_section, elf_backend_obj_attrs_arg_type, ++ elf_backend_obj_attrs_section_type): New. ++ (elfNN_bed): Update. ++ * elf32-arm.c (NUM_KNOWN_ATTRIBUTES, aeabi_attribute, ++ aeabi_attribute_list): Remove. ++ (struct elf32_arm_obj_tdata): Remove object attributes fields. ++ (check_use_blx, bfd_elf32_arm_set_vfp11_fix, using_thumb2, ++ elf32_arm_copy_private_bfd_data, elf32_arm_merge_eabi_attributes): ++ Update for new object attributes interfaces. ++ (uleb128_size, is_default_attr, eabi_attr_size, ++ elf32_arm_eabi_attr_size, write_uleb128, write_eabi_attribute, ++ elf32_arm_set_eabi_attr_contents, elf32_arm_bfd_final_link, ++ elf32_arm_new_eabi_attr, elf32_arm_get_eabi_attr_int, ++ elf32_arm_add_eabi_attr_int, attr_strdup, ++ elf32_arm_add_eabi_attr_string, elf32_arm_add_eabi_attr_compat, ++ copy_eabi_attributes, elf32_arm_parse_attributes): Remove. Moved ++ to generic code in elf-attrs.c. ++ (elf32_arm_obj_attrs_arg_type): New. ++ (elf32_arm_fake_sections): Do not handle .ARM.attributes. ++ (elf32_arm_section_from_shdr): Do not handle SHT_ARM_ATTRIBUTES. ++ (bfd_elf32_bfd_final_link): Remove. ++ (elf_backend_obj_attrs_vendor, elf_backend_obj_attrs_section, ++ elf_backend_obj_attrs_arg_type, ++ elf_backend_obj_attrs_section_type): New. ++ * elf32-bfin.c (bfin_elf_copy_private_bfd_data): Copy object ++ attributes. ++ * elf32-frv.c (frv_elf_copy_private_bfd_data): Likewise. ++ * elf32-iq2000.c (iq2000_elf_copy_private_bfd_data): Likewise. ++ * elf32-mep.c (mep_elf_copy_private_bfd_data): Likewise. ++ * elf32-mt.c (mt_elf_copy_private_bfd_data): Likewise. ++ * elf32-sh.c (sh_elf_copy_private_data): Likewise. ++ * elf64-sh64.c (sh_elf64_copy_private_data_internal): Likewise. ++ ++ binutils/ ++ * readelf.c (display_gnu_attribute): New. ++ (process_arm_specific): Rearrange as process_attributes. ++ (process_arm_specific): Replace by wrapper of process_attributes. ++ ++ gas/ ++ * as.c (create_obj_attrs_section): New. ++ (main): Call create_obj_attrs_section for ELF. ++ * read.c (s_gnu_attribute, skip_whitespace, skip_past_char, ++ skip_past_comma, s_vendor_attribute): New. ++ (potable): Add gnu_attribute for ELF. ++ * read.h (s_vendor_attribute): Declare. ++ * config/tc-arm.c (s_arm_eabi_attribute): Replace by wrapper ++ round s_vendor_attribute. ++ (aeabi_set_public_attributes): Update for new attributes ++ interfaces. ++ (arm_md_end): Remove attributes contents setting now done ++ generically. ++ ++ include/elf/ ++ * arm.h (elf32_arm_add_eabi_attr_int, ++ elf32_arm_add_eabi_attr_string, elf32_arm_add_eabi_attr_compat, ++ elf32_arm_get_eabi_attr_int, elf32_arm_set_eabi_attr_contents, ++ elf32_arm_eabi_attr_size, Tag_NULL, Tag_File, Tag_Section, ++ Tag_Symbol, Tag_compatibility): Remove. ++ * common.h (SHT_GNU_ATTRIBUTES): Define. ++ ++ ld/ ++ * emulparams/armelf.sh (OTHER_SECTIONS): Remove .ARM.attributes. ++ (ATTRS_SECTIONS): Define. ++ * scripttempl/elf.sc, scripttempl/elf32sh-symbian.sc, ++ scripttempl/elf_chaos.sc, scripttempl/elfi370.sc, ++ scripttempl/elfxtensa.sc: Handle ATTRS_SECTIONS. ++ ++2007-06-26 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c (parse_operands): Accept generic coprocessor regs ++ for OP_RVC. ++ (reg_names): Add fpinst, pfinst2, mvfr0 and mvfr1. ++ ++ gas/testsuite/ ++ * gas/arm/vfp1xD.d: Add new fmrx/fmxr tests. ++ * gas/arm/vfp1xD.s: Ditto. ++ * gas/arm/vfp1xD_t2.d: Ditto. ++ * gas/arm/vfp1xD_t2.s: Ditto. ++ ++ opcodes/ ++ * arm-dis.c (coprocessor_opcodes): Add fmxr/fmrx mvfr0/mvfr1. ++ ++2007-06-26 Joseph Myers ++ ++ * release-notes-csl.xml: Add release notes for attribute merging ++ fix. ++ ++2007-06-26 Joseph Myers ++ ++ bfd/ ++ * elf32-arm.c (copy_eabi_attributes): Copy type of attributes. ++ ++ ld/testsuite/ ++ * ld-arm/attr-merge.s, ld-arm/attr-merge.attr: New. ++ * ld-arm/arm-elf.exp (armelftests): Add new test. ++ ++2007-06-25 Paul Brook ++ ++ gas/ ++ * config/tc-arm.c (do_t_mov_cmp): Handle shift by register and ++ narrow shift by immediate. ++ ++ gas/testsuite/ ++ * gas/arm/thumb32.s: Add tests for shift instructions. ++ * gas/arm/thumb32.d: Ditto. ++ ++2007-06-25 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-06-25 Richard Sandiford ++ ++ * elfxx-mips.c (mips_elf_calculate_relocation): Allow local stubs ++ to be used for calls from MIPS16 code. ++ ++ gas/ ++ 2007-06-25 Richard Sandiford ++ ++ * config/tc-mips.h (TC_SYMFIELD_TYPE): New. ++ * config/tc-mips.c (append_insn): Record which symbols have ++ R_MIPS16_26 relocations against them. ++ (mips_fix_adjustable): Don't reduce relocations against such symbols. ++ ++ ld/testsuite/ ++ 2007-06-25 Richard Sandiford ++ ++ * ld-mips-elf/mips16-local-stubs-1.s, ++ * ld-mips-elf/mips16-local-stubs-1.d: New tests. ++ * ld-mips-elf/mips-elf.exp: Run them. ++ ++2007-06-18 Nathan Sidwell ++ ++ Bug 1722 ++ gas/testsuite/ ++ * gas/m68k/mcf-coproc.d: New. ++ * gas/m68k/mcf-coproc.s: New. ++ * gas/m68k/all.exp: Add it. ++ ++ gas/ ++ * config/tc-m68k.c (m68k_ip): Add j & K operand types. ++ (install_operand): Add E encoding. ++ (md_begin): Check and skip initial '.' arg character. ++ (get_num): Add 0..511 case. ++ ++ include/ ++ * opcode/m68k.h: Document j K & E. ++ ++ opcodes/ ++ * m68k-dis.c (fetch_arg): Add E. Replace length switch with ++ direct masking. ++ (print_ins_arg): Add j & K operand types. ++ (match_insn_m68k): Check and skip initial '.' arg character. ++ (m68k_scan_mask): Likewise. ++ * m68k-opc.c (m68k_opcodes): Add coprocessor instructions. ++ ++2007-06-14 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (mcf52235_ctrl): Add cache registers. ++ (mcf5253_ctrl): Add RAMBAR, MBAR, MBAR2. ++ (mcf5407_ctrl): New. ++ (m68k_cpus): Adjust 5407 entry. ++ ++2007-06-13 Joseph Myers ++ ++ ld/ ++ * config.in: Regenerate. ++ * ld.h (args_type): Add poison_system_directories. ++ * ld.texinfo (--no-poison-system-directories): Document. ++ * ldfile.c (ldfile_add_library_path): Check ++ command_line.poison_system_directories. ++ * ldmain.c (main): Initialize ++ command_line.poison_system_directories. ++ * lexsup.c (enum option_values): Add ++ OPTION_NO_POISON_SYSTEM_DIRECTORIES. ++ (ld_options): Add --no-poison-system-directories. ++ (parse_args): Handle new option. ++ ++2007-06-13 Nathan Sidwell ++ ++ ld/ ++ * ldexp.c (foldname): ALIGNOF should not be divided by opb. ++ ++2007-06-11 Julian Brown ++ ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_vfp11_erratum_scan): Skip BFDs with ++ EXEC_P or DYNAMIC flags, and skip sections which are being linked ++ with --just-symbols (-R). ++ ++2007-06-11 Nathan Sidwell ++ ++ binutils/ ++ * dwarf.c (decode_location_expression): Add DW_OP_form_tls_address. ++ ++ ld/ ++ * ldlex.l, ldgram.y: Add ALIGNOF. ++ * ldexp.c (exp_print_token, foldname): Likewise. ++ * ld.texinfo: Likewise. ++ ++ ld/testsuite/ ++ * ld-scripts/alignof.s: New. ++ * ld-scripts/alignof.t: New ++ * ld-scripts/alignof.exp: New. ++ ++2007-06-06 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (s_align): Pad code sections appropriately. ++ ++ gas/testsuite/ ++ * gas/arm/thumb.d: Update expected output. ++ * gas/arm/thumb2_relax.d: Ditto. ++ ++2007-06-06 Joseph Myers ++ Paul Brook ++ ++ gas/ ++ * remap.c: New. ++ * as.h (remap_debug_filename, add_debug_prefix_map): Declare. ++ * as.c (show_usage): Document --debug-prefix-map option. ++ (parse_args): Handle --debug-prefix-map. ++ * dwarf2dbg.c (out_file_list, out_debug_info): Remap debug paths. ++ * stabs.c (stabs_generate_asm_file): Remap debug paths. ++ * Makefile.am (GAS_CFILES): Add remap.c ++ (GENERIC_OBJS): Add remap.o. ++ * Makefile.in: Regenerate. ++ * doc/as.texinfo (--debug-prefix-map): Document. ++ ++2007-06-05 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (insns): Correct Thumb-2 ldrd/strd opcodes. ++ ++ gas/testsuite/ ++ * gas/arm/thumb32.d: Add writeback addressing mode tests. ++ * gas/arm/thumb32.s: Update expected output. ++ ++ opcodes/ ++ * arm-dis.c (thumb32_opcodes): Display writeback ldrd/strd addresses. ++ ++2007-06-04 Joseph Myers ++ ++ bfd/ ++ * elflink.c (bfd_elf_link_record_dynamic_symbol): Do not set ++ dynindx for indirect symbols. ++ ++2007-05-31 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (insns): Allow strex on M profile cores. ++ ++2007-05-27 Nathan Sidwell ++ ++ Bug 1652 ++ gas/ ++ * app.c (do_scrub_chars): Cope with \ at end of buffer. ++ ++ * release-notes-csl.xml: Document fix. ++ ++2007-03-25 Paul Brook ++ ++ Backport from FSF. ++ gas/ ++ * config/tc-arm.c (T2_SUBS_PC_LR): Define. ++ (do_t_add_sub): Correctly encode subs pc, lr, #const. ++ (do_t_mov_cmp): Correctly encode movs pc, lr. ++ ++ gas/testsulte/ ++ * gas/arm/thumb32.s: Add tests for subs pc, lr. ++ * gas/arm/thumb32.d: Change error-output: to stderr:. ++ Update expected output. ++ ++2007-05-24 Nathan Sidwell ++ ++ ld/ ++ * ldlex.l: ASSERT is recognized in SCRIPT env. NAMES cannot ++ contain commas in EXP env. ++ * ldgram.y (extern_name_list): Push to EXP env, move body to ... ++ (extern_name_list_body): ... here. ++ (script_file, ifile_list): Reformat. ++ (statement): Add ASSERT. ++ ++ ld/testsuite/ ++ * ld/ld-scripts/assert.t: Add additional cases. ++ * ld-scripts/extern.t, ld-scripts/extern.s, ++ ld-scripts/extern.exp: New. ++ ++2007-05-22 Paul Brook ++ ++ Backport from FSF. ++ ld/testsuite/ ++ * ld-arm/arm-pic-veneer.d: Update expected output. ++ * ld-arm/arm-call.d: Ditto. ++ ++ bfd/ ++ * elf32-arm.c (output_arch_syminfo): Replace plt_shndx and plt_offset ++ with sec and sec_shndx. ++ (elf32_arm_ouput_plt_map_sym): Use them. ++ (elf32_arm_output_arch_local_syms): Output mapping symbols for ++ interworking glue. ++ ++2007-05-22 Paul Brook ++ ++ Backport from FSF. ++ bunutils/ ++ * objdump.c (find_symbol_for_address): Merge section and target ++ specific filtering code. ++ ++ ld/testsuite/ ++ * ld-arm-mixed-lib.d: Update expected output. ++ * ld-arm/arm-app.d: Ditto. ++ * ld-arm/mixed-app.d: Ditto. ++ * ld-arm/arm-lib-plt32.d: Ditto. ++ * ld-arm/arm-app-abs32.d: Ditto. ++ * ld-arm/mixed-app-v5.d: Ditto. ++ * ld-arm/armthumb-lib.d: Ditto. ++ * ld-arm/arm-lib.d: Ditto. ++ ++ gas/testsuite/ ++ * gas/arm/backslash-at.d: Update expected output. ++ ++2007-05-21 Richard Sandiford ++ ++ Backport from mainline: ++ ++ binutils/ ++ 2007-05-21 Richard Sandiford ++ ++ * objdump.c (disassemble_bytes): Ignore disassembler_needs_relocs ++ for executables and shared libraries. ++ ++ ld/testsuite/ ++ 2007-05-21 Richard Sandiford ++ ++ * ld-arm/emit-relocs1.d, ld-arm/emit-relocs1.s, ++ * ld-arm/emit-relocs1-vxworks.d: New tests. ++ * ld-arm/arm-elf.exp: Run them. ++ * ld-arm/vxworks1.dd: Expect proper branch targets. ++ ++2007-05-18 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (LONG_BRANCH_VIA_COND): New. ++ (BRANCHBWPL, FRAG_VAR_SIZE): New. ++ (md_relax_table): Add BRANCHBWPL entries. ++ (m68k_ip): Choose BRANCHBWPL relaxation if necessary. ++ (md_assemble): Use FRAG_VAR_SIZE. ++ (md_convert_frag_1): Add BRANCHBWPL cases. ++ (md_estimate_size_before_relaz): Likewise. ++ ++ gas/testsuite/ ++ * gas/m68k/br-isaa.d: Dump relocs too. ++ * gas/m68k/br-isab.d: Likewise. ++ * gas/m68k/br-isac.d: Likewise. Adjust for long branch relaxation. ++ ++2007-05-18 Joseph Myers ++ ++ * release-notes-csl.xml: Add release notes for .set change. ++ ++2007-05-18 Joseph Myers ++ ++ ld/testsuite/ ++ * ld-elf/group.ld: Discard .reginfo. ++ ++2007-05-18 Joseph Myers ++ ++ gas/ ++ * config/tc-mips.c (s_mipsset): Use generic s_set for directives ++ containing a comma. ++ ++2007-05-18 Richard Sandiford ++ ++ Backport from mainline: ++ ++ ld/ ++ 2007-05-18 Richard Sandiford ++ ++ * emulparams/elf32ebmipvxworks.sh (OTHER_READONLY_SECTIONS) ++ (OTHER_READWRITE_SECTIONS): Define. Add .rdata sections. ++ ++2007-05-18 Paul Brook ++ ++ Backport from FSF: ++ bfd/ ++ * elf32-arm.c (ARM2THUMB_V5_STATIC_GLUE_SIZE): Define. ++ (a2t1v5_ldr_insn, a2t1v5_ldr_insn): New. ++ (record_arm_to_thumb_glue): Add v5t non-pic glue. ++ (elf32_arm_create_thumb_stub): Ditto. ++ ++ ld/testsuite/ ++ * ld-arm/arm-call.d: Update expected output. ++ ++2007-05-16 Paul Brook ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_link_hash_entry): Add ++ plt_maybe_thumb_refcount. ++ (elf32_arm_link_hash_newfunc): Set plt_maybe_thumb_refcount. ++ (elf32_arm_copy_indirect_symbol): Ditto. ++ (elf32_arm_adjust_dynamic_symbol): Ditto. ++ (bfd_elf32_arm_process_before_allocation): Handle R_ARM_THM_JUMP24. ++ (arm_add_to_rel): Ditto. ++ (elf32_arm_final_link_relocate): Merge R_ARM_THM_JUMP24 with ++ R_ARM_THM_CALL. Handle R_ARM_THM_JUMP19 against a PLT stub. ++ (elf32_arm_gc_sweep_hook): Call check_use_blx. Update plt counts ++ for R_ARM_THM_JUMP24 and R_ARM_THM_JUMP19. ++ (elf32_arm_check_relocs): Update plt counts for R_ARM_THM_JUMP24 ++ and R_ARM_THM_JUMP19. ++ (allocate_dynrelocs): Use plt_maybe_thumb_refcount. ++ (elf32_arm_finish_dynamic_symbol): Ditto. ++ (elf32_arm_output_plt_map): Ditto. ++ ++2007-05-16 Paul Brook ++ ++ * config/tc-arm.c (v7m_psrs): Add uppercase PSR names and xpsr. ++ ++2007-05-16 Joseph Myers ++ ++ binutils/testsuite/ ++ * binutils-all/strip-3.d: Strip .pdr section. ++ ++2007-05-16 Nathan Sidwell ++ ++ ld/testsuite/ ++ * ld-m68k-merge-error-1a.d: Mismatch is an error. ++ * ld-m68k-merge-error-1b.d: Likewise. ++ * ld-m68k-merge-error-1c.d: Likewise. ++ * ld-m68k-merge-error-1d.d: Likewise. ++ * ld-m68k-merge-error-1e.d: Likewise. ++ ++ gas/ ++ * config/tc-m68k.c (md_apply_fix): Show value of out of range ++ fixups in error message. ++ (md_conver_frag_1): Propagate the fix source location and use ++ as_bad_where rather than fatal, for better error messages. ++ ++2007-05-15 Richard Sandiford ++ ++ Backport from mainline: ++ ++ ld/testsuite/ ++ 2007-05-15 Richard Sandiford ++ ++ * ld-arm/vxworks1.ld: Swap .bss and .data. ++ * ld-arm/vxworks1-lib.rd: Update accordingly. ++ * ld-arm/vxworks1-lib.td: New test. ++ * ld-arm/arm-elf.exp: Run it. ++ ++ * ld-i386/vxworks1.ld: Swap .bss and .data. ++ * ld-i386/vxworks1-lib.rd: Update accordingly. ++ * ld-i386/vxworks1-lib.td: New test. ++ * ld-i386/i386.exp: Run it. ++ ++ * ld-mips-elf/vxworks1.ld: Swap .bss and .data. ++ * ld-mips-elf/vxworks1-lib.rd: Update accordingly. ++ * ld-mips-elf/vxworks1.rd: Likewise. ++ ++ * ld-powerpc/vxworks1.ld: Swap .bss and .data. ++ * ld-powerpc/vxworks1-lib.rd: Update accordingly. ++ * ld-powerpc/vxworks1-lib.td: New test. ++ * ld-powerpc/powerpc.exp: Run it. ++ ++ * ld-sh/vxworks1.ld: Swap .bss and .data. ++ * ld-sh/vxworks1-lib.rd: Update accordingly. ++ * ld-sh/vxworks1-lib.td: New test. ++ * ld-sh/sh-vxworks.exp: Run it. ++ ++ * ld-sparc/vxworks1.ld: Swap .bss and .data. ++ * ld-sparc/vxworks1-lib.rd: Update accordingly. ++ * ld-sparc/vxworks1-lib.td: New test. ++ * ld-sparc/sparc.exp: Run it. ++ ++2007-05-15 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-05-15 Richard Sandiford ++ ++ * elfxx-mips.c (mips_elf_create_local_got_entry): Remove ++ input_section argument. Create .rela.dyn relocations against ++ symbol 0 rather than the section symbol. ++ (mips_elf_local_got_index): Remove input_section argument. ++ Update call to mips_elf_create_local_got_entry. ++ (mips_elf_got_page, mips_elf_got16_entry): Likewise. ++ (mips_elf_calculate_relocation): Update calls to ++ mips_elf_local_got_index, mips_elf_got16_entry and mips_elf_got_page. ++ ++ ld/testsuite/ ++ 2007-05-15 Richard Sandiford ++ ++ * ld-mips-elf/vxworks1-lib.rd: Expect the GOT relocation to be ++ against symbol 0. ++ ++2007-05-14 Richard Sandiford ++ ++ bfd/ ++ * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Initialize ++ _bfd_copy_link_hash_symbol_type. ++ ++2007-05-14 Joseph Myers ++ ++ Backport from mainline: ++ bfd/ ++ 2007-05-12 Alan Modra ++ PR 4497 ++ * elf-eh-frame.c (struct cie): Add "local_personality". Make ++ "personality" a union. ++ (cie_eq): Compare local_personality too. Adjust personality ++ comparison. ++ (_bfd_elf_discard_section_eh_frame): Check binding on personality ++ reloc sym to allow for bad symtab. Use stashed local syms rather ++ than reading personality local sym. Handle discarded sections. ++ ++2007-05-14 Richard Sandiford ++ ++ Backport from mainline: ++ ++ ld/testsuite/ ++ 2007-05-14 Richard Sandiford ++ ++ * ld-sh/vxworks1.dd: Remove hexadecimal prefixes from constant pool ++ contents. Consistently use "!" as the comment character. ++ Consistently use _PROCEDURE_LINKAGE_TABLE_ in the first PLT entry. ++ * ld-sh/vxworks1-le.dd: Likewise. ++ * ld-sh/vxworks1-lib.dd: Likewise. ++ * ld-sh/vxworks1-lib-le.dd: Likewise. ++ * ld-sh/vxworks3.dd: Likewise. ++ * ld-sh/vxworks3-le.dd: Likewise. ++ ++2007-05-11 Paul Brook ++ ++ ld/ ++ * ldexp.c (exp_fold_tree_1): Copy symbol type for simple ++ assignments. ++ ++ ld/testsuite/ ++ * ld-arm/script-type.s: New test. ++ * ld-arm/arm-elf.exp: New test. ++ * ld-arm/script-type.ld: New test. ++ ++ bfd/ ++ * elf-bfd.h (_bfd_elf_copy_link_hash_symbol_type): Add prototype. ++ * libbfd-in.h (_bfd_generic_copy_link_hash_symbol_type): Add ++ prototype. ++ * elflink.c (_bfd_elf_copy_link_hash_symbol_type): New function. ++ * linker.c (_bfd_generic_copy_link_hash_symbol_type): New ++ function. ++ * targets.c (BFD_JUMP_TABLE_LINK, struct bfd_target): Add ++ _copy_link_hash_symbol_type. ++ * aout-adobe.c (aout_32_bfd_copy_link_hash_symbol_type): Define. ++ * aout-target.h (MY_bfd_copy_link_hash_symbol_type): Define. ++ * aout-tic30.c (MY_bfd_copy_link_hash_symbol_type): Define. ++ * binary.c (binary_bfd_copy_link_hash_symbol_type): Define. ++ * bout.c (b_out_bfd_copy_link_hash_symbol_type): Define. ++ * coffcode.h (coff_bfd_copy_link_hash_symbol_type): Define. ++ * elfxx-target.h (bfd_elfNN_bfd_copy_link_hash_symbol_type): Define. ++ * i386msdos.c (msdos_bfd_copy_link_hash_symbol_type): Define. ++ * i386os9k.c (os9k_bfd_copy_link_hash_symbol_type): Define. ++ * ieee.c (ieee_bfd_copy_link_hash_symbol_type): Define. ++ * ihex.c (ihex_bfd_copy_link_hash_symbol_type): Define. ++ * libecoff.h (_bfd_ecoff_bfd_copy_link_hash_symbol_type): Define. ++ * mach-o.c (bfd_mach_o_bfd_copy_link_hash_symbol_type): Define. ++ * mmo.c (mmo_bfd_copy_link_hash_symbol_type): Define. ++ * nlm-target.h (nlm_bfd_copy_link_hash_symbol_type): Define. ++ * oasys.c (oasys_bfd_copy_link_hash_symbol_type): Define. ++ * pef.c (bfd_pef_bfd_copy_link_hash_symbol_type): Define. ++ * ppcboot.c (ppcboot_bfd_copy_link_hash_symbol_type): Define. ++ * som.c (som_bfd_copy_link_hash_symbol_type): Define. ++ * srec.c (srec_bfd_copy_link_hash_symbol_type): Define. ++ * tekhex.c (tekhex_bfd_copy_link_hash_symbol_type): Define. ++ * versados.c (versados_bfd_copy_link_hash_symbol_type): Define. ++ * vms.c (vms_bfd_copy_link_hash_symbol_type): Define. ++ * xsym.c (bfd_sym_bfd_copy_link_hash_symbol_type): Define. ++ * bfd-in2.h: Regenerate. ++ * libbfd.h: Regenerate. ++ ++2007-05-11 Joseph Myers ++ ++ Backport from mainline: ++ gas/ ++ 2007-04-30 Alan Modra ++ PR 4436 ++ * config/tc-ppc.c (ppc_insert_operand): Disable range check if ++ min > max. ++ ++ opcodes/ ++ 2007-04-30 Alan Modra ++ PR 4436 ++ * ppc-opc.c (powerpc_operands): Correct bitm for second entry of MBE. ++ ++ gas/ ++ 2007-05-02 Alan Modra ++ PR 4448 ++ * config/tc-ppc.c (ppc_insert_operand): Don't increase min for ++ PPC_OPERAND_PLUS1. ++ ++ include/opcode/ ++ 2007-05-02 Alan Modra ++ * ppc.h (PPC_OPERAND_PLUS1): Update comment. ++ ++2007-05-10 Carlos O'Donell ++ ++ * Makefile.tpl: Add install-pdf to install target deps. ++ * Makefile.in: Regenerate. ++ ++2007-05-10 Carlos O'Donell ++ ++ bfd/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am ++ and install-pdf-recursive targets. Define pdfdir. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate ++ * doc/Makefile.in: Regenerate. ++ ++ binutils/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ * doc/Makefile.in: Regenerate. ++ ++ etc/ ++ * configure.in: ACSUBST pdfdir. ++ * configure: Regenerate. ++ ++ opcodes/ ++ * Makefile.am: Add install-pdf target. ++ * po/Make-in: Add install-pdf target. ++ * Makefile.in: Regenerate. ++ ++ gas/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ * doc/Makefile.in: Regenerate. ++ ++ gprof/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. Define pdf__strip_dir. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ ++ ld/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. Define pdf__strip_dir. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ ++2007-05-10 Kazu Hirata ++ ++ Issue 1569 ++ Backport from mainline: ++ bfd/ ++ 2007-05-11 Alan Modra ++ PR 4454 ++ * elf-eh-frame.c (struct cie): Make "personality" a bfd_vma. ++ (_bfd_elf_discard_section_eh_frame): Handle local syms on ++ personality relocation. ++ ++2007-05-10 Nathan Sidwell ++ ++ * Makefile.tpl: Add install-pdf to install target deps. ++ * Makefile.in: Regenerate. ++ ++2007-05-10 Carlos O'Donell ++ ++ bfd/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am ++ and install-pdf-recursive targets. Define pdfdir. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate ++ * doc/Makefile.in: Regenerate. ++ ++ binutils/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ * doc/Makefile.in: Regenerate. ++ ++ etc/ ++ * configure.in: ACSUBST pdfdir. ++ * configure: Regenerate. ++ ++ opcodes/ ++ * Makefile.am: Add install-pdf target. ++ * po/Make-in: Add install-pdf target. ++ * Makefile.in: Regenerate. ++ ++ gas/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. ++ * doc/Makefile.am: Define pdf__strip_dir. Add ++ install-pdf and install-pdf-am targets. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ * doc/Makefile.in: Regenerate. ++ ++ gprof/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. Define pdf__strip_dir. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ ++ ld/ ++ * configure.in: ACSUBST pdfdir. ++ * Makefile.am: Add install-pdf, install-pdf-am, ++ and install-pdf-recursive targets. Define pdf__strip_dir. ++ * po/Make-in: Add install-pdf target. ++ * configure: Regenerate. ++ * Makefile.in: Regenerate. ++ ++2007-05-10 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-05-10 Richard Sandiford ++ ++ * elf32-arm.c (elf32_arm_check_relocs): Don't create PLT entries ++ for R_ARM_ABS12 relocs. ++ (elf32_arm_finish_dynamic_symbol): Fix the loop that creates ++ non-shared VxWorks PLT entries. ++ ++ ld/testsuite/ ++ 2007-05-10 Richard Sandiford ++ ++ * ld-arm/vxworks1-lib.dd: Expect "push" instead of stmdb and ++ "pop" instead of ldmia. Don't require specific symbolic addresses ++ for in-text addresses. Expect data to be rendered as .words rather ++ than disassembled. ++ * ld-arm/vxworks1.dd: Likewise. ++ ++2007-05-10 Richard Sandiford ++ ++ Backport from mainline: ++ ++ bfd/ ++ 2007-05-10 Richard Sandiford ++ ++ * elf.c (assign_file_positions_for_load_sections): Use p_memsz ++ rather than p_filesz to calculate the LMA of the end of a segment. ++ ++ ld/testsuite/ ++ 2007-05-10 Richard Sandiford ++ ++ * ld-elf/multibss1.d, ld-elf/multibss1.s: New test. ++ ++2007-05-10 Kazu Hirata ++ ++ Issue 1569 ++ Backport from mainline: ++ bfd/ ++ 2007-05-11 Alan Modra ++ PR 4454 ++ * elf-eh-frame.c (struct cie): Make "personality" a bfd_vma. ++ (_bfd_elf_discard_section_eh_frame): Handle local syms on ++ personality relocation. ++ ++2007-05-09 Nathan Sidwell ++ ++ * release-notes-csl.xml: Document fix. ++ ++ opcodes/ ++ * m68k-opc.c (m68k_opcodes): Add wdebugl variants. ++ ++2007-05-09 Kazu Hirata ++ ++ * release-notes-csl.xml: Insert a blank line before the first ++ release note fragment. ++ ++2007-05-04 Mark Shinwell ++ ++ * release-notes-csl.xml (ARM EABI compliance): New. ++ ++ gas/ ++ * config/te-armeabi.h (EABI_DEFAULT): Use EF_ARM_EABI_VER5. ++ * config/te-armlinuxeabi.h (EABI_DEFAULT): Likewise. ++ ++2007-05-04 Kazu Hirata ++ ++ Backport from mainline: ++ gas/testsuite/ ++ * gas/m68k/all.exp: Skip fmoveml on fido. ++ ++2007-05-04 Mark Shinwell ++ ++ binutils/testsuite/ ++ * binutils-all/strip-3.d: Strip .ARM.attributes section. ++ ++2007-05-04 Mark Shinwell ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-04-20 Mark Shinwell ++ ++ * release-notes-csl.xml (Conditional Thumb-2 branch ++ instructions): New. ++ ++ bfd/ ++ * elf32-arm.c (elf32_arm_final_link_relocate): Correctly ++ handle the Thumb-2 JUMP19 relocation. ++ ++ ld/testsuite/ ++ * ld-arm/arm-elf.exp: Add jump19 testcase. ++ * ld-arm/jump19.d: New. ++ * ld-arm/jump19.s: New. ++ ++2007-05-04 Mark Shinwell ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-04-20 Mark Shinwell ++ ++ * release-notes-csl.xml (Linking of non-ELF images): New. ++ ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_vfp11_erratum_scan): Don't ++ attempt to scan if the bfd doesn't correspond to an ELF image. ++ (bfd_elf32_arm_vfp11_fix_veneer_locations): Likewise. ++ ++2007-05-03 Mark Shinwell ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-04-27 Mark Shinwell ++ ++ gas/ ++ * config/tc-arm.c (md_apply_fix): Generate more accurate ++ diagnostic when 8-bit immediate range is exceeded for ++ BFD_RELOC_ARM_OFFSET_IMM8. ++ ++2007-05-03 Sandra Loosemore ++ ++ bfd/ ++ * elf32-arm.c (allocate_dynrelocs): Fix typo in comment. ++ ++2007-05-03 Paul Brook ++ ++ Merge from CSL-2.17 branch. ++ 2007-04-17 Paul Brook ++ gas/ ++ * config/tc-arm.c (arm_ext_msr): New variable. ++ (md_assemble): Allow v6-M 32-bit instructions without requiring ++ Thumb-2. ++ (insns): Use arm_ext_msr for Thumb MSR and MRS. ++ (cpu_arch): Add V6M. Fix numbering of V6K and V6T2. ++ gas/testsuite/ ++ * gas/arm/archv6m.d: New test. ++ * gas/arm/archv6m.s: New test. ++ include/opcode/ ++ * arm.h (ARM_EXT_THUMB_MSR): Define. ++ (ARM_AEXT_V6T2, ARM_AEXT_V6M): Use it. ++ ++ 2006-12-15 Paul Brook ++ gas/ ++ * config/tc-arm.c (arm_ext_barrier, arm_ext_m): New. ++ (do_t_mrs): Use arm_ext_m. ++ (insns): Allow dmb, dsb and isb on ARMv6-M. ++ (arm_cpu_option_table): Add cortex-m1. ++ (arm_arch_option_table): Add armv6-m. ++ (aeabi_set_public_attributes): Use arm_ext_m. ++ include/ ++ * opcode/arm.h (ARM_EXT_V6M, ARM_EXT_BARRIER, ARM_AEXT_V6M, ++ ARM_ARCH_V6M): Define. ++ (ARM_AEXT_V7_ARM, ARM_AEXT_V7M): Include ARM_EXT_BARRIER. ++ ++2007-04-27 Mark Shinwell ++ ++ * release-notes-csl.xml (The \@ assembler pseudo-variable): ++ New. ++ ++ gas/ ++ * app.c (do_scrub_chars): Don't damage \@ pseudo-variables. ++ ++ gas/testsuite/ ++ * gas/arm/backslash-at.d: New. ++ * gas/arm/backslash-at.s: New. ++ ++2007-04-25 Mark Mitchell ++ ++ libiberty/ ++ * cygpath.c (): Include it. ++ (cygpath_log): New variable. ++ (cygpath_log_msg_arg): New function. ++ (cygpath_log_msg): Likewise. ++ (cygpath_perror): Likewise. ++ (cygpath_close): Declare as prototyped function. Close the log ++ file. ++ (cygpath): Log interaction with cygpath. If cygpath dies ++ unexpectedly, restart it. ++ (set_errno_from_windows_code): Avoid signed/unsigned comparison. ++ ++2007-04-23 Joseph Myers ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-01-24 Joseph Myers ++ bfd/ ++ * config.bfd (mips*el-*-linux*, mips*-*-linux*): Remove ++ ecoff_little_vec and ecoff_big_vec. ++ ++2007-04-23 Sandra Loosemore ++ ++ * release-notes-csl.xml (Binutils update): New. ++ ++2007-04-23 Richard Sandiford ++ ++ gas/testsuite/ ++ * gas/mips/ulh3.s, gas/mips/ulh3-el.d, gas/mips/ulh3-eb.d, ++ * gas/mips/octeon1.s, gas/mips/octeon1.l, gas/mips/octeon2.s, ++ * gas/mips/octeon2-un.d, gas/mips/octeon2-noun.d, ++ * gas/mips/octeon2-mix.d, gas/mips/octeon3.s, ++ * gas/mips/octeon3.d: New tests. ++ * gas/mips/mips.exp: Run them. Don't run ulh2 on mips32r2 targets. ++ ++2007-04-23 Richard Sandiford ++ ++ Adapted from a patch by Cavium Networks. ++ ++ include/elf/ ++ * mips.h (E_MIPS_MACH_OCTEON): New macro. ++ ++ include/opcode/ ++ * mips.h: Document '^', ';' and 'y'. ++ (OP_MASK_BITIND, OP_SH_BITIND): New macros. ++ (INSN_OCTEON, CPU_OCTEON): Likewise. ++ (OPCODE_IS_MEMBER): Handle CPU_OCTEON. ++ ++ bfd/ ++ * archures.c (bfd_mach_mips_octeon): Define. ++ * bfd-in2.h: Regenerate. ++ * cpu-mips.c (I_mipsocteon): Define. ++ (arch_info_struct): Add a "mips:octeon" entry. ++ * elfxx-mips.c (_bfd_elf_mips_mach): Handle E_MIPS_MACH_OCTEON. ++ (mips_set_isa_flags): Handle bfd_mach_mips_octeon. ++ (mips_mach_extensions): List bfd_mach_mips_octeon as an extension ++ of bfd_mach_mipsisa64. ++ ++ binutils/ ++ * readelf.c (get_machine_flags): Handle E_MIPS_MACH_OCTEON. ++ ++ opcodes/ ++ * mips-dis.c (octeon_use_unalign): New variable. ++ (mips_cp0_names_octeon, mips_cp0sel_names_octeon): New tables. ++ (mips_arch_choices): Add an octeon entry. ++ (parse_mips_dis_option): Handle octeon-useun and no-octeon-useun. ++ (print_insn_args): Handle '^' and 'y'. ++ (print_insn_mips): Skip aliases of uld, ulw, usd and usw when ++ unaligned octeon instructions are allowed. Print ldr, lwr, ++ sdr and swr as nops in that case. ++ (print_mips_disassembler_options): Print help for octeon-useun and ++ no-octeon-useun. ++ * mips-opc.c (IOCTEON): Define. ++ (mips_builtin_opcodes): Add Octeon baddu, bbit032, bbit0, bbit132, ++ bbit1, cins32, cins, dmul, dpop, exts32, exts, exts, mtm0, mtm1, ++ mtm2, mtp0, mtp1, mtp2, pop, seq, seqi, sne, snei, syncio, ++ synciobdma, syncioall, syncs, syncw, syncws, uld, ulw, usd, usw, ++ v3mulu, vmm0, vmulu, dmfc2 and dmtc2 instructions. ++ ++ gas/ ++ * config/tc-mips.c (octeon_use_unalign): New variable. ++ (ISA_HAS_INS): New macro. ++ (CPU_HAS_DROR): Return true for CPU_OCTEON. ++ (CPU_HAS_INS): New macro. ++ (macro_build): Handle '^' and 'y'. ++ (macro2): Try to use "ins" instead of "sll" and "or" in the ++ implementation of ulh and ulhu. Treat uld, ulw, usd and usw ++ as normal stores if the Octeon unaligned instructions are allowed. ++ (validate_mips_insn): Handle '^', ';' and 'y'. ++ (mips_ip): Ignore the uld, ulw, usd and usw hardware instructions ++ unless they have been enabled. Refuse to assemble left/right stores ++ when uld, ulw, usd and usw are enabled. Handle '^', ';' and 'y'. ++ (OPTION_OCTEON_UNALIGNED, OPTION_NO_OCTEON_UNALIGNED): New macros. ++ (OPTION_ELF_BASE): Bump by two. ++ (md_longopts): Add -mocteon-useun and -mno-octeon-useun. ++ (md_parse_option): Handle them. ++ (mips_cpu_info_table): Add an "octeon" entry. ++ (md_show_usage): Mention -mocteon-useun and -mno-octeon-useun. ++ ++2007-04-22 Mark Shinwell ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-02-02 Mark Shinwell ++ ++ gas/ ++ * config/tc-arm.c (arm_ext_marvell_f): New. ++ (do_marvell_div): New. ++ (insns): Add entries for Marvell-specific sdiv and udiv encodings. ++ (arm_cpu_option_table): Add marvell-f entry. ++ (arm_arch_option_table): Add marvell-f entry. ++ * include/opcode/arm.h (ARM_CEXT_MARVELL_F): New. ++ (ARM_ARCH_MARVELL_F): New. ++ ++ gas/testsuite/ ++ * gas/arm/marvell-f-div.d: New. ++ * gas/arm/marvell-f-div.s: New. ++ ++ 2007-01-03 Mark Shinwell ++ ++ NOT ASSIGNED TO FSF ++ Port from Marvell compiler: ++ gas/ ++ * config/tc-arm.c (arm_cpus): Add marvell-f entry. ++ ++2007-04-20 Nathan Sidwell ++ ++ gas/testsuite/ ++ * gas/m68k/br-isaa.s: New. ++ * gas/m68k/br-isaa.d: New. ++ * gas/m68k/br-isab.s: New. ++ * gas/m68k/br-isab.d: New. ++ * gas/m68k/br-isac.s: New. ++ * gas/m68k/br-isac.d: New. ++ * gas/m68k/all.exp: Adjust. ++ ++ gas/ ++ * config/tc-m68k.c (mcf54455_ctrl): New. ++ (HAVE_LONG_DISP, HAVE_LONG_CALL, HAVE_LONG_COND): New. ++ (m68k_archs): Add isac. ++ (m68k_cpus): Add 54455 family. ++ (m68k_ip): Split Bg into Bb, Bs, Bg. ++ (m68k_elf_final_processing): Add ISA_C. ++ * doc/c-m68k.texi (M680x0 Options): Add isac. ++ ++ include/opcode/ ++ * m68k.h (mcfisa_c): New. ++ (mcfusp, mcf_mask): Adjust. ++ ++ bfd/ ++ * archures.c (bfd_mach_mcf_isa_c, bfd_mach_mcf_isa_c_mac, ++ bfd_mach_mcf_isa_c_emac): New. ++ * elf32-m68k.c (ISAC_PLT_ENTRY_SIZE, elf_isac_plt0_entry, ++ elf_isac_plt_entry, elf_isac_plt_info): New. ++ (elf32_m68k_object_p): Add ISA_C. ++ (elf32_m68k_print_private_bfd_data): Print ISA_C. ++ (elf32_m68k_get_plt_info): Detect ISA_C. ++ * cpu-m68k.c (arch_info): Add ISAC. ++ (m68k_arch_features): Likewise, ++ (bfd_m68k_compatible): ISAs B & C are not compatible. ++ ++ opcodes/ ++ * m68k-opc.c: Mark mcfisa_c instructions. ++ ++2007-04-20 Joseph Myers ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-03-20 Joseph Myers ++ Based on patch by Mark Hatle . ++ ld/ ++ * configure.in (--enable-poison-system-directories): New option. ++ * configure, config.in: Regenerate. ++ * ldfile.c (ldfile_add_library_path): If ++ ENABLE_POISON_SYSTEM_DIRECTORIES defined, warn for use of /lib, ++ /usr/lib, /usr/local/lib or /usr/X11R6/lib. ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-03-22 Julian Brown ++ bfd/ ++ * elf32-arm.c (bfd_elf32_arm_set_vfp11_fix): Default to fixing for ++ scalar code on pre-ARMv7. ++ ld/ ++ * ld.texinfo: Document this default. ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-03-23 Richard Sandiford ++ bfd/ ++ From Phil Edwards : ++ * cache.c (bfd_cache_delete): Work around ClearCase bug. ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2006-04-12 Carlos O'Donell ++ * Makefile.tpl: Add install-html to install target deps. ++ * Makefile.in: Regenerate. ++ ++2007-04-20 Mark Mitchell ++ Vladimir Prus ++ Carlos O'Donell ++ Joseph Myers ++ ++ libiberty/ ++ * configure.ac: Add cygpath for mingw hosts. ++ * configure: Rebuilt. ++ * Makefile.in: Add cygpath. ++ * cygpath.c: New. ++ ++2007-04-20 Joseph Myers ++ ++ Merge from Sourcery G++ binutils 2.17: ++ ++ 2007-03-01 Joseph Myers ++ gas/ ++ * configure.in (mips64el-sicortex-linux-gnu): Set ++ mips_default_abi=N64_ABI. ++ * configure: Regenerate. ++ ++ 2007-02-20 Carlos O'Donell ++ Issue #1271 ++ ld/ ++ * configure.tgt (mips64el-sicortex-linux-gnu): Set targ_emul to ++ elf64ltsmip, and set targ_extra_emuls appropriately. ++ ++2007-04-20 Nathan Sidwell ++ ++ gas/ ++ * config/tc-m68k.c (mcf5253_ctrl): New. ++ (mcf52223_ctrl): New. ++ (m68k_cpus): Add 5253, 52221, 52223. ++ ++ gas/ ++ * config/m68k-parse.h (RAMBAR_ALT): New. ++ * config/tc-m68k.c (mcf5206_ctrl, mcf5307_ctrl): New. ++ (mcf_ctrl, mcf5208_ctrl, mcf5210a_ctrl, mcf5213_ctrl, mcf52235_ctrl, ++ mcf5225_ctrl, mcf5235_ctrl, mcf5271_ctrl, mcf5275_ctrl, ++ mcf5282_ctrl, mcf5329_ctrl, mcf5373_ctrl, mcfv4e_ctrl, ++ mcf5475_ctrl, mcf5485_ctrl): Add RAMBAR synonym for ++ RAMBAR1. ++ (mcf5272_ctrl): Add RAMBAR0, replace add RAMBAR with RAMBAR_ALT. ++ (m68k_cpus): Adjust 5206, 5206e & 5307 entries. ++ (m68k_ip) : Detect when RAMBAR_ALT should be used. Add it ++ to control register mapping. ++ ++ gas/testsuite/ ++ * gas/m68k/ctrl-1.d, gas/m68k/ctrl-1.s: New. ++ * gas/m68k/ctrl-2.d, gas/m68k/ctrl-2.s: New. ++ * gas/m68k/all.exp: Add them. ++ ++ opcodes/ ++ * m68k-dis.c (print_insn_arg): Show c04 as rambar0 and c05 as ++ rambar1. ++ ++ ++Local Variables: ++mode: change-log ++change-log-default-name: "ChangeLog.csl" ++End: +--- a/Makefile.def ++++ b/Makefile.def +@@ -128,6 +128,7 @@ host_modules= { module= libtermcap; no_c + missing=distclean; + missing=maintainer-clean; }; + host_modules= { module= utils; no_check=true; }; ++host_modules= { module= convert; no_check=true; }; + host_modules= { module= gnattools; }; + + target_modules = { module= libstdc++-v3; lib_path=.libs; raw_cxx=true; }; +@@ -485,6 +486,9 @@ dependencies = { module=all-send-pr; on= + dependencies = { module=all-tar; on=all-build-texinfo; }; + dependencies = { module=all-uudecode; on=all-build-texinfo; }; + ++// MIPS special ++dependencies = { module=all-convert; on=all-libiberty; }; ++ + // Target modules. These can also have dependencies on the language + // environment (e.g. on libstdc++). By default target modules depend + // on libgcc and newlib/libgloss. +--- a/Makefile.in ++++ b/Makefile.in +@@ -744,6 +744,7 @@ configure-host: \ + maybe-configure-tk \ + maybe-configure-libtermcap \ + maybe-configure-utils \ ++ maybe-configure-convert \ + maybe-configure-gnattools + .PHONY: configure-target + configure-target: \ +@@ -903,6 +904,7 @@ all-host: maybe-all-guile + all-host: maybe-all-tk + all-host: maybe-all-libtermcap + all-host: maybe-all-utils ++all-host: maybe-all-convert + all-host: maybe-all-gnattools + + .PHONY: all-target +@@ -1019,6 +1021,7 @@ info-host: maybe-info-guile + info-host: maybe-info-tk + info-host: maybe-info-libtermcap + info-host: maybe-info-utils ++info-host: maybe-info-convert + info-host: maybe-info-gnattools + + .PHONY: info-target +@@ -1128,6 +1131,7 @@ dvi-host: maybe-dvi-guile + dvi-host: maybe-dvi-tk + dvi-host: maybe-dvi-libtermcap + dvi-host: maybe-dvi-utils ++dvi-host: maybe-dvi-convert + dvi-host: maybe-dvi-gnattools + + .PHONY: dvi-target +@@ -1237,6 +1241,7 @@ pdf-host: maybe-pdf-guile + pdf-host: maybe-pdf-tk + pdf-host: maybe-pdf-libtermcap + pdf-host: maybe-pdf-utils ++pdf-host: maybe-pdf-convert + pdf-host: maybe-pdf-gnattools + + .PHONY: pdf-target +@@ -1346,6 +1351,7 @@ html-host: maybe-html-guile + html-host: maybe-html-tk + html-host: maybe-html-libtermcap + html-host: maybe-html-utils ++html-host: maybe-html-convert + html-host: maybe-html-gnattools + + .PHONY: html-target +@@ -1455,6 +1461,7 @@ TAGS-host: maybe-TAGS-guile + TAGS-host: maybe-TAGS-tk + TAGS-host: maybe-TAGS-libtermcap + TAGS-host: maybe-TAGS-utils ++TAGS-host: maybe-TAGS-convert + TAGS-host: maybe-TAGS-gnattools + + .PHONY: TAGS-target +@@ -1564,6 +1571,7 @@ install-info-host: maybe-install-info-gu + install-info-host: maybe-install-info-tk + install-info-host: maybe-install-info-libtermcap + install-info-host: maybe-install-info-utils ++install-info-host: maybe-install-info-convert + install-info-host: maybe-install-info-gnattools + + .PHONY: install-info-target +@@ -1673,6 +1681,7 @@ install-pdf-host: maybe-install-pdf-guil + install-pdf-host: maybe-install-pdf-tk + install-pdf-host: maybe-install-pdf-libtermcap + install-pdf-host: maybe-install-pdf-utils ++install-pdf-host: maybe-install-pdf-convert + install-pdf-host: maybe-install-pdf-gnattools + + .PHONY: install-pdf-target +@@ -1782,6 +1791,7 @@ install-html-host: maybe-install-html-gu + install-html-host: maybe-install-html-tk + install-html-host: maybe-install-html-libtermcap + install-html-host: maybe-install-html-utils ++install-html-host: maybe-install-html-convert + install-html-host: maybe-install-html-gnattools + + .PHONY: install-html-target +@@ -1891,6 +1901,7 @@ installcheck-host: maybe-installcheck-gu + installcheck-host: maybe-installcheck-tk + installcheck-host: maybe-installcheck-libtermcap + installcheck-host: maybe-installcheck-utils ++installcheck-host: maybe-installcheck-convert + installcheck-host: maybe-installcheck-gnattools + + .PHONY: installcheck-target +@@ -2000,6 +2011,7 @@ mostlyclean-host: maybe-mostlyclean-guil + mostlyclean-host: maybe-mostlyclean-tk + mostlyclean-host: maybe-mostlyclean-libtermcap + mostlyclean-host: maybe-mostlyclean-utils ++mostlyclean-host: maybe-mostlyclean-convert + mostlyclean-host: maybe-mostlyclean-gnattools + + .PHONY: mostlyclean-target +@@ -2109,6 +2121,7 @@ clean-host: maybe-clean-guile + clean-host: maybe-clean-tk + clean-host: maybe-clean-libtermcap + clean-host: maybe-clean-utils ++clean-host: maybe-clean-convert + clean-host: maybe-clean-gnattools + + .PHONY: clean-target +@@ -2218,6 +2231,7 @@ distclean-host: maybe-distclean-guile + distclean-host: maybe-distclean-tk + distclean-host: maybe-distclean-libtermcap + distclean-host: maybe-distclean-utils ++distclean-host: maybe-distclean-convert + distclean-host: maybe-distclean-gnattools + + .PHONY: distclean-target +@@ -2327,6 +2341,7 @@ maintainer-clean-host: maybe-maintainer- + maintainer-clean-host: maybe-maintainer-clean-tk + maintainer-clean-host: maybe-maintainer-clean-libtermcap + maintainer-clean-host: maybe-maintainer-clean-utils ++maintainer-clean-host: maybe-maintainer-clean-convert + maintainer-clean-host: maybe-maintainer-clean-gnattools + + .PHONY: maintainer-clean-target +@@ -2490,6 +2505,7 @@ check-host: \ + maybe-check-tk \ + maybe-check-libtermcap \ + maybe-check-utils \ ++ maybe-check-convert \ + maybe-check-gnattools + + .PHONY: check-target +@@ -2625,6 +2641,7 @@ install-host-nogcc: \ + maybe-install-tk \ + maybe-install-libtermcap \ + maybe-install-utils \ ++ maybe-install-convert \ + maybe-install-gnattools + + .PHONY: install-host +@@ -2701,6 +2718,7 @@ install-host: \ + maybe-install-tk \ + maybe-install-libtermcap \ + maybe-install-utils \ ++ maybe-install-convert \ + maybe-install-gnattools + + .PHONY: install-target +@@ -42242,6 +42260,424 @@ maintainer-clean-utils: + + + ++.PHONY: configure-convert maybe-configure-convert ++maybe-configure-convert: ++@if gcc-bootstrap ++configure-convert: stage_current ++@endif gcc-bootstrap ++@if convert ++maybe-configure-convert: configure-convert ++configure-convert: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/convert/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/convert ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/convert; \ ++ cd "$(HOST_SUBDIR)/convert" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/convert/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/convert"; \ ++ libsrcdir="$$s/convert"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif convert ++ ++ ++ ++ ++ ++.PHONY: all-convert maybe-all-convert ++maybe-all-convert: ++@if gcc-bootstrap ++all-convert: stage_current ++@endif gcc-bootstrap ++@if convert ++TARGET-convert=all ++maybe-all-convert: all-convert ++all-convert: configure-convert ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(FLAGS_TO_PASS) $(TARGET-convert)) ++@endif convert ++ ++ ++ ++ ++.PHONY: check-convert maybe-check-convert ++maybe-check-convert: ++@if convert ++maybe-check-convert: check-convert ++ ++check-convert: ++ ++@endif convert ++ ++.PHONY: install-convert maybe-install-convert ++maybe-install-convert: ++@if convert ++maybe-install-convert: install-convert ++ ++install-convert: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(FLAGS_TO_PASS) install) ++ ++@endif convert ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-convert info-convert ++maybe-info-convert: ++@if convert ++maybe-info-convert: info-convert ++ ++info-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing info in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ info) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-dvi-convert dvi-convert ++maybe-dvi-convert: ++@if convert ++maybe-dvi-convert: dvi-convert ++ ++dvi-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing dvi in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ dvi) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-pdf-convert pdf-convert ++maybe-pdf-convert: ++@if convert ++maybe-pdf-convert: pdf-convert ++ ++pdf-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-html-convert html-convert ++maybe-html-convert: ++@if convert ++maybe-html-convert: html-convert ++ ++html-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing html in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ html) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-TAGS-convert TAGS-convert ++maybe-TAGS-convert: ++@if convert ++maybe-TAGS-convert: TAGS-convert ++ ++TAGS-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing TAGS in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ TAGS) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-install-info-convert install-info-convert ++maybe-install-info-convert: ++@if convert ++maybe-install-info-convert: install-info-convert ++ ++install-info-convert: \ ++ configure-convert \ ++ info-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-info in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-info) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-install-pdf-convert install-pdf-convert ++maybe-install-pdf-convert: ++@if convert ++maybe-install-pdf-convert: install-pdf-convert ++ ++install-pdf-convert: \ ++ configure-convert \ ++ pdf-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-install-html-convert install-html-convert ++maybe-install-html-convert: ++@if convert ++maybe-install-html-convert: install-html-convert ++ ++install-html-convert: \ ++ configure-convert \ ++ html-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-installcheck-convert installcheck-convert ++maybe-installcheck-convert: ++@if convert ++maybe-installcheck-convert: installcheck-convert ++ ++installcheck-convert: \ ++ configure-convert ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing installcheck in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ installcheck) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-mostlyclean-convert mostlyclean-convert ++maybe-mostlyclean-convert: ++@if convert ++maybe-mostlyclean-convert: mostlyclean-convert ++ ++mostlyclean-convert: ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-clean-convert clean-convert ++maybe-clean-convert: ++@if convert ++maybe-clean-convert: clean-convert ++ ++clean-convert: ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-distclean-convert distclean-convert ++maybe-distclean-convert: ++@if convert ++maybe-distclean-convert: distclean-convert ++ ++distclean-convert: ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif convert ++ ++.PHONY: maybe-maintainer-clean-convert maintainer-clean-convert ++maybe-maintainer-clean-convert: ++@if convert ++maybe-maintainer-clean-convert: maintainer-clean-convert ++ ++maintainer-clean-convert: ++ @: $(MAKE); $(unstage) ++ @[ -f ./convert/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in convert" ; \ ++ (cd $(HOST_SUBDIR)/convert && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif convert ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -55724,6 +56160,7 @@ all-sed: maybe-all-build-texinfo + all-send-pr: maybe-all-prms + all-tar: maybe-all-build-texinfo + all-uudecode: maybe-all-build-texinfo ++all-convert: maybe-all-libiberty + configure-target-boehm-gc: maybe-configure-target-qthreads + configure-target-boehm-gc: maybe-all-target-libstdc++-v3 + configure-target-fastjar: maybe-configure-target-zlib +--- a/bfd/aout-adobe.c ++++ b/bfd/aout-adobe.c +@@ -467,6 +467,8 @@ aout_adobe_sizeof_headers (bfd *ignore_a + #define aout_32_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define aout_32_bfd_link_just_syms _bfd_generic_link_just_syms ++#define aout_32_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define aout_32_bfd_final_link _bfd_generic_final_link + #define aout_32_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/aout-target.h ++++ b/bfd/aout-target.h +@@ -520,6 +520,10 @@ MY_bfd_final_link (bfd *abfd, struct bfd + #ifndef MY_bfd_link_just_syms + #define MY_bfd_link_just_syms _bfd_generic_link_just_syms + #endif ++#ifndef MY_bfd_copy_link_hash_symbol_type ++#define MY_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type ++#endif + #ifndef MY_bfd_link_split_section + #define MY_bfd_link_split_section _bfd_generic_link_split_section + #endif +--- a/bfd/aout-tic30.c ++++ b/bfd/aout-tic30.c +@@ -977,6 +977,10 @@ tic30_aout_set_arch_mach (bfd *abfd, + #ifndef MY_bfd_link_just_syms + #define MY_bfd_link_just_syms _bfd_generic_link_just_syms + #endif ++#ifndef MY_bfd_copy_link_hash_symbol_type ++#define MY_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type ++#endif + #ifndef MY_bfd_link_split_section + #define MY_bfd_link_split_section _bfd_generic_link_split_section + #endif +--- a/bfd/bfd-in.h ++++ b/bfd/bfd-in.h +@@ -821,10 +821,19 @@ extern void bfd_elf32_arm_init_maps + extern void bfd_elf32_arm_set_vfp11_fix + (bfd *, struct bfd_link_info *); + ++extern void bfd_elf32_arm_validate_janus_2cc_fix ++ (bfd *, struct bfd_link_info *); ++ ++extern void bfd_elf32_arm_set_cortex_a8_fix ++ (bfd *, struct bfd_link_info *); ++ + extern bfd_boolean bfd_elf32_arm_vfp11_erratum_scan + (bfd *, struct bfd_link_info *); + +-extern void bfd_elf32_arm_vfp11_fix_veneer_locations ++extern bfd_boolean bfd_elf32_arm_janus_2cc_erratum_scan ++ (bfd *, struct bfd_link_info *); ++ ++extern void bfd_elf32_arm_fix_veneer_locations + (bfd *, struct bfd_link_info *); + + /* ARM Interworking support. Called from linker. */ +@@ -856,7 +865,7 @@ extern bfd_boolean bfd_elf32_arm_process + + void bfd_elf32_arm_set_target_relocs + (bfd *, struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix, +- int, int, int); ++ int, int, int, int, int); + + extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking + (bfd *, struct bfd_link_info *); +@@ -894,7 +903,11 @@ extern bfd_boolean elf32_arm_size_stubs + struct bfd_section * (*) (const char *, struct bfd_section *), void (*) (void)); + extern bfd_boolean elf32_arm_build_stubs + (struct bfd_link_info *); +- ++ ++/* ARM unwind section editing support. */ ++extern bfd_boolean elf32_arm_fix_exidx_coverage ++ (struct bfd_section **, unsigned int, struct bfd_link_info *); ++ + /* TI COFF load page support. */ + extern void bfd_ticoff_set_section_load_page + (struct bfd_section *, int); +--- a/bfd/bfd-in2.h ++++ b/bfd/bfd-in2.h +@@ -828,10 +828,19 @@ extern void bfd_elf32_arm_init_maps + extern void bfd_elf32_arm_set_vfp11_fix + (bfd *, struct bfd_link_info *); + ++extern void bfd_elf32_arm_validate_janus_2cc_fix ++ (bfd *, struct bfd_link_info *); ++ ++extern void bfd_elf32_arm_set_cortex_a8_fix ++ (bfd *, struct bfd_link_info *); ++ + extern bfd_boolean bfd_elf32_arm_vfp11_erratum_scan + (bfd *, struct bfd_link_info *); + +-extern void bfd_elf32_arm_vfp11_fix_veneer_locations ++extern bfd_boolean bfd_elf32_arm_janus_2cc_erratum_scan ++ (bfd *, struct bfd_link_info *); ++ ++extern void bfd_elf32_arm_fix_veneer_locations + (bfd *, struct bfd_link_info *); + + /* ARM Interworking support. Called from linker. */ +@@ -863,7 +872,7 @@ extern bfd_boolean bfd_elf32_arm_process + + void bfd_elf32_arm_set_target_relocs + (bfd *, struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix, +- int, int, int); ++ int, int, int, int, int); + + extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking + (bfd *, struct bfd_link_info *); +@@ -901,7 +910,11 @@ extern bfd_boolean elf32_arm_size_stubs + struct bfd_section * (*) (const char *, struct bfd_section *), void (*) (void)); + extern bfd_boolean elf32_arm_build_stubs + (struct bfd_link_info *); +- ++ ++/* ARM unwind section editing support. */ ++extern bfd_boolean elf32_arm_fix_exidx_coverage ++ (struct bfd_section **, unsigned int, struct bfd_link_info *); ++ + /* TI COFF load page support. */ + extern void bfd_ticoff_set_section_load_page + (struct bfd_section *, int); +@@ -5406,6 +5419,7 @@ typedef struct bfd_target + NAME##_bfd_link_hash_table_free, \ + NAME##_bfd_link_add_symbols, \ + NAME##_bfd_link_just_syms, \ ++ NAME##_bfd_copy_link_hash_symbol_type, \ + NAME##_bfd_final_link, \ + NAME##_bfd_link_split_section, \ + NAME##_bfd_gc_sections, \ +@@ -5436,6 +5450,12 @@ typedef struct bfd_target + /* Indicate that we are only retrieving symbol values from this section. */ + void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); + ++ /* Copy the symbol type of a linker hash table entry. */ ++#define bfd_copy_link_hash_symbol_type(b, t, f) \ ++ BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) ++ void (*_bfd_copy_link_hash_symbol_type) ++ (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); ++ + /* Do a link based on the link_order structures attached to each + section of the BFD. */ + bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); +--- a/bfd/binary.c ++++ b/bfd/binary.c +@@ -319,6 +319,8 @@ binary_sizeof_headers (bfd *abfd ATTRIBU + #define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create + #define binary_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define binary_bfd_link_just_syms _bfd_generic_link_just_syms ++#define binary_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define binary_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define binary_bfd_final_link _bfd_generic_final_link + #define binary_bfd_link_split_section _bfd_generic_link_split_section +--- a/bfd/bout.c ++++ b/bfd/bout.c +@@ -1382,6 +1382,8 @@ b_out_bfd_get_relocated_section_contents + #define b_out_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define b_out_bfd_link_just_syms _bfd_generic_link_just_syms ++#define b_out_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define b_out_bfd_final_link _bfd_generic_final_link + #define b_out_bfd_link_split_section _bfd_generic_link_split_section + #define b_out_bfd_gc_sections bfd_generic_gc_sections +--- a/bfd/cache.c ++++ b/bfd/cache.c +@@ -120,6 +120,13 @@ bfd_cache_delete (bfd *abfd) + + if (fclose ((FILE *) abfd->iostream) == 0) + ret = TRUE; ++ /* ClearCase has an entertaining bug where close will fail and set ++ errno to EROFS when applied to any file in a read-only view, even ++ if the file was opened for reading. Detect this situation and ++ ignore the error. */ ++ else if (errno == EROFS && (abfd->direction == no_direction ++ || abfd->direction == read_direction)) ++ ret = TRUE; + else + { + ret = FALSE; +--- a/bfd/coff-arm.c ++++ b/bfd/coff-arm.c +@@ -2208,7 +2208,7 @@ coff_arm_merge_private_bfd_data (bfd * i + { + _bfd_error_handler + /* xgettext: c-format */ +- (_("ERROR: %B is compiled for APCS-%d, whereas %B is compiled for APCS-%d"), ++ (_("error: %B is compiled for APCS-%d, whereas %B is compiled for APCS-%d"), + ibfd, obfd, + APCS_26_FLAG (ibfd) ? 26 : 32, + APCS_26_FLAG (obfd) ? 26 : 32 +@@ -2224,10 +2224,10 @@ coff_arm_merge_private_bfd_data (bfd * i + + if (APCS_FLOAT_FLAG (ibfd)) + /* xgettext: c-format */ +- msg = _("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"); ++ msg = _("error: %B passes floats in float registers, whereas %B passes them in integer registers"); + else + /* xgettext: c-format */ +- msg = _("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"); ++ msg = _("error: %B passes floats in integer registers, whereas %B passes them in float registers"); + + _bfd_error_handler (msg, ibfd, obfd); + +@@ -2241,10 +2241,10 @@ coff_arm_merge_private_bfd_data (bfd * i + + if (PIC_FLAG (ibfd)) + /* xgettext: c-format */ +- msg = _("ERROR: %B is compiled as position independent code, whereas target %B is absolute position"); ++ msg = _("error: %B is compiled as position independent code, whereas target %B is absolute position"); + else + /* xgettext: c-format */ +- msg = _("ERROR: %B is compiled as absolute position code, whereas target %B is position independent"); ++ msg = _("error: %B is compiled as absolute position code, whereas target %B is position independent"); + _bfd_error_handler (msg, ibfd, obfd); + + bfd_set_error (bfd_error_wrong_format); +--- a/bfd/coff-rs6000.c ++++ b/bfd/coff-rs6000.c +@@ -4212,6 +4212,7 @@ const bfd_target rs6000coff_vec = + _bfd_generic_link_hash_table_free, + _bfd_xcoff_bfd_link_add_symbols, + _bfd_generic_link_just_syms, ++ _bfd_generic_copy_link_hash_symbol_type, + _bfd_xcoff_bfd_final_link, + _bfd_generic_link_split_section, + bfd_generic_gc_sections, +@@ -4464,6 +4465,7 @@ const bfd_target pmac_xcoff_vec = + _bfd_generic_link_hash_table_free, + _bfd_xcoff_bfd_link_add_symbols, + _bfd_generic_link_just_syms, ++ _bfd_generic_copy_link_hash_symbol_type, + _bfd_xcoff_bfd_final_link, + _bfd_generic_link_split_section, + bfd_generic_gc_sections, +--- a/bfd/coff64-rs6000.c ++++ b/bfd/coff64-rs6000.c +@@ -2762,6 +2762,7 @@ const bfd_target rs6000coff64_vec = + _bfd_generic_link_hash_table_free, + _bfd_xcoff_bfd_link_add_symbols, + _bfd_generic_link_just_syms, ++ _bfd_generic_copy_link_hash_symbol_type, + _bfd_xcoff_bfd_final_link, + _bfd_generic_link_split_section, + bfd_generic_gc_sections, +@@ -3015,6 +3016,7 @@ const bfd_target aix5coff64_vec = + _bfd_generic_link_hash_table_free, + _bfd_xcoff_bfd_link_add_symbols, + _bfd_generic_link_just_syms, ++ _bfd_generic_copy_link_hash_symbol_type, + _bfd_xcoff_bfd_final_link, + _bfd_generic_link_split_section, + bfd_generic_gc_sections, +--- a/bfd/coffcode.h ++++ b/bfd/coffcode.h +@@ -5169,6 +5169,8 @@ dummy_reloc16_extra_cases (bfd *abfd ATT + #endif /* ! defined (coff_relocate_section) */ + + #define coff_bfd_link_just_syms _bfd_generic_link_just_syms ++#define coff_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define coff_bfd_link_split_section _bfd_generic_link_split_section + + #ifndef coff_start_final_link +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -959,6 +959,10 @@ case "${targ}" in + targ_selvecs="bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec" + want64=true + ;; ++ mips64octeon*-*-elf*) ++ targ_defvec=bfd_elf32_tradbigmips_vec ++ targ_selvecs="bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec" ++ ;; + mips*el-*-elf* | mips*el-*-vxworks* | mips*-*-chorus*) + targ_defvec=bfd_elf32_littlemips_vec + targ_selvecs="bfd_elf32_bigmips_vec bfd_elf64_bigmips_vec bfd_elf64_littlemips_vec" +@@ -1000,12 +1004,12 @@ case "${targ}" in + #endif + mips*el-*-linux*) + targ_defvec=bfd_elf32_tradlittlemips_vec +- targ_selvecs="bfd_elf32_tradbigmips_vec ecoff_little_vec ecoff_big_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec" ++ targ_selvecs="bfd_elf32_tradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec" + want64=true + ;; + mips*-*-linux*) + targ_defvec=bfd_elf32_tradbigmips_vec +- targ_selvecs="bfd_elf32_tradlittlemips_vec ecoff_big_vec ecoff_little_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec" ++ targ_selvecs="bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec" + want64=true + ;; + #ifdef BFD64 +--- a/bfd/cpu-arm.c ++++ b/bfd/cpu-arm.c +@@ -187,7 +187,7 @@ bfd_arm_merge_machines (bfd *ibfd, bfd * + || out == bfd_mach_arm_iWMMXt2)) + { + _bfd_error_handler (_("\ +-ERROR: %B is compiled for the EP9312, whereas %B is compiled for XScale"), ++error: %B is compiled for the EP9312, whereas %B is compiled for XScale"), + ibfd, obfd); + bfd_set_error (bfd_error_wrong_format); + return FALSE; +@@ -198,7 +198,7 @@ ERROR: %B is compiled for the EP9312, wh + || in == bfd_mach_arm_iWMMXt2)) + { + _bfd_error_handler (_("\ +-ERROR: %B is compiled for the EP9312, whereas %B is compiled for XScale"), ++error: %B is compiled for the EP9312, whereas %B is compiled for XScale"), + obfd, ibfd); + bfd_set_error (bfd_error_wrong_format); + return FALSE; +--- a/bfd/dwarf2.c ++++ b/bfd/dwarf2.c +@@ -417,48 +417,47 @@ read_section (bfd * abfd, + bfd_boolean section_is_compressed = FALSE; + + /* read_section is a noop if the section has already been read. */ +- if (*section_buffer) +- return TRUE; +- +- msec = bfd_get_section_by_name (abfd, section_name); +- if (! msec && compressed_section_name) +- { +- msec = bfd_get_section_by_name (abfd, compressed_section_name); +- section_is_compressed = TRUE; +- } +- if (! msec) ++ if (!*section_buffer) + { +- (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name); +- bfd_set_error (bfd_error_bad_value); +- return FALSE; +- } ++ msec = bfd_get_section_by_name (abfd, section_name); ++ if (! msec && compressed_section_name) ++ { ++ msec = bfd_get_section_by_name (abfd, compressed_section_name); ++ section_is_compressed = TRUE; ++ } ++ if (! msec) ++ { ++ (*_bfd_error_handler) (_("Dwarf Error: Can't find %s section."), section_name); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } + +- if (syms) +- { +- *section_size = msec->size; +- *section_buffer +- = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms); +- if (! *section_buffer) +- return FALSE; +- } +- else +- { + *section_size = msec->rawsize ? msec->rawsize : msec->size; +- *section_buffer = bfd_malloc (*section_size); +- if (! *section_buffer) +- return FALSE; +- if (! bfd_get_section_contents (abfd, msec, *section_buffer, +- 0, *section_size)) +- return FALSE; +- } ++ if (syms) ++ { ++ *section_buffer ++ = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms); ++ if (! *section_buffer) ++ return FALSE; ++ } ++ else ++ { ++ *section_buffer = bfd_malloc (*section_size); ++ if (! *section_buffer) ++ return FALSE; ++ if (! bfd_get_section_contents (abfd, msec, *section_buffer, ++ 0, *section_size)) ++ return FALSE; ++ } + +- if (section_is_compressed) +- { +- if (! bfd_uncompress_section_contents (section_buffer, section_size)) ++ if (section_is_compressed) + { +- (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name); +- bfd_set_error (bfd_error_bad_value); +- return FALSE; ++ if (! bfd_uncompress_section_contents (section_buffer, section_size)) ++ { ++ (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name); ++ bfd_set_error (bfd_error_bad_value); ++ return FALSE; ++ } + } + } + +--- a/bfd/elf-attrs.c ++++ b/bfd/elf-attrs.c +@@ -564,7 +564,7 @@ _bfd_elf_merge_object_attributes (bfd *i + if (in_attr->i > 0 && strcmp (in_attr->s, "gnu") != 0) + { + _bfd_error_handler +- (_("ERROR: %B: Must be processed by '%s' toolchain"), ++ (_("error: %B: Must be processed by '%s' toolchain"), + ibfd, in_attr->s); + return FALSE; + } +@@ -572,7 +572,7 @@ _bfd_elf_merge_object_attributes (bfd *i + if (in_attr->i != out_attr->i + || (in_attr->i != 0 && strcmp (in_attr->s, out_attr->s) != 0)) + { +- _bfd_error_handler (_("ERROR: %B: Object tag '%d, %s' is " ++ _bfd_error_handler (_("error: %B: Object tag '%d, %s' is " + "incompatible with tag '%d, %s'"), + ibfd, + in_attr->i, in_attr->s ? in_attr->s : "", +--- a/bfd/elf-bfd.h ++++ b/bfd/elf-bfd.h +@@ -1705,6 +1705,8 @@ extern asection *_bfd_elf_check_kept_sec + (asection *, struct bfd_link_info *); + extern void _bfd_elf_link_just_syms + (asection *, struct bfd_link_info *); ++extern void _bfd_elf_copy_link_hash_symbol_type ++ (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); + extern bfd_boolean _bfd_elf_copy_private_header_data + (bfd *, bfd *); + extern bfd_boolean _bfd_elf_copy_private_symbol_data +--- a/bfd/elf32-arm.c ++++ b/bfd/elf32-arm.c +@@ -20,6 +20,8 @@ + MA 02110-1301, USA. */ + + #include "sysdep.h" ++#include ++ + #include "bfd.h" + #include "libiberty.h" + #include "libbfd.h" +@@ -61,6 +63,11 @@ + + static struct elf_backend_data elf32_arm_vxworks_bed; + ++static bfd_boolean elf32_arm_write_section (bfd *output_bfd, ++ struct bfd_link_info *link_info, ++ asection *sec, ++ bfd_byte *contents); ++ + /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g. + R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO + in that slot. */ +@@ -1881,7 +1888,8 @@ typedef unsigned short int insn16; + interworkable. */ + #define INTERWORK_FLAG(abfd) \ + (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \ +- || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK)) ++ || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK) \ ++ || ((abfd)->flags & BFD_LINKER_CREATED)) + + /* The linker script knows the section names for placement. + The entry_names are used to do simple name mangling on the stubs. +@@ -1894,7 +1902,12 @@ typedef unsigned short int insn16; + #define ARM2THUMB_GLUE_ENTRY_NAME "__%s_from_arm" + + #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer" +-#define VFP11_ERRATUM_VENEER_ENTRY_NAME "__vfp11_veneer_%x" ++#define VFP11_ERRATUM_VENEER_ENTRY_NAME "__vfp11_veneer_%x%s" ++ ++#define JANUS_2CC_ERRATUM_VENEER_SECTION_NAME ".janus_2cc_veneer" ++#define JANUS_2CC_ERRATUM_VENEER_ENTRY_NAME "__janus_2cc_veneer_%x%s" ++ ++#define MAX_ERRATUM_SYMBOL_LENGTH 64 + + #define ARM_BX_GLUE_SECTION_NAME ".v4_bx" + #define ARM_BX_GLUE_ENTRY_NAME "__bx_r%d" +@@ -2010,53 +2023,129 @@ static const bfd_vma elf32_arm_symbian_p + #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4) + #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4) + +-static const bfd_vma arm_long_branch_stub[] = ++enum stub_insn_type + { +- 0xe51ff004, /* ldr pc, [pc, #-4] */ +- 0x00000000, /* dcd R_ARM_ABS32(X) */ ++ THUMB16_TYPE = 1, ++ THUMB32_TYPE, ++ ARM_TYPE, ++ DATA_TYPE ++ }; ++ ++#define THUMB16_INSN(X) {(X), THUMB16_TYPE, R_ARM_NONE, 0} ++/* A bit of a hack. A Thumb conditional branch, in which the proper condition ++ is inserted in arm_build_one_stub(). */ ++#define THUMB16_BCOND_INSN(X) {(X), THUMB16_TYPE, R_ARM_NONE, 1} ++#define THUMB32_INSN(X) {(X), THUMB32_TYPE, R_ARM_NONE, 0} ++#define THUMB32_B_INSN(X, Z) {(X), THUMB32_TYPE, R_ARM_THM_JUMP24, (Z)} ++#define ARM_INSN(X) {(X), ARM_TYPE, R_ARM_NONE, 0} ++#define ARM_REL_INSN(X, Z) {(X), ARM_TYPE, R_ARM_JUMP24, (Z)} ++#define DATA_WORD(X,Y,Z) {(X), DATA_TYPE, (Y), (Z)} ++ ++typedef struct ++{ ++ bfd_vma data; ++ enum stub_insn_type type; ++ unsigned int reloc_type; ++ int reloc_addend; ++} insn_sequence; ++ ++/* Arm/Thumb -> Arm/Thumb long branch stub. On V5T and above, use blx ++ to reach the stub if necessary. */ ++static const insn_sequence elf32_arm_stub_long_branch_any_any[] = ++ { ++ ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */ ++ DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */ ++ }; ++ ++/* V4T Arm -> Thumb long branch stub. Used on V4T where blx is not ++ available. */ ++static const insn_sequence elf32_arm_stub_long_branch_v4t_arm_thumb[] = ++ { ++ ARM_INSN(0xe59fc000), /* ldr ip, [pc, #0] */ ++ ARM_INSN(0xe12fff1c), /* bx ip */ ++ DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */ ++ }; ++ ++/* Thumb -> Thumb long branch stub. Used on architectures which ++ support only this mode, or on V4T where it is expensive to switch ++ to ARM. */ ++static const insn_sequence elf32_arm_stub_long_branch_thumb_only[] = ++ { ++ THUMB16_INSN(0xb401), /* push {r0} */ ++ THUMB16_INSN(0x4802), /* ldr r0, [pc, #8] */ ++ THUMB16_INSN(0x4684), /* mov ip, r0 */ ++ THUMB16_INSN(0xbc01), /* pop {r0} */ ++ THUMB16_INSN(0x4760), /* bx ip */ ++ THUMB16_INSN(0xbf00), /* nop */ ++ DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */ ++ }; ++ ++/* V4T Thumb -> ARM long branch stub. Used on V4T where blx is not ++ available. */ ++static const insn_sequence elf32_arm_stub_long_branch_v4t_thumb_arm[] = ++ { ++ THUMB16_INSN(0x4778), /* bx pc */ ++ THUMB16_INSN(0x46c0), /* nop */ ++ ARM_INSN(0xe51ff004), /* ldr pc, [pc, #-4] */ ++ DATA_WORD(0, R_ARM_ABS32, 0), /* dcd R_ARM_ABS32(X) */ + }; + +-static const bfd_vma arm_thumb_v4t_long_branch_stub[] = ++/* V4T Thumb -> ARM short branch stub. Shorter variant of the above ++ one, when the destination is close enough. */ ++static const insn_sequence elf32_arm_stub_short_branch_v4t_thumb_arm[] = + { +- 0xe59fc000, /* ldr ip, [pc, #0] */ +- 0xe12fff1c, /* bx ip */ +- 0x00000000, /* dcd R_ARM_ABS32(X) */ ++ THUMB16_INSN(0x4778), /* bx pc */ ++ THUMB16_INSN(0x46c0), /* nop */ ++ ARM_REL_INSN(0xea000000, -8), /* b (X-8) */ + }; + +-static const bfd_vma arm_thumb_thumb_long_branch_stub[] = ++/* ARM/Thumb -> ARM long branch stub, PIC. On V5T and above, use ++ blx to reach the stub if necessary. */ ++static const insn_sequence elf32_arm_stub_long_branch_any_arm_pic[] = + { +- 0x4e02b540, /* push {r6, lr} */ +- /* ldr r6, [pc, #8] */ +- 0x473046fe, /* mov lr, pc */ +- /* bx r6 */ +- 0xbf00bd40, /* pop {r6, pc} */ +- /* nop */ +- 0x00000000, /* dcd R_ARM_ABS32(X) */ ++ ARM_INSN(0xe59fc000), /* ldr r12, [pc] */ ++ ARM_INSN(0xe08ff00c), /* add pc, pc, ip */ ++ DATA_WORD(0, R_ARM_REL32, -4), /* dcd R_ARM_REL32(X-4) */ + }; + +-static const bfd_vma arm_thumb_arm_v4t_long_branch_stub[] = ++/* ARM/Thumb -> Thumb long branch stub, PIC. On V5T and above, use ++ blx to reach the stub if necessary. We can not add into pc; ++ it is not guaranteed to mode switch (different in ARMv6 and ++ ARMv7). */ ++static const insn_sequence elf32_arm_stub_long_branch_any_thumb_pic[] = ++ { ++ ARM_INSN(0xe59fc004), /* ldr r12, [pc, #4] */ ++ ARM_INSN(0xe08fc00c), /* add ip, pc, ip */ ++ ARM_INSN(0xe12fff1c), /* bx ip */ ++ DATA_WORD(0, R_ARM_REL32, 0), /* dcd R_ARM_REL32(X) */ ++ }; ++ ++/* Cortex-A8 erratum-workaround stubs. */ ++ ++/* Stub used for conditional branches (which may be beyond +/-1MB away, so we ++ can't use a conditional branch to reach this stub). */ ++ ++static const insn_sequence elf32_arm_stub_a8_veneer_b_cond[] = + { +- 0x4e03b540, /* push {r6, lr} */ +- /* ldr r6, [pc, #12] */ +- 0x473046fe, /* mov lr, pc */ +- /* bx r6 */ +- 0xe8bd4040, /* pop {r6, pc} */ +- 0xe12fff1e, /* bx lr */ +- 0x00000000, /* dcd R_ARM_ABS32(X) */ ++ THUMB16_BCOND_INSN(0xd001), /* b.n true. */ ++ THUMB32_B_INSN(0xf000b800, -4), /* b.w insn_after_original_branch. */ ++ THUMB32_B_INSN(0xf000b800, -4) /* b.w original_branch_dest. */ + }; + +-static const bfd_vma arm_thumb_arm_v4t_short_branch_stub[] = ++/* Stub used for b.w and bl.w instructions. */ ++ ++static const insn_sequence elf32_arm_stub_a8_veneer_b[] = + { +- 0x46c04778, /* bx pc */ +- /* nop */ +- 0xea000000, /* b (X) */ ++ THUMB32_B_INSN(0xf000b800, -4) + }; + +-static const bfd_vma arm_pic_long_branch_stub[] = ++/* Stub used for Thumb-2 blx.w instructions. We modified the original blx.w ++ instruction to point to this stub, which switches to ARM mode. Jump to the ++ real destination using an ARM-mode branch. */ ++ ++static const insn_sequence elf32_arm_stub_a8_veneer_blx[] = + { +- 0xe59fc000, /* ldr r12, [pc] */ +- 0xe08ff00c, /* add pc, pc, ip */ +- 0x00000000, /* dcd R_ARM_REL32(X) */ ++ ARM_REL_INSN(0xea000000, -8) + }; + + /* Section name for stubs is the associated section name plus this +@@ -2066,12 +2155,17 @@ static const bfd_vma arm_pic_long_branch + enum elf32_arm_stub_type + { + arm_stub_none, +- arm_stub_long_branch, +- arm_thumb_v4t_stub_long_branch, +- arm_thumb_thumb_stub_long_branch, +- arm_thumb_arm_v4t_stub_long_branch, +- arm_thumb_arm_v4t_stub_short_branch, +- arm_stub_pic_long_branch, ++ arm_stub_long_branch_any_any, ++ arm_stub_long_branch_v4t_arm_thumb, ++ arm_stub_long_branch_thumb_only, ++ arm_stub_long_branch_v4t_thumb_arm, ++ arm_stub_short_branch_v4t_thumb_arm, ++ arm_stub_long_branch_any_arm_pic, ++ arm_stub_long_branch_any_thumb_pic, ++ arm_stub_a8_veneer_b_cond, ++ arm_stub_a8_veneer_b, ++ arm_stub_a8_veneer_bl, ++ arm_stub_a8_veneer_blx + }; + + struct elf32_arm_stub_hash_entry +@@ -2090,7 +2184,21 @@ struct elf32_arm_stub_hash_entry + bfd_vma target_value; + asection *target_section; + ++ /* Offset to apply to relocation referencing target_value. */ ++ bfd_vma target_addend; ++ ++ /* The instruction which caused this stub to be generated (only valid for ++ Cortex-A8 erratum workaround stubs at present). */ ++ unsigned long orig_insn; ++ ++ /* The stub type. */ + enum elf32_arm_stub_type stub_type; ++ /* Its encoding size in bytes. */ ++ int stub_size; ++ /* Its template. */ ++ const insn_sequence *stub_template; ++ /* The size of the template (number of entries). */ ++ int stub_template_size; + + /* The symbol table entry, if any, that this was derived from. */ + struct elf32_arm_link_hash_entry *h; +@@ -2124,43 +2232,111 @@ typedef enum + { + VFP11_ERRATUM_BRANCH_TO_ARM_VENEER, + VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER, ++ JANUS_2CC_ERRATUM_BRANCH_TO_ARM_VENEER, + VFP11_ERRATUM_ARM_VENEER, +- VFP11_ERRATUM_THUMB_VENEER ++ VFP11_ERRATUM_THUMB_VENEER, ++ JANUS_2CC_ERRATUM_ARM_VENEER + } +-elf32_vfp11_erratum_type; ++elf32_cpu_erratum_type; + +-typedef struct elf32_vfp11_erratum_list ++typedef struct elf32_cpu_erratum_list + { +- struct elf32_vfp11_erratum_list *next; ++ struct elf32_cpu_erratum_list *next; + bfd_vma vma; + union + { + struct + { +- struct elf32_vfp11_erratum_list *veneer; +- unsigned int vfp_insn; ++ struct elf32_cpu_erratum_list *veneer; ++ unsigned int orig_insn; + } b; + struct + { +- struct elf32_vfp11_erratum_list *branch; ++ struct elf32_cpu_erratum_list *branch; + unsigned int id; + } v; + } u; +- elf32_vfp11_erratum_type type; ++ elf32_cpu_erratum_type type; ++} ++elf32_cpu_erratum_list; ++ ++typedef enum ++{ ++ DELETE_EXIDX_ENTRY, ++ INSERT_EXIDX_CANTUNWIND_AT_END + } +-elf32_vfp11_erratum_list; ++arm_unwind_edit_type; ++ ++/* A (sorted) list of edits to apply to an unwind table. */ ++typedef struct arm_unwind_table_edit ++{ ++ arm_unwind_edit_type type; ++ /* Note: we sometimes want to insert an unwind entry corresponding to a ++ section different from the one we're currently writing out, so record the ++ (text) section this edit relates to here. */ ++ asection *linked_section; ++ unsigned int index; ++ struct arm_unwind_table_edit *next; ++} ++arm_unwind_table_edit; + + typedef struct _arm_elf_section_data + { ++ /* Information about mapping symbols. */ + struct bfd_elf_section_data elf; + unsigned int mapcount; + unsigned int mapsize; + elf32_arm_section_map *map; ++ /* Information about CPU errata. */ + unsigned int erratumcount; +- elf32_vfp11_erratum_list *erratumlist; ++ elf32_cpu_erratum_list *erratumlist; ++ /* Information about unwind tables. */ ++ union ++ { ++ /* Unwind info attached to a text section. */ ++ struct ++ { ++ asection *arm_exidx_sec; ++ } text; ++ ++ /* Unwind info attached to an .ARM.exidx section. */ ++ struct ++ { ++ arm_unwind_table_edit *unwind_edit_list; ++ arm_unwind_table_edit *unwind_edit_tail; ++ } exidx; ++ } u; + } + _arm_elf_section_data; + ++/* A fix which might be required for Cortex-A8 Thumb-2 branch/TLB erratum. ++ These fixes are subject to a relaxation procedure (in elf32_arm_size_stubs), ++ so may be created multiple times: we use an array of these entries whilst ++ relaxing which we can refresh easily, then create stubs for each potentially ++ erratum-triggering instruction once we've settled on a solution. */ ++ ++struct a8_erratum_fix { ++ bfd *input_bfd; ++ asection *section; ++ bfd_vma offset; ++ bfd_vma addend; ++ unsigned long orig_insn; ++ char *stub_name; ++ enum elf32_arm_stub_type stub_type; ++}; ++ ++/* A table of relocs applied to branches which might trigger Cortex-A8 ++ erratum. */ ++ ++struct a8_erratum_reloc { ++ bfd_vma from; ++ bfd_vma destination; ++ unsigned int r_type; ++ unsigned char st_type; ++ const char *sym_name; ++ bfd_boolean non_a8_stub; ++}; ++ + #define elf32_arm_section_data(sec) \ + ((_arm_elf_section_data *) elf_section_data (sec)) + +@@ -2295,6 +2471,16 @@ struct elf32_arm_link_hash_table + veneers. */ + bfd_size_type vfp11_erratum_glue_size; + ++ /* The size in bytes of the section containing glue for Janus 2CC erratum ++ veneers. */ ++ bfd_size_type janus_2cc_erratum_glue_size; ++ ++ /* A table of fix locations for Cortex-A8 Thumb-2 branch/TLB erratum. This ++ holds Cortex-A8 erratum fix locations between elf32_arm_size_stubs() and ++ elf32_arm_write_section(). */ ++ struct a8_erratum_fix *a8_erratum_fixes; ++ unsigned int num_a8_erratum_fixes; ++ + /* An arbitrary input BFD chosen to hold the glue sections. */ + bfd * bfd_of_glue_owner; + +@@ -2313,6 +2499,15 @@ struct elf32_arm_link_hash_table + 2 = Generate v4 interworing stubs. */ + int fix_v4bx; + ++ /* Whether we should fix/report Janus 2CC errata for ARM/Thumb. */ ++ int fix_janus_2cc; ++ ++ /* Whether we should fix the Cortex-A8 Thumb-2 branch/TLB erratum. */ ++ int fix_cortex_a8; ++ ++ /* Global counter for the number of fixes we have emitted. */ ++ int num_errata_fixes; ++ + /* Nonzero if the ARM/Thumb BLX instructions are available for use. */ + int use_blx; + +@@ -2459,6 +2654,9 @@ stub_hash_newfunc (struct bfd_hash_entry + eh->target_value = 0; + eh->target_section = NULL; + eh->stub_type = arm_stub_none; ++ eh->stub_size = 0; ++ eh->stub_template = NULL; ++ eh->stub_template_size = 0; + eh->h = NULL; + eh->id_sec = NULL; + } +@@ -2648,7 +2846,10 @@ elf32_arm_link_hash_table_create (bfd *a + memset (ret->bx_glue_offset, 0, sizeof (ret->bx_glue_offset)); + ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE; + ret->vfp11_erratum_glue_size = 0; +- ret->num_vfp11_fixes = 0; ++ ret->fix_janus_2cc = 0; ++ ret->fix_cortex_a8 = 0; ++ ret->janus_2cc_erratum_glue_size = 0; ++ ret->num_errata_fixes = 0; + ret->bfd_of_glue_owner = NULL; + ret->byteswap_code = 0; + ret->target1_is_rel = 0; +@@ -2731,9 +2932,9 @@ arm_stub_is_thumb (enum elf32_arm_stub_t + { + switch (stub_type) + { +- case arm_thumb_thumb_stub_long_branch: +- case arm_thumb_arm_v4t_stub_long_branch: +- case arm_thumb_arm_v4t_stub_short_branch: ++ case arm_stub_long_branch_thumb_only: ++ case arm_stub_long_branch_v4t_thumb_arm: ++ case arm_stub_short_branch_v4t_thumb_arm: + return TRUE; + case arm_stub_none: + BFD_FAIL (); +@@ -2806,20 +3007,27 @@ arm_type_of_stub (struct bfd_link_info * + if (!thumb_only) + { + stub_type = (info->shared | globals->pic_veneer) ++ /* PIC stubs. */ + ? ((globals->use_blx) +- ? arm_stub_pic_long_branch ++ /* V5T and above. */ ++ ? arm_stub_long_branch_any_thumb_pic ++ /* not yet supported on V4T. */ + : arm_stub_none) +- : (globals->use_blx) +- ? arm_stub_long_branch +- : arm_stub_none; ++ ++ /* non-PIC stubs. */ ++ : ((globals->use_blx) ++ /* V5T and above. */ ++ ? arm_stub_long_branch_any_any ++ /* V4T. */ ++ : arm_stub_long_branch_thumb_only); + } + else + { + stub_type = (info->shared | globals->pic_veneer) ++ /* PIC stub not yet supported on V4T. */ + ? arm_stub_none +- : (globals->use_blx) +- ? arm_thumb_thumb_stub_long_branch +- : arm_stub_none; ++ /* non-PIC stub. */ ++ : arm_stub_long_branch_thumb_only; + } + } + else +@@ -2836,18 +3044,25 @@ arm_type_of_stub (struct bfd_link_info * + } + + stub_type = (info->shared | globals->pic_veneer) ++ /* PIC stubs. */ + ? ((globals->use_blx) +- ? arm_stub_pic_long_branch ++ /* V5T and above. */ ++ ? arm_stub_long_branch_any_arm_pic ++ /* not yet supported on V4T. */ + : arm_stub_none) +- : (globals->use_blx) +- ? arm_stub_long_branch +- : arm_thumb_arm_v4t_stub_long_branch; ++ ++ /* non-PIC stubs. */ ++ : ((globals->use_blx) ++ /* V5T and above. */ ++ ? arm_stub_long_branch_any_any ++ /* V4T. */ ++ : arm_stub_long_branch_v4t_thumb_arm); + + /* Handle v4t short branches. */ +- if ((stub_type == arm_thumb_arm_v4t_stub_long_branch) ++ if ((stub_type == arm_stub_long_branch_v4t_thumb_arm) + && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET) + && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET)) +- stub_type = arm_thumb_arm_v4t_stub_short_branch; ++ stub_type = arm_stub_short_branch_v4t_thumb_arm; + } + } + } +@@ -2863,7 +3078,7 @@ arm_type_of_stub (struct bfd_link_info * + { + (*_bfd_error_handler) + (_("%B(%s): warning: interworking not enabled.\n" +- " first occurrence: %B: Thumb call to ARM"), ++ " first occurrence: %B: ARM call to Thumb"), + sym_sec->owner, input_bfd, name); + } + +@@ -2874,10 +3089,14 @@ arm_type_of_stub (struct bfd_link_info * + || !globals->use_blx) + { + stub_type = (info->shared | globals->pic_veneer) +- ? arm_stub_pic_long_branch +- : (globals->use_blx) +- ? arm_stub_long_branch +- : arm_thumb_v4t_stub_long_branch; ++ /* PIC stubs. */ ++ ? arm_stub_long_branch_any_thumb_pic ++ /* non-PIC stubs. */ ++ : ((globals->use_blx) ++ /* V5T and above. */ ++ ? arm_stub_long_branch_any_any ++ /* V4T. */ ++ : arm_stub_long_branch_v4t_arm_thumb); + } + } + else +@@ -2887,8 +3106,10 @@ arm_type_of_stub (struct bfd_link_info * + || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)) + { + stub_type = (info->shared | globals->pic_veneer) +- ? arm_stub_pic_long_branch +- : arm_stub_long_branch; ++ /* PIC stubs. */ ++ ? arm_stub_long_branch_any_arm_pic ++ /* non-PIC stubs. */ ++ : arm_stub_long_branch_any_any; + } + } + } +@@ -3064,10 +3285,16 @@ put_thumb_insn (struct elf32_arm_link_ha + bfd_putb16 (val, ptr); + } + ++static bfd_reloc_status_type elf32_arm_final_link_relocate ++ (reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *, ++ Elf_Internal_Rela *, bfd_vma, struct bfd_link_info *, asection *, ++ const char *, int, struct elf_link_hash_entry *, bfd_boolean *, char **); ++ + static bfd_boolean + arm_build_one_stub (struct bfd_hash_entry *gen_entry, + void * in_arg) + { ++#define MAXRELOCS 2 + struct elf32_arm_stub_hash_entry *stub_entry; + struct bfd_link_info *info; + struct elf32_arm_link_hash_table *htab; +@@ -3078,9 +3305,12 @@ arm_build_one_stub (struct bfd_hash_entr + bfd_vma sym_value; + int template_size; + int size; +- const bfd_vma *template; ++ const insn_sequence *template; + int i; + struct elf32_arm_link_hash_table * globals; ++ int stub_reloc_idx[MAXRELOCS] = {-1, -1}; ++ int stub_reloc_offset[MAXRELOCS] = {0, 0}; ++ int nrelocs = 0; + + /* Massage our args to the form they really have. */ + stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; +@@ -3106,102 +3336,229 @@ arm_build_one_stub (struct bfd_hash_entr + + stub_entry->target_section->output_offset + + stub_entry->target_section->output_section->vma); + +- switch (stub_entry->stub_type) +- { +- case arm_stub_long_branch: +- template = arm_long_branch_stub; +- template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_v4t_stub_long_branch: +- template = arm_thumb_v4t_long_branch_stub; +- template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_thumb_stub_long_branch: +- template = arm_thumb_thumb_long_branch_stub; +- template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_arm_v4t_stub_long_branch: +- template = arm_thumb_arm_v4t_long_branch_stub; +- template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_arm_v4t_stub_short_branch: +- template = arm_thumb_arm_v4t_short_branch_stub; +- template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_stub_pic_long_branch: +- template = arm_pic_long_branch_stub; +- template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- default: +- BFD_FAIL (); +- return FALSE; +- } ++ template = stub_entry->stub_template; ++ template_size = stub_entry->stub_template_size; + + size = 0; +- for (i = 0; i < (template_size / 4); i++) ++ for (i = 0; i < template_size; i++) + { +- /* A 0 pattern is a placeholder, every other pattern is an +- instruction. */ +- if (template[i] != 0) +- put_arm_insn (globals, stub_bfd, template[i], loc + size); +- else +- bfd_put_32 (stub_bfd, template[i], loc + size); ++ switch (template[i].type) ++ { ++ case THUMB16_TYPE: ++ { ++ bfd_vma data = template[i].data; ++ if (template[i].reloc_addend != 0) ++ { ++ /* We've borrowed the reloc_addend field to mean we should ++ insert a condition code into this (Thumb-1 branch) ++ instruction. See THUMB16_BCOND_INSN. */ ++ BFD_ASSERT ((data & 0xff00) == 0xd000); ++ data |= ((stub_entry->orig_insn >> 22) & 0xf) << 8; ++ } ++ put_thumb_insn (globals, stub_bfd, data, loc + size); ++ size += 2; ++ } ++ break; ++ ++ case THUMB32_TYPE: ++ put_thumb_insn (globals, stub_bfd, (template[i].data >> 16) & 0xffff, ++ loc + size); ++ put_thumb_insn (globals, stub_bfd, template[i].data & 0xffff, ++ loc + size + 2); ++ if (template[i].reloc_type != R_ARM_NONE) ++ { ++ stub_reloc_idx[nrelocs] = i; ++ stub_reloc_offset[nrelocs++] = size; ++ } ++ size += 4; ++ break; ++ ++ case ARM_TYPE: ++ put_arm_insn (globals, stub_bfd, template[i].data, loc + size); ++ /* Handle cases where the target is encoded within the ++ instruction. */ ++ if (template[i].reloc_type == R_ARM_JUMP24) ++ { ++ stub_reloc_idx[nrelocs] = i; ++ stub_reloc_offset[nrelocs++] = size; ++ } ++ size += 4; ++ break; ++ ++ case DATA_TYPE: ++ bfd_put_32 (stub_bfd, template[i].data, loc + size); ++ stub_reloc_idx[nrelocs] = i; ++ stub_reloc_offset[nrelocs++] = size; ++ size += 4; ++ break; + +- size += 4; ++ default: ++ BFD_FAIL (); ++ return FALSE; ++ } + } ++ + stub_sec->size += size; + ++ /* Stub size has already been computed in arm_size_one_stub. Check ++ consistency. */ ++ BFD_ASSERT (size == stub_entry->stub_size); ++ + /* Destination is Thumb. Force bit 0 to 1 to reflect this. */ + if (stub_entry->st_type == STT_ARM_TFUNC) + sym_value |= 1; + +- switch (stub_entry->stub_type) ++ /* Assume there is at least one and at most MAXRELOCS entries to relocate ++ in each stub. */ ++ BFD_ASSERT (nrelocs != 0 && nrelocs <= MAXRELOCS); ++ ++ for (i = 0; i < nrelocs; i++) ++ if (template[stub_reloc_idx[i]].reloc_type == R_ARM_THM_JUMP24 ++ || template[stub_reloc_idx[i]].reloc_type == R_ARM_THM_JUMP19 ++ || template[stub_reloc_idx[i]].reloc_type == R_ARM_THM_CALL ++ || template[stub_reloc_idx[i]].reloc_type == R_ARM_THM_XPC22) ++ { ++ Elf_Internal_Rela rel; ++ bfd_boolean unresolved_reloc; ++ char *error_message; ++ int sym_flags ++ = (template[stub_reloc_idx[i]].reloc_type != R_ARM_THM_XPC22) ++ ? STT_ARM_TFUNC : 0; ++ bfd_vma points_to = sym_value + stub_entry->target_addend; ++ ++ rel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i]; ++ rel.r_info = ELF32_R_INFO (0, template[stub_reloc_idx[i]].reloc_type); ++ rel.r_addend = template[stub_reloc_idx[i]].reloc_addend; ++ ++ if (stub_entry->stub_type == arm_stub_a8_veneer_b_cond && i == 0) ++ /* The first relocation in the elf32_arm_stub_a8_veneer_b_cond[] ++ template should refer back to the instruction after the original ++ branch. */ ++ points_to = sym_value; ++ ++ /* Note: _bfd_final_link_relocate doesn't handle these relocations ++ properly. We should probably use this function unconditionally, ++ rather than only for certain relocations listed in the enclosing ++ conditional. Attempt to avoid perturbing existing code too much ++ pending more testing. */ ++ elf32_arm_final_link_relocate (elf32_arm_howto_from_type ++ (template[stub_reloc_idx[i]].reloc_type), ++ stub_bfd, info->output_bfd, stub_sec, stub_sec->contents, &rel, ++ points_to, info, stub_entry->target_section, "", sym_flags, ++ (struct elf_link_hash_entry *) stub_entry, &unresolved_reloc, ++ &error_message); ++ } ++ else ++ { ++ _bfd_final_link_relocate (elf32_arm_howto_from_type ++ (template[stub_reloc_idx[i]].reloc_type), stub_bfd, stub_sec, ++ stub_sec->contents, stub_entry->stub_offset + stub_reloc_offset[i], ++ sym_value + stub_entry->target_addend, ++ template[stub_reloc_idx[i]].reloc_addend); ++ } ++ ++ return TRUE; ++#undef MAXRELOCS ++} ++ ++/* Calculate the template, template size and instruction size for a stub. ++ Return value is the instruction size. */ ++ ++static unsigned int ++find_stub_size_and_template (enum elf32_arm_stub_type stub_type, ++ const insn_sequence **stub_template, ++ int *stub_template_size) ++{ ++ const insn_sequence *template = NULL; ++ int template_size = 0, i; ++ unsigned int size; ++ ++ switch (stub_type) + { +- case arm_stub_long_branch: +- _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32), +- stub_bfd, stub_sec, stub_sec->contents, +- stub_entry->stub_offset + 4, sym_value, 0); ++ case arm_stub_long_branch_any_any: ++ template = elf32_arm_stub_long_branch_any_any; ++ template_size = sizeof (elf32_arm_stub_long_branch_any_any) ++ / sizeof (insn_sequence); + break; +- case arm_thumb_v4t_stub_long_branch: +- _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32), +- stub_bfd, stub_sec, stub_sec->contents, +- stub_entry->stub_offset + 8, sym_value, 0); ++ case arm_stub_long_branch_v4t_arm_thumb: ++ template = elf32_arm_stub_long_branch_v4t_arm_thumb; ++ template_size = sizeof (elf32_arm_stub_long_branch_v4t_arm_thumb) ++ / sizeof (insn_sequence); + break; +- case arm_thumb_thumb_stub_long_branch: +- _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32), +- stub_bfd, stub_sec, stub_sec->contents, +- stub_entry->stub_offset + 12, sym_value, 0); ++ case arm_stub_long_branch_thumb_only: ++ template = elf32_arm_stub_long_branch_thumb_only; ++ template_size = sizeof (elf32_arm_stub_long_branch_thumb_only) ++ / sizeof (insn_sequence); + break; +- case arm_thumb_arm_v4t_stub_long_branch: +- _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32), +- stub_bfd, stub_sec, stub_sec->contents, +- stub_entry->stub_offset + 16, sym_value, 0); ++ case arm_stub_long_branch_v4t_thumb_arm: ++ template = elf32_arm_stub_long_branch_v4t_thumb_arm; ++ template_size = sizeof (elf32_arm_stub_long_branch_v4t_thumb_arm) ++ / sizeof (insn_sequence); + break; +- case arm_thumb_arm_v4t_stub_short_branch: +- { +- long int rel_offset; +- static const insn32 t2a3_b_insn = 0xea000000; +- +- rel_offset = sym_value - (stub_addr + 8 + 4); +- +- put_arm_insn (globals, stub_bfd, +- (bfd_vma) t2a3_b_insn | ((rel_offset >> 2) & 0x00FFFFFF), +- loc + 4); +- } ++ case arm_stub_short_branch_v4t_thumb_arm: ++ template = elf32_arm_stub_short_branch_v4t_thumb_arm; ++ template_size = sizeof (elf32_arm_stub_short_branch_v4t_thumb_arm) ++ / sizeof (insn_sequence); + break; +- +- case arm_stub_pic_long_branch: +- /* We want the value relative to the address 8 bytes from the +- start of the stub. */ +- _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_REL32), +- stub_bfd, stub_sec, stub_sec->contents, +- stub_entry->stub_offset + 8, sym_value, 0); ++ case arm_stub_long_branch_any_arm_pic: ++ template = elf32_arm_stub_long_branch_any_arm_pic; ++ template_size = sizeof (elf32_arm_stub_long_branch_any_arm_pic) ++ / sizeof (insn_sequence); + break; +- default: ++ case arm_stub_long_branch_any_thumb_pic: ++ template = elf32_arm_stub_long_branch_any_thumb_pic; ++ template_size = sizeof (elf32_arm_stub_long_branch_any_thumb_pic) ++ / sizeof (insn_sequence); + break; ++ case arm_stub_a8_veneer_b_cond: ++ template = elf32_arm_stub_a8_veneer_b_cond; ++ template_size = sizeof (elf32_arm_stub_a8_veneer_b_cond) ++ / sizeof (insn_sequence); ++ break; ++ case arm_stub_a8_veneer_b: ++ case arm_stub_a8_veneer_bl: ++ template = elf32_arm_stub_a8_veneer_b; ++ template_size = sizeof (elf32_arm_stub_a8_veneer_b) ++ / sizeof (insn_sequence); ++ break; ++ case arm_stub_a8_veneer_blx: ++ template = elf32_arm_stub_a8_veneer_blx; ++ template_size = sizeof (elf32_arm_stub_a8_veneer_blx) ++ / sizeof (insn_sequence); ++ break; ++ default: ++ BFD_FAIL (); ++ return 0; + } + +- return TRUE; ++ size = 0; ++ for (i = 0; i < template_size; i++) ++ { ++ switch (template[i].type) ++ { ++ case THUMB16_TYPE: ++ size += 2; ++ break; ++ ++ case ARM_TYPE: ++ case THUMB32_TYPE: ++ case DATA_TYPE: ++ size += 4; ++ break; ++ ++ default: ++ BFD_FAIL (); ++ return 0; ++ } ++ } ++ ++ if (stub_template) ++ *stub_template = template; ++ ++ if (stub_template_size) ++ *stub_template_size = template_size; ++ ++ return size; + } + + /* As above, but don't actually build the stub. Just bump offset so +@@ -3213,52 +3570,24 @@ arm_size_one_stub (struct bfd_hash_entry + { + struct elf32_arm_stub_hash_entry *stub_entry; + struct elf32_arm_link_hash_table *htab; +- const bfd_vma *template; ++ const insn_sequence *template; + int template_size; + int size; +- int i; + + /* Massage our args to the form they really have. */ + stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; + htab = (struct elf32_arm_link_hash_table *) in_arg; + +- switch (stub_entry->stub_type) +- { +- case arm_stub_long_branch: +- template = arm_long_branch_stub; +- template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_v4t_stub_long_branch: +- template = arm_thumb_v4t_long_branch_stub; +- template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_thumb_stub_long_branch: +- template = arm_thumb_thumb_long_branch_stub; +- template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_arm_v4t_stub_long_branch: +- template = arm_thumb_arm_v4t_long_branch_stub; +- template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_thumb_arm_v4t_stub_short_branch: +- template = arm_thumb_arm_v4t_short_branch_stub; +- template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- case arm_stub_pic_long_branch: +- template = arm_pic_long_branch_stub; +- template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4; +- break; +- default: +- BFD_FAIL (); +- return FALSE; +- break; +- } ++ size = find_stub_size_and_template (stub_entry->stub_type, &template, ++ &template_size); ++ ++ stub_entry->stub_size = size; ++ stub_entry->stub_template = template; ++ stub_entry->stub_template_size = template_size; + +- size = 0; +- for (i = 0; i < (template_size / 4); i++) +- size += 4; + size = (size + 7) & ~7; + stub_entry->stub_sec->size += size; ++ + return TRUE; + } + +@@ -3355,12 +3684,12 @@ elf32_arm_next_input_section (struct bfd + { + asection **list = htab->input_list + isec->output_section->index; + +- if (*list != bfd_abs_section_ptr) ++ if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0) + { + /* Steal the link_sec pointer for our list. */ + #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec) + /* This happens to make the list in reverse order, +- which is what we want. */ ++ which we reverse later. */ + PREV_SEC (isec) = *list; + *list = isec; + } +@@ -3369,7 +3698,7 @@ elf32_arm_next_input_section (struct bfd + + /* See whether we can group stub sections together. Grouping stub + sections may result in fewer stubs. More importantly, we need to +- put all .init* and .fini* stubs at the beginning of the .init or ++ put all .init* and .fini* stubs at the end of the .init or + .fini output sections respectively, because glibc splits the + _init and _fini functions into multiple parts. Putting a stub in + the middle of a function is not a good idea. */ +@@ -3377,68 +3706,104 @@ elf32_arm_next_input_section (struct bfd + static void + group_sections (struct elf32_arm_link_hash_table *htab, + bfd_size_type stub_group_size, +- bfd_boolean stubs_always_before_branch) ++ bfd_boolean stubs_always_after_branch) + { +- asection **list = htab->input_list + htab->top_index; ++ asection **list = htab->input_list; + + do + { + asection *tail = *list; ++ asection *head; ++ asection *tp; + + if (tail == bfd_abs_section_ptr) + continue; + +- while (tail != NULL) ++ /* Reverse the list: we must avoid placing stubs at the ++ beginning of the section because the beginning of the text ++ section may be required for an interrupt vector in bare metal ++ code. */ ++#define NEXT_SEC PREV_SEC ++ head = tail; ++ tp = NULL; ++ while (head != NULL) ++ { ++ asection *h = PREV_SEC (head); ++ NEXT_SEC (head) = tp; ++ if (h == NULL) ++ break; ++ tp = head; ++ head = h; ++ } ++ ++ while (head != NULL) + { + asection *curr; +- asection *prev; ++ asection *next; + bfd_size_type total; + +- curr = tail; +- total = tail->size; +- while ((prev = PREV_SEC (curr)) != NULL +- && ((total += curr->output_offset - prev->output_offset) ++ curr = head; ++ total = head->size; ++ while ((next = NEXT_SEC (curr)) != NULL ++ && ((total += next->output_offset - curr->output_offset) + < stub_group_size)) +- curr = prev; ++ curr = next; + +- /* OK, the size from the start of CURR to the end is less ++ /* OK, the size from the start to the start of CURR is less + than stub_group_size and thus can be handled by one stub +- section. (Or the tail section is itself larger than ++ section. (Or the head section is itself larger than + stub_group_size, in which case we may be toast.) + We should really be keeping track of the total size of + stubs added here, as stubs contribute to the final output + section size. */ + do + { +- prev = PREV_SEC (tail); ++ next = NEXT_SEC (head); + /* Set up this stub group. */ +- htab->stub_group[tail->id].link_sec = curr; ++ htab->stub_group[head->id].link_sec = curr; + } +- while (tail != curr && (tail = prev) != NULL); ++ while (head != curr && (head = next) != NULL); + + /* But wait, there's more! Input sections up to stub_group_size +- bytes before the stub section can be handled by it too. */ +- if (!stubs_always_before_branch) ++ bytes after the stub section can be handled by it too. */ ++ if (!stubs_always_after_branch) + { + total = 0; +- while (prev != NULL +- && ((total += tail->output_offset - prev->output_offset) ++ while (next != NULL ++ && ((total += next->output_offset - head->output_offset) + < stub_group_size)) + { +- tail = prev; +- prev = PREV_SEC (tail); +- htab->stub_group[tail->id].link_sec = curr; ++ head = next; ++ next = NEXT_SEC (head); ++ htab->stub_group[head->id].link_sec = curr; + } + } +- tail = prev; ++ head = next; + } + } +- while (list-- != htab->input_list); ++ while (list++ != htab->input_list + htab->top_index); + + free (htab->input_list); + #undef PREV_SEC ++#undef NEXT_SEC ++} ++ ++static int ++a8_reloc_compare (const void *a, const void *b) ++{ ++ const struct a8_erratum_reloc *ra = a, *rb = b; ++ ++ if (ra->from < rb->from) ++ return -1; ++ else if (ra->from > rb->from) ++ return 1; ++ else ++ return 0; + } + ++static struct elf_link_hash_entry *find_thumb_glue (struct bfd_link_info *, ++ const char *, char **); ++ + /* Determine and set the size of the stub section for a final link. + + The basic idea here is to examine all the relocations looking for +@@ -3454,9 +3819,22 @@ elf32_arm_size_stubs (bfd *output_bfd, + void (*layout_sections_again) (void)) + { + bfd_size_type stub_group_size; +- bfd_boolean stubs_always_before_branch; ++ bfd_boolean stubs_always_after_branch; + bfd_boolean stub_changed = 0; + struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info); ++ struct a8_erratum_fix *a8_fixes = NULL; ++ unsigned int num_a8_fixes = 0, prev_num_a8_fixes = 0, a8_fix_table_size = 10; ++ struct a8_erratum_reloc *a8_relocs = NULL; ++ unsigned int num_a8_relocs = 0, a8_reloc_table_size = 10; ++ unsigned int i; ++ ++ if (htab->fix_cortex_a8) ++ { ++ a8_fixes = bfd_zmalloc (sizeof (struct a8_erratum_fix) ++ * a8_fix_table_size); ++ a8_relocs = bfd_zmalloc (sizeof (struct a8_erratum_reloc) ++ * a8_reloc_table_size); ++ } + + /* Propagate mach to stub bfd, because it may not have been + finalized when we created stub_bfd. */ +@@ -3467,7 +3845,14 @@ elf32_arm_size_stubs (bfd *output_bfd, + htab->stub_bfd = stub_bfd; + htab->add_stub_section = add_stub_section; + htab->layout_sections_again = layout_sections_again; +- stubs_always_before_branch = group_size < 0; ++ stubs_always_after_branch = group_size < 0; ++ ++ /* The Cortex-A8 erratum fix depends on stubs not being in the same 4K page ++ as the first half of a 32-bit branch straddling two 4K pages. This is a ++ crude way of enforcing that. */ ++ if (htab->fix_cortex_a8) ++ stubs_always_after_branch = 1; ++ + if (group_size < 0) + stub_group_size = -group_size; + else +@@ -3487,13 +3872,16 @@ elf32_arm_size_stubs (bfd *output_bfd, + stub_group_size = 4170000; + } + +- group_sections (htab, stub_group_size, stubs_always_before_branch); ++ group_sections (htab, stub_group_size, stubs_always_after_branch); + + while (1) + { + bfd *input_bfd; + unsigned int bfd_indx; + asection *stub_sec; ++ unsigned int i; ++ ++ num_a8_fixes = 0; + + for (input_bfd = info->input_bfds, bfd_indx = 0; + input_bfd != NULL; +@@ -3503,6 +3891,8 @@ elf32_arm_size_stubs (bfd *output_bfd, + asection *section; + Elf_Internal_Sym *local_syms = NULL; + ++ num_a8_relocs = 0; ++ + /* We'll need the symbol table in a second. */ + symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; + if (symtab_hdr->sh_info == 0) +@@ -3551,6 +3941,7 @@ elf32_arm_size_stubs (bfd *output_bfd, + char *stub_name; + const asection *id_sec; + unsigned char st_type; ++ bfd_boolean created_stub = FALSE; + + r_type = ELF32_R_TYPE (irela->r_info); + r_indx = ELF32_R_SYM (irela->r_info); +@@ -3564,9 +3955,14 @@ elf32_arm_size_stubs (bfd *output_bfd, + goto error_ret_free_local; + } + +- /* Only look for stubs on call instructions. */ +- if ((r_type != (unsigned int) R_ARM_CALL) +- && (r_type != (unsigned int) R_ARM_THM_CALL)) ++ /* Only look for stubs on call or Thumb-2 call/branch ++ instructions. */ ++ if (r_type != (unsigned int) R_ARM_CALL ++ && r_type != (unsigned int) R_ARM_THM_CALL ++ && r_type != (unsigned int) R_ARM_THM_JUMP24 ++ && r_type != (unsigned int) R_ARM_THM_JUMP19 ++ && r_type != (unsigned int) R_ARM_THM_CALL ++ && r_type != (unsigned int) R_ARM_THM_XPC22) + continue; + + /* Now determine the call target, its name, value, +@@ -3648,79 +4044,393 @@ elf32_arm_size_stubs (bfd *output_bfd, + sym_name = hash->root.root.root.string; + } + +- /* Determine what (if any) linker stub is needed. */ +- stub_type = arm_type_of_stub (info, section, irela, st_type, +- hash, destination, sym_sec, +- input_bfd, sym_name); +- if (stub_type == arm_stub_none) +- continue; ++ /* Only look for stubs on call instructions. */ ++ if (r_type == (unsigned int) R_ARM_CALL ++ || r_type == (unsigned int) R_ARM_THM_CALL) ++ do ++ { ++ /* Determine what (if any) linker stub is needed. */ ++ stub_type = arm_type_of_stub (info, section, irela, ++ st_type, hash, ++ destination, sym_sec, ++ input_bfd, sym_name); ++ if (stub_type == arm_stub_none) ++ break; ++ ++ /* Support for grouping stub sections. */ ++ id_sec = htab->stub_group[section->id].link_sec; ++ ++ /* Get the name of this stub. */ ++ stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, ++ irela); ++ if (!stub_name) ++ goto error_ret_free_internal; + +- /* Support for grouping stub sections. */ +- id_sec = htab->stub_group[section->id].link_sec; ++ /* We've either created a stub for this reloc already, ++ or we are about to. */ ++ created_stub = TRUE; ++ ++ stub_entry = arm_stub_hash_lookup ++ (&htab->stub_hash_table, stub_name, ++ FALSE, FALSE); ++ if (stub_entry != NULL) ++ { ++ /* The proper stub has already been created. */ ++ free (stub_name); ++ break; ++ } ++ ++ stub_entry = elf32_arm_add_stub (stub_name, section, ++ htab); ++ if (stub_entry == NULL) ++ { ++ free (stub_name); ++ goto error_ret_free_internal; ++ } + +- /* Get the name of this stub. */ +- stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela); +- if (!stub_name) +- goto error_ret_free_internal; +- +- stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, +- stub_name, +- FALSE, FALSE); +- if (stub_entry != NULL) +- { +- /* The proper stub has already been created. */ +- free (stub_name); +- continue; +- } ++ stub_entry->target_value = sym_value; ++ stub_entry->target_section = sym_sec; ++ stub_entry->stub_type = stub_type; ++ stub_entry->h = hash; ++ stub_entry->st_type = st_type; ++ ++ if (sym_name == NULL) ++ sym_name = "unnamed"; ++ stub_entry->output_name ++ = bfd_alloc (htab->stub_bfd, ++ sizeof (THUMB2ARM_GLUE_ENTRY_NAME) ++ + strlen (sym_name)); ++ if (stub_entry->output_name == NULL) ++ { ++ free (stub_name); ++ goto error_ret_free_internal; ++ } + +- stub_entry = elf32_arm_add_stub (stub_name, section, htab); +- if (stub_entry == NULL) +- { +- free (stub_name); +- goto error_ret_free_internal; +- } ++ /* For historical reasons, use the existing names for ++ ARM-to-Thumb and Thumb-to-ARM stubs. */ ++ if (r_type == (unsigned int) R_ARM_THM_CALL ++ && st_type != STT_ARM_TFUNC) ++ sprintf (stub_entry->output_name, ++ THUMB2ARM_GLUE_ENTRY_NAME, sym_name); ++ else if (r_type == (unsigned int) R_ARM_CALL ++ && st_type == STT_ARM_TFUNC) ++ sprintf (stub_entry->output_name, ++ ARM2THUMB_GLUE_ENTRY_NAME, sym_name); ++ else ++ sprintf (stub_entry->output_name, STUB_ENTRY_NAME, ++ sym_name); + +- stub_entry->target_value = sym_value; +- stub_entry->target_section = sym_sec; +- stub_entry->stub_type = stub_type; +- stub_entry->h = hash; +- stub_entry->st_type = st_type; +- +- if (sym_name == NULL) +- sym_name = "unnamed"; +- stub_entry->output_name +- = bfd_alloc (htab->stub_bfd, +- sizeof (THUMB2ARM_GLUE_ENTRY_NAME) +- + strlen (sym_name)); +- if (stub_entry->output_name == NULL) ++ stub_changed = TRUE; ++ } ++ while (0); ++ ++ /* Look for relocations which might trigger Cortex-A8 ++ erratum. */ ++ if (htab->fix_cortex_a8 ++ && (r_type == (unsigned int) R_ARM_THM_JUMP24 ++ || r_type == (unsigned int) R_ARM_THM_JUMP19 ++ || r_type == (unsigned int) R_ARM_THM_CALL ++ || r_type == (unsigned int) R_ARM_THM_XPC22)) + { +- free (stub_name); +- goto error_ret_free_internal; ++ bfd_vma from = section->output_section->vma ++ + section->output_offset ++ + irela->r_offset; ++ ++ if ((from & 0xfff) == 0xffe) ++ { ++ /* Found a candidate. Note we haven't checked the ++ destination is within 4K here: if we do so (and ++ don't create an entry in a8_relocs) we can't tell ++ that a branch should have been relocated when ++ scanning later. */ ++ if (num_a8_relocs == a8_reloc_table_size) ++ { ++ a8_reloc_table_size *= 2; ++ a8_relocs = bfd_realloc (a8_relocs, ++ sizeof (struct a8_erratum_reloc) ++ * a8_reloc_table_size); ++ } ++ ++ a8_relocs[num_a8_relocs].from = from; ++ a8_relocs[num_a8_relocs].destination = destination; ++ a8_relocs[num_a8_relocs].r_type = r_type; ++ a8_relocs[num_a8_relocs].st_type = st_type; ++ a8_relocs[num_a8_relocs].sym_name = sym_name; ++ a8_relocs[num_a8_relocs].non_a8_stub = created_stub; ++ ++ num_a8_relocs++; ++ } + } +- +- /* For historical reasons, use the existing names for +- ARM-to-Thumb and Thumb-to-ARM stubs. */ +- if (r_type == (unsigned int) R_ARM_THM_CALL +- && st_type != STT_ARM_TFUNC) +- sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME, +- sym_name); +- else if (r_type == (unsigned int) R_ARM_CALL +- && st_type == STT_ARM_TFUNC) +- sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME, +- sym_name); +- else +- sprintf (stub_entry->output_name, STUB_ENTRY_NAME, +- sym_name); +- +- stub_changed = TRUE; + } + + /* We're done with the internal relocs, free them. */ + if (elf_section_data (section)->relocs == NULL) + free (internal_relocs); + } ++ ++ if (!htab->fix_cortex_a8) ++ continue; ++ ++ /* Sort relocs which might apply to Cortex-A8 erratum. */ ++ qsort (a8_relocs, num_a8_relocs, sizeof (struct a8_erratum_reloc), ++ &a8_reloc_compare); ++ ++ /* Scan for branches which might trigger Cortex-A8 erratum. */ ++ for (section = input_bfd->sections; ++ section != NULL; ++ section = section->next) ++ { ++ bfd_byte *contents = NULL; ++ struct _arm_elf_section_data *sec_data; ++ unsigned int span; ++ bfd_vma base_vma; ++ ++ if (elf_section_type (section) != SHT_PROGBITS ++ || (elf_section_flags (section) & SHF_EXECINSTR) == 0 ++ || (section->flags & SEC_EXCLUDE) != 0 ++ || (section->sec_info_type == ELF_INFO_TYPE_JUST_SYMS) ++ || (section->output_section == bfd_abs_section_ptr)) ++ continue; ++ ++ base_vma = section->output_section->vma ++ + section->output_offset; ++ ++ if (elf_section_data (section)->this_hdr.contents != NULL) ++ contents = elf_section_data (section)->this_hdr.contents; ++ else if (! bfd_malloc_and_get_section (input_bfd, section, ++ &contents)) ++ goto error_ret_free_local; ++ ++ sec_data = elf32_arm_section_data (section); ++ ++ for (span = 0; span < sec_data->mapcount; span++) ++ { ++ unsigned int span_start = sec_data->map[span].vma; ++ unsigned int span_end = (span == sec_data->mapcount - 1) ++ ? section->size : sec_data->map[span + 1].vma; ++ unsigned int i; ++ char span_type = sec_data->map[span].type; ++ bfd_boolean last_was_32bit = FALSE; ++ ++ if (span_type != 't') ++ continue; ++ ++ /* Span is entirely within a single 4KB region: skip ++ scanning. */ ++ if (((base_vma + span_start) & ~0xfff) ++ == ((base_vma + span_end) & ~0xfff)) ++ continue; ++ ++ /* Scan for 32-bit Thumb-2 branches which span two 4K ++ regions, where: ++ ++ * The opcode is BLX.W, BL.W, B.W, Bcc.W ++ * The branch target is in the same 4KB region as the ++ first half of the branch. ++ * The instruction before the branch is a 32-bit ++ length non-branch instruction. ++ */ ++ ++ for (i = span_start; i < span_end;) ++ { ++ unsigned int insn = bfd_getl16 (&contents[i]); ++ bfd_boolean insn_32bit = FALSE; ++ ++ if ((insn & 0xe000) == 0xe000 ++ && (insn & 0x1800) != 0x0000) ++ insn_32bit = TRUE; ++ ++ if (((base_vma + i) & 0xfff) == 0xffe ++ && insn_32bit && last_was_32bit) ++ { ++ bfd_vma offset; ++ bfd_boolean is_blx = FALSE, is_b = FALSE; ++ bfd_boolean is_bl = FALSE, force_target_arm = FALSE; ++ bfd_boolean force_target_thumb = FALSE; ++ bfd_vma target; ++ enum elf32_arm_stub_type stub_type = arm_stub_none; ++ struct a8_erratum_reloc key, *found; ++ ++ key.from = base_vma + i; ++ found = bsearch (&key, a8_relocs, num_a8_relocs, ++ sizeof (struct a8_erratum_reloc), ++ &a8_reloc_compare); ++ ++ if (found) ++ { ++ char *error_message = NULL; ++ struct elf_link_hash_entry *entry; ++ ++ /* We don't care about the error returned from ++ this function, only if there is glue or ++ not. */ ++ entry = find_thumb_glue (info, found->sym_name, ++ &error_message); ++ ++ if (entry) ++ found->non_a8_stub = TRUE; ++ ++ if (found->r_type == R_ARM_THM_CALL ++ && found->st_type != STT_ARM_TFUNC) ++ force_target_arm = TRUE; ++ else if (found->r_type == R_ARM_THM_CALL ++ && found->st_type == STT_ARM_TFUNC) ++ force_target_thumb = TRUE; ++ } ++ ++ /* Load the rest of the insn (in manual-friendly ++ order). */ ++ insn = (insn << 16) ++ | bfd_getl16 (&contents[i + 2]); ++ ++ /* Check if we have an offending branch ++ instruction. */ ++ ++ /* Encoding T4: B.W. */ ++ is_b = (insn & 0xf800d000) == 0xf0009000; ++ /* Encoding T1: BL.W. */ ++ is_bl = (insn & 0xf800d000) == 0xf000d000; ++ /* Encoding T2: BLX.W. */ ++ is_blx = (insn & 0xf800d000) == 0xf000c000; ++ ++ if (found && found->non_a8_stub) ++ /* We've already made a stub for this instruction, ++ e.g. it's a long branch or a Thumb->ARM stub. ++ Assume that stub will suffice to work around the ++ A8 erratum (see setting of always_after_branch ++ above). */ ++ ; ++ else if ((insn & 0xf800d000) == 0xf0008000 ++ && (insn & 0x07f00000) != 0x03800000) ++ { ++ /* Encoding T3: B.W (not permitted in IT ++ block). */ ++ offset = (insn & 0x7ff) << 1; ++ offset |= (insn & 0x3f0000) >> 4; ++ offset |= (insn & 0x2000) ? 0x40000 : 0; ++ offset |= (insn & 0x800) ? 0x80000 : 0; ++ offset |= (insn & 0x4000000) ? 0x100000 : 0; ++ if (offset & 0x100000) ++ offset |= ~0xfffff; ++ stub_type = arm_stub_a8_veneer_b_cond; ++ } ++ else if (is_b || is_bl || is_blx) ++ { ++ int s = (insn & 0x4000000) != 0; ++ int j1 = (insn & 0x2000) != 0; ++ int j2 = (insn & 0x800) != 0; ++ int i1 = !(j1 ^ s); ++ int i2 = !(j2 ^ s); ++ ++ offset = (insn & 0x7ff) << 1; ++ offset |= (insn & 0x3ff0000) >> 4; ++ offset |= i2 << 22; ++ offset |= i1 << 23; ++ offset |= s << 24; ++ if (offset & 0x1000000) ++ offset |= ~0xffffff; ++ ++ if (is_blx) ++ offset &= ~3u; ++ ++ stub_type = is_blx ? arm_stub_a8_veneer_blx : ++ is_bl ? arm_stub_a8_veneer_bl : ++ arm_stub_a8_veneer_b; ++ } ++ ++ if (stub_type != arm_stub_none) ++ { ++ bfd_vma pc_for_insn = base_vma + i + 4; ++ ++ /* The original instruction is a BL, but the ++ target is an ARM instruction. If we were not ++ making a stub, the BL would have been ++ converted to a BLX. Use the BLX stub instead ++ in that case. */ ++ if (htab->use_blx && force_target_arm ++ && stub_type == arm_stub_a8_veneer_bl) ++ { ++ stub_type = arm_stub_a8_veneer_blx; ++ is_blx = TRUE; ++ is_bl = FALSE; ++ } ++ /* Conversely, if the original instruction was ++ BLX but the target is Thumb mode, use the BL ++ stub. */ ++ else if (force_target_thumb ++ && stub_type == arm_stub_a8_veneer_blx) ++ { ++ stub_type = arm_stub_a8_veneer_bl; ++ is_blx = FALSE; ++ is_bl = TRUE; ++ } ++ ++ if (is_blx) ++ pc_for_insn &= ~3u; ++ ++ /* If we found a relocation, use the proper ++ destination, not the offset in the ++ (unrelocated) instruction. Note this is ++ always done if we switched the stub type ++ above. */ ++ if (found) ++ offset = found->destination - pc_for_insn; ++ ++ target = pc_for_insn + offset; ++ ++ /* The BLX stub is ARM-mode code. Adjust the ++ offset to take the different PC value (+8 ++ instead of +4) into account. */ ++ if (stub_type == arm_stub_a8_veneer_blx) ++ offset += 4; ++ ++ if (((base_vma + i) & ~0xfff) ++ == (target & ~0xfff)) ++ { ++ char *stub_name; ++ ++ if (num_a8_fixes == a8_fix_table_size) ++ { ++ a8_fix_table_size *= 2; ++ a8_fixes = bfd_realloc (a8_fixes, ++ sizeof (struct a8_erratum_fix) ++ * a8_fix_table_size); ++ } ++ ++ stub_name = bfd_malloc (8 + 1 + 8 + 1); ++ if (stub_name != NULL) ++ sprintf (stub_name, "%x:%x", ++ section->id, i); ++ ++ a8_fixes[num_a8_fixes].input_bfd ++ = input_bfd; ++ a8_fixes[num_a8_fixes].section = section; ++ a8_fixes[num_a8_fixes].offset = i; ++ a8_fixes[num_a8_fixes].addend = offset; ++ a8_fixes[num_a8_fixes].orig_insn = insn; ++ a8_fixes[num_a8_fixes].stub_name ++ = stub_name; ++ a8_fixes[num_a8_fixes].stub_type ++ = stub_type; ++ ++ num_a8_fixes++; ++ } ++ } ++ } ++ ++ i += insn_32bit ? 4 : 2; ++ last_was_32bit = insn_32bit; ++ } ++ } ++ ++ if (elf_section_data (section)->this_hdr.contents == NULL) ++ free (contents); ++ } + } + ++ if (htab->fix_cortex_a8 && num_a8_fixes != prev_num_a8_fixes) ++ stub_changed = TRUE; ++ + if (!stub_changed) + break; + +@@ -3729,13 +4439,113 @@ elf32_arm_size_stubs (bfd *output_bfd, + for (stub_sec = htab->stub_bfd->sections; + stub_sec != NULL; + stub_sec = stub_sec->next) +- stub_sec->size = 0; ++ { ++ /* Ignore non-stub sections. */ ++ if (!strstr (stub_sec->name, STUB_SUFFIX)) ++ continue; ++ ++ stub_sec->size = 0; ++ } + + bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab); + ++ /* Add Cortex-A8 erratum veneers to stub section sizes too. */ ++ if (htab->fix_cortex_a8) ++ for (i = 0; i < num_a8_fixes; i++) ++ { ++ unsigned int section_id = a8_fixes[i].section->id; ++ asection *link_sec = htab->stub_group[section_id].link_sec; ++ asection *stub_sec = htab->stub_group[section_id].stub_sec; ++ ++ /* Copied from elf32_arm_add_stub! Refactor. */ ++ if (stub_sec == NULL) ++ { ++ stub_sec = htab->stub_group[link_sec->id].stub_sec; ++ if (stub_sec == NULL) ++ { ++ size_t namelen; ++ bfd_size_type len; ++ char *s_name; ++ ++ namelen = strlen (link_sec->name); ++ len = namelen + sizeof (STUB_SUFFIX); ++ s_name = bfd_alloc (htab->stub_bfd, len); ++ if (s_name == NULL) ++ goto error_ret_free_local; ++ ++ memcpy (s_name, link_sec->name, namelen); ++ memcpy (s_name + namelen, STUB_SUFFIX, ++ sizeof (STUB_SUFFIX)); ++ stub_sec = (*htab->add_stub_section) (s_name, link_sec); ++ if (stub_sec == NULL) ++ goto error_ret_free_local; ++ htab->stub_group[link_sec->id].stub_sec = stub_sec; ++ } ++ htab->stub_group[section_id].stub_sec = stub_sec; ++ } ++ ++ stub_sec->size ++ += find_stub_size_and_template (a8_fixes[i].stub_type, NULL, ++ NULL); ++ } ++ + /* Ask the linker to do its stuff. */ + (*htab->layout_sections_again) (); + stub_changed = FALSE; ++ prev_num_a8_fixes = num_a8_fixes; ++ } ++ ++ /* Add stubs for Cortex-A8 erratum fixes now. */ ++ if (htab->fix_cortex_a8) ++ { ++ for (i = 0; i < num_a8_fixes; i++) ++ { ++ struct elf32_arm_stub_hash_entry *stub_entry; ++ char *stub_name = a8_fixes[i].stub_name; ++ asection *section = a8_fixes[i].section; ++ unsigned int section_id = a8_fixes[i].section->id; ++ asection *link_sec = htab->stub_group[section_id].link_sec; ++ asection *stub_sec = htab->stub_group[section_id].stub_sec; ++ const insn_sequence *template; ++ int template_size, size = 0; ++ ++ stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name, ++ TRUE, FALSE); ++ if (stub_entry == NULL) ++ { ++ (*_bfd_error_handler) (_("%s: cannot create stub entry %s"), ++ section->owner, ++ stub_name); ++ return FALSE; ++ } ++ ++ stub_entry->stub_sec = stub_sec; ++ stub_entry->stub_offset = 0; ++ stub_entry->id_sec = link_sec; ++ stub_entry->stub_type = a8_fixes[i].stub_type; ++ stub_entry->target_section = a8_fixes[i].section; ++ stub_entry->target_value = a8_fixes[i].offset; ++ stub_entry->target_addend = a8_fixes[i].addend; ++ stub_entry->orig_insn = a8_fixes[i].orig_insn; ++ stub_entry->st_type = STT_ARM_TFUNC; ++ ++ size = find_stub_size_and_template (a8_fixes[i].stub_type, &template, ++ &template_size); ++ ++ stub_entry->stub_size = size; ++ stub_entry->stub_template = template; ++ stub_entry->stub_template_size = template_size; ++ } ++ ++ /* Stash the Cortex-A8 erratum fix array for use later in ++ elf32_arm_write_section(). */ ++ htab->a8_erratum_fixes = a8_fixes; ++ htab->num_a8_erratum_fixes = num_a8_fixes; ++ } ++ else ++ { ++ htab->a8_erratum_fixes = NULL; ++ htab->num_a8_erratum_fixes = 0; + } + + return TRUE; +@@ -3913,6 +4723,7 @@ static const insn16 t2a2_noop_insn = 0x4 + static const insn32 t2a3_b_insn = 0xea000000; + + #define VFP11_ERRATUM_VENEER_SIZE 8 ++#define JANUS_2CC_ERRATUM_VENEER_SIZE 12 + + #define ARM_BX_VENEER_SIZE 12 + static const insn32 armbx1_tst_insn = 0xe3100001; +@@ -3927,7 +4738,16 @@ arm_allocate_glue_section_space (bfd * a + bfd_byte * contents; + + if (size == 0) +- return; ++ { ++ /* Do not include empty glue sections in the output. */ ++ if (abfd != NULL) ++ { ++ s = bfd_get_section_by_name (abfd, name); ++ if (s != NULL) ++ s->flags |= SEC_EXCLUDE; ++ } ++ return; ++ } + + BFD_ASSERT (abfd != NULL); + +@@ -3964,6 +4784,10 @@ bfd_elf32_arm_allocate_interworking_sect + globals->bx_glue_size, + ARM_BX_GLUE_SECTION_NAME); + ++ arm_allocate_glue_section_space (globals->bfd_of_glue_owner, ++ globals->janus_2cc_erratum_glue_size, ++ JANUS_2CC_ERRATUM_VENEER_SECTION_NAME); ++ + return TRUE; + } + +@@ -4208,16 +5032,16 @@ elf32_arm_section_map_add (asection *sec + } + } + +- +-/* Record information about a VFP11 denorm-erratum veneer. Only ARM-mode +- veneers are handled for now. */ ++/* Record information about a CPU erratum veneer. Only ARM-mode veneers are ++ handled for now. */ + + static bfd_vma +-record_vfp11_erratum_veneer (struct bfd_link_info *link_info, +- elf32_vfp11_erratum_list *branch, +- bfd *branch_bfd, +- asection *branch_sec, +- unsigned int offset) ++record_cpu_erratum_veneer (struct bfd_link_info *link_info, ++ elf32_cpu_erratum_list *branch, ++ bfd *branch_bfd, ++ asection *branch_sec, ++ unsigned int offset, ++ elf32_cpu_erratum_type erratum_type) + { + asection *s; + struct elf32_arm_link_hash_table *hash_table; +@@ -4227,27 +5051,43 @@ record_vfp11_erratum_veneer (struct bfd_ + bfd_vma val; + struct _arm_elf_section_data *sec_data; + int errcount; +- elf32_vfp11_erratum_list *newerr; +- ++ elf32_cpu_erratum_list *newerr; ++ const char *veneer_section_name; ++ const char *veneer_entry_name; ++ ++ switch (erratum_type) ++ { ++ case VFP11_ERRATUM_ARM_VENEER: ++ veneer_section_name = VFP11_ERRATUM_VENEER_SECTION_NAME; ++ veneer_entry_name = VFP11_ERRATUM_VENEER_ENTRY_NAME; ++ break; ++ ++ case JANUS_2CC_ERRATUM_ARM_VENEER: ++ veneer_section_name = JANUS_2CC_ERRATUM_VENEER_SECTION_NAME; ++ veneer_entry_name = JANUS_2CC_ERRATUM_VENEER_ENTRY_NAME; ++ break; ++ ++ default: ++ abort (); ++ } ++ + hash_table = elf32_arm_hash_table (link_info); + + BFD_ASSERT (hash_table != NULL); + BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL); + + s = bfd_get_section_by_name +- (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME); ++ (hash_table->bfd_of_glue_owner, veneer_section_name); + + sec_data = elf32_arm_section_data (s); + + BFD_ASSERT (s != NULL); + +- tmp_name = bfd_malloc ((bfd_size_type) strlen +- (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10); ++ tmp_name = bfd_malloc (MAX_ERRATUM_SYMBOL_LENGTH); + + BFD_ASSERT (tmp_name); + +- sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME, +- hash_table->num_vfp11_fixes); ++ sprintf (tmp_name, veneer_entry_name, hash_table->num_errata_fixes, ""); + + myh = elf_link_hash_lookup + (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE); +@@ -4255,7 +5095,21 @@ record_vfp11_erratum_veneer (struct bfd_ + BFD_ASSERT (myh == NULL); + + bh = NULL; +- val = hash_table->vfp11_erratum_glue_size; ++ ++ switch (erratum_type) ++ { ++ case VFP11_ERRATUM_ARM_VENEER: ++ val = hash_table->vfp11_erratum_glue_size; ++ break; ++ ++ case JANUS_2CC_ERRATUM_ARM_VENEER: ++ val = hash_table->janus_2cc_erratum_glue_size; ++ break; ++ ++ default: ++ abort (); ++ } ++ + _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner, + tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val, + NULL, TRUE, FALSE, &bh); +@@ -4266,20 +5120,19 @@ record_vfp11_erratum_veneer (struct bfd_ + + /* Link veneer back to calling location. */ + errcount = ++(sec_data->erratumcount); +- newerr = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list)); ++ newerr = bfd_zmalloc (sizeof (elf32_cpu_erratum_list)); + +- newerr->type = VFP11_ERRATUM_ARM_VENEER; ++ newerr->type = erratum_type; + newerr->vma = -1; + newerr->u.v.branch = branch; +- newerr->u.v.id = hash_table->num_vfp11_fixes; ++ newerr->u.v.id = hash_table->num_errata_fixes; + branch->u.b.veneer = newerr; + + newerr->next = sec_data->erratumlist; + sec_data->erratumlist = newerr; + + /* A symbol for the return from the veneer. */ +- sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r", +- hash_table->num_vfp11_fixes); ++ sprintf (tmp_name, veneer_entry_name, hash_table->num_errata_fixes, "_r"); + + myh = elf_link_hash_lookup + (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE); +@@ -4300,7 +5153,10 @@ record_vfp11_erratum_veneer (struct bfd_ + + /* Generate a mapping symbol for the veneer section, and explicitly add an + entry for that symbol to the code/data map for the section. */ +- if (hash_table->vfp11_erratum_glue_size == 0) ++ if ((erratum_type == VFP11_ERRATUM_ARM_VENEER ++ && hash_table->vfp11_erratum_glue_size == 0) ++ || (erratum_type == JANUS_2CC_ERRATUM_ARM_VENEER ++ && hash_table->janus_2cc_erratum_glue_size == 0)) + { + bh = NULL; + /* FIXME: Creates an ARM symbol. Thumb mode will need attention if it +@@ -4321,19 +5177,31 @@ record_vfp11_erratum_veneer (struct bfd_ + elf32_arm_section_map_add (s, 'a', 0); + } + +- s->size += VFP11_ERRATUM_VENEER_SIZE; +- hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE; +- hash_table->num_vfp11_fixes++; ++ switch (erratum_type) ++ { ++ case VFP11_ERRATUM_ARM_VENEER: ++ s->size += VFP11_ERRATUM_VENEER_SIZE; ++ hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE; ++ break; ++ ++ case JANUS_2CC_ERRATUM_ARM_VENEER: ++ s->size += JANUS_2CC_ERRATUM_VENEER_SIZE; ++ hash_table->janus_2cc_erratum_glue_size += JANUS_2CC_ERRATUM_VENEER_SIZE; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ hash_table->num_errata_fixes++; + + /* The offset of the veneer. */ + return val; + } + +-/* Note: we do not include the flag SEC_LINKER_CREATED, as that +- would prevent elf_link_input_bfd() from processing the contents +- of the section. */ + #define ARM_GLUE_SECTION_FLAGS \ +- (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY) ++ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE \ ++ | SEC_READONLY | SEC_LINKER_CREATED) + + /* Create a fake section for use by the ARM backend of the linker. */ + +@@ -4372,10 +5240,6 @@ bfd_elf32_arm_add_glue_sections_to_bfd ( + if (info->relocatable) + return TRUE; + +- /* Linker stubs don't need glue. */ +- if (!strcmp (abfd->filename, "linker stubs")) +- return TRUE; +- + return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME) + && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME) + && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME) +@@ -4648,6 +5512,47 @@ bfd_elf32_arm_init_maps (bfd *abfd) + } + + ++/* Check we're not doing applying the (invasive) Janus 2CC erratum fix ++ unnecessarily. */ ++ ++void ++bfd_elf32_arm_validate_janus_2cc_fix (bfd *obfd, ++ struct bfd_link_info *link_info) ++{ ++ struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info); ++ obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd); ++ ++ /* Janus 2CC is archv4t. We should never need the fix on higher architecture ++ versions, so emit an error in that case. */ ++ if (globals->fix_janus_2cc ++ && out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V5T) ++ (*_bfd_error_handler) (_("%B: error: Janus 2CC erratum workaround cannot " ++ "be used with selected target architecture"), obfd); ++} ++ ++ ++/* Auto-select enabling of Cortex-A8 erratum fix if the user didn't explicitly ++ say what they wanted. */ ++ ++void ++bfd_elf32_arm_set_cortex_a8_fix (bfd *obfd ATTRIBUTE_UNUSED, ++ struct bfd_link_info *link_info) ++{ ++ struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info); ++ obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd); ++ ++ if (globals->fix_cortex_a8 == -1) ++ { ++ /* Turn on Cortex-A8 erratum workaround for ARMv7-A. */ ++ if (out_attr[Tag_CPU_arch].i == TAG_CPU_ARCH_V7 ++ && (out_attr[Tag_CPU_arch_profile].i == 'A' ++ || out_attr[Tag_CPU_arch_profile].i == 0)) ++ globals->fix_cortex_a8 = 1; ++ else ++ globals->fix_cortex_a8 = 0; ++ } ++} ++ + void + bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info) + { +@@ -4671,10 +5576,10 @@ bfd_elf32_arm_set_vfp11_fix (bfd *obfd, + } + } + else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT) +- /* For earlier architectures, we might need the workaround, but do not +- enable it by default. If users is running with broken hardware, they +- must enable the erratum fix explicitly. */ +- globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE; ++ /* For earlier architectures, we might need the workaround. The compiler ++ only generates scalar code at present, so this should be sufficient in ++ most cases. */ ++ globals->vfp11_fix = BFD_ARM_VFP11_FIX_SCALAR; + } + + +@@ -5112,13 +6017,13 @@ bfd_elf32_arm_vfp11_erratum_scan (bfd *a + + if (state == 3) + { +- elf32_vfp11_erratum_list *newerr +- = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list)); ++ elf32_cpu_erratum_list *newerr ++ = bfd_zmalloc (sizeof (elf32_cpu_erratum_list)); + int errcount; + + errcount = ++(elf32_arm_section_data (sec)->erratumcount); + +- newerr->u.b.vfp_insn = veneer_of_insn; ++ newerr->u.b.orig_insn = veneer_of_insn; + + switch (span_type) + { +@@ -5130,8 +6035,9 @@ bfd_elf32_arm_vfp11_erratum_scan (bfd *a + abort (); + } + +- record_vfp11_erratum_veneer (link_info, newerr, abfd, sec, +- first_fmac); ++ record_cpu_erratum_veneer (link_info, newerr, abfd, sec, ++ first_fmac, ++ VFP11_ERRATUM_ARM_VENEER); + + newerr->vma = -1; + +@@ -5165,8 +6071,8 @@ error_return: + after sections have been laid out, using specially-named symbols. */ + + void +-bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd, +- struct bfd_link_info *link_info) ++bfd_elf32_arm_fix_veneer_locations (bfd *abfd, ++ struct bfd_link_info *link_info) + { + asection *sec; + struct elf32_arm_link_hash_table *globals; +@@ -5181,13 +6087,12 @@ bfd_elf32_arm_vfp11_fix_veneer_locations + + globals = elf32_arm_hash_table (link_info); + +- tmp_name = bfd_malloc ((bfd_size_type) strlen +- (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10); ++ tmp_name = bfd_malloc (MAX_ERRATUM_SYMBOL_LENGTH); + + for (sec = abfd->sections; sec != NULL; sec = sec->next) + { + struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec); +- elf32_vfp11_erratum_list *errnode = sec_data->erratumlist; ++ elf32_cpu_erratum_list *errnode = sec_data->erratumlist; + + for (; errnode != NULL; errnode = errnode->next) + { +@@ -5200,7 +6105,7 @@ bfd_elf32_arm_vfp11_fix_veneer_locations + case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER: + /* Find veneer symbol. */ + sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME, +- errnode->u.b.veneer->u.v.id); ++ errnode->u.b.veneer->u.v.id, ""); + + myh = elf_link_hash_lookup + (&(globals)->root, tmp_name, FALSE, FALSE, TRUE); +@@ -5216,11 +6121,30 @@ bfd_elf32_arm_vfp11_fix_veneer_locations + errnode->u.b.veneer->vma = vma; + break; + ++ case JANUS_2CC_ERRATUM_BRANCH_TO_ARM_VENEER: ++ /* Find veneer symbol. */ ++ sprintf (tmp_name, JANUS_2CC_ERRATUM_VENEER_ENTRY_NAME, ++ errnode->u.b.veneer->u.v.id, ""); ++ ++ myh = elf_link_hash_lookup ++ (&(globals)->root, tmp_name, FALSE, FALSE, TRUE); ++ ++ if (myh == NULL) ++ (*_bfd_error_handler) (_("%B: unable to find Janus 2CC veneer " ++ "`%s'"), abfd, tmp_name); ++ ++ vma = myh->root.u.def.section->output_section->vma ++ + myh->root.u.def.section->output_offset ++ + myh->root.u.def.value; ++ ++ errnode->u.b.veneer->vma = vma; ++ break; ++ + case VFP11_ERRATUM_ARM_VENEER: + case VFP11_ERRATUM_THUMB_VENEER: + /* Find return location. */ +- sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r", +- errnode->u.v.id); ++ sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME, ++ errnode->u.v.id, "_r"); + + myh = elf_link_hash_lookup + (&(globals)->root, tmp_name, FALSE, FALSE, TRUE); +@@ -5236,6 +6160,25 @@ bfd_elf32_arm_vfp11_fix_veneer_locations + errnode->u.v.branch->vma = vma; + break; + ++ case JANUS_2CC_ERRATUM_ARM_VENEER: ++ /* Find return location. */ ++ sprintf (tmp_name, JANUS_2CC_ERRATUM_VENEER_ENTRY_NAME, ++ errnode->u.v.id, "_r"); ++ ++ myh = elf_link_hash_lookup ++ (&(globals)->root, tmp_name, FALSE, FALSE, TRUE); ++ ++ if (myh == NULL) ++ (*_bfd_error_handler) (_("%B: unable to find Janus 2CC veneer " ++ "`%s'"), abfd, tmp_name); ++ ++ vma = myh->root.u.def.section->output_section->vma ++ + myh->root.u.def.section->output_offset ++ + myh->root.u.def.value; ++ ++ errnode->u.v.branch->vma = vma; ++ break; ++ + default: + abort (); + } +@@ -5246,6 +6189,183 @@ bfd_elf32_arm_vfp11_fix_veneer_locations + } + + ++/* Look for instruction sequences which can trigger the Janus 2CC shifter ++ erratum. Any instruction which uses a register-specified shift, which is ++ not followed by a NOP instruction, is susceptible. ++ ++ NOTE: This function is only meant to work for architecture v4t, as ++ implemented by Janus 2CC (see bfd_elf32_arm_validate_janus_2cc_fix). ++ Instruction encodings for later architectures (e.g. ARM blx, Thumb-2) will ++ not be handled correctly. */ ++ ++bfd_boolean ++bfd_elf32_arm_janus_2cc_erratum_scan (bfd *abfd, ++ struct bfd_link_info *link_info) ++{ ++ asection *sec; ++ bfd_byte *contents = NULL; ++ struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info); ++ ++ /* Don't do anything if Janus 2CC fix is not enabled. */ ++ if (!globals->fix_janus_2cc) ++ return TRUE; ++ ++ /* If we are only performing a partial link do not bother ++ to construct any glue. */ ++ if (link_info->relocatable) ++ return TRUE; ++ ++ /* Skip if this bfd does not correspond to an ELF image. */ ++ if (! is_arm_elf (abfd)) ++ return TRUE; ++ ++ /* Skip this BFD if it corresponds to an executable or dynamic object. */ ++ if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) ++ return TRUE; ++ ++ for (sec = abfd->sections; sec != NULL; sec = sec->next) ++ { ++ unsigned int i, next_i, span, veneer_of_insn = 0; ++ struct _arm_elf_section_data *sec_data; ++ ++ /* If we don't have executable progbits, we're not interested in this ++ section. Also skip if section is to be excluded. */ ++ if (elf_section_type (sec) != SHT_PROGBITS ++ || (elf_section_flags (sec) & SHF_EXECINSTR) == 0 ++ || (sec->flags & SEC_EXCLUDE) != 0 ++ || sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS ++ || sec->output_section == bfd_abs_section_ptr ++ || strcmp (sec->name, JANUS_2CC_ERRATUM_VENEER_SECTION_NAME) == 0) ++ continue; ++ ++ sec_data = elf32_arm_section_data (sec); ++ ++ if (sec_data->mapcount == 0) ++ continue; ++ ++ if (elf_section_data (sec)->this_hdr.contents != NULL) ++ contents = elf_section_data (sec)->this_hdr.contents; ++ else if (! bfd_malloc_and_get_section (abfd, sec, &contents)) ++ goto error_return; ++ ++ qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map), ++ elf32_arm_compare_mapping); ++ ++ for (span = 0; span < sec_data->mapcount; span++) ++ { ++ unsigned int span_start = sec_data->map[span].vma; ++ unsigned int span_end = (span == sec_data->mapcount - 1) ++ ? sec->size : sec_data->map[span + 1].vma; ++ char span_type = sec_data->map[span].type; ++ int state = 0; ++ ++ switch (span_type) ++ { ++ case 'a': ++ for (i = span_start; i < span_end;) ++ { ++ unsigned int insn = bfd_get_32 (abfd, contents + i); ++ ++ next_i = i + 4; ++ ++ switch (state) ++ { ++ case 0: ++ /* Data processing insn with register shift. */ ++ if (((insn & 0x0e000090) == 0x00000010) ++ && ((insn & 0x0ff000f0) != 0x01200010)) /* bx. */ ++ { ++ veneer_of_insn = insn; ++ state = 1; ++ } ++ break; ++ ++ case 1: ++ /* Not a NOP (only accept mov r0, r0). */ ++ if ((insn & 0x0fffffff) != 0x01a00000) ++ { ++ elf32_cpu_erratum_list *newerr; ++ int errcount; ++ ++ /* Lose if Rd, Rn or Rm is PC. Don't bother ++ checking Rs. */ ++ if ((veneer_of_insn & 0x000f0000) == 0x000f0000 ++ || (veneer_of_insn & 0x0000f000) == 0x0000f000 ++ || (veneer_of_insn & 0x0000000f) == 0x0000000f) ++ (*_bfd_error_handler) (_("%B(%A+0x%lx): error: ARM " ++ "instruction sequence using PC triggers " ++ "Janus 2CC erratum (must be fixed manually)"), ++ abfd, sec, i); ++ ++ newerr ++ = bfd_zmalloc (sizeof (elf32_cpu_erratum_list)); ++ ++ errcount ++ = ++(elf32_arm_section_data (sec)->erratumcount); ++ ++ newerr->u.b.orig_insn = veneer_of_insn; ++ newerr->type = JANUS_2CC_ERRATUM_BRANCH_TO_ARM_VENEER; ++ ++ record_cpu_erratum_veneer (link_info, newerr, abfd, ++ sec, i - 4, JANUS_2CC_ERRATUM_ARM_VENEER); ++ ++ newerr->vma = -1; ++ ++ newerr->next = sec_data->erratumlist; ++ sec_data->erratumlist = newerr; ++ /* Re-scan current instruction in case of adjacent ++ trigger insns. */ ++ next_i = i; ++ } ++ state = 0; ++ break; ++ } ++ ++ i = next_i; ++ } ++ break; ++ ++ case 't': ++ for (i = span_start; i < span_end; i += 2) ++ { ++ unsigned short insn = bfd_get_16 (abfd, contents + i); ++ ++ switch (state) ++ { ++ case 0: ++ if (((insn & 0xffc0) == 0x4100) /* ASR. */ ++ || ((insn & 0xffc0) == 0x4080) /* LSL. */ ++ || ((insn & 0xffc0) == 0x40c0) /* LSR. */ ++ || ((insn & 0xffc0) == 0x41c0)) /* ROR. */ ++ state = 1; ++ break; ++ ++ case 1: ++ /* Not a NOP (only accept cpy r8, r8). */ ++ if (insn != 0x46c0) ++ (*_bfd_error_handler) (_("%B(%A+0x%lx): error: Thumb " ++ "instruction sequence triggers Janus 2CC erratum " ++ "(must be fixed manually)"), ++ abfd, sec, i); ++ state = 0; ++ break; ++ } ++ } ++ break; ++ ++ default: ++ ; ++ } ++ } ++ } ++ ++ return TRUE; ++ ++error_return: ++ return FALSE; ++} ++ ++ + /* Set target relocation values needed during linking. */ + + void +@@ -5257,7 +6377,8 @@ bfd_elf32_arm_set_target_relocs (struct + int use_blx, + bfd_arm_vfp11_fix vfp11_fix, + int no_enum_warn, int no_wchar_warn, +- int pic_veneer) ++ int pic_veneer, int fix_janus_2cc, ++ int fix_cortex_a8) + { + struct elf32_arm_link_hash_table *globals; + +@@ -5279,6 +6400,8 @@ bfd_elf32_arm_set_target_relocs (struct + globals->use_blx |= use_blx; + globals->vfp11_fix = vfp11_fix; + globals->pic_veneer = pic_veneer; ++ globals->fix_janus_2cc = fix_janus_2cc; ++ globals->fix_cortex_a8 = fix_cortex_a8; + + BFD_ASSERT (is_arm_elf (output_bfd)); + elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn; +@@ -7933,72 +9056,378 @@ elf32_arm_relocate_section (bfd * + ELF_ST_TYPE (sym->st_info)), h, + &unresolved_reloc, &error_message); + +- /* Dynamic relocs are not propagated for SEC_DEBUGGING sections +- because such sections are not SEC_ALLOC and thus ld.so will +- not process them. */ +- if (unresolved_reloc +- && !((input_section->flags & SEC_DEBUGGING) != 0 +- && h->def_dynamic)) ++ /* Dynamic relocs are not propagated for SEC_DEBUGGING sections ++ because such sections are not SEC_ALLOC and thus ld.so will ++ not process them. */ ++ if (unresolved_reloc ++ && !((input_section->flags & SEC_DEBUGGING) != 0 ++ && h->def_dynamic)) ++ { ++ (*_bfd_error_handler) ++ (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), ++ input_bfd, ++ input_section, ++ (long) rel->r_offset, ++ howto->name, ++ h->root.root.string); ++ return FALSE; ++ } ++ ++ if (r != bfd_reloc_ok) ++ { ++ switch (r) ++ { ++ case bfd_reloc_overflow: ++ /* If the overflowing reloc was to an undefined symbol, ++ we have already printed one error message and there ++ is no point complaining again. */ ++ if ((! h || ++ h->root.type != bfd_link_hash_undefined) ++ && (!((*info->callbacks->reloc_overflow) ++ (info, (h ? &h->root : NULL), name, howto->name, ++ (bfd_vma) 0, input_bfd, input_section, ++ rel->r_offset)))) ++ return FALSE; ++ break; ++ ++ case bfd_reloc_undefined: ++ if (!((*info->callbacks->undefined_symbol) ++ (info, name, input_bfd, input_section, ++ rel->r_offset, TRUE))) ++ return FALSE; ++ break; ++ ++ case bfd_reloc_outofrange: ++ error_message = _("out of range"); ++ goto common_error; ++ ++ case bfd_reloc_notsupported: ++ error_message = _("unsupported relocation"); ++ goto common_error; ++ ++ case bfd_reloc_dangerous: ++ /* error_message should already be set. */ ++ goto common_error; ++ ++ default: ++ error_message = _("unknown error"); ++ /* Fall through. */ ++ ++ common_error: ++ BFD_ASSERT (error_message != NULL); ++ if (!((*info->callbacks->reloc_dangerous) ++ (info, error_message, input_bfd, input_section, ++ rel->r_offset))) ++ return FALSE; ++ break; ++ } ++ } ++ } ++ ++ return TRUE; ++} ++ ++/* Add a new unwind edit to the list described by HEAD, TAIL. If INDEX is zero, ++ adds the edit to the start of the list. (The list must be built in order of ++ ascending INDEX: the function's callers are primarily responsible for ++ maintaining that condition). */ ++ ++static void ++add_unwind_table_edit (arm_unwind_table_edit **head, ++ arm_unwind_table_edit **tail, ++ arm_unwind_edit_type type, ++ asection *linked_section, ++ unsigned int index) ++{ ++ arm_unwind_table_edit *new_edit = xmalloc (sizeof (arm_unwind_table_edit)); ++ ++ new_edit->type = type; ++ new_edit->linked_section = linked_section; ++ new_edit->index = index; ++ ++ if (index > 0) ++ { ++ new_edit->next = NULL; ++ ++ if (*tail) ++ (*tail)->next = new_edit; ++ ++ (*tail) = new_edit; ++ ++ if (!*head) ++ (*head) = new_edit; ++ } ++ else ++ { ++ new_edit->next = *head; ++ ++ if (!*tail) ++ *tail = new_edit; ++ ++ *head = new_edit; ++ } ++} ++ ++static _arm_elf_section_data *get_arm_elf_section_data (asection *); ++ ++/* Increase the size of EXIDX_SEC by ADJUST bytes. ADJUST mau be negative. */ ++static void ++adjust_exidx_size(asection *exidx_sec, int adjust) ++{ ++ asection *out_sec; ++ ++ if (!exidx_sec->rawsize) ++ exidx_sec->rawsize = exidx_sec->size; ++ ++ bfd_set_section_size (exidx_sec->owner, exidx_sec, exidx_sec->size + adjust); ++ out_sec = exidx_sec->output_section; ++ /* Adjust size of output section. */ ++ bfd_set_section_size (out_sec->owner, out_sec, out_sec->size +adjust); ++} ++ ++/* Insert an EXIDX_CANTUNWIND marker at the end of a section. */ ++static void ++insert_cantunwind_after(asection *text_sec, asection *exidx_sec) ++{ ++ struct _arm_elf_section_data *exidx_arm_data; ++ ++ exidx_arm_data = get_arm_elf_section_data (exidx_sec); ++ add_unwind_table_edit ( ++ &exidx_arm_data->u.exidx.unwind_edit_list, ++ &exidx_arm_data->u.exidx.unwind_edit_tail, ++ INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX); ++ ++ adjust_exidx_size(exidx_sec, 8); ++} ++ ++/* Scan .ARM.exidx tables, and create a list describing edits which should be ++ made to those tables, such that: ++ ++ 1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries. ++ 2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind ++ codes which have been inlined into the index). ++ ++ The edits are applied when the tables are written ++ (in elf32_arm_write_section). ++*/ ++ ++bfd_boolean ++elf32_arm_fix_exidx_coverage (asection **text_section_order, ++ unsigned int num_text_sections, ++ struct bfd_link_info *info) ++{ ++ bfd *inp; ++ unsigned int last_second_word = 0, i; ++ asection *last_exidx_sec = NULL; ++ asection *last_text_sec = NULL; ++ int last_unwind_type = -1; ++ ++ /* Walk over all EXIDX sections, and create backlinks from the corrsponding ++ text sections. */ ++ for (inp = info->input_bfds; inp != NULL; inp = inp->link_next) ++ { ++ asection *sec; ++ ++ for (sec = inp->sections; sec != NULL; sec = sec->next) ++ { ++ struct bfd_elf_section_data *elf_sec = elf_section_data (sec); ++ Elf_Internal_Shdr *hdr = &elf_sec->this_hdr; ++ ++ if (hdr->sh_type != SHT_ARM_EXIDX) ++ continue; ++ ++ if (elf_sec->linked_to) ++ { ++ Elf_Internal_Shdr *linked_hdr ++ = &elf_section_data (elf_sec->linked_to)->this_hdr; ++ struct _arm_elf_section_data *linked_sec_arm_data ++ = get_arm_elf_section_data (linked_hdr->bfd_section); ++ ++ if (linked_sec_arm_data == NULL) ++ continue; ++ ++ /* Link this .ARM.exidx section back from the text section it ++ describes. */ ++ linked_sec_arm_data->u.text.arm_exidx_sec = sec; ++ } ++ } ++ } ++ ++ /* Walk all text sections in order of increasing VMA. Eilminate duplicate ++ index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes), ++ and add EXIDX_CANTUNWIND entries for sections with no unwind table data. ++ */ ++ ++ for (i = 0; i < num_text_sections; i++) ++ { ++ asection *sec = text_section_order[i]; ++ asection *exidx_sec; ++ struct _arm_elf_section_data *arm_data = get_arm_elf_section_data (sec); ++ struct _arm_elf_section_data *exidx_arm_data; ++ bfd_byte *contents = NULL; ++ int deleted_exidx_bytes = 0; ++ bfd_vma j; ++ arm_unwind_table_edit *unwind_edit_head = NULL; ++ arm_unwind_table_edit *unwind_edit_tail = NULL; ++ Elf_Internal_Shdr *hdr; ++ bfd *ibfd; ++ ++ if (arm_data == NULL) ++ continue; ++ ++ exidx_sec = arm_data->u.text.arm_exidx_sec; ++ if (exidx_sec == NULL) + { +- (*_bfd_error_handler) +- (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), +- input_bfd, +- input_section, +- (long) rel->r_offset, +- howto->name, +- h->root.root.string); +- return FALSE; ++ /* Section has no unwind data. */ ++ if (last_unwind_type == 0 || !last_exidx_sec) ++ continue; ++ ++ /* Ignore zero sized sections. */ ++ if (sec->size == 0) ++ continue; ++ ++ insert_cantunwind_after(last_text_sec, last_exidx_sec); ++ last_unwind_type = 0; ++ continue; + } + +- if (r != bfd_reloc_ok) ++ if (bfd_is_abs_section (exidx_sec->output_section)) ++ /* The linker script probably has /DISCARD/ for this section. */ ++ continue; ++ ++ hdr = &elf_section_data (exidx_sec)->this_hdr; ++ if (hdr->sh_type != SHT_ARM_EXIDX) ++ continue; ++ ++ exidx_arm_data = get_arm_elf_section_data (exidx_sec); ++ if (exidx_arm_data == NULL) ++ continue; ++ ++ ibfd = exidx_sec->owner; ++ ++ if (hdr->contents != NULL) ++ contents = hdr->contents; ++ else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents)) ++ /* An error? */ ++ continue; ++ ++ for (j = 0; j < hdr->sh_size; j += 8) + { +- switch (r) ++ unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4); ++ int unwind_type; ++ int elide = 0; ++ ++ /* An EXIDX_CANTUNWIND entry. */ ++ if (second_word == 1) + { +- case bfd_reloc_overflow: +- /* If the overflowing reloc was to an undefined symbol, +- we have already printed one error message and there +- is no point complaining again. */ +- if ((! h || +- h->root.type != bfd_link_hash_undefined) +- && (!((*info->callbacks->reloc_overflow) +- (info, (h ? &h->root : NULL), name, howto->name, +- (bfd_vma) 0, input_bfd, input_section, +- rel->r_offset)))) +- return FALSE; +- break; ++ if (last_unwind_type == 0) ++ elide = 1; ++ unwind_type = 0; ++ } ++ /* Inlined unwinding data. Merge if equal to previous. */ ++ else if ((second_word & 0x80000000) != 0) ++ { ++ if (last_second_word == second_word && last_unwind_type == 1) ++ elide = 1; ++ unwind_type = 1; ++ last_second_word = second_word; ++ } ++ /* Normal table entry. In theory we could merge these too, ++ but duplicate entries are likely to be much less common. */ ++ else ++ unwind_type = 2; + +- case bfd_reloc_undefined: +- if (!((*info->callbacks->undefined_symbol) +- (info, name, input_bfd, input_section, +- rel->r_offset, TRUE))) +- return FALSE; +- break; ++ if (elide) ++ { ++ add_unwind_table_edit (&unwind_edit_head, &unwind_edit_tail, ++ DELETE_EXIDX_ENTRY, NULL, j / 8); + +- case bfd_reloc_outofrange: +- error_message = _("out of range"); +- goto common_error; ++ deleted_exidx_bytes += 8; ++ } + +- case bfd_reloc_notsupported: +- error_message = _("unsupported relocation"); +- goto common_error; ++ last_unwind_type = unwind_type; ++ } + +- case bfd_reloc_dangerous: +- /* error_message should already be set. */ +- goto common_error; ++ /* Free contents if we allocated it ourselves. */ ++ if (contents != hdr->contents) ++ free (contents); + +- default: +- error_message = _("unknown error"); +- /* Fall through. */ ++ /* Record edits to be applied later (in elf32_arm_write_section). */ ++ exidx_arm_data->u.exidx.unwind_edit_list = unwind_edit_head; ++ exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail; ++ ++ if (deleted_exidx_bytes > 0) ++ adjust_exidx_size(exidx_sec, -deleted_exidx_bytes); ++ ++ last_exidx_sec = exidx_sec; ++ last_text_sec = sec; ++ } + +- common_error: +- BFD_ASSERT (error_message != NULL); +- if (!((*info->callbacks->reloc_dangerous) +- (info, error_message, input_bfd, input_section, +- rel->r_offset))) +- return FALSE; +- break; +- } +- } ++ /* Add terminating CANTUNWIND entry. */ ++ if (last_exidx_sec && last_unwind_type != 0) ++ insert_cantunwind_after(last_text_sec, last_exidx_sec); ++ ++ return TRUE; ++} ++ ++static bfd_boolean ++elf32_arm_output_glue_section (struct bfd_link_info *info, bfd *obfd, ++ bfd *ibfd, const char *name) ++{ ++ asection *sec, *osec; ++ ++ sec = bfd_get_section_by_name (ibfd, name); ++ if (sec == NULL || (sec->flags & SEC_EXCLUDE) != 0) ++ return TRUE; ++ ++ osec = sec->output_section; ++ if (elf32_arm_write_section (obfd, info, sec, sec->contents)) ++ return TRUE; ++ ++ if (! bfd_set_section_contents (obfd, osec, sec->contents, ++ sec->output_offset, sec->size)) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++static bfd_boolean ++elf32_arm_final_link (bfd *abfd, struct bfd_link_info *info) ++{ ++ struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info); ++ ++ /* Invoke the regular ELF backend linker to do all the work. */ ++ if (!bfd_elf_final_link (abfd, info)) ++ return FALSE; ++ ++ /* Write out any glue sections now that we have created all the ++ stubs. */ ++ if (globals->bfd_of_glue_owner != NULL) ++ { ++ if (! elf32_arm_output_glue_section (info, abfd, ++ globals->bfd_of_glue_owner, ++ ARM2THUMB_GLUE_SECTION_NAME)) ++ return FALSE; ++ ++ if (! elf32_arm_output_glue_section (info, abfd, ++ globals->bfd_of_glue_owner, ++ THUMB2ARM_GLUE_SECTION_NAME)) ++ return FALSE; ++ ++ if (! elf32_arm_output_glue_section (info, abfd, ++ globals->bfd_of_glue_owner, ++ VFP11_ERRATUM_VENEER_SECTION_NAME)) ++ return FALSE; ++ ++ if (! elf32_arm_output_glue_section (info, abfd, ++ globals->bfd_of_glue_owner, ++ JANUS_2CC_ERRATUM_VENEER_SECTION_NAME)) ++ return FALSE; ++ ++ if (! elf32_arm_output_glue_section (info, abfd, ++ globals->bfd_of_glue_owner, ++ ARM_BX_GLUE_SECTION_NAME)) ++ return FALSE; + } + + return TRUE; +@@ -8329,7 +9758,7 @@ tag_cpu_arch_combine (bfd *ibfd, int old + + if (oldtag >= MAX_TAG_CPU_ARCH || newtag >= MAX_TAG_CPU_ARCH) + { +- _bfd_error_handler (_("ERROR: %B: Unknown CPU architecture"), ibfd); ++ _bfd_error_handler (_("error: %B: Unknown CPU architecture"), ibfd); + return -1; + } + +@@ -8367,7 +9796,7 @@ tag_cpu_arch_combine (bfd *ibfd, int old + + if (result == -1) + { +- _bfd_error_handler (_("ERROR: %B: Conflicting CPU architectures %d/%d"), ++ _bfd_error_handler (_("error: %B: Conflicting CPU architectures %d/%d"), + ibfd, oldtag, newtag); + return -1; + } +@@ -8395,6 +9824,12 @@ elf32_arm_merge_eabi_attributes (bfd *ib + int i; + bfd_boolean result = TRUE; + ++ /* Skip the linker stubs file. This preserves previous behavior ++ of accepting unknown attributes in the first input file - but ++ is that a bug? */ ++ if (ibfd->flags & BFD_LINKER_CREATED) ++ return TRUE; ++ + if (!elf_known_obj_attributes_proc (obfd)[0].i) + { + /* This is the first object. Copy the attributes. */ +@@ -8418,7 +9853,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + else if (in_attr[Tag_ABI_FP_number_model].i != 0) + { + _bfd_error_handler +- (_("ERROR: %B uses VFP register arguments, %B does not"), ++ (_("error: %B uses VFP register arguments, %B does not"), + ibfd, obfd); + result = FALSE; + } +@@ -8534,7 +9969,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + binaries in the toolchain have had the attributes set + properly. + _bfd_error_handler +- (_("ERROR: %B: 8-byte data alignment conflicts with %B"), ++ (_("error: %B: 8-byte data alignment conflicts with %B"), + obfd, ibfd); + result = FALSE; */ + } +@@ -8568,7 +10003,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + else + { + _bfd_error_handler +- (_("ERROR: %B: Conflicting architecture profiles %c/%c"), ++ (_("error: %B: Conflicting architecture profiles %c/%c"), + ibfd, + in_attr[i].i ? in_attr[i].i : '0', + out_attr[i].i ? out_attr[i].i : '0'); +@@ -8601,7 +10036,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + && in_attr[i].i != AEABI_R9_unused) + { + _bfd_error_handler +- (_("ERROR: %B: Conflicting use of R9"), ibfd); ++ (_("error: %B: Conflicting use of R9"), ibfd); + result = FALSE; + } + if (out_attr[i].i == AEABI_R9_unused) +@@ -8613,7 +10048,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused) + { + _bfd_error_handler +- (_("ERROR: %B: SB relative addressing conflicts with use of R9"), ++ (_("error: %B: SB relative addressing conflicts with use of R9"), + ibfd); + result = FALSE; + } +@@ -8669,7 +10104,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + if (in_attr[i].i != out_attr[i].i) + { + _bfd_error_handler +- (_("ERROR: %B uses iWMMXt register arguments, %B does not"), ++ (_("error: %B uses iWMMXt register arguments, %B does not"), + ibfd, obfd); + result = FALSE; + } +@@ -8691,7 +10126,7 @@ elf32_arm_merge_eabi_attributes (bfd *ib + if (in_attr[i].i != out_attr[i].i) + { + _bfd_error_handler +- (_("ERROR: fp16 format mismatch between %B and %B"), ++ (_("error: fp16 format mismatch between %B and %B"), + ibfd, obfd); + result = FALSE; + } +@@ -8895,7 +10330,7 @@ elf32_arm_merge_private_bfd_data (bfd * + && !(ibfd->flags & DYNAMIC) + && (in_flags & EF_ARM_BE8)) + { +- _bfd_error_handler (_("ERROR: %B is already in final BE8 format"), ++ _bfd_error_handler (_("error: %B is already in final BE8 format"), + ibfd); + return FALSE; + } +@@ -8971,7 +10406,7 @@ elf32_arm_merge_private_bfd_data (bfd * + EF_ARM_EABI_VERSION (out_flags))) + { + _bfd_error_handler +- (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"), ++ (_("error: Source object %B has EABI version %d, but target %B has EABI version %d"), + ibfd, obfd, + (in_flags & EF_ARM_EABIMASK) >> 24, + (out_flags & EF_ARM_EABIMASK) >> 24); +@@ -8987,7 +10422,7 @@ elf32_arm_merge_private_bfd_data (bfd * + if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26)) + { + _bfd_error_handler +- (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"), ++ (_("error: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"), + ibfd, obfd, + in_flags & EF_ARM_APCS_26 ? 26 : 32, + out_flags & EF_ARM_APCS_26 ? 26 : 32); +@@ -8998,11 +10433,11 @@ elf32_arm_merge_private_bfd_data (bfd * + { + if (in_flags & EF_ARM_APCS_FLOAT) + _bfd_error_handler +- (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"), ++ (_("error: %B passes floats in float registers, whereas %B passes them in integer registers"), + ibfd, obfd); + else + _bfd_error_handler +- (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"), ++ (_("error: %B passes floats in integer registers, whereas %B passes them in float registers"), + ibfd, obfd); + + flags_compatible = FALSE; +@@ -9012,11 +10447,11 @@ elf32_arm_merge_private_bfd_data (bfd * + { + if (in_flags & EF_ARM_VFP_FLOAT) + _bfd_error_handler +- (_("ERROR: %B uses VFP instructions, whereas %B does not"), ++ (_("error: %B uses VFP instructions, whereas %B does not"), + ibfd, obfd); + else + _bfd_error_handler +- (_("ERROR: %B uses FPA instructions, whereas %B does not"), ++ (_("error: %B uses FPA instructions, whereas %B does not"), + ibfd, obfd); + + flags_compatible = FALSE; +@@ -9026,11 +10461,11 @@ elf32_arm_merge_private_bfd_data (bfd * + { + if (in_flags & EF_ARM_MAVERICK_FLOAT) + _bfd_error_handler +- (_("ERROR: %B uses Maverick instructions, whereas %B does not"), ++ (_("error: %B uses Maverick instructions, whereas %B does not"), + ibfd, obfd); + else + _bfd_error_handler +- (_("ERROR: %B does not use Maverick instructions, whereas %B does"), ++ (_("error: %B does not use Maverick instructions, whereas %B does"), + ibfd, obfd); + + flags_compatible = FALSE; +@@ -9049,11 +10484,11 @@ elf32_arm_merge_private_bfd_data (bfd * + { + if (in_flags & EF_ARM_SOFT_FLOAT) + _bfd_error_handler +- (_("ERROR: %B uses software FP, whereas %B uses hardware FP"), ++ (_("error: %B uses software FP, whereas %B uses hardware FP"), + ibfd, obfd); + else + _bfd_error_handler +- (_("ERROR: %B uses hardware FP, whereas %B uses software FP"), ++ (_("error: %B uses hardware FP, whereas %B uses software FP"), + ibfd, obfd); + + flags_compatible = FALSE; +@@ -9644,12 +11079,12 @@ elf32_arm_check_relocs (bfd *abfd, struc + return FALSE; + + /* BPABI objects never have dynamic relocations mapped. */ +- if (! htab->symbian_p) ++ if (htab->symbian_p) + { + flagword flags; + + flags = bfd_get_section_flags (dynobj, sreloc); +- flags |= (SEC_LOAD | SEC_ALLOC); ++ flags &= ~(SEC_LOAD | SEC_ALLOC); + bfd_set_section_flags (dynobj, sreloc, flags); + } + } +@@ -10541,12 +11976,16 @@ elf32_arm_size_dynamic_sections (bfd * o + bfd_elf32_arm_init_maps (ibfd); + + if (!bfd_elf32_arm_process_before_allocation (ibfd, info) +- || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info)) ++ || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info) ++ || !bfd_elf32_arm_janus_2cc_erratum_scan (ibfd, info)) + /* xgettext:c-format */ + _bfd_error_handler (_("Errors encountered processing file %s"), + ibfd->filename); + } + ++ /* Allocate space for the glue sections now that we've sized them. */ ++ bfd_elf32_arm_allocate_interworking_sections (info); ++ + /* The check_relocs and adjust_dynamic_symbol entry points have + determined the sizes of the various dynamic sections. Allocate + memory for them. */ +@@ -11634,6 +13073,11 @@ arm_map_one_stub (struct bfd_hash_entry + bfd_vma addr; + char *stub_name; + output_arch_syminfo *osi; ++ const insn_sequence *template; ++ enum stub_insn_type prev_type; ++ int size; ++ int i; ++ enum map_symbol_type sym_type; + + /* Massage our args to the form they really have. */ + stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; +@@ -11652,58 +13096,74 @@ arm_map_one_stub (struct bfd_hash_entry + addr = (bfd_vma) stub_entry->stub_offset; + stub_name = stub_entry->output_name; + +- switch (stub_entry->stub_type) ++ template = stub_entry->stub_template; ++ switch (template[0].type) + { +- case arm_stub_long_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 8)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4)) +- return FALSE; +- break; +- case arm_thumb_v4t_stub_long_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8)) +- return FALSE; +- break; +- case arm_thumb_thumb_stub_long_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 16)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12)) +- return FALSE; +- break; +- case arm_thumb_arm_v4t_stub_long_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 20)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 8)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16)) ++ case ARM_TYPE: ++ if (!elf32_arm_output_stub_sym (osi, stub_name, addr, stub_entry->stub_size)) + return FALSE; + break; +- case arm_thumb_arm_v4t_stub_short_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 8)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 4)) +- return FALSE; +- break; +- case arm_stub_pic_long_branch: +- if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr)) +- return FALSE; +- if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8)) ++ case THUMB16_TYPE: ++ case THUMB32_TYPE: ++ if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, ++ stub_entry->stub_size)) + return FALSE; + break; + default: + BFD_FAIL (); ++ return FALSE; ++ } ++ ++ prev_type = DATA_TYPE; ++ size = 0; ++ for (i = 0; i < stub_entry->stub_template_size; i++) ++ { ++ switch (template[i].type) ++ { ++ case ARM_TYPE: ++ sym_type = ARM_MAP_ARM; ++ break; ++ ++ case THUMB16_TYPE: ++ case THUMB32_TYPE: ++ sym_type = ARM_MAP_THUMB; ++ break; ++ ++ case DATA_TYPE: ++ sym_type = ARM_MAP_DATA; ++ break; ++ ++ default: ++ BFD_FAIL (); ++ return FALSE; ++ } ++ ++ if (template[i].type != prev_type) ++ { ++ prev_type = template[i].type; ++ if (!elf32_arm_output_map_sym (osi, sym_type, addr + size)) ++ return FALSE; ++ } ++ ++ switch (template[i].type) ++ { ++ case ARM_TYPE: ++ case THUMB32_TYPE: ++ size += 4; ++ break; ++ ++ case THUMB16_TYPE: ++ size += 2; ++ break; ++ ++ case DATA_TYPE: ++ size += 4; ++ break; ++ ++ default: ++ BFD_FAIL (); ++ return FALSE; ++ } + } + + return TRUE; +@@ -11885,6 +13345,150 @@ elf32_arm_compare_mapping (const void * + return 0; + } + ++/* Add OFFSET to lower 31 bits of ADDR, leaving other bits unmodified. */ ++ ++static unsigned long ++offset_prel31 (unsigned long addr, bfd_vma offset) ++{ ++ return (addr & ~0x7ffffffful) | ((addr + offset) & 0x7ffffffful); ++} ++ ++/* Copy an .ARM.exidx table entry, adding OFFSET to (applied) PREL31 ++ relocations. */ ++ ++static void ++copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from, bfd_vma offset) ++{ ++ unsigned long first_word = bfd_get_32 (output_bfd, from); ++ unsigned long second_word = bfd_get_32 (output_bfd, from + 4); ++ ++ /* High bit of first word is supposed to be zero. */ ++ if ((first_word & 0x80000000ul) == 0) ++ first_word = offset_prel31 (first_word, offset); ++ ++ /* If the high bit of the first word is clear, and the bit pattern is not 0x1 ++ (EXIDX_CANTUNWIND), this is an offset to an .ARM.extab entry. */ ++ if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0)) ++ second_word = offset_prel31 (second_word, offset); ++ ++ bfd_put_32 (output_bfd, first_word, to); ++ bfd_put_32 (output_bfd, second_word, to + 4); ++} ++ ++/* Data for make_branch_to_a8_stub(). */ ++ ++struct a8_branch_to_stub_data { ++ asection *writing_section; ++ bfd_byte *contents; ++}; ++ ++ ++/* Helper to insert branches to Cortex-A8 erratum stubs in the right ++ places for a particular section. */ ++ ++static bfd_boolean ++make_branch_to_a8_stub (struct bfd_hash_entry *gen_entry, ++ void *in_arg) ++{ ++ struct elf32_arm_stub_hash_entry *stub_entry; ++ struct a8_branch_to_stub_data *data; ++ bfd_byte *contents; ++ unsigned long branch_insn; ++ bfd_vma veneered_insn_loc, veneer_entry_loc; ++ bfd_signed_vma branch_offset; ++ bfd *abfd; ++ unsigned int index; ++ ++ stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; ++ data = (struct a8_branch_to_stub_data *) in_arg; ++ ++ if (stub_entry->target_section != data->writing_section ++ || stub_entry->stub_type < arm_stub_a8_veneer_b_cond) ++ return TRUE; ++ ++ contents = data->contents; ++ ++ veneered_insn_loc = stub_entry->target_section->output_section->vma ++ + stub_entry->target_section->output_offset ++ + stub_entry->target_value; ++ ++ veneer_entry_loc = stub_entry->stub_sec->output_section->vma ++ + stub_entry->stub_sec->output_offset ++ + stub_entry->stub_offset; ++ ++ if (stub_entry->stub_type == arm_stub_a8_veneer_blx) ++ veneered_insn_loc &= ~3u; ++ ++ branch_offset = veneer_entry_loc - veneered_insn_loc - 4; ++ ++ abfd = stub_entry->target_section->owner; ++ index = stub_entry->target_value; ++ ++ /* We attempt to avoid this condition by setting stubs_always_after_branch ++ in elf32_arm_size_stubs if we've enabled the Cortex-A8 erratum workaround. ++ This check is just to be on the safe side... */ ++ if ((veneered_insn_loc & ~0xfff) == (veneer_entry_loc & ~0xfff)) ++ { ++ (*_bfd_error_handler) (_("%B: error: Cortex-A8 erratum stub is " ++ "allocated in unsafe location"), abfd); ++ return FALSE; ++ } ++ ++ switch (stub_entry->stub_type) ++ { ++ case arm_stub_a8_veneer_b: ++ case arm_stub_a8_veneer_b_cond: ++ branch_insn = 0xf0009000; ++ goto jump24; ++ ++ case arm_stub_a8_veneer_blx: ++ branch_insn = 0xf000e800; ++ goto jump24; ++ ++ case arm_stub_a8_veneer_bl: ++ { ++ unsigned int i1, j1, i2, j2, s; ++ ++ branch_insn = 0xf000d000; ++ ++ jump24: ++ if (branch_offset < -16777216 || branch_offset > 16777214) ++ { ++ /* There's not much we can do apart from complain if this ++ happens. */ ++ (*_bfd_error_handler) (_("%B: error: Cortex-A8 erratum stub out " ++ "of range (input file too large)"), abfd); ++ return FALSE; ++ } ++ ++ /* i1 = not(j1 eor s), so: ++ not i1 = j1 eor s ++ j1 = (not i1) eor s. */ ++ ++ branch_insn |= (branch_offset >> 1) & 0x7ff; ++ branch_insn |= ((branch_offset >> 12) & 0x3ff) << 16; ++ i2 = (branch_offset >> 22) & 1; ++ i1 = (branch_offset >> 23) & 1; ++ s = (branch_offset >> 24) & 1; ++ j1 = (!i1) ^ s; ++ j2 = (!i2) ^ s; ++ branch_insn |= j2 << 11; ++ branch_insn |= j1 << 13; ++ branch_insn |= s << 26; ++ } ++ break; ++ ++ default: ++ BFD_FAIL (); ++ return FALSE; ++ } ++ ++ bfd_put_16 (abfd, (branch_insn >> 16) & 0xffff, &contents[index]); ++ bfd_put_16 (abfd, branch_insn & 0xffff, &contents[index + 2]); ++ ++ return TRUE; ++} ++ + + /* Do code byteswapping. Return FALSE afterwards so that the section is + written out as normal. */ +@@ -11895,16 +13499,16 @@ elf32_arm_write_section (bfd *output_bfd + asection *sec, + bfd_byte *contents) + { +- int mapcount, errcount; ++ unsigned int mapcount, errcount; + _arm_elf_section_data *arm_data; + struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info); + elf32_arm_section_map *map; +- elf32_vfp11_erratum_list *errnode; ++ elf32_cpu_erratum_list *errnode; + bfd_vma ptr; + bfd_vma end; + bfd_vma offset = sec->output_section->vma + sec->output_offset; + bfd_byte tmp; +- int i; ++ unsigned int i; + + /* If this section has not been allocated an _arm_elf_section_data + structure then we cannot record anything. */ +@@ -11928,11 +13532,12 @@ elf32_arm_write_section (bfd *output_bfd + switch (errnode->type) + { + case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER: ++ case JANUS_2CC_ERRATUM_BRANCH_TO_ARM_VENEER: + { + bfd_vma branch_to_veneer; + /* Original condition code of instruction, plus bit mask for + ARM B instruction. */ +- unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000) ++ unsigned int insn = (errnode->u.b.orig_insn & 0xf0000000) + | 0x0a000000; + + /* The instruction is before the label. */ +@@ -11970,7 +13575,7 @@ elf32_arm_write_section (bfd *output_bfd + "range"), output_bfd); + + /* Original instruction. */ +- insn = errnode->u.v.branch->u.b.vfp_insn; ++ insn = errnode->u.v.branch->u.b.orig_insn; + contents[endianflip ^ index] = insn & 0xff; + contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff; + contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff; +@@ -11985,12 +13590,136 @@ elf32_arm_write_section (bfd *output_bfd + } + break; + ++ case JANUS_2CC_ERRATUM_ARM_VENEER: ++ { ++ bfd_vma branch_from_veneer; ++ unsigned int insn; ++ ++ branch_from_veneer = errnode->u.v.branch->vma - errnode->vma ++ - 16; ++ ++ if ((signed) branch_from_veneer < -(1 << 25) ++ || (signed) branch_from_veneer >= (1 << 25)) ++ (*_bfd_error_handler) (_("%B: error: Janus 2CC veneer out of " ++ "range"), output_bfd); ++ ++ bfd_put_32 (output_bfd, errnode->u.v.branch->u.b.orig_insn, ++ contents + index); ++ ++ /* nop, mov r0, r0. */ ++ bfd_put_32 (output_bfd, 0xe1a00000, contents + index + 4); ++ ++ insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff); ++ bfd_put_32 (output_bfd, insn, contents + index + 8); ++ } ++ break; ++ + default: + abort (); + } + } + } + ++ if (arm_data->elf.this_hdr.sh_type == SHT_ARM_EXIDX) ++ { ++ arm_unwind_table_edit *edit_node ++ = arm_data->u.exidx.unwind_edit_list; ++ /* Now, sec->size is the size of the section we will write. The original ++ size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND ++ markers) was sec->rawsize. (This isn't the case if we perform no ++ edits, then rawsize will be zero and we should use size). */ ++ bfd_byte *edited_contents = bfd_malloc (sec->size); ++ unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size; ++ unsigned int in_index, out_index; ++ bfd_vma add_to_offsets = 0; ++ ++ for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;) ++ { ++ if (edit_node) ++ { ++ unsigned int edit_index = edit_node->index; ++ ++ if (in_index < edit_index && in_index * 8 < input_size) ++ { ++ copy_exidx_entry (output_bfd, edited_contents + out_index * 8, ++ contents + in_index * 8, add_to_offsets); ++ out_index++; ++ in_index++; ++ } ++ else if (in_index == edit_index ++ || (in_index * 8 >= input_size ++ && edit_index == UINT_MAX)) ++ { ++ switch (edit_node->type) ++ { ++ case DELETE_EXIDX_ENTRY: ++ in_index++; ++ add_to_offsets += 8; ++ break; ++ ++ case INSERT_EXIDX_CANTUNWIND_AT_END: ++ { ++ asection *text_sec = edit_node->linked_section; ++ bfd_vma text_offset = text_sec->output_section->vma ++ + text_sec->output_offset ++ + text_sec->size; ++ bfd_vma exidx_offset = offset + out_index * 8; ++ unsigned long prel31_offset; ++ ++ /* Note: this is meant to be equivalent to an ++ R_ARM_PREL31 relocation. These synthetic ++ EXIDX_CANTUNWIND markers are not relocated by the ++ usual BFD method. */ ++ prel31_offset = (text_offset - exidx_offset) ++ & 0x7ffffffful; ++ ++ /* First address we can't unwind. */ ++ bfd_put_32 (output_bfd, prel31_offset, ++ &edited_contents[out_index * 8]); ++ ++ /* Code for EXIDX_CANTUNWIND. */ ++ bfd_put_32 (output_bfd, 0x1, ++ &edited_contents[out_index * 8 + 4]); ++ ++ out_index++; ++ add_to_offsets -= 8; ++ } ++ break; ++ } ++ ++ edit_node = edit_node->next; ++ } ++ } ++ else ++ { ++ /* No more edits, copy remaining entries verbatim. */ ++ copy_exidx_entry (output_bfd, edited_contents + out_index * 8, ++ contents + in_index * 8, add_to_offsets); ++ out_index++; ++ in_index++; ++ } ++ } ++ ++ if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD)) ++ bfd_set_section_contents (output_bfd, sec->output_section, ++ edited_contents, ++ (file_ptr) sec->output_offset, sec->size); ++ ++ return TRUE; ++ } ++ ++ /* Fix code to point to Cortex-A8 erratum stubs. */ ++ if (globals->fix_cortex_a8) ++ { ++ struct a8_branch_to_stub_data data; ++ ++ data.writing_section = sec; ++ data.contents = contents; ++ ++ bfd_hash_traverse (&globals->stub_hash_table, make_branch_to_a8_stub, ++ &data); ++ } ++ + if (mapcount == 0) + return FALSE; + +@@ -12267,6 +13996,7 @@ const struct elf_size_info elf32_arm_siz + #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol + #define bfd_elf32_close_and_cleanup elf32_arm_close_and_cleanup + #define bfd_elf32_bfd_free_cached_info elf32_arm_bfd_free_cached_info ++#define bfd_elf32_bfd_final_link elf32_arm_final_link + + #define elf_backend_get_symbol_type elf32_arm_get_symbol_type + #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook +--- a/bfd/elf32-mips.c ++++ b/bfd/elf32-mips.c +@@ -1662,6 +1662,15 @@ static const struct ecoff_debug_swap mip + #define elf_backend_plt_readonly 1 + #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val + ++/* Most MIPS ELF files do not contain a traditional PLT; only VxWorks ++ and non-PIC dynamic executables do. These settings only affect ++ _bfd_elf_create_dynamic_sections, which is only called when we ++ do want a traditional PLT. */ ++#undef elf_backend_want_plt_sym ++#define elf_backend_want_plt_sym 1 ++#undef elf_backend_plt_readonly ++#define elf_backend_plt_readonly 1 ++ + #define elf_backend_discard_info _bfd_mips_elf_discard_info + #define elf_backend_ignore_discarded_relocs \ + _bfd_mips_elf_ignore_discarded_relocs +@@ -1686,6 +1695,8 @@ static const struct ecoff_debug_swap mip + #define bfd_elf32_bfd_print_private_bfd_data \ + _bfd_mips_elf_print_private_bfd_data + ++#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val ++ + /* Support for SGI-ish mips targets. */ + #define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec + #define TARGET_LITTLE_NAME "elf32-littlemips" +@@ -1789,6 +1800,7 @@ mips_vxworks_final_write_processing (bfd + #undef elf_backend_additional_program_headers + #undef elf_backend_modify_segment_map + #undef elf_backend_symbol_processing ++#undef elf_backend_plt_sym_val + /* NOTE: elf_backend_rela_normal is not defined for MIPS. */ + + #include "elf32-target.h" +--- a/bfd/elflink.c ++++ b/bfd/elflink.c +@@ -12502,3 +12502,15 @@ _bfd_elf_make_dynamic_reloc_section (ase + + return reloc_sec; + } ++ ++/* Copy the ELF symbol type associated with a linker hash entry. */ ++void ++_bfd_elf_copy_link_hash_symbol_type (bfd *abfd ATTRIBUTE_UNUSED, ++ struct bfd_link_hash_entry * hdest, ++ struct bfd_link_hash_entry * hsrc) ++{ ++ struct elf_link_hash_entry *ehdest = (struct elf_link_hash_entry *)hdest; ++ struct elf_link_hash_entry *ehsrc = (struct elf_link_hash_entry *)hsrc; ++ ++ ehdest->type = ehsrc->type; ++} +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -677,6 +677,11 @@ static bfd *reldyn_sorting_bfd; + /* Nonzero if ABFD is using NewABI conventions. */ + #define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd)) + ++/* Nonzero if ABFD is a non-PIC object. */ ++#define NON_PIC_P(abfd) \ ++ (((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) == 0) \ ++ && ((elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC) == EF_MIPS_CPIC)) ++ + /* The IRIX compatibility level we are striving for. */ + #define IRIX_COMPAT(abfd) \ + (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd)) +@@ -689,6 +694,9 @@ static bfd *reldyn_sorting_bfd; + #define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \ + (NEWABI_P (abfd) ? ".MIPS.options" : ".options") + ++/* The name of the section holding non-PIC to PIC call stubs. */ ++#define NON_PIC_TO_PIC_STUB_SECTION_NAME ".MIPS.pic_stubs" ++ + /* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section. + Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */ + #define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \ +@@ -6256,11 +6264,6 @@ _bfd_mips_elf_section_processing (bfd *a + hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; + hdr->sh_type = SHT_PROGBITS; + } +- else if (strcmp (name, ".sbss") == 0) +- { +- hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; +- hdr->sh_type = SHT_NOBITS; +- } + else if (strcmp (name, ".srdata") == 0) + { + hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL; +@@ -7587,7 +7590,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + + /* We need a stub, not a plt entry for the undefined + function. But we record it as if it needs plt. See +- _bfd_elf_adjust_dynamic_symbol. */ ++ _bfd_elf_adjust_dynamic_symbol. Note that these relocations ++ are always used for PIC calls, even when using the new ++ non-PIC ABI. */ + h->needs_plt = 1; + h->type = STT_FUNC; + } +@@ -7693,6 +7698,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + case R_MIPS_32: + case R_MIPS_REL32: + case R_MIPS_64: ++ if (h != NULL) ++ h->non_got_ref = TRUE; + /* In VxWorks executables, references to external symbols + are handled using copy relocs or PLT stubs, so there's + no need to add a .rela.dyn entry for this relocation. */ +@@ -7748,11 +7755,21 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + case R_MIPS_GPREL16: + case R_MIPS_LITERAL: + case R_MIPS_GPREL32: ++ if (h != NULL ++ && (r_type == R_MIPS_GPREL16 || r_type == R_MIPS_GPREL32)) ++ h->non_got_ref = TRUE; ++ + if (SGI_COMPAT (abfd)) + mips_elf_hash_table (info)->compact_rel_size += + sizeof (Elf32_External_crinfo); + break; + ++ case R_MIPS_HI16: ++ case R_MIPS_LO16: ++ if (h != NULL && strcmp (h->root.root.string, "_gp_disp") != 0) ++ h->non_got_ref = TRUE; ++ break; ++ + /* This relocation describes the C++ object vtable hierarchy. + Reconstruct it for later use during GC. */ + case R_MIPS_GNU_VTINHERIT: +@@ -7775,20 +7792,20 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + + /* We must not create a stub for a symbol that has relocations + related to taking the function's address. This doesn't apply to +- VxWorks, where CALL relocs refer to a .got.plt entry instead of +- a normal .got entry. */ ++ VxWorks or the non-PIC ABI, where CALL relocs refer to a ++ .got.plt entry instead of a normal .got entry. */ + if (!htab->is_vxworks && h != NULL) + switch (r_type) + { +- default: +- ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; +- break; + case R_MIPS16_CALL16: + case R_MIPS_CALL16: + case R_MIPS_CALL_HI16: + case R_MIPS_CALL_LO16: + case R_MIPS_JALR: + break; ++ default: ++ ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; ++ break; + } + + /* See if this reloc would need to refer to a MIPS16 hard-float stub, +@@ -12471,7 +12488,9 @@ _bfd_mips_elf_merge_private_bfd_data (bf + break; + } + } +- if (null_input_bfd) ++ /* Dynamic objects normally have no sections, and do not reach ++ here - but they might if used as DYNOBJ. */ ++ if (null_input_bfd || (ibfd->flags & DYNAMIC) != 0) + return TRUE; + + ok = TRUE; +--- a/bfd/elfxx-mips.h ++++ b/bfd/elfxx-mips.h +@@ -63,6 +63,9 @@ extern bfd_boolean _bfd_mips_elf_finish_ + extern bfd_boolean _bfd_mips_vxworks_finish_dynamic_symbol + (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, + Elf_Internal_Sym *); ++extern bfd_boolean _bfd_mips_nonpic_finish_dynamic_symbol ++ (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, ++ Elf_Internal_Sym *); + extern bfd_boolean _bfd_mips_elf_finish_dynamic_sections + (bfd *, struct bfd_link_info *); + extern void _bfd_mips_elf_final_write_processing +@@ -153,6 +156,15 @@ extern const struct bfd_elf_special_sect + + extern bfd_boolean _bfd_mips_elf_common_definition (Elf_Internal_Sym *); + ++extern bfd_vma _bfd_mips_elf_plt_sym_val ++ (bfd_vma, const asection *, const arelent *); ++extern void _bfd_mips_elf_begin_write_processing ++ (bfd *abfd, struct bfd_link_info *link_info); ++extern bfd_boolean bfd_mips_elf_maybe_create_non_pic_to_pic_stubs_section ++ (struct bfd_link_info *); ++extern void _bfd_mips_post_process_headers ++ (bfd *abfd, struct bfd_link_info *link_info); ++ + #define elf_backend_common_definition _bfd_mips_elf_common_definition + #define elf_backend_name_local_section_symbols \ + _bfd_mips_elf_name_local_section_symbols +--- a/bfd/elfxx-target.h ++++ b/bfd/elfxx-target.h +@@ -256,6 +256,11 @@ + #define bfd_elfNN_bfd_link_just_syms _bfd_elf_link_just_syms + #endif + ++#ifndef bfd_elfNN_bfd_copy_link_hash_symbol_type ++#define bfd_elfNN_bfd_copy_link_hash_symbol_type \ ++ _bfd_elf_copy_link_hash_symbol_type ++#endif ++ + #ifndef bfd_elfNN_bfd_link_split_section + #define bfd_elfNN_bfd_link_split_section _bfd_generic_link_split_section + #endif +--- a/bfd/i386msdos.c ++++ b/bfd/i386msdos.c +@@ -152,6 +152,8 @@ msdos_set_section_contents (bfd *abfd, + #define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define msdos_bfd_link_just_syms _bfd_generic_link_just_syms ++#define msdos_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define msdos_bfd_final_link _bfd_generic_final_link + #define msdos_bfd_link_split_section _bfd_generic_link_split_section + #define msdos_set_arch_mach _bfd_generic_set_arch_mach +--- a/bfd/i386os9k.c ++++ b/bfd/i386os9k.c +@@ -176,6 +176,8 @@ os9k_sizeof_headers (bfd *abfd ATTRIBUTE + #define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define os9k_bfd_link_just_syms _bfd_generic_link_just_syms ++#define os9k_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define os9k_bfd_final_link _bfd_generic_final_link + #define os9k_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/ieee.c ++++ b/bfd/ieee.c +@@ -3774,6 +3774,8 @@ ieee_sizeof_headers (bfd *abfd ATTRIBUTE + #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms ++#define ieee_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define ieee_bfd_final_link _bfd_generic_final_link + #define ieee_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/ihex.c ++++ b/bfd/ihex.c +@@ -770,6 +770,14 @@ ihex_write_object_contents (bfd *abfd) + bfd_size_type count; + + where = l->where; ++ ++ /* If the top 32 bits of a 64-bit address are simply a sign-extension ++ of the bottom 32 bits, then simply truncate the address to 32 bits. */ ++ if (sizeof (bfd_vma) * 8 > 32 ++ && ((where & ~(bfd_vma)0x7fffffff) == 0 ++ || (where & ~(bfd_vma)0x7fffffff) == ~(bfd_vma)0x7fffffff)) ++ where &= (bfd_vma)0xffffffffUL; ++ + p = l->data; + count = l->size; + +@@ -937,6 +945,8 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE + #define ihex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define ihex_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define ihex_bfd_link_just_syms _bfd_generic_link_just_syms ++#define ihex_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define ihex_bfd_final_link _bfd_generic_final_link + #define ihex_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/libbfd-in.h ++++ b/bfd/libbfd-in.h +@@ -410,6 +410,9 @@ extern bfd_boolean _bfd_generic_set_sect + ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) + #define _bfd_nolink_bfd_link_just_syms \ + ((void (*) (asection *, struct bfd_link_info *)) bfd_void) ++#define _bfd_nolink_bfd_copy_link_hash_symbol_type \ ++ ((void (*) (bfd *, struct bfd_link_hash_entry *, \ ++ struct bfd_link_hash_entry *)) bfd_void) + #define _bfd_nolink_bfd_final_link \ + ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) + #define _bfd_nolink_bfd_link_split_section \ +@@ -521,6 +524,10 @@ extern bfd_boolean _bfd_generic_link_add + extern void _bfd_generic_link_just_syms + (asection *, struct bfd_link_info *); + ++/* Generic routine that does nothing. */ ++extern void _bfd_generic_copy_link_hash_symbol_type ++ (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); ++ + /* Generic link routine. */ + extern bfd_boolean _bfd_generic_final_link + (bfd *, struct bfd_link_info *); +--- a/bfd/libbfd.h ++++ b/bfd/libbfd.h +@@ -415,6 +415,9 @@ extern bfd_boolean _bfd_generic_set_sect + ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) + #define _bfd_nolink_bfd_link_just_syms \ + ((void (*) (asection *, struct bfd_link_info *)) bfd_void) ++#define _bfd_nolink_bfd_copy_link_hash_symbol_type \ ++ ((void (*) (bfd *, struct bfd_link_hash_entry *, \ ++ struct bfd_link_hash_entry *)) bfd_void) + #define _bfd_nolink_bfd_final_link \ + ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) bfd_false) + #define _bfd_nolink_bfd_link_split_section \ +@@ -526,6 +529,10 @@ extern bfd_boolean _bfd_generic_link_add + extern void _bfd_generic_link_just_syms + (asection *, struct bfd_link_info *); + ++/* Generic routine that does nothing. */ ++extern void _bfd_generic_copy_link_hash_symbol_type ++ (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); ++ + /* Generic link routine. */ + extern bfd_boolean _bfd_generic_final_link + (bfd *, struct bfd_link_info *); +--- a/bfd/libecoff.h ++++ b/bfd/libecoff.h +@@ -310,6 +310,8 @@ extern struct bfd_link_hash_table *_bfd_ + extern bfd_boolean _bfd_ecoff_bfd_link_add_symbols + (bfd *, struct bfd_link_info *); + #define _bfd_ecoff_bfd_link_just_syms _bfd_generic_link_just_syms ++#define _bfd_ecoff_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + extern bfd_boolean _bfd_ecoff_bfd_final_link + (bfd *, struct bfd_link_info *); + +--- a/bfd/linker.c ++++ b/bfd/linker.c +@@ -795,6 +795,17 @@ _bfd_generic_link_just_syms (asection *s + sec->output_offset = sec->vma; + } + ++/* Copy the type of a symbol assiciated with a linker hast table entry. ++ Override this so that symbols created in linker scripts get their ++ type from the RHS of the assignment. ++ The default implementation does nothing. */ ++void ++_bfd_generic_copy_link_hash_symbol_type (bfd *abfd ATTRIBUTE_UNUSED, ++ struct bfd_link_hash_entry * hdest ATTRIBUTE_UNUSED, ++ struct bfd_link_hash_entry * hsrc ATTRIBUTE_UNUSED) ++{ ++} ++ + /* Add symbols from an object file to the global hash table. */ + + static bfd_boolean +--- a/bfd/mach-o.c ++++ b/bfd/mach-o.c +@@ -60,6 +60,8 @@ + #define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms ++#define bfd_mach_o_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define bfd_mach_o_bfd_final_link _bfd_generic_final_link + #define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section + #define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach +--- a/bfd/mmo.c ++++ b/bfd/mmo.c +@@ -3199,6 +3199,8 @@ mmo_write_object_contents (bfd *abfd) + #define mmo_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define mmo_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define mmo_bfd_link_just_syms _bfd_generic_link_just_syms ++#define mmo_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define mmo_bfd_final_link _bfd_generic_final_link + #define mmo_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/nlm-target.h ++++ b/bfd/nlm-target.h +@@ -53,6 +53,8 @@ + #define nlm_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define nlm_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define nlm_bfd_link_just_syms _bfd_generic_link_just_syms ++#define nlm_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define nlm_bfd_final_link _bfd_generic_final_link + #define nlm_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/oasys.c ++++ b/bfd/oasys.c +@@ -1202,6 +1202,8 @@ oasys_sizeof_headers (bfd *abfd ATTRIBUT + #define oasys_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define oasys_bfd_link_just_syms _bfd_generic_link_just_syms ++#define oasys_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define oasys_bfd_final_link _bfd_generic_final_link + #define oasys_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/pef.c ++++ b/bfd/pef.c +@@ -56,6 +56,8 @@ + #define bfd_pef_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define bfd_pef_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define bfd_pef_bfd_link_just_syms _bfd_generic_link_just_syms ++#define bfd_pef_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define bfd_pef_bfd_final_link _bfd_generic_final_link + #define bfd_pef_bfd_link_split_section _bfd_generic_link_split_section + #define bfd_pef_get_section_contents_in_window _bfd_generic_get_section_contents_in_window +--- a/bfd/ppcboot.c ++++ b/bfd/ppcboot.c +@@ -479,6 +479,8 @@ ppcboot_bfd_print_private_bfd_data (abfd + #define ppcboot_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define ppcboot_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define ppcboot_bfd_link_just_syms _bfd_generic_link_just_syms ++#define ppcboot_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define ppcboot_bfd_final_link _bfd_generic_final_link + #define ppcboot_bfd_link_split_section _bfd_generic_link_split_section + #define ppcboot_get_section_contents_in_window \ +--- a/bfd/simple.c ++++ b/bfd/simple.c +@@ -210,7 +210,8 @@ bfd_simple_get_relocated_section_content + data = NULL; + if (outbuf == NULL) + { +- data = bfd_malloc (sec->size); ++ bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size; ++ data = bfd_malloc (amt); + if (data == NULL) + return NULL; + outbuf = data; +--- a/bfd/som.c ++++ b/bfd/som.c +@@ -6366,6 +6366,8 @@ som_bfd_link_split_section (bfd *abfd AT + #define som_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define som_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define som_bfd_link_just_syms _bfd_generic_link_just_syms ++#define som_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define som_bfd_final_link _bfd_generic_final_link + #define som_bfd_gc_sections bfd_generic_gc_sections + #define som_bfd_merge_sections bfd_generic_merge_sections +--- a/bfd/srec.c ++++ b/bfd/srec.c +@@ -1259,6 +1259,8 @@ srec_print_symbol (bfd *abfd, + #define srec_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define srec_bfd_link_just_syms _bfd_generic_link_just_syms ++#define srec_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define srec_bfd_final_link _bfd_generic_final_link + #define srec_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/targets.c ++++ b/bfd/targets.c +@@ -435,6 +435,7 @@ BFD_JUMP_TABLE macros. + . NAME##_bfd_link_hash_table_free, \ + . NAME##_bfd_link_add_symbols, \ + . NAME##_bfd_link_just_syms, \ ++. NAME##_bfd_copy_link_hash_symbol_type, \ + . NAME##_bfd_final_link, \ + . NAME##_bfd_link_split_section, \ + . NAME##_bfd_gc_sections, \ +@@ -465,6 +466,12 @@ BFD_JUMP_TABLE macros. + . {* Indicate that we are only retrieving symbol values from this section. *} + . void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); + . ++. {* Copy the symbol type of a linker hash table entry. *} ++.#define bfd_copy_link_hash_symbol_type(b, t, f) \ ++. BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) ++. void (*_bfd_copy_link_hash_symbol_type) ++. (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); ++. + . {* Do a link based on the link_order structures attached to each + . section of the BFD. *} + . bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); +--- a/bfd/tekhex.c ++++ b/bfd/tekhex.c +@@ -947,6 +947,8 @@ tekhex_print_symbol (bfd *abfd, + #define tekhex_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define tekhex_bfd_link_just_syms _bfd_generic_link_just_syms ++#define tekhex_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define tekhex_bfd_final_link _bfd_generic_final_link + #define tekhex_bfd_link_split_section _bfd_generic_link_split_section + #define tekhex_get_section_contents_in_window _bfd_generic_get_section_contents_in_window +--- a/bfd/versados.c ++++ b/bfd/versados.c +@@ -812,6 +812,8 @@ versados_canonicalize_reloc (bfd *abfd, + #define versados_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define versados_bfd_link_just_syms _bfd_generic_link_just_syms ++#define versados_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define versados_bfd_final_link _bfd_generic_final_link + #define versados_bfd_link_split_section _bfd_generic_link_split_section + +--- a/bfd/vms.c ++++ b/bfd/vms.c +@@ -30,6 +30,8 @@ + #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false) + #define vms_make_empty_symbol _bfd_generic_make_empty_symbol + #define vms_bfd_link_just_syms _bfd_generic_link_just_syms ++#define vms_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define vms_bfd_is_group_section bfd_generic_is_group_section + #define vms_bfd_discard_group bfd_generic_discard_group + #define vms_section_already_linked _bfd_generic_section_already_linked +--- a/bfd/xsym.c ++++ b/bfd/xsym.c +@@ -49,6 +49,8 @@ + #define bfd_sym_bfd_link_hash_table_free _bfd_generic_link_hash_table_free + #define bfd_sym_bfd_link_add_symbols _bfd_generic_link_add_symbols + #define bfd_sym_bfd_link_just_syms _bfd_generic_link_just_syms ++#define bfd_sym_bfd_copy_link_hash_symbol_type \ ++ _bfd_generic_copy_link_hash_symbol_type + #define bfd_sym_bfd_final_link _bfd_generic_final_link + #define bfd_sym_bfd_link_split_section _bfd_generic_link_split_section + #define bfd_sym_get_section_contents_in_window _bfd_generic_get_section_contents_in_window +--- a/binutils/objcopy.c ++++ b/binutils/objcopy.c +@@ -2218,6 +2218,26 @@ setup_bfd_headers (bfd *ibfd, bfd *obfd) + return; + } + ++/* Sign extend VMA if ABFD tells us that addresses are sign ++ extended. */ ++ ++static bfd_vma ++maybe_sign_extend_vma (bfd *abfd, bfd_vma vma) ++{ ++ if (bfd_get_sign_extend_vma (abfd) == 1 ++ && bfd_arch_bits_per_address (abfd) < 8 * sizeof (bfd_vma)) ++ { ++ unsigned int bits = bfd_arch_bits_per_address (abfd); ++ bfd_vma sign_bit = ((bfd_vma) 1) << (bits - 1); ++ bfd_vma upper_bits = (~(bfd_vma) 0) << bits; ++ if ((vma & sign_bit) != 0) ++ vma |= upper_bits; ++ else ++ vma &= ~upper_bits; ++ } ++ return vma; ++} ++ + /* Create a section in OBFD with the same + name and attributes as ISECTION in IBFD. */ + +@@ -2314,6 +2334,7 @@ setup_section (bfd *ibfd, sec_ptr isecti + else + vma += change_section_address; + ++ vma = maybe_sign_extend_vma (ibfd, vma); + if (! bfd_set_section_vma (obfd, osection, vma)) + { + err = _("failed to set vma"); +@@ -2333,6 +2354,7 @@ setup_section (bfd *ibfd, sec_ptr isecti + else + lma += change_section_address; + ++ lma = maybe_sign_extend_vma (ibfd, lma); + osection->lma = lma; + + /* FIXME: This is probably not enough. If we change the LMA we +--- a/binutils/objdump.c ++++ b/binutils/objdump.c +@@ -1895,7 +1895,7 @@ disassemble_section (bfd *abfd, asection + bfd_boolean insns; + + addr = section->vma + addr_offset; +- addr = (addr ^ sign_adjust) - sign_adjust; ++ addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust; + + if (sym != NULL && bfd_asymbol_value (sym) <= addr) + { +@@ -1958,7 +1958,8 @@ disassemble_section (bfd *abfd, asection + else + nextstop_offset = bfd_asymbol_value (nextsym) - section->vma; + +- if (nextstop_offset > stop_offset) ++ if (nextstop_offset > stop_offset ++ || nextstop_offset <= addr_offset) + nextstop_offset = stop_offset; + + /* If a symbol is explicitly marked as being an object +--- a/binutils/readelf.c ++++ b/binutils/readelf.c +@@ -2688,6 +2688,10 @@ get_arm_section_type_name (unsigned int + return "ARM_PREEMPTMAP"; + case SHT_ARM_ATTRIBUTES: + return "ARM_ATTRIBUTES"; ++ case SHT_ARM_DEBUGOVERLAY: ++ return "ARM_DEBUGOVERLAY"; ++ case SHT_ARM_OVERLAYSECTION: ++ return "ARM_OVERLAYSECTION"; + default: + break; + } +--- a/binutils/testsuite/binutils-all/arm/thumb2-cond.s ++++ b/binutils/testsuite/binutils-all/arm/thumb2-cond.s +@@ -1,6 +1,8 @@ +-.thumb ++ .arch armv7 ++ .syntax unified ++ .thumb + foo: +-.short 0xf000, 0xf800 +-.short 0xbf38 +-.short 0xf000, 0xbf04 +-bx lr ++ bl 1f ++1: it cc ++ bcc.w .+0xe0c ++ bx lr +--- a/binutils/testsuite/binutils-all/objdump.W ++++ b/binutils/testsuite/binutils-all/objdump.W +@@ -1,5 +1,5 @@ + +-tmpdir/dw2-compressed.o: file format .* ++.*dw2-compressed.o: file format .* + + Contents of the .debug_info section: + +--- a/binutils/testsuite/binutils-all/objdump.s ++++ b/binutils/testsuite/binutils-all/objdump.s +@@ -1,5 +1,5 @@ + +-tmpdir/dw2-compressed.o: file format .* ++.*dw2-compressed.o: file format .* + + Contents of section .zdebug_abbrev: + 0000 5a4c4942 00000000 00000033 785e6314 ZLIB.......3x\^c. +--- a/config/mh-mingw ++++ b/config/mh-mingw +@@ -1,6 +1,8 @@ + # Add -D__USE_MINGW_ACCESS to enable the built compiler to work on Windows + # Vista (see PR33281 for details). +-BOOT_CFLAGS += -D__USE_MINGW_ACCESS -Wno-pedantic-ms-format +-CFLAGS += -D__USE_MINGW_ACCESS ++# Because we wrap access in libiberty/cygpath.c, we do not want to use ++# the MinGW wrappers for access. ++BOOT_CFLAGS += -Wno-pedantic-ms-format ++# CFLAGS += -D__USE_MINGW_ACCESS + # Increase stack limit to same as Linux default. + LDFLAGS += -Wl,--stack,8388608 +--- a/configure ++++ b/configure +@@ -2597,11 +2597,16 @@ case "${target}" in + noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj}" + ;; + mips*-sde-elf*) +- skipdirs="$skipdirs target-libiberty" +- noconfigdirs="$noconfigdirs ${libgcj}" +- if test x$with_newlib = xyes; then +- noconfigdirs="$noconfigdirs gprof" +- fi ++ noconfigdirs="${noconfigdirs} sid ${libgcj} target-rda" ++ if ! test x"${with_newlib}" = xyes ; then ++ # remove libgloss and libiberty too, when we're not building newlib ++ skipdirs="${skipdirs} target-libgloss target-libiberty" ++ # add sde-conv host tool ++ configdirs="${configdirs} convert" ++ fi ++ # add gprof back in - we do support it! ++ skipdirs=`echo " ${skipdirs} " | sed -e 's/ gprof / /'` ++ noconfigdirs=`echo " ${noconfigdirs} " | sed -e 's/ gprof / /'` + libgloss_dir=mips + ;; + mips*-*-irix5*) +--- a/configure.ac ++++ b/configure.ac +@@ -833,11 +833,16 @@ case "${target}" in + noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss ${libgcj}" + ;; + mips*-sde-elf*) +- skipdirs="$skipdirs target-libiberty" +- noconfigdirs="$noconfigdirs ${libgcj}" +- if test x$with_newlib = xyes; then +- noconfigdirs="$noconfigdirs gprof" ++ noconfigdirs="${noconfigdirs} sid ${libgcj} target-rda" ++ if ! test x"${with_newlib}" = xyes ; then ++ # remove libgloss and libiberty too, when we're not building newlib ++ skipdirs="${skipdirs} target-libgloss target-libiberty" ++ # add sde-conv host tool ++ configdirs="${configdirs} convert" + fi ++ # add gprof back in - we do support it! ++ skipdirs=`echo " ${skipdirs} " | sed -e 's/ gprof / /'` ++ noconfigdirs=`echo " ${noconfigdirs} " | sed -e 's/ gprof / /'` + libgloss_dir=mips + ;; + mips*-*-irix5*) +--- /dev/null ++++ b/convert/ChangeLog +@@ -0,0 +1,213 @@ ++2008-03-11 Thiemo Seufer ++ ++ * bin.c, conv.texi, convert.c, elf.h, elfio.c, elfmips.h, ++ elfout.c, idtbin.c, lsifast.c, mipsflash.c, srec.c, stagbin.c: ++ Update license to GPL v3. ++ ++2007-07-02 Maciej W. Rozycki ++ ++ * Makefile.am (AUTOMAKE_OPTIONS): Use "cygnus" rather than ++ "foreign". ++ * Makefile.in: Regenerate. ++ ++2004-10-08 Nigel Stephens ++ ++ * elfout.c (ElfEnd): Use ehdr.e_phnum to calculate offset of ++ section header, otherwise we are out by one. ++ ++2004-10-04 Nigel Stephens ++ ++ * Makefile.am: Use "cygnus" automake options, so that info file ++ gets created in build directory, not source directory. ++ ++ * Makefile.in: Rebuilt. ++ ++2004-09-09 Nigel Stephens ++ ++ * elfout.c (ElfEnd): Set paddr field in program header as well as vaddr. ++ Set number of program header entries to the actual number of ++ entries created (1 less than the number of sections. Use ++ ehdr.e_phnum and ehdr.e_shnum to select the number of program and ++ section headers to be written out. ++ ++Tue Oct 21 12:13:43 2003 Nigel Stephens ++ ++ * conv.info: Gets built in source dir. ++ ++Sat Oct 4 00:34:44 2003 Nigel Stephens ++ ++ * Makefile.am: Added conv.texi and html build rule. ++ ++ * conv.texi: New Texinfo doc file for conv only. ++ ++Tue Aug 19 13:07:43 2003 Nigel Stephens ++ ++ Changed to GPL copyright headers. ++ ++Tue Aug 5 22:18:41 2003 Nigel Stephens ++ ++ Added BSD-style copyright headers. ++ ++Wed Jul 9 03:31:06 2003 Nigel Stephens ++ ++ * mipsflash.c: New MIPS flash download format. Needs some more ++ work before prime-time. ++ ++ * convert.c: Use const char * where necessary. ++ (formats): Add description of each format to table. ++ Add mips flash download format. ++ (usage): Output format descriptions. ++ (main): Output format descriptions if we get a bas format name. ++ ++ * Makefile.am (conv_SOURCES): Added mipsflash.c ++ ++Thu Apr 24 15:09:32 2003 Nigel Stephens ++ ++ * elfout.c (ElfStart): Set ehdr.e_version to EV_CURRENT, not EV_NONE. ++ ++Wed Dec 18 16:47:42 2002 Nigel Stephens ++ ++ * acinclude.m4 (CONV_BINARY_FOPEN): Match cygwin* not cygwin32*. ++ ++ * configure: Rebuilt. ++ * config.h.in: Rebuilt. ++ * aclocal.m4: Rebuilt. ++ ++Mon Nov 18 11:04:04 2002 Nigel Stephens ++ ++ * configure.in (AC_REPLACE_FUNCS): Removed, used libiberty ++ versions of getopt and strtoul. ++ ++ * Makefile.am (EXTRA_conv_SOURCES): Line removed, we don't have ++ our own getopt.h now. ++ (LIBIBERTY): New variable. ++ (conv_LDADD): Set to LIBIBERTY, not LDADD. ++ ++ * Makefile.in, configure, config.h.in: Rebuilt. ++ ++ * getopt.h: Removed. ++ * getopt.c: Removed. ++ * strtoul.c: Removed. ++ ++Tue Oct 15 12:57:11 2002 Nigel Stephens ++ ++ * elfout.c: New "relocated" ELF output format, mainly so that we ++ can give a PROM image to MIPSsim. ++ ++ * convert.c: Add endianness argument to start function entries in ++ table. ++ (formats): Add "relf" format. ++ (progname): Make it global. ++ (promflag): Similarly. ++ (prombase): Similarly. ++ (usage): Add -EB/-EL. ++ (xmalloc): New error checking interface to malloc. ++ (convertSymbols): Use xmalloc(), and free malloced data when ++ returning. ++ (main): Handle -EB/-EL argument, only relevant for raw binary ++ input files. In other cases set bigendian flag from the ELF input ++ file. Pass bigendian flag to format "start" function. Use ++ xmalloc/free. ++ ++ * configure.in (AC_CHECK_HEADERS): Add stdlib.h ++ ++ * config.h.in: Add HAVE_STDLIB_H ++ ++ * lsifast.c (LsiStart): Use xmalloc(). ++ (LsiEnd): Use free(). ++ * bin.c: Similarly. ++ * stagbin.c: Similarly. ++ ++ * sysdep.h: Fix up definitions of alloca(). Add definition of ++ xmalloc(). ++ ++ * Makefile.am (conv_SOURCES): Add elfout.c ++ (install-exec-local): Don't add .exe extension on twice. ++ ++Fri Jun 7 13:58:49 2002 Nigel Stephens ++ ++ * Makefile.am (html): Do nothing target. ++ ++ * Makefile.in: Rebuilt. ++ ++Mon Mar 18 19:13:08 2002 Nigel Stephens ++ ++ * Makefile.am: Add manual install step to install program with ++ additional target alias name. ++ ++ * Makefile.in: Rebuilt. ++ ++Tue Nov 7 00:35:37 2000 Chris Dearman ++ ++ * convert.c (main): Convert promlimit to physical address when ++ parsing -a base:limit option. Exit with error if promlimit!=0 ++ && promlimit<=prombase. ++ ++Tue Jul 18 15:19:09 2000 Nigel Stephens ++ ++ * convert.c (main): Sort the program header into physical/load ++ address order - the linker sorts it into virtual address order. ++ (phcompar): New comparison function for qsort(). ++ ++Fri Nov 19 16:42:57 1999 Nigel Stephens ++ ++ * All: Added copyright messages. ++ ++Thu Nov 11 15:25:54 1999 Nigel Stephens ++ ++ * convert.c (main): Allow byte selection when not in PROM mode. ++ ++Mon Oct 25 14:21:47 1999 Nigel Stephens ++ ++ * Makefile.am: Add no-dependencies to AUTOMAKE_OPTIONS ++ ++Thu Sep 9 18:12:11 1999 Nigel Stephens ++ ++ * convert.c (convertSegment): Change in read/write flag of segment ++ will cause it to be moved to next 16 byte boundary. ++ ++Wed Jun 3 16:35:32 1998 Nigel Stephens ++ ++ * configure.in (AC_CANONICAL_SYSTEM): No longer needed by ++ AM_CYGWIN32. Use AM_EXEEXT instead of AM_CYGWIN32. ++ ++Tue May 12 15:42:10 1998 Nigel Stephens ++ ++ * configure.in: Bump version number to 3.0.3 ++ ++ * Makefile.am: Change automake options to --foreign. ++ ++Fri Apr 17 14:26:29 1998 Nigel Stephens ++ ++ * Makefile.am: Moved over to automake/autoconf. ++ ++Mon Jan 26 15:40:18 1998 Nigel Stephens ++ ++ * convert.c (convertSymbols): Flag MIPS16 symbols by making symbol ++ address odd. ++ (main): Do all PROM resident segments first, irrespective of what ++ type they are. ++ ++Mon Jul 7 18:04:50 1997 Nigel Stephens ++ ++ SDE-MIPS version 2.2.1 released. ++ ++Tue May 20 18:07:32 1997 Nigel Stephens ++ ++ SDE-MIPS version 2.2 released. ++ ++Tue May 20 14:39:41 1997 Nigel Stephens ++ ++ * convert.c: Realign segment when the PF_X flag changes. ++ ++Wed Apr 30 17:59:56 1997 Nigel Stephens ++ ++ SDE-MIPS version 2.2-beta released. ++ ++Thu Apr 24 13:52:08 1997 Nigel Stephens ++ ++ * elfio.c: Added functions to read and write .reginfo and .gptab ++ sections. ++ ++ * elfmips.h: Added prototypes for above, and defined new ++ architecture flags and SDE-MIPS special flags. +--- /dev/null ++++ b/convert/Makefile.am +@@ -0,0 +1,62 @@ ++## Process this file with automake to generate Makefile.in ++ ++AUTOMAKE_OPTIONS = cygnus ++ACLOCAL_AMFLAGS = -I . -I .. -I ../config ++ ++noinst_PROGRAMS = conv ++ ++conv_SOURCES = convert.c elfio.c elfout.c mipsflash.c \ ++ srec.c lsifast.c idtbin.c stagbin.c bin.c \ ++ elf.h elfmips.h sysdep.h conv-version.h \ ++ conv.1 ++ ++#EXTRA_conv_SOURCES = getopt.h # alloca.c getopt.c strtoul.c ++ ++conv-version.h: $(srcdir)/version.h $(srcdir)/Makefile.in ++ @echo "creating $@" ++ conv_version_package="\"$(PKGVERSION)\"" ;\ ++ report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ ++ sed -e "s,@conv_version_package@,$$conv_version_package," \ ++ -e "s,@report_bugs_to@,$$report_bugs_to," \ ++ < $(srcdir)/version.h > $@ ++ ++convert.o: convert.c conv-version.h ++ ++LIBIBERTY = ../libiberty/libiberty.a ++ ++conv_LDADD = $(LIBIBERTY) ++ ++man_MANS = conv.1 ++ ++info_TEXINFOS = conv.texi ++ ++conv_TEXI = $(srcdir)/conv.texi ++ ++# FIXME! ++conv.html: $(conv_TEXI) ++# @rm -f conv.html ++# texi2html -monolithic -glossary -menu -I . -I $(srcdir) $(conv_TEXI) ++ touch $@ ++ ++conv.dvi: $(conv_TEXI) ++ ++conv.info: $(conv_TEXI) ++ ++.PHONY: install-exec-local install-html ++ ++install-exec-local: $(noinst_PROGRAMS) ++ @$(NORMAL_INSTALL) ++ $(mkinstalldirs) $(DESTDIR)$(bindir) ++ @list='$(noinst_PROGRAMS)'; for p in $$list; do \ ++ if test -f $$p; then \ ++ t="$(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ ++ echo " $(INSTALL_PROGRAM) $$p $$t"; \ ++ $(INSTALL_PROGRAM) $$p $$t; \ ++ else :; fi; \ ++ done ++ ++install-html: ++ echo FIXME > /dev/null ++ ++install-pdf: ++ echo FIXME > /dev/null +--- /dev/null ++++ b/convert/Makefile.in +@@ -0,0 +1,638 @@ ++# Makefile.in generated by automake 1.9.5 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004, 2005 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++ ++SOURCES = $(conv_SOURCES) ++ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++top_builddir = . ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = @INSTALL@ ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++target_triplet = @target@ ++noinst_PROGRAMS = conv$(EXEEXT) ++DIST_COMMON = $(srcdir)/../config.guess $(srcdir)/../config.sub \ ++ ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ ++ $(top_srcdir)/configure $(am__configure_deps) \ ++ $(srcdir)/config.h.in $(srcdir)/../mkinstalldirs ++subdir = . ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ ++ $(top_srcdir)/../config/depstand.m4 \ ++ $(top_srcdir)/../config/lead-dot.m4 $(top_srcdir)/acinclude.m4 \ ++ $(top_srcdir)/configure.ac ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ ++ configure.lineno configure.status.lineno ++mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs ++CONFIG_HEADER = config.h ++CONFIG_CLEAN_FILES = ++PROGRAMS = $(noinst_PROGRAMS) ++am_conv_OBJECTS = convert.$(OBJEXT) elfio.$(OBJEXT) elfout.$(OBJEXT) \ ++ mipsflash.$(OBJEXT) srec.$(OBJEXT) lsifast.$(OBJEXT) \ ++ idtbin.$(OBJEXT) stagbin.$(OBJEXT) bin.$(OBJEXT) ++conv_OBJECTS = $(am_conv_OBJECTS) ++am__DEPENDENCIES_1 = ../libiberty/libiberty.a ++conv_DEPENDENCIES = $(am__DEPENDENCIES_1) ++DEFAULT_INCLUDES = -I. -I$(srcdir) -I. ++depcomp = ++am__depfiles_maybe = ++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ ++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++SOURCES = $(conv_SOURCES) ++INFO_DEPS = $(srcdir)/conv.info ++TEXINFO_TEX = $(top_srcdir)/../texinfo/texinfo.tex ++am__TEXINFO_TEX_DIR = $(top_srcdir)/../texinfo ++DVIS = conv.dvi ++PDFS = conv.pdf ++PSS = conv.ps ++HTMLS = conv.html ++TEXINFOS = conv.texi ++TEXI2DVI = `if test -f $(top_srcdir)/../texinfo/util/texi2dvi; then \ ++ echo $(top_srcdir)/../texinfo/util/texi2dvi; \ ++ else \ ++ echo texi2dvi; \ ++ fi` ++TEXI2PDF = $(TEXI2DVI) --pdf --batch ++MAKEINFOHTML = $(MAKEINFO) --html ++AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) ++DVIPS = dvips ++man1dir = $(mandir)/man1 ++am__installdirs = "$(DESTDIR)$(man1dir)" ++NROFF = nroff ++MANS = $(man_MANS) ++ETAGS = etags ++CTAGS = ctags ++ACLOCAL = @ACLOCAL@ ++ALLOCA = @ALLOCA@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ ++AMTAR = @AMTAR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AWK = @AWK@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAINT = @MAINT@ ++MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ ++MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PKGVERSION = @PKGVERSION@ ++REPORT_BUGS_TEXI = @REPORT_BUGS_TEXI@ ++REPORT_BUGS_TO = @REPORT_BUGS_TO@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++STRIP = @STRIP@ ++VERSION = @VERSION@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++datadir = @datadir@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++oldincludedir = @oldincludedir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target = @target@ ++target_alias = @target_alias@ ++target_cpu = @target_cpu@ ++target_os = @target_os@ ++target_vendor = @target_vendor@ ++AUTOMAKE_OPTIONS = cygnus ++ACLOCAL_AMFLAGS = -I . -I .. -I ../config ++conv_SOURCES = convert.c elfio.c elfout.c mipsflash.c \ ++ srec.c lsifast.c idtbin.c stagbin.c bin.c \ ++ elf.h elfmips.h sysdep.h conv-version.h \ ++ conv.1 ++ ++LIBIBERTY = ../libiberty/libiberty.a ++conv_LDADD = $(LIBIBERTY) ++man_MANS = conv.1 ++info_TEXINFOS = conv.texi ++conv_TEXI = $(srcdir)/conv.texi ++all: config.h ++ $(MAKE) $(AM_MAKEFLAGS) all-am ++ ++.SUFFIXES: ++.SUFFIXES: .c .dvi .html .info .o .obj .pdf .ps .texi ++am--refresh: ++ @: ++$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ ++ cd $(srcdir) && $(AUTOMAKE) --foreign \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ echo ' $(SHELL) ./config.status'; \ ++ $(SHELL) ./config.status;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ $(SHELL) ./config.status --recheck ++ ++$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ++ cd $(srcdir) && $(AUTOCONF) ++$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) ++ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) ++ ++config.h: stamp-h1 ++ @if test ! -f $@; then \ ++ rm -f stamp-h1; \ ++ $(MAKE) stamp-h1; \ ++ else :; fi ++ ++stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status ++ @rm -f stamp-h1 ++ cd $(top_builddir) && $(SHELL) ./config.status config.h ++$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ++ cd $(top_srcdir) && $(AUTOHEADER) ++ rm -f stamp-h1 ++ touch $@ ++ ++distclean-hdr: ++ -rm -f config.h stamp-h1 ++ ++clean-noinstPROGRAMS: ++ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) ++conv$(EXEEXT): $(conv_OBJECTS) $(conv_DEPENDENCIES) ++ @rm -f conv$(EXEEXT) ++ $(LINK) $(conv_LDFLAGS) $(conv_OBJECTS) $(conv_LDADD) $(LIBS) ++ ++mostlyclean-compile: ++ -rm -f *.$(OBJEXT) ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++.c.o: ++ $(COMPILE) -c $< ++ ++.c.obj: ++ $(COMPILE) -c `$(CYGPATH_W) '$<'` ++ ++.texi.info: ++ restore=: && backupdir="$(am__leading_dot)am$$$$" && \ ++ am__cwd=`pwd` && cd $(srcdir) && \ ++ rm -rf $$backupdir && mkdir $$backupdir && \ ++ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ ++ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ ++ done; \ ++ cd "$$am__cwd"; \ ++ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ ++ -o $@ $<; \ ++ then \ ++ rc=0; \ ++ cd $(srcdir); \ ++ else \ ++ rc=$$?; \ ++ cd $(srcdir) && \ ++ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ ++ fi; \ ++ rm -rf $$backupdir; exit $$rc ++ ++.texi.dvi: ++ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ ++ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ ++ $(TEXI2DVI) $< ++ ++.texi.pdf: ++ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ ++ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ ++ $(TEXI2PDF) $< ++ ++.texi.html: ++ rm -rf $(@:.html=.htp) ++ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ ++ -o $(@:.html=.htp) $<; \ ++ then \ ++ rm -rf $@; \ ++ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ ++ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ ++ else \ ++ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ ++ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ ++ exit 1; \ ++ fi ++$(srcdir)/conv.info: conv.texi ++conv.pdf: conv.texi ++.dvi.ps: ++ $(DVIPS) -o $@ $< ++ ++uninstall-info-am: ++ @$(PRE_UNINSTALL) ++ @if (install-info --version && \ ++ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ ++ list='$(INFO_DEPS)'; \ ++ for file in $$list; do \ ++ relfile=`echo "$$file" | sed 's|^.*/||'`; \ ++ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ ++ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ ++ done; \ ++ else :; fi ++ @$(NORMAL_UNINSTALL) ++ @list='$(INFO_DEPS)'; \ ++ for file in $$list; do \ ++ relfile=`echo "$$file" | sed 's|^.*/||'`; \ ++ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ ++ (if cd "$(DESTDIR)$(infodir)"; then \ ++ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ ++ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ ++ else :; fi); \ ++ done ++ ++dist-info: $(INFO_DEPS) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ list='$(INFO_DEPS)'; \ ++ for base in $$list; do \ ++ case $$base in \ ++ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ ++ esac; \ ++ if test -f $$base; then d=.; else d=$(srcdir); fi; \ ++ for file in $$d/$$base*; do \ ++ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ ++ test -f $(distdir)/$$relfile || \ ++ cp -p $$file $(distdir)/$$relfile; \ ++ done; \ ++ done ++ ++mostlyclean-aminfo: ++ -rm -rf conv.aux conv.cp conv.cps conv.fn conv.fns conv.ky conv.log conv.pg \ ++ conv.pgs conv.tmp conv.toc conv.tp conv.tps conv.vr conv.vrs \ ++ conv.dvi conv.pdf conv.ps conv.html ++ ++maintainer-clean-aminfo: ++ @list='$(INFO_DEPS)'; for i in $$list; do \ ++ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ ++ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ ++ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ ++ done ++ ++clean-info: mostlyclean-aminfo ++install-man1: $(man1_MANS) $(man_MANS) ++ @$(NORMAL_INSTALL) ++ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" ++ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ ++ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ ++ for i in $$l2; do \ ++ case "$$i" in \ ++ *.1*) list="$$list $$i" ;; \ ++ esac; \ ++ done; \ ++ for i in $$list; do \ ++ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ ++ else file=$$i; fi; \ ++ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ ++ case "$$ext" in \ ++ 1*) ;; \ ++ *) ext='1' ;; \ ++ esac; \ ++ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ ++ inst=`echo $$inst | sed -e 's/^.*\///'`; \ ++ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ ++ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ ++ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ ++ done ++uninstall-man1: ++ @$(NORMAL_UNINSTALL) ++ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ ++ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ ++ for i in $$l2; do \ ++ case "$$i" in \ ++ *.1*) list="$$list $$i" ;; \ ++ esac; \ ++ done; \ ++ for i in $$list; do \ ++ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ ++ case "$$ext" in \ ++ 1*) ;; \ ++ *) ext='1' ;; \ ++ esac; \ ++ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ ++ inst=`echo $$inst | sed -e 's/^.*\///'`; \ ++ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ ++ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ ++ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++check-am: ++check: check-am ++all-am: Makefile $(PROGRAMS) $(MANS) config.h ++installdirs: ++ for dir in "$(DESTDIR)$(man1dir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-am ++ ++clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am ++ ++distclean: distclean-am ++ -rm -f $(am__CONFIG_DISTCLEAN_FILES) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-hdr distclean-tags ++ ++dvi: dvi-am ++ ++dvi-am: $(DVIS) ++ ++html: html-am ++ ++html-am: $(HTMLS) ++ ++info: info-am ++ ++info-am: $(INFO_DEPS) ++ ++install-data-am: install-man ++ ++install-exec-am: install-exec-local ++ ++install-info: install-info-am ++ ++install-info-am: $(INFO_DEPS) ++ @$(NORMAL_INSTALL) ++ test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)" ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ list='$(INFO_DEPS)'; \ ++ for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ esac; \ ++ if test -f $$file; then d=.; else d=$(srcdir); fi; \ ++ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ ++ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ ++ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ ++ if test -f $$ifile; then \ ++ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \ ++ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \ ++ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \ ++ else : ; fi; \ ++ done; \ ++ done ++ @$(POST_INSTALL) ++ @if (install-info --version && \ ++ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ ++ list='$(INFO_DEPS)'; \ ++ for file in $$list; do \ ++ relfile=`echo "$$file" | sed 's|^.*/||'`; \ ++ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ ++ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ ++ done; \ ++ else : ; fi ++install-man: install-man1 ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -f $(am__CONFIG_DISTCLEAN_FILES) ++ -rm -rf $(top_srcdir)/autom4te.cache ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-aminfo \ ++ maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ ++ mostlyclean-generic ++ ++pdf: pdf-am ++ ++pdf-am: $(PDFS) ++ ++ps: ps-am ++ ++ps-am: $(PSS) ++ ++uninstall-am: uninstall-man ++ ++uninstall-man: uninstall-man1 ++ ++.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ ++ clean-generic clean-info clean-noinstPROGRAMS ctags dist-info \ ++ distclean distclean-compile distclean-generic distclean-hdr \ ++ distclean-tags dvi dvi-am html html-am info info-am install \ ++ install-am install-data install-data-am install-exec \ ++ install-exec-am install-exec-local install-info \ ++ install-info-am install-man install-man1 install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-aminfo maintainer-clean-generic mostlyclean \ ++ mostlyclean-aminfo mostlyclean-compile mostlyclean-generic pdf \ ++ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am \ ++ uninstall-man uninstall-man1 ++ ++ ++#EXTRA_conv_SOURCES = getopt.h # alloca.c getopt.c strtoul.c ++ ++conv-version.h: $(srcdir)/version.h $(srcdir)/Makefile.in ++ @echo "creating $@" ++ conv_version_package="\"$(PKGVERSION)\"" ;\ ++ report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ ++ sed -e "s,@conv_version_package@,$$conv_version_package," \ ++ -e "s,@report_bugs_to@,$$report_bugs_to," \ ++ < $(srcdir)/version.h > $@ ++ ++convert.o: convert.c conv-version.h ++ ++# FIXME! ++conv.html: $(conv_TEXI) ++# @rm -f conv.html ++# texi2html -monolithic -glossary -menu -I . -I $(srcdir) $(conv_TEXI) ++ touch $@ ++ ++conv.dvi: $(conv_TEXI) ++ ++conv.info: $(conv_TEXI) ++ ++.PHONY: install-exec-local install-html ++ ++install-exec-local: $(noinst_PROGRAMS) ++ @$(NORMAL_INSTALL) ++ $(mkinstalldirs) $(DESTDIR)$(bindir) ++ @list='$(noinst_PROGRAMS)'; for p in $$list; do \ ++ if test -f $$p; then \ ++ t="$(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ ++ echo " $(INSTALL_PROGRAM) $$p $$t"; \ ++ $(INSTALL_PROGRAM) $$p $$t; \ ++ else :; fi; \ ++ done ++ ++install-html: ++ echo FIXME > /dev/null ++ ++install-pdf: ++ echo FIXME > /dev/null ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +--- /dev/null ++++ b/convert/acinclude.m4 +@@ -0,0 +1,37 @@ ++dnl See whether we need to use fopen-bin.h rather than fopen-same.h. ++AC_DEFUN([CONV_BINARY_FOPEN], ++[AC_REQUIRE([AC_CANONICAL_HOST]) ++case "${host}" in ++changequote(,)dnl ++*-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows) ++changequote([,])dnl ++ AC_DEFINE([USE_BINARY_FOPEN], 1, [Use b modifier when opening binary files?]) ;; ++esac])dnl ++ ++dnl See whether we need a declaration for a function. ++AC_DEFUN([CONV_NEED_DECLARATION], ++[AC_MSG_CHECKING([whether $1 must be declared]) ++AC_CACHE_VAL(bfd_cv_decl_needed_$1, ++[AC_TRY_COMPILE([ ++#include ++#ifdef HAVE_STRING_H ++#include ++#else ++#ifdef HAVE_STRINGS_H ++#include ++#endif ++#endif ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++#ifdef HAVE_UNISTD_H ++#include ++#endif], ++[char *(*pfn) = (char *(*)) $1], ++bfd_cv_decl_needed_$1=no, bfd_cv_decl_needed_$1=yes)]) ++AC_MSG_RESULT($bfd_cv_decl_needed_$1) ++if test $bfd_cv_decl_needed_$1 = yes; then ++ bfd_tr_decl=NEED_DECLARATION_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ AC_DEFINE_UNQUOTED($bfd_tr_decl, 1, [Define if a declaration is needed.]) ++fi ++])dnl +--- /dev/null ++++ b/convert/aclocal.m4 +@@ -0,0 +1,862 @@ ++# generated automatically by aclocal 1.9.5 -*- Autoconf -*- ++ ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, ++# 2005 Free Software Foundation, Inc. ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# AM_AUTOMAKE_VERSION(VERSION) ++# ---------------------------- ++# Automake X.Y traces this macro to ensure aclocal.m4 has been ++# generated from the m4 files accompanying Automake X.Y. ++AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) ++ ++# AM_SET_CURRENT_AUTOMAKE_VERSION ++# ------------------------------- ++# Call AM_AUTOMAKE_VERSION so it can be traced. ++# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. ++AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], ++ [AM_AUTOMAKE_VERSION([1.9.5])]) ++ ++# AM_AUX_DIR_EXPAND -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets ++# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to ++# `$srcdir', `$srcdir/..', or `$srcdir/../..'. ++# ++# Of course, Automake must honor this variable whenever it calls a ++# tool from the auxiliary directory. The problem is that $srcdir (and ++# therefore $ac_aux_dir as well) can be either absolute or relative, ++# depending on how configure is run. This is pretty annoying, since ++# it makes $ac_aux_dir quite unusable in subdirectories: in the top ++# source directory, any form will work fine, but in subdirectories a ++# relative path needs to be adjusted first. ++# ++# $ac_aux_dir/missing ++# fails when called from a subdirectory if $ac_aux_dir is relative ++# $top_srcdir/$ac_aux_dir/missing ++# fails if $ac_aux_dir is absolute, ++# fails when called from a subdirectory in a VPATH build with ++# a relative $ac_aux_dir ++# ++# The reason of the latter failure is that $top_srcdir and $ac_aux_dir ++# are both prefixed by $srcdir. In an in-source build this is usually ++# harmless because $srcdir is `.', but things will broke when you ++# start a VPATH build or use an absolute $srcdir. ++# ++# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, ++# iff we strip the leading $srcdir from $ac_aux_dir. That would be: ++# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` ++# and then we would define $MISSING as ++# MISSING="\${SHELL} $am_aux_dir/missing" ++# This will work as long as MISSING is not called from configure, because ++# unfortunately $(top_srcdir) has no meaning in configure. ++# However there are other variables, like CC, which are often used in ++# configure, and could therefore not use this "fixed" $ac_aux_dir. ++# ++# Another solution, used here, is to always expand $ac_aux_dir to an ++# absolute PATH. The drawback is that using absolute paths prevent a ++# configured tree to be moved without reconfiguration. ++ ++AC_DEFUN([AM_AUX_DIR_EXPAND], ++[dnl Rely on autoconf to set up CDPATH properly. ++AC_PREREQ([2.50])dnl ++# expand $ac_aux_dir to an absolute path ++am_aux_dir=`cd $ac_aux_dir && pwd` ++]) ++ ++# AM_CONDITIONAL -*- Autoconf -*- ++ ++# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 7 ++ ++# AM_CONDITIONAL(NAME, SHELL-CONDITION) ++# ------------------------------------- ++# Define a conditional. ++AC_DEFUN([AM_CONDITIONAL], ++[AC_PREREQ(2.52)dnl ++ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], ++ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl ++AC_SUBST([$1_TRUE]) ++AC_SUBST([$1_FALSE]) ++if $2; then ++ $1_TRUE= ++ $1_FALSE='#' ++else ++ $1_TRUE='#' ++ $1_FALSE= ++fi ++AC_CONFIG_COMMANDS_PRE( ++[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then ++ AC_MSG_ERROR([[conditional "$1" was never defined. ++Usually this means the macro was only invoked conditionally.]]) ++fi])]) ++ ++ ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 8 ++ ++# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be ++# written in clear, in which case automake, when reading aclocal.m4, ++# will think it sees a *use*, and therefore will trigger all it's ++# C support machinery. Also note that it means that autoscan, seeing ++# CC etc. in the Makefile, will ask for an AC_PROG_CC use... ++ ++ ++# _AM_DEPENDENCIES(NAME) ++# ---------------------- ++# See how the compiler implements dependency checking. ++# NAME is "CC", "CXX", "GCJ", or "OBJC". ++# We try a few techniques and use that to set a single cache variable. ++# ++# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was ++# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular ++# dependency, and given that the user is not expected to run this macro, ++# just rely on AC_PROG_CC. ++AC_DEFUN([_AM_DEPENDENCIES], ++[AC_REQUIRE([AM_SET_DEPDIR])dnl ++AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl ++AC_REQUIRE([AM_MAKE_INCLUDE])dnl ++AC_REQUIRE([AM_DEP_TRACK])dnl ++ ++ifelse([$1], CC, [depcc="$CC" am_compiler_list=], ++ [$1], CXX, [depcc="$CXX" am_compiler_list=], ++ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], ++ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], ++ [depcc="$$1" am_compiler_list=]) ++ ++AC_CACHE_CHECK([dependency style of $depcc], ++ [am_cv_$1_dependencies_compiler_type], ++[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then ++ # We make a subdir and do the tests there. Otherwise we can end up ++ # making bogus files that we don't know about and never remove. For ++ # instance it was reported that on HP-UX the gcc test will end up ++ # making a dummy file named `D' -- because `-MD' means `put the output ++ # in D'. ++ mkdir conftest.dir ++ # Copy depcomp to subdir because otherwise we won't find it if we're ++ # using a relative directory. ++ cp "$am_depcomp" conftest.dir ++ cd conftest.dir ++ # We will build objects and dependencies in a subdirectory because ++ # it helps to detect inapplicable dependency modes. For instance ++ # both Tru64's cc and ICC support -MD to output dependencies as a ++ # side effect of compilation, but ICC will put the dependencies in ++ # the current directory while Tru64 will put them in the object ++ # directory. ++ mkdir sub ++ ++ am_cv_$1_dependencies_compiler_type=none ++ if test "$am_compiler_list" = ""; then ++ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` ++ fi ++ for depmode in $am_compiler_list; do ++ # Setup a source with many dependencies, because some compilers ++ # like to wrap large dependency lists on column 80 (with \), and ++ # we should not choose a depcomp mode which is confused by this. ++ # ++ # We need to recreate these files for each test, as the compiler may ++ # overwrite some of them when testing with obscure command lines. ++ # This happens at least with the AIX C compiler. ++ : > sub/conftest.c ++ for i in 1 2 3 4 5 6; do ++ echo '#include "conftst'$i'.h"' >> sub/conftest.c ++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with ++ # Solaris 8's {/usr,}/bin/sh. ++ touch sub/conftst$i.h ++ done ++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf ++ ++ case $depmode in ++ nosideeffect) ++ # after this tag, mechanisms are not by side-effect, so they'll ++ # only be used when explicitly requested ++ if test "x$enable_dependency_tracking" = xyes; then ++ continue ++ else ++ break ++ fi ++ ;; ++ none) break ;; ++ esac ++ # We check with `-c' and `-o' for the sake of the "dashmstdout" ++ # mode. It turns out that the SunPro C++ compiler does not properly ++ # handle `-M -o', and we need to detect this. ++ if depmode=$depmode \ ++ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ ++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ ++ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ ++ >/dev/null 2>conftest.err && ++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && ++ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ++ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then ++ # icc doesn't choke on unknown options, it will just issue warnings ++ # or remarks (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored or not supported. ++ # When given -MP, icc 7.0 and 7.1 complain thusly: ++ # icc: Command line warning: ignoring option '-M'; no argument required ++ # The diagnosis changed in icc 8.0: ++ # icc: Command line remark: option '-MP' not supported ++ if (grep 'ignoring option' conftest.err || ++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else ++ am_cv_$1_dependencies_compiler_type=$depmode ++ break ++ fi ++ fi ++ done ++ ++ cd .. ++ rm -rf conftest.dir ++else ++ am_cv_$1_dependencies_compiler_type=none ++fi ++]) ++AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) ++AM_CONDITIONAL([am__fastdep$1], [ ++ test "x$enable_dependency_tracking" != xno \ ++ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ++]) ++ ++ ++# AM_SET_DEPDIR ++# ------------- ++# Choose a directory name for dependency files. ++# This macro is AC_REQUIREd in _AM_DEPENDENCIES ++AC_DEFUN([AM_SET_DEPDIR], ++[AC_REQUIRE([AM_SET_LEADING_DOT])dnl ++AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ++]) ++ ++ ++# AM_DEP_TRACK ++# ------------ ++AC_DEFUN([AM_DEP_TRACK], ++[AC_ARG_ENABLE(dependency-tracking, ++[ --disable-dependency-tracking speeds up one-time build ++ --enable-dependency-tracking do not reject slow dependency extractors]) ++if test "x$enable_dependency_tracking" != xno; then ++ am_depcomp="$ac_aux_dir/depcomp" ++ AMDEPBACKSLASH='\' ++fi ++AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) ++AC_SUBST([AMDEPBACKSLASH]) ++]) ++ ++# Generate code to set up dependency tracking. -*- Autoconf -*- ++ ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++#serial 3 ++ ++# _AM_OUTPUT_DEPENDENCY_COMMANDS ++# ------------------------------ ++AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], ++[for mf in $CONFIG_FILES; do ++ # Strip MF so we end up with the name of the file. ++ mf=`echo "$mf" | sed -e 's/:.*$//'` ++ # Check whether this is an Automake generated Makefile or not. ++ # We used to match only the files named `Makefile.in', but ++ # some people rename them; so instead we look at the file content. ++ # Grep'ing the first line is not enough: some people post-process ++ # each Makefile.in and add a new line on top of each file to say so. ++ # So let's grep whole file. ++ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then ++ dirpart=`AS_DIRNAME("$mf")` ++ else ++ continue ++ fi ++ # Extract the definition of DEPDIR, am__include, and am__quote ++ # from the Makefile without running `make'. ++ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` ++ test -z "$DEPDIR" && continue ++ am__include=`sed -n 's/^am__include = //p' < "$mf"` ++ test -z "am__include" && continue ++ am__quote=`sed -n 's/^am__quote = //p' < "$mf"` ++ # When using ansi2knr, U may be empty or an underscore; expand it ++ U=`sed -n 's/^U = //p' < "$mf"` ++ # Find all dependency output files, they are included files with ++ # $(DEPDIR) in their names. We invoke sed twice because it is the ++ # simplest approach to changing $(DEPDIR) to its actual value in the ++ # expansion. ++ for file in `sed -n " ++ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ ++ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do ++ # Make sure the directory exists. ++ test -f "$dirpart/$file" && continue ++ fdir=`AS_DIRNAME(["$file"])` ++ AS_MKDIR_P([$dirpart/$fdir]) ++ # echo "creating $dirpart/$file" ++ echo '# dummy' > "$dirpart/$file" ++ done ++done ++])# _AM_OUTPUT_DEPENDENCY_COMMANDS ++ ++ ++# AM_OUTPUT_DEPENDENCY_COMMANDS ++# ----------------------------- ++# This macro should only be invoked once -- use via AC_REQUIRE. ++# ++# This code is only required when automatic dependency tracking ++# is enabled. FIXME. This creates each `.P' file that we will ++# need in order to bootstrap the dependency handling code. ++AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], ++[AC_CONFIG_COMMANDS([depfiles], ++ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], ++ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ++]) ++ ++# Do all the work for Automake. -*- Autoconf -*- ++ ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 12 ++ ++# This macro actually does too much. Some checks are only needed if ++# your package does certain things. But this isn't really a big deal. ++ ++# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) ++# AM_INIT_AUTOMAKE([OPTIONS]) ++# ----------------------------------------------- ++# The call with PACKAGE and VERSION arguments is the old style ++# call (pre autoconf-2.50), which is being phased out. PACKAGE ++# and VERSION should now be passed to AC_INIT and removed from ++# the call to AM_INIT_AUTOMAKE. ++# We support both call styles for the transition. After ++# the next Automake release, Autoconf can make the AC_INIT ++# arguments mandatory, and then we can depend on a new Autoconf ++# release and drop the old call support. ++AC_DEFUN([AM_INIT_AUTOMAKE], ++[AC_PREREQ([2.58])dnl ++dnl Autoconf wants to disallow AM_ names. We explicitly allow ++dnl the ones we care about. ++m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl ++AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl ++AC_REQUIRE([AC_PROG_INSTALL])dnl ++# test to see if srcdir already configured ++if test "`cd $srcdir && pwd`" != "`pwd`" && ++ test -f $srcdir/config.status; then ++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) ++fi ++ ++# test whether we have cygpath ++if test -z "$CYGPATH_W"; then ++ if (cygpath --version) >/dev/null 2>/dev/null; then ++ CYGPATH_W='cygpath -w' ++ else ++ CYGPATH_W=echo ++ fi ++fi ++AC_SUBST([CYGPATH_W]) ++ ++# Define the identity of the package. ++dnl Distinguish between old-style and new-style calls. ++m4_ifval([$2], ++[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl ++ AC_SUBST([PACKAGE], [$1])dnl ++ AC_SUBST([VERSION], [$2])], ++[_AM_SET_OPTIONS([$1])dnl ++ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl ++ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl ++ ++_AM_IF_OPTION([no-define],, ++[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) ++ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl ++ ++# Some tools Automake needs. ++AC_REQUIRE([AM_SANITY_CHECK])dnl ++AC_REQUIRE([AC_ARG_PROGRAM])dnl ++AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) ++AM_MISSING_PROG(AUTOCONF, autoconf) ++AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) ++AM_MISSING_PROG(AUTOHEADER, autoheader) ++AM_MISSING_PROG(MAKEINFO, makeinfo) ++AM_PROG_INSTALL_SH ++AM_PROG_INSTALL_STRIP ++AC_REQUIRE([AM_PROG_MKDIR_P])dnl ++# We need awk for the "check" target. The system "awk" is bad on ++# some platforms. ++AC_REQUIRE([AC_PROG_AWK])dnl ++AC_REQUIRE([AC_PROG_MAKE_SET])dnl ++AC_REQUIRE([AM_SET_LEADING_DOT])dnl ++_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], ++ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], ++ [_AM_PROG_TAR([v7])])]) ++_AM_IF_OPTION([no-dependencies],, ++[AC_PROVIDE_IFELSE([AC_PROG_CC], ++ [_AM_DEPENDENCIES(CC)], ++ [define([AC_PROG_CC], ++ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl ++AC_PROVIDE_IFELSE([AC_PROG_CXX], ++ [_AM_DEPENDENCIES(CXX)], ++ [define([AC_PROG_CXX], ++ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ++]) ++]) ++ ++ ++# When config.status generates a header, we must update the stamp-h file. ++# This file resides in the same directory as the config header ++# that is generated. The stamp files are numbered to have different names. ++ ++# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the ++# loop where config.status creates the headers, so we can generate ++# our stamp files there. ++AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], ++[# Compute $1's index in $config_headers. ++_am_stamp_count=1 ++for _am_header in $config_headers :; do ++ case $_am_header in ++ $1 | $1:* ) ++ break ;; ++ * ) ++ _am_stamp_count=`expr $_am_stamp_count + 1` ;; ++ esac ++done ++echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) ++ ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# AM_PROG_INSTALL_SH ++# ------------------ ++# Define $install_sh. ++AC_DEFUN([AM_PROG_INSTALL_SH], ++[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl ++install_sh=${install_sh-"$am_aux_dir/install-sh"} ++AC_SUBST(install_sh)]) ++ ++# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- ++# From Jim Meyering ++ ++# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 4 ++ ++AC_DEFUN([AM_MAINTAINER_MODE], ++[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) ++ dnl maintainer-mode is disabled by default ++ AC_ARG_ENABLE(maintainer-mode, ++[ --enable-maintainer-mode enable make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer], ++ USE_MAINTAINER_MODE=$enableval, ++ USE_MAINTAINER_MODE=no) ++ AC_MSG_RESULT([$USE_MAINTAINER_MODE]) ++ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) ++ MAINT=$MAINTAINER_MODE_TRUE ++ AC_SUBST(MAINT)dnl ++] ++) ++ ++AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) ++ ++# Check to see how 'make' treats includes. -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 3 ++ ++# AM_MAKE_INCLUDE() ++# ----------------- ++# Check to see how make treats includes. ++AC_DEFUN([AM_MAKE_INCLUDE], ++[am_make=${MAKE-make} ++cat > confinc << 'END' ++am__doit: ++ @echo done ++.PHONY: am__doit ++END ++# If we don't find an include directive, just comment out the code. ++AC_MSG_CHECKING([for style of include used by $am_make]) ++am__include="#" ++am__quote= ++_am_result=none ++# First try GNU make style include. ++echo "include confinc" > confmf ++# We grep out `Entering directory' and `Leaving directory' ++# messages which can occur if `w' ends up in MAKEFLAGS. ++# In particular we don't look at `^make:' because GNU make might ++# be invoked under some other name (usually "gmake"), in which ++# case it prints its new name instead of `make'. ++if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then ++ am__include=include ++ am__quote= ++ _am_result=GNU ++fi ++# Now try BSD make style include. ++if test "$am__include" = "#"; then ++ echo '.include "confinc"' > confmf ++ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then ++ am__include=.include ++ am__quote="\"" ++ _am_result=BSD ++ fi ++fi ++AC_SUBST([am__include]) ++AC_SUBST([am__quote]) ++AC_MSG_RESULT([$_am_result]) ++rm -f confinc confmf ++]) ++ ++# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- ++ ++# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 4 ++ ++# AM_MISSING_PROG(NAME, PROGRAM) ++# ------------------------------ ++AC_DEFUN([AM_MISSING_PROG], ++[AC_REQUIRE([AM_MISSING_HAS_RUN]) ++$1=${$1-"${am_missing_run}$2"} ++AC_SUBST($1)]) ++ ++ ++# AM_MISSING_HAS_RUN ++# ------------------ ++# Define MISSING if not defined so far and test if it supports --run. ++# If it does, set am_missing_run to use it, otherwise, to nothing. ++AC_DEFUN([AM_MISSING_HAS_RUN], ++[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl ++test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" ++# Use eval to expand $SHELL ++if eval "$MISSING --run true"; then ++ am_missing_run="$MISSING --run " ++else ++ am_missing_run= ++ AC_MSG_WARN([`missing' script is too old or missing]) ++fi ++]) ++ ++# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# AM_PROG_MKDIR_P ++# --------------- ++# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. ++# ++# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories ++# created by `make install' are always world readable, even if the ++# installer happens to have an overly restrictive umask (e.g. 077). ++# This was a mistake. There are at least two reasons why we must not ++# use `-m 0755': ++# - it causes special bits like SGID to be ignored, ++# - it may be too restrictive (some setups expect 775 directories). ++# ++# Do not use -m 0755 and let people choose whatever they expect by ++# setting umask. ++# ++# We cannot accept any implementation of `mkdir' that recognizes `-p'. ++# Some implementations (such as Solaris 8's) are not thread-safe: if a ++# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' ++# concurrently, both version can detect that a/ is missing, but only ++# one can create it and the other will error out. Consequently we ++# restrict ourselves to GNU make (using the --version option ensures ++# this.) ++AC_DEFUN([AM_PROG_MKDIR_P], ++[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then ++ # We used to keeping the `.' as first argument, in order to ++ # allow $(mkdir_p) to be used without argument. As in ++ # $(mkdir_p) $(somedir) ++ # where $(somedir) is conditionally defined. However this is wrong ++ # for two reasons: ++ # 1. if the package is installed by a user who cannot write `.' ++ # make install will fail, ++ # 2. the above comment should most certainly read ++ # $(mkdir_p) $(DESTDIR)$(somedir) ++ # so it does not work when $(somedir) is undefined and ++ # $(DESTDIR) is not. ++ # To support the latter case, we have to write ++ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), ++ # so the `.' trick is pointless. ++ mkdir_p='mkdir -p --' ++else ++ # On NextStep and OpenStep, the `mkdir' command does not ++ # recognize any option. It will interpret all options as ++ # directories to create, and then abort because `.' already ++ # exists. ++ for d in ./-p ./--version; ++ do ++ test -d $d && rmdir $d ++ done ++ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. ++ if test -f "$ac_aux_dir/mkinstalldirs"; then ++ mkdir_p='$(mkinstalldirs)' ++ else ++ mkdir_p='$(install_sh) -d' ++ fi ++fi ++AC_SUBST([mkdir_p])]) ++ ++# Helper functions for option handling. -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 3 ++ ++# _AM_MANGLE_OPTION(NAME) ++# ----------------------- ++AC_DEFUN([_AM_MANGLE_OPTION], ++[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) ++ ++# _AM_SET_OPTION(NAME) ++# ------------------------------ ++# Set option NAME. Presently that only means defining a flag for this option. ++AC_DEFUN([_AM_SET_OPTION], ++[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) ++ ++# _AM_SET_OPTIONS(OPTIONS) ++# ---------------------------------- ++# OPTIONS is a space-separated list of Automake options. ++AC_DEFUN([_AM_SET_OPTIONS], ++[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) ++ ++# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) ++# ------------------------------------------- ++# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. ++AC_DEFUN([_AM_IF_OPTION], ++[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) ++ ++# Check to make sure that the build environment is sane. -*- Autoconf -*- ++ ++# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 4 ++ ++# AM_SANITY_CHECK ++# --------------- ++AC_DEFUN([AM_SANITY_CHECK], ++[AC_MSG_CHECKING([whether build environment is sane]) ++# Just in case ++sleep 1 ++echo timestamp > conftest.file ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` ++ if test "$[*]" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftest.file` ++ fi ++ rm -f conftest.file ++ if test "$[*]" != "X $srcdir/configure conftest.file" \ ++ && test "$[*]" != "X conftest.file $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken ++alias in your environment]) ++ fi ++ ++ test "$[2]" = conftest.file ++ ) ++then ++ # Ok. ++ : ++else ++ AC_MSG_ERROR([newly created file is older than distributed files! ++Check your system clock]) ++fi ++AC_MSG_RESULT(yes)]) ++ ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# AM_PROG_INSTALL_STRIP ++# --------------------- ++# One issue with vendor `install' (even GNU) is that you can't ++# specify the program used to strip binaries. This is especially ++# annoying in cross-compiling environments, where the build's strip ++# is unlikely to handle the host's binaries. ++# Fortunately install-sh will honor a STRIPPROG variable, so we ++# always use install-sh in `make install-strip', and initialize ++# STRIPPROG with the value of the STRIP variable (set by the user). ++AC_DEFUN([AM_PROG_INSTALL_STRIP], ++[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl ++# Installed binaries are usually stripped using `strip' when the user ++# run `make install-strip'. However `strip' might not be the right ++# tool to use in cross-compilation environments, therefore Automake ++# will honor the `STRIP' environment variable to overrule this program. ++dnl Don't test for $cross_compiling = yes, because it might be `maybe'. ++if test "$cross_compiling" != no; then ++ AC_CHECK_TOOL([STRIP], [strip], :) ++fi ++INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" ++AC_SUBST([INSTALL_STRIP_PROGRAM])]) ++ ++# Check how to create a tarball. -*- Autoconf -*- ++ ++# Copyright (C) 2004, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# serial 2 ++ ++# _AM_PROG_TAR(FORMAT) ++# -------------------- ++# Check how to create a tarball in format FORMAT. ++# FORMAT should be one of `v7', `ustar', or `pax'. ++# ++# Substitute a variable $(am__tar) that is a command ++# writing to stdout a FORMAT-tarball containing the directory ++# $tardir. ++# tardir=directory && $(am__tar) > result.tar ++# ++# Substitute a variable $(am__untar) that extract such ++# a tarball read from stdin. ++# $(am__untar) < result.tar ++AC_DEFUN([_AM_PROG_TAR], ++[# Always define AMTAR for backward compatibility. ++AM_MISSING_PROG([AMTAR], [tar]) ++m4_if([$1], [v7], ++ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], ++ [m4_case([$1], [ustar],, [pax],, ++ [m4_fatal([Unknown tar format])]) ++AC_MSG_CHECKING([how to create a $1 tar archive]) ++# Loop over all known methods to create a tar archive until one works. ++_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' ++_am_tools=${am_cv_prog_tar_$1-$_am_tools} ++# Do not fold the above two line into one, because Tru64 sh and ++# Solaris sh will not grok spaces in the rhs of `-'. ++for _am_tool in $_am_tools ++do ++ case $_am_tool in ++ gnutar) ++ for _am_tar in tar gnutar gtar; ++ do ++ AM_RUN_LOG([$_am_tar --version]) && break ++ done ++ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' ++ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' ++ am__untar="$_am_tar -xf -" ++ ;; ++ plaintar) ++ # Must skip GNU tar: if it does not support --format= it doesn't create ++ # ustar tarball either. ++ (tar --version) >/dev/null 2>&1 && continue ++ am__tar='tar chf - "$$tardir"' ++ am__tar_='tar chf - "$tardir"' ++ am__untar='tar xf -' ++ ;; ++ pax) ++ am__tar='pax -L -x $1 -w "$$tardir"' ++ am__tar_='pax -L -x $1 -w "$tardir"' ++ am__untar='pax -r' ++ ;; ++ cpio) ++ am__tar='find "$$tardir" -print | cpio -o -H $1 -L' ++ am__tar_='find "$tardir" -print | cpio -o -H $1 -L' ++ am__untar='cpio -i -H $1 -d' ++ ;; ++ none) ++ am__tar=false ++ am__tar_=false ++ am__untar=false ++ ;; ++ esac ++ ++ # If the value was cached, stop now. We just wanted to have am__tar ++ # and am__untar set. ++ test -n "${am_cv_prog_tar_$1}" && break ++ ++ # tar/untar a dummy directory, and stop if the command works ++ rm -rf conftest.dir ++ mkdir conftest.dir ++ echo GrepMe > conftest.dir/file ++ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) ++ rm -rf conftest.dir ++ if test -s conftest.tar; then ++ AM_RUN_LOG([$am__untar /dev/null 2>&1 && break ++ fi ++done ++rm -rf conftest.dir ++ ++AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) ++AC_MSG_RESULT([$am_cv_prog_tar_$1])]) ++AC_SUBST([am__tar]) ++AC_SUBST([am__untar]) ++]) # _AM_PROG_TAR ++ ++m4_include([../config/acx.m4]) ++m4_include([../config/depstand.m4]) ++m4_include([../config/lead-dot.m4]) ++m4_include([acinclude.m4]) +--- /dev/null ++++ b/convert/alloca.c +@@ -0,0 +1,479 @@ ++/* alloca.c -- allocate automatically reclaimed memory ++ (Mostly) portable public-domain implementation -- D A Gwyn ++ ++ This implementation of the PWB library alloca function, ++ which is used to allocate space off the run-time stack so ++ that it is automatically reclaimed upon procedure exit, ++ was inspired by discussions with J. Q. Johnson of Cornell. ++ J.Otto Tennant contributed the Cray support. ++ ++ There are some preprocessor constants that can ++ be defined when compiling for your specific system, for ++ improved efficiency; however, the defaults should be okay. ++ ++ The general concept of this implementation is to keep ++ track of all alloca-allocated blocks, and reclaim any ++ that are found to be deeper in the stack than the current ++ invocation. This heuristic does not reclaim storage as ++ soon as it becomes invalid, but it will do so eventually. ++ ++ As a special case, alloca(0) reclaims storage without ++ allocating any. It is a good idea to use alloca(0) in ++ your main control loop, etc. to force garbage collection. */ ++ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++/* If compiling with GCC, this file's not needed. */ ++#ifndef alloca ++ ++#ifdef emacs ++#ifdef static ++/* actually, only want this if static is defined as "" ++ -- this is for usg, in which emacs must undefine static ++ in order to make unexec workable ++ */ ++#ifndef STACK_DIRECTION ++you ++lose ++-- must know STACK_DIRECTION at compile-time ++#endif /* STACK_DIRECTION undefined */ ++#endif /* static */ ++#endif /* emacs */ ++ ++/* If your stack is a linked list of frames, you have to ++ provide an "address metric" ADDRESS_FUNCTION macro. */ ++ ++#if defined (CRAY) && defined (CRAY_STACKSEG_END) ++long i00afunc (); ++#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) ++#else ++#define ADDRESS_FUNCTION(arg) &(arg) ++#endif ++ ++#if __STDC__ ++#include ++typedef void *pointer; ++#else ++typedef char *pointer; ++typedef unsigned size_t; ++#endif ++ ++#ifndef NULL ++#define NULL 0 ++#endif ++ ++/* Different portions of Emacs need to call different versions of ++ malloc. The Emacs executable needs alloca to call xmalloc, because ++ ordinary malloc isn't protected from input signals. On the other ++ hand, the utilities in lib-src need alloca to call malloc; some of ++ them are very simple, and don't have an xmalloc routine. ++ ++ Non-Emacs programs expect this to call use xmalloc. ++ ++ Callers below should use malloc. */ ++ ++#ifndef emacs ++#define malloc xmalloc ++extern pointer xmalloc (); ++#endif ++ ++/* Define STACK_DIRECTION if you know the direction of stack ++ growth for your system; otherwise it will be automatically ++ deduced at run-time. ++ ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++ ++#ifndef STACK_DIRECTION ++#define STACK_DIRECTION 0 /* Direction unknown. */ ++#endif ++ ++#if STACK_DIRECTION != 0 ++ ++#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ ++ ++#else /* STACK_DIRECTION == 0; need run-time code. */ ++ ++static int stack_dir; /* 1 or -1 once known. */ ++#define STACK_DIR stack_dir ++ ++static void ++find_stack_direction () ++{ ++ static char *addr = NULL; /* Address of first `dummy', once known. */ ++ auto char dummy; /* To get stack address. */ ++ ++ if (addr == NULL) ++ { /* Initial entry. */ ++ addr = ADDRESS_FUNCTION (dummy); ++ ++ find_stack_direction (); /* Recurse once. */ ++ } ++ else ++ { ++ /* Second entry. */ ++ if (ADDRESS_FUNCTION (dummy) > addr) ++ stack_dir = 1; /* Stack grew upward. */ ++ else ++ stack_dir = -1; /* Stack grew downward. */ ++ } ++} ++ ++#endif /* STACK_DIRECTION == 0 */ ++ ++/* An "alloca header" is used to: ++ (a) chain together all alloca'ed blocks; ++ (b) keep track of stack depth. ++ ++ It is very important that sizeof(header) agree with malloc ++ alignment chunk size. The following default should work okay. */ ++ ++#ifndef ALIGN_SIZE ++#define ALIGN_SIZE sizeof(double) ++#endif ++ ++typedef union hdr ++{ ++ char align[ALIGN_SIZE]; /* To force sizeof(header). */ ++ struct ++ { ++ union hdr *next; /* For chaining headers. */ ++ char *deep; /* For stack depth measure. */ ++ } h; ++} header; ++ ++static header *last_alloca_header = NULL; /* -> last alloca header. */ ++ ++/* Return a pointer to at least SIZE bytes of storage, ++ which will be automatically reclaimed upon exit from ++ the procedure that called alloca. Originally, this space ++ was supposed to be taken from the current stack frame of the ++ caller, but that method cannot be made to work for some ++ implementations of C, for example under Gould's UTX/32. */ ++ ++pointer ++alloca (size) ++ size_t size; ++{ ++ auto char probe; /* Probes stack depth: */ ++ register char *depth = ADDRESS_FUNCTION (probe); ++ ++#if STACK_DIRECTION == 0 ++ if (STACK_DIR == 0) /* Unknown growth direction. */ ++ find_stack_direction (); ++#endif ++ ++ /* Reclaim garbage, defined as all alloca'd storage that ++ was allocated from deeper in the stack than currently. */ ++ ++ { ++ register header *hp; /* Traverses linked list. */ ++ ++ for (hp = last_alloca_header; hp != NULL;) ++ if ((STACK_DIR > 0 && hp->h.deep > depth) ++ || (STACK_DIR < 0 && hp->h.deep < depth)) ++ { ++ register header *np = hp->h.next; ++ ++ free ((pointer) hp); /* Collect garbage. */ ++ ++ hp = np; /* -> next header. */ ++ } ++ else ++ break; /* Rest are not deeper. */ ++ ++ last_alloca_header = hp; /* -> last valid storage. */ ++ } ++ ++ if (size == 0) ++ return NULL; /* No allocation required. */ ++ ++ /* Allocate combined header + user data storage. */ ++ ++ { ++ register pointer new = malloc (sizeof (header) + size); ++ /* Address of header. */ ++ ++ ((header *) new)->h.next = last_alloca_header; ++ ((header *) new)->h.deep = depth; ++ ++ last_alloca_header = (header *) new; ++ ++ /* User storage begins just after header. */ ++ ++ return (pointer) ((char *) new + sizeof (header)); ++ } ++} ++ ++#if defined (CRAY) && defined (CRAY_STACKSEG_END) ++ ++#ifdef DEBUG_I00AFUNC ++#include ++#endif ++ ++#ifndef CRAY_STACK ++#define CRAY_STACK ++#ifndef CRAY2 ++/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ ++struct stack_control_header ++ { ++ long shgrow:32; /* Number of times stack has grown. */ ++ long shaseg:32; /* Size of increments to stack. */ ++ long shhwm:32; /* High water mark of stack. */ ++ long shsize:32; /* Current size of stack (all segments). */ ++ }; ++ ++/* The stack segment linkage control information occurs at ++ the high-address end of a stack segment. (The stack ++ grows from low addresses to high addresses.) The initial ++ part of the stack segment linkage control information is ++ 0200 (octal) words. This provides for register storage ++ for the routine which overflows the stack. */ ++ ++struct stack_segment_linkage ++ { ++ long ss[0200]; /* 0200 overflow words. */ ++ long sssize:32; /* Number of words in this segment. */ ++ long ssbase:32; /* Offset to stack base. */ ++ long:32; ++ long sspseg:32; /* Offset to linkage control of previous ++ segment of stack. */ ++ long:32; ++ long sstcpt:32; /* Pointer to task common address block. */ ++ long sscsnm; /* Private control structure number for ++ microtasking. */ ++ long ssusr1; /* Reserved for user. */ ++ long ssusr2; /* Reserved for user. */ ++ long sstpid; /* Process ID for pid based multi-tasking. */ ++ long ssgvup; /* Pointer to multitasking thread giveup. */ ++ long sscray[7]; /* Reserved for Cray Research. */ ++ long ssa0; ++ long ssa1; ++ long ssa2; ++ long ssa3; ++ long ssa4; ++ long ssa5; ++ long ssa6; ++ long ssa7; ++ long sss0; ++ long sss1; ++ long sss2; ++ long sss3; ++ long sss4; ++ long sss5; ++ long sss6; ++ long sss7; ++ }; ++ ++#else /* CRAY2 */ ++/* The following structure defines the vector of words ++ returned by the STKSTAT library routine. */ ++struct stk_stat ++ { ++ long now; /* Current total stack size. */ ++ long maxc; /* Amount of contiguous space which would ++ be required to satisfy the maximum ++ stack demand to date. */ ++ long high_water; /* Stack high-water mark. */ ++ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ ++ long hits; /* Number of internal buffer hits. */ ++ long extends; /* Number of block extensions. */ ++ long stko_mallocs; /* Block allocations by $STKOFEN. */ ++ long underflows; /* Number of stack underflow calls ($STKRETN). */ ++ long stko_free; /* Number of deallocations by $STKRETN. */ ++ long stkm_free; /* Number of deallocations by $STKMRET. */ ++ long segments; /* Current number of stack segments. */ ++ long maxs; /* Maximum number of stack segments so far. */ ++ long pad_size; /* Stack pad size. */ ++ long current_address; /* Current stack segment address. */ ++ long current_size; /* Current stack segment size. This ++ number is actually corrupted by STKSTAT to ++ include the fifteen word trailer area. */ ++ long initial_address; /* Address of initial segment. */ ++ long initial_size; /* Size of initial segment. */ ++ }; ++ ++/* The following structure describes the data structure which trails ++ any stack segment. I think that the description in 'asdef' is ++ out of date. I only describe the parts that I am sure about. */ ++ ++struct stk_trailer ++ { ++ long this_address; /* Address of this block. */ ++ long this_size; /* Size of this block (does not include ++ this trailer). */ ++ long unknown2; ++ long unknown3; ++ long link; /* Address of trailer block of previous ++ segment. */ ++ long unknown5; ++ long unknown6; ++ long unknown7; ++ long unknown8; ++ long unknown9; ++ long unknown10; ++ long unknown11; ++ long unknown12; ++ long unknown13; ++ long unknown14; ++ }; ++ ++#endif /* CRAY2 */ ++#endif /* not CRAY_STACK */ ++ ++#ifdef CRAY2 ++/* Determine a "stack measure" for an arbitrary ADDRESS. ++ I doubt that "lint" will like this much. */ ++ ++static long ++i00afunc (long *address) ++{ ++ struct stk_stat status; ++ struct stk_trailer *trailer; ++ long *block, size; ++ long result = 0; ++ ++ /* We want to iterate through all of the segments. The first ++ step is to get the stack status structure. We could do this ++ more quickly and more directly, perhaps, by referencing the ++ $LM00 common block, but I know that this works. */ ++ ++ STKSTAT (&status); ++ ++ /* Set up the iteration. */ ++ ++ trailer = (struct stk_trailer *) (status.current_address ++ + status.current_size ++ - 15); ++ ++ /* There must be at least one stack segment. Therefore it is ++ a fatal error if "trailer" is null. */ ++ ++ if (trailer == 0) ++ abort (); ++ ++ /* Discard segments that do not contain our argument address. */ ++ ++ while (trailer != 0) ++ { ++ block = (long *) trailer->this_address; ++ size = trailer->this_size; ++ if (block == 0 || size == 0) ++ abort (); ++ trailer = (struct stk_trailer *) trailer->link; ++ if ((block <= address) && (address < (block + size))) ++ break; ++ } ++ ++ /* Set the result to the offset in this segment and add the sizes ++ of all predecessor segments. */ ++ ++ result = address - block; ++ ++ if (trailer == 0) ++ { ++ return result; ++ } ++ ++ do ++ { ++ if (trailer->this_size <= 0) ++ abort (); ++ result += trailer->this_size; ++ trailer = (struct stk_trailer *) trailer->link; ++ } ++ while (trailer != 0); ++ ++ /* We are done. Note that if you present a bogus address (one ++ not in any segment), you will get a different number back, formed ++ from subtracting the address of the first block. This is probably ++ not what you want. */ ++ ++ return (result); ++} ++ ++#else /* not CRAY2 */ ++/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. ++ Determine the number of the cell within the stack, ++ given the address of the cell. The purpose of this ++ routine is to linearize, in some sense, stack addresses ++ for alloca. */ ++ ++static long ++i00afunc (long address) ++{ ++ long stkl = 0; ++ ++ long size, pseg, this_segment, stack; ++ long result = 0; ++ ++ struct stack_segment_linkage *ssptr; ++ ++ /* Register B67 contains the address of the end of the ++ current stack segment. If you (as a subprogram) store ++ your registers on the stack and find that you are past ++ the contents of B67, you have overflowed the segment. ++ ++ B67 also points to the stack segment linkage control ++ area, which is what we are really interested in. */ ++ ++ stkl = CRAY_STACKSEG_END (); ++ ssptr = (struct stack_segment_linkage *) stkl; ++ ++ /* If one subtracts 'size' from the end of the segment, ++ one has the address of the first word of the segment. ++ ++ If this is not the first segment, 'pseg' will be ++ nonzero. */ ++ ++ pseg = ssptr->sspseg; ++ size = ssptr->sssize; ++ ++ this_segment = stkl - size; ++ ++ /* It is possible that calling this routine itself caused ++ a stack overflow. Discard stack segments which do not ++ contain the target address. */ ++ ++ while (!(this_segment <= address && address <= stkl)) ++ { ++#ifdef DEBUG_I00AFUNC ++ fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); ++#endif ++ if (pseg == 0) ++ break; ++ stkl = stkl - pseg; ++ ssptr = (struct stack_segment_linkage *) stkl; ++ size = ssptr->sssize; ++ pseg = ssptr->sspseg; ++ this_segment = stkl - size; ++ } ++ ++ result = address - this_segment; ++ ++ /* If you subtract pseg from the current end of the stack, ++ you get the address of the previous stack segment's end. ++ This seems a little convoluted to me, but I'll bet you save ++ a cycle somewhere. */ ++ ++ while (pseg != 0) ++ { ++#ifdef DEBUG_I00AFUNC ++ fprintf (stderr, "%011o %011o\n", pseg, size); ++#endif ++ stkl = stkl - pseg; ++ ssptr = (struct stack_segment_linkage *) stkl; ++ size = ssptr->sssize; ++ pseg = ssptr->sspseg; ++ result += size; ++ } ++ return (result); ++} ++ ++#endif /* not CRAY2 */ ++#endif /* CRAY */ ++ ++#endif /* no alloca */ +--- /dev/null ++++ b/convert/bin.c +@@ -0,0 +1,68 @@ ++/* bin.c -- Raw Binary Output ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++#define BUFSIZE 8192 /* max bytes per block */ ++ ++static FILE *binfp; ++static unsigned long binfirst = ~0; ++static unsigned long binaddr = ~0; ++static int binlen; ++static unsigned char *binbuf; ++ ++static void ++binFlush () ++{ ++ if (binlen > 0) { ++ fseek (binfp, binaddr - binfirst, 0); ++ fwrite (binbuf, 1, binlen, binfp); ++ binlen = 0; ++ } ++} ++ ++void ++BinStart (FILE *fp, unsigned long ep) ++{ ++ binbuf = xmalloc (BUFSIZE); ++ binfp = fp; ++} ++ ++ ++void ++BinOutput (unsigned long addr, unsigned char byte) ++{ ++ if (addr != binaddr + binlen || binlen == BUFSIZE) { ++ binFlush (); ++ binaddr = addr; ++ if (binfirst == ~0) ++ binfirst = addr; ++ } ++ binbuf[binlen++] = byte; ++} ++ ++ ++void ++BinEnd (unsigned long ep) ++{ ++ binFlush (); ++ free (binbuf); ++} ++ +--- /dev/null ++++ b/convert/config.h.in +@@ -0,0 +1,105 @@ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. ++ */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++#undef C_ALLOCA ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#undef HAVE_ALLOCA ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). ++ */ ++#undef HAVE_ALLOCA_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_FCNTL_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_INTTYPES_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_LIMITS_H ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#undef HAVE_MEMCPY ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_MEMORY_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDDEF_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDINT_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDLIB_H ++ ++/* Define to 1 if you have the `strchr' function. */ ++#undef HAVE_STRCHR ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STRINGS_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STRING_H ++ ++/* Define to 1 if you have the `strtok' function. */ ++#undef HAVE_STRTOK ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_FILE_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_STAT_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_TYPES_H ++ ++/* Define to 1 if you have the header file. */ ++#undef HAVE_UNISTD_H ++ ++/* Name of package */ ++#undef PACKAGE ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#undef PACKAGE_BUGREPORT ++ ++/* Define to the full name of this package. */ ++#undef PACKAGE_NAME ++ ++/* Define to the full name and version of this package. */ ++#undef PACKAGE_STRING ++ ++/* Define to the one symbol short name of this package. */ ++#undef PACKAGE_TARNAME ++ ++/* Define to the version of this package. */ ++#undef PACKAGE_VERSION ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at runtime. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++#undef STACK_DIRECTION ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#undef STDC_HEADERS ++ ++/* Use b modifier when opening binary files? */ ++#undef USE_BINARY_FOPEN ++ ++/* Version number of package */ ++#undef VERSION ++ ++/* Define to empty if `const' does not conform to ANSI C. */ ++#undef const ++ ++/* Define to `unsigned int' if does not define. */ ++#undef size_t +--- /dev/null ++++ b/convert/configure +@@ -0,0 +1,6916 @@ ++#! /bin/sh ++# Guess values for system-dependent variables and create Makefiles. ++# Generated by GNU Autoconf 2.61 for convert 3.0.4. ++# ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be more Bourne compatible ++DUALCASE=1; export DUALCASE # for MKS sh ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++ ++ ++# PATH needs CR ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# IFS ++# We need space, tab and new line, in precisely that order. Quoting is ++# there to prevent editors from complaining about space-tab. ++# (If _AS_PATH_WALK were called with IFS unset, it would disable word ++# splitting by setting IFS to empty value.) ++as_nl=' ++' ++IFS=" "" $as_nl" ++ ++# Find who we are. Look in the path if we contain no directory separator. ++case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++# We did not find ourselves, most probably we were run as `sh COMMAND' ++# in which case we are not to be found in the path. ++if test "x$as_myself" = x; then ++ as_myself=$0 ++fi ++if test ! -f "$as_myself"; then ++ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ { (exit 1); exit 1; } ++fi ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++for as_var in ENV MAIL MAILPATH ++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++done ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename -- "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ ++# CDPATH. ++$as_unset CDPATH ++ ++ ++if test "x$CONFIG_SHELL" = x; then ++ if (eval ":") 2>/dev/null; then ++ as_have_required=yes ++else ++ as_have_required=no ++fi ++ ++ if test $as_have_required = yes && (eval ": ++(as_func_return () { ++ (exit \$1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test \$exitcode = 0) || { (exit 1); exit 1; } ++ ++( ++ as_lineno_1=\$LINENO ++ as_lineno_2=\$LINENO ++ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && ++ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ++") 2> /dev/null; then ++ : ++else ++ as_candidate_shells= ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ case $as_dir in ++ /*) ++ for as_base in sh bash ksh sh5; do ++ as_candidate_shells="$as_candidate_shells $as_dir/$as_base" ++ done;; ++ esac ++done ++IFS=$as_save_IFS ++ ++ ++ for as_shell in $as_candidate_shells $SHELL; do ++ # Try only shells that exist, to save several forks. ++ if { test -f "$as_shell" || test -f "$as_shell.exe"; } && ++ { ("$as_shell") 2> /dev/null <<\_ASEOF ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++: ++_ASEOF ++}; then ++ CONFIG_SHELL=$as_shell ++ as_have_required=yes ++ if { "$as_shell" 2> /dev/null <<\_ASEOF ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++: ++(as_func_return () { ++ (exit $1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = "$1" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test $exitcode = 0) || { (exit 1); exit 1; } ++ ++( ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } ++ ++_ASEOF ++}; then ++ break ++fi ++ ++fi ++ ++ done ++ ++ if test "x$CONFIG_SHELL" != x; then ++ for as_var in BASH_ENV ENV ++ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ done ++ export CONFIG_SHELL ++ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} ++fi ++ ++ ++ if test $as_have_required = no; then ++ echo This script requires a shell more modern than all the ++ echo shells that I found on your system. Please install a ++ echo modern shell, or manually run the script under such a ++ echo shell if you do have one. ++ { (exit 1); exit 1; } ++fi ++ ++ ++fi ++ ++fi ++ ++ ++ ++(eval "as_func_return () { ++ (exit \$1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test \$exitcode = 0") || { ++ echo No shell found that supports shell functions. ++ echo Please tell autoconf@gnu.org about your system, ++ echo including any error possibly output before this ++ echo message ++} ++ ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line after each line using $LINENO; the second 'sed' ++ # does the real work. The second script uses 'N' to pair each ++ # line-number line with the line containing $LINENO, and appends ++ # trailing '-' during substitution so that $LINENO is not a special ++ # case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # scripts with optimization help from Paolo Bonzini. Blame Lee ++ # E. McMahon (1931-1989) for sed's syntax. :-) ++ sed -n ' ++ p ++ /[$]LINENO/= ++ ' <$as_myself | ++ sed ' ++ s/[$]LINENO.*/&-/ ++ t lineno ++ b ++ :lineno ++ N ++ :loop ++ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ ++ t loop ++ s/-\n.*// ++ ' >$as_me.lineno && ++ chmod +x "$as_me.lineno" || ++ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensitive to this). ++ . "./$as_me.lineno" ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then ++ as_dirname=dirname ++else ++ as_dirname=false ++fi ++ ++ECHO_C= ECHO_N= ECHO_T= ++case `echo -n x` in ++-n*) ++ case `echo 'x\c'` in ++ *c*) ECHO_T=' ';; # ECHO_T is single tab character. ++ *) ECHO_C='\c';; ++ esac;; ++*) ++ ECHO_N='-n';; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++if test -d conf$$.dir; then ++ rm -f conf$$.dir/conf$$.file ++else ++ rm -f conf$$.dir ++ mkdir conf$$.dir ++fi ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s='ln -s' ++ # ... but there are two gotchas: ++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. ++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. ++ # In both cases, we have to default to `cp -p'. ++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ++ as_ln_s='cp -p' ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file ++rmdir conf$$.dir 2>/dev/null ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++if test -x / >/dev/null 2>&1; then ++ as_test_x='test -x' ++else ++ if ls -dL / >/dev/null 2>&1; then ++ as_ls_L_option=L ++ else ++ as_ls_L_option= ++ fi ++ as_test_x=' ++ eval sh -c '\'' ++ if test -d "$1"; then ++ test -d "$1/."; ++ else ++ case $1 in ++ -*)set "./$1";; ++ esac; ++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ++ ???[sx]*):;;*)false;;esac;fi ++ '\'' sh ++ ' ++fi ++as_executable_p=$as_test_x ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ ++ ++ ++exec 7<&0 &1 ++ ++# Name of the host. ++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# so uname gets run too. ++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` ++ ++# ++# Initializations. ++# ++ac_default_prefix=/usr/local ++ac_clean_files= ++ac_config_libobj_dir=. ++LIBOBJS= ++cross_compiling=no ++subdirs= ++MFLAGS= ++MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++ ++# Identity of this package. ++PACKAGE_NAME='convert' ++PACKAGE_TARNAME='convert' ++PACKAGE_VERSION='3.0.4' ++PACKAGE_STRING='convert 3.0.4' ++PACKAGE_BUGREPORT='' ++ ++ac_unique_file="convert.c" ++# Factoring default headers for most tests. ++ac_includes_default="\ ++#include ++#ifdef HAVE_SYS_TYPES_H ++# include ++#endif ++#ifdef HAVE_SYS_STAT_H ++# include ++#endif ++#ifdef STDC_HEADERS ++# include ++# include ++#else ++# ifdef HAVE_STDLIB_H ++# include ++# endif ++#endif ++#ifdef HAVE_STRING_H ++# if !defined STDC_HEADERS && defined HAVE_MEMORY_H ++# include ++# endif ++# include ++#endif ++#ifdef HAVE_STRINGS_H ++# include ++#endif ++#ifdef HAVE_INTTYPES_H ++# include ++#endif ++#ifdef HAVE_STDINT_H ++# include ++#endif ++#ifdef HAVE_UNISTD_H ++# include ++#endif" ++ ++ac_subst_vars='SHELL ++PATH_SEPARATOR ++PACKAGE_NAME ++PACKAGE_TARNAME ++PACKAGE_VERSION ++PACKAGE_STRING ++PACKAGE_BUGREPORT ++exec_prefix ++prefix ++program_transform_name ++bindir ++sbindir ++libexecdir ++datarootdir ++datadir ++sysconfdir ++sharedstatedir ++localstatedir ++includedir ++oldincludedir ++docdir ++infodir ++htmldir ++dvidir ++pdfdir ++psdir ++libdir ++localedir ++mandir ++DEFS ++ECHO_C ++ECHO_N ++ECHO_T ++LIBS ++build_alias ++host_alias ++target_alias ++build ++build_cpu ++build_vendor ++build_os ++host ++host_cpu ++host_vendor ++host_os ++target ++target_cpu ++target_vendor ++target_os ++INSTALL_PROGRAM ++INSTALL_SCRIPT ++INSTALL_DATA ++CYGPATH_W ++PACKAGE ++VERSION ++ACLOCAL ++AUTOCONF ++AUTOMAKE ++AUTOHEADER ++MAKEINFO ++install_sh ++STRIP ++INSTALL_STRIP_PROGRAM ++mkdir_p ++AWK ++SET_MAKE ++am__leading_dot ++AMTAR ++am__tar ++am__untar ++CC ++CFLAGS ++LDFLAGS ++CPPFLAGS ++ac_ct_CC ++EXEEXT ++OBJEXT ++DEPDIR ++am__include ++am__quote ++AMDEP_TRUE ++AMDEP_FALSE ++AMDEPBACKSLASH ++CCDEPMODE ++am__fastdepCC_TRUE ++am__fastdepCC_FALSE ++CPP ++GREP ++EGREP ++ALLOCA ++PKGVERSION ++REPORT_BUGS_TO ++REPORT_BUGS_TEXI ++MAINTAINER_MODE_TRUE ++MAINTAINER_MODE_FALSE ++MAINT ++LIBOBJS ++LTLIBOBJS' ++ac_subst_files='' ++ ac_precious_vars='build_alias ++host_alias ++target_alias ++CC ++CFLAGS ++LDFLAGS ++LIBS ++CPPFLAGS ++CPP' ++ ++ ++# Initialize some variables set by options. ++ac_init_help= ++ac_init_version=false ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++cache_file=/dev/null ++exec_prefix=NONE ++no_create= ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++verbose= ++x_includes=NONE ++x_libraries=NONE ++ ++# Installation directory options. ++# These are left unexpanded so users can "make install exec_prefix=/foo" ++# and all the variables that are supposed to be based on exec_prefix ++# by default will actually change. ++# Use braces instead of parens because sh, perl, etc. also accept them. ++# (The list follows the same order as the GNU Coding Standards.) ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datarootdir='${prefix}/share' ++datadir='${datarootdir}' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' ++infodir='${datarootdir}/info' ++htmldir='${docdir}' ++dvidir='${docdir}' ++pdfdir='${docdir}' ++psdir='${docdir}' ++libdir='${exec_prefix}/lib' ++localedir='${datarootdir}/locale' ++mandir='${datarootdir}/man' ++ ++ac_prev= ++ac_dashdash= ++for ac_option ++do ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval $ac_prev=\$ac_option ++ ac_prev= ++ continue ++ fi ++ ++ case $ac_option in ++ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; ++ *) ac_optarg=yes ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case $ac_dashdash$ac_option in ++ --) ++ ac_dashdash=yes ;; ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir=$ac_optarg ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build_alias ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build_alias=$ac_optarg ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file=$ac_optarg ;; ++ ++ --config-cache | -C) ++ cache_file=config.cache ;; ++ ++ -datadir | --datadir | --datadi | --datad) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=*) ++ datadir=$ac_optarg ;; ++ ++ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ ++ | --dataroo | --dataro | --datar) ++ ac_prev=datarootdir ;; ++ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ ++ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) ++ datarootdir=$ac_optarg ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` ++ eval enable_$ac_feature=no ;; ++ ++ -docdir | --docdir | --docdi | --doc | --do) ++ ac_prev=docdir ;; ++ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) ++ docdir=$ac_optarg ;; ++ ++ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ++ ac_prev=dvidir ;; ++ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) ++ dvidir=$ac_optarg ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` ++ eval enable_$ac_feature=\$ac_optarg ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix=$ac_optarg ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he | -h) ++ ac_init_help=long ;; ++ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ++ ac_init_help=recursive ;; ++ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ++ ac_init_help=short ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host_alias ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host_alias=$ac_optarg ;; ++ ++ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ++ ac_prev=htmldir ;; ++ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ ++ | --ht=*) ++ htmldir=$ac_optarg ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir=$ac_optarg ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir=$ac_optarg ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir=$ac_optarg ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir=$ac_optarg ;; ++ ++ -localedir | --localedir | --localedi | --localed | --locale) ++ ac_prev=localedir ;; ++ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) ++ localedir=$ac_optarg ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst | --locals) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) ++ localstatedir=$ac_optarg ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir=$ac_optarg ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c | -n) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir=$ac_optarg ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix=$ac_optarg ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix=$ac_optarg ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix=$ac_optarg ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name=$ac_optarg ;; ++ ++ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ++ ac_prev=pdfdir ;; ++ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) ++ pdfdir=$ac_optarg ;; ++ ++ -psdir | --psdir | --psdi | --psd | --ps) ++ ac_prev=psdir ;; ++ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) ++ psdir=$ac_optarg ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir=$ac_optarg ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir=$ac_optarg ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site=$ac_optarg ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir=$ac_optarg ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir=$ac_optarg ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target_alias ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target_alias=$ac_optarg ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers | -V) ++ ac_init_version=: ;; ++ ++ -with-* | --with-*) ++ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } ++ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` ++ eval with_$ac_package=\$ac_optarg ;; ++ ++ -without-* | --without-*) ++ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } ++ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` ++ eval with_$ac_package=no ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes=$ac_optarg ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries=$ac_optarg ;; ++ ++ -*) { echo "$as_me: error: unrecognized option: $ac_option ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; } ++ ;; ++ ++ *=*) ++ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 ++ { (exit 1); exit 1; }; } ++ eval $ac_envvar=\$ac_optarg ++ export $ac_envvar ;; ++ ++ *) ++ # FIXME: should be removed in autoconf 3.0. ++ echo "$as_me: WARNING: you should use --build, --host, --target" >&2 ++ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ echo "$as_me: WARNING: invalid host type: $ac_option" >&2 ++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ ac_option=--`echo $ac_prev | sed 's/_/-/g'` ++ { echo "$as_me: error: missing argument to $ac_option" >&2 ++ { (exit 1); exit 1; }; } ++fi ++ ++# Be sure to have absolute directory names. ++for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ ++ datadir sysconfdir sharedstatedir localstatedir includedir \ ++ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ ++ libdir localedir mandir ++do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ [\\/$]* | ?:[\\/]* ) continue;; ++ NONE | '' ) case $ac_var in *prefix ) continue;; esac;; ++ esac ++ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 ++ { (exit 1); exit 1; }; } ++done ++ ++# There might be people who depend on the old broken behavior: `$host' ++# used to hold the argument of --host etc. ++# FIXME: To remove some day. ++build=$build_alias ++host=$host_alias ++target=$target_alias ++ ++# FIXME: To remove some day. ++if test "x$host_alias" != x; then ++ if test "x$build_alias" = x; then ++ cross_compiling=maybe ++ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. ++ If a cross compiler is detected then cross compile mode will be used." >&2 ++ elif test "x$build_alias" != "x$host_alias"; then ++ cross_compiling=yes ++ fi ++fi ++ ++ac_tool_prefix= ++test -n "$host_alias" && ac_tool_prefix=$host_alias- ++ ++test "$silent" = yes && exec 6>/dev/null ++ ++ ++ac_pwd=`pwd` && test -n "$ac_pwd" && ++ac_ls_di=`ls -di .` && ++ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || ++ { echo "$as_me: error: Working directory cannot be determined" >&2 ++ { (exit 1); exit 1; }; } ++test "X$ac_ls_di" = "X$ac_pwd_ls_di" || ++ { echo "$as_me: error: pwd does not report name of working directory" >&2 ++ { (exit 1); exit 1; }; } ++ ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then the parent directory. ++ ac_confdir=`$as_dirname -- "$0" || ++$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$0" : 'X\(//\)[^/]' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$0" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ srcdir=$ac_confdir ++ if test ! -r "$srcdir/$ac_unique_file"; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r "$srcdir/$ac_unique_file"; then ++ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." ++ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 ++ { (exit 1); exit 1; }; } ++fi ++ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ++ac_abs_confdir=`( ++ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 ++ { (exit 1); exit 1; }; } ++ pwd)` ++# When building in place, set srcdir=. ++if test "$ac_abs_confdir" = "$ac_pwd"; then ++ srcdir=. ++fi ++# Remove unnecessary trailing slashes from srcdir. ++# Double slashes in file names in object file debugging info ++# mess up M-x gdb in Emacs. ++case $srcdir in ++*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; ++esac ++for ac_var in $ac_precious_vars; do ++ eval ac_env_${ac_var}_set=\${${ac_var}+set} ++ eval ac_env_${ac_var}_value=\$${ac_var} ++ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} ++ eval ac_cv_env_${ac_var}_value=\$${ac_var} ++done ++ ++# ++# Report the --help message. ++# ++if test "$ac_init_help" = "long"; then ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat <<_ACEOF ++\`configure' configures convert 3.0.4 to adapt to many kinds of systems. ++ ++Usage: $0 [OPTION]... [VAR=VALUE]... ++ ++To assign environment variables (e.g., CC, CFLAGS...), specify them as ++VAR=VALUE. See below for descriptions of some of the useful variables. ++ ++Defaults for the options are specified in brackets. ++ ++Configuration: ++ -h, --help display this help and exit ++ --help=short display options specific to this package ++ --help=recursive display the short help of all the included packages ++ -V, --version display version information and exit ++ -q, --quiet, --silent do not print \`checking...' messages ++ --cache-file=FILE cache test results in FILE [disabled] ++ -C, --config-cache alias for \`--cache-file=config.cache' ++ -n, --no-create do not create output files ++ --srcdir=DIR find the sources in DIR [configure dir or \`..'] ++ ++Installation directories: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [PREFIX] ++ ++By default, \`make install' will install all the files in ++\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify ++an installation prefix other than \`$ac_default_prefix' using \`--prefix', ++for instance \`--prefix=\$HOME'. ++ ++For better control, use the options below. ++ ++Fine tuning of the installation directories: ++ --bindir=DIR user executables [EPREFIX/bin] ++ --sbindir=DIR system admin executables [EPREFIX/sbin] ++ --libexecdir=DIR program executables [EPREFIX/libexec] ++ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data [PREFIX/var] ++ --libdir=DIR object code libraries [EPREFIX/lib] ++ --includedir=DIR C header files [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc [/usr/include] ++ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] ++ --datadir=DIR read-only architecture-independent data [DATAROOTDIR] ++ --infodir=DIR info documentation [DATAROOTDIR/info] ++ --localedir=DIR locale-dependent data [DATAROOTDIR/locale] ++ --mandir=DIR man documentation [DATAROOTDIR/man] ++ --docdir=DIR documentation root [DATAROOTDIR/doc/convert] ++ --htmldir=DIR html documentation [DOCDIR] ++ --dvidir=DIR dvi documentation [DOCDIR] ++ --pdfdir=DIR pdf documentation [DOCDIR] ++ --psdir=DIR ps documentation [DOCDIR] ++_ACEOF ++ ++ cat <<\_ACEOF ++ ++Program names: ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM run sed PROGRAM on installed program names ++ ++System types: ++ --build=BUILD configure for building on BUILD [guessed] ++ --host=HOST cross-compile to build programs to run on HOST [BUILD] ++ --target=TARGET configure for building compilers for TARGET [HOST] ++_ACEOF ++fi ++ ++if test -n "$ac_init_help"; then ++ case $ac_init_help in ++ short | recursive ) echo "Configuration of convert 3.0.4:";; ++ esac ++ cat <<\_ACEOF ++ ++Optional Features: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --disable-dependency-tracking speeds up one-time build ++ --enable-dependency-tracking do not reject slow dependency extractors ++ --enable-maintainer-mode enable make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer ++ ++Optional Packages: ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --with-pkgversion=PKG Use PKG in the version string in place of "MIPS ++ Convert" ++ --with-bugurl=URL Direct users to URL to report a bug ++ ++Some influential environment variables: ++ CC C compiler command ++ CFLAGS C compiler flags ++ LDFLAGS linker flags, e.g. -L if you have libraries in a ++ nonstandard directory ++ LIBS libraries to pass to the linker, e.g. -l ++ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if ++ you have headers in a nonstandard directory ++ CPP C preprocessor ++ ++Use these variables to override the choices made by `configure' or to help ++it to find libraries and programs with nonstandard names/locations. ++ ++_ACEOF ++ac_status=$? ++fi ++ ++if test "$ac_init_help" = "recursive"; then ++ # If there are subdirs, report their specific --help. ++ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue ++ test -d "$ac_dir" || continue ++ ac_builddir=. ++ ++case "$ac_dir" in ++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; ++*) ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A ".." for each directory in $ac_dir_suffix. ++ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` ++ case $ac_top_builddir_sub in ++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; ++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; ++ esac ;; ++esac ++ac_abs_top_builddir=$ac_pwd ++ac_abs_builddir=$ac_pwd$ac_dir_suffix ++# for backward compatibility: ++ac_top_builddir=$ac_top_build_prefix ++ ++case $srcdir in ++ .) # We are building in place. ++ ac_srcdir=. ++ ac_top_srcdir=$ac_top_builddir_sub ++ ac_abs_top_srcdir=$ac_pwd ;; ++ [\\/]* | ?:[\\/]* ) # Absolute name. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ++ ac_abs_top_srcdir=$srcdir ;; ++ *) # Relative name. ++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_build_prefix$srcdir ++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; ++esac ++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix ++ ++ cd "$ac_dir" || { ac_status=$?; continue; } ++ # Check for guested configure. ++ if test -f "$ac_srcdir/configure.gnu"; then ++ echo && ++ $SHELL "$ac_srcdir/configure.gnu" --help=recursive ++ elif test -f "$ac_srcdir/configure"; then ++ echo && ++ $SHELL "$ac_srcdir/configure" --help=recursive ++ else ++ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 ++ fi || ac_status=$? ++ cd "$ac_pwd" || { ac_status=$?; break; } ++ done ++fi ++ ++test -n "$ac_init_help" && exit $ac_status ++if $ac_init_version; then ++ cat <<\_ACEOF ++convert configure 3.0.4 ++generated by GNU Autoconf 2.61 ++ ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++This configure script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it. ++_ACEOF ++ exit ++fi ++cat >config.log <<_ACEOF ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++ ++It was created by convert $as_me 3.0.4, which was ++generated by GNU Autoconf 2.61. Invocation command line was ++ ++ $ $0 $@ ++ ++_ACEOF ++exec 5>>config.log ++{ ++cat <<_ASUNAME ++## --------- ## ++## Platform. ## ++## --------- ## ++ ++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` ++uname -m = `(uname -m) 2>/dev/null || echo unknown` ++uname -r = `(uname -r) 2>/dev/null || echo unknown` ++uname -s = `(uname -s) 2>/dev/null || echo unknown` ++uname -v = `(uname -v) 2>/dev/null || echo unknown` ++ ++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` ++/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` ++ ++/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` ++/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` ++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` ++/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` ++/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` ++/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` ++/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` ++ ++_ASUNAME ++ ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ echo "PATH: $as_dir" ++done ++IFS=$as_save_IFS ++ ++} >&5 ++ ++cat >&5 <<_ACEOF ++ ++ ++## ----------- ## ++## Core tests. ## ++## ----------- ## ++ ++_ACEOF ++ ++ ++# Keep a trace of the command line. ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Strip out --silent because we don't want to record it for future runs. ++# Also quote any args containing shell meta-characters. ++# Make two passes to allow for proper duplicate-argument suppression. ++ac_configure_args= ++ac_configure_args0= ++ac_configure_args1= ++ac_must_keep_next=false ++for ac_pass in 1 2 ++do ++ for ac_arg ++ do ++ case $ac_arg in ++ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ continue ;; ++ *\'*) ++ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ esac ++ case $ac_pass in ++ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; ++ 2) ++ ac_configure_args1="$ac_configure_args1 '$ac_arg'" ++ if test $ac_must_keep_next = true; then ++ ac_must_keep_next=false # Got value, back to normal. ++ else ++ case $ac_arg in ++ *=* | --config-cache | -C | -disable-* | --disable-* \ ++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ ++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ ++ | -with-* | --with-* | -without-* | --without-* | --x) ++ case "$ac_configure_args0 " in ++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; ++ esac ++ ;; ++ -* ) ac_must_keep_next=true ;; ++ esac ++ fi ++ ac_configure_args="$ac_configure_args '$ac_arg'" ++ ;; ++ esac ++ done ++done ++$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } ++$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } ++ ++# When interrupted or exit'd, cleanup temporary files, and complete ++# config.log. We remove comments because anyway the quotes in there ++# would cause problems or look ugly. ++# WARNING: Use '\'' to represent an apostrophe within the trap. ++# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. ++trap 'exit_status=$? ++ # Save into config.log some information that might help in debugging. ++ { ++ echo ++ ++ cat <<\_ASBOX ++## ---------------- ## ++## Cache variables. ## ++## ---------------- ## ++_ASBOX ++ echo ++ # The following way of writing the cache mishandles newlines in values, ++( ++ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do ++ eval ac_val=\$$ac_var ++ case $ac_val in #( ++ *${as_nl}*) ++ case $ac_var in #( ++ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 ++echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; ++ esac ++ case $ac_var in #( ++ _ | IFS | as_nl) ;; #( ++ *) $as_unset $ac_var ;; ++ esac ;; ++ esac ++ done ++ (set) 2>&1 | ++ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( ++ *${as_nl}ac_space=\ *) ++ sed -n \ ++ "s/'\''/'\''\\\\'\'''\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ++ ;; #( ++ *) ++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ++ ;; ++ esac | ++ sort ++) ++ echo ++ ++ cat <<\_ASBOX ++## ----------------- ## ++## Output variables. ## ++## ----------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_vars ++ do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ esac ++ echo "$ac_var='\''$ac_val'\''" ++ done | sort ++ echo ++ ++ if test -n "$ac_subst_files"; then ++ cat <<\_ASBOX ++## ------------------- ## ++## File substitutions. ## ++## ------------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_files ++ do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ esac ++ echo "$ac_var='\''$ac_val'\''" ++ done | sort ++ echo ++ fi ++ ++ if test -s confdefs.h; then ++ cat <<\_ASBOX ++## ----------- ## ++## confdefs.h. ## ++## ----------- ## ++_ASBOX ++ echo ++ cat confdefs.h ++ echo ++ fi ++ test "$ac_signal" != 0 && ++ echo "$as_me: caught signal $ac_signal" ++ echo "$as_me: exit $exit_status" ++ } >&5 ++ rm -f core *.core core.conftest.* && ++ rm -f -r conftest* confdefs* conf$$* $ac_clean_files && ++ exit $exit_status ++' 0 ++for ac_signal in 1 2 13 15; do ++ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal ++done ++ac_signal=0 ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -f -r conftest* confdefs.h ++ ++# Predefined preprocessor variables. ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_NAME "$PACKAGE_NAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_TARNAME "$PACKAGE_TARNAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_VERSION "$PACKAGE_VERSION" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_STRING "$PACKAGE_STRING" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" ++_ACEOF ++ ++ ++# Let the site file select an alternate cache file if it wants to. ++# Prefer explicitly selected file to automatically selected ones. ++if test -n "$CONFIG_SITE"; then ++ set x "$CONFIG_SITE" ++elif test "x$prefix" != xNONE; then ++ set x "$prefix/share/config.site" "$prefix/etc/config.site" ++else ++ set x "$ac_default_prefix/share/config.site" \ ++ "$ac_default_prefix/etc/config.site" ++fi ++shift ++for ac_site_file ++do ++ if test -r "$ac_site_file"; then ++ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 ++echo "$as_me: loading site script $ac_site_file" >&6;} ++ sed 's/^/| /' "$ac_site_file" >&5 ++ . "$ac_site_file" ++ fi ++done ++ ++if test -r "$cache_file"; then ++ # Some versions of bash will fail to source /dev/null (special ++ # files actually), so we avoid doing that. ++ if test -f "$cache_file"; then ++ { echo "$as_me:$LINENO: loading cache $cache_file" >&5 ++echo "$as_me: loading cache $cache_file" >&6;} ++ case $cache_file in ++ [\\/]* | ?:[\\/]* ) . "$cache_file";; ++ *) . "./$cache_file";; ++ esac ++ fi ++else ++ { echo "$as_me:$LINENO: creating cache $cache_file" >&5 ++echo "$as_me: creating cache $cache_file" >&6;} ++ >$cache_file ++fi ++ ++# Check that the precious variables saved in the cache have kept the same ++# value. ++ac_cache_corrupted=false ++for ac_var in $ac_precious_vars; do ++ eval ac_old_set=\$ac_cv_env_${ac_var}_set ++ eval ac_new_set=\$ac_env_${ac_var}_set ++ eval ac_old_val=\$ac_cv_env_${ac_var}_value ++ eval ac_new_val=\$ac_env_${ac_var}_value ++ case $ac_old_set,$ac_new_set in ++ set,) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,set) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,);; ++ *) ++ if test "x$ac_old_val" != "x$ac_new_val"; then ++ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 ++echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ++ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 ++echo "$as_me: former value: $ac_old_val" >&2;} ++ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 ++echo "$as_me: current value: $ac_new_val" >&2;} ++ ac_cache_corrupted=: ++ fi;; ++ esac ++ # Pass precious variables to config.status. ++ if test "$ac_new_set" = set; then ++ case $ac_new_val in ++ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *) ac_arg=$ac_var=$ac_new_val ;; ++ esac ++ case " $ac_configure_args " in ++ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. ++ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ esac ++ fi ++done ++if $ac_cache_corrupted; then ++ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 ++echo "$as_me: error: changes in the environment can compromise the build" >&2;} ++ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 ++echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ac_aux_dir= ++for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do ++ if test -f "$ac_dir/install-sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f "$ac_dir/install.sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ elif test -f "$ac_dir/shtool"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break ++ fi ++done ++if test -z "$ac_aux_dir"; then ++ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 ++echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++# These three variables are undocumented and unsupported, ++# and are intended to be withdrawn in a future Autoconf release. ++# They can cause serious problems if a builder's source tree is in a directory ++# whose full name contains unusual characters. ++ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ++ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ++ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ++ ++ ++# Make sure we can run config.sub. ++$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || ++ { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 ++echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} ++ { (exit 1); exit 1; }; } ++ ++{ echo "$as_me:$LINENO: checking build system type" >&5 ++echo $ECHO_N "checking build system type... $ECHO_C" >&6; } ++if test "${ac_cv_build+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_build_alias=$build_alias ++test "x$ac_build_alias" = x && ++ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` ++test "x$ac_build_alias" = x && ++ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 ++echo "$as_me: error: cannot guess build type; you must specify one" >&2;} ++ { (exit 1); exit 1; }; } ++ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 ++echo "${ECHO_T}$ac_cv_build" >&6; } ++case $ac_cv_build in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 ++echo "$as_me: error: invalid value of canonical build" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++build=$ac_cv_build ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_build ++shift ++build_cpu=$1 ++build_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++build_os=$* ++IFS=$ac_save_IFS ++case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac ++ ++ ++{ echo "$as_me:$LINENO: checking host system type" >&5 ++echo $ECHO_N "checking host system type... $ECHO_C" >&6; } ++if test "${ac_cv_host+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "x$host_alias" = x; then ++ ac_cv_host=$ac_cv_build ++else ++ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 ++echo "${ECHO_T}$ac_cv_host" >&6; } ++case $ac_cv_host in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 ++echo "$as_me: error: invalid value of canonical host" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++host=$ac_cv_host ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_host ++shift ++host_cpu=$1 ++host_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++host_os=$* ++IFS=$ac_save_IFS ++case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ++ ++ ++{ echo "$as_me:$LINENO: checking target system type" >&5 ++echo $ECHO_N "checking target system type... $ECHO_C" >&6; } ++if test "${ac_cv_target+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "x$target_alias" = x; then ++ ac_cv_target=$ac_cv_host ++else ++ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 ++echo "${ECHO_T}$ac_cv_target" >&6; } ++case $ac_cv_target in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 ++echo "$as_me: error: invalid value of canonical target" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++target=$ac_cv_target ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_target ++shift ++target_cpu=$1 ++target_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++target_os=$* ++IFS=$ac_save_IFS ++case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac ++ ++ ++# The aliases save the names the user supplied, while $host etc. ++# will get canonicalized. ++test -n "$target_alias" && ++ test "$program_prefix$program_suffix$program_transform_name" = \ ++ NONENONEs,x,x, && ++ program_prefix=${target_alias}- ++am__api_version="1.9" ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AmigaOS /C/install, which installs bootblocks on floppy discs ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic ++# ./install, which can be erroneously created by make from ./install.sh. ++{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 ++echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } ++if test -z "$INSTALL"; then ++if test "${ac_cv_path_install+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ # Account for people who put trailing slashes in PATH elements. ++case $as_dir/ in ++ ./ | .// | /cC/* | \ ++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ ++ /usr/ucb/* ) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi ++ done ++ done ++ ;; ++esac ++done ++IFS=$as_save_IFS ++ ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL=$ac_cv_path_install ++ else ++ # As a last resort, use the slow shell script. Don't cache a ++ # value for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the value is a relative name. ++ INSTALL=$ac_install_sh ++ fi ++fi ++{ echo "$as_me:$LINENO: result: $INSTALL" >&5 ++echo "${ECHO_T}$INSTALL" >&6; } ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 ++echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } ++# Just in case ++sleep 1 ++echo timestamp > conftest.file ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` ++ if test "$*" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftest.file` ++ fi ++ rm -f conftest.file ++ if test "$*" != "X $srcdir/configure conftest.file" \ ++ && test "$*" != "X conftest.file $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" >&5 ++echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++ ++ test "$2" = conftest.file ++ ) ++then ++ # Ok. ++ : ++else ++ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! ++Check your system clock" >&5 ++echo "$as_me: error: newly created file is older than distributed files! ++Check your system clock" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++{ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6; } ++test "$program_prefix" != NONE && ++ program_transform_name="s&^&$program_prefix&;$program_transform_name" ++# Use a double $ so make ignores it. ++test "$program_suffix" != NONE && ++ program_transform_name="s&\$&$program_suffix&;$program_transform_name" ++# Double any \ or $. echo might interpret backslashes. ++# By default was `s,x,x', remove it if useless. ++cat <<\_ACEOF >conftest.sed ++s/[\\$]/&&/g;s/;s,x,x,$// ++_ACEOF ++program_transform_name=`echo $program_transform_name | sed -f conftest.sed` ++rm -f conftest.sed ++ ++# expand $ac_aux_dir to an absolute path ++am_aux_dir=`cd $ac_aux_dir && pwd` ++ ++test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" ++# Use eval to expand $SHELL ++if eval "$MISSING --run true"; then ++ am_missing_run="$MISSING --run " ++else ++ am_missing_run= ++ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 ++echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} ++fi ++ ++if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then ++ # We used to keeping the `.' as first argument, in order to ++ # allow $(mkdir_p) to be used without argument. As in ++ # $(mkdir_p) $(somedir) ++ # where $(somedir) is conditionally defined. However this is wrong ++ # for two reasons: ++ # 1. if the package is installed by a user who cannot write `.' ++ # make install will fail, ++ # 2. the above comment should most certainly read ++ # $(mkdir_p) $(DESTDIR)$(somedir) ++ # so it does not work when $(somedir) is undefined and ++ # $(DESTDIR) is not. ++ # To support the latter case, we have to write ++ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), ++ # so the `.' trick is pointless. ++ mkdir_p='mkdir -p --' ++else ++ # On NextStep and OpenStep, the `mkdir' command does not ++ # recognize any option. It will interpret all options as ++ # directories to create, and then abort because `.' already ++ # exists. ++ for d in ./-p ./--version; ++ do ++ test -d $d && rmdir $d ++ done ++ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. ++ if test -f "$ac_aux_dir/mkinstalldirs"; then ++ mkdir_p='$(mkinstalldirs)' ++ else ++ mkdir_p='$(install_sh) -d' ++ fi ++fi ++ ++for ac_prog in gawk mawk nawk awk ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_AWK+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$AWK"; then ++ ac_cv_prog_AWK="$AWK" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_AWK="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++AWK=$ac_cv_prog_AWK ++if test -n "$AWK"; then ++ { echo "$as_me:$LINENO: result: $AWK" >&5 ++echo "${ECHO_T}$AWK" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++ test -n "$AWK" && break ++done ++ ++{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 ++echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } ++set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` ++if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.make <<\_ACEOF ++SHELL = /bin/sh ++all: ++ @echo '@@@%%%=$(MAKE)=@@@%%%' ++_ACEOF ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++case `${MAKE-make} -f conftest.make 2>/dev/null` in ++ *@@@%%%=?*=@@@%%%*) ++ eval ac_cv_prog_make_${ac_make}_set=yes;; ++ *) ++ eval ac_cv_prog_make_${ac_make}_set=no;; ++esac ++rm -f conftest.make ++fi ++if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then ++ { echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6; } ++ SET_MAKE= ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++ SET_MAKE="MAKE=${MAKE-make}" ++fi ++ ++rm -rf .tst 2>/dev/null ++mkdir .tst 2>/dev/null ++if test -d .tst; then ++ am__leading_dot=. ++else ++ am__leading_dot=_ ++fi ++rmdir .tst 2>/dev/null ++ ++# test to see if srcdir already configured ++if test "`cd $srcdir && pwd`" != "`pwd`" && ++ test -f $srcdir/config.status; then ++ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 ++echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++# test whether we have cygpath ++if test -z "$CYGPATH_W"; then ++ if (cygpath --version) >/dev/null 2>/dev/null; then ++ CYGPATH_W='cygpath -w' ++ else ++ CYGPATH_W=echo ++ fi ++fi ++ ++ ++# Define the identity of the package. ++ PACKAGE='convert' ++ VERSION='3.0.4' ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE "$PACKAGE" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define VERSION "$VERSION" ++_ACEOF ++ ++# Some tools Automake needs. ++ ++ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} ++ ++ ++AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} ++ ++ ++AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} ++ ++ ++AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} ++ ++ ++MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} ++ ++install_sh=${install_sh-"$am_aux_dir/install-sh"} ++ ++# Installed binaries are usually stripped using `strip' when the user ++# run `make install-strip'. However `strip' might not be the right ++# tool to use in cross-compilation environments, therefore Automake ++# will honor the `STRIP' environment variable to overrule this program. ++if test "$cross_compiling" != no; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. ++set dummy ${ac_tool_prefix}strip; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_STRIP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$STRIP"; then ++ ac_cv_prog_STRIP="$STRIP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_STRIP="${ac_tool_prefix}strip" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++STRIP=$ac_cv_prog_STRIP ++if test -n "$STRIP"; then ++ { echo "$as_me:$LINENO: result: $STRIP" >&5 ++echo "${ECHO_T}$STRIP" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_prog_STRIP"; then ++ ac_ct_STRIP=$STRIP ++ # Extract the first word of "strip", so it can be a program name with args. ++set dummy strip; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_STRIP"; then ++ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_ac_ct_STRIP="strip" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP ++if test -n "$ac_ct_STRIP"; then ++ { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 ++echo "${ECHO_T}$ac_ct_STRIP" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ if test "x$ac_ct_STRIP" = x; then ++ STRIP=":" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&5 ++echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&2;} ++ac_tool_warned=yes ;; ++esac ++ STRIP=$ac_ct_STRIP ++ fi ++else ++ STRIP="$ac_cv_prog_STRIP" ++fi ++ ++fi ++INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" ++ ++# We need awk for the "check" target. The system "awk" is bad on ++# some platforms. ++# Always define AMTAR for backward compatibility. ++ ++AMTAR=${AMTAR-"${am_missing_run}tar"} ++ ++am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ++ ++ ++ ++ ++ ++ ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. ++set dummy ${ac_tool_prefix}gcc; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_CC="${ac_tool_prefix}gcc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ { echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_prog_CC"; then ++ ac_ct_CC=$CC ++ # Extract the first word of "gcc", so it can be a program name with args. ++set dummy gcc; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_ac_ct_CC="gcc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 ++echo "${ECHO_T}$ac_ct_CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ if test "x$ac_ct_CC" = x; then ++ CC="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&5 ++echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&2;} ++ac_tool_warned=yes ;; ++esac ++ CC=$ac_ct_CC ++ fi ++else ++ CC="$ac_cv_prog_CC" ++fi ++ ++if test -z "$CC"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. ++set dummy ${ac_tool_prefix}cc; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_CC="${ac_tool_prefix}cc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ { echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++ fi ++fi ++if test -z "$CC"; then ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ ac_prog_rejected=no ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++ ac_cv_prog_CC="cc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++if test $ac_prog_rejected = yes; then ++ # We found a bogon in the path, so make sure we never use it. ++ set dummy $ac_cv_prog_CC ++ shift ++ if test $# != 0; then ++ # We chose a different compiler from the bogus one. ++ # However, it has the same basename, so the bogon will be chosen ++ # first if we set CC to just the basename; use the full file name. ++ shift ++ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" ++ fi ++fi ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ { echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++fi ++if test -z "$CC"; then ++ if test -n "$ac_tool_prefix"; then ++ for ac_prog in cl.exe ++ do ++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. ++set dummy $ac_tool_prefix$ac_prog; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_CC="$ac_tool_prefix$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ { echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++ test -n "$CC" && break ++ done ++fi ++if test -z "$CC"; then ++ ac_ct_CC=$CC ++ for ac_prog in cl.exe ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++{ echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ++ ac_cv_prog_ac_ct_CC="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 ++echo "${ECHO_T}$ac_ct_CC" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6; } ++fi ++ ++ ++ test -n "$ac_ct_CC" && break ++done ++ ++ if test "x$ac_ct_CC" = x; then ++ CC="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&5 ++echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools ++whose name does not start with the host triplet. If you think this ++configuration is useful to you, please write to autoconf@gnu.org." >&2;} ++ac_tool_warned=yes ;; ++esac ++ CC=$ac_ct_CC ++ fi ++fi ++ ++fi ++ ++ ++test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&5 ++echo "$as_me: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++ ++# Provide some information about the compiler. ++echo "$as_me:$LINENO: checking for C compiler version" >&5 ++ac_compiler=`set X $ac_compile; echo $2` ++{ (ac_try="$ac_compiler --version >&5" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compiler --version >&5") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (ac_try="$ac_compiler -v >&5" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compiler -v >&5") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (ac_try="$ac_compiler -V >&5" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compiler -V >&5") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++ac_clean_files_save=$ac_clean_files ++ac_clean_files="$ac_clean_files a.out a.exe b.out" ++# Try to create an executable without -o first, disregard a.out. ++# It will help us diagnose broken compilers, and finding out an intuition ++# of exeext. ++{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 ++echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ++ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` ++# ++# List of possible output files, starting from the most likely. ++# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) ++# only as a last resort. b.out is created by i960 compilers. ++ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' ++# ++# The IRIX 6 linker writes into existing files which may not be ++# executable, retaining their permissions. Remove them first so a ++# subsequent execution test works. ++ac_rmfiles= ++for ac_file in $ac_files ++do ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; ++ * ) ac_rmfiles="$ac_rmfiles $ac_file";; ++ esac ++done ++rm -f $ac_rmfiles ++ ++if { (ac_try="$ac_link_default" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link_default") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. ++# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' ++# in a Makefile. We should not override ac_cv_exeext if it was cached, ++# so that the user can short-circuit this test for compilers unknown to ++# Autoconf. ++for ac_file in $ac_files '' ++do ++ test -f "$ac_file" || continue ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ++ ;; ++ [ab].out ) ++ # We found the default executable, but exeext='' is most ++ # certainly right. ++ break;; ++ *.* ) ++ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; ++ then :; else ++ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ fi ++ # We set ac_cv_exeext here because the later test for it is not ++ # safe: cross compilers may not add the suffix if given an `-o' ++ # argument, so we may need to know it at that point already. ++ # Even if this section looks crufty: it has the advantage of ++ # actually working. ++ break;; ++ * ) ++ break;; ++ esac ++done ++test "$ac_cv_exeext" = no && ac_cv_exeext= ++ ++else ++ ac_file='' ++fi ++ ++{ echo "$as_me:$LINENO: result: $ac_file" >&5 ++echo "${ECHO_T}$ac_file" >&6; } ++if test -z "$ac_file"; then ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++{ { echo "$as_me:$LINENO: error: C compiler cannot create executables ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C compiler cannot create executables ++See \`config.log' for more details." >&2;} ++ { (exit 77); exit 77; }; } ++fi ++ ++ac_exeext=$ac_cv_exeext ++ ++# Check that the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 ++echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } ++# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 ++# If not cross compiling, check that we can run a simple program. ++if test "$cross_compiling" != yes; then ++ if { ac_try='./$ac_file' ++ { (case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_try") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ cross_compiling=no ++ else ++ if test "$cross_compiling" = maybe; then ++ cross_compiling=yes ++ else ++ { { echo "$as_me:$LINENO: error: cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++ fi ++fi ++{ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6; } ++ ++rm -f a.out a.exe conftest$ac_cv_exeext b.out ++ac_clean_files=$ac_clean_files_save ++# Check that the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 ++echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } ++{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 ++echo "${ECHO_T}$cross_compiling" >&6; } ++ ++{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 ++echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # If both `conftest.exe' and `conftest' are `present' (well, observable) ++# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will ++# work properly (i.e., refer to `conftest.exe'), while it won't with ++# `rm'. ++for ac_file in conftest.exe conftest conftest.*; do ++ test -f "$ac_file" || continue ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; ++ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ break;; ++ * ) break;; ++ esac ++done ++else ++ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++rm -f conftest$ac_cv_exeext ++{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 ++echo "${ECHO_T}$ac_cv_exeext" >&6; } ++ ++rm -f conftest.$ac_ext ++EXEEXT=$ac_cv_exeext ++ac_exeext=$EXEEXT ++{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 ++echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } ++if test "${ac_cv_objext+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.o conftest.obj ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ for ac_file in conftest.o conftest.obj conftest.*; do ++ test -f "$ac_file" || continue; ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; ++ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` ++ break;; ++ esac ++done ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++rm -f conftest.$ac_cv_objext conftest.$ac_ext ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 ++echo "${ECHO_T}$ac_cv_objext" >&6; } ++OBJEXT=$ac_cv_objext ++ac_objext=$OBJEXT ++{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 ++echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } ++if test "${ac_cv_c_compiler_gnu+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++#ifndef __GNUC__ ++ choke me ++#endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_compiler_gnu=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_compiler_gnu=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ac_cv_c_compiler_gnu=$ac_compiler_gnu ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 ++echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } ++GCC=`test $ac_compiler_gnu = yes && echo yes` ++ac_test_CFLAGS=${CFLAGS+set} ++ac_save_CFLAGS=$CFLAGS ++{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 ++echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } ++if test "${ac_cv_prog_cc_g+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_save_c_werror_flag=$ac_c_werror_flag ++ ac_c_werror_flag=yes ++ ac_cv_prog_cc_g=no ++ CFLAGS="-g" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_prog_cc_g=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ CFLAGS="" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_c_werror_flag=$ac_save_c_werror_flag ++ CFLAGS="-g" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_prog_cc_g=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ ac_c_werror_flag=$ac_save_c_werror_flag ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 ++echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } ++if test "$ac_test_CFLAGS" = set; then ++ CFLAGS=$ac_save_CFLAGS ++elif test $ac_cv_prog_cc_g = yes; then ++ if test "$GCC" = yes; then ++ CFLAGS="-g -O2" ++ else ++ CFLAGS="-g" ++ fi ++else ++ if test "$GCC" = yes; then ++ CFLAGS="-O2" ++ else ++ CFLAGS= ++ fi ++fi ++{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 ++echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } ++if test "${ac_cv_prog_cc_c89+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_cv_prog_cc_c89=no ++ac_save_CC=$CC ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++#include ++#include ++#include ++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ ++struct buf { int x; }; ++FILE * (*rcsopen) (struct buf *, struct stat *, int); ++static char *e (p, i) ++ char **p; ++ int i; ++{ ++ return p[i]; ++} ++static char *f (char * (*g) (char **, int), char **p, ...) ++{ ++ char *s; ++ va_list v; ++ va_start (v,p); ++ s = g (p, va_arg (v,int)); ++ va_end (v); ++ return s; ++} ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not '\xHH' hex character constants. ++ These don't provoke an error unfortunately, instead are silently treated ++ as 'x'. The following induces an error, until -std is added to get ++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an ++ array size at least. It's necessary to write '\x00'==0 to get something ++ that's true only with -std. */ ++int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ ++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters ++ inside strings and character constants. */ ++#define FOO(x) 'x' ++int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; ++ ++int test (int i, double x); ++struct s1 {int (*f) (int a);}; ++struct s2 {int (*f) (double a);}; ++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); ++int argc; ++char **argv; ++int ++main () ++{ ++return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ++ ; ++ return 0; ++} ++_ACEOF ++for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ ++ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" ++do ++ CC="$ac_save_CC $ac_arg" ++ rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_prog_cc_c89=$ac_arg ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ++fi ++ ++rm -f core conftest.err conftest.$ac_objext ++ test "x$ac_cv_prog_cc_c89" != "xno" && break ++done ++rm -f conftest.$ac_ext ++CC=$ac_save_CC ++ ++fi ++# AC_CACHE_VAL ++case "x$ac_cv_prog_cc_c89" in ++ x) ++ { echo "$as_me:$LINENO: result: none needed" >&5 ++echo "${ECHO_T}none needed" >&6; } ;; ++ xno) ++ { echo "$as_me:$LINENO: result: unsupported" >&5 ++echo "${ECHO_T}unsupported" >&6; } ;; ++ *) ++ CC="$CC $ac_cv_prog_cc_c89" ++ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 ++echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; ++esac ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++DEPDIR="${am__leading_dot}deps" ++ ++ac_config_commands="$ac_config_commands depfiles" ++ ++ ++am_make=${MAKE-make} ++cat > confinc << 'END' ++am__doit: ++ @echo done ++.PHONY: am__doit ++END ++# If we don't find an include directive, just comment out the code. ++{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 ++echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } ++am__include="#" ++am__quote= ++_am_result=none ++# First try GNU make style include. ++echo "include confinc" > confmf ++# We grep out `Entering directory' and `Leaving directory' ++# messages which can occur if `w' ends up in MAKEFLAGS. ++# In particular we don't look at `^make:' because GNU make might ++# be invoked under some other name (usually "gmake"), in which ++# case it prints its new name instead of `make'. ++if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then ++ am__include=include ++ am__quote= ++ _am_result=GNU ++fi ++# Now try BSD make style include. ++if test "$am__include" = "#"; then ++ echo '.include "confinc"' > confmf ++ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then ++ am__include=.include ++ am__quote="\"" ++ _am_result=BSD ++ fi ++fi ++ ++ ++{ echo "$as_me:$LINENO: result: $_am_result" >&5 ++echo "${ECHO_T}$_am_result" >&6; } ++rm -f confinc confmf ++ ++# Check whether --enable-dependency-tracking was given. ++if test "${enable_dependency_tracking+set}" = set; then ++ enableval=$enable_dependency_tracking; ++fi ++ ++if test "x$enable_dependency_tracking" != xno; then ++ am_depcomp="$ac_aux_dir/depcomp" ++ AMDEPBACKSLASH='\' ++fi ++ ++ ++if test "x$enable_dependency_tracking" != xno; then ++ AMDEP_TRUE= ++ AMDEP_FALSE='#' ++else ++ AMDEP_TRUE='#' ++ AMDEP_FALSE= ++fi ++ ++ ++ ++ ++depcc="$CC" am_compiler_list= ++ ++{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 ++echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } ++if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then ++ # We make a subdir and do the tests there. Otherwise we can end up ++ # making bogus files that we don't know about and never remove. For ++ # instance it was reported that on HP-UX the gcc test will end up ++ # making a dummy file named `D' -- because `-MD' means `put the output ++ # in D'. ++ mkdir conftest.dir ++ # Copy depcomp to subdir because otherwise we won't find it if we're ++ # using a relative directory. ++ cp "$am_depcomp" conftest.dir ++ cd conftest.dir ++ # We will build objects and dependencies in a subdirectory because ++ # it helps to detect inapplicable dependency modes. For instance ++ # both Tru64's cc and ICC support -MD to output dependencies as a ++ # side effect of compilation, but ICC will put the dependencies in ++ # the current directory while Tru64 will put them in the object ++ # directory. ++ mkdir sub ++ ++ am_cv_CC_dependencies_compiler_type=none ++ if test "$am_compiler_list" = ""; then ++ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` ++ fi ++ for depmode in $am_compiler_list; do ++ # Setup a source with many dependencies, because some compilers ++ # like to wrap large dependency lists on column 80 (with \), and ++ # we should not choose a depcomp mode which is confused by this. ++ # ++ # We need to recreate these files for each test, as the compiler may ++ # overwrite some of them when testing with obscure command lines. ++ # This happens at least with the AIX C compiler. ++ : > sub/conftest.c ++ for i in 1 2 3 4 5 6; do ++ echo '#include "conftst'$i'.h"' >> sub/conftest.c ++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with ++ # Solaris 8's {/usr,}/bin/sh. ++ touch sub/conftst$i.h ++ done ++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf ++ ++ case $depmode in ++ nosideeffect) ++ # after this tag, mechanisms are not by side-effect, so they'll ++ # only be used when explicitly requested ++ if test "x$enable_dependency_tracking" = xyes; then ++ continue ++ else ++ break ++ fi ++ ;; ++ none) break ;; ++ esac ++ # We check with `-c' and `-o' for the sake of the "dashmstdout" ++ # mode. It turns out that the SunPro C++ compiler does not properly ++ # handle `-M -o', and we need to detect this. ++ if depmode=$depmode \ ++ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ ++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ ++ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ ++ >/dev/null 2>conftest.err && ++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && ++ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ++ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then ++ # icc doesn't choke on unknown options, it will just issue warnings ++ # or remarks (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored or not supported. ++ # When given -MP, icc 7.0 and 7.1 complain thusly: ++ # icc: Command line warning: ignoring option '-M'; no argument required ++ # The diagnosis changed in icc 8.0: ++ # icc: Command line remark: option '-MP' not supported ++ if (grep 'ignoring option' conftest.err || ++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else ++ am_cv_CC_dependencies_compiler_type=$depmode ++ break ++ fi ++ fi ++ done ++ ++ cd .. ++ rm -rf conftest.dir ++else ++ am_cv_CC_dependencies_compiler_type=none ++fi ++ ++fi ++{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 ++echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } ++CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type ++ ++ ++ ++if ++ test "x$enable_dependency_tracking" != xno \ ++ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then ++ am__fastdepCC_TRUE= ++ am__fastdepCC_FALSE='#' ++else ++ am__fastdepCC_TRUE='#' ++ am__fastdepCC_FALSE= ++fi ++ ++ ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AmigaOS /C/install, which installs bootblocks on floppy discs ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic ++# ./install, which can be erroneously created by make from ./install.sh. ++{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 ++echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } ++if test -z "$INSTALL"; then ++if test "${ac_cv_path_install+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ # Account for people who put trailing slashes in PATH elements. ++case $as_dir/ in ++ ./ | .// | /cC/* | \ ++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ ++ /usr/ucb/* ) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi ++ done ++ done ++ ;; ++esac ++done ++IFS=$as_save_IFS ++ ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL=$ac_cv_path_install ++ else ++ # As a last resort, use the slow shell script. Don't cache a ++ # value for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the value is a relative name. ++ INSTALL=$ac_install_sh ++ fi ++fi ++{ echo "$as_me:$LINENO: result: $INSTALL" >&5 ++echo "${ECHO_T}$INSTALL" >&6; } ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++ ++ ++{ echo "$as_me:$LINENO: checking for library containing strerror" >&5 ++echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; } ++if test "${ac_cv_search_strerror+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_func_search_save_LIBS=$LIBS ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char strerror (); ++int ++main () ++{ ++return strerror (); ++ ; ++ return 0; ++} ++_ACEOF ++for ac_lib in '' cposix; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ ac_cv_search_strerror=$ac_res ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext ++ if test "${ac_cv_search_strerror+set}" = set; then ++ break ++fi ++done ++if test "${ac_cv_search_strerror+set}" = set; then ++ : ++else ++ ac_cv_search_strerror=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 ++echo "${ECHO_T}$ac_cv_search_strerror" >&6; } ++ac_res=$ac_cv_search_strerror ++if test "$ac_res" != no; then ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++fi ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 ++echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } ++# On Suns, sometimes $CPP names a directory. ++if test -n "$CPP" && test -d "$CPP"; then ++ CPP= ++fi ++if test -z "$CPP"; then ++ if test "${ac_cv_prog_CPP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ # Double quotes because CPP needs to be expanded ++ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" ++ do ++ ac_preproc_ok=false ++for ac_c_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Broken: fails on valid input. ++continue ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++ ++ # OK, works on sane cases. Now check whether nonexistent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ # Broken: success on invalid input. ++continue ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Passes both tests. ++ac_preproc_ok=: ++break ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++ ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then ++ break ++fi ++ ++ done ++ ac_cv_prog_CPP=$CPP ++ ++fi ++ CPP=$ac_cv_prog_CPP ++else ++ ac_cv_prog_CPP=$CPP ++fi ++{ echo "$as_me:$LINENO: result: $CPP" >&5 ++echo "${ECHO_T}$CPP" >&6; } ++ac_preproc_ok=false ++for ac_c_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Broken: fails on valid input. ++continue ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++ ++ # OK, works on sane cases. Now check whether nonexistent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ # Broken: success on invalid input. ++continue ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Passes both tests. ++ac_preproc_ok=: ++break ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++ ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then ++ : ++else ++ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 ++echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } ++if test "${ac_cv_path_GREP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ # Extract the first word of "grep ggrep" to use in msg output ++if test -z "$GREP"; then ++set dummy grep ggrep; ac_prog_name=$2 ++if test "${ac_cv_path_GREP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_path_GREP_found=false ++# Loop through the user's path and test for each of PROGNAME-LIST ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_prog in grep ggrep; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" ++ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue ++ # Check for GNU ac_path_GREP and select it if it is found. ++ # Check for GNU $ac_path_GREP ++case `"$ac_path_GREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; ++*) ++ ac_count=0 ++ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ echo 'GREP' >> "conftest.nl" ++ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ ac_count=`expr $ac_count + 1` ++ if test $ac_count -gt ${ac_path_GREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_GREP="$ac_path_GREP" ++ ac_path_GREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ ++ $ac_path_GREP_found && break 3 ++ done ++done ++ ++done ++IFS=$as_save_IFS ++ ++ ++fi ++ ++GREP="$ac_cv_path_GREP" ++if test -z "$GREP"; then ++ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 ++echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++else ++ ac_cv_path_GREP=$GREP ++fi ++ ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 ++echo "${ECHO_T}$ac_cv_path_GREP" >&6; } ++ GREP="$ac_cv_path_GREP" ++ ++ ++{ echo "$as_me:$LINENO: checking for egrep" >&5 ++echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } ++if test "${ac_cv_path_EGREP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 ++ then ac_cv_path_EGREP="$GREP -E" ++ else ++ # Extract the first word of "egrep" to use in msg output ++if test -z "$EGREP"; then ++set dummy egrep; ac_prog_name=$2 ++if test "${ac_cv_path_EGREP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_path_EGREP_found=false ++# Loop through the user's path and test for each of PROGNAME-LIST ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_prog in egrep; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" ++ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue ++ # Check for GNU ac_path_EGREP and select it if it is found. ++ # Check for GNU $ac_path_EGREP ++case `"$ac_path_EGREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; ++*) ++ ac_count=0 ++ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ echo 'EGREP' >> "conftest.nl" ++ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ ac_count=`expr $ac_count + 1` ++ if test $ac_count -gt ${ac_path_EGREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_EGREP="$ac_path_EGREP" ++ ac_path_EGREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ ++ $ac_path_EGREP_found && break 3 ++ done ++done ++ ++done ++IFS=$as_save_IFS ++ ++ ++fi ++ ++EGREP="$ac_cv_path_EGREP" ++if test -z "$EGREP"; then ++ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 ++echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++else ++ ac_cv_path_EGREP=$EGREP ++fi ++ ++ ++ fi ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 ++echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } ++ EGREP="$ac_cv_path_EGREP" ++ ++ ++{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 ++echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } ++if test "${ac_cv_header_stdc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++#include ++#include ++#include ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_header_stdc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_header_stdc=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "memchr" >/dev/null 2>&1; then ++ : ++else ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "free" >/dev/null 2>&1; then ++ : ++else ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++ if test "$cross_compiling" = yes; then ++ : ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++#include ++#if ((' ' & 0x0FF) == 0x020) ++# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#else ++# define ISLOWER(c) \ ++ (('a' <= (c) && (c) <= 'i') \ ++ || ('j' <= (c) && (c) <= 'r') \ ++ || ('s' <= (c) && (c) <= 'z')) ++# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) ++#endif ++ ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int ++main () ++{ ++ int i; ++ for (i = 0; i < 256; i++) ++ if (XOR (islower (i), ISLOWER (i)) ++ || toupper (i) != TOUPPER (i)) ++ return 2; ++ return 0; ++} ++_ACEOF ++rm -f conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' ++ { (case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_try") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ : ++else ++ echo "$as_me: program exited with status $ac_status" >&5 ++echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++( exit $ac_status ) ++ac_cv_header_stdc=no ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++fi ++ ++ ++fi ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 ++echo "${ECHO_T}$ac_cv_header_stdc" >&6; } ++if test $ac_cv_header_stdc = yes; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define STDC_HEADERS 1 ++_ACEOF ++ ++fi ++ ++ac_config_headers="$ac_config_headers config.h" ++ ++# On IRIX 5.3, sys/types and inttypes.h are conflicting. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ ++ inttypes.h stdint.h unistd.h ++do ++as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` ++{ echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++ ++#include <$ac_header> ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ eval "$as_ac_Header=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ eval "$as_ac_Header=no" ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ac_res=`eval echo '${'$as_ac_Header'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++if test `eval echo '${'$as_ac_Header'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ ++ ++ ++ ++ ++ ++for ac_header in stddef.h stdlib.h strings.h unistd.h limits.h ++do ++as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ { echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++fi ++ac_res=`eval echo '${'$as_ac_Header'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++else ++ # Is the header compilable? ++{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 ++echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++#include <$ac_header> ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_header_compiler=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_header_compiler=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 ++echo "${ECHO_T}$ac_header_compiler" >&6; } ++ ++# Is the header present? ++{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 ++echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <$ac_header> ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ ac_header_preproc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_header_preproc=no ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 ++echo "${ECHO_T}$ac_header_preproc" >&6; } ++ ++# So? What about this header? ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 ++echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 ++echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ++ ;; ++esac ++{ echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ eval "$as_ac_Header=\$ac_header_preproc" ++fi ++ac_res=`eval echo '${'$as_ac_Header'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++ ++fi ++if test `eval echo '${'$as_ac_Header'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ ++ ++for ac_header in fcntl.h sys/file.h ++do ++as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ { echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++fi ++ac_res=`eval echo '${'$as_ac_Header'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++else ++ # Is the header compilable? ++{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 ++echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++#include <$ac_header> ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_header_compiler=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_header_compiler=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 ++echo "${ECHO_T}$ac_header_compiler" >&6; } ++ ++# Is the header present? ++{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 ++echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <$ac_header> ++_ACEOF ++if { (ac_try="$ac_cpp conftest.$ac_ext" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null && { ++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || ++ test ! -s conftest.err ++ }; then ++ ac_header_preproc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_header_preproc=no ++fi ++ ++rm -f conftest.err conftest.$ac_ext ++{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 ++echo "${ECHO_T}$ac_header_preproc" >&6; } ++ ++# So? What about this header? ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 ++echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 ++echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ++ ;; ++esac ++{ echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } ++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ eval "$as_ac_Header=\$ac_header_preproc" ++fi ++ac_res=`eval echo '${'$as_ac_Header'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++ ++fi ++if test `eval echo '${'$as_ac_Header'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ ++{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 ++echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } ++if test "${ac_cv_c_const+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++/* FIXME: Include the comments suggested by Paul. */ ++#ifndef __cplusplus ++ /* Ultrix mips cc rejects this. */ ++ typedef int charset[2]; ++ const charset cs; ++ /* SunOS 4.1.1 cc rejects this. */ ++ char const *const *pcpcc; ++ char **ppc; ++ /* NEC SVR4.0.2 mips cc rejects this. */ ++ struct point {int x, y;}; ++ static struct point const zero = {0,0}; ++ /* AIX XL C 1.02.0.0 rejects this. ++ It does not let you subtract one const X* pointer from another in ++ an arm of an if-expression whose if-part is not a constant ++ expression */ ++ const char *g = "string"; ++ pcpcc = &g + (g ? g-g : 0); ++ /* HPUX 7.0 cc rejects these. */ ++ ++pcpcc; ++ ppc = (char**) pcpcc; ++ pcpcc = (char const *const *) ppc; ++ { /* SCO 3.2v4 cc rejects this. */ ++ char *t; ++ char const *s = 0 ? (char *) 0 : (char const *) 0; ++ ++ *t++ = 0; ++ if (s) return 0; ++ } ++ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ ++ int x[] = {25, 17}; ++ const int *foo = &x[0]; ++ ++foo; ++ } ++ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ ++ typedef const int *iptr; ++ iptr p = 0; ++ ++p; ++ } ++ { /* AIX XL C 1.02.0.0 rejects this saying ++ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ ++ struct s { int j; const int *ap[3]; }; ++ struct s *b; b->j = 5; ++ } ++ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ ++ const int foo = 10; ++ if (!foo) return 0; ++ } ++ return !cs[0] && !zero.x; ++#endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_c_const=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_c_const=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 ++echo "${ECHO_T}$ac_cv_c_const" >&6; } ++if test $ac_cv_c_const = no; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define const ++_ACEOF ++ ++fi ++ ++{ echo "$as_me:$LINENO: checking for size_t" >&5 ++echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } ++if test "${ac_cv_type_size_t+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++typedef size_t ac__type_new_; ++int ++main () ++{ ++if ((ac__type_new_ *) 0) ++ return 0; ++if (sizeof (ac__type_new_)) ++ return 0; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ ac_cv_type_size_t=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_type_size_t=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 ++echo "${ECHO_T}$ac_cv_type_size_t" >&6; } ++if test $ac_cv_type_size_t = yes; then ++ : ++else ++ ++cat >>confdefs.h <<_ACEOF ++#define size_t unsigned int ++_ACEOF ++ ++fi ++ ++ ++ ++ ++ ++for ac_func in strchr strtok memcpy ++do ++as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` ++{ echo "$as_me:$LINENO: checking for $ac_func" >&5 ++echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } ++if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case declares $ac_func. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $ac_func ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char $ac_func (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined __stub_$ac_func || defined __stub___$ac_func ++choke me ++#endif ++ ++int ++main () ++{ ++return $ac_func (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ eval "$as_ac_var=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ eval "$as_ac_var=no" ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++ac_res=`eval echo '${'$as_ac_var'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++if test `eval echo '${'$as_ac_var'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++done ++ ++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works ++# for constant arguments. Useless! ++{ echo "$as_me:$LINENO: checking for working alloca.h" >&5 ++echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } ++if test "${ac_cv_working_alloca_h+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++char *p = (char *) alloca (2 * sizeof (int)); ++ if (p) return 0; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ ac_cv_working_alloca_h=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_working_alloca_h=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 ++echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } ++if test $ac_cv_working_alloca_h = yes; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_ALLOCA_H 1 ++_ACEOF ++ ++fi ++ ++{ echo "$as_me:$LINENO: checking for alloca" >&5 ++echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } ++if test "${ac_cv_func_alloca_works+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# ifdef _MSC_VER ++# include ++# define alloca _alloca ++# else ++# ifdef HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++ #pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char *alloca (); ++# endif ++# endif ++# endif ++# endif ++#endif ++ ++int ++main () ++{ ++char *p = (char *) alloca (1); ++ if (p) return 0; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ ac_cv_func_alloca_works=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_func_alloca_works=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 ++echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } ++ ++if test $ac_cv_func_alloca_works = yes; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_ALLOCA 1 ++_ACEOF ++ ++else ++ # The SVR3 libPW and SVR4 libucb both contain incompatible functions ++# that cause trouble. Some versions do not even contain alloca or ++# contain a buggy version. If you still want to use their alloca, ++# use ar to extract alloca.o from them instead of compiling alloca.c. ++ ++ALLOCA=\${LIBOBJDIR}alloca.$ac_objext ++ ++cat >>confdefs.h <<\_ACEOF ++#define C_ALLOCA 1 ++_ACEOF ++ ++ ++{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 ++echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } ++if test "${ac_cv_os_cray+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#if defined CRAY && ! defined CRAY2 ++webecray ++#else ++wenotbecray ++#endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "webecray" >/dev/null 2>&1; then ++ ac_cv_os_cray=yes ++else ++ ac_cv_os_cray=no ++fi ++rm -f conftest* ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 ++echo "${ECHO_T}$ac_cv_os_cray" >&6; } ++if test $ac_cv_os_cray = yes; then ++ for ac_func in _getb67 GETB67 getb67; do ++ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` ++{ echo "$as_me:$LINENO: checking for $ac_func" >&5 ++echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } ++if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case declares $ac_func. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $ac_func ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char $ac_func (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined __stub_$ac_func || defined __stub___$ac_func ++choke me ++#endif ++ ++int ++main () ++{ ++return $ac_func (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ eval "$as_ac_var=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ eval "$as_ac_var=no" ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++ac_res=`eval echo '${'$as_ac_var'}'` ++ { echo "$as_me:$LINENO: result: $ac_res" >&5 ++echo "${ECHO_T}$ac_res" >&6; } ++if test `eval echo '${'$as_ac_var'}'` = yes; then ++ ++cat >>confdefs.h <<_ACEOF ++#define CRAY_STACKSEG_END $ac_func ++_ACEOF ++ ++ break ++fi ++ ++ done ++fi ++ ++{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 ++echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } ++if test "${ac_cv_c_stack_direction+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_c_stack_direction=0 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++int ++find_stack_direction () ++{ ++ static char *addr = 0; ++ auto char dummy; ++ if (addr == 0) ++ { ++ addr = &dummy; ++ return find_stack_direction (); ++ } ++ else ++ return (&dummy > addr) ? 1 : -1; ++} ++ ++int ++main () ++{ ++ return find_stack_direction () < 0; ++} ++_ACEOF ++rm -f conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' ++ { (case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_try") 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_c_stack_direction=1 ++else ++ echo "$as_me: program exited with status $ac_status" >&5 ++echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++( exit $ac_status ) ++ac_cv_c_stack_direction=-1 ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++fi ++ ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 ++echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } ++ ++cat >>confdefs.h <<_ACEOF ++#define STACK_DIRECTION $ac_cv_c_stack_direction ++_ACEOF ++ ++ ++fi ++ ++ ++ ++case "${host}" in ++*-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows) ++ ++cat >>confdefs.h <<\_ACEOF ++#define USE_BINARY_FOPEN 1 ++_ACEOF ++ ;; ++esac ++ ++{ echo "$as_me:$LINENO: checking whether malloc must be declared" >&5 ++echo $ECHO_N "checking whether malloc must be declared... $ECHO_C" >&6; } ++if test "${bfd_cv_decl_needed_malloc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++#include ++#ifdef HAVE_STRING_H ++#include ++#else ++#ifdef HAVE_STRINGS_H ++#include ++#endif ++#endif ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++int ++main () ++{ ++char *(*pfn) = (char *(*)) malloc ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ bfd_cv_decl_needed_malloc=no ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ bfd_cv_decl_needed_malloc=yes ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++{ echo "$as_me:$LINENO: result: $bfd_cv_decl_needed_malloc" >&5 ++echo "${ECHO_T}$bfd_cv_decl_needed_malloc" >&6; } ++if test $bfd_cv_decl_needed_malloc = yes; then ++ bfd_tr_decl=NEED_DECLARATION_`echo malloc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ ++cat >>confdefs.h <<_ACEOF ++#define $bfd_tr_decl 1 ++_ACEOF ++ ++fi ++ ++{ echo "$as_me:$LINENO: checking whether realloc must be declared" >&5 ++echo $ECHO_N "checking whether realloc must be declared... $ECHO_C" >&6; } ++if test "${bfd_cv_decl_needed_realloc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++#include ++#ifdef HAVE_STRING_H ++#include ++#else ++#ifdef HAVE_STRINGS_H ++#include ++#endif ++#endif ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++int ++main () ++{ ++char *(*pfn) = (char *(*)) realloc ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ bfd_cv_decl_needed_realloc=no ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ bfd_cv_decl_needed_realloc=yes ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++{ echo "$as_me:$LINENO: result: $bfd_cv_decl_needed_realloc" >&5 ++echo "${ECHO_T}$bfd_cv_decl_needed_realloc" >&6; } ++if test $bfd_cv_decl_needed_realloc = yes; then ++ bfd_tr_decl=NEED_DECLARATION_`echo realloc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ ++cat >>confdefs.h <<_ACEOF ++#define $bfd_tr_decl 1 ++_ACEOF ++ ++fi ++ ++{ echo "$as_me:$LINENO: checking whether free must be declared" >&5 ++echo $ECHO_N "checking whether free must be declared... $ECHO_C" >&6; } ++if test "${bfd_cv_decl_needed_free+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++#include ++#ifdef HAVE_STRING_H ++#include ++#else ++#ifdef HAVE_STRINGS_H ++#include ++#endif ++#endif ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++int ++main () ++{ ++char *(*pfn) = (char *(*)) free ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ bfd_cv_decl_needed_free=no ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ bfd_cv_decl_needed_free=yes ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++{ echo "$as_me:$LINENO: result: $bfd_cv_decl_needed_free" >&5 ++echo "${ECHO_T}$bfd_cv_decl_needed_free" >&6; } ++if test $bfd_cv_decl_needed_free = yes; then ++ bfd_tr_decl=NEED_DECLARATION_`echo free | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ ++cat >>confdefs.h <<_ACEOF ++#define $bfd_tr_decl 1 ++_ACEOF ++ ++fi ++ ++{ echo "$as_me:$LINENO: checking whether strtok must be declared" >&5 ++echo $ECHO_N "checking whether strtok must be declared... $ECHO_C" >&6; } ++if test "${bfd_cv_decl_needed_strtok+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++#include ++#ifdef HAVE_STRING_H ++#include ++#else ++#ifdef HAVE_STRINGS_H ++#include ++#endif ++#endif ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++int ++main () ++{ ++char *(*pfn) = (char *(*)) strtok ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ bfd_cv_decl_needed_strtok=no ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ bfd_cv_decl_needed_strtok=yes ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++ ++{ echo "$as_me:$LINENO: result: $bfd_cv_decl_needed_strtok" >&5 ++echo "${ECHO_T}$bfd_cv_decl_needed_strtok" >&6; } ++if test $bfd_cv_decl_needed_strtok = yes; then ++ bfd_tr_decl=NEED_DECLARATION_`echo strtok | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ ++cat >>confdefs.h <<_ACEOF ++#define $bfd_tr_decl 1 ++_ACEOF ++ ++fi ++ ++ ++ ++ ++# Check whether --with-pkgversion was given. ++if test "${with_pkgversion+set}" = set; then ++ withval=$with_pkgversion; case "$withval" in ++ yes) { { echo "$as_me:$LINENO: error: package version not specified" >&5 ++echo "$as_me: error: package version not specified" >&2;} ++ { (exit 1); exit 1; }; } ;; ++ no) PKGVERSION= ;; ++ *) PKGVERSION="($withval) " ;; ++ esac ++else ++ PKGVERSION="(MIPS Convert) " ++ ++fi ++ ++ ++ ++ ++ ++# Check whether --with-bugurl was given. ++if test "${with_bugurl+set}" = set; then ++ withval=$with_bugurl; case "$withval" in ++ yes) { { echo "$as_me:$LINENO: error: bug URL not specified" >&5 ++echo "$as_me: error: bug URL not specified" >&2;} ++ { (exit 1); exit 1; }; } ;; ++ no) BUGURL= ++ ;; ++ *) BUGURL="$withval" ++ ;; ++ esac ++else ++ BUGURL="http://support.codesourcery.com/" ++ ++fi ++ ++ case ${BUGURL} in ++ "") ++ REPORT_BUGS_TO= ++ REPORT_BUGS_TEXI= ++ ;; ++ *) ++ REPORT_BUGS_TO="<$BUGURL>" ++ REPORT_BUGS_TEXI=@uref{`echo "$BUGURL" | sed 's/@/@@/g'`} ++ ;; ++ esac; ++ ++ ++ ++ ++{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } ++ # Check whether --enable-maintainer-mode was given. ++if test "${enable_maintainer_mode+set}" = set; then ++ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval ++else ++ USE_MAINTAINER_MODE=no ++fi ++ ++ { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 ++echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } ++ ++ ++if test $USE_MAINTAINER_MODE = yes; then ++ MAINTAINER_MODE_TRUE= ++ MAINTAINER_MODE_FALSE='#' ++else ++ MAINTAINER_MODE_TRUE='#' ++ MAINTAINER_MODE_FALSE= ++fi ++ ++ MAINT=$MAINTAINER_MODE_TRUE ++ ++ ++ ++ac_config_files="$ac_config_files Makefile" ++ ++cat >confcache <<\_ACEOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs, see configure's option --config-cache. ++# It is not useful on other systems. If it contains results you don't ++# want to keep, you may remove or edit it. ++# ++# config.status only pays attention to the cache file if you give it ++# the --recheck option to rerun configure. ++# ++# `ac_cv_env_foo' variables (set or unset) will be overridden when ++# loading this file, other *unset* `ac_cv_foo' will be assigned the ++# following values. ++ ++_ACEOF ++ ++# The following way of writing the cache mishandles newlines in values, ++# but we know of no workaround that is simple, portable, and efficient. ++# So, we kill variables containing newlines. ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++( ++ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do ++ eval ac_val=\$$ac_var ++ case $ac_val in #( ++ *${as_nl}*) ++ case $ac_var in #( ++ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 ++echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; ++ esac ++ case $ac_var in #( ++ _ | IFS | as_nl) ;; #( ++ *) $as_unset $ac_var ;; ++ esac ;; ++ esac ++ done ++ ++ (set) 2>&1 | ++ case $as_nl`(ac_space=' '; set) 2>&1` in #( ++ *${as_nl}ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote ++ # substitution turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ "s/'/'\\\\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ++ ;; #( ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ++ ;; ++ esac | ++ sort ++) | ++ sed ' ++ /^ac_cv_env_/b end ++ t clear ++ :clear ++ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ ++ t end ++ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ ++ :end' >>confcache ++if diff "$cache_file" confcache >/dev/null 2>&1; then :; else ++ if test -w "$cache_file"; then ++ test "x$cache_file" != "x/dev/null" && ++ { echo "$as_me:$LINENO: updating cache $cache_file" >&5 ++echo "$as_me: updating cache $cache_file" >&6;} ++ cat confcache >$cache_file ++ else ++ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 ++echo "$as_me: not updating unwritable cache $cache_file" >&6;} ++ fi ++fi ++rm -f confcache ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++DEFS=-DHAVE_CONFIG_H ++ ++ac_libobjs= ++ac_ltlibobjs= ++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue ++ # 1. Remove the extension, and $U if already installed. ++ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ++ ac_i=`echo "$ac_i" | sed "$ac_script"` ++ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR ++ # will be set to the directory where LIBOBJS objects are built. ++ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ++ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' ++done ++LIBOBJS=$ac_libobjs ++ ++LTLIBOBJS=$ac_ltlibobjs ++ ++ ++if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then ++ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. ++Usually this means the macro was only invoked conditionally." >&5 ++echo "$as_me: error: conditional \"AMDEP\" was never defined. ++Usually this means the macro was only invoked conditionally." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then ++ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. ++Usually this means the macro was only invoked conditionally." >&5 ++echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. ++Usually this means the macro was only invoked conditionally." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then ++ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. ++Usually this means the macro was only invoked conditionally." >&5 ++echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. ++Usually this means the macro was only invoked conditionally." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++: ${CONFIG_STATUS=./config.status} ++ac_clean_files_save=$ac_clean_files ++ac_clean_files="$ac_clean_files $CONFIG_STATUS" ++{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 ++echo "$as_me: creating $CONFIG_STATUS" >&6;} ++cat >$CONFIG_STATUS <<_ACEOF ++#! $SHELL ++# Generated by $as_me. ++# Run this file to recreate the current configuration. ++# Compiler output produced by configure, useful for debugging ++# configure, is in config.log if it exists. ++ ++debug=false ++ac_cs_recheck=false ++ac_cs_silent=false ++SHELL=\${CONFIG_SHELL-$SHELL} ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be more Bourne compatible ++DUALCASE=1; export DUALCASE # for MKS sh ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++ ++ ++# PATH needs CR ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# IFS ++# We need space, tab and new line, in precisely that order. Quoting is ++# there to prevent editors from complaining about space-tab. ++# (If _AS_PATH_WALK were called with IFS unset, it would disable word ++# splitting by setting IFS to empty value.) ++as_nl=' ++' ++IFS=" "" $as_nl" ++ ++# Find who we are. Look in the path if we contain no directory separator. ++case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++# We did not find ourselves, most probably we were run as `sh COMMAND' ++# in which case we are not to be found in the path. ++if test "x$as_myself" = x; then ++ as_myself=$0 ++fi ++if test ! -f "$as_myself"; then ++ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ { (exit 1); exit 1; } ++fi ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++for as_var in ENV MAIL MAILPATH ++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++done ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename -- "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ ++# CDPATH. ++$as_unset CDPATH ++ ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line after each line using $LINENO; the second 'sed' ++ # does the real work. The second script uses 'N' to pair each ++ # line-number line with the line containing $LINENO, and appends ++ # trailing '-' during substitution so that $LINENO is not a special ++ # case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # scripts with optimization help from Paolo Bonzini. Blame Lee ++ # E. McMahon (1931-1989) for sed's syntax. :-) ++ sed -n ' ++ p ++ /[$]LINENO/= ++ ' <$as_myself | ++ sed ' ++ s/[$]LINENO.*/&-/ ++ t lineno ++ b ++ :lineno ++ N ++ :loop ++ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ ++ t loop ++ s/-\n.*// ++ ' >$as_me.lineno && ++ chmod +x "$as_me.lineno" || ++ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensitive to this). ++ . "./$as_me.lineno" ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then ++ as_dirname=dirname ++else ++ as_dirname=false ++fi ++ ++ECHO_C= ECHO_N= ECHO_T= ++case `echo -n x` in ++-n*) ++ case `echo 'x\c'` in ++ *c*) ECHO_T=' ';; # ECHO_T is single tab character. ++ *) ECHO_C='\c';; ++ esac;; ++*) ++ ECHO_N='-n';; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++if test -d conf$$.dir; then ++ rm -f conf$$.dir/conf$$.file ++else ++ rm -f conf$$.dir ++ mkdir conf$$.dir ++fi ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s='ln -s' ++ # ... but there are two gotchas: ++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. ++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. ++ # In both cases, we have to default to `cp -p'. ++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ++ as_ln_s='cp -p' ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file ++rmdir conf$$.dir 2>/dev/null ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++if test -x / >/dev/null 2>&1; then ++ as_test_x='test -x' ++else ++ if ls -dL / >/dev/null 2>&1; then ++ as_ls_L_option=L ++ else ++ as_ls_L_option= ++ fi ++ as_test_x=' ++ eval sh -c '\'' ++ if test -d "$1"; then ++ test -d "$1/."; ++ else ++ case $1 in ++ -*)set "./$1";; ++ esac; ++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ++ ???[sx]*):;;*)false;;esac;fi ++ '\'' sh ++ ' ++fi ++as_executable_p=$as_test_x ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ ++ ++exec 6>&1 ++ ++# Save the log message, to keep $[0] and so on meaningful, and to ++# report actual input values of CONFIG_FILES etc. instead of their ++# values after options handling. ++ac_log=" ++This file was extended by convert $as_me 3.0.4, which was ++generated by GNU Autoconf 2.61. Invocation command line was ++ ++ CONFIG_FILES = $CONFIG_FILES ++ CONFIG_HEADERS = $CONFIG_HEADERS ++ CONFIG_LINKS = $CONFIG_LINKS ++ CONFIG_COMMANDS = $CONFIG_COMMANDS ++ $ $0 $@ ++ ++on `(hostname || uname -n) 2>/dev/null | sed 1q` ++" ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++# Files that config.status was made for. ++config_files="$ac_config_files" ++config_headers="$ac_config_headers" ++config_commands="$ac_config_commands" ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ac_cs_usage="\ ++\`$as_me' instantiates files from templates according to the ++current configuration. ++ ++Usage: $0 [OPTIONS] [FILE]... ++ ++ -h, --help print this help, then exit ++ -V, --version print version number and configuration settings, then exit ++ -q, --quiet do not print progress messages ++ -d, --debug don't remove temporary files ++ --recheck update $as_me by reconfiguring in the same conditions ++ --file=FILE[:TEMPLATE] ++ instantiate the configuration file FILE ++ --header=FILE[:TEMPLATE] ++ instantiate the configuration header FILE ++ ++Configuration files: ++$config_files ++ ++Configuration headers: ++$config_headers ++ ++Configuration commands: ++$config_commands ++ ++Report bugs to ." ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++ac_cs_version="\\ ++convert config.status 3.0.4 ++configured by $0, generated by GNU Autoconf 2.61, ++ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" ++ ++Copyright (C) 2006 Free Software Foundation, Inc. ++This config.status script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it." ++ ++ac_pwd='$ac_pwd' ++srcdir='$srcdir' ++INSTALL='$INSTALL' ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++# If no file are specified by the user, then we need to provide default ++# value. By we need to know if files were specified by the user. ++ac_need_defaults=: ++while test $# != 0 ++do ++ case $1 in ++ --*=*) ++ ac_option=`expr "X$1" : 'X\([^=]*\)='` ++ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ++ ac_shift=: ++ ;; ++ *) ++ ac_option=$1 ++ ac_optarg=$2 ++ ac_shift=shift ++ ;; ++ esac ++ ++ case $ac_option in ++ # Handling of the options. ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ ac_cs_recheck=: ;; ++ --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) ++ echo "$ac_cs_version"; exit ;; ++ --debug | --debu | --deb | --de | --d | -d ) ++ debug=: ;; ++ --file | --fil | --fi | --f ) ++ $ac_shift ++ CONFIG_FILES="$CONFIG_FILES $ac_optarg" ++ ac_need_defaults=false;; ++ --header | --heade | --head | --hea ) ++ $ac_shift ++ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ++ ac_need_defaults=false;; ++ --he | --h) ++ # Conflict between --help and --header ++ { echo "$as_me: error: ambiguous option: $1 ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; };; ++ --help | --hel | -h ) ++ echo "$ac_cs_usage"; exit ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil | --si | --s) ++ ac_cs_silent=: ;; ++ ++ # This is an error. ++ -*) { echo "$as_me: error: unrecognized option: $1 ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; } ;; ++ ++ *) ac_config_targets="$ac_config_targets $1" ++ ac_need_defaults=false ;; ++ ++ esac ++ shift ++done ++ ++ac_configure_extra_args= ++ ++if $ac_cs_silent; then ++ exec 6>/dev/null ++ ac_configure_extra_args="$ac_configure_extra_args --silent" ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++if \$ac_cs_recheck; then ++ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 ++ CONFIG_SHELL=$SHELL ++ export CONFIG_SHELL ++ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++exec 5>>config.log ++{ ++ echo ++ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ++## Running $as_me. ## ++_ASBOX ++ echo "$ac_log" ++} >&5 ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++# ++# INIT-COMMANDS ++# ++AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ ++# Handling of arguments. ++for ac_config_target in $ac_config_targets ++do ++ case $ac_config_target in ++ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; ++ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; ++ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; ++ ++ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 ++echo "$as_me: error: invalid argument: $ac_config_target" >&2;} ++ { (exit 1); exit 1; }; };; ++ esac ++done ++ ++ ++# If the user did not use the arguments to specify the items to instantiate, ++# then the envvar interface is used. Set only those that are not. ++# We use the long form for the default assignment because of an extremely ++# bizarre bug on SunOS 4.1.3. ++if $ac_need_defaults; then ++ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files ++ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers ++ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands ++fi ++ ++# Have a temporary directory for convenience. Make it in the build tree ++# simply because there is no reason against having it here, and in addition, ++# creating and moving files from /tmp can sometimes cause problems. ++# Hook for its removal unless debugging. ++# Note that there is a small window in which the directory will not be cleaned: ++# after its creation but before its name has been assigned to `$tmp'. ++$debug || ++{ ++ tmp= ++ trap 'exit_status=$? ++ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ++' 0 ++ trap '{ (exit 1); exit 1; }' 1 2 13 15 ++} ++# Create a (secure) tmp directory for tmp files. ++ ++{ ++ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && ++ test -n "$tmp" && test -d "$tmp" ++} || ++{ ++ tmp=./conf$$-$RANDOM ++ (umask 077 && mkdir "$tmp") ++} || ++{ ++ echo "$me: cannot create a temporary directory in ." >&2 ++ { (exit 1); exit 1; } ++} ++ ++# ++# Set up the sed scripts for CONFIG_FILES section. ++# ++ ++# No need to generate the scripts if there are no CONFIG_FILES. ++# This happens for instance when ./config.status config.h ++if test -n "$CONFIG_FILES"; then ++ ++_ACEOF ++ ++ ++ ++ac_delim='%!_!# ' ++for ac_last_try in false false false false false :; do ++ cat >conf$$subs.sed <<_ACEOF ++SHELL!$SHELL$ac_delim ++PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim ++PACKAGE_NAME!$PACKAGE_NAME$ac_delim ++PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim ++PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim ++PACKAGE_STRING!$PACKAGE_STRING$ac_delim ++PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim ++exec_prefix!$exec_prefix$ac_delim ++prefix!$prefix$ac_delim ++program_transform_name!$program_transform_name$ac_delim ++bindir!$bindir$ac_delim ++sbindir!$sbindir$ac_delim ++libexecdir!$libexecdir$ac_delim ++datarootdir!$datarootdir$ac_delim ++datadir!$datadir$ac_delim ++sysconfdir!$sysconfdir$ac_delim ++sharedstatedir!$sharedstatedir$ac_delim ++localstatedir!$localstatedir$ac_delim ++includedir!$includedir$ac_delim ++oldincludedir!$oldincludedir$ac_delim ++docdir!$docdir$ac_delim ++infodir!$infodir$ac_delim ++htmldir!$htmldir$ac_delim ++dvidir!$dvidir$ac_delim ++pdfdir!$pdfdir$ac_delim ++psdir!$psdir$ac_delim ++libdir!$libdir$ac_delim ++localedir!$localedir$ac_delim ++mandir!$mandir$ac_delim ++DEFS!$DEFS$ac_delim ++ECHO_C!$ECHO_C$ac_delim ++ECHO_N!$ECHO_N$ac_delim ++ECHO_T!$ECHO_T$ac_delim ++LIBS!$LIBS$ac_delim ++build_alias!$build_alias$ac_delim ++host_alias!$host_alias$ac_delim ++target_alias!$target_alias$ac_delim ++build!$build$ac_delim ++build_cpu!$build_cpu$ac_delim ++build_vendor!$build_vendor$ac_delim ++build_os!$build_os$ac_delim ++host!$host$ac_delim ++host_cpu!$host_cpu$ac_delim ++host_vendor!$host_vendor$ac_delim ++host_os!$host_os$ac_delim ++target!$target$ac_delim ++target_cpu!$target_cpu$ac_delim ++target_vendor!$target_vendor$ac_delim ++target_os!$target_os$ac_delim ++INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim ++INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim ++INSTALL_DATA!$INSTALL_DATA$ac_delim ++CYGPATH_W!$CYGPATH_W$ac_delim ++PACKAGE!$PACKAGE$ac_delim ++VERSION!$VERSION$ac_delim ++ACLOCAL!$ACLOCAL$ac_delim ++AUTOCONF!$AUTOCONF$ac_delim ++AUTOMAKE!$AUTOMAKE$ac_delim ++AUTOHEADER!$AUTOHEADER$ac_delim ++MAKEINFO!$MAKEINFO$ac_delim ++install_sh!$install_sh$ac_delim ++STRIP!$STRIP$ac_delim ++INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim ++mkdir_p!$mkdir_p$ac_delim ++AWK!$AWK$ac_delim ++SET_MAKE!$SET_MAKE$ac_delim ++am__leading_dot!$am__leading_dot$ac_delim ++AMTAR!$AMTAR$ac_delim ++am__tar!$am__tar$ac_delim ++am__untar!$am__untar$ac_delim ++CC!$CC$ac_delim ++CFLAGS!$CFLAGS$ac_delim ++LDFLAGS!$LDFLAGS$ac_delim ++CPPFLAGS!$CPPFLAGS$ac_delim ++ac_ct_CC!$ac_ct_CC$ac_delim ++EXEEXT!$EXEEXT$ac_delim ++OBJEXT!$OBJEXT$ac_delim ++DEPDIR!$DEPDIR$ac_delim ++am__include!$am__include$ac_delim ++am__quote!$am__quote$ac_delim ++AMDEP_TRUE!$AMDEP_TRUE$ac_delim ++AMDEP_FALSE!$AMDEP_FALSE$ac_delim ++AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim ++CCDEPMODE!$CCDEPMODE$ac_delim ++am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim ++am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim ++CPP!$CPP$ac_delim ++GREP!$GREP$ac_delim ++EGREP!$EGREP$ac_delim ++ALLOCA!$ALLOCA$ac_delim ++PKGVERSION!$PKGVERSION$ac_delim ++REPORT_BUGS_TO!$REPORT_BUGS_TO$ac_delim ++REPORT_BUGS_TEXI!$REPORT_BUGS_TEXI$ac_delim ++MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim ++MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim ++MAINT!$MAINT$ac_delim ++LIBOBJS!$LIBOBJS$ac_delim ++_ACEOF ++ ++ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then ++ break ++ elif $ac_last_try; then ++ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 ++echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} ++ { (exit 1); exit 1; }; } ++ else ++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " ++ fi ++done ++ ++ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` ++if test -n "$ac_eof"; then ++ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ++ ac_eof=`expr $ac_eof + 1` ++fi ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b ++_ACEOF ++sed ' ++s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g ++s/^/s,@/; s/!/@,|#_!!_#|/ ++:n ++t n ++s/'"$ac_delim"'$/,g/; t ++s/$/\\/; p ++N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ++' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF ++CEOF$ac_eof ++_ACEOF ++ ++ ++ac_delim='%!_!# ' ++for ac_last_try in false false false false false :; do ++ cat >conf$$subs.sed <<_ACEOF ++LTLIBOBJS!$LTLIBOBJS$ac_delim ++_ACEOF ++ ++ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 1; then ++ break ++ elif $ac_last_try; then ++ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 ++echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} ++ { (exit 1); exit 1; }; } ++ else ++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " ++ fi ++done ++ ++ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` ++if test -n "$ac_eof"; then ++ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ++ ac_eof=`expr $ac_eof + 1` ++fi ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end ++_ACEOF ++sed ' ++s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g ++s/^/s,@/; s/!/@,|#_!!_#|/ ++:n ++t n ++s/'"$ac_delim"'$/,g/; t ++s/$/\\/; p ++N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ++' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF ++:end ++s/|#_!!_#|//g ++CEOF$ac_eof ++_ACEOF ++ ++ ++# VPATH may cause trouble with some makes, so we remove $(srcdir), ++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++# trailing colons and then remove the whole line if VPATH becomes empty ++# (actually we leave an empty line to preserve line numbers). ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++s/:*\$(srcdir):*/:/ ++s/:*\${srcdir}:*/:/ ++s/:*@srcdir@:*/:/ ++s/^\([^=]*=[ ]*\):*/\1/ ++s/:*$// ++s/^[^=]*=[ ]*$// ++}' ++fi ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++fi # test -n "$CONFIG_FILES" ++ ++ ++for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS ++do ++ case $ac_tag in ++ :[FHLC]) ac_mode=$ac_tag; continue;; ++ esac ++ case $ac_mode$ac_tag in ++ :[FHL]*:*);; ++ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 ++echo "$as_me: error: Invalid tag $ac_tag." >&2;} ++ { (exit 1); exit 1; }; };; ++ :[FH]-) ac_tag=-:-;; ++ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; ++ esac ++ ac_save_IFS=$IFS ++ IFS=: ++ set x $ac_tag ++ IFS=$ac_save_IFS ++ shift ++ ac_file=$1 ++ shift ++ ++ case $ac_mode in ++ :L) ac_source=$1;; ++ :[FH]) ++ ac_file_inputs= ++ for ac_f ++ do ++ case $ac_f in ++ -) ac_f="$tmp/stdin";; ++ *) # Look for the file first in the build tree, then in the source tree ++ # (if the path is not absolute). The absolute path cannot be DOS-style, ++ # because $ac_f cannot contain `:'. ++ test -f "$ac_f" || ++ case $ac_f in ++ [\\/$]*) false;; ++ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; ++ esac || ++ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 ++echo "$as_me: error: cannot find input file: $ac_f" >&2;} ++ { (exit 1); exit 1; }; };; ++ esac ++ ac_file_inputs="$ac_file_inputs $ac_f" ++ done ++ ++ # Let's still pretend it is `configure' which instantiates (i.e., don't ++ # use $as_me), people would be surprised to read: ++ # /* config.h. Generated by config.status. */ ++ configure_input="Generated from "`IFS=: ++ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." ++ if test x"$ac_file" != x-; then ++ configure_input="$ac_file. $configure_input" ++ { echo "$as_me:$LINENO: creating $ac_file" >&5 ++echo "$as_me: creating $ac_file" >&6;} ++ fi ++ ++ case $ac_tag in ++ *:-:* | *:-) cat >"$tmp/stdin";; ++ esac ++ ;; ++ esac ++ ++ ac_dir=`$as_dirname -- "$ac_file" || ++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$ac_file" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ { as_dir="$ac_dir" ++ case $as_dir in #( ++ -*) as_dir=./$as_dir;; ++ esac ++ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { ++ as_dirs= ++ while :; do ++ case $as_dir in #( ++ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( ++ *) as_qdir=$as_dir;; ++ esac ++ as_dirs="'$as_qdir' $as_dirs" ++ as_dir=`$as_dirname -- "$as_dir" || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ test -d "$as_dir" && break ++ done ++ test -z "$as_dirs" || eval "mkdir $as_dirs" ++ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 ++echo "$as_me: error: cannot create directory $as_dir" >&2;} ++ { (exit 1); exit 1; }; }; } ++ ac_builddir=. ++ ++case "$ac_dir" in ++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; ++*) ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A ".." for each directory in $ac_dir_suffix. ++ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` ++ case $ac_top_builddir_sub in ++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; ++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; ++ esac ;; ++esac ++ac_abs_top_builddir=$ac_pwd ++ac_abs_builddir=$ac_pwd$ac_dir_suffix ++# for backward compatibility: ++ac_top_builddir=$ac_top_build_prefix ++ ++case $srcdir in ++ .) # We are building in place. ++ ac_srcdir=. ++ ac_top_srcdir=$ac_top_builddir_sub ++ ac_abs_top_srcdir=$ac_pwd ;; ++ [\\/]* | ?:[\\/]* ) # Absolute name. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ++ ac_abs_top_srcdir=$srcdir ;; ++ *) # Relative name. ++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_build_prefix$srcdir ++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; ++esac ++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix ++ ++ ++ case $ac_mode in ++ :F) ++ # ++ # CONFIG_FILE ++ # ++ ++ case $INSTALL in ++ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; ++ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; ++ esac ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++# If the template does not know about datarootdir, expand it. ++# FIXME: This hack should be removed a few years after 2.60. ++ac_datarootdir_hack=; ac_datarootdir_seen= ++ ++case `sed -n '/datarootdir/ { ++ p ++ q ++} ++/@datadir@/p ++/@docdir@/p ++/@infodir@/p ++/@localedir@/p ++/@mandir@/p ++' $ac_file_inputs` in ++*datarootdir*) ac_datarootdir_seen=yes;; ++*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) ++ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 ++echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++ ac_datarootdir_hack=' ++ s&@datadir@&$datadir&g ++ s&@docdir@&$docdir&g ++ s&@infodir@&$infodir&g ++ s&@localedir@&$localedir&g ++ s&@mandir@&$mandir&g ++ s&\\\${datarootdir}&$datarootdir&g' ;; ++esac ++_ACEOF ++ ++# Neutralize VPATH when `$srcdir' = `.'. ++# Shell code in configure.ac might set extrasub. ++# FIXME: do we really want to maintain this feature? ++cat >>$CONFIG_STATUS <<_ACEOF ++ sed "$ac_vpsub ++$extrasub ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++:t ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b ++s&@configure_input@&$configure_input&;t t ++s&@top_builddir@&$ac_top_builddir_sub&;t t ++s&@srcdir@&$ac_srcdir&;t t ++s&@abs_srcdir@&$ac_abs_srcdir&;t t ++s&@top_srcdir@&$ac_top_srcdir&;t t ++s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t ++s&@builddir@&$ac_builddir&;t t ++s&@abs_builddir@&$ac_abs_builddir&;t t ++s&@abs_top_builddir@&$ac_abs_top_builddir&;t t ++s&@INSTALL@&$ac_INSTALL&;t t ++$ac_datarootdir_hack ++" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out ++ ++test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && ++ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++which seems to be undefined. Please make sure it is defined." >&5 ++echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++which seems to be undefined. Please make sure it is defined." >&2;} ++ ++ rm -f "$tmp/stdin" ++ case $ac_file in ++ -) cat "$tmp/out"; rm -f "$tmp/out";; ++ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; ++ esac ++ ;; ++ :H) ++ # ++ # CONFIG_HEADER ++ # ++_ACEOF ++ ++# Transform confdefs.h into a sed script `conftest.defines', that ++# substitutes the proper values into config.h.in to produce config.h. ++rm -f conftest.defines conftest.tail ++# First, append a space to every undef/define line, to ease matching. ++echo 's/$/ /' >conftest.defines ++# Then, protect against being on the right side of a sed subst, or in ++# an unquoted here document, in config.status. If some macros were ++# called several times there might be several #defines for the same ++# symbol, which is useless. But do not sort them, since the last ++# AC_DEFINE must be honored. ++ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* ++# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where ++# NAME is the cpp macro being defined, VALUE is the value it is being given. ++# PARAMS is the parameter list in the macro definition--in most cases, it's ++# just an empty string. ++ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ++ac_dB='\\)[ (].*,\\1define\\2' ++ac_dC=' ' ++ac_dD=' ,' ++ ++uniq confdefs.h | ++ sed -n ' ++ t rset ++ :rset ++ s/^[ ]*#[ ]*define[ ][ ]*// ++ t ok ++ d ++ :ok ++ s/[\\&,]/\\&/g ++ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p ++ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ++ ' >>conftest.defines ++ ++# Remove the space that was appended to ease matching. ++# Then replace #undef with comments. This is necessary, for ++# example, in the case of _POSIX_SOURCE, which is predefined and required ++# on some systems where configure will not decide to define it. ++# (The regexp can be short, since the line contains either #define or #undef.) ++echo 's/ $// ++s,^[ #]*u.*,/* & */,' >>conftest.defines ++ ++# Break up conftest.defines: ++ac_max_sed_lines=50 ++ ++# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" ++# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" ++# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" ++# et cetera. ++ac_in='$ac_file_inputs' ++ac_out='"$tmp/out1"' ++ac_nxt='"$tmp/out2"' ++ ++while : ++do ++ # Write a here document: ++ cat >>$CONFIG_STATUS <<_ACEOF ++ # First, check the format of the line: ++ cat >"\$tmp/defines.sed" <<\\CEOF ++/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def ++/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def ++b ++:def ++_ACEOF ++ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS ++ echo 'CEOF ++ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ++ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in ++ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail ++ grep . conftest.tail >/dev/null || break ++ rm -f conftest.defines ++ mv conftest.tail conftest.defines ++done ++rm -f conftest.defines conftest.tail ++ ++echo "ac_result=$ac_in" >>$CONFIG_STATUS ++cat >>$CONFIG_STATUS <<\_ACEOF ++ if test x"$ac_file" != x-; then ++ echo "/* $configure_input */" >"$tmp/config.h" ++ cat "$ac_result" >>"$tmp/config.h" ++ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then ++ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 ++echo "$as_me: $ac_file is unchanged" >&6;} ++ else ++ rm -f $ac_file ++ mv "$tmp/config.h" $ac_file ++ fi ++ else ++ echo "/* $configure_input */" ++ cat "$ac_result" ++ fi ++ rm -f "$tmp/out12" ++# Compute $ac_file's index in $config_headers. ++_am_stamp_count=1 ++for _am_header in $config_headers :; do ++ case $_am_header in ++ $ac_file | $ac_file:* ) ++ break ;; ++ * ) ++ _am_stamp_count=`expr $_am_stamp_count + 1` ;; ++ esac ++done ++echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || ++$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X$ac_file : 'X\(//\)[^/]' \| \ ++ X$ac_file : 'X\(//\)$' \| \ ++ X$ac_file : 'X\(/\)' \| . 2>/dev/null || ++echo X$ac_file | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'`/stamp-h$_am_stamp_count ++ ;; ++ ++ :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 ++echo "$as_me: executing $ac_file commands" >&6;} ++ ;; ++ esac ++ ++ ++ case $ac_file$ac_mode in ++ "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do ++ # Strip MF so we end up with the name of the file. ++ mf=`echo "$mf" | sed -e 's/:.*$//'` ++ # Check whether this is an Automake generated Makefile or not. ++ # We used to match only the files named `Makefile.in', but ++ # some people rename them; so instead we look at the file content. ++ # Grep'ing the first line is not enough: some people post-process ++ # each Makefile.in and add a new line on top of each file to say so. ++ # So let's grep whole file. ++ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then ++ dirpart=`$as_dirname -- "$mf" || ++$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$mf" : 'X\(//\)[^/]' \| \ ++ X"$mf" : 'X\(//\)$' \| \ ++ X"$mf" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$mf" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ else ++ continue ++ fi ++ # Extract the definition of DEPDIR, am__include, and am__quote ++ # from the Makefile without running `make'. ++ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` ++ test -z "$DEPDIR" && continue ++ am__include=`sed -n 's/^am__include = //p' < "$mf"` ++ test -z "am__include" && continue ++ am__quote=`sed -n 's/^am__quote = //p' < "$mf"` ++ # When using ansi2knr, U may be empty or an underscore; expand it ++ U=`sed -n 's/^U = //p' < "$mf"` ++ # Find all dependency output files, they are included files with ++ # $(DEPDIR) in their names. We invoke sed twice because it is the ++ # simplest approach to changing $(DEPDIR) to its actual value in the ++ # expansion. ++ for file in `sed -n " ++ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ ++ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do ++ # Make sure the directory exists. ++ test -f "$dirpart/$file" && continue ++ fdir=`$as_dirname -- "$file" || ++$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$file" : 'X\(//\)[^/]' \| \ ++ X"$file" : 'X\(//\)$' \| \ ++ X"$file" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$file" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ { as_dir=$dirpart/$fdir ++ case $as_dir in #( ++ -*) as_dir=./$as_dir;; ++ esac ++ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { ++ as_dirs= ++ while :; do ++ case $as_dir in #( ++ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( ++ *) as_qdir=$as_dir;; ++ esac ++ as_dirs="'$as_qdir' $as_dirs" ++ as_dir=`$as_dirname -- "$as_dir" || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ test -d "$as_dir" && break ++ done ++ test -z "$as_dirs" || eval "mkdir $as_dirs" ++ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 ++echo "$as_me: error: cannot create directory $as_dir" >&2;} ++ { (exit 1); exit 1; }; }; } ++ # echo "creating $dirpart/$file" ++ echo '# dummy' > "$dirpart/$file" ++ done ++done ++ ;; ++ ++ esac ++done # for ac_tag ++ ++ ++{ (exit 0); exit 0; } ++_ACEOF ++chmod +x $CONFIG_STATUS ++ac_clean_files=$ac_clean_files_save ++ ++ ++# configure is writing to config.log, and then calls config.status. ++# config.status does its own redirection, appending to config.log. ++# Unfortunately, on DOS this fails, as config.log is still kept open ++# by configure, so config.status won't be able to write to it; its ++# output is simply discarded. So we exec the FD to /dev/null, ++# effectively closing config.log, so it can be properly (re)opened and ++# appended to by config.status. When coming back to configure, we ++# need to make the FD available again. ++if test "$no_create" != yes; then ++ ac_cs_success=: ++ ac_config_status_args= ++ test "$silent" = yes && ++ ac_config_status_args="$ac_config_status_args --quiet" ++ exec 5>/dev/null ++ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false ++ exec 5>>config.log ++ # Use ||, not &&, to avoid exiting from the if with $? = 1, which ++ # would make configure fail if this is the last instruction. ++ $ac_cs_success || { (exit 1); exit 1; } ++fi ++ +--- /dev/null ++++ b/convert/configure.ac +@@ -0,0 +1,38 @@ ++dnl Process this file with autoconf to produce a configure script. ++ ++AC_INIT(convert, 3.0.4) ++AC_CANONICAL_TARGET ++AM_INIT_AUTOMAKE ++AC_PREREQ(2.59) ++AC_CONFIG_SRCDIR(convert.c) ++ ++AC_PROG_CC ++AC_PROG_INSTALL ++ ++AC_ISC_POSIX ++ ++AC_HEADER_STDC ++AC_CONFIG_HEADERS([config.h]) ++AC_CHECK_HEADERS(stddef.h stdlib.h strings.h unistd.h limits.h) ++AC_CHECK_HEADERS(fcntl.h sys/file.h) ++ ++AC_C_CONST ++AC_TYPE_SIZE_T ++ ++AC_CHECK_FUNCS(strchr strtok memcpy) ++AC_FUNC_ALLOCA ++ ++CONV_BINARY_FOPEN ++ ++CONV_NEED_DECLARATION(malloc) ++CONV_NEED_DECLARATION(realloc) ++CONV_NEED_DECLARATION(free) ++CONV_NEED_DECLARATION(strtok) ++ ++ACX_PKGVERSION([MIPS Convert]) ++ACX_BUGURL([http://support.codesourcery.com/]) ++ ++AM_MAINTAINER_MODE ++ ++AC_CONFIG_FILES([Makefile]) ++AC_OUTPUT +--- /dev/null ++++ b/convert/conv.1 +@@ -0,0 +1,178 @@ ++.TH conv 1 "29 Jul 2003" "MIPS SDE" "Programmer's Manual" ++.de BP ++.sp ++.ti -.2i ++\(** ++.. ++.SH NAME ++conv \- ELF object file converter ++.SH SYNOPSIS ++.B conv ++.RB [ \-lvypr ] ++.RB [ "\-a \fIaddr" [ /\fIsize ]] ++.RB [ "\-a \fIaddr" [ :\fIlimit ]] ++.RB [ "\-R \fIoffs" ] ++.RB [ "\-f \fIfmt" ] ++.RB [ "\-i \fIoffs" ] ++.RB [ "\-w \fIwidth" ] ++.RB [ "\-b \fIbyte,..." ] ++.br ++.RB [ "\-s \fIsize" ] ++.RB [ "\-x \fIseg,..." ] ++.RB [ "\-o \fIofile" ] ++.RI [ ifile ] ++.SH DESCRIPTION ++The ++.I conv ++command takes ELF executable ++.I ifile ++and converts it into an ASCII or encoded binary format, suitable for ++downloading onto a PROM programmer or evaluation board. It can take ++horizontal and/or vertical slices through the file, to cater for PROM ++programmers that do not have this facility or memory capacity. ++.SH OPTIONS ++.TP 10 ++.B \-l ++Lists the segments in the ELF file's program header, for possible use ++in the ++.B \-x ++option below; does not produce any other output. ++.TP 10 ++.B \-v ++Selects verbose mode, which makes the program report its actions as it ++converts the file. ++.TP 10 ++.B \-p ++Selects PROM mode: output addresses start at zero; the read-only ++segments are converted first and the other segments are concatenated ++to them (aligned to 16 byte boundaries). If this option is not given, ++then the segments are converted in program header order, and the ++output addresses are the data's actual virtual addresses. ++.TP 10 ++.B \-y ++Requests symbol output: for formats which support this the file's ++symbol table is also converted and sent to the output file. ++.TP 10 ++.B \-a \fIaddr\fR[/\fIsize\fR] ++.TP 10 ++.B \-a \fIaddr\fR[:\fIlimit\fR] ++Specifies the physical address range of the PROM, for use with the ++.B \-p ++option. All input data located between \fIaddr\fP and \fIlimit\fP ++(i.e. between \fIaddr\fP and \fIaddr\fP+\fIsize\fP) are deemed to be ++intended for PROM execution, and are placed at the relevant offset ++from \fIaddr\fP. Segments outside of this address range are assumed ++to be intended for relocation to RAM, and are concatenated to the end ++of the last read-only segment. The default value for \fIaddr\fP is ++0x1fc00000, and the default \fIsize\fP is 0x400000 (i.e. 4Mb). ++.TP 10 ++.B \-r ++Selects raw binary input mode, which ignores any ELF headers and ++converts the whole input file into the output format, starting at the ++selected PROM base address. ++.TP 10 ++.B \-R \fIoffs\fR ++Selects raw binary input mode as above, but places the input ++at offset \fIoffs\fP from the PROM base address. ++.TP 10 ++.B \-f \fIfmt\fP ++Selects the output format, from the list below. If not specified then ++the environment variable ++.B DLTYPE ++is used. The default if neither of these are specified is ++.BR srec . ++.RS ++.TP 10 ++.B srec, s3 ++Motorola S-records, using S3 and S7 (32-bit address) records; symbol ++output can be provided via S4 records, as supported by LSI PMON. ++.TP 10 ++.B s2 ++Same as above, except using S2 and S8 (24-bit address) records, to ++suit some PROM programmers. ++.TP 10 ++.B s1 ++Same as above, except using S1 and S9 (16-bit address) records. ++.TP 10 ++.B lsi ++High density (radix 64) ASCII encoding for downloading by the ++.I LSI PMON ++monitor; symbol output is supported. ++.TP 10 ++.B idt ++Binary S-record format for downloading by the ++.I IDT/sim ++monitor. ++.TP 10 ++.B stagbin ++Proprietary binary format for ++.I Stag ++PROM programmers. ++.TP 10 ++.B bin ++Raw binary output, suitable for further conversion by another user ++program. ++.RE ++.TP 10 ++.BI \-w " width" ++Specifies the width of CPU data bus in bits (default: 32). ++.TP 10 ++.BI \-b " byte,..." ++The input file is read in multiples of ++.I width ++bits, and then these bytes are selected from it. The ++default is ++.RB `` 0,1,2,3 '', ++which sends all bytes in their file order. To ++perform a byte swap specify ++.RB `` 3,2,1,0 ''. ++To program four PROMs with ++consecutive bytes, run ++.I convert ++four times with ++.RB `` \-b0 '', ++.RB `` \-b1 '', ++.RB `` \-b2 '' ++and ++.RB `` \-b3 ''. ++.IP ++To handle interleaved PROMs, multiply the PROM width by the interleave, ++(e.g. ++.RB `` \-w64 '' ++for two-way interleave on a 32-bit bus), and then run ++.I conv ++interleave \(mu byte-width times ++(e.g. ++.RB `` \-b0 '' ++to ++.RB `` \-b7 ''). ++.br ++.ne 4 ++.TP 10 ++.BI \-i " offs" ++.TP 10 ++.BI \-s " size" ++Specified together to split a large program into multiple PROMs. The ++.B \-i ++flag specifies the initial offset, and ++.B \-s ++the size of the PROM. For example for two 128K proms: ++.nf ++.in +5 ++conv -f s3 -i 0x00000 -s 0x20000 -o prom.s31 prom ++conv -f s3 -i 0x20000 -s 0x20000 -o prom.s32 prom ++.in 0 ++.fi ++.TP 10 ++.BI \-x " seg,..." ++Exclude the following segments from the output; the segment numbers ++can be determined using the ++.B \-l ++option above. ++.TP 10 ++.BI "\-o " oname ++Selects ++.I oname ++as the output file, default is standard output. ++.SH SEE ALSO ++edown(1) +--- /dev/null ++++ b/convert/conv.texi +@@ -0,0 +1,232 @@ ++\input texinfo @c -*- Texinfo -*- ++@c Copyright 1993-2003,2008 ++@c Free Software Foundation, Inc. ++@c Contributed by MIPS Technologies, Inc. ++@setfilename conv.info ++ ++@ifinfo ++@format ++START-INFO-DIR-ENTRY ++* Convert: (conv). The MIPS SDE tool "sde-conv" ++END-INFO-DIR-ENTRY ++@end format ++@end ifinfo ++ ++@ifinfo ++Copyright @copyright{} 1998-2003 MIPS Technologies, Inc. All Rights Reserved. ++@end ifinfo ++ ++@synindex ky cp ++@c ++@c This file documents the MIPS ELF converter ++@c ++@c Copyright (C) 1998-2003 MIPS Technologies, Inc. All Rights Reserved. ++@c ++@c ++ ++@setchapternewpage odd ++@settitle MIPS SDE ELF Conversion Tool ++@titlepage ++@finalout ++@title MIPS SDE ELF Conversion Tool ++@subtitle @code{sde-conv} ++@subtitle Version 5.0 ++@sp 1 ++@subtitle October 2003 ++@author MIPS Technologies Inc ++@page ++ ++@tex ++\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$ ++\xdef\manvers{\$Revision$} % For use in headers, footers too ++{\parskip=0pt \hfill MIPS Technologies Inc\par \hfill \manvers\par \hfill ++\TeX{}info \texinfoversion\par } ++@end tex ++ ++@vskip 0pt plus 1filll ++Copyright @copyright{} 1998-2003 MIPS Technologies, Inc. All Rights Reserved. ++ ++@end titlepage ++ ++@node Top, (dir), (dir), (dir) ++@chapter conv ++ ++@kindex conv ++@kindex sde-conv ++@cindex convert ELF files ++ ++@smallexample ++sde-conv [ -l ] [ -v ] [ -y ] [ -p ] [ -r ] ++ [ -a @var{addr}[/@var{size}] ] ++ [ -a @var{addr}[:@var{limit}] ] ++ [ -f @var{fmt} ] [ -R @var{offs} ] ++ [ -w @var{width} ] [ -b @var{byte},... ] ++ [ -i @var{offs} ] [ -s @var{size} ] ++ [ -x @var{seg},... ] [ -o @var{ofile} ] @var{ifile} ++@end smallexample ++ ++The @code{sde-conv} utility takes ELF executable @var{ifile} ++and converts it into an ASCII or encoded binary format, suitable for ++downloading onto a PROM programmer or evaluation board. It can take ++horizontal and/or vertical slices through the file, to cater for PROM ++programmers that do not have this facility or memory capacity. ++ ++@table @code ++ ++@item -o @var{ofile} ++Selects @var{ofile} ++as the output file, the default is the standard output. Note: you must ++use this for the binary output format. ++ ++@cindex list program segments ++@item -l ++Lists the segments in the ELF file's program header, for possible use ++in the @code{-x} option below; does not produce any other output. ++ ++@item -v ++Selects verbose mode, which makes the program report its actions as it ++converts the file. ++ ++@cindex output symbol data ++@item -y ++Requests symbol output: for formats which support this the file's ++symbol table is also converted and sent to the output file. ++ ++@cindex specify PROM address ++@item -a @var{addr} ++@itemx -a @var{addr}:@var{limit} ++@itemx -a @var{addr}/@var{size} ++Selects PROM output mode and specifies the physical address range of the ++PROM. All input data located between @var{addr} and @var{limit} (or ++between @var{addr} and @var{addr}+@var{size}) are deemed to be ++PROM-resident, and are mapped to their relative offset from @var{addr}. ++Segments outside of this address range are assumed to be intended for ++relocation to RAM, and they are concatenated to the end of the last ++PROM-resident segment (rounded to the next 16 byte boundary). The ++default value for @var{addr} is @code{1fc00000}, and the default ++@var{size} is @code{400000} (i.e. 4Mb). ++ ++Note that if the code segment has a load address that doesn't fall ++inside the ROM then it will get treated like an initialised data ++segment. It will get mapped to the start of the ROM (the reset ++exception address) if it was linked with the lowest address, and then ++your reset code can be carefully written to copy the code segment ++from ROM to RAM. ++ ++@cindex create PROM image ++@item -p ++Selects PROM output mode, equivalent to @samp{-a@ 1fc00000/400000}. ++ ++@cindex raw binary input ++@item -r ++Selects raw binary input mode, which ignores any ELF headers and ++converts the whole input file into the output format, starting at the ++selected PROM base address. ++ ++@item -R @var{offs} ++Selects raw binary input mode as above, but places the input ++at offset @var{offs} from the PROM base address. ++ ++@cindex output file format ++@item -f @var{fmt} ++Selects the output format, from the list below. If not specified then ++the environment variable @code{DLTYPE} ++is used. The default if neither of these are specified is ++@code{srec}. ++ ++@table @code ++@cindex Motorola ++@cindex S-records ++@item srec ++@itemx s3 ++Motorola S-records, using S3 and S7 (32-bit address) records. Symbol ++output is provided via S4 records, as supported by LSI PMON, if the ++@code{-y} option is also used. ++ ++@item s2 ++Same as above, except using S2 and S8 (24-bit address) records, to ++suit some PROM programmers. ++ ++@item s1 ++Same as above, except using S1 and S9 (16-bit address) records. ++ ++@cindex LSI PMON format ++@item lsi ++High density (radix 64) ASCII encoding for downloading by the ++@samp{LSI PMON} ++monitor; symbol output is supported with the @code{-y} option. ++ ++@cindex IDT/sim binary format ++@item idt ++Binary S-record format for downloading by the @samp{IDT/sim} monitor. ++ ++@cindex Stag binary format ++@item stagbin ++@itemx sbin ++Proprietary binary format for @samp{Stag} PROM programmers. ++ ++@cindex MIPS flash format ++@cindex fl ++@item fl ++MIPS flash file format, suitable for downloading to a Malta ++or SEAD-2 board. ++ ++@cindex raw binary output ++@item bin ++Raw binary output, suitable for further conversion by another user ++program. ++ ++@cindex relocated ELF ++@cindex relf ++@item relf ++Relocated ELF executable object file output, with the code and data ++relocated to their new addresses in ROM, as selected by the @samp{-p} or ++@samp{-a} options. This can be used to generate a ROM image which can be ++loaded by gdb's MDI interface. Note that symbols and other debug ++information are not copied to the new file, and the file's entrypoint ++address is set to the base ROM address. ++@end table ++ ++@cindex PROM width ++@item -w @var{width} ++Specifies the width of CPU data bus in bits (default: 32). ++ ++@cindex byte select ++@cindex interleaved PROMS ++@item -b @var{byte},... ++The input file is read in multiples of @var{width} bits, and then these ++bytes are selected from it. The default is @samp{0,1,2,3}, which sends ++all bytes in their file order. To perform a byte swap specify ++@samp{3,2,1,0}. To program four PROMs with consecutive bytes, run ++@code{conv} four times with @samp{-b0}, @samp{-b1}, @samp{-b2} and ++@samp{-b3}. ++ ++To handle interleaved PROMs, multiply the PROM width by the interleave, ++(e.g. @samp{-w64} for two-way interleave on a 32-bit bus), and then run ++@code{conv} interleave times byte-width times ++(e.g. @samp{-b0} to @samp{-b7}). ++ ++@cindex split into multiple PROMS ++@item -i @var{offs} ++@itemx -s @var{size} ++Specified together to split a large program into multiple PROMs. The ++@code{-i} ++flag specifies the initial offset, and ++@code{-s} ++the size of the PROM. For example for two 128K proms: ++ ++@quotation ++@smallexample ++conv -f s3 -i 0x00000 -s 0x20000 -o prom.s3.1 prom ++conv -f s3 -i 0x20000 -s 0x20000 -o prom.s3.2 prom ++@end smallexample ++@end quotation ++ ++@cindex select program segments ++@item -x @var{seg},... ++Exclude the following segments from the output; the segment numbers ++can be determined using the @code{-l} option described above. ++ ++@end table ++ ++@bye +--- /dev/null ++++ b/convert/convert.c +@@ -0,0 +1,717 @@ ++/* convert.c -- ELF to hex (etc) file converter ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++#include "elfmips.h" ++#include "conv-version.h" ++ ++#include ++ ++#include ++ ++struct format { ++ const char *name; ++ int binary; ++ void (*start) (FILE *, unsigned long, int); ++ void (*output) (unsigned long, unsigned char); ++ void (*sym) (char *, unsigned long); ++ void (*end) (unsigned long); ++ const char *desc; ++}; ++ ++extern void Srec3Start (FILE *, unsigned long, int); ++extern void Srec2Start (FILE *, unsigned long, int); ++extern void Srec1Start (FILE *, unsigned long, int); ++extern void SrecOutput (unsigned long, unsigned char); ++extern void SrecSym (char *, unsigned long); ++extern void SrecEnd (unsigned long); ++ ++extern void LsiStart (FILE *, unsigned long, int); ++extern void LsiOutput (unsigned long, unsigned char); ++extern void LsiSym (char *, unsigned long); ++extern void LsiEnd (unsigned long); ++ ++extern void StagStart (FILE *, unsigned long, int); ++extern void StagOutput (unsigned long, unsigned char); ++extern void StagEnd (unsigned long); ++ ++extern void BinStart (FILE *, unsigned long, int); ++extern void BinOutput (unsigned long, unsigned char); ++extern void BinEnd (unsigned long); ++ ++extern void IdtStart (FILE *, unsigned long, int); ++extern void IdtOutput (unsigned long, unsigned char); ++extern void IdtEnd (unsigned long); ++ ++extern void ElfStart (FILE *, unsigned long, int); ++extern void ElfOutput (unsigned long, unsigned char); ++extern void ElfEnd (unsigned long); ++ ++extern void MipsStart (FILE *, unsigned long, int); ++extern void MipsOutput (unsigned long, unsigned char); ++extern void MipsEnd (unsigned long); ++ ++static const struct format formats[] = { ++ {"srec", 0, Srec3Start, SrecOutput, SrecSym, SrecEnd, ++ "Motorola S-record (32-bit address)"}, ++ {"s3", 0, Srec3Start, SrecOutput, SrecSym, SrecEnd, ++ "Motorola S-record (32-bit address)"}, ++ {"s2", 0, Srec2Start, SrecOutput, SrecSym, SrecEnd, ++ "Motorola S-record (24-bit address)"}, ++ {"s1", 0, Srec1Start, SrecOutput, SrecSym, SrecEnd, ++ "Motorola S-record (16-bit address)"}, ++ {"lsi", 0, LsiStart, LsiOutput, LsiSym, LsiEnd, ++ "LSI fast download (PMON)"}, ++ {"fl", 0, MipsStart, MipsOutput, 0, MipsEnd, ++ "MIPS flash download"}, ++ {"idt", 1, IdtStart, IdtOutput, 0, IdtEnd, ++ "IDT/sim binary S-record"}, ++ {"sbin", 1, StagStart, StagOutput, 0, StagEnd, ++ "Stag PROM programmer"}, ++ {"bin", 1, BinStart, BinOutput, 0, BinEnd, ++ "Raw binary"}, ++ {"relf", 1, ElfStart, ElfOutput, 0, ElfEnd, ++ "Relocated ELF"}, ++ {0} ++}; ++ ++ ++char * progname; ++int promflag = 0; ++static int symflag = 0; ++static int listflag = 0; ++static int verbose = 0; ++ ++#define MAXALIGN 16 /* align segments to 16 byte boundaries */ ++ ++#define MAXSEGS 20 ++static unsigned segomit[MAXSEGS]; ++static unsigned omitseg[MAXSEGS]; ++static unsigned nomit; ++ ++#define MAXWIDTH 8 ++static unsigned bytelist[MAXWIDTH]; ++static unsigned nbytes; ++static unsigned width = 4; /* in bytes */ ++ ++typedef unsigned long msize_t; ++ msize_t prombase = 0x1fc00000; ++static msize_t promlimit = 0; ++static msize_t promstart; ++static msize_t promend; ++ ++static void ++usage (int error) ++{ ++ const struct format *fmt; ++ FILE* to = error ? stderr : stdout; ++ ++ fprintf(to, ++"usage: %s [-lvypr] [-f fmt] [-w width] [-b byte,...] [-i offs] [-s size]\n" ++" [-R offs] [-x seg,...] [-a addr] [-o file] [file]\n" ++" -l list segments only, no conversion\n" ++" -v verbose conversion option\n" ++" -y include symbols\n" ++" -p prom mode (start addresses at zero)\n" ++" -a addr[:lim] address of prom (default: 1fc00000:20000000)\n" ++" -a addr[/size] address of prom (default: 1fc00000/400000)\n" ++" -r raw binary input (not ELF)\n" ++" -R offs raw binary, start addresses at offs (default: 0)\n" ++" -EB | -EL set big or little endianness\n" ++" -f fmt output format (default: srec)\n" ++" -w width data width in bits (default: 32)\n" ++" -b byte,... select bytes (default: 0,1,2,3)\n" ++" -i offs initial input offset (default: 0)\n" ++" -s size prom size (default: infinite)\n" ++" -x seg,... exclude segments (default: none)\n" ++ , progname); ++ ++ fprintf (to, "\nOutput formats (-f):\n"); ++ for (fmt = formats; fmt->name; fmt++) ++ fprintf (to, " %s\t%s\n", fmt->name, fmt->desc ? fmt->desc : ""); ++ ++ fprintf (to, "\nReport bugs to " CONVERT_REPORT_BUGS_TO ".\n"); ++ ++ exit(error); ++} ++ ++ ++static int ++parselist (char *arg, unsigned *list, int lsize) ++{ ++ char *s, *ep; ++ int n = 0; ++ ++ for (s = strtok (arg, ","); s; s = strtok (0, ",")) { ++ if (n >= lsize) { ++ fprintf (stderr, "%s: too many items in list\n", progname); ++ usage (1); ++ } ++ list[n++] = strtol (s, &ep, 0); ++ if (*ep) { ++ fprintf (stderr, "%s: bad number in list: %s\n", progname, s); ++ usage (1); ++ } ++ } ++ return n; ++} ++ ++static char * ++phtype (Elf32_Phdr *ph) ++{ ++ static char buf[11]; ++ ++ switch (ph->p_type) { ++ case PT_NULL: ++ return "NULL "; ++ case PT_LOAD: ++ return "LOAD "; ++ case PT_DYNAMIC: ++ return "DYNAMIC "; ++ case PT_INTERP: ++ return "INTERP "; ++ case PT_NOTE: ++ return "NOTE "; ++ case PT_SHLIB: ++ return "SHLIB "; ++ case PT_PHDR: ++ return "PHDR "; ++ case PT_MIPS_REGINFO: ++ return "REGINFO "; ++ default: ++ sprintf (buf, "%08x", ph->p_type); ++ return buf; ++ } ++} ++ ++ ++static char * ++phflags (Elf32_Phdr *ph) ++{ ++ static char buf[4]; ++ buf[0] = (ph->p_flags & PF_R) ? 'r' : '-'; ++ buf[1] = (ph->p_flags & PF_W) ? 'w' : '-'; ++ buf[2] = (ph->p_flags & PF_X) ? 'x' : '-'; ++ buf[3] = '\0'; ++ return buf; ++} ++ ++ ++static void ++convertSegment (FILE *ifp, const struct format *fmt, Elf32_Phdr *ph) ++{ ++ unsigned char buf[MAXWIDTH]; ++ static msize_t req_top = 0, offs_top = 0; ++ static unsigned int last_flags = 0; ++ msize_t req, offset; ++ unsigned long skip = 0; ++ long n; ++ ++ /* get requested physical address */ ++ req = (ph->p_paddr ? ph->p_paddr : ph->p_vaddr); ++ if (promflag) { ++ offset = req & 0x1fffffff; ++ if (offset < prombase || offset >= promlimit) { ++ /* not a valid prom address: force to rom */ ++ if (offs_top == 0) { ++ /* force to start, whatever it says in the file */ ++ offset = prombase; ++ } ++ else { ++ unsigned long align = ph->p_align ? ph->p_align - 1 : 0; ++ if (req == ((req_top + align) & ~align) ++ && ((ph->p_flags ^ last_flags) & PF_W) == 0) { ++ /* segment is contiguous and of same read/write type, ++ then keep its relative offset the same */ ++ offset = offs_top + (req - req_top); ++ } ++ else { ++ /* segment is not contiguous, or a different type, ++ put at next MAXALIGN boundary. */ ++ align = MAXALIGN - 1; ++ offset = (offs_top + align) & ~align; ++ } ++ } ++ } ++ } ++ else { ++ /* not a prom: preserve load address */ ++ offset = req; ++ } ++ ++ req_top = req + ph->p_memsz; ++ offs_top = offset + ph->p_memsz; ++ last_flags = ph->p_flags; ++ ++ if (promflag) { ++ /* convert to offset from start of PROM */ ++ offset -= prombase; ++ /* skip as many bytes as necessary to reach requested start */ ++ if (offset < promstart) { ++ skip = (promstart - offset) * (width / nbytes); ++ if (skip >= ph->p_filesz) ++ skip = ph->p_filesz; ++ offset += ((skip + width - 1) / width) * nbytes; ++ } ++ } ++ ++ if (skip < ph->p_filesz) { ++ fseek (ifp, ph->p_offset + skip, SEEK_SET); ++ n = ph->p_filesz - skip; ++ ++ /* convert to offset and size in prom */ ++ offset /= (width / nbytes); ++ n = (n + (width / nbytes) - 1) / (width / nbytes); ++ ++ if (verbose) { ++ int i, j; ++ fprintf (stderr, "%s segment %08x:%08x -> %s %05x:%05x [", ++ phflags (ph), req, req + n, ++ fmt->name, offset, offset + n); ++ for (i = 0; i < width; i++) { ++ for (j = 0; j < nbytes; j++) ++ if (bytelist[j] == i) ++ break; ++ if (j < nbytes) ++ fprintf (stderr, "%x", j); ++ else ++ fprintf (stderr, "-"); ++ } ++ fprintf (stderr, "]\n"); ++ } ++ ++ while (n > 0 && offset < promend) { ++ int nr, i; ++ if ((nr = fread (buf, 1, width, ifp)) <= 0) { ++ fprintf (stderr, "%s: bad file read\n", progname); ++ exit (1); ++ } ++ for (i = 0; i < nbytes; i++) { ++ int bn = bytelist[i]; ++ if (bn < nr) ++ (*fmt->output) (offset++, buf[bn]); ++ } ++ n -= nbytes; ++ } ++ } ++} ++ ++static void ++convertSymbols (FILE *ifp, Elf32_Ehdr *eh, const struct format *fmt) ++{ ++ Elf32_Shdr *shtab, *sh; ++ char *strtab; ++ int i; ++ ++ shtab = (Elf32_Shdr *) xmalloc (eh->e_shnum * sizeof(Elf32_Shdr)); ++ ++ fseek (ifp, eh->e_shoff, SEEK_SET); ++ if (elfShdrRead (ifp, eh, shtab, eh->e_shnum) != eh->e_shnum) { ++ fprintf (stderr,"%s: failed to read section headers\n", progname); ++ exit (1); ++ } ++ ++ for (i = 0; i < eh->e_shnum; i++) ++ if (shtab[i].sh_type == SHT_SYMTAB) ++ break; ++ if (i >= eh->e_shnum) { ++ free (shtab); ++ return; ++ } ++ ++ /* get string table */ ++ sh = &shtab[shtab[i].sh_link]; ++ strtab = (char *) xmalloc (sh->sh_size); ++ fseek (ifp, sh->sh_offset, SEEK_SET); ++ if (fread (strtab, 1, sh->sh_size, ifp) != sh->sh_size) { ++ fprintf (stderr, "%s: cannot read string table\n", progname); ++ exit (1); ++ } ++ ++ /* scan symbol table */ ++ sh = &shtab[i]; ++ fseek (ifp, sh->sh_offset, SEEK_SET); ++ for (i = sh->sh_size / sh->sh_entsize; i != 0; i--) { ++ Elf32_Sym sym; ++ int type; ++ ++ if (elfSymRead (ifp, eh, sh, &sym, 1) != 1) { ++ fprintf (stderr, "%s: cannot read symbol table\n", progname); ++ exit (1); ++ } ++ switch (sym.st_shndx) { ++ case SHN_UNDEF: ++ case SHN_COMMON: ++ continue; ++ } ++ ++ type = ELF32_ST_TYPE (sym.st_info); ++ switch (type) { ++ case STT_SECTION: ++ case STT_FILE: ++ continue; ++ } ++ ++ /* only emit globals and functions */ ++ if (ELF32_ST_BIND (sym.st_info) != STB_GLOBAL && type != STT_FUNC) ++ continue; ++ ++ if (sym.st_other == 0xf0) ++ sym.st_value |= 1; ++ ++ (*fmt->sym) (strtab + sym.st_name, sym.st_value); ++ } ++ ++ free (strtab); ++ free (shtab); ++} ++ ++ ++/* comparison function for qsort() */ ++int ++phcompar (const void *a, const void *b) ++{ ++ const Elf32_Phdr *pha = a; ++ const Elf32_Phdr *phb = b; ++ unsigned long addra = pha->p_paddr ? pha->p_paddr : pha->p_vaddr; ++ unsigned long addrb = phb->p_paddr ? phb->p_paddr : phb->p_vaddr; ++ return (addra == addrb) ? 0 ++ : (addra < addrb) ? -1 ++ : 1; ++} ++ ++ ++ ++#ifndef HAVE_STRTOUL ++extern unsigned long int strtoul (const char *, char **, int); ++#endif ++ ++static const struct option long_opts[] = ++{ ++ { "version", no_argument, NULL, 'V' }, ++ { "help", no_argument, NULL, 'h' }, ++ { 0, 0, NULL, 0 } ++}; ++ ++int ++main(int argc, char **argv) ++{ ++ extern char *getenv (); ++ FILE *ifp, *ofp, *cfp; ++ Elf32_Ehdr ehdr; ++ Elf32_Phdr *phtab, *ph; ++ const struct format *fmt = 0; ++ char *infile = "a.out"; ++ char *outfile = 0; ++ char *fmtname; ++ char *s; ++ extern char *optarg; ++ extern int optind; ++ msize_t size = 0; ++ int rawflag = 0; ++ msize_t rawoffs = 0; ++ int i, c; ++ int bigendian = 0; ++ ++ progname = argv[0]; ++ if ((s = strrchr(progname, '/')) || (s = strrchr(progname, '\\')) || ++ (s = strrchr(progname, ':'))) ++ progname = s + 1; ++ ++ fmtname = getenv ("DLTYPE"); ++ while ((c = getopt_long(argc,argv,"prR:vylf:x:b:s:i:w:o:t:a:E:", ++ &long_opts[0], NULL)) != EOF) ++ switch(c) { ++ case 'p': ++ promflag = 1; ++ break; ++ case 'r': ++ rawflag = 1; ++ break; ++ case 'R': ++ rawflag = 1; ++ rawoffs = strtoul (optarg, &s, 16); ++ if (*s) ++ usage (1); ++ break; ++ case 'v': ++ verbose = 1; ++ break; ++ case 'y': ++ symflag = 1; ++ break; ++ case 'l': ++ listflag = 1; ++ break; ++ case 'f': ++ fmtname = optarg; ++ break; ++ case 'b': ++ nbytes = parselist (optarg, bytelist, MAXWIDTH); ++ break; ++ case 'x': ++ nomit = parselist (optarg, segomit, MAXSEGS); ++ break; ++ case 'i': ++ promstart = strtoul (optarg, &s, 0); ++ if (*s) ++ usage (1); ++ break; ++ case 's': ++ size = strtoul (optarg, &s, 0); ++ if (*s) ++ usage (1); ++ break; ++ case 'a': ++ promflag = 1; ++ prombase = strtoul (optarg, &s, 16) & 0x1fffffff; ++ if (*s == '/' || *s == '#') { ++ promlimit = strtoul (++s, &s, 16) + prombase; ++ } ++ else if (*s == ':' || *s == '-') { ++ promlimit = strtoul (++s, &s, 16) & 0x1fffffff; ++ if (promlimit && (promlimit <= prombase)) { ++ fprintf (stderr, "%s: ROM limit below ROM base\n", progname); ++ usage (1); ++ } ++ } ++ if (*s) ++ usage (1); ++ break; ++ case 'w': ++ width = strtoul (optarg, &s, 0); ++ if (*s || width % 8 != 0) ++ usage (1); ++ width /= 8; ++ break; ++ case 'o': ++ outfile = optarg; ++ break; ++ case 't': ++ fprintf (stderr, "%s: -t flag deprecated and ignored\n", progname); ++ break; ++ case 'E': ++ if (optarg[0] == 'B' && optarg[1] == '\0') ++ bigendian = 1; ++ else if (optarg[0] == 'L' && optarg[1] == '\0') ++ bigendian = 0; ++ else { ++ fprintf (stderr, "%s: -E%s flag not recognised\n", progname, ++ optarg); ++ usage (1); ++ } ++ break; ++ case 'h': ++ usage (0); ++ break; ++ case 'V': ++ printf ("MIPS convert " CONVERT_PKGVERSION "\n"); ++ return 0; ++ default: ++ usage (1); ++ } ++ ++ if(optind < argc) { ++ infile = argv[optind++]; ++ if (optind < argc) ++ usage (1); ++ } ++ ++ if ((size || promstart) && !promflag) { ++ fprintf (stderr, "%s: -s or -i specified without -p\n", progname); ++ usage (1); ++ } ++ ++ if (width == 0 || width > MAXWIDTH) { ++ fprintf (stderr, "%s: bad width\n", progname); ++ usage (1); ++ } ++ ++ if (nbytes == 0) { ++ for (i = 0; i < width; i++) ++ bytelist[i] = i; ++ nbytes = width; ++ } else { ++ if (nbytes != (nbytes & -nbytes)) { ++ fprintf (stderr, "%s: number of selected bytes not power of two\n", ++ progname); ++ usage (1); ++ } ++ if (nbytes > width) { ++ fprintf (stderr, "%s: number of selected bytes > data width\n", ++ progname); ++ usage (1); ++ } ++ for (i = 0; i < nbytes; i++) ++ if (bytelist[i] >= width) { ++ fprintf (stderr, "%s: bad byte select %d (should be 0-%d)\n", ++ progname, bytelist[i], width-1); ++ usage (1); ++ } ++ } ++ ++ /* invert seg omit list */ ++ for (i = 0; i < nomit; i++) { ++ int o = segomit[i]; ++ if (o >= MAXSEGS) { ++ fprintf (stderr, "%s: bad segment number: %d\n", ++ progname, o); ++ usage (1); ++ } ++ omitseg[o] = 1; ++ } ++ ++ if (fmtname) { ++ for (fmt = formats; fmt->name; fmt++) ++ if (strcmp (fmtname, fmt->name) == 0) ++ break; ++ if (!fmt->name) { ++ fprintf (stderr, "%s: unknown output format '%s'\n", fmtname, ++ progname); ++ usage (1); ++ } ++ } else { ++ fmt = formats; ++ } ++ ++ if (size == 0) ++ promend = ULONG_MAX; ++ else ++ promend = promstart + size; ++ ++ if (promlimit == 0) { ++ if (size == 0) ++ promlimit = prombase + 0x400000; ++ else ++ promlimit = prombase + size / nbytes * width; ++ } ++ ++ if (!(ifp = fopen (infile, FOPEN_RB))) { ++ perror(infile); ++ return 1; ++ } ++ ++ if (outfile && strcmp(outfile, "-")) { ++ if (!(ofp = fopen (outfile, fmt->binary ? FOPEN_WB : FOPEN_WT))) { ++ perror(outfile); ++ return 1; ++ } ++ } ++ else { ++ ofp = stdout; ++#ifdef MSDOS ++ if (fmt->binary) ++ setmode (fileno (ofp), O_BINARY); ++#endif ++ } ++ ++ if (!rawflag) { ++ if (elfEhdrRead (ifp, &ehdr) != 1) { ++ fprintf (stderr,"%s: not an ELF object file: %s\n", progname, infile); ++ return 1; ++ } ++ ++ if (ehdr.e_type != ET_EXEC) { ++ fprintf(stderr,"%s: warning: not an executable ELF file: %s\n", ++ progname, infile); ++ } ++ ++ bigendian = ehdr.e_ident[5] == ELFDATA2MSB; ++ ++ if (ehdr.e_phoff == 0 || ehdr.e_phnum == 0) { ++ fprintf(stderr, "%s: missing ELF program header: %s\n", ++ progname, infile); ++ return 1; ++ } ++ ++ if (ehdr.e_phnum > MAXSEGS) { ++ fprintf(stderr, "%s: too many segments in ELF program header: %s\n", ++ progname, infile); ++ return 1; ++ } ++ ++ phtab = (Elf32_Phdr *) xmalloc (ehdr.e_phnum * sizeof(Elf32_Phdr)); ++ ++ fseek (ifp, ehdr.e_phoff, SEEK_SET); ++ if (elfPhdrRead (ifp, &ehdr, phtab, ehdr.e_phnum) != ehdr.e_phnum) { ++ fprintf (stderr,"%s: failed to read program header\n", progname); ++ return 1; ++ } ++ } ++ else { ++ /* fake up the header etc */ ++ struct stat stb; ++ ++ ehdr.e_phnum = 1; ++ ehdr.e_entry = prombase + rawoffs; ++ ph = phtab = (Elf32_Phdr *) xmalloc (sizeof(Elf32_Phdr)); ++ ph->p_type = PT_LOAD; ++ ph->p_flags = PF_R | PF_X; ++ ph->p_vaddr = ph->p_paddr = prombase + rawoffs; ++ fstat (fileno (ifp), &stb); ++ ph->p_filesz = ph->p_memsz = stb.st_size; ++ } ++ ++ if (listflag) { ++ printf ("Segment List\n"); ++ printf ("Num Type Vaddr Paddr MemSz FSize FOffs Align Flgs\n"); ++ for (ph = phtab; ph < &phtab[ehdr.e_phnum]; ph++) { ++ printf (" %1d %8s %08x %08x %05x %05x %05x %05x %s%s\n", ++ ph-phtab, phtype(ph), ph->p_vaddr, ph->p_paddr, ++ ph->p_memsz, ph->p_filesz, ph->p_offset, ph->p_align, ++ phflags(ph), omitseg[ph-phtab]?" (omitted)":""); ++ } ++ exit (0); ++ } ++ ++ (*fmt->start) (ofp, ehdr.e_entry, bigendian); ++ ++ /* sort program header table into physical address order */ ++ qsort (phtab, ehdr.e_phnum, sizeof (phtab[0]), phcompar); ++ ++ if (promflag) { ++ /* do prom-resident segments first */ ++ for (ph = phtab; ph < &phtab[ehdr.e_phnum]; ph++) ++ if (ph->p_type == PT_LOAD) { ++ unsigned int offset; ++ offset = (ph->p_paddr ? ph->p_paddr : ph->p_vaddr) ++ & 0x1fffffff; ++ if (offset >= prombase && offset < promlimit ++ && !omitseg[ph - phtab]) { ++ convertSegment (ifp, fmt, ph); ++ ph->p_type = PT_NULL; ++ } ++ } ++ } ++ ++ /* then do all other segments in order */ ++ for (ph = phtab; ph < &phtab[ehdr.e_phnum]; ph++) ++ if (ph->p_type == PT_LOAD && ph->p_filesz && !omitseg[ph - phtab]) ++ convertSegment (ifp, fmt, ph); ++ ++ if (symflag && !rawflag && fmt->sym) ++ convertSymbols (ifp, &ehdr, fmt); ++ ++ (*fmt->end) (ehdr.e_entry); ++ ++ free (phtab); ++ ++ return 0; ++} +--- /dev/null ++++ b/convert/elf.h +@@ -0,0 +1,248 @@ ++/* elf.h: ELF data structures and values ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++typedef unsigned char Elf_Char; ++typedef unsigned short Elf32_Half; ++typedef unsigned long Elf32_Word; ++typedef long Elf32_Sword; ++typedef unsigned long Elf32_Off; ++typedef unsigned long Elf32_Addr; ++ ++#define EI_NIDENT 16 ++ ++typedef struct { ++ Elf_Char e_ident[EI_NIDENT]; ++ Elf32_Half e_type; ++ Elf32_Half e_machine; ++ Elf32_Word e_version; ++ Elf32_Addr e_entry; ++ Elf32_Off e_phoff; ++ Elf32_Off e_shoff; ++ Elf32_Word e_flags; ++ Elf32_Half e_ehsize; ++ Elf32_Half e_phentsize; ++ Elf32_Half e_phnum; ++ Elf32_Half e_shentsize; ++ Elf32_Half e_shnum; ++ Elf32_Half e_shstrndx; ++} Elf32_Ehdr; ++ ++typedef struct { ++ Elf32_Word p_type; /* Identifies program segment type */ ++ Elf32_Off p_offset; /* Segment file offset */ ++ Elf32_Addr p_vaddr; /* Segment virtual address */ ++ Elf32_Addr p_paddr; /* Segment physical address */ ++ Elf32_Word p_filesz; /* Segment size in file */ ++ Elf32_Word p_memsz; /* Segment size in memory */ ++ Elf32_Word p_flags; /* Segment flags */ ++ Elf32_Word p_align; /* Segment alignment, file & memory */ ++} Elf32_Phdr; ++ ++typedef struct { ++ Elf32_Word sh_name; ++ Elf32_Word sh_type; ++ Elf32_Word sh_flags; ++ Elf32_Addr sh_addr; ++ Elf32_Off sh_offset; ++ Elf32_Word sh_size; ++ Elf32_Word sh_link; ++ Elf32_Word sh_info; ++ Elf32_Word sh_addralign; ++ Elf32_Word sh_entsize; ++} Elf32_Shdr; ++ ++typedef struct { ++ Elf32_Word st_name; ++ Elf32_Addr st_value; ++ Elf32_Word st_size; ++ Elf_Char st_info; ++ Elf_Char st_other; ++ Elf32_Half st_shndx; ++} Elf32_Sym; ++ ++typedef struct { ++ Elf32_Addr r_offset; ++ Elf32_Word r_info; ++ Elf32_Sword r_addend; ++} Elf32_Rela; ++ ++typedef struct { ++ Elf32_Addr r_offset; ++ Elf32_Word r_info; ++} Elf32_Rel; ++ ++/* these are the external file sizes (should be absolute values) */ ++#define ELFEHDRSZ sizeof(Elf32_Ehdr) ++#define ELFPHDRSZ sizeof(Elf32_Phdr) ++#define ELFSHDRSZ sizeof(Elf32_Shdr) ++#define ELFSYMSZ sizeof(Elf32_Sym) ++#define ELFRELASZ sizeof(Elf32_Rela) ++#define ELFRELSZ sizeof(Elf32_Rel) ++ ++size_t elfEhdrRead(FILE *,Elf32_Ehdr *); ++size_t elfEhdrWrite(FILE *,const Elf32_Ehdr *); ++ ++size_t elfPhdrRead(FILE *, const Elf32_Ehdr *, Elf32_Phdr *, size_t); ++size_t elfPhdrWrite(FILE *, const Elf32_Ehdr *, const Elf32_Phdr *, size_t); ++ ++size_t elfShdrRead(FILE *,const Elf32_Ehdr *, Elf32_Shdr *,size_t); ++size_t elfShdrWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *,size_t); ++ ++size_t elfSymRead(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ Elf32_Sym *,size_t); ++size_t elfSymWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ const Elf32_Sym *,size_t); ++ ++size_t elfRelaWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ const Elf32_Rela *,size_t); ++size_t elfRelWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ const Elf32_Rel *,size_t); ++ ++ ++/* ELF header */ ++ ++/* e_ident[] fields */ ++#define EI_MAG0 0 /* id byte 0 index */ ++#define ELFMAG0 0x7F /* id byte 0 value */ ++ ++#define EI_MAG1 1 /* id byte 1 index */ ++#define ELFMAG1 'E' /* id byte 1 value */ ++ ++#define EI_MAG2 2 /* id byte 2 index */ ++#define ELFMAG2 'L' /* id byte 3 value */ ++ ++#define EI_MAG3 3 /* id byte 3 index */ ++#define ELFMAG3 'F' /* id byte 3 value */ ++ ++#define EI_CLASS 4 /* file class */ ++#define ELFCLASSNONE 0 /* invalid */ ++#define ELFCLASS32 1 /* 32-bit */ ++#define ELFCLASS64 2 /* 64-bit */ ++ ++#define EI_DATA 5 /* data encoding */ ++#define ELFDATANONE 0 /* invalid */ ++#define ELFDATA2LSB 1 /* little endian */ ++#define ELFDATA2MSB 2 /* big endian */ ++ ++#define EI_VERSION 6 /* file format version */ ++ ++#define EI_PAD 7 /* start of padding */ ++ ++ ++/* e_type values */ ++#define ET_NONE 0 /* no file type */ ++#define ET_REL 1 /* relocatable */ ++#define ET_EXEC 2 /* executable */ ++#define ET_DYN 3 /* shared object */ ++#define ET_CORE 4 /* core file */ ++#define ET_LOPROC 0xFF00 /* processor-specific (lo) */ ++#define ET_HIPROC 0xFFFF /* processor-specific (hi) */ ++ ++/* e_machine values */ ++#define EM_NONE 0 /* undefined machine */ ++#define EM_M32 1 /* AT&T WE 32100 */ ++#define EM_SPARC 2 /* SUN SPARC */ ++#define EM_386 3 /* Intel 80386 */ ++#define EM_68K 4 /* Motorola M68K family */ ++#define EM_88K 5 /* Motorola M88K family */ ++#define EM_860 7 /* Intel 80860 */ ++#define EM_MIPS 8 /* MIPS Rx000 */ ++ ++/* e_version values */ ++#define EV_NONE 0 /* invalid */ ++#define EV_CURRENT 1 /* current version */ ++ ++/* Program header */ ++ ++/* p_type field */ ++#define PT_NULL 0 /* unused */ ++#define PT_LOAD 1 /* loadable segment */ ++#define PT_DYNAMIC 2 /* dynamic link information */ ++#define PT_INTERP 3 /* interpreter */ ++#define PT_NOTE 4 /* auxiliary information */ ++#define PT_SHLIB 5 /* shared library */ ++#define PT_PHDR 6 /* self */ ++#define PT_LOPROC 0x70000000 /* processor-specific (lo) */ ++#define PT_HIPROC 0x7FFFFFFF /* processor-specific (ho) */ ++ ++/* p_flags bit fields */ ++#define PF_X (1 << 0) /* executable */ ++#define PF_W (1 << 1) /* writable */ ++#define PF_R (1 << 2) /* readable */ ++#define PF_MASKPROC 0xF0000000 /* processor-specific bits */ ++ ++/* Section header */ ++ ++/* sh_type values */ ++#define SHT_NULL 0 /* unused */ ++#define SHT_PROGBITS 1 /* program code or data */ ++#define SHT_SYMTAB 2 /* symbol table */ ++#define SHT_STRTAB 3 /* string table */ ++#define SHT_RELA 4 /* relocation records (with addends) */ ++#define SHT_HASH 5 /* symbol hash table */ ++#define SHT_DYNAMIC 6 /* dynamic linking table */ ++#define SHT_NOTE 7 /* comments */ ++#define SHT_NOBITS 8 /* zero program data (i.e. bss)*/ ++#define SHT_REL 9 /* relocation records (w/o addends) */ ++#define SHT_SHLIB 10 /* shared library */ ++#define SHT_DYNSYM 11 /* dynamic linking symbol table */ ++#define SHT_LOPROC 0x70000000 /* processor specific (lo) */ ++#define SHT_HIPROC 0x7FFFFFFF /* processor specific (hi) */ ++#define SHT_LOUSER 0x80000000 /* user specific (lo) */ ++#define SHT_HIUSER 0x8FFFFFFF /* user specific (hi) */ ++ ++/* sh_flags bit fields */ ++#define SHF_WRITE (1 << 0) /* writable section */ ++#define SHF_ALLOC (1 << 1) /* allocated in program space */ ++#define SHF_EXECINSTR (1 << 2) /* executable instructions */ ++#define SHF_MASKPROC 0xF0000000 /* processor-specific bits */ ++ ++/* symbol binding */ ++#define STB_LOCAL 0 /* local to this file */ ++#define STB_GLOBAL 1 /* globally visible */ ++#define STB_WEAK 2 /* weakly global */ ++#define STB_LOPROC 13 /* processor-specific (lo) */ ++#define STB_HIPROC 15 /* processor-specific (hi) */ ++ ++/* symbol type */ ++#define STT_NOTYPE 0 /* unspecified */ ++#define STT_OBJECT 1 /* data object */ ++#define STT_FUNC 2 /* code object */ ++#define STT_SECTION 3 /* section symbol */ ++#define STT_FILE 4 /* file name symbol */ ++#define STT_LOPROC 13 /* processor-specific (lo) */ ++#define STT_HIPROC 15 /* processor-specific (hi) */ ++ ++/* special reserved values for st_shndx */ ++#define SHN_UNDEF 0 /* undefined (external) symbol */ ++#define SHN_LORESERV 0xFF00 /* reserved values (lo) */ ++#define SHN_LOPROC 0xFF00 /* processor-specific (lo) */ ++#define SHN_HIPROC 0xFF1F /* processor-specific (hi) */ ++#define SHN_ABS 0xFFF1 /* absolute symbol */ ++#define SHN_COMMON 0xFFF2 /* common symbol */ ++#define SHN_HIRESERVE 0xFFFF /* reserved values (hi)*/ ++ ++#define ELF32_R_SYM(i) ((i) >> 8) ++#define ELF32_R_TYPE(i) ((i) & 0xff) ++#define ELF32_R_INFO(sym,type) (((sym) << 8) | ((type) & 0xff)) ++ ++#define ELF32_ST_BIND(i) ((i) >> 4) ++#define ELF32_ST_TYPE(i) ((i) & 0xf) ++#define ELF32_ST_INFO(bind,type) (((bind) << 4) | ((type) & 0xf)) +--- /dev/null ++++ b/convert/elfio.c +@@ -0,0 +1,553 @@ ++/* elfio.c: ELF file i/o primitives ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++#include "elfmips.h" ++ ++#define ELFINU8(b,w) \ ++ (w = bp[0]) ++ ++#define ELFINMSBU16(b,w) \ ++ (w = ((b)[0] << 8) | (b)[1]) ++ ++#define ELFINLSBU16(b,w) \ ++ (w = ((b)[1] << 8) | (b)[0]) ++ ++#define ELFINMSBU32(b,w) \ ++ (w = ((unsigned long)(b)[0] << 24) | \ ++ ((unsigned long)(b)[1] << 16) | \ ++ ((b)[2] << 8) | \ ++ (b)[3]) ++ ++#define ELFINLSBU32(b,w) \ ++ (w = ((unsigned long)(b)[3] << 24) | \ ++ ((unsigned long)(b)[2] << 16) | \ ++ ((b)[1] << 8) | \ ++ (b)[0]) ++ ++#define ELFOUTU8(b,w) \ ++ (bp[0] = w) ++ ++#define ELFOUTMSBU16(b,w) \ ++ ((b)[0] = (w >> 8), \ ++ (b)[1] = w) ++ ++#define ELFOUTLSBU16(b,w) \ ++ ((b)[1] = (w >> 8), \ ++ (b)[0] = w) ++ ++#define ELFOUTMSBU32(b,w) \ ++ ((b)[0] = (w >> 24), \ ++ (b)[1] = (w >> 16), \ ++ (b)[2] = (w >> 8), \ ++ (b)[3] = w) ++ ++#define ELFOUTLSBU32(b,w) \ ++ ((b)[3] = (w >> 24), \ ++ (b)[2] = (w >> 16), \ ++ (b)[1] = (w >> 8), \ ++ (b)[0] = w) ++ ++static unsigned long elfinlsbu32(unsigned char *bp) ++{ ++ unsigned long v; ++ ELFINLSBU32(bp,v); ++ return v; ++} ++ ++static unsigned int elfinlsbu16(unsigned char *bp) ++{ ++ unsigned int v; ++ ELFINLSBU16(bp,v); ++ return v; ++} ++ ++static unsigned long elfinmsbu32(unsigned char *bp) ++{ ++ unsigned long v; ++ ELFINMSBU32(bp,v); ++ return v; ++} ++static unsigned int elfinmsbu16(unsigned char *bp) ++{ ++ unsigned int v; ++ ELFINMSBU16(bp,v); ++ return v; ++} ++ ++static void elfoutmsbu32(unsigned char *bp,unsigned long v) ++{ ++ ELFOUTMSBU32(bp,v); ++} ++ ++static void elfoutmsbu16(unsigned char *bp,unsigned int v) ++{ ++ ELFOUTMSBU16(bp,v); ++} ++ ++static void elfoutlsbu32(unsigned char *bp,unsigned long v) ++{ ++ ELFOUTLSBU32(bp,v); ++} ++ ++static void elfoutlsbu16(unsigned char *bp,unsigned int v) ++{ ++ ELFOUTLSBU16(bp,v); ++} ++ ++ ++#define X3 ++ ++#if defined(X1) ++/* this is applaing because there is no optimisation of the test ++ * of format between succesive macro calls ++*/ ++#define ELFINU16(b,w) (format?ELFINLSBU16(b,w):ELFINMSBU16(b,w)) ++#define ELFINU32(b,w) (format?ELFINLSBU32(b,w):ELFINMSBU32(b,w)) ++#define ELFOUTU16(b,w) (format?ELFOUTLSBU16(b,w):ELFOUTMSBU16(b,w)) ++#define ELFOUTU32(b,w) (format?ELFOUTLSBU32(b,w):ELFOUTMSBU32(b,w)) ++#elif defined(X2) ++/* this is also appaling because there is no optimisation of the test ++ * of format between succesive macro calls ++*/ ++#define ELFINU16(b,w) w = (format?elfinlsbu16(b):elfinmsbu16(b)) ++#define ELFINU32(b,w) w = (format?elfinlsbu32(b):elfinmsbu32(b)) ++#define ELFOUTU16(b,w) (format?elfoutlsbu16(b,w):elfoutmsbu16(b,w)) ++#define ELFOUTU32(b,w) (format?elfoutlsbu32(b,w):elfoutmsbu32(b,w)) ++#elif defined(X3) ++/* this works better but still is poor as the function address ++ * is loaded from table before each call ++*/ ++static const struct { ++ void (*out16)(unsigned char *bp,unsigned int v); ++ void (*out32)(unsigned char *bp,unsigned long v); ++ unsigned int (*in16)(unsigned char *bp); ++ unsigned long (*in32)(unsigned char *bp); ++} fvec[] = { ++ {elfoutmsbu16,elfoutmsbu32,elfinmsbu16,elfinmsbu32}, ++ {elfoutlsbu16,elfoutlsbu32,elfinlsbu16,elfinlsbu32} ++}; ++ ++#define ELFINU16(b,w) w = fvec[format].in16(b) ++#define ELFINU32(b,w) w = fvec[format].in32(b) ++#define ELFOUTU16(b,w) fvec[format].out16(b,w) ++#define ELFOUTU32(b,w) fvec[format].out32(b,w) ++#endif ++ ++ ++#define ELFINCHAR(b,w) (ELFINU8(b,w),(b)+=1) ++#define ELFINHALF(b,w) (ELFINU16(b,w),(b)+=2) ++#define ELFINWORD(b,w) (ELFINU32(b,w),(b)+=4) ++#define ELFINADDR(b,w) (ELFINU32(b,w),(b)+=4) ++#define ELFINOFF(b,w) (ELFINU32(b,w),(b)+=4) ++ ++#define ELFOUTCHAR(b,w) (ELFOUTU8(b,w),(b)+=1) ++#define ELFOUTHALF(b,w) (ELFOUTU16(b,w),(b)+=2) ++#define ELFOUTWORD(b,w) (ELFOUTU32(b,w),(b)+=4) ++#define ELFOUTADDR(b,w) (ELFOUTU32(b,w),(b)+=4) ++#define ELFOUTOFF(b,w) (ELFOUTU32(b,w),(b)+=4) ++ ++/* Maximum sizes of things we will consider reading ++ * these are a bit more than that cos of poosible compiler struct padding ++ */ ++#define MAXEHDRSIZE sizeof(Elf32_Ehdr) ++#define MAXPHDRSIZE sizeof(Elf32_Phdr) ++#define MAXSHDRSIZE sizeof(Elf32_Shdr) ++#define MAXRELASIZE sizeof(Elf32_Rela) ++#define MAXSYMSIZE sizeof(Elf32_Sym) ++#define MAXGPTABSIZE sizeof(Elf32_Gptab) ++#define MAXREGINFOSIZE sizeof(Elf32_Reginfo) ++ ++#define FORMATSELECT(eh) ((eh->e_ident[5] == ELFDATA2MSB)?0:1) ++ ++size_t elfShdrRead(FILE *fp, ++ const Elf32_Ehdr *eh, Elf32_Shdr *sh,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; ne_shentsize,1,fp) != 1) ++ break; ++ ++ /* convert from bytes to numbers ++ */ ++ ELFINWORD(bp,sh->sh_name); ++ ELFINWORD(bp,sh->sh_type); ++ ELFINWORD(bp,sh->sh_flags); ++ ELFINADDR(bp,sh->sh_addr); ++ ELFINOFF(bp,sh->sh_offset); ++ ELFINWORD(bp,sh->sh_size); ++ ELFINWORD(bp,sh->sh_link); ++ ELFINWORD(bp,sh->sh_info); ++ ELFINWORD(bp,sh->sh_addralign); ++ ELFINWORD(bp,sh->sh_entsize); ++ } ++ return n; ++} ++ ++size_t elfShdrWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nsh_name); ++ ELFOUTWORD(bp,sh->sh_type); ++ ELFOUTWORD(bp,sh->sh_flags); ++ ELFOUTADDR(bp,sh->sh_addr); ++ ELFOUTOFF(bp,sh->sh_offset); ++ ELFOUTWORD(bp,sh->sh_size); ++ ELFOUTWORD(bp,sh->sh_link); ++ ELFOUTWORD(bp,sh->sh_info); ++ ELFOUTWORD(bp,sh->sh_addralign); ++ ELFOUTWORD(bp,sh->sh_entsize); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++size_t elfPhdrRead(FILE *fp, ++ const Elf32_Ehdr *eh, Elf32_Phdr *ph,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; ne_phentsize,1,fp) != 1) ++ break; ++ ++ /* convert from bytes to numbers */ ++ ELFINWORD(bp,ph->p_type); ++ ELFINOFF(bp,ph->p_offset); ++ ELFINADDR(bp,ph->p_vaddr); ++ ELFINADDR(bp,ph->p_paddr); ++ ELFINWORD(bp,ph->p_filesz); ++ ELFINWORD(bp,ph->p_memsz); ++ ELFINWORD(bp,ph->p_flags); ++ ELFINWORD(bp,ph->p_align); ++ } ++ return n; ++} ++ ++size_t elfPhdrWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Phdr *ph,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; np_type); ++ ELFOUTOFF(bp,ph->p_offset); ++ ELFOUTADDR(bp,ph->p_vaddr); ++ ELFOUTADDR(bp,ph->p_paddr); ++ ELFOUTWORD(bp,ph->p_filesz); ++ ELFOUTWORD(bp,ph->p_memsz); ++ ELFOUTWORD(bp,ph->p_flags); ++ ELFOUTWORD(bp,ph->p_align); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++size_t elfSymRead(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ Elf32_Sym *sym,size_t nsym) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nsh_entsize,1,fp) != 1) ++ break; ++ ++ /* convert from bytes to numbers ++ */ ++ ELFINWORD(bp,sym->st_name); ++ ELFINADDR(bp,sym->st_value); ++ ELFINWORD(bp,sym->st_size); ++ ELFINCHAR(bp,sym->st_info); ++ ELFINCHAR(bp,sym->st_other); ++ ELFINHALF(bp,sym->st_shndx); ++ } ++ return n; ++} ++ ++size_t elfSymWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ const Elf32_Sym *sym,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nst_name); ++ ELFOUTADDR(bp,sym->st_value); ++ ELFOUTWORD(bp,sym->st_size); ++ ELFOUTCHAR(bp,sym->st_info); ++ ELFOUTCHAR(bp,sym->st_other); ++ ELFOUTHALF(bp,sym->st_shndx); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++size_t elfRelaWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ const Elf32_Rela *rela,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nr_offset); ++ ELFOUTWORD(bp,rela->r_info); ++ ELFOUTWORD(bp,rela->r_addend); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++size_t elfEhdrWrite(FILE *fp,const Elf32_Ehdr *eh) ++{ ++ int format = FORMATSELECT(eh); ++ unsigned char buf[MAXEHDRSIZE]; ++ unsigned char *bp = buf; ++ ++ memcpy(bp,eh->e_ident,EI_NIDENT); ++ bp += EI_NIDENT; ++ ++ ELFOUTHALF(bp,eh->e_type); ++ ELFOUTHALF(bp,eh->e_machine); ++ ELFOUTWORD(bp,eh->e_version); ++ ELFOUTADDR(bp,eh->e_entry); ++ ELFOUTOFF(bp,eh->e_phoff); ++ ELFOUTOFF(bp,eh->e_shoff); ++ ELFOUTWORD(bp,eh->e_flags); ++ ELFOUTHALF(bp,eh->e_ehsize); ++ ELFOUTHALF(bp,eh->e_phentsize); ++ ELFOUTHALF(bp,eh->e_phnum); ++ ELFOUTHALF(bp,eh->e_shentsize); ++ ELFOUTHALF(bp,eh->e_shnum); ++ ELFOUTHALF(bp,eh->e_shstrndx); ++ ++ return fwrite(&buf,bp-buf,1,fp); ++} ++ ++size_t elfEhdrRead(FILE *fp,Elf32_Ehdr *eh) ++{ ++ unsigned char buf[MAXEHDRSIZE]; ++ unsigned char *bp = buf; ++ ++ if(fread(buf,ELFEHDRSZ,1,fp) != 1) ++ return 0; ++ ++ memcpy(eh->e_ident,bp,EI_NIDENT); ++ bp += EI_NIDENT; ++ ++ if(eh->e_ident[0] != ELFMAG0 || ++ eh->e_ident[1] != ELFMAG1 || ++ eh->e_ident[2] != ELFMAG2 || ++ eh->e_ident[3] != ELFMAG3) ++ return 0; ++ ++ if(eh->e_ident[4] != ELFCLASS32) ++ return 0; ++ ++ if(eh->e_ident[5] != ELFDATA2MSB && eh->e_ident[5] != ELFDATA2LSB) ++ return 0; ++ ++#ifdef notdef ++ /* what should the version in the ident be ?? */ ++ if(eh->e_ident[6] != 1) ++ return 0; ++#endif ++ ++ { ++ int i; ++ ++ for(i=7;ie_ident[i] != 0) ++ return 0; ++ } ++ { ++ int format = FORMATSELECT(eh); ++ ++ ELFINHALF(bp,eh->e_type); ++ ELFINHALF(bp,eh->e_machine); ++ ELFINWORD(bp,eh->e_version); ++ ELFINADDR(bp,eh->e_entry); ++ ELFINOFF(bp,eh->e_phoff); ++ ELFINOFF(bp,eh->e_shoff); ++ ELFINWORD(bp,eh->e_flags); ++ ELFINHALF(bp,eh->e_ehsize); ++ ELFINHALF(bp,eh->e_phentsize); ++ ELFINHALF(bp,eh->e_phnum); ++ ELFINHALF(bp,eh->e_shentsize); ++ ELFINHALF(bp,eh->e_shnum); ++ ELFINHALF(bp,eh->e_shstrndx); ++ } ++ return 1; ++} ++ ++ ++size_t elfReginfoWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ const Elf32_Reginfo *ri,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nri_gprmask); ++ for (i = 0; i < 4; i++) { ++ ELFOUTWORD(bp,ri->ri_cprmask[i]); ++ } ++ ELFOUTWORD(bp,ri->ri_gp_value); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++ ++size_t elfReginfoRead (FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ Elf32_Reginfo *ri,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nsh_entsize,1,fp) != 1) ++ break; ++ ++ /* convert from numbers to bytes ++ */ ++ ELFINWORD(bp,ri->ri_gprmask); ++ for (i = 0; i < 4; i++) { ++ ELFINWORD(bp,ri->ri_cprmask[i]); ++ } ++ ELFINWORD(bp,ri->ri_gp_value); ++ } ++ return n; ++} ++ ++size_t elfGptabWrite(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ const Elf32_Gptab *gt,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; ngt_entry.gt_g_value); ++ ELFOUTWORD(bp,gt->gt_entry.gt_bytes); ++ ++ if(fwrite(buf,bp-buf,1,fp) != 1) ++ break; ++ } ++ return n; ++} ++ ++ ++size_t elfGptabRead(FILE *fp, ++ const Elf32_Ehdr *eh, ++ const Elf32_Shdr *sh, ++ Elf32_Gptab *gt,size_t nhdr) ++{ ++ int format = FORMATSELECT(eh); ++ size_t n; ++ ++ for(n=0; nsh_entsize,1,fp) != 1) ++ break; ++ ++ /* convert from numbers to bytes ++ */ ++ ELFINWORD(bp,gt->gt_entry.gt_g_value); ++ ELFINWORD(bp,gt->gt_entry.gt_bytes); ++ } ++ return n; ++} +--- /dev/null ++++ b/convert/elfmips.h +@@ -0,0 +1,122 @@ ++/* elfmips.h: MIPS ABI specific ELF definitions ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "elf.h" ++ ++/* MIPSABI program header special */ ++#define PT_MIPS_REGINFO (PT_LOPROC + 0) ++ ++/* SDEMIPS relocation (rela type) */ ++#define R_SDE_8 0 ++#define R_SDE_16 1 ++#define R_SDE_32 2 ++#define R_SDE_ILA 35 ++#define R_SDE_IGPREL 36 ++#define R_SDE_ILAHI 37 ++#define R_SDE_ILALO 38 ++#define R_SDE_IBRA 39 ++#define R_SDE_IJMP 40 ++#define R_SDE_ILITERAL 41 ++ ++/* MIPSABI relocation (rel type) */ ++#define R_MIPS_NONE 0 ++#define R_MIPS_16 1 ++#define R_MIPS_32 2 ++#define R_MIPS_REL32 3 ++#define R_MIPS_26 4 ++#define R_MIPS_HI16 5 ++#define R_MIPS_LO16 6 ++#define R_MIPS_GPREL16 7 ++#define R_MIPS_LITERAL 8 ++#define R_MIPS_GOT16 9 ++#define R_MIPS_PC16 10 ++#define R_MIPS_CALL16 11 ++#define R_MIPS_GPREL32 12 ++ ++/* MIPSABI special section numbers */ ++#define SHN_MIPS_ACOMMON (SHN_LOPROC + 0) ++#define SHN_MIPS_SCOMMON (SHN_LOPROC + 3) ++#define SHN_MIPS_SUNDEFINED (SHN_LOPROC + 4) ++ ++/* MIPSABI special section types */ ++#define SHT_MIPS_LIBLIST (SHT_LOPROC + 0) ++#define SHT_MIPS_CONFLICT (SHT_LOPROC + 2) ++#define SHT_MIPS_GPTAB (SHT_LOPROC + 3) ++#define SHT_MIPS_UCODE (SHT_LOPROC + 4) ++#define SHT_MIPS_DEBUG (SHT_LOPROC + 5) ++#define SHT_MIPS_REGINFO (SHT_LOPROC + 6) ++ ++/* MIPSABI special section flags */ ++#define SHF_MIPS_GPREL 0x10000000 ++ ++/* MIPSABI processor specific flags */ ++#define EF_MIPS_NOREORDER 0x00000001 ++#define EF_MIPS_PIC 0x00000002 ++#define EF_MIPS_CPIC 0x00000004 ++#define EF_MIPS_ARCH 0xf0000000 ++#define E_MIPS_ARCH_1 0x00000000 /* -mips1 */ ++#define E_MIPS_ARCH_2 0x10000000 /* -mips2 */ ++#define E_MIPS_ARCH_3 0x20000000 /* -mips3 */ ++#define E_MIPS_ARCH_4 0x30000000 /* -mips4 */ ++/* The following are not MIPSABI, but SDE-MIPS only */ ++#define EF_MIPS_CPU 0x000f0000 ++#define E_MIPS_CPU_STD 0x00000000 ++#define E_MIPS_CPU_CW4 0x00010000 ++#define E_MIPS_CPU_R4100 0x00020000 ++#define E_MIPS_CPU_R4650 0x00030000 ++#define E_MIPS_CPU_R3900 0x00040000 ++#define E_MIPS_CPU_RM52XX 0x00050000 ++#define EF_MIPS_NOGPCOUNT 0x00001000 ++ ++/* MIPSABI special sections */ ++ ++/* .reginfo */ ++typedef struct { ++ Elf32_Word ri_gprmask; ++ Elf32_Word ri_cprmask[4]; ++ Elf32_Sword ri_gp_value; ++} Elf32_Reginfo; ++ ++#define ELFREGINFOSZ sizeof(Elf32_Reginfo) ++ ++size_t elfReginfoWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ const Elf32_Reginfo *,size_t); ++size_t elfReginfoRead(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ Elf32_Reginfo *,size_t); ++ ++/* .gptab.xxx */ ++typedef union { ++ struct { ++ Elf32_Word gt_current_g_value; ++ Elf32_Word gt_unused; ++ } gt_header; ++ struct { ++ Elf32_Word gt_g_value; ++ Elf32_Word gt_bytes; ++ } gt_entry; ++} Elf32_Gptab; ++ ++#define ELFGPTABSZ sizeof(Elf32_Gptab) ++ ++size_t elfGptabRead(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ Elf32_Gptab *,size_t); ++size_t elfGptabWrite(FILE *,const Elf32_Ehdr *,const Elf32_Shdr *, ++ const Elf32_Gptab *,size_t); ++ +--- /dev/null ++++ b/convert/elfout.c +@@ -0,0 +1,188 @@ ++/* elfout.c -- ELF Output ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++#include "elfmips.h" ++ ++#define BUFSIZE 8192 /* max bytes per block */ ++ ++static FILE *elffp; ++static unsigned long elffirst = ~0; ++static unsigned long elfaddr = ~0; ++static long elfoffs; ++static int elflen; ++static unsigned char *elfbuf; ++ ++static Elf32_Ehdr ehdr; ++#define NSECTIONS 9 ++static Elf32_Phdr phdr[NSECTIONS]; ++static Elf32_Shdr shdr[NSECTIONS + 1]; /* plus 1 for shsectname */ ++static int nsect; ++ ++extern char * progname; ++extern int promflag; ++extern unsigned long prombase; ++ ++static void ++elfFlush (int endsect) ++{ ++ if (elflen > 0) { ++ fwrite (elfbuf, 1, elflen, elffp); ++ elfoffs += elflen; ++ elfaddr += elflen; ++ elflen = 0; ++ } ++ ++ if (endsect && nsect > 1) { ++ Elf32_Shdr *sh = &shdr[nsect - 1]; ++ sh->sh_size = elfoffs - sh->sh_offset; ++ } ++} ++ ++void ++ElfStart (FILE *fp, unsigned long ep, int bigendian) ++{ ++ elfbuf = xmalloc (BUFSIZE); ++ elffp = fp; ++ ++ memset (&ehdr, 0, sizeof (ehdr)); ++ ehdr.e_ident[EI_MAG0] = ELFMAG0; ++ ehdr.e_ident[EI_MAG1] = ELFMAG1; ++ ehdr.e_ident[EI_MAG2] = ELFMAG2; ++ ehdr.e_ident[EI_MAG3] = ELFMAG3; ++ ehdr.e_ident[EI_CLASS] = ELFCLASS32; ++ ehdr.e_ident[EI_DATA] = bigendian ? ELFDATA2MSB : ELFDATA2LSB; ++ ehdr.e_ident[EI_VERSION] = EV_CURRENT; ++ ehdr.e_type = ET_EXEC; ++ ehdr.e_machine = EM_MIPS; ++ ehdr.e_version = EV_CURRENT; ++ ehdr.e_ehsize = sizeof (Elf32_Ehdr); ++ ehdr.e_phentsize = sizeof (Elf32_Phdr); ++ ehdr.e_shentsize = sizeof (Elf32_Shdr); ++ elfoffs = ehdr.e_shoff + sizeof (shdr); ++ ++ nsect = 1; ++ fseek (elffp, elfoffs, SEEK_SET); ++} ++ ++ ++void ++ElfOutput (unsigned long addr, unsigned char byte) ++{ ++ if (promflag) ++ /* convert back to PROM virtual address in KSEG1 */ ++ addr = (addr + prombase) | 0xa0000000; ++ ++ if (addr != elfaddr + elflen) { ++ Elf32_Shdr *sh = &shdr[nsect]; ++ ++ elfFlush (1); ++ ++ if (nsect == NSECTIONS) { ++ fprintf (stderr, "%s: too many ELF output sections\n", ++ progname); ++ exit (1); ++ } ++ ++ sh->sh_type = SHT_PROGBITS; ++ sh->sh_flags = SHF_ALLOC | SHF_EXECINSTR; ++ sh->sh_addr = addr; ++ sh->sh_offset = elfoffs; ++ sh->sh_size = 0; ++ sh->sh_addralign = 1; ++ nsect++; ++ ++ elfaddr = addr; ++ } ++ ++ if (elflen == BUFSIZE) ++ elfFlush (0); ++ elfbuf[elflen++] = byte; ++} ++ ++ ++void ++ElfEnd (unsigned long ep) ++{ ++ Elf32_Shdr *sh; ++ Elf32_Phdr *ph; ++ char * strtab; ++ int stroffs, i; ++ ++ if (nsect <= 1) ++ return; ++ ++ elfFlush (1); ++ ++ strtab = xmalloc (nsect * sizeof ".psect##" ++ + sizeof ".shstrtab" + 1); ++ ++ /* Prepare the Section Header string table */ ++ stroffs = 0; ++ strtab[stroffs++] = '\0'; /* initial null byte */ ++ for (sh = &shdr[1], i = 1; i < nsect; sh++, i++) { ++ sh->sh_name = stroffs; ++ sprintf (&strtab[stroffs], ".psect%d", i); ++ stroffs += strlen (&strtab[stroffs]) + 1; ++ } ++ ++ /* Prepare the section header for the string table */ ++ sh = &shdr[nsect]; ++ sh->sh_name = stroffs; ++ strcpy (&strtab[stroffs], ".shstrtab"); ++ stroffs += sizeof ".shstrtab"; ++ sh->sh_type = SHT_STRTAB; ++ sh->sh_offset = elfoffs; ++ sh->sh_size = stroffs; ++ ++ /* Write the Section Header string table */ ++ fwrite (strtab, 1, stroffs, elffp); ++ free (strtab); ++ ++ /* Prepare Program Header */ ++ for (ph = phdr, sh = &shdr[1], i = 1; i < nsect; ph++, sh++, i++) { ++ ph->p_type = PT_LOAD; ++ ph->p_offset = sh->sh_offset; ++ ph->p_vaddr = sh->sh_addr; ++ ph->p_paddr = sh->sh_addr; ++ ph->p_filesz = ph->p_memsz = sh->sh_size; ++ ph->p_flags = PF_R | PF_X; ++ ph->p_align = sh->sh_addralign; ++ } ++ ++ /* Prepare ELF header */ ++ ehdr.e_phnum = ph - phdr; ++ ehdr.e_shstrndx = nsect; ++ ehdr.e_shnum = nsect + 1; /* + 1 for string table */ ++ ehdr.e_phoff = sizeof (Elf32_Ehdr); ++ ehdr.e_shoff = ehdr.e_phoff + sizeof (Elf32_Phdr) * ehdr.e_phnum; ++ if (promflag) ++ ehdr.e_entry = 0xbfc00000; /* should this be progreammable */ ++ else ++ ehdr.e_entry = ep; ++ ++ /* Write the headers */ ++ fseek (elffp, 0L, SEEK_SET); ++ elfEhdrWrite (elffp, &ehdr); ++ elfPhdrWrite (elffp, &ehdr, phdr, ehdr.e_phnum); ++ elfShdrWrite (elffp, &ehdr, shdr, ehdr.e_shnum); ++ ++ free (elfbuf); ++} +--- /dev/null ++++ b/convert/idtbin.c +@@ -0,0 +1,93 @@ ++/* idtbin.c -- Compressed Motorola S-Record Output for IDT/sim ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++#define BUFSIZE 250 ++#define ADDRSIZE 4 ++ ++static FILE *idtfp; ++static unsigned long idtaddr = ~0; ++static int idtlen; ++static unsigned char idtbuf[BUFSIZE]; ++ ++static void ++idtFlush () ++{ ++ unsigned char cksum = 0; ++ int n; ++ ++ if (idtlen == 0) ++ return; ++ ++ fprintf (idtfp, "S3%c", idtlen + ADDRSIZE + 1); ++ cksum += idtlen + ADDRSIZE + 1; ++ ++ for (n = (ADDRSIZE - 1) * 8; n >= 0; n -= 8) { ++ unsigned char ab = idtaddr >> n; ++ fputc (ab, idtfp); ++ cksum += ab; ++ } ++ ++ for (n = 0; n < idtlen; n++) { ++ putc (idtbuf[n], idtfp); ++ cksum += idtbuf[n]; ++ } ++ ++ fputc (~cksum & 0xff, idtfp); ++ idtlen = 0; ++} ++ ++ ++void ++IdtStart (FILE *fp, unsigned long ep) ++{ ++ idtfp = fp; ++} ++ ++void ++IdtOutput (unsigned long addr, unsigned char byte) ++{ ++ if (addr != idtaddr + idtlen || idtlen == BUFSIZE) { ++ idtFlush (); ++ idtaddr = addr; ++ } ++ idtbuf[idtlen++] = byte; ++} ++ ++void ++IdtEnd (unsigned long ep) ++{ ++ unsigned char cksum = 0; ++ int n; ++ ++ idtFlush (); ++ ++ fprintf (idtfp, "S7%c", ADDRSIZE + 1); ++ cksum += ADDRSIZE + 1; ++ ++ for (n = (ADDRSIZE - 1) * 8; n >= 0; n -= 8) { ++ unsigned char ab = ep >> n; ++ fputc (ab, idtfp); ++ cksum += ab; ++ } ++ ++ fputc (~cksum & 0xff, idtfp); ++} +--- /dev/null ++++ b/convert/lsifast.c +@@ -0,0 +1,219 @@ ++/* lsifast.c -- LSI PMON Fast ASCII Output ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++/*#define MAXREC 550*/ ++#define MAXREC 255 ++#define BUFSIZE ((MAXREC-12)/4*3) ++ ++#define ZEROS "/Z" /* record contains a count of zeros, ++ actually it's the number of 24-bit ++ records that are all zero */ ++#define BYTE "/B" /* record contains a single byte */ ++#define CHKSUM "/C" /* checksum to date */ ++#define CLRSUM "/K" /* klear (sic) the checksum */ ++#define ADDR "/A" /* double length record containing a 32 bit ++ address */ ++#define END "/E" /* end of download */ ++ ++static FILE *lsifp; ++static unsigned long lsiaddr = ~0; ++static int lsilen; ++static unsigned char *lsibuf; ++static int chksum; ++ ++ ++static int ++b2a(int c) ++{ ++/* translate binary to base64 (tx form) ++0..25 A-Z ++26..51 a-z ++52..61 0-9 ++62 , ++63 . ++*/ ++ ++ c &= 0x3f; ++ if (c <= 25) return('A'+c); ++ if (c <= 51) return('a'+c-26); ++ if (c <= 61) return('0'+c-52); ++ if (c == 62) return(','); ++ if (c == 63) return('.'); ++ abort(); ++} ++ ++static void ++send12 (char *type, unsigned val) ++{ ++ val &= 0xfff; ++ chksum += val; ++ fputc (type[0], lsifp); ++ fputc (type[1], lsifp); ++ fputc (b2a(val>>6), lsifp); ++ fputc (b2a(val), lsifp); ++} ++ ++ ++static void ++send24(unsigned long val) ++{ ++ int i; ++ val &= 0xffffff; ++ chksum += val>>12; ++ chksum += val&0xfff; ++ for (i = 18; i >= 0; i -= 6) { ++ char c = b2a(val >> i); ++ putc (c, lsifp); ++ } ++} ++ ++ ++static void ++txaddr (unsigned long addr) ++{ ++ send12(ADDR, addr >> 24); ++ send24(addr); ++} ++ ++static void ++lsiChecksum () ++{ ++ fputc ('\n', lsifp); ++ send12(CHKSUM, chksum); ++ fputc ('\n', lsifp); ++ chksum = 0; ++} ++ ++static void ++lsiFlush () ++{ ++ unsigned char *buf = lsibuf; ++ int zcnt = 0; ++ ++ if (lsilen == 0) ++ return; ++ ++ while (lsilen >= 3) { ++ unsigned long bdat; ++ ++ bdat = (buf[0]<<16)+(buf[1]<<8)+buf[2]; /* convert to single word */ ++ buf += 3; lsilen -= 3; ++ ++ if (bdat == 0) { ++ if (++zcnt < 4096) ++ continue; ++ zcnt--; ++ } ++ ++ if (zcnt) { ++ send12 (ZEROS, zcnt); ++ zcnt = 0; ++ } ++ send24(bdat); /* send the data */ ++ } ++ ++ if (zcnt) ++ send12 (ZEROS, zcnt); ++ ++ while (lsilen != 0) { ++ send12 (BYTE, *buf++); ++ lsilen--; ++ } ++ ++ fputc ('\n', lsifp); ++} ++ ++void ++LsiStart (FILE *fp, unsigned long ep) ++{ ++ lsibuf = (char *) xmalloc (BUFSIZE); ++ lsifp = fp; ++ send12(CLRSUM, 0); ++ chksum = 0; ++} ++ ++ ++void ++LsiOutput (unsigned long addr, unsigned char byte) ++{ ++ int newaddr = (addr != lsiaddr + lsilen); ++ if (newaddr || lsilen >= BUFSIZE) { ++ lsiFlush (); ++ if (newaddr) ++ txaddr (addr); ++ lsiaddr = addr; ++ } ++ lsibuf[lsilen++] = byte; ++} ++ ++ ++void ++LsiSym (char *name, unsigned long value) ++{ ++ int len = strlen(name); ++ char *buf = alloca (len + 10); ++ static int reclen = 0; ++ static int first = 1; ++ ++ if (first) { ++ lsiFlush (); ++ lsiChecksum (); ++ first = 0; ++ } ++ ++ if (reclen + 8 >= MAXREC) { ++ fputc ('\n', lsifp); ++ reclen = 0; ++ } ++ txaddr (value); ++ reclen += 8; ++ ++ len += 2; /* /S */ ++ strcpy(buf, name); ++ strcat(buf, ","); len++; ++ ++ /* pad total string length to multiple of 4 */ ++ while (len & 3) { ++ strcat (buf, "X"); ++ len++; ++ } ++ ++ if (reclen + len >= MAXREC) { ++ fputc ('\n', lsifp); ++ reclen = 0; ++ } ++ fprintf(lsifp, "/S%s", buf); ++ reclen += len; ++} ++ ++ ++void ++LsiEnd (unsigned long ep) ++{ ++ lsiFlush (); ++ lsiChecksum (); ++ txaddr(ep); ++ send12(END, 0); ++ fputc ('\n', lsifp); ++ free (lsibuf); ++} ++ +--- /dev/null ++++ b/convert/mipsflash.c +@@ -0,0 +1,161 @@ ++/* mipsflash.c -- MIPS eval board USB/parallel flash download format ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++static FILE *mipsfp; ++static unsigned long mipsaddr = ~0; ++static unsigned long mipsbase = ~0; ++static int mipslen; ++static unsigned char *mipsbuf; ++static int mipsbigendian; ++ ++extern int promflag; ++extern unsigned long prombase; ++ ++/* data chunk size - 16 words */ ++#define BUFSIZE (16*4) ++ ++/* flash sector size */ ++#define FLASH_BLOCK_SIZE 0x20000 ++ ++static void ++mipsFlush () ++{ ++ unsigned char *buf; ++ int done; ++ ++ if (mipslen == 0) ++ return; ++ ++ for (buf = mipsbuf, done = 0; done < BUFSIZE; buf += 4, done += 4) { ++ unsigned long val = 0; ++ int i; ++ ++ /* new line every 32 bytes (8 words) */ ++ if (done != 0 && done % 32 == 0) ++ fputc ('\n', mipsfp); ++ ++ /* collect one word from input buffer using appropriate endianness. */ ++ for (i = 0; i < 4; i++) { ++ unsigned int addr01 = (mipsaddr + done + i) & 0x3; ++ if (mipsbigendian) ++ val |= buf[i] << (8 * (3 - addr01)); ++ else ++ val |= buf[i] << (8 * addr01); ++ } ++ ++ /* output one word of data */ ++ fprintf (mipsfp, " %08lx", val); ++ } ++ ++ fputc ('\n', mipsfp); ++ ++ /* reset output buffer to blank */ ++ memset (mipsbuf, 0xff, BUFSIZE); ++ mipslen = 0; ++} ++ ++ ++void ++MipsStart (FILE *fp, unsigned long ep, int bigendian) ++{ ++ mipsbuf = (char *) xmalloc (BUFSIZE); ++ mipsfp = fp; ++ mipsbigendian = bigendian; ++ ++ /* Reset the loader state machine */ ++ fprintf (fp, "!R\n"); ++} ++ ++ ++void ++MipsOutput (unsigned long addr, unsigned char byte) ++{ ++ /* XXX Rework this whole thing to gather up aligned chunks into each ++ buffer, don't require strictly contiguous addresses. */ ++ ++ unsigned long lastaddr = mipsaddr + mipslen; ++ int newsector, newaddr; ++ ++ if (promflag) ++ /* convert back to PROM physical address */ ++ addr += prombase; ++ ++ newsector = ((addr ^ lastaddr) & ~(FLASH_BLOCK_SIZE - 1)) != 0; ++ newaddr = newsector || (addr != lastaddr); ++ ++ if (newaddr || newsector || mipslen >= BUFSIZE) { ++ mipsFlush (); ++ mipsaddr = addr; ++ } ++ ++ if (mipsbase == ~0) { ++ /* first byte - remember base address */ ++ mipsbase = addr; ++ if (mipsbase == 0x1fc00000) ++ /* unlock the flash */ ++ fprintf (mipsfp, ">1fc00xxx @1fc00000 !C\n"); ++ } ++ ++ if (newsector) ++ { ++ /* started new flash sector - erase it */ ++ unsigned long base = addr & ~(FLASH_BLOCK_SIZE - 1); ++ fprintf (mipsfp, ">%.5xxxx ", base / 0x1000); ++ fprintf (mipsfp, "@%.8x !E\n", base); ++ if (base != addr) ++ newaddr = 1; ++ } ++ ++ if (newaddr) ++ /* set new write addr */ ++ fprintf (mipsfp, "@%.8lx\n", addr); ++ ++ if (newaddr || newsector || ((addr & 0xfff == 0) && mipslen == 0)) ++ /* update display */ ++ fprintf (mipsfp, ">%.8lx\n", addr); ++ ++ mipsbuf[mipslen++] = byte; ++} ++ ++void ++MipsEnd (unsigned long ep) ++{ ++ mipsFlush (); ++ ++ if (mipsbase == 0x1fc00000) { ++ /* Lock the flash */ ++ fprintf (mipsfp, ">LOCKFLSH\n"); ++ fprintf (mipsfp, "@1fc00000 !S\n"); ++ fprintf (mipsfp, "@1fc20000 !S\n"); ++ fprintf (mipsfp, "@1fc40000 !S\n"); ++ fprintf (mipsfp, "@1fc60000 !S\n"); ++ fprintf (mipsfp, "@1fc80000 !S\n"); ++ fprintf (mipsfp, "@1fca0000 !S\n"); ++ fprintf (mipsfp, "@1fcc0000 !S\n"); ++ fprintf (mipsfp, "@1fce0000 !S\n"); ++ } ++ ++ fprintf (mipsfp, ">#DL_DONE\n"); ++ fprintf (mipsfp, ">FINISHED\n"); ++ free (mipsbuf); ++} ++ +--- /dev/null ++++ b/convert/srec.c +@@ -0,0 +1,119 @@ ++/* srec.c -- Motorola S-Record Output ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++#define BUFSIZE 32 ++ ++static FILE *srecfp; ++static unsigned long srecaddr = ~0; ++static int sreclen; ++static unsigned char srecbuf[BUFSIZE]; ++static int addrsize; ++ ++ ++static void ++srecFlush () ++{ ++ unsigned char cksum = 0; ++ int n; ++ ++ if (sreclen == 0) ++ return; ++ ++ fprintf (srecfp, "S%1d%02X", addrsize-1, sreclen + addrsize + 1); ++ cksum += sreclen + addrsize + 1; ++ ++ for (n = (addrsize - 1) * 8; n >= 0; n -= 8) { ++ unsigned char ab = srecaddr >> n; ++ fprintf (srecfp, "%02X", ab); ++ cksum += ab; ++ } ++ ++ for (n = 0; n < sreclen; n++) { ++ fprintf (srecfp, "%02X", srecbuf[n]); ++ cksum += srecbuf[n]; ++ } ++ ++ fprintf (srecfp, "%02X\n", ~cksum & 0xff); ++ sreclen = 0; ++} ++ ++ ++void ++Srec3Start (FILE *fp, unsigned long ep) ++{ ++ srecfp = fp; ++ addrsize = 4; ++} ++ ++void ++Srec2Start (FILE *fp, unsigned long ep) ++{ ++ srecfp = fp; ++ addrsize = 3; ++} ++ ++void ++Srec1Start (FILE *fp, unsigned long ep) ++{ ++ srecfp = fp; ++ addrsize = 2; ++} ++ ++ ++void ++SrecOutput (unsigned long addr, unsigned char byte) ++{ ++ if (addr != srecaddr + sreclen || sreclen == BUFSIZE) { ++ srecFlush (); ++ srecaddr = addr; ++ } ++ srecbuf[sreclen++] = byte; ++} ++ ++ ++void ++SrecSym (char *name, unsigned long value) ++{ ++ int len = strlen(name) + 8 + 2; ++ fprintf (srecfp, "S4%02X%08X%s,00\n", len, value, name); ++} ++ ++ ++void ++SrecEnd (unsigned long ep) ++{ ++ unsigned char cksum = 0; ++ int n; ++ ++ srecFlush (); ++ ++ fprintf (srecfp, "S%1d%02X", 11 - addrsize, addrsize + 1); ++ cksum += addrsize + 1; ++ ++ for (n = (addrsize - 1) * 8; n >= 0; n -= 8) { ++ unsigned char ab = ep >> n; ++ fprintf (srecfp, "%02X", ab); ++ cksum += ab; ++ } ++ ++ fprintf (srecfp, "%02X\n", ~cksum & 0xff); ++} +--- /dev/null ++++ b/convert/stagbin.c +@@ -0,0 +1,105 @@ ++/* stag.c -- Stag Programmer Binary Output ++ ++ Copyright (c) 1993-2003, 2008 Free Software Foundation, Inc. ++ Contributed by MIPS Technologies, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; If not, write to the Free Software ++ Foundation, 51 Franklin Street - Fifth Floor, Boston, MA ++ 02110-1301, USA. */ ++ ++#include "sysdep.h" ++ ++#define SOH 1 ++#define CHECKLENGTH 1024 /* # bytes between intermediate checksums */ ++#define BUFSIZE 8192 /* max bytes per block */ ++ ++static FILE *stagfp; ++static unsigned long stagaddr = ~0; ++static int staglen; ++static unsigned char *stagbuf; ++static int chksum; ++ ++static void ++sbinputc (unsigned char c) ++{ ++ chksum += c; ++ putc (c, stagfp); ++} ++ ++static void ++sbinlong (unsigned i) ++{ ++ sbinputc (i >> 24); ++ sbinputc (i >> 16); ++ sbinputc (i >> 8); ++ sbinputc (i); ++} ++ ++static void ++sbinheader (unsigned len, unsigned offs) ++{ ++ sbinputc (SOH); ++ chksum = 0; ++ sbinlong (len); ++ sbinlong (offs); ++} ++ ++static void ++stagFlush () ++{ ++ int i; ++ ++ if (staglen > 0) { ++ sbinheader (staglen, stagaddr); ++ for (i = 0; i < staglen; i++) { ++ if (i > 0 && i % CHECKLENGTH == 0) ++ fputc (-chksum, stagfp); /* intermediate checksum */ ++ putc (stagbuf[i], stagfp); ++ chksum += stagbuf[i]; ++ } ++ fputc (-chksum, stagfp); /* final checksum */ ++ staglen = 0; ++ } ++} ++ ++void ++StagStart (FILE *fp, unsigned long ep) ++{ ++ stagbuf = (char *) xmalloc (BUFSIZE); ++ stagfp = fp; ++} ++ ++ ++void ++StagOutput (unsigned long addr, unsigned char byte) ++{ ++ if (addr != stagaddr + staglen || staglen == BUFSIZE) { ++ stagFlush (); ++ stagaddr = addr; ++ } ++ stagbuf[staglen++] = byte; ++} ++ ++ ++void ++StagEnd (unsigned long ep) ++{ ++ stagFlush (); ++ ++ /* terminating null block */ ++ sbinheader (0, 0); /* header */ ++ fputc (0, stagfp); /* checksum */ ++ free (stagbuf); ++} ++ +--- /dev/null ++++ b/convert/sysdep.h +@@ -0,0 +1,114 @@ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#ifdef HAVE_STDDEF_H ++#include ++#endif ++ ++#ifdef HAVE_STDLIB_H ++# include ++#endif ++ ++#ifndef HAVE_STRCHR ++# define strchr index ++# define strrchr rindex ++#endif ++ ++#if HAVE_STRING_H ++# include ++#else ++char *strchr(), *strrchr(); ++#endif ++ ++#ifdef HAVE_STRINGS_H ++# include ++#endif ++ ++#ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy ((s), (d), (n)) ++# define memmove(d, s, n) bcopy ((s), (d), (n)) ++#endif ++ ++#ifdef HAVE_UNISTD_H ++#include ++#include ++#endif ++ ++#ifdef HAVE_FCNTL_H ++#include ++#else ++#ifdef HAVE_SYS_FILE_H ++#include ++#endif ++#endif ++ ++#ifndef SEEK_SET ++#define SEEK_SET 0 ++#endif ++#ifndef SEEK_CUR ++#define SEEK_CUR 1 ++#endif ++ ++#ifdef HAVE_LIMITS_H ++#include ++#endif ++ ++#include ++#include ++ ++#if defined(__GNUC__) && !defined(C_ALLOCA) ++# undef alloca ++# define alloca __builtin_alloca ++#else ++# if defined(HAVE_ALLOCA_H) && !defined(C_ALLOCA) ++# include ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++# if !defined (__STDC__) && !defined (__hpux) ++char *alloca (); ++# else ++void *alloca (); ++# endif /* __STDC__, __hpux */ ++# endif /* alloca */ ++# endif /* HAVE_ALLOCA_H */ ++#endif ++ ++#ifdef NEED_DECLARATION_MALLOC ++extern void *malloc (size_t); ++#endif ++#ifdef NEED_DECLARATION_REALLOC ++extern void *realloc (void *, size_t); ++#endif ++#ifdef NEED_DECLARATION_FREE ++extern void free (void *); ++#endif ++#ifdef NEED_DECLARATION_STRTOK ++extern char *strtok (char *, const char *); ++#endif ++ ++#ifdef USE_BINARY_FOPEN ++#define FOPEN_RB "rb" ++#define FOPEN_WB "wb" ++#define FOPEN_AB "ab" ++#define FOPEN_RUB "r+b" ++#define FOPEN_WUB "w+b" ++#define FOPEN_AUB "a+b" ++#else ++#define FOPEN_RB "r" ++#define FOPEN_WB "w" ++#define FOPEN_AB "a" ++#define FOPEN_RUB "r+" ++#define FOPEN_WUB "w+" ++#define FOPEN_AUB "a+" ++#endif ++ ++#define FOPEN_RT "r" ++#define FOPEN_WT "w" ++#define FOPEN_AT "a" ++#define FOPEN_RUT "r+" ++#define FOPEN_WUT "w+" ++#define FOPEN_AUT "a+" ++ ++/* local utility functions */ ++extern void * xmalloc (size_t); +--- /dev/null ++++ b/convert/version.h +@@ -0,0 +1,7 @@ ++#ifndef CONVERT_VERSION_H ++#define CONVERT_VERSION_H 1 ++ ++#define CONVERT_PKGVERSION @conv_version_package@ ++#define CONVERT_REPORT_BUGS_TO @report_bugs_to@ ++ ++#endif +--- a/gas/config/m68k-parse.h ++++ b/gas/config/m68k-parse.h +@@ -101,6 +101,7 @@ enum m68k_register + CACR, + VBR, + CAAR, ++ CPUCR, + MSP, + ITT0, + ITT1, +--- a/gas/config/tc-arm.c ++++ b/gas/config/tc-arm.c +@@ -25,10 +25,10 @@ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + ++#include "as.h" + #include + #include + #define NO_RELOC 0 +-#include "as.h" + #include "safe-ctype.h" + #include "subsegs.h" + #include "obstack.h" +@@ -199,6 +199,8 @@ static const arm_feature_set arm_ext_div + static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0); + static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0); + static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0); ++static const arm_feature_set arm_ext_marvell_f = ++ ARM_FEATURE (0, ARM_CEXT_MARVELL_F); + static const arm_feature_set arm_ext_m = + ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_V7M, 0); + +@@ -261,6 +263,9 @@ symbolS * GOT_symbol; + instructions. */ + static int thumb_mode = 0; + ++/* Enables/disables automatic IT insn insertion mode. */ ++static int do_automatic_it = 0; ++ + /* If unified_syntax is true, we are processing the new unified + ARM/Thumb syntax. Important differences from the old ARM mode: + +@@ -311,6 +316,18 @@ struct neon_type + unsigned elems; + }; + ++enum it_instruction_type ++{ ++ OUTSIDE_IT_INSN, ++ INSIDE_IT_INSN, ++ INSIDE_IT_LAST_INSN, ++ IF_INSIDE_IT_LAST_INSN, /* Either outside or inside; ++ if inside, should be the last one. */ ++ NEUTRAL_IT_INSN, /* This could be either inside or outside, ++ i.e. BKPT and NOP. */ ++ IT_INSN /* The IT insn has been parsed. */ ++}; ++ + struct arm_it + { + const char * error; +@@ -333,6 +350,8 @@ struct arm_it + int pc_rel; + } reloc; + ++ enum it_instruction_type it_insn_type; ++ + struct + { + unsigned reg; +@@ -670,6 +689,9 @@ struct asm_opcode + #define BAD_BRANCH _("branch must be last instruction in IT block") + #define BAD_NOT_IT _("instruction not allowed in IT block") + #define BAD_FPU _("selected FPU does not support instruction") ++#define BAD_OUT_IT _("thumb conditional instruction should be in IT block") ++#define BAD_IT_COND _("incorrect condition in IT block") ++#define BAD_IT_IT _("IT falling in the range of a previous IT block") + + static struct hash_control *arm_ops_hsh; + static struct hash_control *arm_cond_hsh; +@@ -691,7 +713,7 @@ static struct hash_control *arm_barrier_ + + symbolS * last_label_seen; + static int label_is_thumb_function_name = FALSE; +- ++ + /* Literal pool structure. Held on a per-section + and per-sub-section basis. */ + +@@ -711,9 +733,58 @@ typedef struct literal_pool + literal_pool * list_of_pools = NULL; + + /* State variables for IT block handling. */ +-static bfd_boolean current_it_mask = 0; +-static int current_cc; +- ++enum it_state ++{ ++ OUTSIDE_IT_BLOCK, MANUAL_IT_BLOCK, AUTOMATIC_IT_BLOCK ++}; ++struct current_it ++{ ++ int mask; ++ enum it_state state; ++ int cc; ++ int block_length; ++ char *insn; ++ int state_handled; ++}; ++ ++static struct current_it current_it; ++ ++static inline int ++current_it_compatible (int cond) ++{ ++ return (cond & ~1) == (current_it.cc & ~1); ++} ++ ++static inline int ++conditional_insn(void) ++{ ++ return inst.cond != COND_ALWAYS; ++} ++ ++static int ++in_it_block (void); ++ ++static int ++handle_it_state (void); ++ ++static void ++force_automatic_it_block_close (void); ++ ++#define set_it_insn_type(type) \ ++ do{ \ ++ inst.it_insn_type = type; \ ++ if (handle_it_state () == FAIL) \ ++ return; \ ++ }while(0) ++ ++#define set_it_insn_type_last() \ ++ do{ \ ++ if (inst.cond == COND_ALWAYS) \ ++ set_it_insn_type (IF_INSIDE_IT_LAST_INSN); \ ++ else \ ++ set_it_insn_type (INSIDE_IT_LAST_INSN); \ ++ }while(0) ++ + /* Pure syntax. */ + + /* This array holds the chars that always start a comment. If the +@@ -2210,7 +2281,13 @@ create_neon_reg_alias (char *newname, ch + } + } + ++#ifdef TC_CASE_SENSITIVE + namelen = nameend - newname; ++#else ++ newname = original_case_string; ++ namelen = strlen (newname); ++#endif ++ + namebuf = alloca (namelen + 1); + strncpy (namebuf, newname, namelen); + namebuf[namelen] = '\0'; +@@ -2348,20 +2425,15 @@ s_unreq (int a ATTRIBUTE_UNUSED) + + static enum mstate mapstate = MAP_UNDEFINED; + +-void +-mapping_state (enum mstate state) ++/* Create a new mapping symbol for the transition to STATE. */ ++ ++static void ++make_mapping_symbol (enum mstate state, valueT value, fragS *frag) + { + symbolS * symbolP; + const char * symname; + int type; + +- if (mapstate == state) +- /* The mapping symbol has already been emitted. +- There is nothing else to do. */ +- return; +- +- mapstate = state; +- + switch (state) + { + case MAP_DATA: +@@ -2376,16 +2448,11 @@ mapping_state (enum mstate state) + symname = "$t"; + type = BSF_NO_FLAGS; + break; +- case MAP_UNDEFINED: +- return; + default: + abort (); + } + +- seg_info (now_seg)->tc_segment_info_data.mapstate = state; +- +- symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now); +- symbol_table_insert (symbolP); ++ symbolP = symbol_new (symname, now_seg, value, frag); + symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL; + + switch (state) +@@ -2404,11 +2471,84 @@ mapping_state (enum mstate state) + + case MAP_DATA: + default: +- return; ++ break; + } ++ ++ /* Save the mapping symbols for future reference. Also check that ++ we do not place two mapping symbols at the same offset within a ++ frag. We'll handle overlap between frags in ++ check_mapping_symbols. */ ++ if (value == 0) ++ { ++ know (frag->tc_frag_data.first_map == NULL); ++ frag->tc_frag_data.first_map = symbolP; ++ } ++ if (frag->tc_frag_data.last_map != NULL) ++ know (S_GET_VALUE (frag->tc_frag_data.last_map) < S_GET_VALUE (symbolP)); ++ frag->tc_frag_data.last_map = symbolP; ++} ++ ++/* We must sometimes convert a region marked as code to data during ++ code alignment, if an odd number of bytes have to be padded. The ++ code mapping symbol is pushed to an aligned address. */ ++ ++static void ++insert_data_mapping_symbol (enum mstate state, ++ valueT value, fragS *frag, offsetT bytes) ++{ ++ /* If there was already a mapping symbol, remove it. */ ++ if (frag->tc_frag_data.last_map != NULL ++ && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value) ++ { ++ symbolS *symp = frag->tc_frag_data.last_map; ++ ++ if (value == 0) ++ { ++ know (frag->tc_frag_data.first_map == symp); ++ frag->tc_frag_data.first_map = NULL; ++ } ++ frag->tc_frag_data.last_map = NULL; ++ symbol_remove (symp, &symbol_rootP, &symbol_lastP); ++ } ++ ++ make_mapping_symbol (MAP_DATA, value, frag); ++ make_mapping_symbol (state, value + bytes, frag); ++} ++ ++/* Set the mapping state to STATE. Only call this when about to ++ emit some STATE bytes to the file. */ ++ ++void ++mapping_state (enum mstate state) ++{ ++ if (mapstate == state) ++ /* The mapping symbol has already been emitted. ++ There is nothing else to do. */ ++ return; ++ ++ mapstate = state; ++ seg_info (now_seg)->tc_segment_info_data.mapstate = state; ++ make_mapping_symbol (state, (valueT) frag_now_fix (), frag_now); ++} ++ ++/* Same as mapping_state, but MAX_CHARS bytes have already been ++ allocated. Put the mapping symbol that far back. */ ++ ++static void ++mapping_state_2 (enum mstate state, int max_chars) ++{ ++ if (mapstate == state) ++ /* The mapping symbol has already been emitted. ++ There is nothing else to do. */ ++ return; ++ ++ mapstate = state; ++ seg_info (now_seg)->tc_segment_info_data.mapstate = state; ++ make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now); + } + #else + #define mapping_state(x) /* nothing */ ++#define mapping_state_2(x, y) /* nothing */ + #endif + + /* Find the real, Thumb encoded start of a Thumb function. */ +@@ -2462,7 +2602,6 @@ opcode_select (int width) + coming from ARM mode, which is word-aligned. */ + record_alignment (now_seg, 1); + } +- mapping_state (MAP_THUMB); + break; + + case 32: +@@ -2478,7 +2617,6 @@ opcode_select (int width) + + record_alignment (now_seg, 1); + } +- mapping_state (MAP_ARM); + break; + + default: +@@ -2717,7 +2855,10 @@ s_bss (int ignore ATTRIBUTE_UNUSED) + marking in_bss, then looking at s_skip for clues. */ + subseg_set (bss_section, 0); + demand_empty_rest_of_line (); +- mapping_state (MAP_DATA); ++ ++#ifdef md_elf_section_change_hook ++ md_elf_section_change_hook (); ++#endif + } + + static void +@@ -6114,7 +6255,7 @@ parse_operands (char *str, const unsigne + #undef po_reg_or_goto + #undef po_imm_or_fail + #undef po_scalar_or_fail +- ++ + /* Shorthand macro for instruction encoding functions issuing errors. */ + #define constraint(expr, err) do { \ + if (expr) \ +@@ -6136,6 +6277,14 @@ parse_operands (char *str, const unsigne + } \ + while (0) + ++/* If REG is R13 (the stack pointer), warn that its use is ++ deprecated. */ ++#define warn_deprecated_sp(reg) \ ++ do \ ++ if (warn_on_deprecated && reg == REG_SP) \ ++ as_warn (_("use of r13 is deprecated")); \ ++ while (0) ++ + /* Functions for operand encoding. ARM, then Thumb. */ + + #define rotate_left(v, n) (v << n | v >> (32 - n)) +@@ -7304,11 +7453,14 @@ do_mull (void) + static void + do_nop (void) + { +- if (inst.operands[0].present) ++ if (inst.operands[0].present ++ || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k)) + { + /* Architectural NOP hints are CPSR sets with no bits selected. */ + inst.instruction &= 0xf0000000; +- inst.instruction |= 0x0320f000 + inst.operands[0].imm; ++ inst.instruction |= 0x0320f000; ++ if (inst.operands[0].present) ++ inst.instruction |= inst.operands[0].imm; + } + } + +@@ -8468,6 +8620,9 @@ do_t_add_sub (void) + ? inst.operands[1].reg /* Rd, Rs, foo */ + : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */ + ++ if (Rd == REG_PC) ++ set_it_insn_type_last (); ++ + if (unified_syntax) + { + bfd_boolean flags; +@@ -8477,9 +8632,9 @@ do_t_add_sub (void) + flags = (inst.instruction == T_MNEM_adds + || inst.instruction == T_MNEM_subs); + if (flags) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + if (!inst.operands[2].isreg) + { + int add; +@@ -8731,9 +8886,9 @@ do_t_arit3 (void) + + /* See if we can do this with a 16-bit instruction. */ + if (THUMB_SETS_FLAGS (inst.instruction)) +- narrow = current_it_mask == 0; ++ narrow = !in_it_block (); + else +- narrow = current_it_mask != 0; ++ narrow = in_it_block (); + + if (Rd > 7 || Rn > 7 || Rs > 7) + narrow = FALSE; +@@ -8819,9 +8974,9 @@ do_t_arit3c (void) + + /* See if we can do this with a 16-bit instruction. */ + if (THUMB_SETS_FLAGS (inst.instruction)) +- narrow = current_it_mask == 0; ++ narrow = !in_it_block (); + else +- narrow = current_it_mask != 0; ++ narrow = in_it_block (); + + if (Rd > 7 || Rn > 7 || Rs > 7) + narrow = FALSE; +@@ -8974,7 +9129,8 @@ do_t_bfx (void) + static void + do_t_blx (void) + { +- constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH); ++ set_it_insn_type_last (); ++ + if (inst.operands[0].isreg) + { + constraint (inst.operands[0].reg == REG_PC, BAD_PC); +@@ -8985,12 +9141,7 @@ do_t_blx (void) + { + /* No register. This must be BLX(1). */ + inst.instruction = 0xf000e800; +-#ifdef OBJ_ELF +- if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4) +- inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23; +- else +-#endif +- inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX; ++ inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX; + inst.reloc.pc_rel = 1; + } + } +@@ -9001,13 +9152,14 @@ do_t_branch (void) + int opcode; + int cond; + +- if (current_it_mask) ++ cond = inst.cond; ++ set_it_insn_type (IF_INSIDE_IT_LAST_INSN); ++ ++ if (in_it_block ()) + { + /* Conditional branches inside IT blocks are encoded as unconditional + branches. */ + cond = COND_ALWAYS; +- /* A branch must be the last instruction in an IT block. */ +- constraint (current_it_mask != 0x10, BAD_BRANCH); + } + else + cond = inst.cond; +@@ -9057,13 +9209,14 @@ do_t_bkpt (void) + constraint (inst.operands[0].imm > 255, + _("immediate value out of range")); + inst.instruction |= inst.operands[0].imm; ++ set_it_insn_type (NEUTRAL_IT_INSN); + } + } + + static void + do_t_branch23 (void) + { +- constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH); ++ set_it_insn_type_last (); + inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23; + inst.reloc.pc_rel = 1; + +@@ -9082,7 +9235,7 @@ do_t_branch23 (void) + static void + do_t_bx (void) + { +- constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH); ++ set_it_insn_type_last (); + inst.instruction |= inst.operands[0].reg << 3; + /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc + should cause the alignment to be checked once it is known. This is +@@ -9094,7 +9247,7 @@ do_t_bxj (void) + { + int Rm; + +- constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH); ++ set_it_insn_type_last (); + Rm = inst.operands[0].reg; + reject_bad_reg (Rm); + inst.instruction |= Rm << 16; +@@ -9120,14 +9273,14 @@ do_t_clz (void) + static void + do_t_cps (void) + { +- constraint (current_it_mask, BAD_NOT_IT); ++ set_it_insn_type (OUTSIDE_IT_INSN); + inst.instruction |= inst.operands[0].imm; + } + + static void + do_t_cpsi (void) + { +- constraint (current_it_mask, BAD_NOT_IT); ++ set_it_insn_type (OUTSIDE_IT_INSN); + if (unified_syntax + && (inst.operands[1].present || inst.size_req == 4) + && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm)) +@@ -9174,7 +9327,7 @@ do_t_cpy (void) + static void + do_t_cbz (void) + { +- constraint (current_it_mask, BAD_NOT_IT); ++ set_it_insn_type (OUTSIDE_IT_INSN); + constraint (inst.operands[0].reg > 7, BAD_HIREG); + inst.instruction |= inst.operands[0].reg; + inst.reloc.pc_rel = 1; +@@ -9188,6 +9341,17 @@ do_t_dbg (void) + } + + static void ++do_marvell_div (void) ++{ ++ /* Encode SDIV or UDIV instructions using the special Marvell ++ encoding utilizing MRC. */ ++ ++ inst.instruction |= inst.operands[0].reg << 12; ++ inst.instruction |= inst.operands[1].reg << 16; ++ inst.instruction |= inst.operands[2].reg; ++} ++ ++static void + do_t_div (void) + { + unsigned Rd, Rn, Rm; +@@ -9220,9 +9384,9 @@ do_t_it (void) + { + unsigned int cond = inst.operands[0].imm; + +- constraint (current_it_mask, BAD_NOT_IT); +- current_it_mask = (inst.instruction & 0xf) | 0x10; +- current_cc = cond; ++ set_it_insn_type (IT_INSN); ++ current_it.mask = (inst.instruction & 0xf) | 0x10; ++ current_it.cc = cond; + + /* If the condition is a negative condition, invert the mask. */ + if ((cond & 0x1) == 0x0) +@@ -9257,9 +9421,13 @@ encode_thumb2_ldmstm (int base, unsigned + inst.error = _("SP not allowed in register list"); + if (load) + { +- if (mask & (1 << 14) +- && mask & (1 << 15)) +- inst.error = _("LR and PC should not both be in register list"); ++ if (mask & (1 << 15)) ++ { ++ if (mask & (1 << 14)) ++ inst.error = _("LR and PC should not both be in register list"); ++ else ++ set_it_insn_type_last (); ++ } + + if ((mask & (1 << base)) != 0 + && writeback) +@@ -9435,6 +9603,13 @@ do_t_ldst (void) + unsigned long opcode; + int Rn; + ++ if (inst.operands[0].isreg ++ && !inst.operands[0].preind ++ && inst.operands[0].reg == REG_PC) ++ { ++ set_it_insn_type_last (); ++ } ++ + opcode = inst.instruction; + if (unified_syntax) + { +@@ -9655,6 +9830,9 @@ do_t_mov_cmp (void) + Rn = inst.operands[0].reg; + Rm = inst.operands[1].reg; + ++ if (Rn == REG_PC) ++ set_it_insn_type_last (); ++ + if (unified_syntax) + { + int r0off = (inst.instruction == T_MNEM_mov +@@ -9665,7 +9843,7 @@ do_t_mov_cmp (void) + + low_regs = (Rn <= 7 && Rm <= 7); + opcode = inst.instruction; +- if (current_it_mask) ++ if (in_it_block ()) + narrow = opcode != T_MNEM_movs; + else + narrow = opcode != T_MNEM_movs || low_regs; +@@ -9686,7 +9864,18 @@ do_t_mov_cmp (void) + if (opcode == T_MNEM_cmp) + { + constraint (Rn == REG_PC, BAD_PC); +- reject_bad_reg (Rm); ++ if (narrow) ++ { ++ /* In the Thumb-2 ISA, use of R13 as Rm is deprecated, ++ but valid. */ ++ warn_deprecated_sp (Rm); ++ /* R15 was documented as a valid choice for Rm in ARMv6, ++ but as UNPREDICTABLE in ARMv7. ARM's proprietary ++ tools reject R15, so we do too. */ ++ constraint (Rm == REG_PC, BAD_PC); ++ } ++ else ++ reject_bad_reg (Rm); + } + else if (opcode == T_MNEM_mov + || opcode == T_MNEM_movs) +@@ -9709,7 +9898,7 @@ do_t_mov_cmp (void) + if (!inst.operands[1].isreg) + { + /* Immediate operand. */ +- if (current_it_mask == 0 && opcode == T_MNEM_mov) ++ if (!in_it_block () && opcode == T_MNEM_mov) + narrow = 0; + if (low_regs && narrow) + { +@@ -9735,7 +9924,7 @@ do_t_mov_cmp (void) + /* Register shifts are encoded as separate shift instructions. */ + bfd_boolean flags = (inst.instruction == T_MNEM_movs); + +- if (current_it_mask) ++ if (in_it_block ()) + narrow = !flags; + else + narrow = flags; +@@ -9791,7 +9980,7 @@ do_t_mov_cmp (void) + && (inst.instruction == T_MNEM_mov + || inst.instruction == T_MNEM_movs)) + { +- if (current_it_mask) ++ if (in_it_block ()) + narrow = (inst.instruction == T_MNEM_mov); + else + narrow = (inst.instruction == T_MNEM_movs); +@@ -9953,9 +10142,9 @@ do_t_mvn_tst (void) + else if (inst.instruction == T_MNEM_cmn) + narrow = TRUE; + else if (THUMB_SETS_FLAGS (inst.instruction)) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + + if (!inst.operands[1].isreg) + { +@@ -10094,9 +10283,9 @@ do_t_mul (void) + || Rm > 7) + narrow = FALSE; + else if (inst.instruction == T_MNEM_muls) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + } + else + { +@@ -10162,6 +10351,8 @@ do_t_mull (void) + static void + do_t_nop (void) + { ++ set_it_insn_type(NEUTRAL_IT_INSN); ++ + if (unified_syntax) + { + if (inst.size_req == 4 || inst.operands[0].imm > 15) +@@ -10198,9 +10389,9 @@ do_t_neg (void) + bfd_boolean narrow; + + if (THUMB_SETS_FLAGS (inst.instruction)) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7) + narrow = FALSE; + if (inst.size_req == 4) +@@ -10424,9 +10615,9 @@ do_t_rsb (void) + bfd_boolean narrow; + + if ((inst.instruction & 0x00100000) != 0) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + + if (Rd > 7 || Rs > 7) + narrow = FALSE; +@@ -10460,7 +10651,7 @@ do_t_rsb (void) + static void + do_t_setend (void) + { +- constraint (current_it_mask, BAD_NOT_IT); ++ set_it_insn_type (OUTSIDE_IT_INSN); + if (inst.operands[0].imm) + inst.instruction |= 0x8; + } +@@ -10490,9 +10681,9 @@ do_t_shift (void) + } + + if (THUMB_SETS_FLAGS (inst.instruction)) +- narrow = (current_it_mask == 0); ++ narrow = !in_it_block (); + else +- narrow = (current_it_mask != 0); ++ narrow = in_it_block (); + if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7) + narrow = FALSE; + if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR) +@@ -10778,7 +10969,7 @@ do_t_tb (void) + int half; + + half = (inst.instruction & 0x10) != 0; +- constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH); ++ set_it_insn_type_last (); + constraint (inst.operands[0].immisreg, + _("instruction requires register index")); + +@@ -14410,6 +14601,28 @@ output_inst (const char * str) + dwarf2_emit_insn (inst.size); + } + ++static char* ++output_it_inst (int cond, int mask, char* to) ++{ ++ unsigned long instruction = 0xbf00; ++ ++ mask &= 0xf; ++ instruction |= mask; ++ instruction |= cond << 4; ++ ++ if (to == NULL) ++ { ++ to = frag_more (2); ++#ifdef OBJ_ELF ++ dwarf2_emit_insn (2); ++#endif ++ } ++ ++ md_number_to_chars (to, instruction, 2); ++ ++ return to; ++} ++ + /* Tag values used in struct asm_opcode's tag field. */ + enum opcode_tag + { +@@ -14655,6 +14868,301 @@ opcode_lookup (char **str) + return 0; + } + ++/* Output an automatically inserted IT instruction. Initially this only covers ++ a single instruction, but may be extended later. To simply cleanup at the end ++ of a block we update the instruction as we go along. */ ++static void ++new_automatic_it_block (int cond) ++{ ++ current_it.state = AUTOMATIC_IT_BLOCK; ++ current_it.mask = 0x18; ++ current_it.cc = cond; ++ current_it.block_length = 1; ++ current_it.insn = output_it_inst(cond, current_it.mask, NULL); ++} ++ ++/* Close an automatic IT block. ++ See comments in new_automatic_it_block (). */ ++static void ++close_automatic_it_block (void) ++{ ++ current_it.mask = 0x10; ++ current_it.block_length = 0; ++} ++ ++/* Update the mask of the current automatically-generated IT ++ instruction. See comments in new_automatic_it_block (). */ ++static void ++current_it_add_mask (int cond) ++{ ++#define CLEAR_BIT(value, nbit) ((value) & ~(1 << (nbit))) ++#define SET_BIT_VALUE(value, bitvalue, nbit) (CLEAR_BIT(value, nbit) \ ++ | ((bitvalue) << (nbit))) ++ ++ const int resulting_bit = (cond & 1); ++ current_it.mask &= 0xf; ++ current_it.mask = SET_BIT_VALUE (current_it.mask, ++ resulting_bit, ++ (5 - current_it.block_length)); ++ current_it.mask = SET_BIT_VALUE (current_it.mask, ++ 1, ++ ((5 - current_it.block_length) - 1) ); ++ output_it_inst (current_it.cc, current_it.mask, current_it.insn); ++ ++#undef CLEAR_BIT ++#undef SET_BIT_VALUE ++ ++} ++ ++/* The IT blocks handling machinery is accessed through the these functions: ++ it_fsm_pre_encode () from md_assemble () ++ set_it_insn_type () optional, from the tencode functions ++ set_it_insn_type_last () ditto ++ in_it_block () ditto ++ it_fsm_post_encode () from md_assemble () ++ force_automatic_it_block_close () from label habdling functions ++ ++ Rationale: ++ 1) md_assemble () calls it_fsm_pre_encode () before calling tencode (), ++ initializing the IT insn type with a generic initial value depending ++ on the inst.condition. ++ 2) During the tencode function, two things may happen: ++ a) The tencode function overrides the IT insn type by ++ calling either set_it_insn_type (type) or set_it_insn_type_last (). ++ b) The tencode function queries the IT block state by ++ calling in_it_block () (i.e. to determine narrow/wide mode). ++ ++ Both set_it_insn_type and in_it_block run the internal FSM state ++ handling function (handle_it_state), because: a) setting the IT insn ++ type may incur in an invalid state (exiting the function), ++ and b) querying the state requires the FSM to be updated. ++ Specifically we want to avoid creating an IT block for conditional ++ branches, so it_fsm_pre_encode is actually a guess and we can't ++ determine whether an IT block is required until the tencode () routine ++ has decided what type of instruction this actually it. ++ Because of this, if set_it_insn_type and in_it_block have to be used, ++ set_it_insn_type has to be called first. ++ ++ set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that ++ determines the insn IT type depending on the inst.cond code. ++ When a tencode () routine encodes an instruction that can be ++ either outside an IT block, or, in the case of being inside, has to be ++ the last one, set_it_insn_type_last () will determine the proper ++ IT instruction type based on the inst.cond code. Otherwise, ++ set_it_insn_type can be called for overriding that logic or ++ for covering other cases. ++ ++ Calling handle_it_state () may not transition the IT block state to ++ OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be ++ still queried. Instead, if the FSM determines that the state should ++ be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed ++ after the tencode () function: that's what it_fsm_post_encode () does. ++ ++ Since in_it_block () calls the state handling function to get an ++ updated state, an error may occur (due to invalid insns combination). ++ In that case, inst.error is set. ++ Therefore, inst.error has to be checked after the execution of ++ the tencode () routine. ++ ++ 3) Back in md_assemble(), it_fsm_post_encode () is called to commit ++ any pending state change (if any) that didn't take place in ++ handle_it_state () as explained above. */ ++ ++static void ++it_fsm_pre_encode (void) ++{ ++ if (inst.cond != COND_ALWAYS) ++ inst.it_insn_type = INSIDE_IT_INSN; ++ else ++ inst.it_insn_type = OUTSIDE_IT_INSN; ++ ++ current_it.state_handled = 0; ++} ++ ++/* IT state FSM handling function. */ ++static int ++handle_it_state (void) ++{ ++ current_it.state_handled = 1; ++ ++ switch(current_it.state) ++ { ++ case OUTSIDE_IT_BLOCK: ++ switch (inst.it_insn_type) ++ { ++ case OUTSIDE_IT_INSN: ++ break; ++ ++ case INSIDE_IT_INSN: ++ case INSIDE_IT_LAST_INSN: ++ if (do_automatic_it) ++ { ++ /* Automatically generate the IT instruction. */ ++ new_automatic_it_block (inst.cond); ++ if (inst.it_insn_type == INSIDE_IT_LAST_INSN) ++ close_automatic_it_block (); ++ } ++ else ++ { ++ inst.error = BAD_OUT_IT; ++ return FAIL; ++ } ++ break; ++ ++ case IF_INSIDE_IT_LAST_INSN: ++ case NEUTRAL_IT_INSN: ++ break; ++ ++ case IT_INSN: ++ current_it.state = MANUAL_IT_BLOCK; ++ current_it.block_length = 0; ++ break; ++ } ++ break; ++ ++ case AUTOMATIC_IT_BLOCK: ++ /* Three things may happen now: ++ a) We should increment current it block size; ++ b) We should close current it block (closing insn or 4 insns); ++ c) We should close current it block and start a new one (due ++ to incompatible conditions or ++ 4 insns-length block reached). */ ++ ++ switch (inst.it_insn_type) ++ { ++ case OUTSIDE_IT_INSN: ++ /* The closure of the block shall happen immediatelly, ++ so any in_it_block () call reports the block as closed. */ ++ force_automatic_it_block_close (); ++ break; ++ ++ case INSIDE_IT_INSN: ++ case INSIDE_IT_LAST_INSN: ++ case IF_INSIDE_IT_LAST_INSN: ++ current_it.block_length++; ++ ++ if (current_it.block_length > 4 ++ || !current_it_compatible (inst.cond)) ++ { ++ force_automatic_it_block_close (); ++ if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN) ++ new_automatic_it_block (inst.cond); ++ } ++ else ++ { ++ current_it_add_mask (inst.cond); ++ } ++ ++ if (current_it.state == AUTOMATIC_IT_BLOCK ++ && (inst.it_insn_type == INSIDE_IT_LAST_INSN ++ || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN)) ++ close_automatic_it_block (); ++ break; ++ ++ case NEUTRAL_IT_INSN: ++ current_it.block_length++; ++ ++ if (current_it.block_length > 4) ++ force_automatic_it_block_close (); ++ else ++ current_it_add_mask (current_it.cc & 1); ++ break; ++ ++ case IT_INSN: ++ close_automatic_it_block (); ++ current_it.state = MANUAL_IT_BLOCK; ++ break; ++ } ++ break; ++ ++ case MANUAL_IT_BLOCK: ++ { ++ /* Check conditional suffixes. */ ++ const int cond = current_it.cc ^ ((current_it.mask >> 4) & 1) ^ 1; ++ int is_last; ++ current_it.mask <<= 1; ++ current_it.mask &= 0x1f; ++ is_last = (current_it.mask == 0x10); ++ ++ switch (inst.it_insn_type) ++ { ++ case OUTSIDE_IT_INSN: ++ inst.error = BAD_NOT_IT; ++ return FAIL; ++ ++ case INSIDE_IT_INSN: ++ if (cond != inst.cond) ++ { ++ inst.error = BAD_IT_COND; ++ return FAIL; ++ } ++ break; ++ ++ case INSIDE_IT_LAST_INSN: ++ case IF_INSIDE_IT_LAST_INSN: ++ if (cond != inst.cond) ++ { ++ inst.error = BAD_IT_COND; ++ return FAIL; ++ } ++ if (!is_last) ++ { ++ inst.error = BAD_BRANCH; ++ return FAIL; ++ } ++ break; ++ ++ case NEUTRAL_IT_INSN: ++ /* The BKPT instruction is unconditional even in an IT block. */ ++ break; ++ ++ case IT_INSN: ++ inst.error = BAD_IT_IT; ++ return FAIL; ++ } ++ } ++ break; ++ } ++ ++ return SUCCESS; ++} ++ ++static void ++it_fsm_post_encode (void) ++{ ++ int is_last; ++ ++ if (!current_it.state_handled) ++ handle_it_state (); ++ ++ is_last = (current_it.mask == 0x10); ++ if (is_last) ++ { ++ current_it.state = OUTSIDE_IT_BLOCK; ++ current_it.mask = 0; ++ } ++} ++ ++static void ++force_automatic_it_block_close (void) ++{ ++ if (current_it.state == AUTOMATIC_IT_BLOCK) ++ { ++ close_automatic_it_block (); ++ current_it.state = OUTSIDE_IT_BLOCK; ++ current_it.mask = 0; ++ } ++} ++ ++static int ++in_it_block (void) ++{ ++ if (!current_it.state_handled) ++ handle_it_state (); ++ ++ return current_it.state != OUTSIDE_IT_BLOCK; ++} ++ + void + md_assemble (char *str) + { +@@ -14719,40 +15227,24 @@ md_assemble (char *str) + /* Implicit require narrow instructions on Thumb-1. This avoids + relaxation accidentally introducing Thumb-2 instructions. */ + if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23 +- && !ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)) ++ && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr) ++ || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier))) + inst.size_req = 2; + } + +- /* Check conditional suffixes. */ +- if (current_it_mask) +- { +- int cond; +- cond = current_cc ^ ((current_it_mask >> 4) & 1) ^ 1; +- current_it_mask <<= 1; +- current_it_mask &= 0x1f; +- /* The BKPT instruction is unconditional even in an IT block. */ +- if (!inst.error +- && cond != inst.cond && opcode->tencode != do_t_bkpt) +- { +- as_bad (_("incorrect condition in IT block")); +- return; +- } +- } +- else if (inst.cond != COND_ALWAYS && opcode->tencode != do_t_branch) +- { +- as_bad (_("thumb conditional instruction not in IT block")); +- return; +- } +- + mapping_state (MAP_THUMB); + inst.instruction = opcode->tvalue; + + if (!parse_operands (p, opcode->operands)) +- opcode->tencode (); ++ { ++ /* Prepare the it_insn_type for those encodings that don't set ++ it. */ ++ it_fsm_pre_encode (); + +- /* Clear current_it_mask at the end of an IT block. */ +- if (current_it_mask == 0x10) +- current_it_mask = 0; ++ opcode->tencode (); ++ ++ it_fsm_post_encode (); ++ } + + if (!(inst.error || inst.relax)) + { +@@ -14777,7 +15269,8 @@ md_assemble (char *str) + This is overly pessimistic for relaxable instructions. */ + if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800) + || inst.relax) +- && !ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)) ++ && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr) ++ || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier))) + ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, + arm_ext_v6t2); + } +@@ -14847,6 +15340,8 @@ arm_frob_label (symbolS * sym) + ARM_SET_INTERWORK (sym, support_interwork); + #endif + ++ force_automatic_it_block_close (); ++ + /* Note - do not allow local symbols (.Lxxx) to be labelled + as Thumb functions. This is because these labels, whilst + they exist inside Thumb code, are not the entry points for +@@ -15834,11 +16329,14 @@ static const struct asm_opcode insns[] = + TCE(tbb, 0, e8d0f000, 1, (TB), 0, t_tb), + TCE(tbh, 0, e8d0f010, 1, (TB), 0, t_tb), + +- /* Thumb-2 hardware division instructions (R and M profiles only). */ ++ /* Thumb-2 hardware division instructions (R and M profiles only) and ++ Marvell-specific encoding of sdiv and udiv as mrc. */ + #undef THUMB_VARIANT + #define THUMB_VARIANT &arm_ext_div +- TCE(sdiv, 0, fb90f0f0, 3, (RR, oRR, RR), 0, t_div), +- TCE(udiv, 0, fbb0f0f0, 3, (RR, oRR, RR), 0, t_div), ++#undef ARM_VARIANT ++#define ARM_VARIANT &arm_ext_marvell_f ++ TCE(sdiv, e300690, fb90f0f0, 3, (RR, oRR, RR), marvell_div, t_div), ++ TCE(udiv, e300610, fbb0f0f0, 3, (RR, oRR, RR), marvell_div, t_div), + + /* ARM V6M/V7 instructions. */ + #undef ARM_VARIANT +@@ -17550,14 +18048,39 @@ md_section_align (segT segment ATTRIBUT + void + arm_handle_align (fragS * fragP) + { +- static char const arm_noop[4] = { 0x00, 0x00, 0xa0, 0xe1 }; +- static char const thumb_noop[2] = { 0xc0, 0x46 }; +- static char const arm_bigend_noop[4] = { 0xe1, 0xa0, 0x00, 0x00 }; +- static char const thumb_bigend_noop[2] = { 0x46, 0xc0 }; +- +- int bytes, fix, noop_size; ++ static char const arm_noop[2][2][4] = ++ { ++ { /* ARMv1 */ ++ {0x00, 0x00, 0xa0, 0xe1}, /* LE */ ++ {0xe1, 0xa0, 0x00, 0x00}, /* BE */ ++ }, ++ { /* ARMv6k */ ++ {0x00, 0xf0, 0x20, 0xe3}, /* LE */ ++ {0xe3, 0x20, 0xf0, 0x00}, /* BE */ ++ }, ++ }; ++ static char const thumb_noop[2][2][2] = ++ { ++ { /* Thumb-1 */ ++ {0xc0, 0x46}, /* LE */ ++ {0x46, 0xc0}, /* BE */ ++ }, ++ { /* Thumb-2 */ ++ {0x00, 0xbf}, /* LE */ ++ {0xbf, 0x00} /* BE */ ++ } ++ }; ++ static char const wide_thumb_noop[2][4] = ++ { /* Wide Thumb-2 */ ++ {0xaf, 0xf3, 0x00, 0x80}, /* LE */ ++ {0xf3, 0xaf, 0x80, 0x00}, /* BE */ ++ }; ++ ++ unsigned bytes, fix, noop_size; + char * p; + const char * noop; ++ const char *narrow_noop = NULL; ++ enum mstate state; + + if (fragP->fr_type != rs_align_code) + return; +@@ -17569,31 +18092,52 @@ arm_handle_align (fragS * fragP) + if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE) + bytes &= MAX_MEM_FOR_RS_ALIGN_CODE; + +- if (fragP->tc_frag_data) ++ if (fragP->tc_frag_data.thumb_mode) + { +- if (target_big_endian) +- noop = thumb_bigend_noop; ++ if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)) ++ { ++ narrow_noop = thumb_noop[1][target_big_endian]; ++ noop = wide_thumb_noop[target_big_endian]; ++ } + else +- noop = thumb_noop; +- noop_size = sizeof (thumb_noop); ++ noop = thumb_noop[0][target_big_endian]; ++ noop_size = 2; ++ state = MAP_THUMB; + } + else + { +- if (target_big_endian) +- noop = arm_bigend_noop; +- else +- noop = arm_noop; +- noop_size = sizeof (arm_noop); ++ noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0] ++ [target_big_endian]; ++ noop_size = 4; ++ state = MAP_ARM; + } +- ++ ++ fragP->fr_var = noop_size; ++ + if (bytes & (noop_size - 1)) + { + fix = bytes & (noop_size - 1); ++ insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix); + memset (p, 0, fix); + p += fix; + bytes -= fix; + } + ++ if (narrow_noop) ++ { ++ if (bytes & noop_size) ++ { ++ /* Insert a narrow noop. */ ++ memcpy (p, narrow_noop, noop_size); ++ p += noop_size; ++ bytes -= noop_size; ++ fix += noop_size; ++ } ++ ++ /* Use wide noops for the remainder */ ++ noop_size = 4; ++ } ++ + while (bytes >= noop_size) + { + memcpy (p, noop, noop_size); +@@ -17603,7 +18147,6 @@ arm_handle_align (fragS * fragP) + } + + fragP->fr_fix += fix; +- fragP->fr_var = noop_size; + } + + /* Called from md_do_align. Used to create an alignment +@@ -17615,9 +18158,15 @@ arm_frag_align_code (int n, int max) + char * p; + + /* We assume that there will never be a requirement +- to support alignments greater than 32 bytes. */ ++ to support alignments greater than [MAX_MEM_FOR_RS_ALIGN_CODE] bytes. */ + if (max > MAX_MEM_FOR_RS_ALIGN_CODE) +- as_fatal (_("alignments greater than 32 bytes not supported in .text sections.")); ++ { ++ char err_msg[128]; ++ sprintf (err_msg, ++ _("alignments greater than %d bytes not supported in .text sections."), ++ MAX_MEM_FOR_RS_ALIGN_CODE + 1); ++ as_fatal (err_msg); ++ } + + p = frag_var (rs_align_code, + MAX_MEM_FOR_RS_ALIGN_CODE, +@@ -17632,10 +18181,26 @@ arm_frag_align_code (int n, int max) + /* Perform target specific initialisation of a frag. */ + + void +-arm_init_frag (fragS * fragP) ++arm_init_frag (fragS * fragP, int max_chars) + { + /* Record whether this frag is in an ARM or a THUMB area. */ +- fragP->tc_frag_data = thumb_mode; ++ fragP->tc_frag_data.thumb_mode = thumb_mode; ++ ++ /* Record a mapping symbol for alignment frags. We will delete this ++ later if the alignment ends up empty. */ ++ switch (fragP->fr_type) ++ { ++ case rs_align: ++ case rs_align_test: ++ case rs_fill: ++ mapping_state_2 (MAP_DATA, max_chars); ++ break; ++ case rs_align_code: ++ mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars); ++ break; ++ default: ++ break; ++ } + } + + #ifdef OBJ_ELF +@@ -18127,9 +18692,13 @@ md_pcrel_from_section (fixS * fixP, segT + case BFD_RELOC_THUMB_PCREL_BRANCH20: + case BFD_RELOC_THUMB_PCREL_BRANCH23: + case BFD_RELOC_THUMB_PCREL_BRANCH25: +- case BFD_RELOC_THUMB_PCREL_BLX: + return base + 4; + ++ /* BLX is like branches above, but forces the low two bits of PC to ++ zero. */ ++ case BFD_RELOC_THUMB_PCREL_BLX: ++ return (base + 4) & ~3; ++ + /* ARM mode branches are offset by +8. However, the Windows CE + loader expects the relocation not to take this into account. */ + case BFD_RELOC_ARM_PCREL_BRANCH: +@@ -18499,6 +19068,15 @@ md_apply_fix (fixS * fixP, + break; + } + ++ if (fixP->fx_addsy ++ && S_GET_SEGMENT (fixP->fx_addsy) != seg) ++ { ++ as_bad_where (fixP->fx_file, fixP->fx_line, ++ _("symbol %s is in a different section"), ++ S_GET_NAME (fixP->fx_addsy)); ++ break; ++ } ++ + newimm = encode_arm_immediate (value); + temp = md_chars_to_number (buf, INSN_SIZE); + +@@ -18522,6 +19100,24 @@ md_apply_fix (fixS * fixP, + unsigned int highpart = 0; + unsigned int newinsn = 0xe1a00000; /* nop. */ + ++ if (fixP->fx_addsy ++ && ! S_IS_DEFINED (fixP->fx_addsy)) ++ { ++ as_bad_where (fixP->fx_file, fixP->fx_line, ++ _("undefined symbol %s used as an immediate value"), ++ S_GET_NAME (fixP->fx_addsy)); ++ break; ++ } ++ ++ if (fixP->fx_addsy ++ && S_GET_SEGMENT (fixP->fx_addsy) != seg) ++ { ++ as_bad_where (fixP->fx_file, fixP->fx_line, ++ _("symbol %s is in a different section"), ++ S_GET_NAME (fixP->fx_addsy)); ++ break; ++ } ++ + newimm = encode_arm_immediate (value); + temp = md_chars_to_number (buf, INSN_SIZE); + +@@ -19624,7 +20220,6 @@ tc_gen_reloc (asection *section, fixS *f + case BFD_RELOC_THUMB_PCREL_BRANCH20: + case BFD_RELOC_THUMB_PCREL_BRANCH23: + case BFD_RELOC_THUMB_PCREL_BRANCH25: +- case BFD_RELOC_THUMB_PCREL_BLX: + case BFD_RELOC_VTABLE_ENTRY: + case BFD_RELOC_VTABLE_INHERIT: + #ifdef TE_PE +@@ -19633,6 +20228,15 @@ tc_gen_reloc (asection *section, fixS *f + code = fixp->fx_r_type; + break; + ++ case BFD_RELOC_THUMB_PCREL_BLX: ++#ifdef OBJ_ELF ++ if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4) ++ code = BFD_RELOC_THUMB_PCREL_BRANCH23; ++ else ++#endif ++ code = BFD_RELOC_THUMB_PCREL_BLX; ++ break; ++ + case BFD_RELOC_ARM_LITERAL: + case BFD_RELOC_ARM_HWLITERAL: + /* If this is called then the a literal has +@@ -19992,6 +20596,73 @@ arm_cleanup (void) + } + } + ++#ifdef OBJ_ELF ++/* Remove any excess mapping symbols generated for alignment frags in ++ SEC. We may have created a mapping symbol before a zero byte ++ alignment; remove it if there's a mapping symbol after the ++ alignment. */ ++static void ++check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, ++ void *dummy ATTRIBUTE_UNUSED) ++{ ++ segment_info_type *seginfo = seg_info (sec); ++ fragS *fragp; ++ ++ if (seginfo == NULL || seginfo->frchainP == NULL) ++ return; ++ ++ for (fragp = seginfo->frchainP->frch_root; ++ fragp != NULL; ++ fragp = fragp->fr_next) ++ { ++ symbolS *sym = fragp->tc_frag_data.last_map; ++ fragS *next = fragp->fr_next; ++ ++ /* Variable-sized frags have been converted to fixed size by ++ this point. But if this was variable-sized to start with, ++ there will be a fixed-size frag after it. So don't handle ++ next == NULL. */ ++ if (sym == NULL || next == NULL) ++ continue; ++ ++ if (S_GET_VALUE (sym) < next->fr_address) ++ /* Not at the end of this frag. */ ++ continue; ++ know (S_GET_VALUE (sym) == next->fr_address); ++ ++ do ++ { ++ if (next->tc_frag_data.first_map != NULL) ++ { ++ /* Next frag starts with a mapping symbol. Discard this ++ one. */ ++ symbol_remove (sym, &symbol_rootP, &symbol_lastP); ++ break; ++ } ++ ++ if (next->fr_next == NULL) ++ { ++ /* This mapping symbol is at the end of the section. Discard ++ it. */ ++ know (next->fr_fix == 0 && next->fr_var == 0); ++ symbol_remove (sym, &symbol_rootP, &symbol_lastP); ++ break; ++ } ++ ++ /* As long as we have empty frags without any mapping symbols, ++ keep looking. */ ++ /* If the next frag is non-empty and does not start with a ++ mapping symbol, then this mapping symbol is required. */ ++ if (next->fr_address != next->fr_next->fr_address) ++ break; ++ ++ next = next->fr_next; ++ } ++ while (next != NULL); ++ } ++} ++#endif ++ + /* Adjust the symbol table. This marks Thumb symbols as distinct from + ARM ones. */ + +@@ -20066,6 +20737,9 @@ arm_adjust_symtab (void) + } + } + } ++ ++ /* Remove any overlapping mapping symbols generated by alignment frags. */ ++ bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0); + #endif + } + +@@ -20154,7 +20828,7 @@ md_begin (void) + } + else if (!mfpu_opt) + { +-#if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS)) ++#if !(defined (EABI_DEFAULT) || defined (TE_NetBSD) || defined (TE_VXWORKS)) + /* Some environments specify a default FPU. If they don't, infer it + from the processor. */ + if (mcpu_fpu_opt) +@@ -20414,6 +21088,8 @@ struct arm_option_table arm_opts[] = + {"mthumb", N_("assemble Thumb code"), &thumb_mode, 1, NULL}, + {"mthumb-interwork", N_("support ARM/Thumb interworking"), + &support_interwork, 1, NULL}, ++ {"mauto-it", N_("Enables/disables automatic IT insn insertion mode"), ++ &do_automatic_it, 1, NULL}, + {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL}, + {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL}, + {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float, +@@ -20660,6 +21336,7 @@ static const struct arm_cpu_option_table + NULL}, + {"cortex-r4", ARM_ARCH_V7R, FPU_NONE, NULL}, + {"cortex-m3", ARM_ARCH_V7M, FPU_NONE, NULL}, ++ {"cortex-m0", ARM_ARCH_V6M, FPU_NONE, NULL}, + {"cortex-m1", ARM_ARCH_V6M, FPU_NONE, NULL}, + /* ??? XSCALE is really an architecture. */ + {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL}, +@@ -20669,6 +21346,8 @@ static const struct arm_cpu_option_table + {"i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL}, + /* Maverick */ + {"ep9312", ARM_FEATURE(ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"}, ++ /* Marvell */ ++ {"marvell-f", ARM_ARCH_MARVELL_F, FPU_ARCH_VFP_V2, NULL}, + {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL} + }; + +@@ -20722,6 +21401,7 @@ static const struct arm_arch_option_tabl + {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP}, + {"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP}, + {"iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP}, ++ {"marvell-f", ARM_ARCH_MARVELL_F,FPU_ARCH_VFP}, + {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE} + }; + +--- a/gas/config/tc-arm.h ++++ b/gas/config/tc-arm.h +@@ -179,13 +179,27 @@ void arm_copy_symbol_attributes (symbolS + + #define TC_CONS_FIX_NEW cons_fix_new_arm + +-#define MAX_MEM_FOR_RS_ALIGN_CODE 31 ++#define MAX_MEM_ALIGNMENT_BYTES 6 ++#define MAX_MEM_FOR_RS_ALIGN_CODE ((1 << MAX_MEM_ALIGNMENT_BYTES) - 1) + + /* For frags in code sections we need to record whether they contain + ARM code or THUMB code. This is that if they have to be aligned, + they can contain the correct type of no-op instruction. */ +-#define TC_FRAG_TYPE int +-#define TC_FRAG_INIT(fragp) arm_init_frag (fragp) ++struct arm_frag_type ++{ ++ int thumb_mode; ++#ifdef OBJ_ELF ++ /* If there is a mapping symbol at offset 0 in this frag, ++ it will be saved in FIRST_MAP. If there are any mapping ++ symbols in this frag, the last one will be saved in ++ LAST_MAP. */ ++ symbolS *first_map, *last_map; ++#endif ++}; ++ ++#define TC_FRAG_TYPE struct arm_frag_type ++/* NOTE: max_chars is a local variable from frag_var / frag_variant. */ ++#define TC_FRAG_INIT(fragp) arm_init_frag (fragp, max_chars) + #define HANDLE_ALIGN(fragp) arm_handle_align (fragp) + + #define md_do_align(N, FILL, LEN, MAX, LABEL) \ +@@ -269,7 +283,7 @@ extern char * arm_canonicalize_symbol_na + extern void arm_adjust_symtab (void); + extern void armelf_frob_symbol (symbolS *, int *); + extern void cons_fix_new_arm (fragS *, int, int, expressionS *); +-extern void arm_init_frag (struct frag *); ++extern void arm_init_frag (struct frag *, int); + extern void arm_handle_align (struct frag *); + extern bfd_boolean arm_fix_adjustable (struct fix *); + extern int arm_elf_section_type (const char *, size_t); +--- a/gas/config/tc-m68k.c ++++ b/gas/config/tc-m68k.c +@@ -181,8 +181,8 @@ static const enum m68k_register mcf_ctrl + RAMBAR0, RAMBAR1, RAMBAR, MBAR, + 0 + }; +-static const enum m68k_register mcf51qe_ctrl[] = { +- VBR, ++static const enum m68k_register mcf51_ctrl[] = { ++ VBR, CPUCR, + 0 + }; + static const enum m68k_register mcf5206_ctrl[] = { +@@ -210,13 +210,21 @@ static const enum m68k_register mcf52223 + 0 + }; + static const enum m68k_register mcf52235_ctrl[] = { +- VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1, ++ VBR, FLASHBAR, RAMBAR, RAMBAR1, + 0 + }; + static const enum m68k_register mcf5225_ctrl[] = { + VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1, + 0 + }; ++static const enum m68k_register mcf52259_ctrl[] = { ++ VBR, FLASHBAR, RAMBAR, RAMBAR1, ++ 0 ++}; ++static const enum m68k_register mcf52277_ctrl[] = { ++ VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, ++ 0 ++}; + static const enum m68k_register mcf5235_ctrl[] = { + VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, + 0 +@@ -249,8 +257,12 @@ static const enum m68k_register mcf5282_ + VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1, + 0 + }; ++static const enum m68k_register mcf53017_ctrl[] = { ++ VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, ++ 0 ++}; + static const enum m68k_register mcf5307_ctrl[] = { +- CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR, ++ VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR_ALT, MBAR, + 0 + }; + static const enum m68k_register mcf5329_ctrl[] = { +@@ -525,6 +537,9 @@ static const struct m68k_cpu m68k_archs[ + {0,0,NULL, 0} + }; + ++/* For -mno-mac we want to turn off all types of mac. */ ++static const unsigned no_mac = mcfmac | mcfemac; ++ + /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0 + for either. */ + static const struct m68k_cpu m68k_extensions[] = +@@ -537,7 +552,7 @@ static const struct m68k_cpu m68k_extens + + {mcfhwdiv, NULL, "div", 1}, + {mcfusp, NULL, "usp", 1}, +- {mcfmac, NULL, "mac", 1}, ++ {mcfmac, (void *)&no_mac, "mac", 1}, + {mcfemac, NULL, "emac", 1}, + + {0,NULL,NULL, 0} +@@ -579,7 +594,12 @@ static const struct m68k_cpu m68k_cpus[] + {cpu32|m68881, cpu32_ctrl, "68349", 1}, + {cpu32|m68881, cpu32_ctrl, "68360", 1}, + +- {mcfisa_a|mcfisa_c|mcfusp, mcf51qe_ctrl, "51qe", 0}, ++ {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51", 0}, ++ {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51ac", 1}, ++ {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51cn", 1}, ++ {mcfisa_a|mcfisa_c|mcfusp|mcfmac, mcf51_ctrl, "51em", 1}, ++ {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51jm", 1}, ++ {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51qe", 1}, + + {mcfisa_a, mcf_ctrl, "5200", 0}, + {mcfisa_a, mcf_ctrl, "5202", 1}, +@@ -613,6 +633,9 @@ static const struct m68k_cpu m68k_cpus[] + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5224", -1}, + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5225", 0}, + ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52277_ctrl, "52274", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52277_ctrl, "52277", 0}, ++ + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5232", -1}, + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5233", -1}, + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5234", -1}, +@@ -622,7 +645,14 @@ static const struct m68k_cpu m68k_cpus[] + {mcfisa_a|mcfhwdiv|mcfemac, mcf5249_ctrl, "5249", 0}, + {mcfisa_a|mcfhwdiv|mcfemac, mcf5250_ctrl, "5250", 0}, + {mcfisa_a|mcfhwdiv|mcfemac, mcf5253_ctrl, "5253", 0}, +- ++ ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52252", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52254", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52255", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52256", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52258", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52259", 0}, ++ + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5270", -1}, + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5271", 0}, + +@@ -636,6 +666,14 @@ static const struct m68k_cpu m68k_cpus[] + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5282", -1}, + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "528x", 0}, + ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53011", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53012", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53013", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53014", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53015", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53016", -1}, ++ {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53017", 0}, ++ + {mcfisa_a|mcfhwdiv|mcfmac, mcf5307_ctrl, "5307", 0}, + + {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5327", -1}, +@@ -3275,6 +3313,7 @@ m68k_ip (char *instring) + tmpreg = 0x801; + break; + case CAAR: ++ case CPUCR: + tmpreg = 0x802; + break; + case MSP: +@@ -4036,6 +4075,7 @@ static const struct init_entry init_tabl + { "dfcr", DFC }, + { "cacr", CACR }, /* Cache Control Register. */ + { "caar", CAAR }, /* Cache Address Register. */ ++ { "cpucr", CPUCR }, /* CPU Control Register. */ + + { "usp", USP }, /* User Stack Pointer. */ + { "vbr", VBR }, /* Vector Base Register. */ +@@ -7407,7 +7447,8 @@ m68k_set_extension (char const *name, in + } + + if (negated) +- not_current_architecture |= ext->arch; ++ not_current_architecture |= (ext->control_regs ++ ? *(unsigned *)ext->control_regs: ext->arch); + else + current_architecture |= ext->arch; + return 1; +--- a/gas/config/tc-mips.c ++++ b/gas/config/tc-mips.c +@@ -73,6 +73,8 @@ static int mips_output_flavor (void) { r + + int mips_flag_mdebug = -1; + ++static int octeon_use_unalign = 0; ++ + /* Control generation of .pdr sections. Off by default on IRIX: the native + linker doesn't know about and discards them, but relocations against them + remain, leading to rld crashes. */ +@@ -391,6 +393,12 @@ static int mips_32bitmode = 0; + ((ISA) == ISA_MIPS32R2 \ + || (ISA) == ISA_MIPS64R2) + ++/* Return true if ISA supports ins instructions. */ ++#define ISA_HAS_INS(ISA) ( \ ++ (ISA) == ISA_MIPS32R2 \ ++ || (ISA) == ISA_MIPS64R2 \ ++ ) ++ + #define HAVE_32BIT_GPRS \ + (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa)) + +@@ -653,18 +661,21 @@ static int mips_debug = 0; + /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */ + #define MAX_VR4130_NOPS 4 + ++/* The number of MOVN.Ds needed to avoid the ICE9A errata. */ ++#define ICE9A_MOVNDS 5 ++ + /* The maximum number of NOPs needed to fill delay slots. */ + #define MAX_DELAY_NOPS 2 + +-/* The maximum number of NOPs needed for any purpose. */ +-#define MAX_NOPS 4 ++/* The maximum number of insns needed for any purpose. */ ++#define MAX_HIST_INSNS 5 + + /* A list of previous instructions, with index 0 being the most recent. +- We need to look back MAX_NOPS instructions when filling delay slots +- or working around processor errata. We need to look back one ++ We need to look back MAX_HIST_INSNS instructions when filling delay ++ slots or working around processor errata. We need to look back one + instruction further if we're thinking about using history[0] to + fill a branch delay slot. */ +-static struct mips_cl_insn history[1 + MAX_NOPS]; ++static struct mips_cl_insn history[1 + MAX_HIST_INSNS]; + + /* Nop instructions used by emit_nop. */ + static struct mips_cl_insn nop_insn, mips16_nop_insn; +@@ -760,6 +771,12 @@ static int mips_fix_vr4120; + /* ...likewise -mfix-vr4130. */ + static int mips_fix_vr4130; + ++/* ...likewise -mfix-ice9a. */ ++static int mips_fix_ice9a; ++ ++/* ...likewise -mfix-24k. */ ++static int mips_fix_24k; ++ + /* We don't relax branches by default, since this causes us to expand + `la .l2 - .l1' if there's a branch between .l1 and .l2, because we + fail to compute the offset before expanding the macro to the most +@@ -1789,6 +1806,84 @@ reg_lookup (char **s, unsigned int types + return reg >= 0; + } + ++#define INSN_ERET 0x42000018 ++#define INSN_DERET 0x4200001f ++ ++/* Implement the ERET/DERET Errata for MIPS 24k. ++ ++ If an ERET/DERET is encountered in a noreorder block, ++ warn if the ERET/DERET is followed by a branch instruction. ++ Also warn if the ERET/DERET is the last instruction in the ++ noreorder block. ++ ++ IF an ERET/DERET is in a reorder block and is followed by a ++ branch instruction, insert a nop. */ ++ ++static void ++check_for_24k_errata (struct mips_cl_insn *insn, int eret_ndx) ++{ ++ bfd_boolean next_insn_is_branch = FALSE; ++ ++ /* eret_ndx will be -1 for the last instruction in a section. */ ++ if (insn ++ && eret_ndx == -1 ++ && (insn->insn_opcode == INSN_ERET ++ || insn->insn_opcode == INSN_DERET) ++ && insn->noreorder_p) ++ { ++ as_warn (_("ERET and DERET must be followed by a NOP on the 24K.")); ++ return; ++ } ++ ++ if (history[eret_ndx].insn_opcode != INSN_ERET ++ && history[eret_ndx].insn_opcode != INSN_DERET) ++ return; ++ ++ if (!insn) ++ { ++ if (history[eret_ndx].noreorder_p) ++ as_warn (_("ERET and DERET must be followed by a NOP on the 24K.")); ++ return; ++ } ++ ++ next_insn_is_branch = ((insn->insn_opcode == INSN_ERET) ++ || (insn->insn_opcode == INSN_DERET) ++ || (insn->insn_mo->pinfo ++ & (INSN_UNCOND_BRANCH_DELAY ++ | INSN_COND_BRANCH_DELAY ++ | INSN_COND_BRANCH_LIKELY))); ++ ++ if (next_insn_is_branch && history[eret_ndx].noreorder_p) ++ { ++ as_warn (_("ERET and DERET must be followed by a NOP on the 24K.")); ++ return; ++ } ++ ++ /* Emit nop if the next instruction is a branch. */ ++ if (next_insn_is_branch) ++ { ++ long nop_where, br_where; ++ struct frag *nop_frag, *br_frag; ++ struct mips_cl_insn br_insn, nop_insn; ++ ++ emit_nop (); ++ ++ nop_insn = history[eret_ndx - 1]; ++ nop_frag = history[eret_ndx - 1].frag; ++ nop_where = history[eret_ndx - 1].where; ++ ++ br_insn = history[eret_ndx]; ++ br_frag = history[eret_ndx].frag; ++ br_where = history[eret_ndx].where; ++ ++ move_insn (&nop_insn, br_frag, br_where); ++ move_insn (&br_insn, nop_frag, nop_where); ++ ++ history[eret_ndx-1] = br_insn; ++ history[eret_ndx] = nop_insn; ++ } ++} ++ + /* Return TRUE if opcode MO is valid on the currently selected ISA and + architecture. If EXPANSIONP is TRUE then this check is done while + expanding a macro. Use is_opcode_valid_16 for MIPS16 opcodes. */ +@@ -1876,6 +1971,12 @@ md_begin (void) + as_bad (_("-G may not be used in position-independent code")); + g_switch_value = 0; + } ++ else if (mips_abicalls) ++ { ++ if (g_switch_seen && g_switch_value != 0) ++ as_bad (_("-G may not be used with abicalls")); ++ g_switch_value = 0; ++ } + + if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch)) + as_warn (_("Could not set architecture and machine")); +@@ -2074,6 +2175,9 @@ md_begin (void) + void + md_mips_end (void) + { ++ if (mips_fix_24k) ++ check_for_24k_errata ((struct mips_cl_insn *) &history[0], -1); ++ + if (! ECOFF_DEBUGGING) + md_obj_end (); + } +@@ -2616,8 +2720,111 @@ nops_for_vr4130 (const struct mips_cl_in + return 0; + } + ++/* Return true if the instruction called NAME is a double-precision ++ multiplication instruction placing an FP stall hazard needed ++ to be tackled with -mfix-ice9a. */ ++ ++static bfd_boolean ++ice9a_fp_stall_hazard_p (const char *name) ++{ ++ return (strcmp (name, "madd.d") == 0 ++ || strcmp (name, "msub.d") == 0 ++ || strcmp (name, "mul.d") == 0 ++ || strcmp (name, "nmadd.d") == 0 ++ || strcmp (name, "nmsub.d") == 0 ++ || strcmp (name, "recip.d") == 0 ++ || strcmp (name, "rsqrt.d") == 0); ++} ++ ++/* Return true if the instruction called NAME is a double-precision ++ multiplication instruction placing an FP round hazard needed ++ to be tackled with -mfix-ice9a. This happens to be a superset ++ of the above. */ ++ ++static bfd_boolean ++ice9a_fp_round_hazard_p (const char *name) ++{ ++ return (ice9a_fp_stall_hazard_p (name) || strcmp (name, "sqrt.d") == 0); ++} ++ ++/* Return true if the instruction INSN is the "movn.d $f30, , $zero" ++ designated as the workaround for the purpose of -mfix-ice9a. */ ++ ++static bfd_boolean ++ice9a_movnd_workaround_p (const struct mips_cl_insn *insn, unsigned int reg) ++{ ++ return (strcmp (insn->insn_mo->name, "movn.d") == 0 ++ && EXTRACT_OPERAND (RT, *insn) == ZERO ++ && EXTRACT_OPERAND (FS, *insn) == reg ++ && EXTRACT_OPERAND (FD, *insn) == 30); ++} ++ ++/* Return true if the instruction INSN accesses $f30 in any way. */ ++ ++static bfd_boolean ++ice9a_insn_accesses_f30_p (const struct mips_cl_insn *insn) ++{ ++ unsigned long pinfo; ++ ++ pinfo = insn->insn_mo->pinfo; ++ return (((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0 ++ && (EXTRACT_OPERAND (FS, *insn) == 30)) ++ || ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0 ++ && (EXTRACT_OPERAND (FT, *insn) == 30)) ++ || ((pinfo & INSN_WRITE_FPR_D) != 0 ++ && (EXTRACT_OPERAND (FD, *insn) == 30)) ++ || ((pinfo & INSN_READ_FPR_R) != 0 ++ && (EXTRACT_OPERAND (FR, *insn) == 30))); ++} ++ ++/* Check for the ICE9A_MOVNDS MOVN.D instructions needed before and after ++ some FP instructions to work around the ICE9A errata. Also check for ++ $f30 references other than the workaround. */ ++ ++static void ++check_for_ice9a (const struct mips_cl_insn *history, ++ const struct mips_cl_insn *insn) ++{ ++ bfd_boolean f30_access_ok = FALSE; ++ int i; ++ ++ if (ice9a_fp_round_hazard_p (history->insn_mo->name)) ++ { ++ if (insn == NULL ++ || (history->insn_mo->pinfo & INSN_WRITE_FPR_D) == 0 ++ || ! ice9a_movnd_workaround_p (insn, EXTRACT_OPERAND (FD, *history))) ++ as_bad (_("Hazardous instruction missing the ICE9A workaround")); ++ else ++ f30_access_ok = TRUE; ++ } ++ ++ if (insn == NULL) ++ return; ++ ++ if (ice9a_fp_stall_hazard_p (insn->insn_mo->name)) ++ for (i = 0; i < ICE9A_MOVNDS; i++) ++ if (! ice9a_movnd_workaround_p (history + i, 28)) ++ { ++ as_bad (_("Hazardous instruction missing the ICE9A workaround")); ++ break; ++ } ++ ++ if (! f30_access_ok ++ && ! ice9a_movnd_workaround_p (insn, 28) ++ && ice9a_insn_accesses_f30_p (insn)) ++ as_bad (_("Instruction used $f30, reserved for the ICE9A workaround")); ++} ++ ++/* Check the last instruction assembled for the ICE9A errata workaround. */ ++ ++void mips_cleanup (void) ++{ ++ if (mips_fix_ice9a) ++ check_for_ice9a (history, NULL); ++} ++ + /* Return the number of nops that would be needed if instruction INSN +- immediately followed the MAX_NOPS instructions given by HISTORY, ++ immediately followed the MAX_HIST_INSNS instructions given by HISTORY, + where HISTORY[0] is the most recent instruction. If INSN is null, + return the worse-case number of nops for any instruction. */ + +@@ -2643,6 +2850,9 @@ nops_for_insn (const struct mips_cl_insn + nops = tmp_nops; + } + ++ if (mips_fix_ice9a) ++ check_for_ice9a (history, insn); ++ + return nops; + } + +@@ -2654,13 +2864,13 @@ static int + nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...) + { + va_list args; +- struct mips_cl_insn buffer[MAX_NOPS]; ++ struct mips_cl_insn buffer[MAX_HIST_INSNS]; + struct mips_cl_insn *cursor; + int nops; + + va_start (args, history); + cursor = buffer + num_insns; +- memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor)); ++ memcpy (cursor, history, (MAX_HIST_INSNS - num_insns) * sizeof (*cursor)); + while (cursor > buffer) + *--cursor = *va_arg (args, const struct mips_cl_insn *); + +@@ -2705,6 +2915,7 @@ append_insn (struct mips_cl_insn *ip, ex + bfd_reloc_code_real_type *reloc_type) + { + unsigned long prev_pinfo, pinfo; ++ int hndx_24k = 0; + relax_stateT prev_insn_frag_type = 0; + bfd_boolean relaxed_branch = FALSE; + segment_info_type *si = seg_info (now_seg); +@@ -3238,7 +3449,15 @@ append_insn (struct mips_cl_insn *ip, ex + || (mips_opts.mips16 && history[0].fixp[0]) + /* If the previous instruction is a sync, sync.l, or + sync.p, we can not swap. */ +- || (prev_pinfo & INSN_SYNC)) ++ || (prev_pinfo & INSN_SYNC) ++ /* If we're assembling for the 24k errata and the previous ++ instruction is an ERET or DERET, avoid the swap. */ ++ || (history[0].insn_opcode == INSN_ERET) ++ || (history[0].insn_opcode == INSN_DERET) ++ /* FIXME: Disable MIPS16 branch swapping for now as it ++ breaks DWARF-2 line information irrecoverably. ++ --macro */ ++ || mips_opts.mips16) + { + if (mips_opts.mips16 + && (pinfo & INSN_UNCOND_BRANCH_DELAY) +@@ -3258,6 +3477,8 @@ append_insn (struct mips_cl_insn *ip, ex + slot, and bump the destination address. */ + insert_into_history (0, 1, ip); + emit_nop (); ++ if (mips_fix_24k) ++ hndx_24k++; + } + + if (mips_relax.sequence) +@@ -3297,7 +3518,14 @@ append_insn (struct mips_cl_insn *ip, ex + /* If that was an unconditional branch, forget the previous + insn information. */ + if (pinfo & INSN_UNCOND_BRANCH_DELAY) +- mips_no_prev_insn (); ++ { ++ /* Check for eret/deret before clearing history. */ ++ if (mips_fix_24k) ++ check_for_24k_errata ( ++ (struct mips_cl_insn *) &history[hndx_24k], ++ hndx_24k+1); ++ mips_no_prev_insn (); ++ } + } + else if (pinfo & INSN_COND_BRANCH_LIKELY) + { +@@ -3307,6 +3535,8 @@ append_insn (struct mips_cl_insn *ip, ex + the next instruction. */ + insert_into_history (0, 1, ip); + emit_nop (); ++ if (mips_fix_24k) ++ hndx_24k++; + } + else + insert_into_history (0, 1, ip); +@@ -3314,6 +3544,10 @@ append_insn (struct mips_cl_insn *ip, ex + else + insert_into_history (0, 1, ip); + ++ if (mips_fix_24k) ++ check_for_24k_errata ((struct mips_cl_insn *) &history[hndx_24k], ++ hndx_24k+1); ++ + /* We just output an insn, so the next one doesn't have a label. */ + mips_clear_insn_labels (); + } +@@ -3400,6 +3634,9 @@ start_noreorder (void) + static void + end_noreorder (void) + { ++ if (mips_fix_24k) ++ check_for_24k_errata (NULL, 0); ++ + mips_opts.noreorder--; + if (mips_opts.noreorder == 0 && prev_nop_frag != NULL) + { +@@ -7273,6 +7510,47 @@ macro (struct mips_cl_insn *ip) + macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg); + break; + ++ case M_SAA_AB: ++ s = "saa"; ++ goto saa_saad; ++ ++ case M_SAAD_AB: ++ s = "saad"; ++ ++ saa_saad: ++ /* The "saa/saad" instructions are new in CN58XX. These instructions ++ do not specify offset. When invoked with address or symbol, then ++ load the address or value of symbol in a register using the dla macro ++ into AT, and pass the register for emitting "saa/saad" instruction. ++ This will get expanded to ++ ++ dla AT, constant/label ++ saa/saad $treg,(AT) */ ++ { ++ char *name = "dla"; ++ char *fmt = "t,A(b)"; ++ const struct mips_opcode *mo; ++ struct mips_cl_insn insn; ++ ++ mo = hash_find (op_hash, name); ++ assert (strcmp (name, mo->name) == 0); ++ assert (strcmp (fmt, mo->args) == 0); ++ create_insn (&insn, mo); ++ ++ insn.insn_opcode = insn.insn_mo->match; ++ ++ used_at = 1; ++ INSERT_OPERAND (RT, insn, AT); ++ if (breg) ++ INSERT_OPERAND (RS, insn, breg); ++ ++ /* The address part is forwarded through the global offset_expr. */ ++ macro (&insn); ++ ++ macro_build (NULL, s, "t,(b)", treg, AT); ++ break; ++ } ++ + /* New code added to support COPZ instructions. + This code builds table entries out of the macros in mip_opcodes. + R4000 uses interlocks to handle coproc delays. +@@ -7980,8 +8258,13 @@ macro2 (struct mips_cl_insn *ip) + else + ++offset_expr.X_add_number; + macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg); +- macro_build (NULL, "sll", "d,w,<", AT, AT, 8); +- macro_build (NULL, "or", "d,v,t", treg, treg, AT); ++ if (ISA_HAS_INS (mips_opts.isa)) ++ macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31); ++ else ++ { ++ macro_build (NULL, "sll", "d,w,<", AT, AT, 8); ++ macro_build (NULL, "or", "d,v,t", treg, treg, AT); ++ } + break; + + case M_ULD: +@@ -8021,11 +8304,21 @@ macro2 (struct mips_cl_insn *ip) + break; + + case M_ULD_A: ++ if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign) ++ { ++ s = "uld"; ++ goto ld; ++ } + s = "ldl"; + s2 = "ldr"; + off = 7; + goto ulwa; + case M_ULW_A: ++ if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign) ++ { ++ s = "ulw"; ++ goto ld; ++ } + s = "lwl"; + s2 = "lwr"; + off = 3; +@@ -8052,17 +8345,25 @@ macro2 (struct mips_cl_insn *ip) + load_address (AT, &offset_expr, &used_at); + if (breg != 0) + macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg); +- if (target_big_endian) +- expr1.X_add_number = 0; +- macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", +- treg, BFD_RELOC_LO16, AT); +- if (target_big_endian) +- expr1.X_add_number = 1; ++ if (ISA_HAS_INS (mips_opts.isa)) ++ { ++ expr1.X_add_number = target_big_endian ? 1 : 0; ++ macro_build (&expr1, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, AT); ++ expr1.X_add_number = target_big_endian ? 0 : 1; ++ macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", ++ AT, BFD_RELOC_LO16, AT); ++ macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31); ++ } + else +- expr1.X_add_number = 0; +- macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT); +- macro_build (NULL, "sll", "d,w,<", treg, treg, 8); +- macro_build (NULL, "or", "d,v,t", treg, treg, AT); ++ { ++ expr1.X_add_number = target_big_endian ? 0 : 1; ++ macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", ++ treg, BFD_RELOC_LO16, AT); ++ expr1.X_add_number = target_big_endian ? 1 : 0; ++ macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT); ++ macro_build (NULL, "sll", "d,w,<", treg, treg, 8); ++ macro_build (NULL, "or", "d,v,t", treg, treg, AT); ++ } + break; + + case M_USH: +@@ -8103,11 +8404,21 @@ macro2 (struct mips_cl_insn *ip) + break; + + case M_USD_A: ++ if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign) ++ { ++ s = "usd"; ++ goto st; ++ } + s = "sdl"; + s2 = "sdr"; + off = 7; + goto uswa; + case M_USW_A: ++ if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign) ++ { ++ s = "usw"; ++ goto st; ++ } + s = "swl"; + s2 = "swr"; + off = 3; +@@ -8674,6 +8985,36 @@ mips_ip (char *str, struct mips_cl_insn + assert (strcmp (insn->name, str) == 0); + + ok = is_opcode_valid (insn, FALSE); ++ ++ if (insn->pinfo != INSN_MACRO) ++ { ++ if (mips_opts.arch == CPU_OCTEON ++ && !octeon_use_unalign ++ && (strcmp (insn->name, "ulw") == 0 ++ || strcmp (insn->name, "uld") == 0 ++ || strcmp (insn->name, "usw") == 0 ++ || strcmp (insn->name, "usd") == 0)) ++ ok = FALSE; ++ ++ if (mips_opts.arch == CPU_OCTEON ++ && octeon_use_unalign ++ && (strcmp (insn->name, "lwl") == 0 ++ || strcmp (insn->name, "lwr") == 0 ++ || strcmp (insn->name, "ldl") == 0 ++ || strcmp (insn->name, "ldr") == 0 ++ || strcmp (insn->name, "sdl") == 0 ++ || strcmp (insn->name, "sdr") == 0 ++ || strcmp (insn->name, "swr") == 0 ++ || strcmp (insn->name, "swl") == 0)) ++ { ++ static char buf[100]; ++ sprintf (buf, _("Unaligned load/store instructions are not " ++ "allowed with -mocteon-useun")); ++ insn_error = buf; ++ return; ++ } ++ } ++ + if (! ok) + { + if (insn + 1 < &mips_opcodes[NUMOPCODES] +@@ -11165,6 +11506,8 @@ enum options + OPTION_NO_SMARTMIPS, + OPTION_DSPR2, + OPTION_NO_DSPR2, ++ OPTION_MIPS16E, ++ OPTION_NO_MIPS16E, + OPTION_COMPAT_ARCH_BASE, + OPTION_M4650, + OPTION_NO_M4650, +@@ -11175,11 +11518,15 @@ enum options + OPTION_M3900, + OPTION_NO_M3900, + OPTION_M7000_HILO_FIX, +- OPTION_MNO_7000_HILO_FIX, ++ OPTION_MNO_7000_HILO_FIX, ++ OPTION_FIX_24K, ++ OPTION_NO_FIX_24K, + OPTION_FIX_VR4120, + OPTION_NO_FIX_VR4120, + OPTION_FIX_VR4130, + OPTION_NO_FIX_VR4130, ++ OPTION_FIX_ICE9A, ++ OPTION_NO_FIX_ICE9A, + OPTION_TRAP, + OPTION_BREAK, + OPTION_EB, +@@ -11200,6 +11547,8 @@ enum options + OPTION_HARD_FLOAT, + OPTION_SINGLE_FLOAT, + OPTION_DOUBLE_FLOAT, ++ OPTION_OCTEON_UNALIGNED, ++ OPTION_NO_OCTEON_UNALIGNED, + OPTION_32, + #ifdef OBJ_ELF + OPTION_CALL_SHARED, +@@ -11214,6 +11563,7 @@ enum options + OPTION_PDR, + OPTION_NO_PDR, + OPTION_MVXWORKS_PIC, ++ OPTION_NON_PIC_ABICALLS, + #endif /* OBJ_ELF */ + OPTION_END_OF_ENUM + }; +@@ -11249,6 +11599,9 @@ struct option md_longopts[] = + {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS}, + {"mdspr2", no_argument, NULL, OPTION_DSPR2}, + {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2}, ++ /* SDE backward compatibility alias. */ ++ {"mips16e", no_argument, NULL, OPTION_MIPS16}, ++ {"no-mips16e", no_argument, NULL, OPTION_NO_MIPS16}, + + /* Old-style architecture options. Don't add more of these. */ + {"m4650", no_argument, NULL, OPTION_M4650}, +@@ -11268,6 +11621,10 @@ struct option md_longopts[] = + {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120}, + {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130}, + {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130}, ++ {"mfix-ice9a", no_argument, NULL, OPTION_FIX_ICE9A}, ++ {"mno-fix-ice9a", no_argument, NULL, OPTION_NO_FIX_ICE9A}, ++ {"mfix-24k", no_argument, NULL, OPTION_FIX_24K}, ++ {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K}, + + /* Miscellaneous options. */ + {"trap", no_argument, NULL, OPTION_TRAP}, +@@ -11292,6 +11649,8 @@ struct option md_longopts[] = + {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT}, + {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT}, + {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT}, ++ {"mocteon-useun", no_argument, NULL, OPTION_OCTEON_UNALIGNED}, ++ {"mno-octeon-useun", no_argument, NULL, OPTION_NO_OCTEON_UNALIGNED}, + + /* Strictly speaking this next option is ELF specific, + but we allow it for other ports as well in order to +@@ -11313,6 +11672,7 @@ struct option md_longopts[] = + {"mpdr", no_argument, NULL, OPTION_PDR}, + {"mno-pdr", no_argument, NULL, OPTION_NO_PDR}, + {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC}, ++ {"mnon-pic-abicalls", no_argument, NULL, OPTION_NON_PIC_ABICALLS}, + #endif /* OBJ_ELF */ + + {NULL, no_argument, NULL, 0} +@@ -11521,6 +11881,14 @@ md_parse_option (int c, char *arg) + mips_opts.ase_smartmips = 0; + break; + ++ case OPTION_FIX_24K: ++ mips_fix_24k = 1; ++ break; ++ ++ case OPTION_NO_FIX_24K: ++ mips_fix_24k = 0; ++ break; ++ + case OPTION_FIX_VR4120: + mips_fix_vr4120 = 1; + break; +@@ -11537,6 +11905,14 @@ md_parse_option (int c, char *arg) + mips_fix_vr4130 = 0; + break; + ++ case OPTION_FIX_ICE9A: ++ mips_fix_ice9a = 1; ++ break; ++ ++ case OPTION_NO_FIX_ICE9A: ++ mips_fix_ice9a = 0; ++ break; ++ + case OPTION_RELAX_BRANCH: + mips_relax_branch = 1; + break; +@@ -11561,6 +11937,14 @@ md_parse_option (int c, char *arg) + mips_opts.sym32 = FALSE; + break; + ++ case OPTION_OCTEON_UNALIGNED: ++ octeon_use_unalign = 1; ++ break; ++ ++ case OPTION_NO_OCTEON_UNALIGNED: ++ octeon_use_unalign = 0; ++ break; ++ + #ifdef OBJ_ELF + /* When generating ELF code, we permit -KPIC and -call_shared to + select SVR4_PIC, and -non_shared to select no PIC. This is +@@ -11729,6 +12113,11 @@ md_parse_option (int c, char *arg) + case OPTION_MVXWORKS_PIC: + mips_pic = VXWORKS_PIC; + break; ++ ++ case OPTION_NON_PIC_ABICALLS: ++ mips_pic = NO_PIC; ++ mips_abicalls = TRUE; ++ break; + #endif /* OBJ_ELF */ + + default: +@@ -12468,6 +12857,10 @@ s_change_sec (int sec) + #endif + + mips_emit_delays (); ++ ++ if (mips_fix_24k) ++ check_for_24k_errata ((struct mips_cl_insn *) &history[0], -1); ++ + switch (sec) + { + case 't': +@@ -12526,6 +12919,9 @@ s_change_section (int ignore ATTRIBUTE_U + if (!IS_ELF) + return; + ++ if (mips_fix_24k) ++ check_for_24k_errata ((struct mips_cl_insn *) &history[0], -1); ++ + section_name = input_line_pointer; + c = get_symbol_end (); + if (c) +@@ -15234,7 +15630,10 @@ static const struct mips_cpu_info mips_c + { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON }, + + /* RMI Xlr */ +- { "xlr", 0, ISA_MIPS64, CPU_XLR }, ++ { "xlr", 0, ISA_MIPS64, CPU_XLR }, ++ ++ /* SiCortex ice9 */ ++ { "ice9", 0, ISA_MIPS64, CPU_MIPS64 }, + + /* End marker */ + { NULL, 0, 0, 0 } +@@ -15457,13 +15856,17 @@ MIPS options:\n\ + fprintf (stream, _("\ + -mfix-vr4120 work around certain VR4120 errata\n\ + -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\ ++-mfix-ice9a detect the lack of the ICE9A double float multiplication errata workaround\n\ ++-mfix-24k insert a nop after ERET and DERET instructions\n\ + -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\ + -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\ + -msym32 assume all symbols have 32-bit values\n\ + -O0 remove unneeded NOPs, do not swap branches\n\ + -O remove unneeded NOPs and swap branches\n\ + --trap, --no-break trap exception on div by 0 and mult overflow\n\ +---break, --no-trap break exception on div by 0 and mult overflow\n")); ++--break, --no-trap break exception on div by 0 and mult overflow\n\ ++-mocteon-useun use Octeon-specific unaligned loads/stores for 32/64-bit data (default)\n\ ++-mno-octeon-useun do not use Octeon-specific unaligned loads/stores for 32/64-bit data\n")); + fprintf (stream, _("\ + -mhard-float allow floating-point instructions\n\ + -msoft-float do not allow floating-point instructions\n\ +--- a/gas/config/tc-mips.h ++++ b/gas/config/tc-mips.h +@@ -53,6 +53,9 @@ extern int mips_relax_frag (asection *, + #define md_undefined_symbol(name) (0) + #define md_operand(x) + ++extern void mips_cleanup (void); ++#define md_cleanup() mips_cleanup () ++ + extern char mips_nop_opcode (void); + #define NOP_OPCODE (mips_nop_opcode ()) + +--- a/gas/config/tc-ppc.c ++++ b/gas/config/tc-ppc.c +@@ -905,6 +905,10 @@ parse_cpu (const char *arg) + } + /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC + 620. */ ++ else if (strcmp (arg, "pmr") == 0) ++ { ++ ppc_cpu |= PPC_OPCODE_PMR; ++ } + else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0) + { + ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64; +--- a/gas/config/te-armeabi.h ++++ b/gas/config/te-armeabi.h +@@ -18,7 +18,7 @@ + 02110-1301, USA. */ + + /* The EABI requires the use of VFP. */ +-#define FPU_DEFAULT FPU_ARCH_VFP_V2 ++#define FPU_DEFAULT FPU_ARCH_VFP + #define EABI_DEFAULT EF_ARM_EABI_VER5 + + #define LOCAL_LABELS_DOLLAR 1 +--- a/gas/config/te-armlinuxeabi.h ++++ b/gas/config/te-armlinuxeabi.h +@@ -20,5 +20,5 @@ + #include "te-linux.h" + + /* The EABI requires the use of VFP. */ +-#define FPU_DEFAULT FPU_ARCH_VFP_V2 ++#define FPU_DEFAULT FPU_ARCH_VFP + #define EABI_DEFAULT EF_ARM_EABI_VER5 +--- a/gas/configure ++++ b/gas/configure +@@ -12167,6 +12167,9 @@ echo "$as_me: error: $target_cpu isn't a + esac + # Decide which ABI to target by default. + case ${target} in ++ mips64el-sicortex-linux-gnu) ++ mips_default_abi=N64_ABI ++ ;; + mips64*-linux* | mips-sgi-irix6*) + mips_default_abi=N32_ABI + ;; +--- a/gas/configure.in ++++ b/gas/configure.in +@@ -245,6 +245,9 @@ changequote([,])dnl + esac + # Decide which ABI to target by default. + case ${target} in ++ mips64el-sicortex-linux-gnu) ++ mips_default_abi=N64_ABI ++ ;; + mips64*-linux* | mips-sgi-irix6*) + mips_default_abi=N32_ABI + ;; +--- a/gas/configure.tgt ++++ b/gas/configure.tgt +@@ -287,6 +287,8 @@ case ${generic_target} in + mips-*-riscos*) fmt=ecoff ;; + mips*-*-linux*) fmt=elf em=tmips ;; + mips-*-sysv4*MP* | mips-*-gnu*) fmt=elf em=tmips ;; ++ mips-wrs-elf*) fmt=elf em=tmips ;; ++ mips-montavista-elf*) fmt=elf em=tmips ;; + mips*-sde-elf*) fmt=elf em=tmips ;; + mips-*-sysv*) fmt=ecoff ;; + mips-*-elf* | mips-*-rtems*) fmt=elf ;; +--- a/gas/doc/as.texinfo ++++ b/gas/doc/as.texinfo +@@ -375,6 +375,7 @@ gcc(1), ld(1), and the Info entries for + [@b{-construct-floats}] [@b{-no-construct-floats}] + [@b{-trap}] [@b{-no-break}] [@b{-break}] [@b{-no-trap}] + [@b{-mfix7000}] [@b{-mno-fix7000}] ++ [@b{-mfix-ice9a}] [@b{-mno-fix-ice9a}] + [@b{-mips16}] [@b{-no-mips16}] + [@b{-msmartmips}] [@b{-mno-smartmips}] + [@b{-mips3d}] [@b{-no-mips3d}] +--- a/gas/doc/c-arm.texi ++++ b/gas/doc/c-arm.texi +@@ -116,6 +116,8 @@ recognized: + @code{cortex-a9}, + @code{cortex-r4}, + @code{cortex-m3}, ++@code{cortex-m1}, ++@code{cortex-m0}, + @code{ep9312} (ARM920 with Cirrus Maverick coprocessor), + @code{i80200} (Intel XScale processor) + @code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor) +@@ -194,6 +196,7 @@ The following format options are recogni + @code{vfp}, + @code{vfp10}, + @code{vfp10-r0}, ++@code{vfp3} + @code{vfp9}, + @code{vfpxd}, + @code{vfpv2} +@@ -225,6 +228,12 @@ instructions; that is, it should behave + This option specifies that the output generated by the assembler should + be marked as supporting interworking. + ++@cindex @code{-mauto-it} command line option, ARM ++@item -mauto-it ++This option enables the automatic generation of IT instructions for Thumb-2 ++conditional instructions. Explicit IT instructons are still accepted and ++checked. This option has no effect on ARM mode code. ++ + @cindex @code{-mapcs} command line option, ARM + @item -mapcs @code{[26|32]} + This option specifies that the output generated by the assembler should +--- a/gas/doc/c-mips.texi ++++ b/gas/doc/c-mips.texi +@@ -182,6 +182,16 @@ all problems in hand-written assembler c + @itemx -no-mfix-vr4130 + Insert nops to work around the VR4130 @samp{mflo}/@samp{mfhi} errata. + ++@item -mfix-ice9a ++@itemx -mno-fix-ice9a ++Detect missing @code{movn.d $f30, , $zero} instructions required for ++the ICE9A double floating-point multiplication errata and invalid @code{$f30} ++references conflicting with same. Raise an error if so. ++ ++@item -mfix-24k ++@itemx -no-mfix-24k ++Insert nops to work around the 24K @samp{eret}/@samp{deret} errata. ++ + @item -m4010 + @itemx -no-m4010 + Generate code for the LSI @sc{r4010} chip. This tells the assembler to +--- a/gas/read.c ++++ b/gas/read.c +@@ -1920,6 +1920,10 @@ s_fill (int ignore ATTRIBUTE_UNUSED) + md_flush_pending_output (); + #endif + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + get_known_segmented_expression (&rep_exp); + if (*input_line_pointer == ',') + { +@@ -3119,6 +3123,10 @@ s_space (int mult) + md_flush_pending_output (); + #endif + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + if (flag_mri) + stop = mri_comment_field (&stopc); + +@@ -3290,6 +3298,10 @@ s_float_space (int float_type) + char *stop = NULL; + char stopc = 0; + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + if (flag_mri) + stop = mri_comment_field (&stopc); + +@@ -3792,7 +3804,15 @@ cons_worker (register int nbytes, /* 1=. + parse_mri_cons (&exp, (unsigned int) nbytes); + else + #endif +- TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes); ++ { ++ if (*input_line_pointer == '"') ++ { ++ as_bad (_("unexpected \" in expression")); ++ ignore_rest_of_line (); ++ return; ++ } ++ TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes); ++ } + + if (rva) + { +@@ -4631,6 +4651,10 @@ float_cons (/* Clobbers input_line-point + md_flush_pending_output (); + #endif + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + do + { + /* input_line_pointer->1st char of a flonum (we hope!). */ +@@ -5075,6 +5099,10 @@ stringer (int bits_appendzero) + md_flush_pending_output (); + #endif + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + /* The following awkward logic is to parse ZERO or more strings, + comma separated. Recall a string expression includes spaces + before the opening '\"' and spaces after the closing '\"'. +@@ -5453,6 +5481,10 @@ s_incbin (int x ATTRIBUTE_UNUSED) + md_flush_pending_output (); + #endif + ++#ifdef md_cons_align ++ md_cons_align (1); ++#endif ++ + SKIP_WHITESPACE (); + filename = demand_copy_string (& len); + if (filename == NULL) +--- a/gprof/cg_print.c ++++ b/gprof/cg_print.c +@@ -58,6 +58,10 @@ extern void fsf_callg_blurb (FILE * fp); + + double print_time = 0.0; + ++static double child_max; ++static int self_wid; ++static int child_wid; ++static int prec; + + static void + print_header () +@@ -79,8 +83,8 @@ print_header () + (long) hist_scale * (long) sizeof (UNIT)); + + if (print_time > 0.0) +- printf (_(" for %.2f%% of %.2f seconds\n\n"), +- 100.0 / print_time, print_time / hz); ++ printf (_(" for %.2f%% of %.2f %s\n\n"), ++ 100.0 / print_time, print_time / hz, hist_dimension); + else + { + printf (_(" no time propagated\n\n")); +@@ -100,10 +104,10 @@ print_header () + "", "", "", "", _("called"), _("total"), _("children")); + printf ("\n"); + } ++ else if (child_max / hz >= 100000.0) ++ printf (_("index %% time self children called name\n")); + else +- { +- printf (_("index %% time self children called name\n")); +- } ++ printf (_("index %% time self children called name\n")); + } + + /* Print a cycle header. */ +@@ -114,12 +118,11 @@ print_cycle (Sym *cyc) + char buf[BUFSIZ]; + + sprintf (buf, "[%d]", cyc->cg.index); +- printf (bsd_style_output +- ? "%-6.6s %5.1f %7.2f %11.2f %7lu" +- : "%-6.6s %5.1f %7.2f %7.2f %7lu", buf, ++ printf ("%-6.6s %5.1f %*.*f %*.*f %7lu", buf, + 100 * (cyc->cg.prop.self + cyc->cg.prop.child) / print_time, +- cyc->cg.prop.self / hz, cyc->cg.prop.child / hz, cyc->ncalls); +- ++ self_wid, prec, cyc->cg.prop.self / hz, ++ child_wid, prec, cyc->cg.prop.child / hz, ++ cyc->ncalls); + if (cyc->cg.self_calls != 0) + printf ("+%-7lu", cyc->cg.self_calls); + else +@@ -192,10 +195,10 @@ print_members (Sym *cyc) + + for (member = cyc->cg.cyc.next; member; member = member->cg.cyc.next) + { +- printf (bsd_style_output +- ? "%6.6s %5.5s %7.2f %11.2f %7lu" +- : "%6.6s %5.5s %7.2f %7.2f %7lu", +- "", "", member->cg.prop.self / hz, member->cg.prop.child / hz, ++ printf ("%6.6s %5.5s %*.*f %*.*f %7lu", ++ "", "", ++ self_wid, prec, member->cg.prop.self / hz, ++ child_wid, prec, member->cg.prop.child / hz, + member->ncalls); + + if (member->cg.self_calls != 0) +@@ -350,10 +353,11 @@ print_parents (Sym *child) + + if (!child->cg.parents) + { +- printf (bsd_style_output +- ? _("%6.6s %5.5s %7.7s %11.11s %7.7s %7.7s \n") +- : _("%6.6s %5.5s %7.7s %7.7s %7.7s %7.7s \n"), +- "", "", "", "", "", ""); ++ printf (_("%6.6s %5.5s %*.*s %*.*s %7.7s %7.7s \n"), ++ "", "", ++ self_wid, self_wid, "", ++ child_wid, child_wid, "", ++ "", ""); + return; + } + +@@ -365,23 +369,22 @@ print_parents (Sym *child) + if (child == parent || (child->cg.cyc.num != 0 + && parent->cg.cyc.num == child->cg.cyc.num)) + { +- /* Selfcall or call among siblings. */ +- printf (bsd_style_output +- ? "%6.6s %5.5s %7.7s %11.11s %7lu %7.7s " +- : "%6.6s %5.5s %7.7s %7.7s %7lu %7.7s ", +- "", "", "", "", ++ /* Selfcall or call among siblings. */ ++ printf ("%6.6s %5.5s %*.*s %*.*s %7lu %7.7s ", ++ "", "", ++ self_wid, self_wid, "", ++ child_wid, child_wid, "", + arc->count, ""); + print_name (parent); + printf ("\n"); + } + else + { +- /* Regular parent of child. */ +- printf (bsd_style_output +- ? "%6.6s %5.5s %7.2f %11.2f %7lu/%-7lu " +- : "%6.6s %5.5s %7.2f %7.2f %7lu/%-7lu ", ++ /* Regular parent of child. */ ++ printf ("%6.6s %5.5s %*.*f %*.*f %7lu/%-7lu ", + "", "", +- arc->time / hz, arc->child_time / hz, ++ self_wid, prec, arc->time / hz, ++ child_wid, prec, arc->child_time / hz, + arc->count, cycle_head->ncalls); + print_name (parent); + printf ("\n"); +@@ -438,22 +441,22 @@ print_children (Sym *parent) + if (child == parent || (child->cg.cyc.num != 0 + && child->cg.cyc.num == parent->cg.cyc.num)) + { +- /* Self call or call to sibling. */ +- printf (bsd_style_output +- ? "%6.6s %5.5s %7.7s %11.11s %7lu %7.7s " +- : "%6.6s %5.5s %7.7s %7.7s %7lu %7.7s ", +- "", "", "", "", arc->count, ""); ++ /* Self call or call to sibling. */ ++ printf ("%6.6s %5.5s %*.*s %*.*s %7lu %7.7s ", ++ "", "", ++ self_wid, self_wid, "", ++ child_wid, child_wid, "", ++ arc->count, ""); + print_name (child); + printf ("\n"); + } + else + { +- /* Regular child of parent. */ +- printf (bsd_style_output +- ? "%6.6s %5.5s %7.2f %11.2f %7lu/%-7lu " +- : "%6.6s %5.5s %7.2f %7.2f %7lu/%-7lu ", ++ /* Regular child of parent. */ ++ printf ("%6.6s %5.5s %*.*f %*.*f %7lu/%-7lu ", + "", "", +- arc->time / hz, arc->child_time / hz, ++ self_wid, prec, arc->time / hz, ++ child_wid, prec, arc->child_time / hz, + arc->count, child->cg.cyc.head->ncalls); + print_name (child); + printf ("\n"); +@@ -468,25 +471,21 @@ print_line (Sym *np) + char buf[BUFSIZ]; + + sprintf (buf, "[%d]", np->cg.index); +- printf (bsd_style_output +- ? "%-6.6s %5.1f %7.2f %11.2f" +- : "%-6.6s %5.1f %7.2f %7.2f", buf, ++ printf ("%-6.6s %5.1f %*.*f %*.*f", buf, + 100 * (np->cg.prop.self + np->cg.prop.child) / print_time, +- np->cg.prop.self / hz, np->cg.prop.child / hz); +- ++ self_wid, prec, np->cg.prop.self / hz, ++ child_wid, prec, np->cg.prop.child / hz); + if ((np->ncalls + np->cg.self_calls) != 0) + { + printf (" %7lu", np->ncalls); + + if (np->cg.self_calls != 0) +- printf ("+%-7lu ", np->cg.self_calls); ++ printf ("+%-7lu ", np->cg.self_calls); + else +- printf (" %7.7s ", ""); ++ printf (" %7.7s ", ""); + } + else +- { +- printf (" %7.7s %7.7s ", "", ""); +- } ++ printf (" %7.7s %7.7s ", "", ""); + + print_name (np); + printf ("\n"); +@@ -504,6 +503,20 @@ cg_print (Sym ** timesortsym) + if (print_descriptions && bsd_style_output) + bsd_callg_blurb (stdout); + ++ child_max = 0.0; ++ for (index = 0; index < symtab.len; index++) ++ { ++ Sym *sym = &symtab.base[index]; ++ if (sym->cg.prop.child > child_max) ++ child_max = sym->cg.prop.child; ++ } ++ if (bsd_style_output) ++ self_wid = 7, child_wid = 11, prec = 2; ++ else if (child_max / hz >= 100000.0) ++ self_wid = 10, child_wid = 10, prec = 0; ++ else ++ self_wid = 7, child_wid = 7, prec = 2; ++ + print_header (); + + for (index = 0; index < symtab.len + num_cycles; ++index) +--- a/gprof/corefile.c ++++ b/gprof/corefile.c +@@ -29,6 +29,11 @@ + #include "corefile.h" + #include "safe-ctype.h" + ++/* FIXME: These are needed to figure out if this is a mips16 symbol or ++ not. It would be better to think of a cleaner way to do this. */ ++#include "elf-bfd.h" ++#include "elf/mips.h" ++ + bfd *core_bfd; + static int core_num_syms; + static asymbol **core_syms; +@@ -233,6 +238,10 @@ core_init (const char *aout_name) + min_insn_size = 4; + break; + ++ case bfd_arch_mips: ++ min_insn_size = 2; ++ break; ++ + default: + break; + } +@@ -528,6 +537,17 @@ core_create_function_syms () + if (sym_sec) + symtab.limit->addr += bfd_get_section_vma (sym_sec->owner, sym_sec); + ++ /* Flag mips16 symbols by making them odd (we don't have a ++ handle on the original bfd symbol after this point). */ ++ if (bfd_get_arch (core_bfd) == bfd_arch_mips ++ && bfd_get_flavour (core_bfd) == bfd_target_elf_flavour) ++ { ++ elf_symbol_type *es = elf_symbol_from (core_bfd, core_syms[i]); ++ ++ if (es && es->internal_elf_sym.st_other == STO_MIPS16) ++ symtab.limit->addr |= 1; ++ } ++ + if (symbol_map_count + && !strcmp (core_syms[i]->name, symbol_map[found].function_name)) + { +--- a/gprof/gmon_io.c ++++ b/gprof/gmon_io.c +@@ -430,8 +430,8 @@ gmon_out_read (const char *filename) + goto bad_gmon_file; + + if (!histograms) +- hz = profrate; +- else if (hz != (int) profrate) ++ hz_int = profrate; ++ else if (hz_int != (int) profrate) + { + fprintf (stderr, + _("%s: profiling rate incompatible with first gmon file\n"), +@@ -553,15 +553,15 @@ gmon_out_read (const char *filename) + + fclose (ifp); + +- if (hz == HZ_WRONG) ++ if (hz_int == HZ_WRONG) + { +- /* How many ticks per second? If we can't tell, report +- time in ticks. */ +- hz = hertz (); +- +- if (hz == HZ_WRONG) ++ /* ++ How many ticks per second? If we can't tell, report ++ time in ticks. */ ++ hz_int = hertz (); ++ if (hz_int == HZ_WRONG) + { +- hz = 1; ++ hz_int = 1; + fprintf (stderr, _("time is in ticks, not seconds\n")); + } + } +@@ -573,6 +573,15 @@ gmon_out_read (const char *filename) + done (1); + } + ++#ifdef HERTZ_FLOAT ++ if (hz_int < 0) ++ hz = 1.0 / -hz_int; ++ else ++ hz = hz_int; ++#else ++ hz = hz_int; ++#endif ++ + if (output_style & STYLE_GMON_INFO) + { + printf (_("File `%s' (version %d) contains:\n"), +@@ -645,7 +654,7 @@ gmon_out_write (const char *filename) + header if explicitly specified, or if the profiling rate is + non-standard. Otherwise, use the old BSD format. */ + if (file_format == FF_BSD44 +- || hz != hertz()) ++ || hz_int != hertz ()) + { + padsize = 3*4; + switch (gmon_get_ptr_size ()) +@@ -692,10 +701,10 @@ gmon_out_write (const char *filename) + + /* Write out the 4.4BSD header bits, if that's what we're using. */ + if (file_format == FF_BSD44 +- || hz != hertz()) ++ || hz_int != hertz()) + { + if (gmon_io_write_32 (ofp, GMONVERSION) +- || gmon_io_write_32 (ofp, (unsigned int) hz)) ++ || gmon_io_write_32 (ofp, (unsigned int) hz_int)) + { + perror (filename); + done (1); +--- a/gprof/gprof.c ++++ b/gprof/gprof.c +@@ -50,7 +50,12 @@ static void usage (FILE *, int) ATTRIBUT + const char *whoami; + const char *function_mapping_file; + const char *a_out_name = A_OUTNAME; +-long hz = HZ_WRONG; ++#ifdef HERTZ_FLOAT ++double hz; ++#else ++long hz; ++#endif ++long hz_int = HZ_WRONG; + + /* + * Default options values: +--- a/gprof/gprof.h ++++ b/gprof/gprof.h +@@ -29,6 +29,10 @@ + #ifndef gprof_h + #define gprof_h + ++#include "gconfig.h" ++ ++#undef PACKAGE ++ + /* Include the BFD sysdep.h file. */ + #include "sysdep.h" + #include "bfd.h" +@@ -109,7 +113,15 @@ typedef unsigned char UNIT[2]; /* unit o + extern const char *whoami; /* command-name, for error messages */ + extern const char *function_mapping_file; /* file mapping functions to files */ + extern const char *a_out_name; /* core filename */ ++extern char hist_dimension[]; /* histogram label */ ++ ++#define HERTZ_FLOAT ++#ifdef HERTZ_FLOAT ++extern double hz; /* ticks per second */ ++#else + extern long hz; /* ticks per second */ ++#endif ++extern long hz_int; + + /* + * Command-line options: +--- a/gprof/hist.c ++++ b/gprof/hist.c +@@ -49,7 +49,7 @@ static histogram *find_histogram (bfd_vm + static histogram *find_histogram_for_pc (bfd_vma pc); + + double hist_scale; +-static char hist_dimension[16] = "seconds"; ++char hist_dimension[16] = "seconds"; + static char hist_dimension_abbrev = 's'; + + static double accum_time; /* Accumulated time so far for print_line(). */ +@@ -86,7 +86,7 @@ SItab[] = + that the new histogram is compatible with already-set values + of those variables and emits an error if that's not so. */ + static void +-read_histogram_header (histogram *record, ++read_histogram_header (histogram *record, + FILE *ifp, const char *filename, + int first) + { +@@ -108,28 +108,28 @@ read_histogram_header (histogram *record + done (1); + } + +- n_hist_scale = (double)((record->highpc - record->lowpc) / sizeof (UNIT)) ++ n_hist_scale = (double)((record->highpc - record->lowpc) / sizeof (UNIT)) + / record->num_bins; + + if (first) + { +- /* We don't try to veryfy profrate is the same for all histogram ++ /* We don't try to verify profrate is the same for all histogram + records. If we have two histogram records for the same + address range and profiling samples is done as often + as possible as opposed on timer, then the actual profrate will + be slightly different. Most of the time the difference does not + matter and insisting that profiling rate is exactly the same + will only create inconvenient. */ +- hz = profrate; ++ hz_int = profrate; + memcpy (hist_dimension, n_hist_dimension, 15); + hist_dimension_abbrev = n_hist_dimension_abbrev; +- hist_scale = n_hist_scale; ++ hist_scale = n_hist_scale; + } + else + { + if (strncmp (n_hist_dimension, hist_dimension, 15) != 0) + { +- fprintf (stderr, ++ fprintf (stderr, + _("%s: dimension unit changed between histogram records\n" + "%s: from '%s'\n" + "%s: to '%s'\n"), +@@ -139,12 +139,12 @@ read_histogram_header (histogram *record + + if (n_hist_dimension_abbrev != hist_dimension_abbrev) + { +- fprintf (stderr, ++ fprintf (stderr, + _("%s: dimension abbreviation changed between histogram records\n" + "%s: from '%c'\n" + "%s: to '%c'\n"), + whoami, whoami, hist_dimension_abbrev, whoami, n_hist_dimension_abbrev); +- done (1); ++ done (1); + } + + /* The only reason we require the same scale for histograms is that +@@ -153,10 +153,10 @@ read_histogram_header (histogram *record + things for different functions. */ + if (fabs (hist_scale - n_hist_scale) > 0.000001) + { +- fprintf (stderr, ++ fprintf (stderr, + _("%s: different scales in histogram records"), + whoami); +- done (1); ++ done (1); + } + } + } +@@ -190,10 +190,10 @@ hist_read_rec (FILE * ifp, const char *f + hist_clip_symbol_address (&lowpc, &highpc); + if (lowpc != highpc) + { +- fprintf (stderr, ++ fprintf (stderr, + _("%s: overlapping histogram records\n"), + whoami); +- done (1); ++ done (1); + } + + /* This is new record. Add it to global array and allocate space for +@@ -202,10 +202,10 @@ hist_read_rec (FILE * ifp, const char *f + sizeof (histogram) * (num_histograms + 1)); + memcpy (histograms + num_histograms, + &n_record, sizeof (histogram)); +- record = &histograms[num_histograms]; ++ record = &histograms[num_histograms]; + ++num_histograms; + +- record->sample = (int *) xmalloc (record->num_bins ++ record->sample = (int *) xmalloc (record->num_bins + * sizeof (record->sample[0])); + memset (record->sample, 0, record->num_bins * sizeof (record->sample[0])); + } +@@ -216,9 +216,9 @@ hist_read_rec (FILE * ifp, const char *f + + DBG (SAMPLEDEBUG, + printf ("[hist_read_rec] n_lowpc 0x%lx n_highpc 0x%lx ncnt %u\n", +- (unsigned long) record->lowpc, (unsigned long) record->highpc, ++ (unsigned long) record->lowpc, (unsigned long) record->highpc, + record->num_bins)); +- ++ + for (i = 0; i < record->num_bins; ++i) + { + UNIT count; +@@ -232,8 +232,8 @@ hist_read_rec (FILE * ifp, const char *f + record->sample[i] += bfd_get_16 (core_bfd, (bfd_byte *) & count[0]); + DBG (SAMPLEDEBUG, + printf ("[hist_read_rec] 0x%lx: %u\n", +- (unsigned long) (record->lowpc +- + i * (record->highpc - record->lowpc) ++ (unsigned long) (record->lowpc ++ + i * (record->highpc - record->lowpc) + / record->num_bins), + record->sample[i])); + } +@@ -259,7 +259,7 @@ hist_write_hist (FILE * ofp, const char + || gmon_io_write_vma (ofp, record->lowpc) + || gmon_io_write_vma (ofp, record->highpc) + || gmon_io_write_32 (ofp, record->num_bins) +- || gmon_io_write_32 (ofp, hz) ++ || gmon_io_write_32 (ofp, hz_int) + || gmon_io_write (ofp, hist_dimension, 15) + || gmon_io_write (ofp, &hist_dimension_abbrev, 1)) + { +@@ -484,12 +484,24 @@ print_header (int prefix) + total_time = 1.0; + } + +- printf ("%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", +- "% ", _("cumulative"), _("self "), "", _("self "), _("total "), +- ""); +- printf ("%5.5s %9.9s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", +- _("time"), hist_dimension, hist_dimension, _("calls"), unit, unit, +- _("name")); ++ if (total_time / hz_int >= 100000.0 && ! bsd_style_output) ++ { ++ printf ("%5.5s %13.13s %11.11s %8.8s %8.8s %8.8s %-8.8s\n", ++ "% ", _("cumulative"), _("self "), "", _("self "), ++ _("total "), ""); ++ printf ("%5.5s %12.12s %11.11s %8.8s %8.8s %8.8s %-8.8s\n", ++ _("time"), hist_dimension, hist_dimension, _("calls"), unit, ++ unit, _("name")); ++ } ++ else ++ { ++ printf ("%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", ++ "% ", _("cumulative"), _("self "), "", _("self "), ++ _("total "), ""); ++ printf ("%5.5s %9.9s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", ++ _("time"), hist_dimension, hist_dimension, _("calls"), unit, ++ unit, _("name")); ++ } + } + + +@@ -505,6 +517,10 @@ print_line (Sym *sym, double scale) + printf ("%5.1f %10.2f %8.2f", + total_time > 0.0 ? 100 * sym->hist.time / total_time : 0.0, + accum_time / hz, sym->hist.time / hz); ++ else if (total_time / hz >= 100000.0) ++ printf ("%6.2f %12.0f %11.0f", ++ 100 * sym->hist.time / total_time, ++ accum_time / hz, sym->hist.time / hz); + else + printf ("%6.2f %9.2f %8.2f", + total_time > 0.0 ? 100 * sym->hist.time / total_time : 0.0, +@@ -610,7 +626,12 @@ hist_print () + for (index = 0; index < symtab.len; ++index) + { + sym = time_sorted_syms[index]; +- ++ /* Don't let this symbol affect the scaling if it's not going ++ to be included in the histogram. */ ++ if ((syms[INCL_FLAT].len != 0 ++ && ! sym_lookup (&syms[INCL_FLAT], sym->addr)) ++ || sym_lookup (&syms[EXCL_FLAT], sym->addr)) ++ continue; + if (sym->ncalls != 0) + { + time = (sym->hist.time + sym->cg.child_time) / sym->ncalls; +@@ -631,7 +652,7 @@ hist_print () + { + double scaled_value = SItab[log_scale].scale * top_time; + +- if (scaled_value >= 1.0 && scaled_value < 1000.0) ++ if (scaled_value >= 1.0 && scaled_value < 1000.0) + break; + } + } +@@ -669,7 +690,7 @@ hist_check_address (unsigned address) + if (histograms[i].lowpc <= address && address < histograms[i].highpc) + return 1; + +- return 0; ++ return 0; + } + + #if ! defined(min) +@@ -744,5 +765,5 @@ find_histogram_for_pc (bfd_vma pc) + if (histograms[i].lowpc <= pc && pc < histograms[i].highpc) + return &histograms[i]; + } +- return 0; ++ return 0; + } +--- a/gprof/mips.c ++++ b/gprof/mips.c +@@ -46,6 +46,7 @@ mips_find_call (Sym *parent, bfd_vma p_l + int offset; + Sym *child; + static bfd_boolean inited = FALSE; ++ int mips16; + + if (!inited) + { +@@ -55,46 +56,123 @@ mips_find_call (Sym *parent, bfd_vma p_l + indirect_child.cg.prop.fract = 1.0; + indirect_child.cg.cyc.head = &indirect_child; + } ++ mips16 = (p_lowpc & 1) != 0; ++ p_lowpc &= ~1; ++ p_highpc &= ~1; + +- DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"), ++ DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx%s\n"), + parent->name, (unsigned long) p_lowpc, +- (unsigned long) p_highpc)); +- for (pc = p_lowpc; pc < p_highpc; pc += 4) ++ (unsigned long) p_highpc, ++ mips16 ? " (mips16)" : "")); ++ for (pc = p_lowpc; pc < p_highpc;) + { +- op = bfd_get_32 (core_bfd, ((unsigned char *)core_text_space +- + pc - core_text_sect->vma)); +- if ((op & 0xfc000000) == 0x0c000000) ++ if (!mips16) + { +- /* This is a "jal" instruction. Check that the destination +- is the address of a function. */ +- DBG (CALLDEBUG, +- printf (_("[find_call] 0x%lx: jal"), (unsigned long) pc)); +- offset = (op & 0x03ffffff) << 2; +- dest_pc = (pc & ~(bfd_vma) 0xfffffff) | offset; +- if (hist_check_address (dest_pc)) ++ op = bfd_get_32 (core_bfd, &((char *)core_text_space)[pc - p_lowpc]); ++ pc += 4; ++ if ((op & 0xfc000000) == 0x0c000000) /* jal */ ++ { ++ DBG (CALLDEBUG, ++ printf (_("[find_call] 0x%lx: jal"), (unsigned long) pc-4)); ++ offset = (op & 0x03ffffff) << 2; ++ dest_pc = (pc & ~(bfd_vma) 0xfffffff) | offset; ++ pc += 4; /* skip delay slot */ ++ } ++ else if ((op & 0xfc000000) == 0x74000000) /* jalx */ + { +- child = sym_lookup (&symtab, dest_pc); + DBG (CALLDEBUG, +- printf (" 0x%lx\t; name=%s, addr=0x%lx", +- (unsigned long) dest_pc, child->name, +- (unsigned long) child->addr)); +- if (child->addr == dest_pc) +- { +- DBG (CALLDEBUG, printf ("\n")); +- /* a hit: */ +- arc_add (parent, child, (unsigned long) 0); +- continue; +- } ++ printf (_("[find_call] 0x%lx: jalx"), (unsigned long) pc-4)); ++ offset = (op & 0x03ffffff) << 2; ++ dest_pc = (pc & ~(bfd_vma) 0xfffffff) | offset | 1; ++ pc += 4; /* skip delay slot */ ++ } ++ else if ((op & 0xfc1f07ff) == 0x00000009) /* jalr */ ++ { ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:jalr\n" , ++ (unsigned long)pc-4)); ++ arc_add (parent, &indirect_child, (long)0); ++ pc += 4; /* skip delay slot */ ++ continue; + } +- /* Something funny going on. */ +- DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); ++ else if ((op & 0xfc1c0000) == 0x04100000) /* bxxzal */ ++ { ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:bal" , ++ (unsigned long)pc-4)); ++ dest_pc = pc + ((short)op << 2) + 4; ++ pc += 4; /* skip delay slot */ ++ } ++ else ++ continue; + } +- else if ((op & 0xfc00f83f) == 0x0000f809) ++ else + { +- /* This is a "jalr" instruction (indirect call). */ ++ /* MIPS16 function */ ++ op = bfd_get_16 (core_bfd, &((char *)core_text_space)[pc - p_lowpc]); ++ pc += 2; ++ if ((op & 0xfc00) == 0x1800 /* jal */ ++ || (op & 0xfc00) == 0x1c00) /* jalx */ ++ { ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:jal%s", ++ (unsigned long)pc-2, ++ (op & 0xfc00) == 0x1c00 ? "x" : "")); ++ offset = bfd_get_16 (core_bfd, ++ &((char *)core_text_space)[pc - p_lowpc]); ++ pc += 2; ++ offset |= (op & 0x1f) << 21; ++ offset |= (op & 0x3e0) << (16 - 5); ++ dest_pc = (pc & ~(bfd_vma)0x0fffffff) ++ + ((offset & 0x3ffffff) << 2); ++ if ((op & 0xfc00) == 0x1800) /* jal */ ++ dest_pc |= 1; ++ pc += 2; /* skip delay slot */ ++ } ++ else if ((op & 0xf8ff) == 0xe840) /* jalr */ ++ { ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:jalr\n" , ++ (unsigned long)pc-2)); ++ arc_add (parent, &indirect_child, (long)0); ++ pc += 2; /* skip delay slot */ ++ continue; ++ } ++ else if ((op & 0xf8ff) == 0xe8c0) /* jalrc */ ++ { ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:jalrc\n" , ++ (unsigned long)pc-2)); ++ arc_add (parent, &indirect_child, (long)0); ++ continue; ++ } ++ else if ((op & 0xff7f) == 0xe820 /* jr/jrc $31 */ ++ || (op & 0xff7f) == 0xef00 /* jr/jrc $7 */ ++ || (op & 0xff80) == 0x6400 /* restore */ ++ || (op & 0xff1f) == 0xed09 /* exit */ ++ || (op & 0xff1f) == 0xee09 /* exit */ ++ || (op & 0xff1f) == 0xef09) /* exit */ ++ { ++ /* Skip constants after the end of the function. */ ++ DBG (CALLDEBUG, printf ("[find_call]\t0x%lx:end\n" , ++ (unsigned long)pc-2)); ++ return; ++ } ++ else ++ continue; ++ } ++ ++ if (dest_pc >= p_lowpc && dest_pc <= p_highpc) ++ { ++ child = sym_lookup (&symtab, dest_pc); + DBG (CALLDEBUG, +- printf (_("[find_call] 0x%lx: jalr\n"), (unsigned long) pc)); +- arc_add (parent, &indirect_child, (unsigned long) 0); ++ printf (" 0x%lx\t; name=%s, addr=0x%lx", ++ (unsigned long) dest_pc, child->name, ++ (unsigned long) child->addr)); ++ if (child->addr == dest_pc) ++ { ++ DBG (CALLDEBUG, printf ("\n")); ++ /* a hit: */ ++ arc_add (parent, child, (unsigned long) 0); ++ continue; ++ } + } ++ /* Something funny going on. */ ++ DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); + } + } +--- a/include/elf/arm.h ++++ b/include/elf/arm.h +@@ -71,9 +71,11 @@ + #define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ + + /* Additional section types. */ +-#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */ +-#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */ +-#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */ ++#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */ ++#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */ ++#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */ ++#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* Section holds overlay debug info. */ ++#define SHT_ARM_OVERLAYSECTION 0x70000005 /* Section holds GDB and overlay integration info. */ + + /* ARM-specific values for sh_flags. */ + #define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */ +--- a/include/libiberty.h ++++ b/include/libiberty.h +@@ -591,6 +591,10 @@ extern int pexecute (const char *, char + + extern int pwait (int, int *, int); + ++/* Convert a Cygwin path to a Windows path. */ ++ ++extern int cygpath (const char *, char []); ++ + #if !HAVE_DECL_ASPRINTF + /* Like sprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. */ +--- a/include/opcode/arm.h ++++ b/include/opcode/arm.h +@@ -53,6 +53,7 @@ + #define ARM_CEXT_MAVERICK 0x00000002 /* Use Cirrus/DSP coprocessor. */ + #define ARM_CEXT_IWMMXT 0x00000004 /* Intel Wireless MMX technology coprocessor. */ + #define ARM_CEXT_IWMMXT2 0x00000008 /* Intel Wireless MMX technology coprocessor version 2. */ ++#define ARM_CEXT_MARVELL_F 0x00000010 /* Marvell division extension. */ + + #define FPU_ENDIAN_PURE 0x80000000 /* Pure-endian doubles. */ + #define FPU_ENDIAN_BIG 0 /* Double words-big-endian. */ +@@ -116,6 +117,8 @@ + ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT) + #define ARM_ARCH_IWMMXT2 \ + ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT | ARM_CEXT_IWMMXT2) ++#define ARM_ARCH_MARVELL_F \ ++ ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_MARVELL_F) + + #define FPU_VFP_V1xD (FPU_VFP_EXT_V1xD | FPU_ENDIAN_PURE) + #define FPU_VFP_V1 (FPU_VFP_V1xD | FPU_VFP_EXT_V1) +--- a/include/opcode/mips.h ++++ b/include/opcode/mips.h +@@ -843,6 +843,8 @@ enum + M_S_DOB, + M_S_DAB, + M_S_S, ++ M_SAA_AB, ++ M_SAAD_AB, + M_SC_AB, + M_SCD_AB, + M_SD_A, +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -163,6 +163,12 @@ ALL_EMULATIONS = \ + eelf32bfinfd.o \ + eelf32cr16.o \ + eelf32cr16c.o \ ++ eelf32ebocteon.o \ ++ eelf32elocteon.o \ ++ eelf32ebocteonn32.o \ ++ eelf32elocteonn32.o \ ++ eelf64ebocteon.o \ ++ eelf64elocteon.o \ + eelf32bmip.o \ + eelf32bmipn32.o \ + eelf32btsmip.o \ +@@ -789,6 +795,35 @@ eelf32cr16c.c: $(srcdir)/emulparams/elf3 + $(ELF_DEPS) \ + $(srcdir)/scripttempl/elf32cr16c.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32cr16c "$(tdir_elf32cr16c)" ++eelf32ebocteon.c: $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emulparams/elf32bmip.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32ebocteon "$(tdir_elf32ebocteon)" ++eelf32elocteon.c: $(srcdir)/emulparams/elf32elocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh $(srcdir)/emulparams/elf32bmip.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32elocteon "$(tdir_elf32elocteon)" ++eelf32ebocteonn32.c: $(srcdir)/emulparams/elf32ebocteonn32.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32ebocteonn32 "$(tdir_elf32ebocteonn32)" ++eelf32elocteonn32.c: $(srcdir)/emulparams/elf32elocteonn32.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32elocteonn32 "$(tdir_elf32elocteonn32)" ++eelf64ebocteon.c: $(srcdir)/emulparams/elf64ebocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf64ebocteon "$(tdir_elf64ebocteon)" ++eelf64elocteon.c: $(srcdir)/emulparams/elf64elocteon.sh \ ++ $(srcdir)/emulparams/elf64ebocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf64elocteon "$(tdir_elf64elocteon)" + eelf32bmip.c: $(srcdir)/emulparams/elf32bmip.sh $(ELF_DEPS) \ + $(srcdir)/emultempl/mipself.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32bmip "$(tdir_elf32bmip)" +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -427,6 +427,12 @@ ALL_EMULATIONS = \ + eelf32bfinfd.o \ + eelf32cr16.o \ + eelf32cr16c.o \ ++ eelf32ebocteon.o \ ++ eelf32elocteon.o \ ++ eelf32ebocteonn32.o \ ++ eelf32elocteonn32.o \ ++ eelf64ebocteon.o \ ++ eelf64elocteon.o \ + eelf32bmip.o \ + eelf32bmipn32.o \ + eelf32btsmip.o \ +@@ -1635,6 +1641,35 @@ eelf32cr16c.c: $(srcdir)/emulparams/elf3 + $(ELF_DEPS) \ + $(srcdir)/scripttempl/elf32cr16c.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32cr16c "$(tdir_elf32cr16c)" ++eelf32ebocteon.c: $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emulparams/elf32bmip.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32ebocteon "$(tdir_elf32ebocteon)" ++eelf32elocteon.c: $(srcdir)/emulparams/elf32elocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh $(srcdir)/emulparams/elf32bmip.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32elocteon "$(tdir_elf32elocteon)" ++eelf32ebocteonn32.c: $(srcdir)/emulparams/elf32ebocteonn32.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32ebocteonn32 "$(tdir_elf32ebocteonn32)" ++eelf32elocteonn32.c: $(srcdir)/emulparams/elf32elocteonn32.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf32elocteonn32 "$(tdir_elf32elocteonn32)" ++eelf64ebocteon.c: $(srcdir)/emulparams/elf64ebocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf64ebocteon "$(tdir_elf64ebocteon)" ++eelf64elocteon.c: $(srcdir)/emulparams/elf64elocteon.sh \ ++ $(srcdir)/emulparams/elf64ebocteon.sh \ ++ $(srcdir)/emulparams/elf32ebocteon.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/octeonelf.em \ ++ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf64elocteon "$(tdir_elf64elocteon)" + eelf32bmip.c: $(srcdir)/emulparams/elf32bmip.sh $(ELF_DEPS) \ + $(srcdir)/emultempl/mipself.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32bmip "$(tdir_elf32bmip)" +--- a/ld/config.in ++++ b/ld/config.in +@@ -4,6 +4,9 @@ + language is requested. */ + #undef ENABLE_NLS + ++/* Define to warn for use of native system library directories */ ++#undef ENABLE_POISON_SYSTEM_DIRECTORIES ++ + /* Additional extension a shared object might have. */ + #undef EXTRA_SHLIB_EXTENSION + +--- a/ld/configure ++++ b/ld/configure +@@ -1004,6 +1004,8 @@ Optional Features: + --enable-dependency-tracking do not reject slow dependency extractors + --enable-targets alternative target configurations + --enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes) ++ --enable-poison-system-directories ++ warn for use of native system library directories + --enable-got= GOT handling scheme (target, single, negative, + multigot) + --enable-werror treat compile warnings as errors +@@ -3341,6 +3343,21 @@ fi; + + + ++# Check whether --enable-poison-system-directories or --disable-poison-system-directories was given. ++if test "${enable_poison_system_directories+set}" = set; then ++ enableval="$enable_poison_system_directories" ++ ++else ++ enable_poison_system_directories=no ++fi; ++if test "x${enable_poison_system_directories}" = "xyes"; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define ENABLE_POISON_SYSTEM_DIRECTORIES 1 ++_ACEOF ++ ++fi ++ + # Check whether --enable-got or --disable-got was given. + if test "${enable_got+set}" = set; then + enableval="$enable_got" +@@ -5795,13 +5812,13 @@ if test "${lt_cv_nm_interface+set}" = se + else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:5798: $ac_compile\"" >&5) ++ (eval echo "\"\$as_me:5815: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 +- (eval echo "\"\$as_me:5801: $NM \\\"conftest.$ac_objext\\\"\"" >&5) ++ (eval echo "\"\$as_me:5818: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 +- (eval echo "\"\$as_me:5804: output\"" >&5) ++ (eval echo "\"\$as_me:5821: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" +@@ -6958,7 +6975,7 @@ ia64-*-hpux*) + ;; + *-*-irix6*) + # Find out which ABI we are using. +- echo '#line 6961 "configure"' > conftest.$ac_ext ++ echo '#line 6978 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? +@@ -8264,11 +8281,11 @@ else + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8267: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:8284: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:8271: \$? = $ac_status" >&5 ++ echo "$as_me:8288: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. +@@ -8603,11 +8620,11 @@ else + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8606: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:8623: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:8610: \$? = $ac_status" >&5 ++ echo "$as_me:8627: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. +@@ -8708,11 +8725,11 @@ else + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8711: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:8728: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:8715: \$? = $ac_status" >&5 ++ echo "$as_me:8732: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized +@@ -8763,11 +8780,11 @@ else + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:8766: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:8783: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:8770: \$? = $ac_status" >&5 ++ echo "$as_me:8787: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized +@@ -11575,7 +11592,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 11578 "configure" ++#line 11595 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -11671,7 +11688,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 11674 "configure" ++#line 11691 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +--- a/ld/configure.in ++++ b/ld/configure.in +@@ -68,6 +68,16 @@ AC_SUBST(use_sysroot) + AC_SUBST(TARGET_SYSTEM_ROOT) + AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE) + ++AC_ARG_ENABLE([poison-system-directories], ++ AS_HELP_STRING([--enable-poison-system-directories], ++ [warn for use of native system library directories]),, ++ [enable_poison_system_directories=no]) ++if test "x${enable_poison_system_directories}" = "xyes"; then ++ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES], ++ [1], ++ [Define to warn for use of native system library directories]) ++fi ++ + AC_ARG_ENABLE([got], + AS_HELP_STRING([--enable-got=], + [GOT handling scheme (target, single, negative, multigot)]), +--- a/ld/configure.tgt ++++ b/ld/configure.tgt +@@ -380,6 +380,9 @@ mips*vr4100el-*-elf*) targ_emul=elf32l43 + mips*vr4100-*-elf*) targ_emul=elf32b4300 ;; + mips*vr5000el-*-elf*) targ_emul=elf32l4300 ;; + mips*vr5000-*-elf*) targ_emul=elf32b4300 ;; ++mips64octeon*-*-elf*) targ_emul=elf32ebocteon ++ targ_extra_emuls="elf32elocteon elf32ebocteonn32 elf32elocteonn32 elf64ebocteon elf64elocteon" ++ ;; + mips*el-sde-elf*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" ;; + mips*-sde-elf*) targ_emul=elf32btsmip +@@ -392,6 +395,10 @@ mips*el-*-vxworks*) targ_emul=elf32elmip + mips*-*-vxworks*) targ_emul=elf32ebmipvxworks + targ_extra_emuls="elf32elmipvxworks" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; ++mips64el-sicortex-linux-gnu) ++ targ_emul=elf64ltsmip ++ targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip" ++ targ_extra_libpath=$targ_extra_emuls ;; + mips64*el-*-linux-*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + targ_extra_libpath=$targ_extra_emuls ;; +--- a/ld/emulparams/armelf.sh ++++ b/ld/emulparams/armelf.sh +@@ -6,7 +6,7 @@ LITTLE_OUTPUT_FORMAT="elf32-littlearm" + TEXT_START_ADDR=0x8000 + TEMPLATE_NAME=elf32 + EXTRA_EM_FILE=armelf +-OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)' ++OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.janus_2cc_veneer) *(.v4_bx)' + OTHER_BSS_SYMBOLS='__bss_start__ = .;' + OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ;' + OTHER_END_SYMBOLS='__end__ = . ;' +--- a/ld/emulparams/elf32ebmipvxworks.sh ++++ b/ld/emulparams/elf32ebmipvxworks.sh +@@ -13,6 +13,9 @@ OTHER_READWRITE_SECTIONS=" + .rdata ${RELOCATING-0} : ONLY_IF_RW { *(.rdata) } + " + unset OTHER_GOT_SYMBOLS ++unset GOT ++unset GOTPLT ++unset DATA_GOTPLT + SHLIB_TEXT_START_ADDR=0 + unset TEXT_DYNAMIC + unset DATA_ADDR +--- /dev/null ++++ b/ld/emulparams/elf32ebocteon.sh +@@ -0,0 +1,45 @@ ++# If you change this file, please also look at files which source this one: ++# elf32locteon.sh ++ ++EMBEDDED=yes ++. ${srcdir}/emulparams/elf32btsmip.sh ++ ++# Entry point symbol. ++ENTRY=__start ++ ++# Start of the .text section ++TEXT_START_ADDR=0x10000000 ++ ++# Data and .cmvx_shared are 32M pages. Unlike what the documentation says we ++# always use (ALIGN(MAXPAGESIZE) + (. & (MAXPAGESIZE - COMMONPAGESIZE))) to ++# align data. On-disk image will have at most 4K (ELF_MAXPAGESIZE) padding ++# before data. ++MAXPAGESIZE=32M ++COMMONPAGESIZE=32M ++# Needed to disable demand paging. ++EXTRA_EM_FILE=octeonelf ++ ++# If defined, the genscripts.sh script sets TEXT_START_ADDR to its value ++# for the -n/-N options. ++# Define this as the TEXT_START_ADDR is different to overright the one ++# defined in elf32bmip.sh ++NONPAGED_TEXT_START_ADDR=0x10000000 ++ ++# Create new macro to place .cvmx_shared at the end of _end. ++OCTEON_SPECIAL_SECTIONS=' ++ . = ALIGN(32M); /* RBF added alignment of data */ ++ __cvmx_shared_start = .; ++ .cvmx_shared : { *(.cvmx_shared .cvmx_shared.linkonce.*) } ++ .cvmx_shared_bss : { *(.cvmx_shared_bss .cvmx_shared_bss.linkonce.*) } ++ __cvmx_shared_end = .;' ++ ++OTHER_END_SYMBOLS=' ++ /* All symbols above this (32 bit compat space) the simulator will attribute ++ to the bootloader. */ ++ __bootloader = 0xFFFFFFF8;' ++ ++EXECUTABLE_SYMBOLS=' ++ PROVIDE(__cvmx_app_init = 0); ++ PROVIDE(__cvmx_app_exit = 0); ++ PROVIDE(__cvmx_pci_console_write = 0); ++ PROVIDE(__cvmx_pci_console_read = 0);' +--- /dev/null ++++ b/ld/emulparams/elf32ebocteonn32.sh +@@ -0,0 +1,6 @@ ++EMBEDDED=yes ++. ${srcdir}/emulparams/elf32ebocteon.sh ++ ++OUTPUT_FORMAT="elf32-ntradbigmips" ++BIG_OUTPUT_FORMAT="elf32-ntradbigmips" ++LITTLE_OUTPUT_FORMAT="elf32-ntradlittlemips" +--- a/ld/emulparams/elf32elmipvxworks.sh ++++ b/ld/emulparams/elf32elmipvxworks.sh +@@ -4,6 +4,9 @@ OUTPUT_FORMAT="elf32-littlemips-vxworks" + BIG_OUTPUT_FORMAT="elf32-bigmips-vxworks" + LITTLE_OUTPUT_FORMAT="elf32-littlemips-vxworks" + unset OTHER_GOT_SYMBOLS ++unset GOT ++unset GOTPLT ++unset DATA_GOTPLT + SHLIB_TEXT_START_ADDR=0 + unset TEXT_DYNAMIC + unset DATA_ADDR +--- /dev/null ++++ b/ld/emulparams/elf32elocteon.sh +@@ -0,0 +1,2 @@ ++. ${srcdir}/emulparams/elf32ebocteon.sh ++OUTPUT_FORMAT=$LITTLE_OUTPUT_FORMAT +--- /dev/null ++++ b/ld/emulparams/elf32elocteonn32.sh +@@ -0,0 +1,2 @@ ++. ${srcdir}/emulparams/elf32ebocteonn32.sh ++OUTPUT_FORMAT="elf32-ntradlittlemips" +--- /dev/null ++++ b/ld/emulparams/elf64ebocteon.sh +@@ -0,0 +1,6 @@ ++EMBEDDED=yes ++. ${srcdir}/emulparams/elf32ebocteon.sh ++ ++OUTPUT_FORMAT="elf64-tradbigmips" ++BIG_OUTPUT_FORMAT="elf64-tradbigmips" ++LITTLE_OUTPUT_FORMAT="elf64-tradlittlemips" +--- /dev/null ++++ b/ld/emulparams/elf64elocteon.sh +@@ -0,0 +1,2 @@ ++. ${srcdir}/emulparams/elf64ebocteon.sh ++OUTPUT_FORMAT=$LITTLE_OUTPUT_FORMAT +--- a/ld/emultempl/armelf.em ++++ b/ld/emultempl/armelf.em +@@ -31,13 +31,14 @@ fragment <the_bfd, & link_info); +- } +- } +- +- /* Call the standard elf routine. */ +- gld${EMULATION_NAME}_after_open (); +-} +- +-static void +-arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement) +-{ +- if (statement->header.type == lang_input_section_enum) +- { +- asection *i = statement->input_section.section; +- +- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag +- && (i->flags & SEC_EXCLUDE) == 0) +- { +- asection *output_section = i->output_section; +- +- ASSERT (output_section->owner == link_info.output_bfd); +- +- /* Don't attach the interworking stubs to a dynamic object, to +- an empty section, etc. */ +- if ((output_section->flags & SEC_HAS_CONTENTS) != 0 +- && (i->flags & SEC_NEVER_LOAD) == 0 +- && ! (i->owner->flags & DYNAMIC)) +- bfd_for_interwork = i->owner; +- } +- } +-} +- +-static void + arm_elf_before_allocation (void) + { +- if (link_info.input_bfds != NULL) +- { +- /* The interworking bfd must be the last one in the link. */ +- bfd_for_interwork = NULL; +- +- lang_for_each_statement (arm_elf_set_bfd_for_interworking); +- +- /* If bfd_for_interwork is NULL, then there are no loadable sections +- with real contents to be linked, so we are not going to have to +- create any interworking stubs, so it is OK not to call +- bfd_elf32_arm_get_bfd_for_interworking. */ +- if (bfd_for_interwork != NULL) +- bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info); +- } +- + bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code); + + /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary + due to architecture version. */ + bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info); + ++ /* Make sure we haven't selected the Janus 2CC fix on an architecture for ++ which it is unnecessary. */ ++ bfd_elf32_arm_validate_janus_2cc_fix (link_info.output_bfd, &link_info); ++ ++ /* Auto-select Cortex-A8 erratum fix if it wasn't explicitly specified. */ ++ bfd_elf32_arm_set_cortex_a8_fix (link_info.output_bfd, &link_info); ++ + /* We should be able to set the size of the interworking stub section. We + can't do it until later if we have dynamic sections, though. */ + if (! elf_hash_table (&link_info)->dynamic_sections_created) +@@ -126,17 +81,19 @@ arm_elf_before_allocation (void) + + if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, + &link_info) +- || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info)) ++ || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info) ++ || !bfd_elf32_arm_janus_2cc_erratum_scan (is->the_bfd, ++ &link_info)) + /* xgettext:c-format */ + einfo (_("Errors encountered processing file %s"), is->filename); + } ++ ++ /* We have seen it all. Allocate it, and carry on. */ ++ bfd_elf32_arm_allocate_interworking_sections (& link_info); + } + + /* Call the standard elf routine. */ + gld${EMULATION_NAME}_before_allocation (); +- +- /* We have seen it all. Allocate it, and carry on. */ +- bfd_elf32_arm_allocate_interworking_sections (& link_info); + } + + static void +@@ -150,7 +107,7 @@ arm_elf_after_allocation (void) + { + /* Figure out where VFP11 erratum veneers (and the labels returning + from same) have been placed. */ +- bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info); ++ bfd_elf32_arm_fix_veneer_locations (is->the_bfd, &link_info); + } + } + } +@@ -213,9 +170,9 @@ hook_in_stub (struct hook_stub_info *inf + if (l->input_section.section == info->input_section) + { + /* We've found our section. Insert the stub immediately +- before its associated input section. */ +- *lp = info->add.head; +- *(info->add.tail) = l; ++ after its associated input section. */ ++ *(info->add.tail) = l->header.next; ++ l->header.next = info->add.head; + return TRUE; + } + break; +@@ -244,7 +201,7 @@ hook_in_stub (struct hook_stub_info *inf + /* Call-back for elf32_arm_size_stubs. */ + + /* Create a new stub section, and arrange for it to be linked +- immediately before INPUT_SECTION. */ ++ immediately after INPUT_SECTION. */ + + static asection * + elf32_arm_add_stub_section (const char *stub_sec_name, +@@ -312,10 +269,78 @@ build_section_lists (lang_statement_unio + } + } + ++static int ++compare_output_sec_vma (const void *a, const void *b) ++{ ++ asection *asec = *(asection **) a, *bsec = *(asection **) b; ++ asection *aout = asec->output_section, *bout = bsec->output_section; ++ bfd_vma avma, bvma; ++ ++ /* If there's no output section for some reason, compare equal. */ ++ if (!aout || !bout) ++ return 0; ++ ++ avma = aout->vma + asec->output_offset; ++ bvma = bout->vma + bsec->output_offset; ++ ++ if (avma > bvma) ++ return 1; ++ else if (avma < bvma) ++ return -1; ++ ++ return 0; ++} ++ + static void + gld${EMULATION_NAME}_finish (void) + { + struct bfd_link_hash_entry * h; ++ unsigned int list_size = 10; ++ asection **sec_list = xmalloc (list_size * sizeof (asection *)); ++ unsigned int sec_count = 0; ++ ++ if (!link_info.relocatable) ++ { ++ /* Build a sorted list of input text sections, then use that to process ++ the unwind table index. */ ++ LANG_FOR_EACH_INPUT_STATEMENT (is) ++ { ++ bfd *abfd = is->the_bfd; ++ asection *sec; ++ ++ if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) ++ continue; ++ ++ for (sec = abfd->sections; sec != NULL; sec = sec->next) ++ { ++ asection *out_sec = sec->output_section; ++ ++ if (out_sec ++ && elf_section_type (sec) == SHT_PROGBITS ++ && (elf_section_flags (sec) & SHF_EXECINSTR) != 0 ++ && (sec->flags & SEC_EXCLUDE) == 0 ++ && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS ++ && out_sec != bfd_abs_section_ptr) ++ { ++ if (sec_count == list_size) ++ { ++ list_size *= 2; ++ sec_list = xrealloc (sec_list, ++ list_size * sizeof (asection *)); ++ } ++ ++ sec_list[sec_count++] = sec; ++ } ++ } ++ } ++ ++ qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma); ++ ++ if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info)) ++ need_laying_out = 1; ++ ++ free (sec_list); ++ } + + /* bfd_elf32_discard_info just plays with debugging sections, + ie. doesn't affect any code, so we can delay resizing the +@@ -444,7 +469,7 @@ arm_elf_create_output_section_statements + target2_type, fix_v4bx, use_blx, + vfp11_denorm_fix, no_enum_size_warning, + no_wchar_size_warning, +- pic_veneer); ++ pic_veneer, fix_janus_2cc, fix_cortex_a8); + + stub_file = lang_add_input_file ("linker stubs", + lang_input_file_is_fake_enum, +@@ -461,6 +486,10 @@ arm_elf_create_output_section_statements + + stub_file->the_bfd->flags |= BFD_LINKER_CREATED; + ldlang_add_file (stub_file); ++ ++ /* Also use the stub file for stubs placed in a single output section. */ ++ bfd_elf32_arm_add_glue_sections_to_bfd (stub_file->the_bfd, &link_info); ++ bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info); + } + + /* Avoid processing the fake stub_file in vercheck, stat_needed and +@@ -500,8 +529,11 @@ PARSE_AND_LIST_PROLOGUE=' + #define OPTION_NO_ENUM_SIZE_WARNING 309 + #define OPTION_PIC_VENEER 310 + #define OPTION_FIX_V4BX_INTERWORKING 311 +-#define OPTION_STUBGROUP_SIZE 312 ++#define OPTION_STUBGROUP_SIZE 312 + #define OPTION_NO_WCHAR_SIZE_WARNING 313 ++#define OPTION_FIX_JANUS_2CC 314 ++#define OPTION_FIX_CORTEX_A8 315 ++#define OPTION_NO_FIX_CORTEX_A8 316 + ' + + PARSE_AND_LIST_SHORTOPTS=p +@@ -521,6 +553,9 @@ PARSE_AND_LIST_LONGOPTS=' + { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER}, + { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE }, + { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING}, ++ { "fix-janus-2cc", no_argument, NULL, OPTION_FIX_JANUS_2CC}, ++ { "fix-cortex-a8", no_argument, NULL, OPTION_FIX_CORTEX_A8}, ++ { "no-fix-cortex-a8", no_argument, NULL, OPTION_NO_FIX_CORTEX_A8}, + ' + + PARSE_AND_LIST_OPTIONS=' +@@ -541,12 +576,14 @@ PARSE_AND_LIST_OPTIONS=' + fprintf (file, _("\ + --stub-group-size=N Maximum size of a group of input sections that can be\n\ + handled by one stub section. A negative value\n\ +- locates all stubs before their branches (with a\n\ ++ locates all stubs after their branches (with a\n\ + group size of -N), while a positive value allows\n\ + two groups of input sections, one before, and one\n\ + after each stub section. Values of +/-1 indicate\n\ + the linker should choose suitable defaults.\n" + )); ++ fprintf (file, _(" --fix-janus-2cc Enable Janus 2CC erratum fix\n")); ++ fprintf (file, _(" --[no-]fix-cortex-a8 Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n")); + ' + + PARSE_AND_LIST_ARGS_CASES=' +@@ -618,11 +655,22 @@ PARSE_AND_LIST_ARGS_CASES=' + einfo (_("%P%F: invalid number `%s'\''\n"), optarg); + } + break; ++ ++ case OPTION_FIX_JANUS_2CC: ++ fix_janus_2cc = 1; ++ break; ++ ++ case OPTION_FIX_CORTEX_A8: ++ fix_cortex_a8 = 1; ++ break; ++ ++ case OPTION_NO_FIX_CORTEX_A8: ++ fix_cortex_a8 = 0; ++ break; + ' + +-# We have our own after_open and before_allocation functions, but they call ++# We have our own before_allocation etc. functions, but they call + # the standard routines, so give them a different name. +-LDEMUL_AFTER_OPEN=arm_elf_after_open + LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation + LDEMUL_AFTER_ALLOCATION=arm_elf_after_allocation + LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements +--- a/ld/emultempl/m68kelf.em ++++ b/ld/emultempl/m68kelf.em +@@ -33,10 +33,7 @@ esac + + case ${target} in + *-linux*) +-# Don't use multi-GOT by default due to glibc linker's assumption +-# that GOT pointer points to GOT[0]. +-# got_handling_target_default=GOT_HANDLING_MULTIGOT +- got_handling_target_default=GOT_HANDLING_SINGLE ++ got_handling_target_default=GOT_HANDLING_MULTIGOT + ;; + *) + got_handling_target_default=GOT_HANDLING_SINGLE +--- /dev/null ++++ b/ld/emultempl/octeonelf.em +@@ -0,0 +1,42 @@ ++# This shell script emits a C file. -*- C -*- ++# Copyright (C) 2007 Cavium Networks. ++# ++# This file is part of GLD, the Gnu Linker. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. ++# ++ ++# This file is sourced from elf32.em and used to define OCTEON and ELF ++# specific things. ++ ++source_em ${srcdir}/emultempl/mipself.em ++ ++fragment <u.def.section = expld.result.section; + if (tree->type.node_class == etree_provide) + tree->type.node_class = etree_provided; ++ ++ /* Copy the symbol type if this is a simple assignment of ++ one symbol to annother. */ ++ if (tree->assign.src->type.node_class == etree_name) ++ { ++ struct bfd_link_hash_entry *hsrc; ++ ++ hsrc = bfd_link_hash_lookup (link_info.hash, ++ tree->assign.src->name.name, ++ FALSE, FALSE, TRUE); ++ if (hsrc) ++ bfd_copy_link_hash_symbol_type (link_info.output_bfd, h, ++ hsrc); ++ } + } + } + break; +--- a/ld/ldfile.c ++++ b/ld/ldfile.c +@@ -120,6 +120,22 @@ ldfile_add_library_path (const char *nam + { + new->name = xstrdup (name); + new->sysrooted = is_sysrooted_pathname (name, FALSE); ++ ++#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES ++ if (command_line.poison_system_directories ++ && ((!strncmp (name, "/lib", 4)) ++ || (!strncmp (name, "/usr/lib", 8)) ++ || (!strncmp (name, "/usr/local/lib", 14)) ++ || (!strncmp (name, "/usr/X11R6/lib", 14)))) ++ { ++ if (command_line.error_poison_system_directories) ++ einfo (_("%X%P: error: library search path \"%s\" is unsafe for " ++ "cross-compilation\n"), name); ++ else ++ einfo (_("%P: warning: library search path \"%s\" is unsafe for " ++ "cross-compilation\n"), name); ++ } ++#endif + } + } + +@@ -542,22 +558,27 @@ find_scripts_dir (void) + return NULL; + } + +-/* Try to open NAME; if that fails, look for it in the default script +- directory, then in any directories specified with -L, without and +- with EXTEND appended. */ ++/* If DEFAULT_ONLY is false, try to open NAME; if that fails, look for ++ it in directories specified with -L, then in the default script ++ directory, without and with EXTEND appended. If DEFAULT_ONLY is ++ true, the search is restricted to the default script location. */ + + static FILE * +-ldfile_find_command_file (const char *name, const char *extend) ++ldfile_find_command_file (const char *name, const char *extend, ++ bfd_boolean default_only) + { + search_dirs_type *search; +- FILE *result; ++ FILE *result = NULL; + char *buffer; + static search_dirs_type *script_search; + +- /* First try raw name. */ +- result = try_open (name, ""); +- if (result != NULL) +- return result; ++ if (!default_only) ++ { ++ /* First try raw name. */ ++ result = try_open (name, ""); ++ if (result != NULL) ++ return result; ++ } + + if (!script_search) + { +@@ -569,16 +590,17 @@ ldfile_find_command_file (const char *na + ldfile_add_library_path (script_dir, TRUE); + search_tail_ptr = save_tail_ptr; + } +- if (!script_search) +- script_search = search_head; +- else +- script_search->next = search_head; + } + ++ /* Temporarily append script_search to the path list so that the ++ paths specified with -L will be searched first. */ ++ *search_tail_ptr = script_search; ++ + /* Try now prefixes. */ +- for (search = script_search; search != NULL; search = search->next) ++ for (search = default_only ? script_search : search_head; ++ search != NULL; ++ search = search->next) + { +- + buffer = concat (search->name, slash, name, (const char *) NULL); + result = try_open (buffer, extend); + free (buffer); +@@ -586,14 +608,19 @@ ldfile_find_command_file (const char *na + break; + } + ++ /* Restore the original path list. */ ++ *search_tail_ptr = NULL; ++ + return result; + } + +-void +-ldfile_open_command_file (const char *name) ++/* Open command file NAME. */ ++ ++static void ++ldfile_open_command_file_1 (const char *name, bfd_boolean default_only) + { + FILE *ldlex_input_stack; +- ldlex_input_stack = ldfile_find_command_file (name, ""); ++ ldlex_input_stack = ldfile_find_command_file (name, "", default_only); + + if (ldlex_input_stack == NULL) + { +@@ -609,6 +636,23 @@ ldfile_open_command_file (const char *na + saved_script_handle = ldlex_input_stack; + } + ++/* Open command file NAME in the current directory, -L directories, ++ the default script location, in that order. */ ++ ++void ++ldfile_open_command_file (const char *name) ++{ ++ ldfile_open_command_file_1 (name, FALSE); ++} ++ ++/* Open command file NAME at the default script location. */ ++ ++void ++ldfile_open_default_command_file (const char *name) ++{ ++ ldfile_open_command_file_1 (name, TRUE); ++} ++ + void + ldfile_add_arch (const char *in_name) + { +--- a/ld/ldfile.h ++++ b/ld/ldfile.h +@@ -50,6 +50,8 @@ extern void ldfile_add_library_path + (const char *, bfd_boolean cmdline); + extern void ldfile_open_command_file + (const char *name); ++extern void ldfile_open_default_command_file ++ (const char *name); + extern void ldfile_open_file + (struct lang_input_statement_struct *); + extern bfd_boolean ldfile_try_open_bfd +--- a/ld/ldlang.c ++++ b/ld/ldlang.c +@@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + ++#include "config.h" ++ + #include + + #include "sysdep.h" +@@ -6467,6 +6469,15 @@ lang_leave_output_section_statement (fil + memspec, lma_memspec, + current_section->load_base != NULL, + current_section->addr_tree != NULL); ++ ++ /* If this section has no load region or base, but has the same ++ region as the previous section, then propagate the previous ++ section's load region. */ ++ ++ if (!current_section->lma_region && !current_section->load_base ++ && current_section->region == current_section->prev->region) ++ current_section->lma_region = current_section->prev->lma_region; ++ + current_section->fill = fill; + current_section->phdrs = phdrs; + stat_ptr = &statement_list; +--- a/ld/ldmain.c ++++ b/ld/ldmain.c +@@ -252,6 +252,8 @@ main (int argc, char **argv) + command_line.warn_mismatch = TRUE; + command_line.warn_search_mismatch = TRUE; + command_line.check_section_addresses = -1; ++ command_line.poison_system_directories = TRUE; ++ command_line.error_poison_system_directories = FALSE; + + /* We initialize DEMANGLING based on the environment variable + COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the +@@ -376,7 +378,7 @@ main (int argc, char **argv) + char *s = ldemul_get_script (&isfile); + + if (isfile) +- ldfile_open_command_file (s); ++ ldfile_open_default_command_file (s); + else + { + lex_string = s; +--- a/ld/lexsup.c ++++ b/ld/lexsup.c +@@ -164,7 +164,9 @@ enum option_values + OPTION_ERROR_UNRESOLVED_SYMBOLS, + OPTION_WARN_SHARED_TEXTREL, + OPTION_REDUCE_MEMORY_OVERHEADS, +- OPTION_DEFAULT_SCRIPT ++ OPTION_DEFAULT_SCRIPT, ++ OPTION_NO_POISON_SYSTEM_DIRECTORIES, ++ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES + }; + + /* The long options. This structure is used for both the option +@@ -566,6 +568,14 @@ static const struct ld_option ld_options + TWO_DASHES }, + { {"wrap", required_argument, NULL, OPTION_WRAP}, + '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES }, ++ { {"no-poison-system-directories", no_argument, NULL, ++ OPTION_NO_POISON_SYSTEM_DIRECTORIES}, ++ '\0', NULL, N_("Do not warn for -L options using system directories"), ++ TWO_DASHES }, ++ { {"error-poison-system-directories", no_argument, NULL, ++ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES}, ++ '\0', NULL, N_("Give an error for -L options using system directories"), ++ TWO_DASHES }, + }; + + #define OPTION_COUNT ARRAY_SIZE (ld_options) +@@ -1462,6 +1472,14 @@ parse_args (unsigned argc, char **argv) + einfo (_("%P%X: --hash-size needs a numeric argument\n")); + } + break; ++ ++ case OPTION_NO_POISON_SYSTEM_DIRECTORIES: ++ command_line.poison_system_directories = FALSE; ++ break; ++ ++ case OPTION_ERROR_POISON_SYSTEM_DIRECTORIES: ++ command_line.error_poison_system_directories = TRUE; ++ break; + } + } + +--- a/ld/scripttempl/elf.sc ++++ b/ld/scripttempl/elf.sc +@@ -174,6 +174,9 @@ if test -z "${SDATA_GOT}"; then + SDATA_GOT=" " + fi + fi ++if test -n "${DATA_GOT+set}"; then ++ DATA_GOTPLT=" " ++fi + test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" " + test "${LARGE_SECTIONS}" = "yes" && REL_LARGE=" + .rel.ldata ${RELOCATING-0} : { *(.rel.ldata${RELOCATING+ .rel.ldata.* .rel.gnu.linkonce.l.*}) } +@@ -451,11 +454,11 @@ cat < +- +- * ld-arm/arm-elf.exp (armeabitests): Restore thumb2-b-interwork. +- + 2009-02-03 Maxim Kuvyrkov + + * ld-m68k/got-multigot-12-13-14-34-35-ok.d: Update. +--- a/ld/testsuite/ld-arm/arm-elf.exp ++++ b/ld/testsuite/ld-arm/arm-elf.exp +@@ -161,6 +161,50 @@ set armelftests { + "-EL --vfp11-denorm-fix=scalar -Ttext=0x8000" "-EL -mfpu=vfpxd" {vfp11-fix-none.s} + {{objdump -dr vfp11-fix-none.d}} + "vfp11-fix-none"} ++ {"Cortex-A8 erratum fix, b.w" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-fix-b.s} ++ {{objdump -dr cortex-a8-fix-b.d}} ++ "cortex-a8-fix-b"} ++ {"Cortex-A8 erratum fix, bl.w" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-fix-bl.s} ++ {{objdump -dr cortex-a8-fix-bl.d}} ++ "cortex-a8-fix-bl"} ++ {"Cortex-A8 erratum fix, bcc.w" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-fix-bcc.s} ++ {{objdump -dr cortex-a8-fix-bcc.d}} ++ "cortex-a8-fix-bcc"} ++ {"Cortex-A8 erratum fix, blx.w" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-fix-blx.s} ++ {{objdump -dr cortex-a8-fix-blx.d}} ++ "cortex-a8-fix-blx"} ++ {"Cortex-A8 erratum fix, relocate b.w to ARM" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-arm-target.s cortex-a8-fix-b-rel.s} ++ {{objdump -dr cortex-a8-fix-b-rel-arm.d}} ++ "cortex-a8-fix-b-rel-arm"} ++ {"Cortex-A8 erratum fix, relocate b.w to Thumb" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-thumb-target.s cortex-a8-fix-b-rel.s} ++ {{objdump -dr cortex-a8-fix-b-rel-thumb.d}} ++ "cortex-a8-fix-b-rel-thumb"} ++ {"Cortex-A8 erratum fix, relocate bl.w to ARM" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-arm-target.s cortex-a8-fix-bl-rel.s} ++ {{objdump -dr cortex-a8-fix-bl-rel-arm.d}} ++ "cortex-a8-fix-bl-rel-arm"} ++ {"Cortex-A8 erratum fix, relocate bl.w to Thumb" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-thumb-target.s cortex-a8-fix-bl-rel.s} ++ {{objdump -dr cortex-a8-fix-bl-rel-thumb.d}} ++ "cortex-a8-fix-bl-rel-thumb"} ++ {"Cortex-A8 erratum fix, relocate b.w to Thumb" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-thumb-target.s cortex-a8-fix-bcc-rel.s} ++ {{objdump -dr cortex-a8-fix-bcc-rel-thumb.d}} ++ "cortex-a8-fix-bcc-rel-thumb"} ++ {"Cortex-A8 erratum fix, relocate blx.w to ARM" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-arm-target.s cortex-a8-fix-blx-rel.s} ++ {{objdump -dr cortex-a8-fix-blx-rel-arm.d}} ++ "cortex-a8-fix-blx-rel-arm"} ++ {"Cortex-A8 erratum fix, relocate blx.w to Thumb" ++ "-EL -Ttext=0x8f00 --fix-cortex-a8" "-EL" {cortex-a8-thumb-target.s cortex-a8-fix-blx-rel.s} ++ {{objdump -dr cortex-a8-fix-blx-rel-thumb.d}} ++ "cortex-a8-fix-blx-rel-thumb"} + {"Unwinding and -gc-sections" "-gc-sections" "" {gc-unwind.s} + {{objdump -sj.data gc-unwind.d}} + "gc-unwind"} +@@ -174,6 +218,9 @@ set armelftests { + {"jump19" "-static -T arm.ld" "" {jump19.s} + {{objdump -dr jump19.d}} + "jump19"} ++ {"script-type" "-static -T script-type.ld" "" {script-type.s} ++ {{readelf -s script-type.sym}} ++ "script-type"} + {"callweak" "-static -T arm.ld" "" {callweak.s} + {{objdump -dr callweak.d}} + "callweak"} +@@ -190,10 +237,20 @@ run_dump_test "emit-relocs1" + # Exclude non-ARM-EABI targets. + + if { ![istarget "arm*-*-*eabi"] } { +- # Special variants of these tests, as no farcall stub is generated +- # for a non-ARM-EABI target +- run_dump_test "thumb2-bl-as-thumb1-bad-noeabi" +- run_dump_test "thumb2-bl-bad-noeabi" ++ # Special variants of these tests, as a different farcall stub is ++ # generated for a non-ARM-EABI target: indeed in such a case, ++ # there are no attributes to indicate that blx can be used. ++ ++ set arm_noeabi_tests { ++ {"Thumb-2-as-Thumb-1 BL" "-Ttext 0x1000 --section-start .foo=0x100100c" "" {thumb2-bl-as-thumb1-bad.s} ++ {{objdump -d thumb2-bl-as-thumb1-bad-noeabi.d}} ++ "thumb2-bl-as-thumb1-bad"} ++ {"Thumb-2 BL bad" "-Ttext 0x1000 --section-start .foo=0x100100c" "" {thumb2-bl-bad.s} ++ {{objdump -d thumb2-bl-bad-noeabi.d}} ++ "thumb2-bl-bad"} ++ } ++ run_ld_link_tests $arm_noeabi_tests ++ + return + } + +@@ -232,6 +289,9 @@ set armeabitests { + {"Thumb-2 Interworked branch" "-T arm.ld" "" {thumb2-b-interwork.s} + {{objdump -dr thumb2-b-interwork.d}} + "thumb2-b-interwork"} ++ {"BL/BLX interworking" "-T arm.ld" "" {thumb2-bl-blx-interwork.s} ++ {{objdump -dr thumb2-bl-blx-interwork.d}} ++ "thumb2-bl-blx-interwork"} + {"ARMv4 interworking" "-static -T arm.ld --fix-v4bx-interworking" "--fix-v4bx -meabi=4" {armv4-bx.s} + {{objdump -d armv4-bx.d}} + "armv4-bx"} +@@ -241,7 +301,7 @@ set armeabitests { + {"MOVW/MOVT against shared libraries" "tmpdir/arm-lib.so" "" {arm-app-movw.s} + {{objdump -Rw arm-app.r}} + "arm-app-movw"} +- {"Thumb-2-as-Thumb-1 BL" "-Ttext 0x1000 --section-start .foo=0x40100c" "" {thumb2-bl-as-thumb1-bad.s} ++ {"Thumb-2-as-Thumb-1 BL" "-Ttext 0x1000 --section-start .foo=0x100100c" "" {thumb2-bl-as-thumb1-bad.s} + {{objdump -d thumb2-bl-as-thumb1-bad.d}} + "thumb2-bl-as-thumb1-bad"} + {"Thumb-2 BL" "-Ttext 0x1000 --section-start .foo=0x100100c" "" {thumb2-bl-bad.s} +@@ -257,6 +317,9 @@ set armeabitests { + {"ARM-ARM farcall (BE8)" "-Ttext 0x1000 --section-start .foo=0x2001020 -EB --be8" "-EB" {farcall-arm-arm.s} + {{objdump -d farcall-arm-arm-be8.d}} + "farcall-arm-arm-be8"} ++ {"ARM-ARM farcall (BE)" "-Ttext 0x1000 --section-start .foo=0x2001020 -EB" "-EB" {farcall-arm-arm.s} ++ {{objdump -d farcall-arm-arm.d}} ++ "farcall-arm-arm-be"} + + {"ARM-Thumb farcall" "-Ttext 0x1000 --section-start .foo=0x2001014" "" {farcall-arm-thumb.s} + {{objdump -d farcall-arm-thumb.d}} +@@ -277,6 +340,9 @@ set armeabitests { + {"Thumb-Thumb farcall M profile" "-Ttext 0x1000 --section-start .foo=0x2001014" "-march=armv7m" {farcall-thumb-thumb.s} + {{objdump -d farcall-thumb-thumb-m.d}} + "farcall-thumb-thumb-m"} ++ {"Thumb-Thumb farcall" "-Ttext 0x1000 --section-start .foo=0x2001014" "-march=armv4t" {farcall-thumb-thumb.s} ++ {{objdump -d farcall-thumb-thumb.d}} ++ "farcall-thumb-thumb"} + {"Thumb-Thumb farcall with BLX (PIC veneer)" "-Ttext 0x1000 --section-start .foo=0x2001014 --pic-veneer" "-march=armv5t" {farcall-thumb-thumb.s} + {{objdump -d farcall-thumb-thumb-blx-pic-veneer.d}} + "farcall-thumb-thumb-blx-pic-veneer"} +@@ -284,6 +350,12 @@ set armeabitests { + {"Thumb-ARM farcall" "-Ttext 0x1000 --section-start .foo=0x2001014" "-W" {farcall-thumb-arm.s} + {{objdump -d farcall-thumb-arm.d}} + "farcall-thumb-arm"} ++ {"Thumb-ARM farcall (BE8)" "-Ttext 0x1000 --section-start .foo=0x2001014 -EB --be8" "-W -EB" {farcall-thumb-arm.s} ++ {{objdump -d farcall-thumb-arm-be8.d}} ++ "farcall-thumb-arm-be8"} ++ {"Thumb-ARM farcall (BE)" "-Ttext 0x1000 --section-start .foo=0x2001014 -EB" "-W -EB" {farcall-thumb-arm.s} ++ {{objdump -d farcall-thumb-arm.d}} ++ "farcall-thumb-arm-be"} + {"Thumb-ARM (short) call" "-Ttext 0x1000 --section-start .foo=0x0002014" "-W" {farcall-thumb-arm-short.s} + {{objdump -d farcall-thumb-arm-short.d}} + "farcall-thumb-arm-short"} +@@ -328,7 +400,6 @@ run_dump_test "attr-merge-wchar-24-nowar + run_dump_test "attr-merge-wchar-40-nowarn" + run_dump_test "attr-merge-wchar-42-nowarn" + run_dump_test "attr-merge-wchar-44-nowarn" +-run_dump_test "farcall-thumb-thumb" + run_dump_test "farcall-thumb-thumb-pic-veneer" + run_dump_test "farcall-thumb-thumb-m-pic-veneer" + run_dump_test "farcall-thumb-arm-pic-veneer" +@@ -337,3 +408,7 @@ run_dump_test "attr-merge-unknown-1" + run_dump_test "attr-merge-unknown-2" + run_dump_test "attr-merge-unknown-2r" + run_dump_test "attr-merge-unknown-3" ++run_dump_test "unwind-1" ++run_dump_test "unwind-2" ++run_dump_test "unwind-3" ++run_dump_test "unwind-4" +--- a/ld/testsuite/ld-arm/arm.ld ++++ b/ld/testsuite/ld-arm/arm.ld +@@ -10,9 +10,11 @@ SECTIONS + *(.before) + *(.text) + *(.after) ++ *(.ARM.extab*) + *(.glue_7) + *(.v4_bx) + } =0 ++ .ARM.exidx : { *(.ARM.exidx*) } + . = 0x9000; + .got : { *(.got) *(.got.plt)} + . = 0x12340000; +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-arm-target.s +@@ -0,0 +1,9 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .text ++ .arm ++ .align 3 ++ .global targetfn ++ .type targetfn, %function ++targetfn: ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-b-rel-arm.d +@@ -0,0 +1,85 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: e12fff1e bx lr ++ 8f04: e320f000 nop \{0\} ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f000 b87f b\.w 9010 <__targetfn_from_thumb> ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f000 b87b b\.w 9010 <__targetfn_from_thumb> ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f000 b877 b\.w 9010 <__targetfn_from_thumb> ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f000 b873 b\.w 9010 <__targetfn_from_thumb> ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f000 b86f b\.w 9010 <__targetfn_from_thumb> ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f000 b86b b\.w 9010 <__targetfn_from_thumb> ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f000 b867 b\.w 9010 <__targetfn_from_thumb> ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f000 b863 b\.w 9010 <__targetfn_from_thumb> ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f000 b85f b\.w 9010 <__targetfn_from_thumb> ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f000 b85b b\.w 9010 <__targetfn_from_thumb> ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f000 b857 b\.w 9010 <__targetfn_from_thumb> ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f000 b853 b\.w 9010 <__targetfn_from_thumb> ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f000 b84f b\.w 9010 <__targetfn_from_thumb> ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f000 b84b b\.w 9010 <__targetfn_from_thumb> ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f000 b847 b\.w 9010 <__targetfn_from_thumb> ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f000 b843 b\.w 9010 <__targetfn_from_thumb> ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f000 b83f b\.w 9010 <__targetfn_from_thumb> ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f000 b83b b\.w 9010 <__targetfn_from_thumb> ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f000 b837 b\.w 9010 <__targetfn_from_thumb> ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f000 b833 b\.w 9010 <__targetfn_from_thumb> ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f000 b82f b\.w 9010 <__targetfn_from_thumb> ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f000 b82b b\.w 9010 <__targetfn_from_thumb> ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f000 b827 b\.w 9010 <__targetfn_from_thumb> ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f000 b823 b\.w 9010 <__targetfn_from_thumb> ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f000 b81f b\.w 9010 <__targetfn_from_thumb> ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f000 b81b b\.w 9010 <__targetfn_from_thumb> ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f000 b817 b\.w 9010 <__targetfn_from_thumb> ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f000 b813 b\.w 9010 <__targetfn_from_thumb> ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f000 b80f b\.w 9010 <__targetfn_from_thumb> ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f000 b80b b\.w 9010 <__targetfn_from_thumb> ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 b807 b\.w 9010 <__targetfn_from_thumb> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f000 b803 b\.w 9010 <__targetfn_from_thumb> ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ ++00009010 <__targetfn_from_thumb>: ++ 9010: 4778 bx pc ++ 9012: 46c0 nop \(mov r8, r8\) ++ ++00009014 <__targetfn_change_to_arm>: ++ 9014: eaffffb9 b 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-b-rel-thumb.d +@@ -0,0 +1,80 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: 4770 bx lr ++ 8f02: bf00 nop ++ 8f04: f3af 8000 nop\.w ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff bff7 b\.w 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff bff3 b\.w 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff bfef b\.w 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff bfeb b\.w 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff bfe7 b\.w 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff bfe3 b\.w 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff bfdf b\.w 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff bfdb b\.w 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff bfd7 b\.w 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff bfd3 b\.w 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff bfcf b\.w 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff bfcb b\.w 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff bfc7 b\.w 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff bfc3 b\.w 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff bfbf b\.w 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff bfbb b\.w 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff bfb7 b\.w 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff bfb3 b\.w 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff bfaf b\.w 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff bfab b\.w 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff bfa7 b\.w 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff bfa3 b\.w 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff bf9f b\.w 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff bf9b b\.w 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff bf97 b\.w 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff bf93 b\.w 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff bf8f b\.w 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff bf8b b\.w 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff bf87 b\.w 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff bf83 b\.w 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 b807 b\.w 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff bf7b b\.w 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: f7ff bf76 b\.w 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-b-rel.s +@@ -0,0 +1,41 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ b.w targetfn ++ add.w r0, r1, r2 ++ b.w targetfn ++ add.w r0, r1, r2 ++ b.w targetfn ++ add.w r0, r1, r2 ++ b.w targetfn ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ @ If branching to an ARM destination, we *don't* want to create a ++ @ Cortex-A8 stub: the Thumb-to-ARM stub will suffice (and we need it ++ @ to change mode). ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-b.d +@@ -0,0 +1,75 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 <_start>: ++ 8f00: bf00 nop ++ 8f02: eb01 0002 add\.w r0, r1, r2 ++ 8f06: f7ff bffc b\.w 8f02 <_start\+0x2> ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff bff8 b\.w 8f02 <_start\+0x2> ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff bff4 b\.w 8f02 <_start\+0x2> ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff bff0 b\.w 8f02 <_start\+0x2> ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff bffc b\.w 8f22 <_start\+0x22> ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff bff8 b\.w 8f22 <_start\+0x22> ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff bff4 b\.w 8f22 <_start\+0x22> ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff bff0 b\.w 8f22 <_start\+0x22> ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff bffc b\.w 8f42 <_start\+0x42> ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff bff8 b\.w 8f42 <_start\+0x42> ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff bff4 b\.w 8f42 <_start\+0x42> ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff bff0 b\.w 8f42 <_start\+0x42> ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff bffc b\.w 8f62 <_start\+0x62> ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff bff8 b\.w 8f62 <_start\+0x62> ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff bff4 b\.w 8f62 <_start\+0x62> ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff bff0 b\.w 8f62 <_start\+0x62> ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff bffc b\.w 8f82 <_start\+0x82> ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff bff8 b\.w 8f82 <_start\+0x82> ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff bff4 b\.w 8f82 <_start\+0x82> ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff bff0 b\.w 8f82 <_start\+0x82> ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff bffc b\.w 8fa2 <_start\+0xa2> ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff bff8 b\.w 8fa2 <_start\+0xa2> ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff bff4 b\.w 8fa2 <_start\+0xa2> ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff bff0 b\.w 8fa2 <_start\+0xa2> ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff bffc b\.w 8fc2 <_start\+0xc2> ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff bff8 b\.w 8fc2 <_start\+0xc2> ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff bff4 b\.w 8fc2 <_start\+0xc2> ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff bff0 b\.w 8fc2 <_start\+0xc2> ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff bffc b\.w 8fe2 <_start\+0xe2> ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff bff8 b\.w 8fe2 <_start\+0xe2> ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff bff4 b\.w 8fe2 <_start\+0xe2> ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 b803 b\.w 9008 <_start\+0x108> ++ 9002: 4770 bx lr ++ 9004: f3af 8000 nop\.w ++ 9008: f7ff bfeb b\.w 8fe2 <_start\+0xe2> +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-b.s +@@ -0,0 +1,39 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ b.w 1b ++ add.w r0, r1, r2 ++ b.w 1b ++ add.w r0, r1, r2 ++ b.w 1b ++ add.w r0, r1, r2 ++ b.w 1b ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ @ Trigger Cortex-A8 erratum workaround with b instructions. ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bcc-rel-thumb.d +@@ -0,0 +1,82 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: 4770 bx lr ++ 8f02: bf00 nop ++ 8f04: f3af 8000 nop\.w ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f53f aff7 bmi\.w 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f53f aff3 bmi\.w 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f53f afef bmi\.w 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f53f afeb bmi\.w 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f53f afe7 bmi\.w 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f53f afe3 bmi\.w 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f53f afdf bmi\.w 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f53f afdb bmi\.w 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f53f afd7 bmi\.w 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f53f afd3 bmi\.w 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f53f afcf bmi\.w 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f53f afcb bmi\.w 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f53f afc7 bmi\.w 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f53f afc3 bmi\.w 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f53f afbf bmi\.w 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f53f afbb bmi\.w 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f53f afb7 bmi\.w 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f53f afb3 bmi\.w 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f53f afaf bmi\.w 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f53f afab bmi\.w 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f53f afa7 bmi\.w 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f53f afa3 bmi\.w 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f53f af9f bmi\.w 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f53f af9b bmi\.w 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f53f af97 bmi\.w 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f53f af93 bmi\.w 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f53f af8f bmi\.w 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f53f af8b bmi\.w 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f53f af87 bmi\.w 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f53f af83 bmi\.w 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 b807 b\.w 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f53f af7b bmi\.w 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: d401 bmi\.n 9016 <_start\+0x10e> ++ 9012: f7ff bff6 b\.w 9002 <_start\+0xfa> ++ 9016: f7ff bf73 b\.w 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bcc-rel.s +@@ -0,0 +1,38 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ bmi.w targetfn ++ add.w r0, r1, r2 ++ bmi.w targetfn ++ add.w r0, r1, r2 ++ bmi.w targetfn ++ add.w r0, r1, r2 ++ bmi.w targetfn ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bcc.d +@@ -0,0 +1,77 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 <_start>: ++ 8f00: bf00 nop ++ 8f02: eb01 0002 add\.w r0, r1, r2 ++ 8f06: f4ff affc bcc\.w 8f02 <_start\+0x2> ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f4ff aff8 bcc\.w 8f02 <_start\+0x2> ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f4ff aff4 bcc\.w 8f02 <_start\+0x2> ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f4ff aff0 bcc\.w 8f02 <_start\+0x2> ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f4ff affc bcc\.w 8f22 <_start\+0x22> ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f4ff aff8 bcc\.w 8f22 <_start\+0x22> ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f4ff aff4 bcc\.w 8f22 <_start\+0x22> ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f4ff aff0 bcc\.w 8f22 <_start\+0x22> ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f4ff affc bcc\.w 8f42 <_start\+0x42> ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f4ff aff8 bcc\.w 8f42 <_start\+0x42> ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f4ff aff4 bcc\.w 8f42 <_start\+0x42> ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f4ff aff0 bcc\.w 8f42 <_start\+0x42> ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f4ff affc bcc\.w 8f62 <_start\+0x62> ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f4ff aff8 bcc\.w 8f62 <_start\+0x62> ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f4ff aff4 bcc\.w 8f62 <_start\+0x62> ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f4ff aff0 bcc\.w 8f62 <_start\+0x62> ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f4ff affc bcc\.w 8f82 <_start\+0x82> ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f4ff aff8 bcc\.w 8f82 <_start\+0x82> ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f4ff aff4 bcc\.w 8f82 <_start\+0x82> ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f4ff aff0 bcc\.w 8f82 <_start\+0x82> ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f4ff affc bcc\.w 8fa2 <_start\+0xa2> ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f4ff aff8 bcc\.w 8fa2 <_start\+0xa2> ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f4ff aff4 bcc\.w 8fa2 <_start\+0xa2> ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f4ff aff0 bcc\.w 8fa2 <_start\+0xa2> ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f4ff affc bcc\.w 8fc2 <_start\+0xc2> ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f4ff aff8 bcc\.w 8fc2 <_start\+0xc2> ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f4ff aff4 bcc\.w 8fc2 <_start\+0xc2> ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f4ff aff0 bcc\.w 8fc2 <_start\+0xc2> ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f4ff affc bcc\.w 8fe2 <_start\+0xe2> ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f4ff aff8 bcc\.w 8fe2 <_start\+0xe2> ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f4ff aff4 bcc\.w 8fe2 <_start\+0xe2> ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 b803 b\.w 9008 <_start\+0x108> ++ 9002: 4770 bx lr ++ 9004: f3af 8000 nop\.w ++ 9008: d301 bcc\.n 900e <_start\+0x10e> ++ 900a: f7ff bffa b\.w 9002 <_start\+0x102> ++ 900e: f7ff bfe8 b\.w 8fe2 <_start\+0xe2> +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bcc.s +@@ -0,0 +1,39 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ bcc.w 1b ++ add.w r0, r1, r2 ++ bcc.w 1b ++ add.w r0, r1, r2 ++ bcc.w 1b ++ add.w r0, r1, r2 ++ bcc.w 1b ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ @ Trigger Cortex-A8 erratum workaround with conditional branches. ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bl-rel-arm.d +@@ -0,0 +1,79 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: e12fff1e bx lr ++ 8f04: e320f000 nop \{0\} ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff eff8 blx 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff eff4 blx 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff eff0 blx 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff efec blx 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff efe8 blx 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff efe4 blx 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff efe0 blx 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff efdc blx 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff efd8 blx 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff efd4 blx 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff efd0 blx 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff efcc blx 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff efc8 blx 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff efc4 blx 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff efc0 blx 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff efbc blx 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff efb8 blx 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff efb4 blx 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff efb0 blx 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff efac blx 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff efa8 blx 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff efa4 blx 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff efa0 blx 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff ef9c blx 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff ef98 blx 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff ef94 blx 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff ef90 blx 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff ef8c blx 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff ef88 blx 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff ef84 blx 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 e808 blx 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff ef7c blx 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: eaffffba b 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bl-rel-thumb.d +@@ -0,0 +1,80 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: 4770 bx lr ++ 8f02: bf00 nop ++ 8f04: f3af 8000 nop\.w ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff fff7 bl 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff fff3 bl 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff ffef bl 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff ffeb bl 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff ffe7 bl 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff ffe3 bl 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff ffdf bl 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff ffdb bl 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff ffd7 bl 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff ffd3 bl 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff ffcf bl 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff ffcb bl 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff ffc7 bl 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff ffc3 bl 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff ffbf bl 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff ffbb bl 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff ffb7 bl 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff ffb3 bl 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff ffaf bl 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff ffab bl 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff ffa7 bl 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff ffa3 bl 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff ff9f bl 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff ff9b bl 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff ff97 bl 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff ff93 bl 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff ff8f bl 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff ff8b bl 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff ff87 bl 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff ff83 bl 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 f807 bl 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff ff7b bl 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: f7ff bf76 b\.w 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bl-rel.s +@@ -0,0 +1,40 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ bl.w targetfn ++ add.w r0, r1, r2 ++ bl.w targetfn ++ add.w r0, r1, r2 ++ bl.w targetfn ++ add.w r0, r1, r2 ++ bl.w targetfn ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ @ If calling an ARM destination, we *don't* want to create a ++ @ Cortex-A8 stub: the Thumb-to-ARM stub will suffice. ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bl.d +@@ -0,0 +1,75 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 <_start>: ++ 8f00: bf00 nop ++ 8f02: eb01 0002 add\.w r0, r1, r2 ++ 8f06: f7ff fffc bl 8f02 <_start\+0x2> ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff fff8 bl 8f02 <_start\+0x2> ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff fff4 bl 8f02 <_start\+0x2> ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff fff0 bl 8f02 <_start\+0x2> ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff fffc bl 8f22 <_start\+0x22> ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff fff8 bl 8f22 <_start\+0x22> ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff fff4 bl 8f22 <_start\+0x22> ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff fff0 bl 8f22 <_start\+0x22> ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff fffc bl 8f42 <_start\+0x42> ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff fff8 bl 8f42 <_start\+0x42> ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff fff4 bl 8f42 <_start\+0x42> ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff fff0 bl 8f42 <_start\+0x42> ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff fffc bl 8f62 <_start\+0x62> ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff fff8 bl 8f62 <_start\+0x62> ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff fff4 bl 8f62 <_start\+0x62> ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff fff0 bl 8f62 <_start\+0x62> ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff fffc bl 8f82 <_start\+0x82> ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff fff8 bl 8f82 <_start\+0x82> ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff fff4 bl 8f82 <_start\+0x82> ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff fff0 bl 8f82 <_start\+0x82> ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff fffc bl 8fa2 <_start\+0xa2> ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff fff8 bl 8fa2 <_start\+0xa2> ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff fff4 bl 8fa2 <_start\+0xa2> ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff fff0 bl 8fa2 <_start\+0xa2> ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff fffc bl 8fc2 <_start\+0xc2> ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff fff8 bl 8fc2 <_start\+0xc2> ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff fff4 bl 8fc2 <_start\+0xc2> ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff fff0 bl 8fc2 <_start\+0xc2> ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff fffc bl 8fe2 <_start\+0xe2> ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff fff8 bl 8fe2 <_start\+0xe2> ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff fff4 bl 8fe2 <_start\+0xe2> ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 f803 bl 9008 <_start\+0x108> ++ 9002: 4770 bx lr ++ 9004: f3af 8000 nop\.w ++ 9008: f7ff bfeb b\.w 8fe2 <_start\+0xe2> +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-bl.s +@@ -0,0 +1,39 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ bl.w 1b ++ add.w r0, r1, r2 ++ bl.w 1b ++ add.w r0, r1, r2 ++ bl.w 1b ++ add.w r0, r1, r2 ++ bl.w 1b ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ @ Trigger Cortex-A8 erratum workaround with bl instructions. ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-blx-rel-arm.d +@@ -0,0 +1,79 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: e12fff1e bx lr ++ 8f04: e320f000 nop \{0\} ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff eff8 blx 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff eff4 blx 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff eff0 blx 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff efec blx 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff efe8 blx 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff efe4 blx 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff efe0 blx 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff efdc blx 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff efd8 blx 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff efd4 blx 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff efd0 blx 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff efcc blx 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff efc8 blx 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff efc4 blx 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff efc0 blx 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff efbc blx 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff efb8 blx 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff efb4 blx 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff efb0 blx 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff efac blx 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff efa8 blx 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff efa4 blx 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff efa0 blx 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff ef9c blx 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff ef98 blx 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff ef94 blx 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff ef90 blx 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff ef8c blx 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff ef88 blx 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff ef84 blx 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 e808 blx 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff ef7c blx 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: eaffffba b 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-blx-rel-thumb.d +@@ -0,0 +1,80 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: 4770 bx lr ++ 8f02: bf00 nop ++ 8f04: f3af 8000 nop\.w ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff fff7 bl 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff fff3 bl 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff ffef bl 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff ffeb bl 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff ffe7 bl 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff ffe3 bl 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff ffdf bl 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff ffdb bl 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff ffd7 bl 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff ffd3 bl 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff ffcf bl 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff ffcb bl 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff ffc7 bl 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff ffc3 bl 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff ffbf bl 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff ffbb bl 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff ffb7 bl 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff ffb3 bl 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff ffaf bl 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff ffab bl 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff ffa7 bl 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff ffa3 bl 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff ff9f bl 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff ff9b bl 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff ff97 bl 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff ff93 bl 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff ff8f bl 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff ff8b bl 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff ff87 bl 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff ff83 bl 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 f807 bl 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff ff7b bl 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: f7ff bf76 b\.w 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-blx-rel.s +@@ -0,0 +1,38 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .thumb ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++1: ++ add.w r0, r1, r2 ++ blx.w targetfn ++ add.w r0, r1, r2 ++ blx.w targetfn ++ add.w r0, r1, r2 ++ blx.w targetfn ++ add.w r0, r1, r2 ++ blx.w targetfn ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .align 3 ++ .global _start ++ .thumb ++ .thumb_func ++ .type _start, %function ++_start: ++ nop ++ ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-blx.d +@@ -0,0 +1,79 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008f00 : ++ 8f00: e1a02413 lsl r2, r3, r4 ++ 8f04: e12fff1e bx lr ++ ++00008f08 <_start>: ++ 8f08: bf00 nop ++ 8f0a: eb01 0002 add\.w r0, r1, r2 ++ 8f0e: f7ff eff8 blx 8f00 ++ 8f12: eb01 0002 add\.w r0, r1, r2 ++ 8f16: f7ff eff4 blx 8f00 ++ 8f1a: eb01 0002 add\.w r0, r1, r2 ++ 8f1e: f7ff eff0 blx 8f00 ++ 8f22: eb01 0002 add\.w r0, r1, r2 ++ 8f26: f7ff efec blx 8f00 ++ 8f2a: eb01 0002 add\.w r0, r1, r2 ++ 8f2e: f7ff efe8 blx 8f00 ++ 8f32: eb01 0002 add\.w r0, r1, r2 ++ 8f36: f7ff efe4 blx 8f00 ++ 8f3a: eb01 0002 add\.w r0, r1, r2 ++ 8f3e: f7ff efe0 blx 8f00 ++ 8f42: eb01 0002 add\.w r0, r1, r2 ++ 8f46: f7ff efdc blx 8f00 ++ 8f4a: eb01 0002 add\.w r0, r1, r2 ++ 8f4e: f7ff efd8 blx 8f00 ++ 8f52: eb01 0002 add\.w r0, r1, r2 ++ 8f56: f7ff efd4 blx 8f00 ++ 8f5a: eb01 0002 add\.w r0, r1, r2 ++ 8f5e: f7ff efd0 blx 8f00 ++ 8f62: eb01 0002 add\.w r0, r1, r2 ++ 8f66: f7ff efcc blx 8f00 ++ 8f6a: eb01 0002 add\.w r0, r1, r2 ++ 8f6e: f7ff efc8 blx 8f00 ++ 8f72: eb01 0002 add\.w r0, r1, r2 ++ 8f76: f7ff efc4 blx 8f00 ++ 8f7a: eb01 0002 add\.w r0, r1, r2 ++ 8f7e: f7ff efc0 blx 8f00 ++ 8f82: eb01 0002 add\.w r0, r1, r2 ++ 8f86: f7ff efbc blx 8f00 ++ 8f8a: eb01 0002 add\.w r0, r1, r2 ++ 8f8e: f7ff efb8 blx 8f00 ++ 8f92: eb01 0002 add\.w r0, r1, r2 ++ 8f96: f7ff efb4 blx 8f00 ++ 8f9a: eb01 0002 add\.w r0, r1, r2 ++ 8f9e: f7ff efb0 blx 8f00 ++ 8fa2: eb01 0002 add\.w r0, r1, r2 ++ 8fa6: f7ff efac blx 8f00 ++ 8faa: eb01 0002 add\.w r0, r1, r2 ++ 8fae: f7ff efa8 blx 8f00 ++ 8fb2: eb01 0002 add\.w r0, r1, r2 ++ 8fb6: f7ff efa4 blx 8f00 ++ 8fba: eb01 0002 add\.w r0, r1, r2 ++ 8fbe: f7ff efa0 blx 8f00 ++ 8fc2: eb01 0002 add\.w r0, r1, r2 ++ 8fc6: f7ff ef9c blx 8f00 ++ 8fca: eb01 0002 add\.w r0, r1, r2 ++ 8fce: f7ff ef98 blx 8f00 ++ 8fd2: eb01 0002 add\.w r0, r1, r2 ++ 8fd6: f7ff ef94 blx 8f00 ++ 8fda: eb01 0002 add\.w r0, r1, r2 ++ 8fde: f7ff ef90 blx 8f00 ++ 8fe2: eb01 0002 add\.w r0, r1, r2 ++ 8fe6: f7ff ef8c blx 8f00 ++ 8fea: eb01 0002 add\.w r0, r1, r2 ++ 8fee: f7ff ef88 blx 8f00 ++ 8ff2: eb01 0002 add\.w r0, r1, r2 ++ 8ff6: f7ff ef84 blx 8f00 ++ 8ffa: eb01 0002 add\.w r0, r1, r2 ++ 8ffe: f000 e808 blx 9010 <_start\+0x108> ++ 9002: eb01 0002 add\.w r0, r1, r2 ++ 9006: f7ff ef7c blx 8f00 ++ 900a: 4770 bx lr ++ 900c: f3af 8000 nop\.w ++ 9010: eaffffba b 8f00 +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-fix-blx.s +@@ -0,0 +1,44 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .text ++ ++ @ expansion 32 bytes ++ .macro bw1 ++ add.w r0, r1, r2 ++ blx.w armfn ++ add.w r0, r1, r2 ++ blx.w armfn ++ add.w r0, r1, r2 ++ blx.w armfn ++ add.w r0, r1, r2 ++ blx.w armfn ++ .endm ++ ++ @ expansion 128 bytes ++ .macro bw2 ++ bw1 ++ bw1 ++ bw1 ++ bw1 ++ .endm ++ ++ .arm ++ .align 2 ++armfn: ++ mov r2, r3, asl r4 ++ bx lr ++ ++ .global _start ++ ++ .thumb ++ .thumb_func ++ .align 3 ++ .type _start, %function ++_start: ++ nop ++ ++ @ Trigger Cortex-A8 erratum workaround with blx instructions. ++ bw2 ++ bw2 ++ ++ bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/cortex-a8-thumb-target.s +@@ -0,0 +1,10 @@ ++ .syntax unified ++ .cpu cortex-a8 ++ .text ++ .thumb ++ .thumb_func ++ .align 3 ++ .global targetfn ++ .type targetfn, %function ++targetfn: ++ bx lr +--- a/ld/testsuite/ld-arm/farcall-arm-arm-be8.d ++++ b/ld/testsuite/ld-arm/farcall-arm-arm-be8.d +@@ -2,13 +2,14 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: 04f01fe5 .* +- 1004: 02001020 .word 0x02001020 ++00001000 <_start>: ++ 1000: 000000eb bl 1008 <__bar_veneer> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001008 <_start>: +- 1008: fcffffeb .* ++00001008 <__bar_veneer>: ++ 1008: 04f01fe5 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> ++ 100c: 02001020 .word 0x02001020 + Disassembly of section .foo: + + 02001020 : +- 2001020: 1eff2fe1 .* ++ 2001020: 1eff2fe1 bx lr +--- a/ld/testsuite/ld-arm/farcall-arm-arm-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-arm-arm-pic-veneer.d +@@ -2,14 +2,15 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_veneer\+0x8> +- 1004: e08ff00c add pc, pc, ip +- 1008: 02000018 .word 0x02000018 +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_veneer> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001010 <_start>: +- 1010: ebfffffa bl 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_veneer\+0x8> ++ 100c: e08ff00c add pc, pc, ip ++ 1010: 0200000c .word 0x0200000c ++ 1014: 00000000 .word 0x00000000 + Disassembly of section .foo: + + 02001020 : +--- a/ld/testsuite/ld-arm/farcall-arm-arm.d ++++ b/ld/testsuite/ld-arm/farcall-arm-arm.d +@@ -2,12 +2,13 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_veneer\+0x4> +- 1004: 02001020 .word 0x02001020 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_veneer> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001008 <_start>: +- 1008: ebfffffc bl 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> ++ 100c: 02001020 .word 0x02001020 + Disassembly of section .foo: + + 02001020 : +--- a/ld/testsuite/ld-arm/farcall-arm-thumb-blx-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-arm-thumb-blx-pic-veneer.d +@@ -2,14 +2,15 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_arm>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_from_arm\+0x8> +- 1004: e08ff00c add pc, pc, ip +- 1008: 0200000d .word 0x0200000d +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001010 <_start>: +- 1010: ebfffffa bl 1000 <__bar_from_arm> ++00001008 <__bar_from_arm>: ++ 1008: e59fc004 ldr ip, \[pc, #4\] ; 1014 <__bar_from_arm\+0xc> ++ 100c: e08fc00c add ip, pc, ip ++ 1010: e12fff1c bx ip ++ 1014: 02000001 .word 0x02000001 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-arm-thumb-blx.d ++++ b/ld/testsuite/ld-arm/farcall-arm-thumb-blx.d +@@ -2,12 +2,13 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_arm>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_from_arm\+0x4> +- 1004: 02001015 .word 0x02001015 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001008 <_start>: +- 1008: ebfffffc bl 1000 <__bar_from_arm> ++00001008 <__bar_from_arm>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_from_arm\+0x4> ++ 100c: 02001015 .word 0x02001015 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-arm-thumb-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-arm-thumb-pic-veneer.d +@@ -2,14 +2,15 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_arm>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_from_arm\+0x8> +- 1004: e08ff00c add pc, pc, ip +- 1008: 0200000d .word 0x0200000d +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001010 <_start>: +- 1010: ebfffffa bl 1000 <__bar_from_arm> ++00001008 <__bar_from_arm>: ++ 1008: e59fc004 ldr ip, \[pc, #4\] ; 1014 <__bar_from_arm\+0xc> ++ 100c: e08fc00c add ip, pc, ip ++ 1010: e12fff1c bx ip ++ 1014: 02000001 .word 0x02000001 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-arm-thumb.d ++++ b/ld/testsuite/ld-arm/farcall-arm-thumb.d +@@ -2,14 +2,15 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_arm>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_from_arm\+0x8> +- 1004: e12fff1c bx ip +- 1008: 02001015 .word 0x02001015 +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: 00000000 andeq r0, r0, r0 + +-00001010 <_start>: +- 1010: ebfffffa bl 1000 <__bar_from_arm> ++00001008 <__bar_from_arm>: ++ 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_arm\+0x8> ++ 100c: e12fff1c bx ip ++ 1010: 02001015 .word 0x02001015 ++ 1014: 00000000 .word 0x00000000 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-group-size2.d ++++ b/ld/testsuite/ld-arm/farcall-group-size2.d +@@ -3,35 +3,35 @@ + + Disassembly of section .text: + +-00001000 <__bar2_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar2_veneer\+0x4> +- 1004: 02003024 .word 0x02003024 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: eb000002 bl 1014 <__bar2_veneer> + 00001008 <__bar_from_arm>: + 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_arm\+0x8> + 100c: e12fff1c bx ip + 1010: 02003021 .word 0x02003021 +- 1014: 00000000 .word 0x00000000 +- +-00001018 <_start>: +- 1018: ebfffffa bl 1008 <__bar_from_arm> +- 101c: ebfffff7 bl 1000 <__bar2_veneer> +-00001020 <__bar3_veneer>: +- 1020: e51ff004 ldr pc, \[pc, #-4\] ; 1024 <__bar3_veneer\+0x4> +- 1024: 02003028 .word 0x02003028 +-00001028 <__bar5_from_arm>: +- 1028: e59fc000 ldr ip, \[pc, #0\] ; 1030 <__bar5_from_arm\+0x8> +- 102c: e12fff1c bx ip +- 1030: 0200302f .word 0x0200302f +-00001034 <__bar4_from_arm>: +- 1034: e59fc000 ldr ip, \[pc, #0\] ; 103c <__bar4_from_arm\+0x8> +- 1038: e12fff1c bx ip +- 103c: 0200302d .word 0x0200302d ++00001014 <__bar2_veneer>: ++ 1014: e51ff004 ldr pc, \[pc, #-4\] ; 1018 <__bar2_veneer\+0x4> ++ 1018: 02003024 .word 0x02003024 ++ 101c: 00000000 .word 0x00000000 ++00001020 : ++ 1020: eb000008 bl 1048 <__bar3_veneer> ++ 1024: eb000004 bl 103c <__bar4_from_arm> ++ 1028: eb000000 bl 1030 <__bar5_from_arm> ++ 102c: 00000000 andeq r0, r0, r0 ++00001030 <__bar5_from_arm>: ++ 1030: e59fc000 ldr ip, \[pc, #0\] ; 1038 <__bar5_from_arm\+0x8> ++ 1034: e12fff1c bx ip ++ 1038: 0200302f .word 0x0200302f ++0000103c <__bar4_from_arm>: ++ 103c: e59fc000 ldr ip, \[pc, #0\] ; 1044 <__bar4_from_arm\+0x8> ++ 1040: e12fff1c bx ip ++ 1044: 0200302d .word 0x0200302d ++00001048 <__bar3_veneer>: ++ 1048: e51ff004 ldr pc, \[pc, #-4\] ; 104c <__bar3_veneer\+0x4> ++ 104c: 02003028 .word 0x02003028 + ... + +-00001048 : +- 1048: ebfffff4 bl 1020 <__bar3_veneer> +- 104c: ebfffff8 bl 1034 <__bar4_from_arm> +- 1050: ebfffff4 bl 1028 <__bar5_from_arm> + Disassembly of section .foo: + + 02003020 : +--- a/ld/testsuite/ld-arm/farcall-group.d ++++ b/ld/testsuite/ld-arm/farcall-group.d +@@ -3,34 +3,35 @@ + + Disassembly of section .text: + +-00001000 <__bar2_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar2_veneer\+0x4> +- 1004: 02003024 .word 0x02003024 +-00001008 <__bar_from_arm>: +- 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_arm\+0x8> +- 100c: e12fff1c bx ip +- 1010: 02003021 .word 0x02003021 +-00001014 <__bar3_veneer>: +- 1014: e51ff004 ldr pc, \[pc, #-4\] ; 1018 <__bar3_veneer\+0x4> +- 1018: 02003028 .word 0x02003028 +-0000101c <__bar4_from_arm>: +- 101c: e59fc000 ldr ip, \[pc, #0\] ; 1024 <__bar4_from_arm\+0x8> +- 1020: e12fff1c bx ip +- 1024: 0200302d .word 0x0200302d +-00001028 <__bar5_from_arm>: +- 1028: e59fc000 ldr ip, \[pc, #0\] ; 1030 <__bar5_from_arm\+0x8> +- 102c: e12fff1c bx ip +- 1030: 0200302f .word 0x0200302f ++00001000 <_start>: ++ 1000: eb00000c bl 1038 <__bar_from_arm> ++ 1004: eb00000e bl 1044 <__bar2_veneer> ++ ++00001008 : ++ 1008: eb000008 bl 1030 <__bar3_veneer> ++ 100c: eb000004 bl 1024 <__bar4_from_arm> ++ 1010: eb000000 bl 1018 <__bar5_from_arm> ++ 1014: 00000000 andeq r0, r0, r0 ++ ++00001018 <__bar5_from_arm>: ++ 1018: e59fc000 ldr ip, \[pc, #0\] ; 1020 <__bar5_from_arm\+0x8> ++ 101c: e12fff1c bx ip ++ 1020: 0200302f .word 0x0200302f ++00001024 <__bar4_from_arm>: ++ 1024: e59fc000 ldr ip, \[pc, #0\] ; 102c <__bar4_from_arm\+0x8> ++ 1028: e12fff1c bx ip ++ 102c: 0200302d .word 0x0200302d ++00001030 <__bar3_veneer>: ++ 1030: e51ff004 ldr pc, \[pc, #-4\] ; 1034 <__bar3_veneer\+0x4> ++ 1034: 02003028 .word 0x02003028 ++00001038 <__bar_from_arm>: ++ 1038: e59fc000 ldr ip, \[pc, #0\] ; 1040 <__bar_from_arm\+0x8> ++ 103c: e12fff1c bx ip ++ 1040: 02003021 .word 0x02003021 ++00001044 <__bar2_veneer>: ++ 1044: e51ff004 ldr pc, \[pc, #-4\] ; 1048 <__bar2_veneer\+0x4> ++ 1048: 02003024 .word 0x02003024 + ... +- +-00001040 <_start>: +- 1040: ebfffff0 bl 1008 <__bar_from_arm> +- 1044: ebffffed bl 1000 <__bar2_veneer> +- +-00001048 : +- 1048: ebfffff1 bl 1014 <__bar3_veneer> +- 104c: ebfffff2 bl 101c <__bar4_from_arm> +- 1050: ebfffff4 bl 1028 <__bar5_from_arm> + Disassembly of section .foo: + + 02003020 : +--- a/ld/testsuite/ld-arm/farcall-mix.d ++++ b/ld/testsuite/ld-arm/farcall-mix.d +@@ -3,32 +3,33 @@ + + Disassembly of section .text: + +-00001000 <__bar2_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar2_veneer\+0x4> +- 1004: 02002024 .word 0x02002024 +-00001008 <__bar_from_arm>: +- 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_arm\+0x8> +- 100c: e12fff1c bx ip +- 1010: 02002021 .word 0x02002021 +-00001014 <__bar3_veneer>: +- 1014: e51ff004 ldr pc, \[pc, #-4\] ; 1018 <__bar3_veneer\+0x4> +- 1018: 02002028 .word 0x02002028 +-0000101c <__bar4_from_arm>: +- 101c: e59fc000 ldr ip, \[pc, #0\] ; 1024 <__bar4_from_arm\+0x8> +- 1020: e12fff1c bx ip +- 1024: 0200202d .word 0x0200202d +-00001028 <__bar5_from_arm>: +- 1028: e59fc000 ldr ip, \[pc, #0\] ; 1030 <__bar5_from_arm\+0x8> +- 102c: e12fff1c bx ip +- 1030: 0200202f .word 0x0200202f ++00001000 <_start>: ++ 1000: eb000009 bl 102c <__bar_from_arm> ++ 1004: eb00000b bl 1038 <__bar2_veneer> ++ 1008: eb000005 bl 1024 <__bar3_veneer> ++ 100c: eb00000b bl 1040 <__bar4_from_arm> ++ 1010: eb000000 bl 1018 <__bar5_from_arm> ++ 1014: 00000000 andeq r0, r0, r0 ++ ++00001018 <__bar5_from_arm>: ++ 1018: e59fc000 ldr ip, \[pc, #0\] ; 1020 <__bar5_from_arm\+0x8> ++ 101c: e12fff1c bx ip ++ 1020: 0200202f .word 0x0200202f ++00001024 <__bar3_veneer>: ++ 1024: e51ff004 ldr pc, \[pc, #-4\] ; 1028 <__bar3_veneer\+0x4> ++ 1028: 02002028 .word 0x02002028 ++0000102c <__bar_from_arm>: ++ 102c: e59fc000 ldr ip, \[pc, #0\] ; 1034 <__bar_from_arm\+0x8> ++ 1030: e12fff1c bx ip ++ 1034: 02002021 .word 0x02002021 ++00001038 <__bar2_veneer>: ++ 1038: e51ff004 ldr pc, \[pc, #-4\] ; 103c <__bar2_veneer\+0x4> ++ 103c: 02002024 .word 0x02002024 ++00001040 <__bar4_from_arm>: ++ 1040: e59fc000 ldr ip, \[pc, #0\] ; 1048 <__bar4_from_arm\+0x8> ++ 1044: e12fff1c bx ip ++ 1048: 0200202d .word 0x0200202d + ... +- +-00001040 <_start>: +- 1040: ebfffff0 bl 1008 <__bar_from_arm> +- 1044: ebffffed bl 1000 <__bar2_veneer> +- 1048: ebfffff1 bl 1014 <__bar3_veneer> +- 104c: ebfffff2 bl 101c <__bar4_from_arm> +- 1050: ebfffff4 bl 1028 <__bar5_from_arm> + Disassembly of section .foo: + + 02002020 : +--- a/ld/testsuite/ld-arm/farcall-mix2.d ++++ b/ld/testsuite/ld-arm/farcall-mix2.d +@@ -3,35 +3,37 @@ + + Disassembly of section .text: + +-00001000 <__bar2_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar2_veneer\+0x4> +- 1004: 02003024 .word 0x02003024 ++00001000 <_start>: ++ 1000: eb000000 bl 1008 <__bar_from_arm> ++ 1004: eb000002 bl 1014 <__bar2_veneer> ++ + 00001008 <__bar_from_arm>: + 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_arm\+0x8> + 100c: e12fff1c bx ip + 1010: 02003021 .word 0x02003021 +- 1014: 00000000 .word 0x00000000 +- +-00001018 <_start>: +- 1018: ebfffffa bl 1008 <__bar_from_arm> +- 101c: ebfffff7 bl 1000 <__bar2_veneer> ++00001014 <__bar2_veneer>: ++ 1014: e51ff004 ldr pc, \[pc, #-4\] ; 1018 <__bar2_veneer\+0x4> ++ 1018: 02003024 .word 0x02003024 ++ 101c: 00000000 .word 0x00000000 + Disassembly of section .mytext: + +-00002000 <__bar5_from_arm>: +- 2000: e59fc000 ldr ip, \[pc, #0\] ; 2008 <__bar5_from_arm\+0x8> +- 2004: e12fff1c bx ip +- 2008: 0200302f .word 0x0200302f +-0000200c <__bar3_veneer>: +- 200c: e51ff004 ldr pc, \[pc, #-4\] ; 2010 <__bar3_veneer\+0x4> +- 2010: 02003028 .word 0x02003028 +-00002014 <__bar4_from_arm>: +- 2014: e59fc000 ldr ip, \[pc, #0\] ; 201c <__bar4_from_arm\+0x8> +- 2018: e12fff1c bx ip +- 201c: 0200302d .word 0x0200302d ++00002000 <__bar5_from_arm-0x10>: ++ 2000: eb000008 bl 2028 <__bar3_veneer> ++ 2004: eb000004 bl 201c <__bar4_from_arm> ++ 2008: eb000000 bl 2010 <__bar5_from_arm> ++ 200c: 00000000 andeq r0, r0, r0 ++00002010 <__bar5_from_arm>: ++ 2010: e59fc000 ldr ip, \[pc, #0\] ; 2018 <__bar5_from_arm\+0x8> ++ 2014: e12fff1c bx ip ++ 2018: 0200302f .word 0x0200302f ++0000201c <__bar4_from_arm>: ++ 201c: e59fc000 ldr ip, \[pc, #0\] ; 2024 <__bar4_from_arm\+0x8> ++ 2020: e12fff1c bx ip ++ 2024: 0200302d .word 0x0200302d ++00002028 <__bar3_veneer>: ++ 2028: e51ff004 ldr pc, \[pc, #-4\] ; 202c <__bar3_veneer\+0x4> ++ 202c: 02003028 .word 0x02003028 + ... +- 2028: ebfffff7 bl 200c <__bar3_veneer> +- 202c: ebfffff8 bl 2014 <__bar4_from_arm> +- 2030: ebfffff2 bl 2000 <__bar5_from_arm> + Disassembly of section .foo: + + 02003020 : +--- /dev/null ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm-be8.d +@@ -0,0 +1,19 @@ ++.*: file format .* ++ ++Disassembly of section .text: ++ ++00001000 <_start>: ++ 1000: 00f0 02f8 bl 1008 <__bar_from_thumb> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. ++ ++00001008 <__bar_from_thumb>: ++ 1008: 7847 bx pc ++ 100a: c046 nop.* ++ 100c: 04f01fe5 ldr pc, \[pc, #-4\] ; 1010 <__bar_from_thumb\+0x8> ++ 1010: 02001014 .word 0x02001014 ++ 1014: 00000000 .word 0x00000000 ++Disassembly of section .foo: ++ ++02001014 : ++ 2001014: 1eff2fe1 bx lr +--- a/ld/testsuite/ld-arm/farcall-thumb-arm-blx-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm-blx-pic-veneer.d +@@ -2,14 +2,16 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_thumb>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_from_thumb\+0x8> +- 1004: e08ff00c add pc, pc, ip +- 1008: 0200000c .word 0x0200000c +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_from_thumb> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001010 <_start>: +- 1010: f7ff eff6 blx 1000 <__bar_from_thumb> ++00001008 <__bar_from_thumb>: ++ 1008: e59fc000 ldr ip, \[pc, #0\] ; 1010 <__bar_from_thumb\+0x8> ++ 100c: e08ff00c add pc, pc, ip ++ 1010: 02000000 .word 0x02000000 ++ 1014: 00000000 .word 0x00000000 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-arm-blx.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm-blx.d +@@ -2,12 +2,14 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_thumb>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_from_thumb\+0x4> +- 1004: 02001014 .word 0x02001014 ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_from_thumb> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001008 <_start>: +- 1008: f7ff effa blx 1000 <__bar_from_thumb> ++00001008 <__bar_from_thumb>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_from_thumb\+0x4> ++ 100c: 02001014 .word 0x02001014 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-arm-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm-pic-veneer.d +@@ -1,5 +1,5 @@ +-#name: Thumb-Thumb farcall without BLX +-#source: farcall-thumb-thumb.s +-#as: -march=armv4t +-#ld: -Ttext 0x1000 --section-start .foo=0x2001014 ++#name: Thumb-ARM farcall without BLX (PIC veneer) ++#source: farcall-thumb-arm.s ++#as: -march=armv4t -W ++#ld: -Ttext 0x1000 --section-start .foo=0x2001014 --pic-veneer + #error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' +--- a/ld/testsuite/ld-arm/farcall-thumb-arm-short.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm-short.d +@@ -2,12 +2,15 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_thumb>: +- 1000: 4778 bx pc +- 1002: 46c0 nop \(mov r8, r8\) +- 1004: ea000402 b 2014 +-00001008 <_start>: +- 1008: f7ff fffa bl 1000 <__bar_from_thumb> ++00001000 <_start>: ++ 1000: f000 f802 bl 1008 <__bar_from_thumb> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. ++ ++00001008 <__bar_from_thumb>: ++ 1008: 4778 bx pc ++ 100a: 46c0 nop \(mov r8, r8\) ++ 100c: ea000400 b 2014 + Disassembly of section .foo: + + 00002014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-arm.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-arm.d +@@ -2,18 +2,17 @@ + + Disassembly of section .text: + +-00001000 <__bar_from_thumb>: +- 1000: b540 push {r6, lr} +- 1002: 4e03 ldr r6, \[pc, #12\] \(1010 <__bar_from_thumb\+0x10>\) +- 1004: 46fe mov lr, pc +- 1006: 4730 bx r6 +- 1008: e8bd4040 pop {r6, lr} +- 100c: e12fff1e bx lr ++00001000 <_start>: ++ 1000: f000 f802 bl 1008 <__bar_from_thumb> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. ++ ++00001008 <__bar_from_thumb>: ++ 1008: 4778 bx pc ++ 100a: 46c0 nop \(mov r8, r8\) ++ 100c: e51ff004 ldr pc, \[pc, #-4\] ; 1010 <__bar_from_thumb\+0x8> + 1010: 02001014 .word 0x02001014 + 1014: 00000000 .word 0x00000000 +- +-00001018 <_start>: +- 1018: f7ff fff2 bl 1000 <__bar_from_thumb> + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb-blx-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb-blx-pic-veneer.d +@@ -2,14 +2,16 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e59fc000 ldr ip, \[pc, #0\] ; 1008 <__bar_veneer\+0x8> +- 1004: e08ff00c add pc, pc, ip +- 1008: 0200000d .word 0x0200000d +- 100c: 00000000 .word 0x00000000 ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001010 <_start>: +- 1010: f7ff eff6 blx 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: e59fc004 ldr ip, \[pc, #4\] ; 1014 <__bar_veneer\+0xc> ++ 100c: e08fc00c add ip, pc, ip ++ 1010: e12fff1c bx ip ++ 1014: 02000001 .word 0x02000001 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb-blx.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb-blx.d +@@ -2,12 +2,14 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_veneer\+0x4> +- 1004: 02001015 .word 0x02001015 ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001008 <_start>: +- 1008: f7ff effa blx 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> ++ 100c: 02001015 .word 0x02001015 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb-m-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb-m-pic-veneer.d +@@ -1,5 +1,5 @@ +-#name: Thumb-Thumb farcall without BLX ++#name: Thumb-Thumb farcall M profile (PIC veneer) + #source: farcall-thumb-thumb.s + #as: -march=armv4t +-#ld: -Ttext 0x1000 --section-start .foo=0x2001014 ++#ld: -Ttext 0x1000 --section-start .foo=0x2001014 --pic-veneer + #error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb-m.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb-m.d +@@ -2,17 +2,19 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: b540 push {r6, lr} +- 1002: 4e02 ldr r6, \[pc, #8\] \(100c <__bar_veneer\+0xc>\) +- 1004: 46fe mov lr, pc +- 1006: 4730 bx r6 +- 1008: bd40 pop {r6, pc} +- 100a: bf00 nop +- 100c: 02001015 .word 0x02001015 ++00001000 <_start>: ++ 1000: f000 f802 bl 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001010 <_start>: +- 1010: f7ff fff6 bl 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: b401 push {r0} ++ 100a: 4802 ldr r0, \[pc, #8\] \(1014 <__bar_veneer\+0xc>\) ++ 100c: 4684 mov ip, r0 ++ 100e: bc01 pop {r0} ++ 1010: 4760 bx ip ++ 1012: bf00 nop ++ 1014: 02001015 .word 0x02001015 + Disassembly of section .foo: + + 02001014 : +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb-pic-veneer.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb-pic-veneer.d +@@ -1,5 +1,5 @@ +-#name: Thumb-Thumb farcall without BLX ++#name: Thumb-Thumb farcall without BLX (PIC veneer) + #source: farcall-thumb-thumb.s + #as: -march=armv4t +-#ld: -Ttext 0x1000 --section-start .foo=0x2001014 ++#ld: -Ttext 0x1000 --section-start .foo=0x2001014 --pic-veneer + #error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' +--- a/ld/testsuite/ld-arm/farcall-thumb-thumb.d ++++ b/ld/testsuite/ld-arm/farcall-thumb-thumb.d +@@ -1,5 +1,21 @@ +-#name: Thumb-Thumb farcall without BLX +-#source: farcall-thumb-thumb.s +-#as: -march=armv4t +-#ld: -Ttext 0x1000 --section-start .foo=0x2001014 +-#error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' ++.*: file format .* ++ ++Disassembly of section .text: ++ ++00001000 <_start>: ++ 1000: f000 f802 bl 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. ++ ++00001008 <__bar_veneer>: ++ 1008: b401 push {r0} ++ 100a: 4802 ldr r0, \[pc, #8\] \(1014 <__bar_veneer\+0xc>\) ++ 100c: 4684 mov ip, r0 ++ 100e: bc01 pop {r0} ++ 1010: 4760 bx ip ++ 1012: bf00 nop ++ 1014: 02001015 .word 0x02001015 ++Disassembly of section .foo: ++ ++02001014 : ++ 2001014: 4770 bx lr +--- /dev/null ++++ b/ld/testsuite/ld-arm/script-type.ld +@@ -0,0 +1,7 @@ ++SECTIONS { ++ foo_a = bar_a; ++ foo_t = bar_t; ++ foo_o = bar_o; ++ .text : { *(.text) } ++ .ARM.attribues 0 : { *(.ARM.attributes) } ++} +--- /dev/null ++++ b/ld/testsuite/ld-arm/script-type.s +@@ -0,0 +1,20 @@ ++.syntax unified ++.text ++.global bar_a ++.type bar_a %function ++bar_a: ++bx lr ++ ++.p2align 4 ++.global bar_o ++.type bar_o %object ++bar_o: ++.word 0 ++ ++.p2align 4 ++.thumb ++.global bar_t ++.type bar_t %function ++bar_t: ++bx lr ++ +--- /dev/null ++++ b/ld/testsuite/ld-arm/script-type.sym +@@ -0,0 +1,16 @@ ++ ++Symbol table '.symtab' contains 13 entries: ++ Num: Value Size Type Bind Vis Ndx Name ++ 0: 00000000 0 NOTYPE LOCAL DEFAULT UND ++ 1: 00000000 0 SECTION LOCAL DEFAULT 1 ++ 2: 00000000 0 SECTION LOCAL DEFAULT 2 ++ 3: 00000000 0 NOTYPE LOCAL DEFAULT 1 \$a ++ 4: 00000010 0 NOTYPE LOCAL DEFAULT 1 \$d ++ 5: 00000014 0 NOTYPE LOCAL DEFAULT 1 \$a ++ 6: 00000020 0 NOTYPE LOCAL DEFAULT 1 \$t ++ 7: 00000010 0 OBJECT GLOBAL DEFAULT 1 bar_o ++ 8: 00000021 0 FUNC GLOBAL DEFAULT 1 bar_t ++ 9: 00000000 0 FUNC GLOBAL DEFAULT 1 foo_a ++ 10: 00000021 0 FUNC GLOBAL DEFAULT 1 foo_t ++ 11: 00000010 0 OBJECT GLOBAL DEFAULT 1 foo_o ++ 12: 00000000 0 FUNC GLOBAL DEFAULT 1 bar_a +--- a/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad-noeabi.d ++++ b/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad-noeabi.d +@@ -1,4 +1,19 @@ +-#name: Thumb-2-as-Thumb-1 BL failure test +-#source: thumb2-bl-as-thumb1-bad.s +-#ld: -Ttext 0x1000 --section-start .foo=0x401004 +-#error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' ++.*: file format .* ++ ++Disassembly of section .text: ++ ++00001000 <__bar_veneer>: ++ 1000: b401 push {r0} ++ 1002: 4802 ldr r0, \[pc, #8\] \(100c <__bar_veneer\+0xc>\) ++ 1004: 4684 mov ip, r0 ++ 1006: bc01 pop {r0} ++ 1008: 4760 bx ip ++ 100a: bf00 nop ++ 100c: 0100100d .word 0x0100100d ++ ++00001010 <_start>: ++ 1010: f7ff fff6 bl 1000 <__bar_veneer> ++Disassembly of section .foo: ++ ++0100100c : ++ 100100c: 4770 bx lr +--- a/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad.d ++++ b/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad.d +@@ -2,13 +2,16 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_veneer\+0x4> +- 1004: 0040100d .word 0x0040100d ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. ++ ++00001008 <__bar_veneer>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> ++ 100c: 0100100d .word 0x0100100d + +-00001008 <_start>: +- 1008: f7ff effa blx 1000 <__bar_veneer> + Disassembly of section .foo: + +-0040100c : +- 40100c: 4770 bx lr ++0100100c : ++ 100100c: 4770 bx lr +--- a/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad.s ++++ b/ld/testsuite/ld-arm/thumb2-bl-as-thumb1-bad.s +@@ -12,7 +12,7 @@ + _start: + bl bar + +-@ We will place the section .foo at 0x40100c. ++@ We will place the section .foo at 0x100100c. + + .section .foo, "xa" + .thumb_func +--- a/ld/testsuite/ld-arm/thumb2-bl-bad-noeabi.d ++++ b/ld/testsuite/ld-arm/thumb2-bl-bad-noeabi.d +@@ -1,4 +1,19 @@ +-#name: Thumb-2 BL failure test +-#source: thumb2-bl-bad.s +-#ld: -Ttext 0x1000 --section-start .foo=0x1001004 +-#error: .*\(.text\+0x0\): relocation truncated to fit: R_ARM_THM_CALL against `bar' ++.*: file format .* ++ ++Disassembly of section .text: ++ ++00001000 <__bar_veneer>: ++ 1000: b401 push {r0} ++ 1002: 4802 ldr r0, \[pc, #8\] \(100c <__bar_veneer\+0xc>\) ++ 1004: 4684 mov ip, r0 ++ 1006: bc01 pop {r0} ++ 1008: 4760 bx ip ++ 100a: bf00 nop ++ 100c: 0100100d .word 0x0100100d ++ ++00001010 <_start>: ++ 1010: f7ff fff6 bl 1000 <__bar_veneer> ++Disassembly of section .foo: ++ ++0100100c : ++ 100100c: 4770 bx lr +--- a/ld/testsuite/ld-arm/thumb2-bl-bad.d ++++ b/ld/testsuite/ld-arm/thumb2-bl-bad.d +@@ -2,12 +2,14 @@ + + Disassembly of section .text: + +-00001000 <__bar_veneer>: +- 1000: e51ff004 ldr pc, \[pc, #-4\] ; 1004 <__bar_veneer\+0x4> +- 1004: 0100100d .word 0x0100100d ++00001000 <_start>: ++ 1000: f000 e802 blx 1008 <__bar_veneer> ++ 1004: 0000 lsls r0, r0, #0 ++ \.\.\. + +-00001008 <_start>: +- 1008: f7ff effa blx 1000 <__bar_veneer> ++00001008 <__bar_veneer>: ++ 1008: e51ff004 ldr pc, \[pc, #-4\] ; 100c <__bar_veneer\+0x4> ++ 100c: 0100100d .word 0x0100100d + Disassembly of section .foo: + + 0100100c : +--- /dev/null ++++ b/ld/testsuite/ld-arm/thumb2-bl-blx-interwork.d +@@ -0,0 +1,93 @@ ++ ++.*: file format .* ++ ++ ++Disassembly of section \.text: ++ ++00008000 <_start>: ++ 8000: .* ++ 8004: .* ++ 8008: bf00 nop ++ 800a: .* ++ 800e: .* ++ 8012: bf00 nop ++ 8014: f000 e81c blx 8050 ++ 8018: f000 e820 blx 805c ++ 801c: bf00 nop ++ 801e: f000 e818 blx 8050 ++ 8022: f000 e81c blx 805c ++ 8026: bf00 nop ++ 8028: f000 f81e bl 8068 ++ 802c: f000 f821 bl 8072 ++ 8030: f000 f824 bl 807c ++ 8034: f000 f827 bl 8086 ++ 8038: bf00 nop ++ 803a: f000 f815 bl 8068 ++ 803e: f000 f818 bl 8072 ++ 8042: f000 f81b bl 807c ++ 8046: f000 f81e bl 8086 ++ 804a: bf00 nop ++ 804c: e320f000 nop \{0\} ++ ++00008050 : ++ 8050: e12fff1e bx lr ++ ++00008054 <\.real_start_ofarm0>: ++ 8054: 4770 bx lr ++ 8056: 0000 .short 0x0000 ++ 8058: e320f000 nop \{0\} ++ ++0000805c : ++ 805c: e12fff1e bx lr ++ ++00008060 <\.real_start_ofarm4>: ++ 8060: 4770 bx lr ++ 8062: 0000 .short 0x0000 ++ 8064: f3af 8000 nop\.w ++ ++00008068 : ++ 8068: 4770 bx lr ++ 806a: bf00 nop ++ 806c: f3af 8000 nop\.w ++ 8070: bf00 nop ++ ++00008072 : ++ 8072: 4770 bx lr ++ 8074: f3af 8000 nop\.w ++ 8078: bf00 nop ++ 807a: bf00 nop ++ ++0000807c : ++ 807c: 4770 bx lr ++ 807e: bf00 nop ++ 8080: bf00 nop ++ 8082: bf00 nop ++ 8084: bf00 nop ++ ++00008086 : ++ 8086: 4770 bx lr ++ ++00008088 : ++ 8088: f7ff ffe4 bl 8054 <\.real_start_ofarm0> ++ 808c: f7ff ffe8 bl 8060 <\.real_start_ofarm4> ++ 8090: bf00 nop ++ 8092: f7ff ffdf bl 8054 <\.real_start_ofarm0> ++ 8096: f7ff ffe3 bl 8060 <\.real_start_ofarm4> ++ 809a: bf00 nop ++ 809c: f7ff efd8 blx 8050 ++ 80a0: f7ff efdc blx 805c ++ 80a4: bf00 nop ++ 80a6: f7ff efd4 blx 8050 ++ 80aa: f7ff efd8 blx 805c ++ 80ae: bf00 nop ++ 80b0: f7ff ffda bl 8068 ++ 80b4: f7ff ffdd bl 8072 ++ 80b8: f7ff ffe0 bl 807c ++ 80bc: f7ff ffe3 bl 8086 ++ 80c0: bf00 nop ++ 80c2: f7ff ffd1 bl 8068 ++ 80c6: f7ff ffd4 bl 8072 ++ 80ca: f7ff ffd7 bl 807c ++ 80ce: f7ff ffda bl 8086 ++ 80d2: bf00 nop ++ 80d4: f3af 8000 nop\.w +--- /dev/null ++++ b/ld/testsuite/ld-arm/thumb2-bl-blx-interwork.s +@@ -0,0 +1,99 @@ ++ .arch armv7-a ++ .global _start ++ .syntax unified ++ .text ++ .thumb ++ ++ .macro do_calls ++ @ These four instructions interwork (by calling a ".real_start_of" ++ @ Thumb entry point for a function), but only for backward references. ++ bl.w arm0 ++ bl.w arm4 ++ nop ++ bl.w arm0 ++ bl.w arm4 ++ nop ++ blx.w arm0 ++ blx.w arm4 ++ nop ++ blx.w arm0 ++ blx.w arm4 ++ nop ++ bl.w thumb0 ++ bl.w thumb2 ++ bl.w thumb4 ++ bl.w thumb6 ++ nop ++ bl.w thumb0 ++ bl.w thumb2 ++ bl.w thumb4 ++ bl.w thumb6 ++ nop ++ @ These eight are all accepted with current gas, but generate bad code. ++ @blx.w thumb0 ++ @blx.w thumb2 ++ @blx.w thumb4 ++ @blx.w thumb6 ++ @nop ++ @blx.w thumb0 ++ @blx.w thumb2 ++ @blx.w thumb4 ++ @blx.w thumb6 ++ .endm ++ ++ .thumb_func ++ .align 3 ++_start: ++ do_calls ++ ++ .arm ++ .global offset0 ++ .align 3 ++arm0: ++ bx lr ++ ++ .thumb ++.real_start_ofarm0: ++ bx lr ++ .arm ++ ++ .global offset4 ++ .align 3 ++ nop ++arm4: ++ bx lr ++ ++ .thumb ++.real_start_ofarm4: ++ bx lr ++ .arm ++ ++ .thumb ++ .thumb_func ++ .align 3 ++thumb0: ++ bx lr ++ ++ .thumb_func ++ .align 3 ++ nop ++thumb2: ++ bx lr ++ ++ .thumb_func ++ .align 3 ++ nop ++ nop ++thumb4: ++ bx lr ++ ++ .thumb_func ++ .align 3 ++ nop ++ nop ++ nop ++thumb6: ++ bx lr ++ ++backwards: ++ do_calls +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-1.d +@@ -0,0 +1,10 @@ ++#ld: -T arm.ld ++#objdump: -s ++ ++.*: file format.* ++ ++#... ++Contents of section .ARM.exidx: ++ 8008 (f8ffff7f b0b0a880 f4ffff7f 01000000|7ffffff8 80a8b0b0 7ffffff4 00000001) .* ++Contents of section .far: ++#... +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-1.s +@@ -0,0 +1,19 @@ ++ .syntax unified ++ .text ++ .global _start ++ .type _start, %function ++_start: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ @ Section with no unwinding information. Linker should insert a cantunwind entry. ++ .section .after, "xa" ++ .global __aeabi_unwind_cpp_pr0 ++ .type __aeabi_unwind_cpp_pr0, %function ++__aeabi_unwind_cpp_pr0: ++ bx lr ++ ++ .section .far ++ .word 0 +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-2.d +@@ -0,0 +1,10 @@ ++#ld: -T arm.ld ++#objdump: -s ++ ++.*: file format.* ++ ++#... ++Contents of section .ARM.exidx: ++ 8004 (fcffff7f b0b0a880 f8ffff7f 01000000|7ffffffc 80a8b0b0 7ffffff8 00000001) .* ++Contents of section .far: ++#... +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-2.s +@@ -0,0 +1,19 @@ ++ .syntax unified ++ .text ++ ++ .global __aeabi_unwind_cpp_pr0 ++ .type __aeabi_unwind_cpp_pr0, %function ++__aeabi_unwind_cpp_pr0: ++ .global _start ++ .type _start, %function ++_start: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ @ last text section has unwind information. Linker should append a ++ @ terminating cantunwind entry. ++ ++ .section .far ++ .word 0 +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-3.d +@@ -0,0 +1,11 @@ ++#ld: -T arm.ld ++#objdump: -s ++ ++.*: file format.* ++ ++#... ++Contents of section .ARM.exidx: ++ 800c (f4ffff7f b0b0a880 f0ffff7f 01000000|7ffffff4 80a8b0b0 7ffffff0 00000001) .* ++ 801c (ecffff7f b0b0a880 e8ffff7f 01000000|7fffffec 80a8b0b0 7fffffe8 00000001) .* ++Contents of section .far: ++#... +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-3.s +@@ -0,0 +1,29 @@ ++ .syntax unified ++ .text ++ @ section without unwind info ++ .global _start ++ .type _start, %function ++_start: ++ bl _before ++ ++ @ Section that will be placed first ++ .section .before, "xa" ++ .type _before, %function ++_before: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ @ section that will be placed last ++ .section .after, "xa" ++ .global __aeabi_unwind_cpp_pr0 ++ .type __aeabi_unwind_cpp_pr0, %function ++__aeabi_unwind_cpp_pr0: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ .section .far ++ .word 0 +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-4.d +@@ -0,0 +1,11 @@ ++#ld: -T arm.ld ++#objdump: -s ++ ++.*: file format.* ++ ++#... ++Contents of section .ARM.exidx: ++ 8020 (e0ffff7f b0b0a880 dcffff7f e8ffff7f|7fffffe0 80a8b0b0 7fffffdc 7fffffe8) .* ++ 8030 (d8ffff7f b0b0a880 d8ffff7f 01000000|7fffffd8 80a8b0b0 7fffffd8 00000001) .* ++Contents of section .far: ++#... +--- /dev/null ++++ b/ld/testsuite/ld-arm/unwind-4.s +@@ -0,0 +1,49 @@ ++ .syntax unified ++ .text ++ @ out of line table entry ++ .global _start ++ .type _start, %function ++_start: ++ .fnstart ++ .save {r4, lr} ++ .vsave {d0} ++ .vsave {d4} ++ bl _before ++ .fnend ++ ++ @ entry that can be merged ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ @ Section that will be placed first ++ .section .before, "xa" ++ .type _before, %function ++_before: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ ++ @ section that will be placed last ++ .section .after, "xa" ++ .global __aeabi_unwind_cpp_pr0 ++ .type __aeabi_unwind_cpp_pr0, %function ++__aeabi_unwind_cpp_pr0: ++ .fnstart ++ .save {r4, lr} ++ bx lr ++ .fnend ++ @ final function is cantunwind, so output table size is smaller ++ @ than sum of input sections ++ .global __aeabi_unwind_cpp_pr1 ++ .type __aeabi_unwind_cpp_pr1, %function ++__aeabi_unwind_cpp_pr1: ++ .fnstart ++ .cantunwind ++ bx lr ++ .fnend ++ ++ .section .far ++ .word 0 +--- a/ld/testsuite/ld-elf/eh5.d ++++ b/ld/testsuite/ld-elf/eh5.d +@@ -14,7 +14,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 1b ++ Augmentation data: (0|1)b + + DW_CFA_nop + DW_CFA_nop +@@ -33,7 +33,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 03 .. .. .. .. 1b ++ Augmentation data: 03 .. .. .. .. (0|1)b + + DW_CFA_nop + +@@ -57,7 +57,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 03 .. .. .. .. 0c 1b ++ Augmentation data: 03 .. .. .. .. 0c (0|1)b + + DW_CFA_nop + DW_CFA_nop +@@ -78,7 +78,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 1b ++ Augmentation data: (0|1)b + + DW_CFA_def_cfa: r0( \([er]ax\)|) ofs 16 + #... +@@ -93,7 +93,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 03 .. .. .. .. 1b ++ Augmentation data: 03 .. .. .. .. (0|1)b + + DW_CFA_nop + +@@ -115,7 +115,7 @@ Contents of the .eh_frame section: + Code alignment factor: .* + Data alignment factor: .* + Return address column: .* +- Augmentation data: 03 .. .. .. .. 0c 1b ++ Augmentation data: 03 .. .. .. .. 0c (0|1)b + + DW_CFA_nop + DW_CFA_nop +--- a/ld/testsuite/ld-elfcomm/elfcomm.exp ++++ b/ld/testsuite/ld-elfcomm/elfcomm.exp +@@ -175,9 +175,10 @@ proc assembler_generates_commons {} { + return 1 + } + +- +-if { ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1a.c tmpdir/common1a.o] +- || ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } { ++# Explicitly use "-fcommon" so that even if $CFLAGS includes ++# "-fno-common", these tests are compiled as expected. ++if { ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1a.c tmpdir/common1a.o] ++ || ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } { + unresolved $test1 + return + } +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at.exp +@@ -0,0 +1,33 @@ ++# Test for proper diagnosis of overflowed memory regions. ++# Copyright 2009 Free Software Foundation, Inc. ++# ++# This file is part of the GNU Binutils. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, ++# MA 02110-1301, USA. ++ ++if ![is_elf_format] { ++ return ++} ++ ++load_lib ld-lib.exp ++ ++set test_list [lsort [glob -nocomplain $srcdir/$subdir/rgn-at*.d]] ++foreach test_file $test_list { ++ set test_name [file rootname $test_file] ++ set map_file "tmpdir/[file tail $test_name].map" ++ verbose $test_name ++ run_dump_test $test_name ++} +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at.s +@@ -0,0 +1,6 @@ ++ .section .text ++ .long 0x12345678 ++ .section .data ++ .long 0x9abcdef0 ++ .section .bss ++ .long 0 +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at1.d +@@ -0,0 +1,12 @@ ++# name: rgn-at1 ++# source: rgn-at.s ++# ld: -T rgn-at1.t ++# objdump: -w -h ++ ++.*: file format .* ++ ++Sections: ++Idx +Name +Size +VMA +LMA +File off +Algn +Flags ++ 0 .text +0+[0-9a-f][0-9a-f] +0+0010000 +0+0020000 +.* ++ 1 .data +0+[0-9a-f][0-9a-f] +0+00100[0-9a-f]+ +0+00200[0-9a-f]+ +.* ++ 2 .bss +0+[0-9a-f][0-9a-f] +0+00100[0-9a-f]+ +0+00200[0-9a-f]+ +.* +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at1.t +@@ -0,0 +1,13 @@ ++/* Memory region at test, >AT should propagate by default */ ++ ++MEMORY { ++ ram : ORIGIN = 0x10000, LENGTH = 0x100 ++ rom : ORIGIN = 0x20000, LENGTH = 0x200 ++} ++_start = 0x1000; ++SECTIONS { ++ .text : { *(.text) } >ram AT>rom ++ .data : { *(.data) } >ram /* default AT>rom */ ++ .bss : { *(.bss) } >ram ++ /DISCARD/ : { *(*) } ++} +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at2.d +@@ -0,0 +1,12 @@ ++# name: rgn-at2 ++# source: rgn-at.s ++# ld: -T rgn-at2.t ++# objdump: -w -h ++ ++.*: file format .* ++ ++Sections: ++Idx +Name +Size +VMA +LMA +File off +Algn +Flags ++ 0 .text +0+[0-9a-f][0-9a-f] +0+0010000 +0+0020000 +.* ++ 1 .data +0+[0-9a-f][0-9a-f] +0+0030000 +0+0030000 +.* ++ 2 .bss +0+[0-9a-f][0-9a-f] +0+00300[0-9a-f]+ +0+00300[0-9a-f]+ +.* +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at2.t +@@ -0,0 +1,14 @@ ++/* Memory region at test, >AT should propagate by default */ ++ ++MEMORY { ++ ram : ORIGIN = 0x10000, LENGTH = 0x100 ++ rom : ORIGIN = 0x20000, LENGTH = 0x200 ++ other : ORIGIN = 0x30000, LENGTH = 0x200 ++} ++_start = 0x1000; ++SECTIONS { ++ .text : { *(.text) } >ram AT>rom ++ .data : { *(.data) } >other /* No default AT>rom */ ++ .bss : { *(.bss) } >other ++ /DISCARD/ : { *(*) } ++} +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at3.d +@@ -0,0 +1,12 @@ ++# name: rgn-at3 ++# source: rgn-at.s ++# ld: -T rgn-at3.t ++# objdump: -w -h ++ ++.*: file format .* ++ ++Sections: ++Idx +Name +Size +VMA +LMA +File off +Algn +Flags ++ 0 .text +0+[0-9a-f][0-9a-f] +0+0010000 +0+0020000 +.* ++ 1 .data +0+[0-9a-f][0-9a-f] +0+00100[0-9a-f]+ +0+0030000 +.* ++ 2 .bss +0+[0-9a-f][0-9a-f] +0+00100[0-9a-f]+ +0+00300[0-9a-f]+ +.* +--- /dev/null ++++ b/ld/testsuite/ld-scripts/rgn-at3.t +@@ -0,0 +1,13 @@ ++/* Memory region at test, >AT should propagate by default */ ++ ++MEMORY { ++ ram : ORIGIN = 0x10000, LENGTH = 0x100 ++ rom : ORIGIN = 0x20000, LENGTH = 0x200 ++} ++_start = 0x1000; ++SECTIONS { ++ .text : { *(.text) } >ram AT>rom ++ .data : AT (0x30000) { *(.data) } >ram /* NO default AT>rom */ ++ .bss : { *(.bss) } >ram /* NO default AT>rom */ ++ /DISCARD/ : { *(*) } ++} +--- a/ld/testsuite/lib/ld-lib.exp ++++ b/ld/testsuite/lib/ld-lib.exp +@@ -1592,7 +1592,8 @@ proc check_gc_sections_available { } { + # advertised by ld's options. + if { [istarget alpha*-*-*] + || [istarget mep-*-*] +- || [istarget ia64-*-*] } { ++ || [istarget ia64-*-*] ++ || [istarget *-*-mingw*] } { + set gc_sections_available_saved 0 + return 0 + } +--- a/libiberty/Makefile.in ++++ b/libiberty/Makefile.in +@@ -124,7 +124,7 @@ COMPILE.c = $(CC) -c @DEFS@ $(CFLAGS) $( + CFILES = alloca.c argv.c asprintf.c atexit.c \ + basename.c bcmp.c bcopy.c bsearch.c bzero.c \ + calloc.c choose-temp.c clock.c concat.c cp-demangle.c \ +- cp-demint.c cplus-dem.c \ ++ cp-demint.c cplus-dem.c cygpath.c \ + dyn-string.c \ + fdmatch.c ffs.c fibheap.c filename_cmp.c floatformat.c \ + fnmatch.c fopen_unlocked.c \ +@@ -182,7 +182,7 @@ REQUIRED_OFILES = \ + # maint-missing" and "make check". + CONFIGURED_OFILES = ./asprintf.o ./atexit.o \ + ./basename.o ./bcmp.o ./bcopy.o ./bsearch.o ./bzero.o \ +- ./calloc.o ./clock.o ./copysign.o \ ++ ./calloc.o ./clock.o ./copysign.o ./cygpath.o \ + ./_doprnt.o \ + ./ffs.o \ + ./getcwd.o ./getpagesize.o ./gettimeofday.o \ +@@ -619,6 +619,12 @@ $(CONFIGURED_OFILES): stamp-picdir + else true; fi + $(COMPILE.c) $(srcdir)/cplus-dem.c $(OUTPUT_OPTION) + ++./cygpath.o: $(srcdir)/cygpath.c $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h ++ if [ x"$(PICFLAG)" != x ]; then \ ++ $(COMPILE.c) $(PICFLAG) $(srcdir)/cygpath.c -o pic/$@; \ ++ else true; fi ++ $(COMPILE.c) $(srcdir)/cygpath.c $(OUTPUT_OPTION) ++ + ./dyn-string.o: $(srcdir)/dyn-string.c config.h $(INCDIR)/ansidecl.h \ + $(INCDIR)/dyn-string.h $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ +--- a/libiberty/configure ++++ b/libiberty/configure +@@ -8891,6 +8891,20 @@ case "${host}" in + esac + + ++# On MinGW, add support for Cygwin paths. ++case "${host}" in ++ *-*-mingw*) ++ case $LIBOBJS in ++ "cygpath.$ac_objext" | \ ++ *" cygpath.$ac_objext" | \ ++ "cygpath.$ac_objext "* | \ ++ *" cygpath.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS cygpath.$ac_objext" ;; ++esac ++ ++ ;; ++esac ++ + if test x$gcc_no_link = xyes; then + if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then + ac_cv_func_mmap_fixed_mapped=no +--- a/libiberty/configure.ac ++++ b/libiberty/configure.ac +@@ -663,6 +663,13 @@ case "${host}" in + esac + AC_SUBST(pexecute) + ++# On MinGW, add support for Cygwin paths. ++case "${host}" in ++ *-*-mingw*) ++ AC_LIBOBJ([cygpath]) ++ ;; ++esac ++ + libiberty_AC_FUNC_STRNCMP + + # Install a library built with a cross compiler in $(tooldir) rather +--- /dev/null ++++ b/libiberty/cygpath.c +@@ -0,0 +1,591 @@ ++/* Support Cygwin paths under MinGW. ++ Copyright (C) 2006 Free Software Foundation, Inc. ++ Written by CodeSourcery. ++ ++This file is part of the libiberty library. ++Libiberty is free software; you can redistribute it and/or modify it ++under the terms of the GNU Library General Public License as published ++by the Free Software Foundation; either version 2 of the License, or ++(at your option) any later version. ++ ++Libiberty is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++Library General Public License for more details. ++ ++You should have received a copy of the GNU Library General Public ++License along with libiberty; see the file COPYING.LIB. If not, write ++to the Free Software Foundation, Inc., 51 Franklin Street - Fifth ++Floor, Boston, MA 02110-1301, USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "libiberty.h" ++ ++/* If non-zero, we have attempted to use cygpath. CYGPATH_PEX may ++ still be NULL, if cygpath is unavailable. */ ++static int cygpath_initialized; ++ ++/* If non-NULL, an instance of cygpath connected via a pipe. */ ++static struct pex_obj *cygpath_pex; ++ ++/* The input to cygpath. */ ++static FILE *cygpath_in; ++ ++/* The output from cygpath. */ ++static FILE *cygpath_out; ++ ++/* If non-NULL, a file to which path translations are logged. */ ++static FILE *cygpath_log; ++ ++/* Record MESSAGE in the CYGPATH_LOG. MESSAGE is a format string, ++ which is expected to have a single "%s" field, to be replaced by ++ ARG. */ ++static void ++cygpath_log_msg_arg (const char *message, const char *arg) ++{ ++ if (!cygpath_log) ++ return; ++ fprintf (cygpath_log, "[%d] cygpath: ", _getpid ()); ++ fprintf (cygpath_log, message, arg); ++ fprintf (cygpath_log, "\n"); ++ fflush (cygpath_log); ++} ++ ++/* Record MESSAGE in the CYGPATH_LOG. */ ++static void ++cygpath_log_msg (const char *message) ++{ ++ cygpath_log_msg_arg ("%s", message); ++} ++ ++/* An error has occured. Add the MESSAGE to the CYGPATH_LOG, noting ++ the cause of the error based on errno. */ ++static void ++cygpath_perror (const char *message) ++{ ++ if (!cygpath_log) ++ return; ++ fprintf (cygpath_log, "[%d] cygpath: error: %s: %s\n", ++ _getpid(), message, strerror (errno)); ++ fflush (cygpath_log); ++} ++ ++/* Closes CYGPATH_PEX and frees all associated ++ resoures. */ ++static void ++cygpath_close (void) ++{ ++ /* Free resources. */ ++ if (cygpath_out) ++ { ++ fclose (cygpath_out); ++ cygpath_out = NULL; ++ } ++ if (cygpath_in) ++ { ++ fclose (cygpath_in); ++ cygpath_in = NULL; ++ } ++ if (cygpath_pex) ++ { ++ pex_free (cygpath_pex); ++ cygpath_pex = NULL; ++ } ++ if (cygpath_log) ++ { ++ cygpath_log_msg ("end"); ++ cygpath_log = NULL; ++ } ++} ++ ++/* CYG_PATH is a pointer to a Cygwin path. This function converts the ++ Cygwin path to a Windows path, storing the result in ++ WIN32_PATH. Returns true if the conversion was successful; false ++ otherwise. */ ++int ++cygpath (const char *cyg_path, char win32_path[MAX_PATH + 1]) ++{ ++ bool ok; ++ bool retrying; ++ ++ /* Special-case the empty path. cygpath cannot handle the empty ++ path correctly. It ignores the empty line, waiting for a ++ non-empty line, which in turn causes an application using this ++ function to appear stuck. */ ++ if (cyg_path[0] == '\0') ++ { ++ win32_path[0] = '\0'; ++ return true; ++ } ++ ++ retrying = false; ++ ++ retry: ++ if (!cygpath_initialized) ++ { ++ const char *argv[] = { "cygpath", "-w", "-f", "-", NULL }; ++ const char *cygpath_path; ++ const char *log; ++ int err; ++ ++ /* If we are unable to invoke cygpath, we do not want to try ++ again. So, we set the initialized flag at this point; if ++ errors occur during the invocation, it will remain set. */ ++ cygpath_initialized = 1; ++ /* Check to see if the user wants cygpath support. */ ++ cygpath_path = getenv ("CYGPATH"); ++ if (!cygpath_path) ++ /* The user doesn't need to support Cygwin paths. */ ++ goto error; ++ /* If debugging, open the log file. */ ++ log = getenv ("CSL_DEBUG_CYGPATH"); ++ if (log && log[0]) ++ { ++ /* The log file is opened for "append" so that multiple ++ processes (perhaps invoked from "make") can share it. */ ++ cygpath_log = fopen (log, "a"); ++ if (cygpath_log) ++ cygpath_log_msg ("begin"); ++ } ++ /* If the environment variable is set to a non-empty string, use ++ that string as the path to cygpath. */ ++ if (cygpath_path[0] != '\0') ++ argv[0] = cygpath_path; ++ /* Create the pex object. */ ++ cygpath_pex = pex_init (PEX_SEARCH | PEX_USE_PIPES, ++ "cygpath", NULL); ++ if (!cygpath_pex) ++ goto error; ++ /* Get the FILE we will use to write to the child. */ ++ cygpath_in = pex_input_pipe (cygpath_pex, /*binary=*/0); ++ if (!cygpath_in) ++ goto error; ++ /* Start the child process. */ ++ if (pex_run (cygpath_pex, PEX_SEARCH | PEX_USE_PIPES, ++ argv[0], (char**) argv, ++ NULL, NULL, ++ &err) != NULL) ++ goto error; ++ /* Get the FILE we will use to read from the child. */ ++ cygpath_out = pex_read_output (cygpath_pex, /*binary=*/1); ++ if (!cygpath_out) ++ goto error; ++ } ++ else if (!cygpath_pex) ++ /* We previously tried to use cygpath, but something went wrong. */ ++ return false; ++ ++ /* Write CYG_PATH to the child, on a line by itself. */ ++ cygpath_log_msg_arg ("-> %s", cyg_path); ++ if (fprintf (cygpath_in, "%s\n", cyg_path) < 0) ++ { ++ cygpath_perror ("write failed"); ++ goto error; ++ } ++ /* Flush the output. (We cannot set the stream into line-buffered ++ mode with setvbuf because Windows treats _IOLBF as a synonym for ++ _IOFBF.) */ ++ if (fflush (cygpath_in)) ++ cygpath_perror ("flush failed"); ++ /* Read the output. */ ++ ok = true; ++ while (1) ++ { ++ size_t pathlen; ++ if (!fgets (win32_path, MAX_PATH, cygpath_out)) ++ { ++ if (ferror (cygpath_out)) ++ cygpath_perror ("read failed"); ++ else ++ { ++ cygpath_log_msg ("error: EOF"); ++ /* Unfortunately, cygpath sometimes crashes for no ++ apparent reason. We give it two chances... */ ++ if (!retrying) ++ { ++ retrying = true; ++ cygpath_log_msg ("retrying"); ++ cygpath_close (); ++ cygpath_initialized = 0; ++ goto retry; ++ } ++ } ++ goto error; ++ } ++ pathlen = strlen (win32_path); ++ if (pathlen == 0 && ok) ++ /* This isn't a well-formed response from cygpath. */ ++ goto error; ++ if (win32_path[pathlen - 1] == '\n') ++ { ++ win32_path[pathlen - 1] = '\0'; ++ cygpath_log_msg_arg ("<- %s", win32_path); ++ break; ++ } ++ /* We didn't reach the end of the line. There's no point in ++ trying to use this output, since we know the length of ++ paths are limited to MAX_PATH characters, but we read the ++ entire line so that we are still in sync with ++ cygpath. */ ++ ok = false; ++ if (cygpath_log) ++ cygpath_log_msg_arg ("error: invalid response: %s", ++ win32_path); ++ } ++ ++ return ok; ++ ++ error: ++ cygpath_close(); ++ return false; ++} ++ ++/* Returns the handle for the MVCRT DLL, or NULL if it is not ++ available. */ ++static HMODULE ++msvcrt_dll (void) ++{ ++ static HMODULE dll = (HMODULE)(-1); ++ ++ /* After we call LoadLibrary, DLL will be either a valid handle or ++ NULL, so this check ensures that we only try to load the library ++ once. */ ++ if (dll == (HMODULE)(-1)) ++ dll = LoadLibrary ("msvcrt.dll"); ++ ++ return dll; ++} ++ ++/* Call the underlying MSVCRT fopen with PATH and MODE, and return ++ what it returns. */ ++static FILE * ++msvcrt_fopen (const char *path, const char *mode) ++{ ++ typedef FILE *(fopen_type)(const char *path, ++ const char *mode); ++ ++ static fopen_type *f = NULL; ++ ++ /* Get the address of "fopen". */ ++ if (!f) ++ { ++ HMODULE dll = msvcrt_dll (); ++ if (!dll) ++ { ++ errno = ENOSYS; ++ return NULL; ++ } ++ f = (fopen_type *) GetProcAddress (dll, "fopen"); ++ if (!f) ++ { ++ errno = ENOSYS; ++ return NULL; ++ } ++ } ++ ++ /* Call fopen. */ ++ return (*f)(path, mode); ++} ++ ++FILE * ++fopen (const char *path, const char *mode) ++{ ++ FILE *f; ++ char win32_path[MAX_PATH + 1]; ++ ++ /* Assume PATH is a Windows path. */ ++ f = msvcrt_fopen (path, mode); ++ if (f || errno != ENOENT) ++ return f; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (path, win32_path)) ++ f = msvcrt_fopen (win32_path, mode); ++ return f; ++} ++ ++int ++open (const char *path, int oflag, ...) ++{ ++ int fd; ++ char win32_path[MAX_PATH + 1]; ++ int pmode = 0; ++ ++ if ((oflag & _O_CREAT)) ++ { ++ va_list ap; ++ va_start (ap, oflag); ++ pmode = va_arg (ap, int); ++ va_end (ap); ++ } ++ ++ /* Assume PATH is a Windows path. */ ++ fd = _open (path, oflag, pmode); ++ if (fd != -1 || errno != ENOENT) ++ return fd; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (path, win32_path)) ++ fd = _open (win32_path, oflag, pmode); ++ return fd; ++} ++ ++int ++stat (const char *path, struct stat *buffer) ++{ ++ int r; ++ char win32_path[MAX_PATH + 1]; ++ ++ /* Assume PATH is a Windows path. */ ++ r = _stat (path, (struct _stat *) buffer); ++ if (r != -1 || errno != ENOENT) ++ return r; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (path, win32_path)) ++ r = _stat (win32_path, (struct _stat *) buffer); ++ return r; ++} ++ ++int ++access (const char *path, int mode) ++{ ++ int r; ++ char win32_path[MAX_PATH + 1]; ++ ++#ifdef _WIN32 ++ /* Some GNU tools mistakenly defined X_OK to 1 on Windows. */ ++ mode = mode & ~1; ++#endif ++ /* Assume PATH is a Windows path. */ ++ r = _access (path, mode); ++ if (r != -1 || errno != ENOENT) ++ return r; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (path, win32_path)) ++ r = _access (win32_path, mode); ++ return r; ++} ++ ++/* Given the WINDOWS_CODE (typically the result of GetLastError), set ++ ERRNO to the corresponding error code. If there is no obvious ++ correspondence, ERRNO will be set to EACCES. */ ++static void ++set_errno_from_windows_code (DWORD windows_code) ++{ ++ int mapping[][2] = { ++ {ERROR_ACCESS_DENIED, EACCES}, ++ {ERROR_ACCOUNT_DISABLED, EACCES}, ++ {ERROR_ACCOUNT_RESTRICTION, EACCES}, ++ {ERROR_ALREADY_ASSIGNED, EBUSY}, ++ {ERROR_ALREADY_EXISTS, EEXIST}, ++ {ERROR_ARITHMETIC_OVERFLOW, ERANGE}, ++ {ERROR_BAD_COMMAND, EIO}, ++ {ERROR_BAD_DEVICE, ENODEV}, ++ {ERROR_BAD_DRIVER_LEVEL, ENXIO}, ++ {ERROR_BAD_EXE_FORMAT, ENOEXEC}, ++ {ERROR_BAD_FORMAT, ENOEXEC}, ++ {ERROR_BAD_LENGTH, EINVAL}, ++ {ERROR_BAD_PATHNAME, ENOENT}, ++ {ERROR_BAD_PIPE, EPIPE}, ++ {ERROR_BAD_UNIT, ENODEV}, ++ {ERROR_BAD_USERNAME, EINVAL}, ++ {ERROR_BROKEN_PIPE, EPIPE}, ++ {ERROR_BUFFER_OVERFLOW, ENOMEM}, ++ {ERROR_BUSY, EBUSY}, ++ {ERROR_BUSY_DRIVE, EBUSY}, ++ {ERROR_CALL_NOT_IMPLEMENTED, ENOSYS}, ++ {ERROR_CRC, EIO}, ++ {ERROR_CURRENT_DIRECTORY, EINVAL}, ++ {ERROR_DEVICE_IN_USE, EBUSY}, ++ {ERROR_DIR_NOT_EMPTY, EEXIST}, ++ {ERROR_DIRECTORY, ENOENT}, ++ {ERROR_DISK_CHANGE, EIO}, ++ {ERROR_DISK_FULL, ENOSPC}, ++ {ERROR_DRIVE_LOCKED, EBUSY}, ++ {ERROR_ENVVAR_NOT_FOUND, EINVAL}, ++ {ERROR_EXE_MARKED_INVALID, ENOEXEC}, ++ {ERROR_FILE_EXISTS, EEXIST}, ++ {ERROR_FILE_INVALID, ENODEV}, ++ {ERROR_FILE_NOT_FOUND, ENOENT}, ++ {ERROR_FILENAME_EXCED_RANGE, ENAMETOOLONG}, ++ {ERROR_GEN_FAILURE, EIO}, ++ {ERROR_HANDLE_DISK_FULL, ENOSPC}, ++ {ERROR_INSUFFICIENT_BUFFER, ENOMEM}, ++ {ERROR_INVALID_ACCESS, EINVAL}, ++ {ERROR_INVALID_ADDRESS, EFAULT}, ++ {ERROR_INVALID_BLOCK, EFAULT}, ++ {ERROR_INVALID_DATA, EINVAL}, ++ {ERROR_INVALID_DRIVE, ENODEV}, ++ {ERROR_INVALID_EXE_SIGNATURE, ENOEXEC}, ++ {ERROR_INVALID_FLAGS, EINVAL}, ++ {ERROR_INVALID_FUNCTION, ENOSYS}, ++ {ERROR_INVALID_HANDLE, EBADF}, ++ {ERROR_INVALID_LOGON_HOURS, EACCES}, ++ {ERROR_INVALID_NAME, ENOENT}, ++ {ERROR_INVALID_OWNER, EINVAL}, ++ {ERROR_INVALID_PARAMETER, EINVAL}, ++ {ERROR_INVALID_PASSWORD, EPERM}, ++ {ERROR_INVALID_PRIMARY_GROUP, EINVAL}, ++ {ERROR_INVALID_SIGNAL_NUMBER, EINVAL}, ++ {ERROR_INVALID_TARGET_HANDLE, EIO}, ++ {ERROR_INVALID_WORKSTATION, EACCES}, ++ {ERROR_IO_DEVICE, EIO}, ++ {ERROR_IO_INCOMPLETE, EINTR}, ++ {ERROR_LOCKED, EBUSY}, ++ {ERROR_LOGON_FAILURE, EACCES}, ++ {ERROR_MAPPED_ALIGNMENT, EINVAL}, ++ {ERROR_META_EXPANSION_TOO_LONG, E2BIG}, ++ {ERROR_MORE_DATA, EPIPE}, ++ {ERROR_NEGATIVE_SEEK, ESPIPE}, ++ {ERROR_NO_DATA, EPIPE}, ++ {ERROR_NO_MORE_SEARCH_HANDLES, EIO}, ++ {ERROR_NO_PROC_SLOTS, EAGAIN}, ++ {ERROR_NO_SUCH_PRIVILEGE, EACCES}, ++ {ERROR_NOACCESS, EFAULT}, ++ {ERROR_NONE_MAPPED, EINVAL}, ++ {ERROR_NOT_ENOUGH_MEMORY, ENOMEM}, ++ {ERROR_NOT_READY, ENODEV}, ++ {ERROR_NOT_SAME_DEVICE, EXDEV}, ++ {ERROR_OPEN_FAILED, EIO}, ++ {ERROR_OPERATION_ABORTED, EINTR}, ++ {ERROR_OUTOFMEMORY, ENOMEM}, ++ {ERROR_PASSWORD_EXPIRED, EACCES}, ++ {ERROR_PATH_BUSY, EBUSY}, ++ {ERROR_PATH_NOT_FOUND, ENOTDIR}, ++ {ERROR_PIPE_BUSY, EBUSY}, ++ {ERROR_PIPE_CONNECTED, EPIPE}, ++ {ERROR_PIPE_LISTENING, EPIPE}, ++ {ERROR_PIPE_NOT_CONNECTED, EPIPE}, ++ {ERROR_PRIVILEGE_NOT_HELD, EACCES}, ++ {ERROR_READ_FAULT, EIO}, ++ {ERROR_SEEK, ESPIPE}, ++ {ERROR_SEEK_ON_DEVICE, ESPIPE}, ++ {ERROR_SHARING_BUFFER_EXCEEDED, ENFILE}, ++ {ERROR_STACK_OVERFLOW, ENOMEM}, ++ {ERROR_SWAPERROR, ENOENT}, ++ {ERROR_TOO_MANY_MODULES, EMFILE}, ++ {ERROR_TOO_MANY_OPEN_FILES, EMFILE}, ++ {ERROR_UNRECOGNIZED_MEDIA, ENXIO}, ++ {ERROR_UNRECOGNIZED_VOLUME, ENODEV}, ++ {ERROR_WAIT_NO_CHILDREN, ECHILD}, ++ {ERROR_WRITE_FAULT, EIO}, ++ {ERROR_WRITE_PROTECT, EROFS} ++/* MinGW does not define ETXTBSY as yet. ++ {ERROR_LOCK_VIOLATION, ETXTBSY}, ++ {ERROR_SHARING_VIOLATION, ETXTBSY}, ++*/ ++ }; ++ ++ size_t i; ++ ++ for (i = 0; i < sizeof (mapping)/sizeof (mapping[0]); ++i) ++ if (mapping[i][0] == windows_code) ++ { ++ errno = mapping[i][1]; ++ return; ++ } ++ ++ /* Unrecognized error. Use EACCESS to have some error code, ++ not misleading "No error" thing. */ ++ errno = EACCES; ++} ++ ++int rename (const char *oldpath, const char *newpath) ++{ ++ BOOL r; ++ int oldpath_converted = 0; ++ char win32_oldpath[MAX_PATH + 1]; ++ char win32_newpath[MAX_PATH + 1]; ++ ++ /* Older versions of the cygpath program called FindFirstFile, but ++ not FindClose. As a result, a long-running cygpath program ends ++ up leaking these handles, and, as a result, the Windows kernel ++ will not let us remove or rename things in directories. Therefore, ++ we kill the child cygpath program now. ++ ++ The defect in cygpath was corrected by this patch: ++ ++ http://cygwin.com/ml/cygwin-patches/2007-q1/msg00033.html ++ ++ but older versions of cygpath will be in use for the forseeable ++ future. */ ++ ++ cygpath_close (); ++ cygpath_initialized = 0; ++ ++ /* Assume all paths are Windows paths. */ ++ r = MoveFileEx (oldpath, newpath, MOVEFILE_REPLACE_EXISTING); ++ if (r) ++ return 0; ++ else if (GetLastError () != ERROR_PATH_NOT_FOUND) ++ goto error; ++ ++ /* Perhaps the old path is a cygwin path? */ ++ if (cygpath (oldpath, win32_oldpath)) ++ { ++ oldpath_converted = 1; ++ r = MoveFileEx (win32_oldpath, newpath, MOVEFILE_REPLACE_EXISTING); ++ if (r) ++ return 0; ++ else if (GetLastError () != ERROR_PATH_NOT_FOUND) ++ goto error; ++ } ++ ++ /* Perhaps the new path is a cygwin path? */ ++ if (cygpath (newpath, win32_newpath)) ++ { ++ r = MoveFileEx (oldpath_converted ? win32_oldpath : oldpath, ++ win32_newpath, MOVEFILE_REPLACE_EXISTING); ++ if (r == TRUE) ++ return 0; ++ } ++error: ++ set_errno_from_windows_code (GetLastError ()); ++ return -1; ++} ++ ++int remove (const char *pathname) ++{ ++ int r; ++ char win32_path[MAX_PATH + 1]; ++ ++ cygpath_close (); ++ cygpath_initialized = 0; ++ ++ /* Assume PATH is a Windows path. */ ++ r = _unlink (pathname); ++ if (r != -1 || errno != ENOENT) ++ return r; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (pathname, win32_path)) ++ r = _unlink (win32_path); ++ return r; ++} ++ ++int unlink(const char *pathname) ++{ ++ return remove (pathname); ++} ++ ++int ++chdir (const char *path) ++{ ++ int ret; ++ char win32_path[MAX_PATH + 1]; ++ ++ /* Assume PATH is a Windows path. */ ++ ret = _chdir (path); ++ if (ret != -1 || errno != ENOENT) ++ return ret; ++ /* Perhaps it is a Cygwin path? */ ++ if (cygpath (path, win32_path)) ++ ret = _chdir (win32_path); ++ return ret; ++} +--- a/libiberty/make-temp-file.c ++++ b/libiberty/make-temp-file.c +@@ -36,6 +36,9 @@ Boston, MA 02110-1301, USA. */ + #ifdef HAVE_SYS_FILE_H + #include /* May get R_OK, etc. on some systems. */ + #endif ++#if defined(_WIN32) && !defined(__CYGWIN__) ++#include ++#endif + + #ifndef R_OK + #define R_OK 4 +@@ -56,6 +59,8 @@ extern int mkstemps (char *, int); + #define TEMP_FILE "ccXXXXXX" + #define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1) + ++#if !defined(_WIN32) || defined(__CYGWIN__) ++ + /* Subroutine of choose_tmpdir. + If BASE is non-NULL, return it. + Otherwise it checks if DIR is a usable directory. +@@ -81,6 +86,8 @@ static const char usrtmp[] = + static const char vartmp[] = + { DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; + ++#endif ++ + static char *memoized_tmpdir; + + /* +@@ -97,40 +104,58 @@ files in. + char * + choose_tmpdir (void) + { +- const char *base = 0; +- char *tmpdir; +- unsigned int len; +- +- if (memoized_tmpdir) +- return memoized_tmpdir; +- +- base = try_dir (getenv ("TMPDIR"), base); +- base = try_dir (getenv ("TMP"), base); +- base = try_dir (getenv ("TEMP"), base); +- ++ if (!memoized_tmpdir) ++ { ++#if !defined(_WIN32) || defined(__CYGWIN__) ++ const char *base = 0; ++ char *tmpdir; ++ unsigned int len; ++ ++ base = try_dir (getenv ("TMPDIR"), base); ++ base = try_dir (getenv ("TMP"), base); ++ base = try_dir (getenv ("TEMP"), base); ++ + #ifdef P_tmpdir +- base = try_dir (P_tmpdir, base); ++ base = try_dir (P_tmpdir, base); + #endif + +- /* Try /var/tmp, /usr/tmp, then /tmp. */ +- base = try_dir (vartmp, base); +- base = try_dir (usrtmp, base); +- base = try_dir (tmp, base); +- +- /* If all else fails, use the current directory! */ +- if (base == 0) +- base = "."; +- +- /* Append DIR_SEPARATOR to the directory we've chosen +- and return it. */ +- len = strlen (base); +- tmpdir = XNEWVEC (char, len + 2); +- strcpy (tmpdir, base); +- tmpdir[len] = DIR_SEPARATOR; +- tmpdir[len+1] = '\0'; ++ /* Try /var/tmp, /usr/tmp, then /tmp. */ ++ base = try_dir (vartmp, base); ++ base = try_dir (usrtmp, base); ++ base = try_dir (tmp, base); ++ ++ /* If all else fails, use the current directory! */ ++ if (base == 0) ++ base = "."; ++ /* Append DIR_SEPARATOR to the directory we've chosen ++ and return it. */ ++ len = strlen (base); ++ tmpdir = XNEWVEC (char, len + 2); ++ strcpy (tmpdir, base); ++ tmpdir[len] = DIR_SEPARATOR; ++ tmpdir[len+1] = '\0'; ++ memoized_tmpdir = tmpdir; ++#else /* defined(_WIN32) && !defined(__CYGWIN__) */ ++ DWORD len; ++ ++ /* Figure out how much space we need. */ ++ len = GetTempPath(0, NULL); ++ if (len) ++ { ++ memoized_tmpdir = XNEWVEC (char, len); ++ if (!GetTempPath(len, memoized_tmpdir)) ++ { ++ XDELETEVEC (memoized_tmpdir); ++ memoized_tmpdir = NULL; ++ } ++ } ++ if (!memoized_tmpdir) ++ /* If all else fails, use the current directory. */ ++ memoized_tmpdir = xstrdup (".\\"); ++#endif /* defined(_WIN32) && !defined(__CYGWIN__) */ ++ } + +- memoized_tmpdir = tmpdir; +- return tmpdir; ++ return memoized_tmpdir; + } + + /* +--- a/libiberty/pex-win32.c ++++ b/libiberty/pex-win32.c +@@ -119,7 +119,7 @@ static int + pex_win32_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name, + int binary) + { +- return _open (name, _O_RDONLY | (binary ? _O_BINARY : _O_TEXT)); ++ return open (name, _O_RDONLY | (binary ? _O_BINARY : _O_TEXT)); + } + + /* Open a file for writing. */ +@@ -130,10 +130,10 @@ pex_win32_open_write (struct pex_obj *ob + { + /* Note that we can't use O_EXCL here because gcc may have already + created the temporary file via make_temp_file. */ +- return _open (name, +- (_O_WRONLY | _O_CREAT | _O_TRUNC +- | (binary ? _O_BINARY : _O_TEXT)), +- _S_IREAD | _S_IWRITE); ++ return open (name, ++ (_O_WRONLY | _O_CREAT | _O_TRUNC ++ | (binary ? _O_BINARY : _O_TEXT)), ++ _S_IREAD | _S_IWRITE); + } + + /* Close a file. */ +--- a/opcodes/arm-dis.c ++++ b/opcodes/arm-dis.c +@@ -4041,7 +4041,9 @@ print_insn (bfd_vma pc, struct disassemb + for a preceeding one. */ + for (; n >= 0; n--) + { +- if (get_sym_code_type (info, n, &type)) ++ if ((info->section == NULL ++ || info->section == info->symtab[n]->section) ++ && get_sym_code_type (info, n, &type)) + { + last_sym = n; + found = TRUE; +--- a/opcodes/m68k-opc.c ++++ b/opcodes/m68k-opc.c +@@ -2025,7 +2025,9 @@ const struct m68k_opcode m68k_opcodes[] + + {"sbcd", 2, one(0100400), one(0170770), "DsDd", m68000up }, + {"sbcd", 2, one(0100410), one(0170770), "-s-d", m68000up }, +- ++ ++{"stldsr", 6, two(0x40e7, 0x46fc), two(0xffff, 0xffff), "#w", mcfisa_c }, ++ + /* Traps have to come before conditional sets, as they have a more + specific opcode. */ + {"trapcc", 2, one(0052374), one(0177777), "", m68020up | cpu32 | fido_a }, +--- a/opcodes/mips-dis.c ++++ b/opcodes/mips-dis.c +@@ -38,6 +38,9 @@ + #include "elf/mips.h" + #endif + ++/* Generate Octeon unaligned load and store instructions. */ ++int octeon_use_unalign = 1; ++ + /* Mips instructions are at maximum this many bytes long. */ + #define INSNLEN 4 + +@@ -319,6 +322,36 @@ static const struct mips_cp0sel_name mip + { 29, 3, "c0_datahi_d" }, + }; + ++static const char * const mips_cp0_names_octeon[32] = { ++ "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1", ++ "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena", ++ "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare", ++ "c0_status", "c0_cause", "c0_epc", "c0_prid", ++ "c0_config", "$17", "c0_watchlo", "c0_watchhi", ++ "c0_xcontext", "$21", "c0_mdebug", "c0_debug", ++ "c0_depc", "c0_perfcnt", "$26", "c0_cacheerr", ++ "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave", ++}; ++ ++static const struct mips_cp0sel_name mips_cp0sel_names_octeon[] = { ++ { 5, 1, "c0_pagegrain" }, ++ { 9, 6, "c0_cvmcount" }, ++ { 9, 7, "c0_cvmctl" }, ++ { 11, 7, "c0_cvmmemctl" }, ++ { 12, 1, "c0_intctl" }, ++ { 12, 2, "c0_srsctl" }, ++ { 15, 1, "c0_ebase" }, ++ { 16, 1, "c0_config1", }, ++ { 16, 2, "c0_config2", }, ++ { 16, 3, "c0_config3", }, ++ { 18, 1, "c0_watchlo,1" }, ++ { 19, 1, "c0_watchhi,1" }, ++ { 25, 2, "c0_perfcnt,2" }, ++ { 27, 1, "c0_cacheerr,1" }, ++ { 28, 3, "c0_datalo" }, ++ { 29, 3, "c0_datahi" }, ++}; ++ + /* Xlr cop0 register names. */ + static const char * const mips_cp0_names_xlr[32] = { + "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1", +@@ -513,8 +546,9 @@ const struct mips_arch_choice mips_arch_ + NULL, 0, mips_hwr_names_numeric }, + + { "octeon", 1, bfd_mach_mips_octeon, CPU_OCTEON, +- ISA_MIPS64R2 | INSN_OCTEON, mips_cp0_names_numeric, NULL, 0, +- mips_hwr_names_numeric }, ++ ISA_MIPS64R2 | INSN_OCTEON, mips_cp0_names_octeon, ++ mips_cp0sel_names_octeon, ARRAY_SIZE (mips_cp0sel_names_octeon), ++ mips_hwr_names_numeric }, + + { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR, + ISA_MIPS64 | INSN_XLR, +@@ -676,7 +710,17 @@ parse_mips_dis_option (const char *optio + no_aliases = 1; + return; + } +- ++ if (strcmp ("octeon-useun", option) == 0) ++ { ++ octeon_use_unalign = 1; ++ return; ++ } ++ if (strcmp ("no-octeon-useun", option) == 0) ++ { ++ octeon_use_unalign = 0; ++ return; ++ } ++ + /* Look for the = that delimits the end of the option name. */ + for (i = 0; i < len; i++) + if (option[i] == '=') +@@ -1401,6 +1445,27 @@ print_insn_mips (bfd_vma memaddr, + && strcmp (op->name, "jalx")) + continue; + ++ if (info->mach == CPU_OCTEON && octeon_use_unalign) ++ { ++ if (strcmp (op->name, "lwl") == 0 ++ || strcmp (op->name, "ldl") == 0 ++ || strcmp (op->name, "swl") == 0 ++ || strcmp (op->name, "sdl") == 0 ++ || strcmp (op->name, "lcache") == 0 ++ || strcmp (op->name, "scache") == 0 ++ || strcmp (op->name, "flush") == 0) ++ continue; ++ ++ if (strcmp (op->name, "ldr") == 0 ++ || strcmp (op->name, "lwr") == 0 ++ || strcmp (op->name, "swr") == 0 ++ || strcmp (op->name, "sdr") == 0) ++ { ++ (*info->fprintf_func) (info->stream, "nop"); ++ return INSNLEN; ++ } ++ } ++ + /* Figure out instruction type and branch delay information. */ + if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0) + { +@@ -2175,6 +2240,12 @@ The following MIPS specific disassembler + with the -M switch (multiple options should be separated by commas):\n")); + + fprintf (stream, _("\n\ ++ octeon-useun Disassemble Octeon unaligned load/store instructions.\n")); ++ ++ fprintf (stream, _("\n\ ++ no-octeon-useun Disassemble mips unaligned load/store instructions.\n")); ++ ++ fprintf (stream, _("\n\ + gpr-names=ABI Print GPR names according to specified ABI.\n\ + Default: based on binary being disassembled.\n")); + +--- a/opcodes/mips-opc.c ++++ b/opcodes/mips-opc.c +@@ -188,8 +188,8 @@ const struct mips_opcode mips_builtin_op + {"pref", "k,o(b)", 0xcc000000, 0xfc000000, RD_b, 0, I4_32|G3 }, + {"prefx", "h,t(b)", 0x4c00000f, 0xfc0007ff, RD_b|RD_t|FP_S, 0, I4_33 }, + {"nop", "", 0x00000000, 0xffffffff, 0, INSN2_ALIAS, I1 }, /* sll */ +-{"ssnop", "", 0x00000040, 0xffffffff, 0, INSN2_ALIAS, I32|N55 }, /* sll */ +-{"ehb", "", 0x000000c0, 0xffffffff, 0, INSN2_ALIAS, I33 }, /* sll */ ++{"ssnop", "", 0x00000040, 0xffffffff, 0, INSN2_ALIAS, I1 }, /* sll */ ++{"ehb", "", 0x000000c0, 0xffffffff, 0, INSN2_ALIAS, I32 }, /* sll */ + {"li", "t,j", 0x24000000, 0xffe00000, WR_t, INSN2_ALIAS, I1 }, /* addiu */ + {"li", "t,i", 0x34000000, 0xffe00000, WR_t, INSN2_ALIAS, I1 }, /* ori */ + {"li", "t,I", 0, (int) M_LI, INSN_MACRO, 0, I1 }, +@@ -739,7 +739,7 @@ const struct mips_opcode mips_builtin_op + assembler, but will never match user input (because the line above + will match first). */ + {"jal", "a", 0x0c000000, 0xfc000000, UBD|WR_31, 0, I1 }, +-{"jalx", "a", 0x74000000, 0xfc000000, UBD|WR_31, 0, I16 }, ++{"jalx", "a", 0x74000000, 0xfc000000, UBD|WR_31, 0, I1 }, + {"la", "t,A(b)", 0, (int) M_LA_AB, INSN_MACRO, 0, I1 }, + {"lb", "t,o(b)", 0x80000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, + {"lb", "t,A(b)", 0, (int) M_LB_AB, INSN_MACRO, 0, I1 }, +@@ -1170,6 +1170,11 @@ const struct mips_opcode mips_builtin_op + {"rzu.ob", "X,Q", 0x78000020, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX|SB1 }, + {"rzu.ob", "D,k", 0x4bc00020, 0xffe0f83f, WR_D|RD_S|RD_T, 0, N54 }, + {"rzu.qh", "X,Q", 0x78200020, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, ++/* 58xx specific instructions. */ ++{"saa", "t,(b)", 0x70000018, 0xfc00ffff, SM|RD_t|RD_b, 0, IOCT }, ++{"saa", "t,A(b)", 0, (int) M_SAA_AB, INSN_MACRO, 0, IOCT }, ++{"saad", "t,(b)", 0x70000019, 0xfc00ffff, SM|RD_t|RD_b, 0, IOCT }, ++{"saad", "t,A(b)", 0, (int) M_SAAD_AB, INSN_MACRO, 0, IOCT }, + {"sb", "t,o(b)", 0xa0000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, + {"sb", "t,A(b)", 0, (int) M_SB_AB, INSN_MACRO, 0, I1 }, + {"sc", "t,o(b)", 0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b, 0, I2 }, +@@ -1334,7 +1339,9 @@ const struct mips_opcode mips_builtin_op + {"invalidate", "t,o(b)",0xb8000000, 0xfc000000, RD_t|RD_b, 0, I2 }, /* same */ + {"invalidate", "t,A(b)",0, (int) M_SWR_AB, INSN_MACRO, 0, I2 }, /* as swr */ + {"swxc1", "S,t(b)", 0x4c000008, 0xfc0007ff, SM|RD_S|RD_t|RD_b|FP_S, 0, I4_33 }, ++{"syncio", "", 0x0000004f, 0xffffffff, INSN_SYNC, 0, IOCT }, + {"synciobdma", "", 0x0000008f, 0xffffffff, INSN_SYNC, 0, IOCT }, ++{"syncioall", "", 0x000000cf, 0xffffffff, INSN_SYNC, 0, IOCT }, + {"syncs", "", 0x0000018f, 0xffffffff, INSN_SYNC, 0, IOCT }, + {"syncw", "", 0x0000010f, 0xffffffff, INSN_SYNC, 0, IOCT }, + {"syncws", "", 0x0000014f, 0xffffffff, INSN_SYNC, 0, IOCT }, +@@ -1387,18 +1394,22 @@ const struct mips_opcode mips_builtin_op + {"trunc.w.s", "D,S", 0x4600000d, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, + {"trunc.w.s", "D,S,x", 0x4600000d, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, + {"trunc.w.s", "D,S,t", 0, (int) M_TRUNCWS, INSN_MACRO, INSN2_M_FP_S, I1 }, ++{"uld", "t,o(b)", 0x68000000, 0xfc000000, LDD|WR_t|RD_b, 0, IOCT }, + {"uld", "t,o(b)", 0, (int) M_ULD, INSN_MACRO, 0, I3 }, + {"uld", "t,A(b)", 0, (int) M_ULD_A, INSN_MACRO, 0, I3 }, + {"ulh", "t,o(b)", 0, (int) M_ULH, INSN_MACRO, 0, I1 }, + {"ulh", "t,A(b)", 0, (int) M_ULH_A, INSN_MACRO, 0, I1 }, + {"ulhu", "t,o(b)", 0, (int) M_ULHU, INSN_MACRO, 0, I1 }, + {"ulhu", "t,A(b)", 0, (int) M_ULHU_A, INSN_MACRO, 0, I1 }, ++{"ulw", "t,o(b)", 0x88000000, 0xfc000000, LDD|RD_b|WR_t, 0, IOCT }, + {"ulw", "t,o(b)", 0, (int) M_ULW, INSN_MACRO, 0, I1 }, + {"ulw", "t,A(b)", 0, (int) M_ULW_A, INSN_MACRO, 0, I1 }, ++{"usd", "t,o(b)", 0xb0000000, 0xfc000000, SM|RD_t|RD_b, 0, IOCT }, + {"usd", "t,o(b)", 0, (int) M_USD, INSN_MACRO, 0, I3 }, + {"usd", "t,A(b)", 0, (int) M_USD_A, INSN_MACRO, 0, I3 }, + {"ush", "t,o(b)", 0, (int) M_USH, INSN_MACRO, 0, I1 }, + {"ush", "t,A(b)", 0, (int) M_USH_A, INSN_MACRO, 0, I1 }, ++{"usw", "t,o(b)", 0xa8000000, 0xfc000000, SM|RD_t|RD_b, 0, IOCT }, + {"usw", "t,o(b)", 0, (int) M_USW, INSN_MACRO, 0, I1 }, + {"usw", "t,A(b)", 0, (int) M_USW_A, INSN_MACRO, 0, I1 }, + {"v3mulu", "d,v,t", 0x70000011, 0xfc0007ff, WR_d|RD_s|RD_t, 0, IOCT }, +--- a/opcodes/ppc-opc.c ++++ b/opcodes/ppc-opc.c +@@ -3377,6 +3377,11 @@ const struct powerpc_opcode powerpc_opco + + {"isellt", X(31,15), X_MASK, PPCISEL, PPCNONE, {RT, RA, RB}}, + ++{"tlbilxlpid", XTO(31,18,0), XTO_MASK, E500MC, PPCNONE, {0}}, ++{"tlbilxpid", XTO(31,18,1), XTO_MASK, E500MC, PPCNONE, {0}}, ++{"tlbilxva", XTO(31,18,3), XTO_MASK, E500MC, PPCNONE, {RA0, RB}}, ++{"tlbilx", X(31,18), X_MASK, E500MC, PPCNONE, {T, RA0, RB}}, ++ + {"mfcr", XFXM(31,19,0,0), XRARB_MASK, COM, POWER4, {RT}}, + {"mfcr", XFXM(31,19,0,0), XFXFXM_MASK, POWER4, PPCNONE, {RT, FXM4}}, + {"mfocrf", XFXM(31,19,0,1), XFXFXM_MASK, COM, PPCNONE, {RT, FXM}}, +@@ -4416,10 +4421,6 @@ const struct powerpc_opcode powerpc_opco + {"caxo.", XO(31,266,1,1), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}}, + + {"tlbivax", X(31,786), XRT_MASK, BOOKE, PPCNONE, {RA, RB}}, +-{"tlbilx", X(31,787), X_MASK, E500MC, PPCNONE, {T, RA0, RB}}, +-{"tlbilxlpid", XTO(31,787,0), XTO_MASK, E500MC, PPCNONE, {0}}, +-{"tlbilxpid", XTO(31,787,1), XTO_MASK, E500MC, PPCNONE, {0}}, +-{"tlbilxva", XTO(31,787,3), XTO_MASK, E500MC, PPCNONE, {RA0, RB}}, + + {"lwzcix", X(31,789), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}}, + diff --git a/toolchain/binutils/patches/2.19.1+cs/110-arm-eabi-conf.patch b/toolchain/binutils/patches/2.19.1+cs/110-arm-eabi-conf.patch new file mode 100644 index 0000000000..b4a831d374 --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/110-arm-eabi-conf.patch @@ -0,0 +1,22 @@ +--- a/configure ++++ b/configure +@@ -2330,7 +2330,7 @@ case "${target}" in + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + libgloss_dir=arm + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-*gnueabi) + noconfigdirs="$noconfigdirs target-qthreads" + case ${with_newlib} in + no) noconfigdirs="$noconfigdirs target-newlib target-libgloss" +--- a/configure.ac ++++ b/configure.ac +@@ -566,7 +566,7 @@ case "${target}" in + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + libgloss_dir=arm + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-*gnueabi) + noconfigdirs="$noconfigdirs target-qthreads" + case ${with_newlib} in + no) noconfigdirs="$noconfigdirs target-newlib target-libgloss" diff --git a/toolchain/binutils/patches/2.19.1+cs/111-pr7093.elf32-arm.c.patch b/toolchain/binutils/patches/2.19.1+cs/111-pr7093.elf32-arm.c.patch new file mode 100644 index 0000000000..80fc0c9a39 --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/111-pr7093.elf32-arm.c.patch @@ -0,0 +1,13 @@ +--- a/bfd/elf32-arm.c ++++ b/bfd/elf32-arm.c +@@ -5476,6 +5476,10 @@ bfd_elf32_arm_init_maps (bfd *abfd) + if (! is_arm_elf (abfd)) + return; + ++ /* PR 7093: Make sure that we are dealing with an arm elf binary. */ ++ if (! is_arm_elf (abfd)) ++ return; ++ + if ((abfd->flags & DYNAMIC) != 0) + return; + diff --git a/toolchain/binutils/patches/2.19.1+cs/120-sh-conf.patch b/toolchain/binutils/patches/2.19.1+cs/120-sh-conf.patch new file mode 100644 index 0000000000..701c442ff0 --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/120-sh-conf.patch @@ -0,0 +1,40 @@ +--- a/configure ++++ b/configure +@@ -2298,7 +2298,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -2632,7 +2632,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +--- a/configure.ac ++++ b/configure.ac +@@ -534,7 +534,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -868,7 +868,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in diff --git a/toolchain/binutils/patches/2.19.1+cs/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.19.1+cs/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..207d2191b0 --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/300-001_ld_makefile_patch.patch @@ -0,0 +1,22 @@ +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -18,7 +18,7 @@ AM_CFLAGS = $(WARN_CFLAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -304,7 +304,7 @@ AM_CFLAGS = $(WARN_CFLAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/toolchain/binutils/patches/2.19.1+cs/300-012_check_ldrunpath_length.patch b/toolchain/binutils/patches/2.19.1+cs/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..a7ffe4a927 --- /dev/null +++ b/toolchain/binutils/patches/2.19.1+cs/300-012_check_ldrunpath_length.patch @@ -0,0 +1,20 @@ +--- a/ld/emultempl/elf32.em ++++ b/ld/emultempl/elf32.em +@@ -1220,6 +1220,8 @@ fragment <