@@ -31,6 +31,9 @@ namespace {
3131
3232const char *CodeViewClang = " test-codeview-clang.o" ;
3333const 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)" ;
3437const char *CodeViewPdbMsvc = " test-codeview-pdb-msvc.o" ;
3538
3639// Helper function to get the first scope child from the given parent.
@@ -193,6 +196,72 @@ void checkElementPropertiesMsvcCodeview(LVReader *Reader) {
193196 EXPECT_EQ (Lines->size (), 0x0eu );
194197}
195198
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+
196265// Check the logical elements basic properties (MSVC - PDB).
197266void checkElementPropertiesMsvcCodeviewPdb (LVReader *Reader) {
198267 LVScopeRoot *Root = Reader->getScopesRoot ();
@@ -370,6 +439,11 @@ void elementProperties(SmallString<128> &InputsDir) {
370439 createReader (ReaderHandler, InputsDir, CodeViewMsvc);
371440 checkElementPropertiesMsvcCodeview (Reader.get ());
372441 }
442+ {
443+ std::unique_ptr<LVReader> Reader =
444+ createReader (ReaderHandler, InputsDir, CodeViewMsvcLib);
445+ checkElementPropertiesMsvcLibraryCodeview (Reader.get ());
446+ }
373447 {
374448 std::unique_ptr<LVReader> Reader =
375449 createReader (ReaderHandler, InputsDir, CodeViewPdbMsvc);
0 commit comments