xref: /llvm-project/mlir/unittests/Parser/ResourceTest.cpp (revision ea488bd6e1f7bf52d6ec7a40c7116670f06e92a6)
1 //===- ResourceTest.cpp -----------------------------------------*- C++ -*-===//
2 //
3 // This file is licensed 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 #include "../../test/lib/Dialect/Test/TestAttributes.h"
10 #include "../../test/lib/Dialect/Test/TestDialect.h"
11 #include "mlir/Parser/Parser.h"
12 
13 #include "gmock/gmock.h"
14 
15 using namespace mlir;
16 
17 namespace {
TEST(MLIRParser,ResourceKeyConflict)18 TEST(MLIRParser, ResourceKeyConflict) {
19   std::string moduleStr = R"mlir(
20     "test.use1"() {attr = #test.e1di64_elements<blob1> : tensor<3xi64> } : () -> ()
21 
22     {-#
23       dialect_resources: {
24         test: {
25           blob1: "0x08000000010000000000000002000000000000000300000000000000"
26         }
27       }
28     #-}
29   )mlir";
30   std::string moduleStr2 = R"mlir(
31     "test.use2"() {attr = #test.e1di64_elements<blob1> : tensor<3xi64> } : () -> ()
32 
33     {-#
34       dialect_resources: {
35         test: {
36           blob1: "0x08000000040000000000000005000000000000000600000000000000"
37         }
38       }
39     #-}
40   )mlir";
41 
42   MLIRContext context;
43   context.loadDialect<test::TestDialect>();
44 
45   // Parse both modules into the same context so that we ensure the conflicting
46   // resources have been loaded.
47   OwningOpRef<ModuleOp> module1 =
48       parseSourceString<ModuleOp>(moduleStr, &context);
49   OwningOpRef<ModuleOp> module2 =
50       parseSourceString<ModuleOp>(moduleStr2, &context);
51   ASSERT_TRUE(module1 && module2);
52 
53   // Merge the two modules so that we can test printing the remapped resources.
54   Block *block = module1->getBody();
55   block->getOperations().splice(block->end(),
56                                 module2->getBody()->getOperations());
57 
58   // Check that conflicting resources were remapped.
59   std::string outputStr;
60   {
61     llvm::raw_string_ostream os(outputStr);
62     module1->print(os);
63   }
64   StringRef output(outputStr);
65   EXPECT_TRUE(
66       output.contains("\"test.use1\"() {attr = #test.e1di64_elements<blob1>"));
67   EXPECT_TRUE(output.contains(
68       "blob1: \"0x08000000010000000000000002000000000000000300000000000000\""));
69   EXPECT_TRUE(output.contains(
70       "\"test.use2\"() {attr = #test.e1di64_elements<blob1_1>"));
71   EXPECT_TRUE(output.contains(
72       "blob1_1: "
73       "\"0x08000000040000000000000005000000000000000600000000000000\""));
74 }
75 } // namespace
76