@@ -31,6 +31,9 @@ namespace {
31
31
32
32
const char *CodeViewClang = " test-codeview-clang.o" ;
33
33
const char *CodeViewMsvc = " test-codeview-msvc.o" ;
34
+ const char *CodeViewMsvcLib = " test-codeview-msvc.lib" ;
35
+ const char *CodeViewMsvcLibContentName =
36
+ " test-codeview-msvc.lib(test-codeview-msvc.o)" ;
34
37
const char *CodeViewPdbMsvc = " test-codeview-pdb-msvc.o" ;
35
38
36
39
// Helper function to get the first scope child from the given parent.
@@ -193,6 +196,72 @@ void checkElementPropertiesMsvcCodeview(LVReader *Reader) {
193
196
EXPECT_EQ (Lines->size (), 0x0eu );
194
197
}
195
198
199
+ // Check the logical elements basic properties (MSVC library - Codeview).
200
+ void checkElementPropertiesMsvcLibraryCodeview (LVReader *Reader) {
201
+ LVScopeRoot *Root = Reader->getScopesRoot ();
202
+ LVScopeCompileUnit *CompileUnit =
203
+ static_cast <LVScopeCompileUnit *>(getFirstScopeChild (Root));
204
+ LVScopeFunction *Function =
205
+ static_cast <LVScopeFunction *>(getFirstScopeChild (CompileUnit));
206
+
207
+ EXPECT_EQ (Root->getFileFormatName (), " COFF-x86-64" );
208
+ EXPECT_EQ (Root->getName (), CodeViewMsvcLibContentName);
209
+
210
+ EXPECT_EQ (CompileUnit->getBaseAddress (), 0u );
211
+ EXPECT_TRUE (CompileUnit->getProducer ().starts_with (" Microsoft" ));
212
+ EXPECT_EQ (CompileUnit->getName (), " test.cpp" );
213
+
214
+ EXPECT_EQ (Function->lineCount (), 14u );
215
+ EXPECT_EQ (Function->scopeCount (), 1u );
216
+ EXPECT_EQ (Function->symbolCount (), 3u );
217
+ EXPECT_EQ (Function->typeCount (), 0u );
218
+ EXPECT_EQ (Function->rangeCount (), 1u );
219
+
220
+ const LVLocations *Ranges = Function->getRanges ();
221
+ ASSERT_NE (Ranges, nullptr );
222
+ ASSERT_EQ (Ranges->size (), 1u );
223
+ LVLocations::const_iterator IterLocation = Ranges->begin ();
224
+ LVLocation *Location = (*IterLocation);
225
+ EXPECT_STREQ (Location->getIntervalInfo ().c_str (),
226
+ " {Range} Lines 2:9 [0x0000000000:0x0000000031]" );
227
+
228
+ LVRange RangeList;
229
+ Function->getRanges (RangeList);
230
+
231
+ const LVRangeEntries &RangeEntries = RangeList.getEntries ();
232
+ ASSERT_EQ (RangeEntries.size (), 2u );
233
+ LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin ();
234
+ LVRangeEntry RangeEntry = *IterRanges;
235
+ EXPECT_EQ (RangeEntry.lower (), 0u );
236
+ EXPECT_EQ (RangeEntry.upper (), 0x31u );
237
+ EXPECT_EQ (RangeEntry.scope ()->getLineNumber (), 0u );
238
+ EXPECT_EQ (RangeEntry.scope ()->getName (), " foo" );
239
+ EXPECT_EQ (RangeEntry.scope ()->getOffset (), 0u );
240
+
241
+ ++IterRanges;
242
+ RangeEntry = *IterRanges;
243
+ EXPECT_EQ (RangeEntry.lower (), 0x1bu );
244
+ EXPECT_EQ (RangeEntry.upper (), 0x28u );
245
+ EXPECT_EQ (RangeEntry.scope ()->getLineNumber (), 0u );
246
+ EXPECT_EQ (RangeEntry.scope ()->getName (), " foo::?" );
247
+ EXPECT_EQ (RangeEntry.scope ()->getOffset (), 0u );
248
+
249
+ const LVPublicNames &PublicNames = CompileUnit->getPublicNames ();
250
+ ASSERT_EQ (PublicNames.size (), 1u );
251
+ LVPublicNames::const_iterator IterNames = PublicNames.cbegin ();
252
+ LVScope *Foo = (*IterNames).first ;
253
+ EXPECT_EQ (Foo->getName (), " foo" );
254
+ EXPECT_EQ (Foo->getLineNumber (), 0u );
255
+ LVNameInfo NameInfo = (*IterNames).second ;
256
+ EXPECT_EQ (NameInfo.first , 0u );
257
+ EXPECT_EQ (NameInfo.second , 0x31u );
258
+
259
+ // Lines (debug and assembler) for 'foo'.
260
+ const LVLines *Lines = Foo->getLines ();
261
+ ASSERT_NE (Lines, nullptr );
262
+ EXPECT_EQ (Lines->size (), 0x0eu );
263
+ }
264
+
196
265
// Check the logical elements basic properties (MSVC - PDB).
197
266
void checkElementPropertiesMsvcCodeviewPdb (LVReader *Reader) {
198
267
LVScopeRoot *Root = Reader->getScopesRoot ();
@@ -370,6 +439,11 @@ void elementProperties(SmallString<128> &InputsDir) {
370
439
createReader (ReaderHandler, InputsDir, CodeViewMsvc);
371
440
checkElementPropertiesMsvcCodeview (Reader.get ());
372
441
}
442
+ {
443
+ std::unique_ptr<LVReader> Reader =
444
+ createReader (ReaderHandler, InputsDir, CodeViewMsvcLib);
445
+ checkElementPropertiesMsvcLibraryCodeview (Reader.get ());
446
+ }
373
447
{
374
448
std::unique_ptr<LVReader> Reader =
375
449
createReader (ReaderHandler, InputsDir, CodeViewPdbMsvc);
0 commit comments