diff --git a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.h b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.h index a7bf8796c0277..078c7d12f6f22 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.h +++ b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.h @@ -9,6 +9,7 @@ #ifndef MLIR_DIALECT_LLVMIR_TRANSFORMS_PASSES_H #define MLIR_DIALECT_LLVMIR_TRANSFORMS_PASSES_H +#include "mlir/Dialect/LLVMIR/LLVMAttrs.h" #include "mlir/Dialect/LLVMIR/Transforms/AddComdats.h" #include "mlir/Dialect/LLVMIR/Transforms/LegalizeForExport.h" #include "mlir/Dialect/LLVMIR/Transforms/OptimizeForNVVM.h" @@ -23,6 +24,7 @@ namespace LLVM { std::unique_ptr createDIScopeForLLVMFuncOpPass(); /// Generate the code for registering conversion passes. +#define GEN_PASS_DECL #define GEN_PASS_REGISTRATION #include "mlir/Dialect/LLVMIR/Transforms/Passes.h.inc" diff --git a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td index 11d1b94110714..d54bc55c9edaa 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td +++ b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td @@ -61,6 +61,16 @@ def DIScopeForLLVMFuncOp : Pass<"ensure-debug-info-scope-on-llvm-func", "::mlir: }]; let constructor = "mlir::LLVM::createDIScopeForLLVMFuncOpPass()"; + let options = [ + Option<"emissionKind", "emission-kind", "mlir::LLVM::DIEmissionKind", + /*default=*/"mlir::LLVM::DIEmissionKind::LineTablesOnly", "Emission kind to generate debug info.", + [{::llvm::cl::values( + clEnumValN(::mlir::LLVM::DIEmissionKind::None, "None", "None"), + clEnumValN(::mlir::LLVM::DIEmissionKind::Full, "Full", "Full"), + clEnumValN(::mlir::LLVM::DIEmissionKind::LineTablesOnly, "LineTablesOnly", "LineTablesOnly (default)"), + clEnumValN(::mlir::LLVM::DIEmissionKind::DebugDirectivesOnly, "DebugDirectivesOnly", "DebugDirectivesOnly") + )}]>, + ]; } #endif // MLIR_DIALECT_LLVMIR_TRANSFORMS_PASSES diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp index 758700c9272bc..c75f44bf3976a 100644 --- a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp +++ b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp @@ -118,7 +118,7 @@ struct DIScopeForLLVMFuncOp compileUnitAttr = LLVM::DICompileUnitAttr::get( DistinctAttr::create(UnitAttr::get(context)), llvm::dwarf::DW_LANG_C, fileAttr, StringAttr::get(context, "MLIR"), - /*isOptimized=*/true, LLVM::DIEmissionKind::LineTablesOnly); + /*isOptimized=*/true, emissionKind); } // Create subprograms for each function with the same distinct compile unit. diff --git a/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir b/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir index f63132d42ab71..df7fe2c5c615a 100644 --- a/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir +++ b/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir @@ -1,4 +1,5 @@ // RUN: mlir-opt %s --pass-pipeline="builtin.module(ensure-debug-info-scope-on-llvm-func)" --split-input-file --mlir-print-debuginfo | FileCheck %s +// RUN: mlir-opt %s --pass-pipeline="builtin.module(ensure-debug-info-scope-on-llvm-func{emission-kind=DebugDirectivesOnly})" --split-input-file --mlir-print-debuginfo | FileCheck --check-prefix=CHECK_OTHER_KIND %s // CHECK-LABEL: llvm.func @func_no_debug() // CHECK: llvm.return loc(#loc @@ -31,6 +32,7 @@ module { // CHECK: #di_file = #llvm.di_file<"" in ""> // CHECK: #di_subprogram = #llvm.di_subprogram, compileUnit = #di_compile_unit, scope = #di_file, name = "func_with_debug", linkageName = "func_with_debug", file = #di_file, line = 42, scopeLine = 42, subprogramFlags = "Definition|Optimized", type = #di_subroutine_type> // CHECK: #loc[[LOC]] = loc(fused<#di_subprogram> +// CHECK_OTHER_KIND: emissionKind = DebugDirectivesOnly module { llvm.func @func_with_debug() { llvm.return loc(#loc1)