On Fri, May 03, 2013 at 07:10:15PM +0200, Jakub Jelinek wrote: > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, but > not tested on powerpc32 where it actually caused runtime issues, can > somebody please try it there? Ok for trunk/4.8?
/home/amodra/build/gcc-current/./gcc/gcj -B/home/amodra/build/gcc-current/powerpc-linux/64/libjava/ -B/home/amodra/build/gcc-current/powerpc-linux/64/libjava/ -B/home/amodra/build/gcc-current/./gcc/ -B/home/amodra/gnu/powerpc-linux/bin/ -B/home/amodra/gnu/powerpc-linux/lib/ -isystem /home/amodra/gnu/powerpc-linux/include -isystem /home/amodra/gnu/powerpc-linux/sys-include -m64 -fclasspath= -fbootclasspath=/home/amodra/src/gcc-current/libjava/classpath/lib --encoding=UTF-8 -Wno-deprecated -fbootstrap-classes -g -O2 -m64 -fsource-filename=/home/amodra/build/gcc-current/powerpc-linux/64/libjava/classpath/lib/classes -fjni -findirect-dispatch -fno-indirect-classes -c @gnu-CORBA.list -fPIC -o .libs/gnu-CORBA.o -v -save-temps Looks like this is not the only problem. Using the attached patch to verify section anchor block layout leads me to .org .LANCB76+23560 .type _atable_syms_gnu_CORBA_NamingService_NameValidator, @object .size _atable_syms_gnu_CORBA_NamingService_NameValidator, 96 _atable_syms_gnu_CORBA_NamingService_NameValidator: .quad _Utf42 .quad _Utf34 .quad _Utf35 .quad _Utf3318.82185 .quad _Utf34 .quad _Utf170 .quad _Utf293 .quad _Utf34 .quad _Utf170 .quad 0 .quad 0 .quad 0 .org .LANCB76+23608 The difference between .org's is 48, but the actual size 96. The next _atable in this file shows 48/72. -- Alan Modra Australia Development Lab, IBM
PR libcgj/57074 * varasm.c (output_object_block): Use .org for each item in section anchor block rather than padding. Index: gcc/varasm.c =================================================================== --- gcc/varasm.c (revision 198274) +++ gcc/varasm.c (working copy) @@ -7095,6 +7105,10 @@ HOST_WIDE_INT offset; tree decl; rtx symbol; +#if HAVE_GNU_AS + static int labelno; + char buf[30]; +#endif if (!block->objects) return; @@ -7104,6 +7118,12 @@ switch_to_section (block->sect); assemble_align (block->alignment); +#if HAVE_GNU_AS + ASM_GENERATE_INTERNAL_LABEL (buf, "LANCB", labelno); + ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, buf); + ++labelno; +#endif + /* Define the values of all anchors relative to the current section position. */ FOR_EACH_VEC_SAFE_ELT (block->anchors, i, symbol) @@ -7114,7 +7134,14 @@ FOR_EACH_VEC_ELT (*block->objects, i, symbol) { /* Move to the object's offset, padding with zeros if necessary. */ +#if HAVE_GNU_AS + fprintf (asm_out_file, "\t.org "); + assemble_name_raw (asm_out_file, buf); + fprintf (asm_out_file, "+" HOST_WIDE_INT_PRINT_DEC "\n", + SYMBOL_REF_BLOCK_OFFSET (symbol)); +#else assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset); +#endif offset = SYMBOL_REF_BLOCK_OFFSET (symbol); if (CONSTANT_POOL_ADDRESS_P (symbol)) { @@ -7154,6 +7181,7 @@ } } } + gcc_checking_assert (offset == block->size); } /* A htab_traverse callback used to call output_object_block for