diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 0187524d76cdd..cc99698ead33f 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -629,7 +629,12 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertPointerLikeType( return convertCharacterType(charTy, fileAttr, scope, declOp, /*hasDescriptor=*/true); - mlir::LLVM::DITypeAttr elTyAttr = convertType(elTy, fileAttr, scope, declOp); + // If elTy is null or none then generate a void* + mlir::LLVM::DITypeAttr elTyAttr; + if (!elTy || mlir::isa(elTy)) + elTyAttr = mlir::LLVM::DINullTypeAttr::get(context); + else + elTyAttr = convertType(elTy, fileAttr, scope, declOp); return mlir::LLVM::DIDerivedTypeAttr::get( context, llvm::dwarf::DW_TAG_pointer_type, @@ -679,8 +684,8 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, return genBasicType(context, mlir::StringAttr::get(context, "integer"), llvmTypeConverter.getIndexTypeBitwidth(), llvm::dwarf::DW_ATE_signed); - } else if (auto boxTy = mlir::dyn_cast_or_null(Ty)) { - auto elTy = boxTy.getElementType(); + } else if (auto boxTy = mlir::dyn_cast_or_null(Ty)) { + auto elTy = boxTy.getEleTy(); if (auto seqTy = mlir::dyn_cast_or_null(elTy)) return convertBoxedSequenceType(seqTy, fileAttr, scope, declOp, false, false); @@ -692,7 +697,9 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, return convertPointerLikeType(ptrTy.getElementType(), fileAttr, scope, declOp, /*genAllocated=*/false, /*genAssociated=*/true); - return genPlaceholderType(context); + return convertPointerLikeType(elTy, fileAttr, scope, declOp, + /*genAllocated=*/false, + /*genAssociated=*/false); } else { // FIXME: These types are currently unhandled. We are generating a // placeholder type to allow us to test supported bits. diff --git a/flang/test/Transforms/debug-class-type.fir b/flang/test/Transforms/debug-class-type.fir new file mode 100644 index 0000000000000..aad15a831fd2f --- /dev/null +++ b/flang/test/Transforms/debug-class-type.fir @@ -0,0 +1,34 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module attributes {dlti.dl_spec = #dlti.dl_spec<>} { + fir.type_info @_QTtest_type nofinal : !fir.type<_QTtest_type{a:i32,b:!fir.box>>}> dispatch_table { + fir.dt_entry "test_proc", @_QPtest_proc + } loc(#loc1) + func.func private @_QPtest_proc(%arg0: !fir.class>>}>>) + + func.func @test() { + %0 = fir.address_of(@_QFEx) : !fir.ref>>}>>>> + %1 = fircg.ext_declare %0 {uniq_name = "_QFEx"} : (!fir.ref>>}>>>>) -> !fir.ref>>}>>>> loc(#loc3) + %2 = fir.address_of(@_QFEy) : !fir.ref>>}>>>> + %3 = fircg.ext_declare %2 {uniq_name = "_QFEy"} : (!fir.ref>>}>>>>) -> !fir.ref>>}>>>> loc(#loc4) + %4 = fir.address_of(@_QFEz) : !fir.ref> + %5 = fircg.ext_declare %4 {uniq_name = "_QFEz"} : (!fir.ref>) -> !fir.ref> loc(#loc4) + %6 = fir.address_of(@_QFEt) : !fir.ref>> + %7 = fircg.ext_declare %6 {uniq_name = "_QFEt"} : (!fir.ref>>) -> !fir.ref>> loc(#loc4) + return + } loc(#loc2) +} + +#loc1 = loc("./simple.f90":2:1) +#loc2 = loc("./simple.f90":10:1) +#loc3 = loc("./simple.f90":15:1) +#loc4 = loc("./simple.f90":22:1) + +// CHECK-DAG: #[[TY1:.*]] = #llvm.di_composite_type<{{.*}}name = "test_type"{{.*}}> +// CHECK-DAG: #[[TY2:.*]] = #llvm.di_derived_type +// CHECK-DAG: #[[TY3:.*]] = #llvm.di_derived_type +// CHECK-DAG: #llvm.di_subroutine_type +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "x"{{.*}}type = #[[TY2]]> +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "y"{{.*}}type = #[[TY2]]> +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "z"{{.*}}type = #[[TY3]]> +// CHECK-DAG: #llvm.di_local_variable<{{.*}}name = "t"{{.*}}type = #[[TY3]]>