diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 84f7873a9fd00..6b125a4aa39fc 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -401,6 +401,39 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertSequenceType( /*associated=*/nullptr); } +mlir::LLVM::DITypeAttr DebugTypeGenerator::convertVectorType( + fir::VectorType vecTy, mlir::LLVM::DIFileAttr fileAttr, + mlir::LLVM::DIScopeAttr scope, fir::cg::XDeclareOp declOp) { + mlir::MLIRContext *context = module.getContext(); + + llvm::SmallVector elements; + mlir::LLVM::DITypeAttr elemTy = + convertType(vecTy.getEleTy(), fileAttr, scope, declOp); + auto intTy = mlir::IntegerType::get(context, 64); + auto countAttr = + mlir::IntegerAttr::get(intTy, llvm::APInt(64, vecTy.getLen())); + auto subrangeTy = mlir::LLVM::DISubrangeAttr::get( + context, countAttr, /*lowerBound=*/nullptr, /*upperBound=*/nullptr, + /*stride=*/nullptr); + elements.push_back(subrangeTy); + mlir::Type llvmTy = llvmTypeConverter.convertType(vecTy.getEleTy()); + uint64_t sizeInBits = dataLayout->getTypeSize(llvmTy) * vecTy.getLen() * 8; + std::string name("vector"); + // The element type of the vector must be integer or real so it will be a + // DIBasicTypeAttr. + if (auto ty = mlir::dyn_cast_if_present(elemTy)) + name += " " + ty.getName().str(); + + name += " (" + std::to_string(vecTy.getLen()) + ")"; + return mlir::LLVM::DICompositeTypeAttr::get( + context, llvm::dwarf::DW_TAG_array_type, + mlir::StringAttr::get(context, name), + /*file=*/nullptr, /*line=*/0, /*scope=*/nullptr, elemTy, + mlir::LLVM::DIFlags::Vector, sizeInBits, /*alignInBits=*/0, elements, + /*dataLocation=*/nullptr, /*rank=*/nullptr, /*allocated=*/nullptr, + /*associated=*/nullptr); +} + mlir::LLVM::DITypeAttr DebugTypeGenerator::convertCharacterType( fir::CharacterType charTy, mlir::LLVM::DIFileAttr fileAttr, mlir::LLVM::DIScopeAttr scope, fir::cg::XDeclareOp declOp, @@ -516,6 +549,8 @@ DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, return convertPointerLikeType(elTy, fileAttr, scope, declOp, /*genAllocated=*/false, /*genAssociated=*/false); + } else if (auto vecTy = mlir::dyn_cast_or_null(Ty)) { + return convertVectorType(vecTy, fileAttr, scope, declOp); } else if (auto boxTy = mlir::dyn_cast_or_null(Ty)) { auto elTy = boxTy.getElementType(); if (auto seqTy = mlir::dyn_cast_or_null(elTy)) diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.h b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.h index ff600e751eb0b..eeefb6c463d93 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.h +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.h @@ -43,6 +43,10 @@ class DebugTypeGenerator { mlir::LLVM::DIFileAttr fileAttr, mlir::LLVM::DIScopeAttr scope, fir::cg::XDeclareOp declOp); + mlir::LLVM::DITypeAttr convertVectorType(fir::VectorType vecTy, + mlir::LLVM::DIFileAttr fileAttr, + mlir::LLVM::DIScopeAttr scope, + fir::cg::XDeclareOp declOp); /// The 'genAllocated' is true when we want to generate 'allocated' field /// in the DICompositeType. It is needed for the allocatable arrays. diff --git a/flang/test/Transforms/debug-vector-type.fir b/flang/test/Transforms/debug-vector-type.fir new file mode 100644 index 0000000000000..63846ce006c6c --- /dev/null +++ b/flang/test/Transforms/debug-vector-type.fir @@ -0,0 +1,23 @@ +// RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s + +module attributes {dlti.dl_spec = #dlti.dl_spec<>} { +func.func private @foo1(%arg0: !fir.vector<20:bf16>) +// CHECK-DAG: #[[F16:.*]] = #llvm.di_basic_type +// CHECK-DAG: #llvm.di_composite_type> + +func.func private @foo2(%arg0: !fir.vector<30:f32>) +// CHECK-DAG: #[[F32:.*]] = #llvm.di_basic_type +// CHECK-DAG: #llvm.di_composite_type> + +func.func private @foo3(%arg0: !fir.vector<10:f64>) +// CHECK-DAG: #[[F64:.*]] = #llvm.di_basic_type +// CHECK-DAG: #llvm.di_composite_type> + +func.func private @foo4(%arg0: !fir.vector<5:i32>) +// CHECK-DAG: #[[I32:.*]] = #llvm.di_basic_type +// CHECK-DAG: #llvm.di_composite_type> + +func.func private @foo5(%arg0: !fir.vector<2:i64>) +// CHECK-DAG: #[[I64:.*]] = #llvm.di_basic_type +// CHECK-DAG: #llvm.di_composite_type> +}