1 //===- RunnerUtils.cpp - Utils for MLIR exec on targets with a C++ runtime ===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements basic functions to debug structured MLIR types at
10 // runtime. Entities in this file may not be compatible with targets without a
11 // C++ runtime. These may be progressively migrated to CRunnerUtils.cpp over
12 // time.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "mlir/ExecutionEngine/RunnerUtils.h"
17 
18 extern "C" void
19 _mlir_ciface_print_memref_shape_i8(UnrankedMemRefType<int8_t> *M) {
20   std::cout << "Unranked Memref ";
21   printMemRefMetaData(std::cout, DynamicMemRefType<int8_t>(*M));
22   std::cout << "\n";
23 }
24 
25 extern "C" void
26 _mlir_ciface_print_memref_shape_i32(UnrankedMemRefType<int32_t> *M) {
27   std::cout << "Unranked Memref ";
28   printMemRefMetaData(std::cout, DynamicMemRefType<int32_t>(*M));
29   std::cout << "\n";
30 }
31 
32 extern "C" void
33 _mlir_ciface_print_memref_shape_i64(UnrankedMemRefType<int64_t> *M) {
34   std::cout << "Unranked Memref ";
35   printMemRefMetaData(std::cout, DynamicMemRefType<int64_t>(*M));
36   std::cout << "\n";
37 }
38 
39 extern "C" void
40 _mlir_ciface_print_memref_shape_f32(UnrankedMemRefType<float> *M) {
41   std::cout << "Unranked Memref ";
42   printMemRefMetaData(std::cout, DynamicMemRefType<float>(*M));
43   std::cout << "\n";
44 }
45 
46 extern "C" void
47 _mlir_ciface_print_memref_shape_f64(UnrankedMemRefType<double> *M) {
48   std::cout << "Unranked Memref ";
49   printMemRefMetaData(std::cout, DynamicMemRefType<double>(*M));
50   std::cout << "\n";
51 }
52 
53 extern "C" void _mlir_ciface_print_memref_vector_4x4xf32(
54     StridedMemRefType<Vector2D<4, 4, float>, 2> *M) {
55   impl::printMemRef(*M);
56 }
57 
58 extern "C" void _mlir_ciface_print_memref_i8(UnrankedMemRefType<int8_t> *M) {
59   impl::printMemRef(*M);
60 }
61 
62 extern "C" void _mlir_ciface_print_memref_i32(UnrankedMemRefType<int32_t> *M) {
63   impl::printMemRef(*M);
64 }
65 
66 extern "C" void _mlir_ciface_print_memref_i64(UnrankedMemRefType<int64_t> *M) {
67   impl::printMemRef(*M);
68 }
69 
70 extern "C" void _mlir_ciface_print_memref_f32(UnrankedMemRefType<float> *M) {
71   impl::printMemRef(*M);
72 }
73 
74 extern "C" void _mlir_ciface_print_memref_f64(UnrankedMemRefType<double> *M) {
75   impl::printMemRef(*M);
76 }
77 
78 extern "C" void print_memref_i32(int64_t rank, void *ptr) {
79   UnrankedMemRefType<int32_t> descriptor = {rank, ptr};
80   _mlir_ciface_print_memref_i32(&descriptor);
81 }
82 
83 extern "C" void print_memref_i64(int64_t rank, void *ptr) {
84   UnrankedMemRefType<int64_t> descriptor = {rank, ptr};
85   _mlir_ciface_print_memref_i64(&descriptor);
86 }
87 
88 extern "C" void print_memref_f32(int64_t rank, void *ptr) {
89   UnrankedMemRefType<float> descriptor = {rank, ptr};
90   _mlir_ciface_print_memref_f32(&descriptor);
91 }
92 
93 extern "C" void print_memref_f64(int64_t rank, void *ptr) {
94   UnrankedMemRefType<double> descriptor = {rank, ptr};
95   _mlir_ciface_print_memref_f64(&descriptor);
96 }
97 
98 extern "C" void
99 _mlir_ciface_print_memref_0d_f32(StridedMemRefType<float, 0> *M) {
100   impl::printMemRef(*M);
101 }
102 extern "C" void
103 _mlir_ciface_print_memref_1d_f32(StridedMemRefType<float, 1> *M) {
104   impl::printMemRef(*M);
105 }
106 extern "C" void
107 _mlir_ciface_print_memref_2d_f32(StridedMemRefType<float, 2> *M) {
108   impl::printMemRef(*M);
109 }
110 extern "C" void
111 _mlir_ciface_print_memref_3d_f32(StridedMemRefType<float, 3> *M) {
112   impl::printMemRef(*M);
113 }
114 extern "C" void
115 _mlir_ciface_print_memref_4d_f32(StridedMemRefType<float, 4> *M) {
116   impl::printMemRef(*M);
117 }
118 
119 extern "C" int64_t
120 _mlir_ciface_verifyMemRefI32(UnrankedMemRefType<int32_t> *actual,
121                              UnrankedMemRefType<int32_t> *expected) {
122   return impl::verifyMemRef(*actual, *expected);
123 }
124 
125 extern "C" int64_t
126 _mlir_ciface_verifyMemRefF32(UnrankedMemRefType<float> *actual,
127                              UnrankedMemRefType<float> *expected) {
128   return impl::verifyMemRef(*actual, *expected);
129 }
130 
131 extern "C" int64_t
132 _mlir_ciface_verifyMemRefF64(UnrankedMemRefType<double> *actual,
133                              UnrankedMemRefType<double> *expected) {
134   return impl::verifyMemRef(*actual, *expected);
135 }
136 
137 extern "C" int64_t verifyMemRefI32(int64_t rank, void *actualPtr,
138                                    void *expectedPtr) {
139   UnrankedMemRefType<int32_t> actualDesc = {rank, actualPtr};
140   UnrankedMemRefType<int32_t> expectedDesc = {rank, expectedPtr};
141   return _mlir_ciface_verifyMemRefI32(&actualDesc, &expectedDesc);
142 }
143 
144 extern "C" int64_t verifyMemRefF32(int64_t rank, void *actualPtr,
145                                    void *expectedPtr) {
146   UnrankedMemRefType<float> actualDesc = {rank, actualPtr};
147   UnrankedMemRefType<float> expectedDesc = {rank, expectedPtr};
148   return _mlir_ciface_verifyMemRefF32(&actualDesc, &expectedDesc);
149 }
150 
151 extern "C" int64_t verifyMemRefF64(int64_t rank, void *actualPtr,
152                                    void *expectedPtr) {
153   UnrankedMemRefType<double> actualDesc = {rank, actualPtr};
154   UnrankedMemRefType<double> expectedDesc = {rank, expectedPtr};
155   return _mlir_ciface_verifyMemRefF64(&actualDesc, &expectedDesc);
156 }
157