diff options
-rw-r--r-- | contrib/binutils/ld/emultempl/ppc32elf.em | 33 | ||||
-rw-r--r-- | share/mk/bsd.own.mk | 3 |
2 files changed, 34 insertions, 2 deletions
diff --git a/contrib/binutils/ld/emultempl/ppc32elf.em b/contrib/binutils/ld/emultempl/ppc32elf.em index b0239e0..49a8eff 100644 --- a/contrib/binutils/ld/emultempl/ppc32elf.em +++ b/contrib/binutils/ld/emultempl/ppc32elf.em @@ -119,7 +119,40 @@ ppc_before_allocation (void) } } } + gld${EMULATION_NAME}_before_allocation (); + + /* Turn on relaxation if executable sections have addresses that + might make branches overflow. */ + if (!command_line.relax) + { + bfd_vma low = (bfd_vma) -1; + bfd_vma high = 0; + asection *o; + + /* Run lang_size_sections (if not already done). */ + if (expld.phase != lang_mark_phase_enum) + { + expld.phase = lang_mark_phase_enum; + expld.dataseg.phase = exp_dataseg_none; + one_lang_size_sections_pass (NULL, FALSE); + lang_reset_memory_regions (); + } + + for (o = output_bfd->sections; o != NULL; o = o->next) + { + if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE)) + continue; + if (o->rawsize == 0) + continue; + if (low > o->vma) + low = o->vma; + if (high < o->vma + o->rawsize - 1) + high = o->vma + o->rawsize - 1; + } + if (high > low && high - low > (1 << 25) - 1) + command_line.relax = TRUE; + } } EOF diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index b0acbfd..6b5180a 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -442,8 +442,7 @@ __T=${TARGET_ARCH} __T=${MACHINE_ARCH} .endif # Clang is only for x86 and powerpc right now, by default. -# XXX: Temporarily disabled for 32-bit powerpc, due to a binutils bug. -.if ${__T} == "amd64" || ${__T} == "i386" || ${__T} == "powerpc64" +.if ${__T} == "amd64" || ${__T} == "i386" || ${__T:Mpowerpc*} __DEFAULT_YES_OPTIONS+=CLANG .else __DEFAULT_NO_OPTIONS+=CLANG |