| // Copyright (c) 2017 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <string> |
| #include <vector> |
| |
| #include "gmock/gmock.h" |
| #include "test/link/linker_fixture.h" |
| |
| namespace spvtools { |
| namespace { |
| |
| using UniqueIds = spvtest::LinkerTest; |
| |
| TEST_F(UniqueIds, UniquelyMerged) { |
| std::vector<std::string> bodies(2); |
| bodies[0] = |
| // clang-format off |
| "OpCapability Shader\n" |
| "%1 = OpExtInstImport \"GLSL.std.450\"\n" |
| "OpMemoryModel Logical GLSL450\n" |
| "OpEntryPoint Vertex %main \"main\"\n" |
| "OpSource ESSL 310\n" |
| "OpName %main \"main\"\n" |
| "OpName %f_ \"f(\"\n" |
| "OpName %gv1 \"gv1\"\n" |
| "OpName %gv2 \"gv2\"\n" |
| "OpName %lv1 \"lv1\"\n" |
| "OpName %lv2 \"lv2\"\n" |
| "OpName %lv1_0 \"lv1\"\n" |
| "%void = OpTypeVoid\n" |
| "%10 = OpTypeFunction %void\n" |
| "%float = OpTypeFloat 32\n" |
| "%12 = OpTypeFunction %float\n" |
| "%_ptr_Private_float = OpTypePointer Private %float\n" |
| "%gv1 = OpVariable %_ptr_Private_float Private\n" |
| "%float_10 = OpConstant %float 10\n" |
| "%gv2 = OpVariable %_ptr_Private_float Private\n" |
| "%float_100 = OpConstant %float 100\n" |
| "%_ptr_Function_float = OpTypePointer Function %float\n" |
| "%main = OpFunction %void None %10\n" |
| "%17 = OpLabel\n" |
| "%lv1_0 = OpVariable %_ptr_Function_float Function\n" |
| "OpStore %gv1 %float_10\n" |
| "OpStore %gv2 %float_100\n" |
| "%18 = OpLoad %float %gv1\n" |
| "%19 = OpLoad %float %gv2\n" |
| "%20 = OpFSub %float %18 %19\n" |
| "OpStore %lv1_0 %20\n" |
| "OpReturn\n" |
| "OpFunctionEnd\n" |
| "%f_ = OpFunction %float None %12\n" |
| "%21 = OpLabel\n" |
| "%lv1 = OpVariable %_ptr_Function_float Function\n" |
| "%lv2 = OpVariable %_ptr_Function_float Function\n" |
| "%22 = OpLoad %float %gv1\n" |
| "%23 = OpLoad %float %gv2\n" |
| "%24 = OpFAdd %float %22 %23\n" |
| "OpStore %lv1 %24\n" |
| "%25 = OpLoad %float %gv1\n" |
| "%26 = OpLoad %float %gv2\n" |
| "%27 = OpFMul %float %25 %26\n" |
| "OpStore %lv2 %27\n" |
| "%28 = OpLoad %float %lv1\n" |
| "%29 = OpLoad %float %lv2\n" |
| "%30 = OpFDiv %float %28 %29\n" |
| "OpReturnValue %30\n" |
| "OpFunctionEnd\n"; |
| // clang-format on |
| bodies[1] = |
| // clang-format off |
| "OpCapability Shader\n" |
| "%1 = OpExtInstImport \"GLSL.std.450\"\n" |
| "OpMemoryModel Logical GLSL450\n" |
| "OpSource ESSL 310\n" |
| "OpName %main \"main2\"\n" |
| "OpName %f_ \"f(\"\n" |
| "OpName %gv1 \"gv12\"\n" |
| "OpName %gv2 \"gv22\"\n" |
| "OpName %lv1 \"lv12\"\n" |
| "OpName %lv2 \"lv22\"\n" |
| "OpName %lv1_0 \"lv12\"\n" |
| "%void = OpTypeVoid\n" |
| "%10 = OpTypeFunction %void\n" |
| "%float = OpTypeFloat 32\n" |
| "%12 = OpTypeFunction %float\n" |
| "%_ptr_Private_float = OpTypePointer Private %float\n" |
| "%gv1 = OpVariable %_ptr_Private_float Private\n" |
| "%float_10 = OpConstant %float 10\n" |
| "%gv2 = OpVariable %_ptr_Private_float Private\n" |
| "%float_100 = OpConstant %float 100\n" |
| "%_ptr_Function_float = OpTypePointer Function %float\n" |
| "%main = OpFunction %void None %10\n" |
| "%17 = OpLabel\n" |
| "%lv1_0 = OpVariable %_ptr_Function_float Function\n" |
| "OpStore %gv1 %float_10\n" |
| "OpStore %gv2 %float_100\n" |
| "%18 = OpLoad %float %gv1\n" |
| "%19 = OpLoad %float %gv2\n" |
| "%20 = OpFSub %float %18 %19\n" |
| "OpStore %lv1_0 %20\n" |
| "OpReturn\n" |
| "OpFunctionEnd\n" |
| "%f_ = OpFunction %float None %12\n" |
| "%21 = OpLabel\n" |
| "%lv1 = OpVariable %_ptr_Function_float Function\n" |
| "%lv2 = OpVariable %_ptr_Function_float Function\n" |
| "%22 = OpLoad %float %gv1\n" |
| "%23 = OpLoad %float %gv2\n" |
| "%24 = OpFAdd %float %22 %23\n" |
| "OpStore %lv1 %24\n" |
| "%25 = OpLoad %float %gv1\n" |
| "%26 = OpLoad %float %gv2\n" |
| "%27 = OpFMul %float %25 %26\n" |
| "OpStore %lv2 %27\n" |
| "%28 = OpLoad %float %lv1\n" |
| "%29 = OpLoad %float %lv2\n" |
| "%30 = OpFDiv %float %28 %29\n" |
| "OpReturnValue %30\n" |
| "OpFunctionEnd\n"; |
| // clang-format on |
| |
| spvtest::Binary linked_binary; |
| LinkerOptions options; |
| options.SetVerifyIds(true); |
| spv_result_t res = AssembleAndLink(bodies, &linked_binary, options); |
| ASSERT_EQ(SPV_SUCCESS, res) << GetErrorMessage(); |
| EXPECT_THAT(GetErrorMessage(), std::string()); |
| } |
| |
| } // namespace |
| } // namespace spvtools |