mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 10:26:06 +00:00

- BIND(C) was ignored in lowering for objects (it can be used on module and common blocks): use the bind name as the fir.global name. - When an procedure is declared BIND(C) indirectly via an interface, it should have a BIND(C) name. This was not the case because GetBindName()/bindingName() return nothing in this case: detect this case in mangler.cpp and use the symbol name. Add TODOs for corner cases: - BIND(C) module variables may be initialized on the C side. This does not fit well with the current linkage strategy. Add a TODO until this is revisited. - BIND(C) internal procedures should not have a binding label (see Fortran 2018 section 18.10.2 point 2), yet we currently lower them as if they were BIND(C) external procedure. I think this and the indirect interface case should really be handled by symbol.GetBindName instead of adding more logic in lowering to deal with this case: add a TODO. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: klausler Differential Revision: https://reviews.llvm.org/D128340 Co-authored-by: Jean Perier <jperier@nvidia.com>
15 lines
358 B
Fortran
15 lines
358 B
Fortran
! Test lowering of BIND(C) variables
|
|
! RUN: bbc -emit-fir %s -o - | FileCheck %s
|
|
|
|
block data
|
|
integer :: x, y
|
|
common /fortran_name/ x, y
|
|
! CHECK-LABEL: fir.global common @c_name
|
|
bind(c, name="c_name") /fortran_name/
|
|
end block data
|
|
|
|
module some_module
|
|
! CHECK-LABEL: fir.global @tomato
|
|
integer, bind(c, name="tomato") :: apple = 42
|
|
end module
|