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