http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45927
Summary: autoconf regression wrt .quad availability targeting amd64 from biarch cross compiler Product: gcc Version: 4.5.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: jay.kr...@cornell.edu Regression in 4.5.1 vs. 4.3.5 (sorry, we skipped 4.4) gcc_GAS_CHECK_FEATURE([.quad directive], gcc_cv_as_ix86_quad,,, [.quad 0],, [AC_DEFINE(HAVE_AS_IX86_QUAD, 1, [Define if your assembler supports the .quad directive.])]) This breaks cross builds to Solaris/amd64. You can then easily trigger this path: const char * integer_asm_op (int size, int aligned_p) { struct asm_int_op *ops; if (aligned_p) ops = &targetm.asm_out.aligned_op; else ops = &targetm.asm_out.unaligned_op; switch (size) { case 1: return targetm.asm_out.byte_op; case 2: return ops->hi; case 4: return ops->si; case 8: return ops->di; <= NULL, but wasn't NULL in 4.3.5 ... bool default_assemble_integer (rtx x ATTRIBUTE_UNUSED, unsigned int size ATTRIBUTE_UNUSED, int aligned_p ATTRIBUTE_UNUSED) { const char *op = integer_asm_op (size, aligned_p); /* Avoid GAS bugs for large values. Specifically negative values whose absolute value fits in a bfd_vma, but not in a bfd_signed_vma. */ if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT) return false; return op && (assemble_integer_with_op (op, x), true); <== NULL => false, but was presumably true in 4.3.5 } bool assemble_integer (rtx x, unsigned int size, unsigned int align, int force) { int aligned_p; aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT)); /* See if the target hook can handle this kind of object. */ if (targetm.asm_out.integer (x, size, aligned_p)) return true; <= no longer hit this ... if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode, EXPAND_INITIALIZER), MIN (size, thissize), align, 0)) ==> error ("initializer for integer/fixed-point value is too complicated"); break; They worked fine in gcc 4.3 when this autoconfigury was absent. gcc 4.3 assumed .quad was available in biarch x86. Probably the autoconfigury is close to correct. It should be used perhaps, but only for guiding 32bit compilation. I verified the problem is related to: /* The 32-bit Solaris assembler does not support .quad. Do not use it. */ #ifndef HAVE_AS_IX86_QUAD #undef ASM_QUAD #endif gcc-4.5/gcc/config/i386/sol2.h which wasn't in 4.3.5. 4.3.5 instead had: /* The 32-bit Solaris assembler does not support .quad. Do not use it. */ #ifndef TARGET_BI_ARCH #undef ASM_QUAD #endif