On Thu, Mar 15, 2018 at 1:11 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Thu, Mar 15, 2018 at 10:18 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >> On Wed, Mar 14, 2018 at 12:57 AM, Steve Kargl >> <s...@troutmask.apl.washington.edu> wrote: >>> On Tue, Mar 13, 2018 at 09:49:10PM +0200, Janne Blomqvist wrote: >>>> >>>> int val = kill (pid, signal); >>>> return (val == 0): 0 ? errno; >>>> >>>> like it already does for the optional status argument for kill_sub. >>>> >>> >>> Committed as r258511 with your suggested change. >> Hi Steve, >> >> After this change, AArch64/arm bare-metal cross (fortran) toolchain >> fail to build with below error message: >> >> /.../obj/gcc2/./gcc/xgcc -B/.../obj/gcc2/./gcc/ >> -B/.../install/aarch64-none-elf/bin/ >> -B/.../install/aarch64-none-elf/lib/ -isystem >> /.../install/aarch64-none-elf/include -isystem >> /.../install/aarch64-none-elf/sys-include -DHAVE_CONFIG_H -I. >> -I/.../gcc/libgfortran -iquote/.../gcc/libgfortran/io >> -I/.../gcc/libgfortran/../gcc -I/.../gcc/libgfortran/../gcc/config >> -I../../.././gcc -I/.../gcc/libgfortran/../libgcc -I../../libgcc >> -I/.../gcc/libgfortran/../libbacktrace -I../../libbacktrace >> -I../libbacktrace -std=gnu11 -Wall -Wstrict-prototypes >> -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings >> -Werror=implicit-function-declaration -Werror=vla -fcx-fortran-rules >> -ffunction-sections -fdata-sections -g -ffunction-sections >> -fdata-sections -O2 -mabi=ilp32 -MT kill.lo -MD -MP -MF .deps/kill.Tpo >> -c /.../gcc/libgfortran/intrinsics/kill.c -o kill.o >> /.../gcc/libgfortran/intrinsics/kill.c:54:22: error: conflicting types >> for 'kill' >> extern GFC_INTEGER_4 kill (GFC_INTEGER_4, GFC_INTEGER_4); >> ^~~~ >> In file included from /.../install/aarch64-none-elf/include/signal.h:6, >> from /.../gcc/libgfortran/intrinsics/kill.c:28: >> /.../install/aarch64-none-elf/include/sys/signal.h:176:5: note: >> previous declaration of 'kill' was here >> int kill (pid_t, int); >> ^~~~ >> In file included from /.../gcc/libgfortran/intrinsics/kill.c:26: >> /.../gcc/libgfortran/intrinsics/kill.c:55:14: error: conflicting types >> for 'kill' >> export_proto(kill); >> ^~~~ >> /.../gcc/libgfortran/libgfortran.h:150:57: note: in definition of >> macro 'sym_rename2' >> #define sym_rename2(old, ulp, new) extern __typeof(old) old __asm__(#ulp >> #new) >> ^~~ >> /.../gcc/libgfortran/libgfortran.h:148:30: note: in expansion of macro >> 'sym_rename1' >> #define sym_rename(old, new) sym_rename1(old, __USER_LABEL_PREFIX__, new) >> ^~~~~~~~~~~ >> /.../gcc/libgfortran/libgfortran.h:195:26: note: in expansion of macro >> 'sym_rename' >> # define export_proto(x) sym_rename(x, PREFIX(x)) >> ^~~~~~~~~~ >> /.../gcc/libgfortran/intrinsics/kill.c:55:1: note: in expansion of >> macro 'export_proto' >> export_proto(kill); >> ^~~~~~~~~~~~ >> In file included from /.../install/aarch64-none-elf/include/signal.h:6, >> from /.../gcc/libgfortran/intrinsics/kill.c:28: >> /.../install/aarch64-none-elf/include/sys/signal.h:176:5: note: >> previous declaration of 'kill' was here >> int kill (pid_t, int); >> ^~~~ >> /.../gcc/libgfortran/intrinsics/kill.c:58:1: error: conflicting types for >> 'kill' >> kill (GFC_INTEGER_4 pid, GFC_INTEGER_4 signal) >> ^~~~ >> In file included from /.../install/aarch64-none-elf/include/signal.h:6, >> from /.../gcc/libgfortran/intrinsics/kill.c:28: >> /.../install/aarch64-none-elf/include/sys/signal.h:176:5: note: >> previous declaration of 'kill' was here >> int kill (pid_t, int); >> ^~~~ >> >> The gcc is configured with: >> gcc/configure --target=aarch64-none-elf --prefix=... >> --with-gmp=.../host-tools --with-mpfr=.../host-tools >> --with-mpc=.../host-tools --with-isl=.../host-tools >> --with-pkgversion=unknown --disable-shared --disable-nls >> --disable-threads --disable-tls --enable-checking=yes >> --enable-languages=c,c++ --with-newlib >> --enable-languages=c,c++,fortran >> >> I don't know fortran, so any suggestion how to fix this? >> Note that -mabi=ilp32 is required to reproduce the breakage. > > So the pre-processed file for libgfortran/intrinsics/kill.c is like: > > > int kill (pid_t, int); > > //...... > > extern GFC_INTEGER_4 kill (GFC_INTEGER_4, GFC_INTEGER_4); > extern __typeof(kill) kill __asm__("" "_gfortran_kill");
Why do you need to jump through these hoops anyway? Just do ... > GFC_INTEGER_4 > kill (GFC_INTEGER_4 pid, GFC_INTEGER_4 signal) _gfortran_kill (... here. The kill prototype should come via signal.h already. I guess the issue is that libgfortran 'kill' (exported with _gfortran_ prefix) aliases the POSIX kill and you even want to call that here. So maybe just use export_proto_np or add another variant that works on function definitions directly so you can write GFC_INTEGER_4 export_def(kill) (GFC_INTEGER_4 ...) { } > { > int val; > val = (int)kill (pid, signal); > return ((val == 0) ? 0 : > # 62 "/.../gcc/libgfortran/intrinsics/kill.c" 3 4 > (*__errno()) > # 62 "/.../gcc/libgfortran/intrinsics/kill.c" > ); > } > > I suppose fortran wants to define its own kill returning errorno > directly on failure. > The problem is below declaration: > > extern GFC_INTEGER_4 kill (GFC_INTEGER_4, GFC_INTEGER_4); > > could conflict with included c declaration which is: > > int kill (pid_t, int); > > Even GFC_INTEGER_4 is typedef as int32_t, we can't rely on that is the > same as int type, right? > In this case, int32_t is defined as long int on aarch64_ilp32 or arm > bare-metal toolchains. > > Any idea to resolve the inconsistency? > > Thanks, > bin >> >> Thanks, >> bin >>> >>> -- >>> Steve