1 // Copyright (c) 2016 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <vector>
16
17 #include "test/opt/pass_fixture.h"
18 #include "test/opt/pass_utils.h"
19
20 namespace spvtools {
21 namespace opt {
22 namespace {
23
24 using StripLineDebugInfoTest = PassTest<::testing::Test>;
25
TEST_F(StripLineDebugInfoTest,LineNoLine)26 TEST_F(StripLineDebugInfoTest, LineNoLine) {
27 std::vector<const char*> text = {
28 // clang-format off
29 "OpCapability Shader",
30 "%1 = OpExtInstImport \"GLSL.std.450\"",
31 "OpMemoryModel Logical GLSL450",
32 "OpEntryPoint Vertex %2 \"main\"",
33 "%3 = OpString \"minimal.vert\"",
34 "OpModuleProcessed \"42\"",
35 "OpModuleProcessed \"43\"",
36 "OpModuleProcessed \"44\"",
37 "OpNoLine",
38 "OpLine %3 10 10",
39 "%void = OpTypeVoid",
40 "OpLine %3 100 100",
41 "%5 = OpTypeFunction %void",
42 "%2 = OpFunction %void None %5",
43 "OpLine %3 1 1",
44 "OpNoLine",
45 "OpLine %3 2 2",
46 "OpLine %3 3 3",
47 "%6 = OpLabel",
48 "OpLine %3 4 4",
49 "OpNoLine",
50 "OpReturn",
51 "OpLine %3 4 4",
52 "OpNoLine",
53 "OpFunctionEnd",
54 // clang-format on
55 };
56 SinglePassRunAndCheck<StripDebugInfoPass>(JoinAllInsts(text),
57 JoinNonDebugInsts(text),
58 /* skip_nop = */ false);
59
60 // Let's add more debug instruction before the "OpString" instruction.
61 const std::vector<const char*> more_text = {
62 "OpSourceContinued \"I'm a happy shader! Yay! ;)\"",
63 "OpSourceContinued \"wahahaha\"",
64 "OpSource ESSL 310",
65 "OpSource ESSL 310",
66 "OpSourceContinued \"wahahaha\"",
67 "OpSourceContinued \"wahahaha\"",
68 "OpSourceExtension \"save-the-world-extension\"",
69 "OpName %2 \"main\"",
70 };
71 text.insert(text.begin() + 4, more_text.cbegin(), more_text.cend());
72 SinglePassRunAndCheck<StripDebugInfoPass>(JoinAllInsts(text),
73 JoinNonDebugInsts(text),
74 /* skip_nop = */ false);
75 }
76
77 using StripDebugInfoTest = PassTest<::testing::TestWithParam<const char*>>;
78
TEST_P(StripDebugInfoTest,Kind)79 TEST_P(StripDebugInfoTest, Kind) {
80 std::vector<const char*> text = {
81 "OpCapability Shader",
82 "OpMemoryModel Logical GLSL450",
83 GetParam(),
84 };
85 SinglePassRunAndCheck<StripDebugInfoPass>(JoinAllInsts(text),
86 JoinNonDebugInsts(text),
87 /* skip_nop = */ false);
88 }
89
90 // Test each possible non-line debug instruction.
91 // clang-format off
92 INSTANTIATE_TEST_CASE_P(
93 SingleKindDebugInst, StripDebugInfoTest,
94 ::testing::ValuesIn(std::vector<const char*>({
95 "OpSourceContinued \"I'm a happy shader! Yay! ;)\"",
96 "OpSource ESSL 310",
97 "OpSourceExtension \"save-the-world-extension\"",
98 "OpName %main \"main\"",
99 "OpMemberName %struct 0 \"field\"",
100 "%1 = OpString \"name.vert\"",
101 "OpModuleProcessed \"42\"",
102 })));
103 // clang-format on
104
105 } // namespace
106 } // namespace opt
107 } // namespace spvtools
108