ergawy wrote:

Thanks @tarunprabhu for opening this. I indeed closed my original PR but was 
about to reopen it after last week's discussion.

At least for the GNU toolchain, it won't be easy to come up with a simple test 
that fails without `-pthread`. The reason is that the pthread API is actually 
exported by `libc` and that `-lc` is added by the GNU toolchain in the driver 
in any case.

Just to give more context, I tested with the following program:
```
program main  
    INTERFACE
      SUBROUTINE pthread_create() BIND(C)
        USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
        IMPLICIT NONE
      END SUBROUTINE pthread_create
    END INTERFACE


    print*, "======= Calling pthread_create() ======="
    call pthread_create()
end program main
```
And expected `./bin/flang-new /tmp/test_pthread.f90 -o /tmp/test_pthread_2 -v` 
to complain that the `pthread_create()` symbol is undefined. However, it 
compiles and links fine.

And if you look at the linker command, you find it looks like this:
```
"/work/kaergawy/git/trunk18.0/build/llvm-project/bin/ld.lld" -z relro 
--hash-style=gnu --eh-frame-hdr -m elf_x86_64 -dynamic-linker 
/lib64/ld-linux-x86-64.so.2 -o /tmp/test_pthread_2 /lib/x86_64-linux-gnu/crt1.o 
/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/12/crtbegin.o 
-L/work/kaergawy/git/trunk18.0/build/llvm-project/lib/clang/18/lib/x86_64-unknown-linux-gnu
 -L/usr/lib/gcc/x86_64-linux-gnu/12 
-L/usr/lib/gcc/x86_64-linux-gnu/12/../../../../lib64 -L/lib/x86_64-linux-gnu 
-L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/lib 
-L/usr/lib /tmp/test_pthread_fortran.o 
-L/work/kaergawy/git/trunk18.0/build/llvm-project/lib --whole-archive 
-lFortran_main --no-whole-archive -lFortranRuntime -lFortranDecimal -lm -lgcc 
--as-needed -lgcc_s --no-as-needed >> -lc << -lgcc --as-needed -lgcc_s 
--no-as-needed /usr/lib/gcc/x86_64-linux-gnu/12/crtend.o 
/lib/x86_64-linux-gnu/crtn.o
```
Note the `-lc` flag that I highligted with `>> ... <<` above. If you remove 
that flag from the linker command, you get:
```
ld.lld: error: undefined symbol: pthread_create
>>> referenced by FIRModule
>>>               /tmp/test_pthread_fortran.o:(_QQmain)

ld.lld: error: undefined symbol: __libc_start_main
>>> referenced by /lib/x86_64-linux-gnu/crt1.o:(_start)
```

And indeed if you `nm --defined-only /usr/lib/x86_64-linux-gnu/libc.a`, you 
find that `pthread_create` is actually defined by `libc`.

---

That said, what @tarunprabhu mentioned about OpenMPI wrappers adding the flag 
is indeed correct as mentioned by  Brian Cornille in the last flang bi-weekly. 
So adding the flag would indeed make sense even if it is redundant for the GNU 
toolchain but it would be consistent with `clang`. However, coming up with a 
failing test will prove more difficult that it initially seems.

I shared the PR with Brian since I cannot add him as a reviewer.

https://github.com/llvm/llvm-project/pull/77360
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to