Skip to content

Commit

Permalink
Reland [flang][cuda] Add c_devptr and bypass output semantic check (l…
Browse files Browse the repository at this point in the history
…lvm#107353)

Add a builtin type for c_devptr since it will need some special handling
for some function like c_f_pointer.
`c_ptr` is defined as a builtin type and was raising a semantic error if
you try to use it in a I/O statement. This patch add a check for c_ptr
and c_devptr to bypass the semantic check and allow the variables of
these types to be used in I/O.

This version of the patch keeps the semantic error when -pedantic is
enabled to align with gfortran.
  • Loading branch information
clementval authored Sep 5, 2024
1 parent 7cf18ff commit 92e75c0
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 1 deletion.
2 changes: 1 addition & 1 deletion flang/include/flang/Common/Fortran-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
BadBranchTarget, ConvertedArgument, HollerithPolymorphic, ListDirectedSize,
NonBindCInteroperability, CudaManaged, CudaUnified,
PolymorphicActualAllocatableOrPointerToMonomorphicDummy, RelaxedPureDummy,
UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram)
UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram, PrintCptr)

// Portability and suspicious usage warnings
ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
Expand Down
6 changes: 6 additions & 0 deletions flang/lib/Semantics/check-io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1171,6 +1171,12 @@ parser::Message *IoChecker::CheckForBadIoType(const evaluate::DynamicType &type,
"Derived type '%s' in I/O may not be polymorphic unless using defined I/O"_err_en_US,
derived.name());
}
if ((IsBuiltinDerivedType(&derived, "c_ptr") ||
IsBuiltinDerivedType(&derived, "c_devptr")) &&
!context_.ShouldWarn(common::LanguageFeature::PrintCptr)) {
// Bypass the check below for c_ptr and c_devptr.
return nullptr;
}
if (const Symbol *
bad{FindInaccessibleComponent(which, derived, scope)}) {
return &context_.Say(where,
Expand Down
4 changes: 4 additions & 0 deletions flang/module/__fortran_builtins.f90
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@
__builtin_threadIdx, __builtin_blockDim, __builtin_blockIdx, &
__builtin_gridDim
integer, parameter, public :: __builtin_warpsize = 32

type, public, bind(c) :: __builtin_c_devptr
type(__builtin_c_ptr) :: cptr
end type

intrinsic :: __builtin_fma
intrinsic :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
Expand Down
16 changes: 16 additions & 0 deletions flang/test/Lower/CUDA/cuda-devptr.cuf
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s

! Test CUDA Fortran specific type

subroutine sub1()
use iso_c_binding
use __fortran_builtins, only : c_devptr => __builtin_c_devptr

type(c_ptr) :: ptr
type(c_devptr) :: dptr
print*,ptr
print*,dptr
end

! CHECK-LABEL: func.func @_QPsub1()
! CHECK-COUNT-2: %{{.*}} = fir.call @_FortranAioOutputDerivedType

0 comments on commit 92e75c0

Please sign in to comment.