From c06d841053415c26bba1ae29063f466752f5c6de Mon Sep 17 00:00:00 2001 From: Abid Qadeer Date: Fri, 18 Oct 2024 19:09:53 +0100 Subject: [PATCH 1/2] [flang][debug] Support fir.vector type. --- .../Transforms/DebugTypeGenerator.cpp | 27 +++++++++++++++++++ .../Optimizer/Transforms/DebugTypeGenerator.h | 4 +++ flang/test/Transforms/debug-vector-type.fir | 23 ++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 flang/test/Transforms/debug-vector-type.fir diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 84f7873a9fd00..5b6b5b22409b5 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -401,6 +401,31 @@ 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; + return mlir::LLVM::DICompositeTypeAttr::get( + context, llvm::dwarf::DW_TAG_array_type, /*name=*/nullptr, + /*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 +541,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..01f68d87286dc --- /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> +} From 2abf2a6ea6f8faef323302f20f7805e09045da4c Mon Sep 17 00:00:00 2001 From: Abid Qadeer Date: Wed, 23 Oct 2024 13:11:41 +0100 Subject: [PATCH 2/2] Generate more descriptive name for the vector type. --- flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp | 10 +++++++++- flang/test/Transforms/debug-vector-type.fir | 10 +++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 5b6b5b22409b5..6b125a4aa39fc 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -418,8 +418,16 @@ mlir::LLVM::DITypeAttr DebugTypeGenerator::convertVectorType( 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, /*name=*/nullptr, + 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, diff --git a/flang/test/Transforms/debug-vector-type.fir b/flang/test/Transforms/debug-vector-type.fir index 01f68d87286dc..63846ce006c6c 100644 --- a/flang/test/Transforms/debug-vector-type.fir +++ b/flang/test/Transforms/debug-vector-type.fir @@ -3,21 +3,21 @@ 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> +// 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> +// 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> +// 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> +// 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> +// CHECK-DAG: #llvm.di_composite_type> }