On Tue, Apr 8, 2025 at 10:53 AM Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > Here is an incremental fix on top of the > https://gcc.gnu.org/pipermail/gcc-patches/2025-April/680256.html > patch. As I said, there were various FAILs in make check-cobol > when using the cross compiler from 32-bit host to x86_64-linux. > This patch fixes most of them, except for > Running /home/jakub/src/gcc/gcc/testsuite/cobol.dg/dg.exp ... > FAIL: cobol.dg/group1/declarative_1.cob -O0 execution test > FAIL: cobol.dg/group1/declarative_1.cob -O1 execution test > FAIL: cobol.dg/group1/declarative_1.cob -O2 execution test > FAIL: cobol.dg/group1/declarative_1.cob -O3 -fomit-frame-pointer > -funroll-loops -fpeel-loops -ftracer -finline-functions execution test > FAIL: cobol.dg/group1/declarative_1.cob -O3 -g execution test > FAIL: cobol.dg/group1/declarative_1.cob -Os execution test > > === cobol Summary === > > # of expected passes 3123 > # of unexpected failures 6 > # of expected failures 6 > (which has some analysis but not a fix yet). > > This patch fixes various cases where host size of various types > (void *, int, size_t, unsigned char) is used in place where > size of those types in bytes on the target should be used instead. > At least the size of void * and size_t actually differns between > ilp32 hosts and lp64 targets, int could be different in theory as well > but we actually don't support 16-bit ints on the host side and only support > lp64 targets right now for cobol, and finally sizeof(unsigned char) is > always 1, so there is no point to multiply by that and it is still > wrong to use host sizeof for the target decisions. > > Bootstrapped/regtested on x86_64-linux and tested with following on > x86_64-linux, ok for trunk?
OK. Richard. > PATH=~/hbin:/usr/local/x86_64-redhat-linux-gnu/bin:$PATH i386 ../configure > --target x86_64-redhat-linux-gnu -enable-languages=cobol --disable-lto > --enable-checking=yes,rtl,extra --disable-bootstrap --disable-libsanitizer > --disable-libgomp --disable-multilib > PATH=~/hbin:/usr/local/x86_64-redhat-linux-gnu/bin:$PATH i386 make -j32 > cd gcc; make check-cobol > > where > > ls ~/hbin > as g++ gcc gdc ld > for i in ~/hbin/*; do echo ===$i===; cat $i; done > ===/home/jakub/hbin/as=== > #!/bin/sh > exec /usr/bin/as --32 "$@" > ===/home/jakub/hbin/g++=== > #!/bin/sh > exec /usr/bin/g++ -m32 "$@" > ===/home/jakub/hbin/gcc=== > #!/bin/sh > exec /usr/bin/gcc -m32 "$@" > ===/home/jakub/hbin/gdc=== > #!/bin/sh > exec /usr/bin/gdc -m32 "$@" > ===/home/jakub/hbin/ld=== > #!/bin/sh > case "$*" in > --version) cat <<\EOF > GNU ld version 2.20.52.0.1-10.fc17 20100131 > Copyright 2012 Free Software Foundation, Inc. > This program is free software; you may redistribute it under the terms of > the GNU General Public License version 3 or (at your option) a later version. > This program has absolutely no warranty. > EOF > exit 0;; > esac > exec /usr/bin/ld -m elf_i386 -L /usr/lib/ "$@" > > ls -l /usr/local/x86_64-redhat-linux-gnu/ > total 32 > drwxr-xr-x. 2 jakub jakub 4096 Apr 6 11:54 bin > lrwxrwxrwx. 1 jakub jakub 12 Apr 6 11:33 include -> /usr/include > drwxr-xr-x. 2 jakub jakub 24576 Apr 6 12:49 lib > lrwxrwxrwx. 1 jakub jakub 10 Apr 6 11:33 lib64 -> /usr/lib64 > ls -l /usr/local/x86_64-redhat-linux-gnu/bin > total 0 > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:54 ar -> /usr/bin/ar > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:44 as -> /usr/bin/as > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 c++filt -> /usr/bin/c++filt > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:23 ld -> /usr/bin/ld > lrwxrwxrwx. 1 jakub jakub 15 Apr 6 11:23 ld.bfd -> /usr/bin/ld.bfd > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:23 nm -> /usr/bin/nm > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 objcopy -> /usr/bin/objcopy > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 objdump -> /usr/bin/objdump > lrwxrwxrwx. 1 jakub jakub 15 Apr 6 11:23 ranlib -> /usr/bin/ranlib > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 readelf -> /usr/bin/readelf > lrwxrwxrwx. 1 jakub jakub 13 Apr 6 11:23 size -> /usr/bin/size > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 strings -> /usr/bin/strings > lrwxrwxrwx. 1 jakub jakub 14 Apr 6 11:23 strip -> /usr/bin/strip > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:54 x86_64-redhat-linux-gnu-ar -> > /usr/bin/ar > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:44 x86_64-redhat-linux-gnu-as -> > /usr/bin/as > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 x86_64-redhat-linux-gnu-c++filt -> > /usr/bin/c++filt > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:23 x86_64-redhat-linux-gnu-ld -> > /usr/bin/ld > lrwxrwxrwx. 1 jakub jakub 15 Apr 6 11:23 x86_64-redhat-linux-gnu-ld.bfd -> > /usr/bin/ld.bfd > lrwxrwxrwx. 1 jakub jakub 11 Apr 6 11:23 x86_64-redhat-linux-gnu-nm -> > /usr/bin/nm > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 x86_64-redhat-linux-gnu-objcopy -> > /usr/bin/objcopy > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 x86_64-redhat-linux-gnu-objdump -> > /usr/bin/objdump > lrwxrwxrwx. 1 jakub jakub 15 Apr 6 11:23 x86_64-redhat-linux-gnu-ranlib -> > /usr/bin/ranlib > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 x86_64-redhat-linux-gnu-readelf -> > /usr/bin/readelf > lrwxrwxrwx. 1 jakub jakub 13 Apr 6 11:23 x86_64-redhat-linux-gnu-size -> > /usr/bin/size > lrwxrwxrwx. 1 jakub jakub 16 Apr 6 11:23 x86_64-redhat-linux-gnu-strings -> > /usr/bin/strings > lrwxrwxrwx. 1 jakub jakub 14 Apr 6 11:23 x86_64-redhat-linux-gnu-strip -> > /usr/bin/strip > ls -l /usr/local/x86_64-redhat-linux-gnu/lib/*.o > -rw-r--r--. 1 jakub jakub 13456 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/crt1.o > -rw-r--r--. 1 jakub jakub 1728 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/crti.o > -rw-r--r--. 1 jakub jakub 1464 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/crtn.o > -rw-r--r--. 1 jakub jakub 17632 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/gcrt1.o > -rw-r--r--. 1 jakub jakub 13864 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/grcrt1.o > -rw-r--r--. 1 jakub jakub 5624 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/Mcrt1.o > -rw-r--r--. 1 jakub jakub 9840 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/rcrt1.o > -rw-r--r--. 1 jakub jakub 9840 May 11 2022 > /usr/local/x86_64-redhat-linux-gnu/lib/Scrt1.o > plus in that directory > ln -sf /usr/lib64/*.so /usr/local/x86_64-redhat-linux-gnu/lib/ > > 2025-04-08 Jakub Jelinek <ja...@redhat.com> > > PR cobol/119364 > * genapi.cc (function_handle_from_name): Use sizeof_pointer. > (parser_file_add): Use int_size_in_bytes(VOID_P) and > int_size_in_bytes(int). > (inspect_tally): Use int_size_in_bytes(VOID_P). > (inspect_replacing): Likewise. > (gg_array_of_field_pointers): Likewise. > (gg_array_of_file_pointers): Likewise. > (parser_set_pointers): Use sizeof_pointer. > * cobol1.cc (create_our_type_nodes_init): Use > int_size_in_bytes(SIZE_T) and int_size_in_bytes(VOID_P). > * gengen.cc (gg_array_of_size_t): Use int_size_in_bytes(SIZE_T). > (gg_array_of_bytes): Just use N, don't multiply it by > sizeof(unsigned char). > * parse.y: Include tree.h. Use int_size_in_bytes(ptr_type_node). > > --- gcc/cobol/genapi.cc.jj 2025-04-05 22:10:21.699956654 +0200 > +++ gcc/cobol/genapi.cc 2025-04-07 19:42:47.527507356 +0200 > @@ -790,13 +790,13 @@ function_handle_from_name(cbl_refer_t &n > { > gg_memcpy(gg_get_address_of(function_handle), > member(name.field->var_decl_node, "data"), > - build_int_cst_type(SIZE_T, sizeof(void *))); > + sizeof_pointer); > } > else > { > gg_memcpy(gg_get_address_of(function_handle), > qualified_data_source(name), > - build_int_cst_type(SIZE_T, sizeof(void *))); > + sizeof_pointer); > } > return function_handle; > } > @@ -8931,8 +8931,8 @@ parser_file_add(struct cbl_file_t *file) > gg_assign(array_of_keys, > gg_cast(build_pointer_type(cblc_field_p_type_node), > gg_malloc(build_int_cst_type(SIZE_T, > - (number_of_key_fields+1) > - *sizeof(void > *))))); > + (number_of_key_fields+1) > + > *int_size_in_bytes(VOID_P))))); > > strcpy(achName, "_"); > strcat(achName, file->name); > @@ -8943,8 +8943,8 @@ parser_file_add(struct cbl_file_t *file) > gg_assign(key_numbers, > gg_cast(build_pointer_type(INT), > gg_malloc(build_int_cst_type(SIZE_T, > - (number_of_key_fields+1) > - *sizeof(int))))); > + (number_of_key_fields+1) > + > *int_size_in_bytes(INT))))); > > strcpy(achName, "_"); > strcat(achName, file->name); > @@ -8956,7 +8956,7 @@ parser_file_add(struct cbl_file_t *file) > gg_cast(build_pointer_type(INT), > gg_malloc(build_int_cst_type(SIZE_T, > (number_of_key_fields+1) > - *sizeof(int))))); > + > *int_size_in_bytes(INT))))); > > size_t index = 0; > for( size_t i=0; i<file->nkey; i++ ) > @@ -9700,7 +9700,9 @@ inspect_tally(bool backward, > gg_assign(int_size, build_int_cst_type(INT, n_integers)); > gg_assign(integers, > gg_cast(SIZE_T_P, > - gg_realloc(integers, n_integers * sizeof(void *)))); > + gg_realloc(integers, > + n_integers > + * int_size_in_bytes(VOID_P)))); > } > ELSE > { > @@ -9851,7 +9853,9 @@ inspect_replacing(int backward, > gg_assign(int_size, build_int_cst_type(INT, n_integers)); > gg_assign(integers, > gg_cast(SIZE_T_P, > - gg_realloc(integers, n_integers * sizeof(void *)))); > + gg_realloc(integers, > + n_integers > + * int_size_in_bytes(VOID_P)))); > } > ELSE > { > @@ -11089,7 +11093,9 @@ gg_array_of_field_pointers( size_t N, > cbl_field_t **fields ) > { > tree retval = > gg_define_variable(build_pointer_type(cblc_field_p_type_node)); > - gg_assign(retval, gg_cast(build_pointer_type(cblc_field_p_type_node), > gg_malloc( build_int_cst_type(SIZE_T, N * sizeof(void *))))); > + gg_assign(retval, gg_cast(build_pointer_type(cblc_field_p_type_node), > + gg_malloc(build_int_cst_type(SIZE_T, > + N * > int_size_in_bytes(VOID_P))))); > for(size_t i=0; i<N; i++) > { > gg_assign(gg_array_value(retval, i), > gg_get_address_of(fields[i]->var_decl_node)); > @@ -11581,7 +11587,8 @@ gg_array_of_file_pointers( size_t N, > { > tree retval = > gg_define_variable(build_pointer_type(cblc_file_p_type_node)); > gg_assign(retval, gg_cast( build_pointer_type(cblc_file_p_type_node), > - gg_malloc( build_int_cst_type(SIZE_T, N * > sizeof(void *))))); > + gg_malloc( build_int_cst_type(SIZE_T, > + N * > int_size_in_bytes(VOID_P))))); > for(size_t i=0; i<N; i++) > { > gg_assign(gg_array_value(retval, i), > gg_get_address_of(files[i]->var_decl_node)); > @@ -12868,7 +12875,7 @@ parser_set_pointers( size_t ntgt, cbl_re > > COBOL_FUNCTION_RETURN_TYPE); > gg_memcpy(qualified_data_dest(tgts[i]), > gg_get_address_of(function_handle), > - build_int_cst_type(SIZE_T, sizeof(void *))); > + sizeof_pointer); > } > else > { > --- gcc/cobol/cobol1.cc.jj 2025-04-05 22:09:20.016801774 +0200 > +++ gcc/cobol/cobol1.cc 2025-04-07 19:31:10.235221294 +0200 > @@ -166,8 +166,8 @@ create_our_type_nodes_init() > long_double_ten_node = build_real_from_int_cst( > LONGDOUBLE, > build_int_cst_type(INT,10)); > - sizeof_size_t = build_int_cst_type(SIZE_T, sizeof(size_t)); > - sizeof_pointer = build_int_cst_type(SIZE_T, sizeof(void *)); > + sizeof_size_t = build_int_cst_type(SIZE_T, int_size_in_bytes(SIZE_T)); > + sizeof_pointer = build_int_cst_type(SIZE_T, int_size_in_bytes(VOID_P)); > > bool_true_node = build2(EQ_EXPR, > integer_type_node, > --- gcc/cobol/gengen.cc.jj 2025-04-05 22:10:21.688956805 +0200 > +++ gcc/cobol/gengen.cc 2025-04-07 19:40:35.410347873 +0200 > @@ -3356,7 +3356,8 @@ tree > gg_array_of_size_t( size_t N, size_t *values) > { > tree retval = gg_define_variable(build_pointer_type(SIZE_T)); > - gg_assign(retval, gg_cast(build_pointer_type(SIZE_T), gg_malloc( > build_int_cst_type(SIZE_T, N * sizeof(size_t))))); > + tree sz = build_int_cst_type(SIZE_T, N * int_size_in_bytes(SIZE_T)); > + gg_assign(retval, gg_cast(build_pointer_type(SIZE_T), gg_malloc(sz))); > for(size_t i=0; i<N; i++) > { > gg_assign(gg_array_value(retval, i), build_int_cst_type(SIZE_T, > values[i])); > @@ -3368,7 +3369,7 @@ tree > gg_array_of_bytes( size_t N, unsigned char *values) > { > tree retval = gg_define_variable(UCHAR_P); > - gg_assign(retval, gg_cast(UCHAR_P, gg_malloc( build_int_cst_type(SIZE_T, > N * sizeof(unsigned char))))); > + gg_assign(retval, gg_cast(UCHAR_P, gg_malloc( build_int_cst_type(SIZE_T, > N)))); > for(size_t i=0; i<N; i++) > { > gg_assign(gg_array_value(retval, i), build_int_cst_type(UCHAR, > values[i])); > --- gcc/cobol/parse.y.jj 2025-04-05 22:10:21.694956723 +0200 > +++ gcc/cobol/parse.y 2025-04-07 20:01:32.722832141 +0200 > @@ -34,6 +34,7 @@ > #include "coretypes.h" > #include "../../libgcobol/io.h" > #include "../../libgcobol/ec.h" > + #include "tree.h" > > #pragma GCC diagnostic ignored "-Wmissing-field-initializers" > > @@ -3826,7 +3827,8 @@ data_clauses: data_clause > if( yydebug ) { > yywarn("expanding %s size from %u bytes to %zu " > "because it redefines %s with USAGE POINTER", > - field->name, field->size(), sizeof(void*), > + field->name, field->size(), > + (size_t)int_size_in_bytes(ptr_type_node), > redefined->name); > } > field->embiggen(); > @@ -4286,7 +4288,7 @@ usage_clause1: usage COMPUTATIONAL[comp > if( gcobol_feature_embiggen() && redefined && > is_numeric(redefined->type) && redefined->size() == 4) > { > // For now, we allow POINTER to expand a 32-bit item to > 64 bits. > - field->data.capacity = sizeof(void *); > + field->data.capacity = int_size_in_bytes(ptr_type_node); > dbgmsg("%s: expanding #" HOST_SIZE_T_PRINT_UNSIGNED > " %s capacity %u => %u", __func__, > (fmt_size_t)field_index(redefined), > redefined->name, > > Jakub >