This is an automated email from the ASF dual-hosted git repository.

wuwei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new 31803e6ec7 [LLVM] Lack of DWARF type is not an error (#16748)
31803e6ec7 is described below

commit 31803e6ec70f4cfd7401242a6481d7498790fe14
Author: Eric Lunderberg <[email protected]>
AuthorDate: Fri Mar 22 16:34:29 2024 -0500

    [LLVM] Lack of DWARF type is not an error (#16748)
    
    Prior to this commit, the `CodeGenLLVM::GetDebugType` would raise an
    exception if it could not convert the TIR data type to an equivalent
    DWARF type for debug symbols.  This commit updates the behavior to
    instead return `nullptr`, representing an unknown type in DWARF
---
 src/target/llvm/codegen_llvm.cc          | 25 ++++++++++++-------------
 tests/python/tir-base/test_debug_info.py | 23 ++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
index 8fe740dad1..938c18f198 100644
--- a/src/target/llvm/codegen_llvm.cc
+++ b/src/target/llvm/codegen_llvm.cc
@@ -2229,19 +2229,18 @@ llvm::DIType* CodeGenLLVM::GetDebugType(const Type& 
ty_tir, llvm::Type* ty_llvm)
 
   } else if (auto* prim_type = ty_tir.as<PrimTypeNode>()) {
     DataType dtype = prim_type->dtype;
-    auto dwarf_type = [&]() -> llvm::dwarf::TypeKind {
-      if (dtype.is_bool()) {
-        return llvm::dwarf::DW_ATE_boolean;
-      } else if (dtype.is_float()) {
-        return llvm::dwarf::DW_ATE_float;
-      } else if (dtype.is_int()) {
-        return llvm::dwarf::DW_ATE_signed;
-      } else if (dtype.is_uint()) {
-        return llvm::dwarf::DW_ATE_unsigned;
-      } else {
-        LOG(FATAL) << "No DWARF representation for TIR type " << dtype;
-      }
-    }();
+    llvm::dwarf::TypeKind dwarf_type;
+    if (dtype.is_bool()) {
+      dwarf_type = llvm::dwarf::DW_ATE_boolean;
+    } else if (dtype.is_float()) {
+      dwarf_type = llvm::dwarf::DW_ATE_float;
+    } else if (dtype.is_int()) {
+      dwarf_type = llvm::dwarf::DW_ATE_signed;
+    } else if (dtype.is_uint()) {
+      dwarf_type = llvm::dwarf::DW_ATE_unsigned;
+    } else {
+      return nullptr;
+    }
 
     return dbg_info_->di_builder_->createBasicType(DLDataType2String(dtype),
                                                    dtype.bits() * 
dtype.lanes(), dwarf_type);
diff --git a/tests/python/tir-base/test_debug_info.py 
b/tests/python/tir-base/test_debug_info.py
index a94d4d74f2..7fc9bcf316 100644
--- a/tests/python/tir-base/test_debug_info.py
+++ b/tests/python/tir-base/test_debug_info.py
@@ -19,7 +19,7 @@ import tvm
 import tvm.testing
 from tvm import tir
 from tvm import relay
-from tvm.script import tir as T
+from tvm.script import tir as T, ir as I
 
 from typing import List, Dict
 import re
@@ -165,5 +165,26 @@ def test_llvm_ir_debug_accuracy():
     assert debug_line_no == 56
 
 
+def test_building_without_llvm_equivalent():
+    """A TIR PrimFunc may contain non-LLVM types
+
+    Types used in optimized kernels (e.g. "e4m3_float8") may not have
+    an equivalent in DWARF, or the mapping from TIR type to DWARF type
+    may not be defined.  If this occurs, the function should still be
+    able to be built.
+    """
+
+    @I.ir_module
+    class Module:
+        @T.prim_func(private=True)
+        def main(A_data: T.handle("e4m3_float8"), B_data: 
T.handle("e4m3_float8")):
+            A = T.decl_buffer(128, "e4m3_float8", data=A_data)
+            B = T.decl_buffer(128, "e4m3_float8", data=B_data)
+            for i in range(128):
+                B[i] = A[i]
+
+    tvm.target.codegen.build_module(Module, "llvm")
+
+
 if __name__ == "__main__":
     tvm.testing.main()

Reply via email to