1 //===- llvm/unittest/DebugInfo/LogicalView/LogicalElementsTest.cpp --------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
10 #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
11 #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
12 #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
13 #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
14 #include "llvm/Support/ScopedPrinter.h"
15 #include "llvm/Support/ToolOutputFile.h"
16 #include "llvm/Testing/Support/Error.h"
18 #include "gtest/gtest.h"
21 using namespace llvm::logicalview
;
25 class ReaderTestElements
: public LVReader
{
26 #define CREATE(VARIABLE, CREATE_FUNCTION) \
27 VARIABLE = CREATE_FUNCTION(); \
28 EXPECT_NE(VARIABLE, nullptr);
31 LVType
*IntegerType
= nullptr;
32 LVType
*UnsignedType
= nullptr;
33 LVType
*GlobalType
= nullptr;
34 LVType
*LocalType
= nullptr;
35 LVType
*NestedType
= nullptr;
36 LVTypeDefinition
*TypeDefinitionOne
= nullptr;
37 LVTypeDefinition
*TypeDefinitionTwo
= nullptr;
38 LVTypeEnumerator
*EnumeratorOne
= nullptr;
39 LVTypeEnumerator
*EnumeratorTwo
= nullptr;
40 LVTypeImport
*TypeImport
= nullptr;
41 LVTypeParam
*TypeParam
= nullptr;
42 LVTypeSubrange
*TypeSubrange
= nullptr;
45 LVScope
*NestedScope
= nullptr;
46 LVScopeAggregate
*Aggregate
= nullptr;
47 LVScopeArray
*Array
= nullptr;
48 LVScopeEnumeration
*Enumeration
= nullptr;
49 LVScopeFunction
*Function
= nullptr;
50 LVScopeFunction
*ClassFunction
= nullptr;
51 LVScopeFunctionInlined
*InlinedFunction
= nullptr;
52 LVScopeNamespace
*Namespace
= nullptr;
55 LVSymbol
*GlobalVariable
= nullptr;
56 LVSymbol
*LocalVariable
= nullptr;
57 LVSymbol
*ClassMember
= nullptr;
58 LVSymbol
*NestedVariable
= nullptr;
59 LVSymbol
*Parameter
= nullptr;
62 LVLine
*LocalLine
= nullptr;
63 LVLine
*NestedLine
= nullptr;
66 void add(LVScope
*Parent
, LVElement
*Element
);
67 void set(LVElement
*Element
, StringRef Name
, LVOffset Offset
,
68 uint32_t LineNumber
= 0, LVElement
*Type
= nullptr);
71 ReaderTestElements(ScopedPrinter
&W
) : LVReader("", "", W
) {
75 Error
createScopes() { return LVReader::createScopes(); }
76 Error
printScopes() { return LVReader::printScopes(); }
78 void createElements();
83 // Helper function to add a logical element to a given scope.
84 void ReaderTestElements::add(LVScope
*Parent
, LVElement
*Child
) {
85 Parent
->addElement(Child
);
86 EXPECT_EQ(Child
->getParent(), Parent
);
87 EXPECT_EQ(Child
->getLevel(), Parent
->getLevel() + 1);
90 // Helper function to set the initial values for a given logical element.
91 void ReaderTestElements::set(LVElement
*Element
, StringRef Name
,
92 LVOffset Offset
, uint32_t LineNumber
,
94 Element
->setName(Name
);
95 Element
->setOffset(Offset
);
96 Element
->setLineNumber(LineNumber
);
97 Element
->setType(Type
);
98 EXPECT_EQ(Element
->getName(), Name
);
99 EXPECT_EQ(Element
->getOffset(), Offset
);
100 EXPECT_EQ(Element
->getLineNumber(), LineNumber
);
101 EXPECT_EQ(Element
->getType(), Type
);
104 // Create the logical elements.
105 void ReaderTestElements::createElements() {
106 // Create scope root.
107 Error Err
= createScopes();
108 ASSERT_THAT_ERROR(std::move(Err
), Succeeded());
109 Root
= getScopesRoot();
110 ASSERT_NE(Root
, nullptr);
112 // Create the logical types.
113 CREATE(IntegerType
, createType
);
114 CREATE(UnsignedType
, createType
);
115 CREATE(GlobalType
, createType
);
116 CREATE(LocalType
, createType
);
117 CREATE(NestedType
, createType
);
118 CREATE(EnumeratorOne
, createTypeEnumerator
);
119 CREATE(EnumeratorTwo
, createTypeEnumerator
);
120 CREATE(TypeDefinitionOne
, createTypeDefinition
);
121 CREATE(TypeDefinitionTwo
, createTypeDefinition
);
122 CREATE(TypeSubrange
, createTypeSubrange
);
123 CREATE(TypeParam
, createTypeParam
);
124 CREATE(TypeImport
, createTypeImport
);
126 // Create the logical scopes.
127 CREATE(NestedScope
, createScope
);
128 CREATE(Aggregate
, createScopeAggregate
);
129 CREATE(Array
, createScopeArray
);
130 CREATE(CompileUnit
, createScopeCompileUnit
);
131 CREATE(Enumeration
, createScopeEnumeration
);
132 CREATE(Function
, createScopeFunction
);
133 CREATE(ClassFunction
, createScopeFunction
);
134 CREATE(InlinedFunction
, createScopeFunctionInlined
);
135 CREATE(Namespace
, createScopeNamespace
);
137 // Create the logical symbols.
138 CREATE(GlobalVariable
, createSymbol
);
139 CREATE(LocalVariable
, createSymbol
);
140 CREATE(ClassMember
, createSymbol
);
141 CREATE(NestedVariable
, createSymbol
);
142 CREATE(Parameter
, createSymbol
);
144 // Create the logical lines.
145 CREATE(LocalLine
, createLine
);
146 CREATE(NestedLine
, createLine
);
149 // Create the logical view adding the created logical elements.
150 void ReaderTestElements::addElements() {
151 setCompileUnit(CompileUnit
);
183 add(Root
, CompileUnit
);
184 EXPECT_EQ(Root
->lineCount(), 0u);
185 EXPECT_EQ(Root
->scopeCount(), 1u);
186 EXPECT_EQ(Root
->symbolCount(), 0u);
187 EXPECT_EQ(Root
->typeCount(), 0u);
189 // Add elements to CompileUnit.
190 add(CompileUnit
, IntegerType
);
191 add(CompileUnit
, UnsignedType
);
192 add(CompileUnit
, Array
);
193 add(CompileUnit
, Function
);
194 add(CompileUnit
, GlobalVariable
);
195 add(CompileUnit
, GlobalType
);
196 add(CompileUnit
, Namespace
);
197 EXPECT_EQ(CompileUnit
->lineCount(), 0u);
198 EXPECT_EQ(CompileUnit
->scopeCount(), 3u);
199 EXPECT_EQ(CompileUnit
->symbolCount(), 1u);
200 EXPECT_EQ(CompileUnit
->typeCount(), 3u);
202 // Add elements to Namespace.
203 add(Namespace
, Aggregate
);
204 add(Namespace
, Enumeration
);
205 add(Namespace
, TypeDefinitionOne
);
206 add(Namespace
, TypeDefinitionTwo
);
207 EXPECT_EQ(Namespace
->lineCount(), 0u);
208 EXPECT_EQ(Namespace
->scopeCount(), 2u);
209 EXPECT_EQ(Namespace
->symbolCount(), 0u);
210 EXPECT_EQ(Namespace
->typeCount(), 2u);
212 // Add elements to Function.
213 add(Function
, Parameter
);
214 add(Function
, LocalVariable
);
215 add(Function
, LocalType
);
216 add(Function
, LocalLine
);
217 add(Function
, InlinedFunction
);
218 add(Function
, TypeImport
);
219 add(Function
, TypeParam
);
220 add(Function
, NestedScope
);
221 EXPECT_EQ(Function
->lineCount(), 1u);
222 EXPECT_EQ(Function
->scopeCount(), 2u);
223 EXPECT_EQ(Function
->symbolCount(), 2u);
224 EXPECT_EQ(Function
->typeCount(), 3u);
226 // Add elements to NestedScope.
227 add(NestedScope
, NestedVariable
);
228 add(NestedScope
, NestedType
);
229 add(NestedScope
, NestedLine
);
230 EXPECT_EQ(NestedScope
->lineCount(), 1u);
231 EXPECT_EQ(NestedScope
->scopeCount(), 0u);
232 EXPECT_EQ(NestedScope
->symbolCount(), 1u);
233 EXPECT_EQ(NestedScope
->typeCount(), 1u);
235 // Add elements to Enumeration.
236 add(Enumeration
, EnumeratorOne
);
237 add(Enumeration
, EnumeratorTwo
);
238 EXPECT_EQ(Enumeration
->lineCount(), 0u);
239 EXPECT_EQ(Enumeration
->scopeCount(), 0u);
240 EXPECT_EQ(Enumeration
->symbolCount(), 0u);
241 EXPECT_EQ(Enumeration
->typeCount(), 2u);
243 // Add elements to Aggregate.
244 add(Aggregate
, ClassMember
);
245 add(Aggregate
, ClassFunction
);
246 EXPECT_EQ(Aggregate
->lineCount(), 0u);
247 EXPECT_EQ(Aggregate
->scopeCount(), 1u);
248 EXPECT_EQ(Aggregate
->symbolCount(), 1u);
249 EXPECT_EQ(Aggregate
->typeCount(), 0u);
251 // Add elements to Array.
252 add(Array
, TypeSubrange
);
253 EXPECT_EQ(Array
->lineCount(), 0u);
254 EXPECT_EQ(Array
->scopeCount(), 0u);
255 EXPECT_EQ(Array
->symbolCount(), 0u);
256 EXPECT_EQ(Array
->typeCount(), 1u);
259 // Set initial values to logical elements.
260 void ReaderTestElements::initElements() {
261 setFilename("LogicalElements.obj");
262 EXPECT_EQ(getFilename(), "LogicalElements.obj");
264 Root
->setFileFormatName("FileFormat");
265 EXPECT_EQ(Root
->getFileFormatName(), "FileFormat");
268 set(IntegerType
, "int", 0x1000);
269 set(UnsignedType
, "unsigned", 0x1010);
270 set(GlobalType
, "GlobalType", 0x1020, 1020);
271 set(LocalType
, "LocalType", 0x1030, 1030);
272 set(NestedType
, "NestedType", 0x1040, 1040);
274 set(TypeDefinitionOne
, "INTEGER", 0x1040, 1040, IntegerType
);
275 set(TypeDefinitionTwo
, "INT", 0x1050, 1050, TypeDefinitionOne
);
276 EXPECT_EQ(TypeDefinitionOne
->getUnderlyingType(), IntegerType
);
277 EXPECT_EQ(TypeDefinitionTwo
->getUnderlyingType(), IntegerType
);
279 set(EnumeratorOne
, "one", 0x1060, 1060);
280 EnumeratorOne
->setValue("blue");
281 EXPECT_EQ(EnumeratorOne
->getValue(), "blue");
283 set(EnumeratorTwo
, "two", 0x1070, 1070);
284 EnumeratorTwo
->setValue("red");
285 EXPECT_EQ(EnumeratorTwo
->getValue(), "red");
287 set(TypeSubrange
, "", 0x1080, 1080, IntegerType
);
288 TypeSubrange
->setCount(5);
289 EXPECT_EQ(TypeSubrange
->getCount(), 5);
291 TypeSubrange
->setLowerBound(10);
292 TypeSubrange
->setUpperBound(15);
293 EXPECT_EQ(TypeSubrange
->getLowerBound(), 10);
294 EXPECT_EQ(TypeSubrange
->getUpperBound(), 15);
296 TypeSubrange
->setBounds(20, 25);
297 std::pair
<unsigned, unsigned> Pair
;
298 Pair
= TypeSubrange
->getBounds();
299 EXPECT_EQ(Pair
.first
, 20u);
300 EXPECT_EQ(Pair
.second
, 25u);
302 set(TypeParam
, "INTEGER", 0x1090, 1090, UnsignedType
);
303 TypeParam
->setValue("10");
304 EXPECT_EQ(TypeParam
->getValue(), "10");
306 set(TypeImport
, "", 0x1090, 1090, Aggregate
);
307 EXPECT_EQ(TypeImport
->getType(), Aggregate
);
310 set(Aggregate
, "Class", 0x2000, 2000);
311 set(Enumeration
, "Colors", 0x2010, 2010);
312 set(Function
, "function", 0x2020, 2020, GlobalType
);
313 set(ClassFunction
, "foo", 0x2030, 2030, TypeDefinitionTwo
);
314 set(Namespace
, "nsp", 0x2040, 2040);
315 set(NestedScope
, "", 0x2050, 2050);
316 set(Array
, "", 0x2060, 2060, UnsignedType
);
317 set(InlinedFunction
, "bar", 0x2070, 2070, TypeDefinitionOne
);
318 set(CompileUnit
, "test.cpp", 0x2080, 2080);
321 set(GlobalVariable
, "GlobalVariable", 0x3000, 3000);
322 set(LocalVariable
, "LocalVariable", 0x3010, 3010, TypeDefinitionOne
);
323 set(ClassMember
, "Member", 0x3020, 3020, IntegerType
);
324 set(Parameter
, "Param", 0x3030, 3030, UnsignedType
);
325 set(NestedVariable
, "NestedVariable", 0x3040, 3040);
328 set(LocalLine
, "", 0x4000, 4000);
329 set(NestedLine
, "", 0x4010, 4010);
332 TEST(LogicalViewTest
, LogicalElements
) {
333 ScopedPrinter
W(outs());
334 ReaderTestElements
Reader(W
);
336 Reader
.createElements();
337 Reader
.addElements();
338 Reader
.initElements();