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 #include <chrono>
18 
19 // NOLINTBEGIN(*-identifier-naming)
20 
_mlir_ciface_printMemrefShapeI8(UnrankedMemRefType<int8_t> * M)21 extern "C" void _mlir_ciface_printMemrefShapeI8(UnrankedMemRefType<int8_t> *M) {
22   std::cout << "Unranked Memref ";
23   printMemRefMetaData(std::cout, DynamicMemRefType<int8_t>(*M));
24   std::cout << "\n";
25 }
26 
27 extern "C" void
_mlir_ciface_printMemrefShapeI32(UnrankedMemRefType<int32_t> * M)28 _mlir_ciface_printMemrefShapeI32(UnrankedMemRefType<int32_t> *M) {
29   std::cout << "Unranked Memref ";
30   printMemRefMetaData(std::cout, DynamicMemRefType<int32_t>(*M));
31   std::cout << "\n";
32 }
33 
34 extern "C" void
_mlir_ciface_printMemrefShapeI64(UnrankedMemRefType<int64_t> * M)35 _mlir_ciface_printMemrefShapeI64(UnrankedMemRefType<int64_t> *M) {
36   std::cout << "Unranked Memref ";
37   printMemRefMetaData(std::cout, DynamicMemRefType<int64_t>(*M));
38   std::cout << "\n";
39 }
40 
_mlir_ciface_printMemrefShapeF32(UnrankedMemRefType<float> * M)41 extern "C" void _mlir_ciface_printMemrefShapeF32(UnrankedMemRefType<float> *M) {
42   std::cout << "Unranked Memref ";
43   printMemRefMetaData(std::cout, DynamicMemRefType<float>(*M));
44   std::cout << "\n";
45 }
46 
47 extern "C" void
_mlir_ciface_printMemrefShapeF64(UnrankedMemRefType<double> * M)48 _mlir_ciface_printMemrefShapeF64(UnrankedMemRefType<double> *M) {
49   std::cout << "Unranked Memref ";
50   printMemRefMetaData(std::cout, DynamicMemRefType<double>(*M));
51   std::cout << "\n";
52 }
53 
_mlir_ciface_printMemrefVector4x4xf32(StridedMemRefType<Vector2D<4,4,float>,2> * M)54 extern "C" void _mlir_ciface_printMemrefVector4x4xf32(
55     StridedMemRefType<Vector2D<4, 4, float>, 2> *M) {
56   impl::printMemRef(*M);
57 }
58 
_mlir_ciface_printMemrefI8(UnrankedMemRefType<int8_t> * M)59 extern "C" void _mlir_ciface_printMemrefI8(UnrankedMemRefType<int8_t> *M) {
60   impl::printMemRef(*M);
61 }
62 
_mlir_ciface_printMemrefI32(UnrankedMemRefType<int32_t> * M)63 extern "C" void _mlir_ciface_printMemrefI32(UnrankedMemRefType<int32_t> *M) {
64   impl::printMemRef(*M);
65 }
66 
_mlir_ciface_printMemrefI64(UnrankedMemRefType<int64_t> * M)67 extern "C" void _mlir_ciface_printMemrefI64(UnrankedMemRefType<int64_t> *M) {
68   impl::printMemRef(*M);
69 }
70 
_mlir_ciface_printMemrefF32(UnrankedMemRefType<float> * M)71 extern "C" void _mlir_ciface_printMemrefF32(UnrankedMemRefType<float> *M) {
72   impl::printMemRef(*M);
73 }
74 
_mlir_ciface_printMemrefF64(UnrankedMemRefType<double> * M)75 extern "C" void _mlir_ciface_printMemrefF64(UnrankedMemRefType<double> *M) {
76   impl::printMemRef(*M);
77 }
78 
_mlir_ciface_nanoTime()79 extern "C" int64_t _mlir_ciface_nanoTime() {
80   auto now = std::chrono::high_resolution_clock::now();
81   auto duration = now.time_since_epoch();
82   auto nanoseconds =
83       std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
84   return nanoseconds.count();
85 }
86 
printMemrefI32(int64_t rank,void * ptr)87 extern "C" void printMemrefI32(int64_t rank, void *ptr) {
88   UnrankedMemRefType<int32_t> descriptor = {rank, ptr};
89   _mlir_ciface_printMemrefI32(&descriptor);
90 }
91 
printMemrefI64(int64_t rank,void * ptr)92 extern "C" void printMemrefI64(int64_t rank, void *ptr) {
93   UnrankedMemRefType<int64_t> descriptor = {rank, ptr};
94   _mlir_ciface_printMemrefI64(&descriptor);
95 }
96 
printMemrefF32(int64_t rank,void * ptr)97 extern "C" void printMemrefF32(int64_t rank, void *ptr) {
98   UnrankedMemRefType<float> descriptor = {rank, ptr};
99   _mlir_ciface_printMemrefF32(&descriptor);
100 }
101 
printMemrefF64(int64_t rank,void * ptr)102 extern "C" void printMemrefF64(int64_t rank, void *ptr) {
103   UnrankedMemRefType<double> descriptor = {rank, ptr};
104   _mlir_ciface_printMemrefF64(&descriptor);
105 }
106 
printCString(char * str)107 extern "C" void printCString(char *str) { printf("%s", str); }
108 
_mlir_ciface_printMemref0dF32(StridedMemRefType<float,0> * M)109 extern "C" void _mlir_ciface_printMemref0dF32(StridedMemRefType<float, 0> *M) {
110   impl::printMemRef(*M);
111 }
_mlir_ciface_printMemref1dF32(StridedMemRefType<float,1> * M)112 extern "C" void _mlir_ciface_printMemref1dF32(StridedMemRefType<float, 1> *M) {
113   impl::printMemRef(*M);
114 }
_mlir_ciface_printMemref2dF32(StridedMemRefType<float,2> * M)115 extern "C" void _mlir_ciface_printMemref2dF32(StridedMemRefType<float, 2> *M) {
116   impl::printMemRef(*M);
117 }
_mlir_ciface_printMemref3dF32(StridedMemRefType<float,3> * M)118 extern "C" void _mlir_ciface_printMemref3dF32(StridedMemRefType<float, 3> *M) {
119   impl::printMemRef(*M);
120 }
_mlir_ciface_printMemref4dF32(StridedMemRefType<float,4> * M)121 extern "C" void _mlir_ciface_printMemref4dF32(StridedMemRefType<float, 4> *M) {
122   impl::printMemRef(*M);
123 }
124 
125 extern "C" int64_t
_mlir_ciface_verifyMemRefI32(UnrankedMemRefType<int32_t> * actual,UnrankedMemRefType<int32_t> * expected)126 _mlir_ciface_verifyMemRefI32(UnrankedMemRefType<int32_t> *actual,
127                              UnrankedMemRefType<int32_t> *expected) {
128   return impl::verifyMemRef(*actual, *expected);
129 }
130 
131 extern "C" int64_t
_mlir_ciface_verifyMemRefF32(UnrankedMemRefType<float> * actual,UnrankedMemRefType<float> * expected)132 _mlir_ciface_verifyMemRefF32(UnrankedMemRefType<float> *actual,
133                              UnrankedMemRefType<float> *expected) {
134   return impl::verifyMemRef(*actual, *expected);
135 }
136 
137 extern "C" int64_t
_mlir_ciface_verifyMemRefF64(UnrankedMemRefType<double> * actual,UnrankedMemRefType<double> * expected)138 _mlir_ciface_verifyMemRefF64(UnrankedMemRefType<double> *actual,
139                              UnrankedMemRefType<double> *expected) {
140   return impl::verifyMemRef(*actual, *expected);
141 }
142 
verifyMemRefI32(int64_t rank,void * actualPtr,void * expectedPtr)143 extern "C" int64_t verifyMemRefI32(int64_t rank, void *actualPtr,
144                                    void *expectedPtr) {
145   UnrankedMemRefType<int32_t> actualDesc = {rank, actualPtr};
146   UnrankedMemRefType<int32_t> expectedDesc = {rank, expectedPtr};
147   return _mlir_ciface_verifyMemRefI32(&actualDesc, &expectedDesc);
148 }
149 
verifyMemRefF32(int64_t rank,void * actualPtr,void * expectedPtr)150 extern "C" int64_t verifyMemRefF32(int64_t rank, void *actualPtr,
151                                    void *expectedPtr) {
152   UnrankedMemRefType<float> actualDesc = {rank, actualPtr};
153   UnrankedMemRefType<float> expectedDesc = {rank, expectedPtr};
154   return _mlir_ciface_verifyMemRefF32(&actualDesc, &expectedDesc);
155 }
156 
verifyMemRefF64(int64_t rank,void * actualPtr,void * expectedPtr)157 extern "C" int64_t verifyMemRefF64(int64_t rank, void *actualPtr,
158                                    void *expectedPtr) {
159   UnrankedMemRefType<double> actualDesc = {rank, actualPtr};
160   UnrankedMemRefType<double> expectedDesc = {rank, expectedPtr};
161   return _mlir_ciface_verifyMemRefF64(&actualDesc, &expectedDesc);
162 }
163 
164 // NOLINTEND(*-identifier-naming)
165