13c397c90SCarlos Alberto Enciso //===- llvm/unittest/DebugInfo/LogicalView/LocationRangesTest.cpp ---------===//
23c397c90SCarlos Alberto Enciso //
33c397c90SCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43c397c90SCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
53c397c90SCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63c397c90SCarlos Alberto Enciso //
73c397c90SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
83c397c90SCarlos Alberto Enciso
93c397c90SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
103c397c90SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
113c397c90SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
123c397c90SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
133c397c90SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
143c397c90SCarlos Alberto Enciso #include "llvm/Support/ScopedPrinter.h"
153c397c90SCarlos Alberto Enciso #include "llvm/Support/ToolOutputFile.h"
163c397c90SCarlos Alberto Enciso #include "llvm/Testing/Support/Error.h"
173c397c90SCarlos Alberto Enciso
183c397c90SCarlos Alberto Enciso #include "gtest/gtest.h"
193c397c90SCarlos Alberto Enciso
203c397c90SCarlos Alberto Enciso using namespace llvm;
213c397c90SCarlos Alberto Enciso using namespace llvm::logicalview;
223c397c90SCarlos Alberto Enciso
233c397c90SCarlos Alberto Enciso namespace {
243c397c90SCarlos Alberto Enciso
253c397c90SCarlos Alberto Enciso class ReaderTest : public LVReader {
263c397c90SCarlos Alberto Enciso protected:
27*7fbcc244SCarlos Alberto Enciso void add(LVSymbol *Symbol, LVLine *LowerLine, LVLine *UpperLine);
283c397c90SCarlos Alberto Enciso void add(LVScope *Parent, LVElement *Element);
293c397c90SCarlos Alberto Enciso void set(LVElement *Element, StringRef Name, LVOffset Offset,
303c397c90SCarlos Alberto Enciso uint32_t LineNumber = 0, LVElement *Type = nullptr);
313c397c90SCarlos Alberto Enciso void set(LVLocation *Location, LVLine *LowerLine, LVLine *UpperLine,
323c397c90SCarlos Alberto Enciso LVAddress LowerAddress, LVAddress UpperAddress);
333c397c90SCarlos Alberto Enciso
343c397c90SCarlos Alberto Enciso public:
ReaderTest(ScopedPrinter & W)353c397c90SCarlos Alberto Enciso ReaderTest(ScopedPrinter &W) : LVReader("", "", W) { setInstance(this); }
363c397c90SCarlos Alberto Enciso
createScopes()373c397c90SCarlos Alberto Enciso Error createScopes() { return LVReader::createScopes(); }
383c397c90SCarlos Alberto Enciso };
393c397c90SCarlos Alberto Enciso
403c397c90SCarlos Alberto Enciso // Helper function to add a logical element to a given scope.
add(LVScope * Parent,LVElement * Child)413c397c90SCarlos Alberto Enciso void ReaderTest::add(LVScope *Parent, LVElement *Child) {
423c397c90SCarlos Alberto Enciso Parent->addElement(Child);
433c397c90SCarlos Alberto Enciso EXPECT_EQ(Child->getParent(), Parent);
443c397c90SCarlos Alberto Enciso EXPECT_EQ(Child->getLevel(), Parent->getLevel() + 1);
453c397c90SCarlos Alberto Enciso }
463c397c90SCarlos Alberto Enciso
473c397c90SCarlos Alberto Enciso // Helper function to set the initial values for a given logical element.
set(LVElement * Element,StringRef Name,LVOffset Offset,uint32_t LineNumber,LVElement * Type)483c397c90SCarlos Alberto Enciso void ReaderTest::set(LVElement *Element, StringRef Name, LVOffset Offset,
493c397c90SCarlos Alberto Enciso uint32_t LineNumber, LVElement *Type) {
503c397c90SCarlos Alberto Enciso Element->setName(Name);
513c397c90SCarlos Alberto Enciso Element->setOffset(Offset);
523c397c90SCarlos Alberto Enciso Element->setLineNumber(LineNumber);
533c397c90SCarlos Alberto Enciso Element->setType(Type);
543c397c90SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), Name);
553c397c90SCarlos Alberto Enciso EXPECT_EQ(Element->getOffset(), Offset);
563c397c90SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), LineNumber);
573c397c90SCarlos Alberto Enciso EXPECT_EQ(Element->getType(), Type);
583c397c90SCarlos Alberto Enciso }
593c397c90SCarlos Alberto Enciso
603c397c90SCarlos Alberto Enciso // Helper function to set the initial values for a given logical location.
set(LVLocation * Location,LVLine * LowerLine,LVLine * UpperLine,LVAddress LowerAddress,LVAddress UpperAddress)613c397c90SCarlos Alberto Enciso void ReaderTest::set(LVLocation *Location, LVLine *LowerLine, LVLine *UpperLine,
623c397c90SCarlos Alberto Enciso LVAddress LowerAddress, LVAddress UpperAddress) {
633c397c90SCarlos Alberto Enciso Location->setLowerLine(LowerLine);
643c397c90SCarlos Alberto Enciso Location->setUpperLine(UpperLine);
653c397c90SCarlos Alberto Enciso Location->setLowerAddress(LowerAddress);
663c397c90SCarlos Alberto Enciso Location->setUpperAddress(UpperAddress);
673c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerLine(), LowerLine);
683c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperLine(), UpperLine);
693c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LowerAddress);
703c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), UpperAddress);
713c397c90SCarlos Alberto Enciso }
723c397c90SCarlos Alberto Enciso
733c397c90SCarlos Alberto Enciso // Helper function to add a logical location to a logical symbol.
add(LVSymbol * Symbol,LVLine * LowerLine,LVLine * UpperLine)743c397c90SCarlos Alberto Enciso void ReaderTest::add(LVSymbol *Symbol, LVLine *LowerLine, LVLine *UpperLine) {
753c397c90SCarlos Alberto Enciso dwarf::Attribute Attr = dwarf::DW_AT_location;
763c397c90SCarlos Alberto Enciso
773c397c90SCarlos Alberto Enciso Symbol->addLocation(Attr, LowerLine->getAddress(), UpperLine->getAddress(),
783c397c90SCarlos Alberto Enciso /*SectionOffset=*/0, /*LocDesOffset=*/0);
793c397c90SCarlos Alberto Enciso }
803c397c90SCarlos Alberto Enciso
813c397c90SCarlos Alberto Enciso class ReaderTestLocations : public ReaderTest {
82*7fbcc244SCarlos Alberto Enciso #define CREATE(VARIABLE, CREATE_FUNCTION) \
83*7fbcc244SCarlos Alberto Enciso VARIABLE = CREATE_FUNCTION(); \
84*7fbcc244SCarlos Alberto Enciso EXPECT_NE(VARIABLE, nullptr);
85*7fbcc244SCarlos Alberto Enciso
863c397c90SCarlos Alberto Enciso // Types.
873c397c90SCarlos Alberto Enciso LVType *IntegerType = nullptr;
883c397c90SCarlos Alberto Enciso
893c397c90SCarlos Alberto Enciso // Scopes.
903c397c90SCarlos Alberto Enciso LVScope *NestedScope = nullptr;
913c397c90SCarlos Alberto Enciso LVScopeFunction *Function = nullptr;
923c397c90SCarlos Alberto Enciso
933c397c90SCarlos Alberto Enciso // Symbols.
943c397c90SCarlos Alberto Enciso LVSymbol *LocalVariable = nullptr;
953c397c90SCarlos Alberto Enciso LVSymbol *NestedVariable = nullptr;
963c397c90SCarlos Alberto Enciso LVSymbol *Parameter = nullptr;
973c397c90SCarlos Alberto Enciso
983c397c90SCarlos Alberto Enciso // Lines.
993c397c90SCarlos Alberto Enciso LVLine *LineOne = nullptr;
1003c397c90SCarlos Alberto Enciso LVLine *LineTwo = nullptr;
1013c397c90SCarlos Alberto Enciso LVLine *LineThree = nullptr;
1023c397c90SCarlos Alberto Enciso LVLine *LineFour = nullptr;
1033c397c90SCarlos Alberto Enciso LVLine *LineFive = nullptr;
1043c397c90SCarlos Alberto Enciso LVLine *LineSix = nullptr;
1053c397c90SCarlos Alberto Enciso
1063c397c90SCarlos Alberto Enciso // Locations.
1073c397c90SCarlos Alberto Enciso LVLocation *LocationOne = nullptr;
1083c397c90SCarlos Alberto Enciso LVLocation *LocationTwo = nullptr;
1093c397c90SCarlos Alberto Enciso LVLocation *LocationThree = nullptr;
1103c397c90SCarlos Alberto Enciso LVLocation *LocationFour = nullptr;
1113c397c90SCarlos Alberto Enciso LVLocation *LocationFive = nullptr;
1123c397c90SCarlos Alberto Enciso LVLocation *LocationSix = nullptr;
1133c397c90SCarlos Alberto Enciso
1143c397c90SCarlos Alberto Enciso public:
ReaderTestLocations(ScopedPrinter & W)1153c397c90SCarlos Alberto Enciso ReaderTestLocations(ScopedPrinter &W) : ReaderTest(W) {}
1163c397c90SCarlos Alberto Enciso
1173c397c90SCarlos Alberto Enciso void createElements();
1183c397c90SCarlos Alberto Enciso void addElements();
1193c397c90SCarlos Alberto Enciso void initElements();
1203c397c90SCarlos Alberto Enciso };
1213c397c90SCarlos Alberto Enciso
1223c397c90SCarlos Alberto Enciso // Create the logical elements.
createElements()1233c397c90SCarlos Alberto Enciso void ReaderTestLocations::createElements() {
1243c397c90SCarlos Alberto Enciso // Create scope root.
1253c397c90SCarlos Alberto Enciso Error Err = createScopes();
1263c397c90SCarlos Alberto Enciso ASSERT_THAT_ERROR(std::move(Err), Succeeded());
1273c397c90SCarlos Alberto Enciso Root = getScopesRoot();
1283c397c90SCarlos Alberto Enciso EXPECT_NE(Root, nullptr);
1293c397c90SCarlos Alberto Enciso
1303c397c90SCarlos Alberto Enciso // Create the logical types.
131*7fbcc244SCarlos Alberto Enciso CREATE(IntegerType, createType);
1323c397c90SCarlos Alberto Enciso
1333c397c90SCarlos Alberto Enciso // Create the logical scopes.
134*7fbcc244SCarlos Alberto Enciso CREATE(NestedScope, createScope);
135*7fbcc244SCarlos Alberto Enciso CREATE(CompileUnit, createScopeCompileUnit);
136*7fbcc244SCarlos Alberto Enciso CREATE(Function, createScopeFunction);
1373c397c90SCarlos Alberto Enciso
1383c397c90SCarlos Alberto Enciso // Create the logical symbols.
139*7fbcc244SCarlos Alberto Enciso CREATE(LocalVariable, createSymbol);
140*7fbcc244SCarlos Alberto Enciso CREATE(NestedVariable, createSymbol);
141*7fbcc244SCarlos Alberto Enciso CREATE(Parameter, createSymbol);
1423c397c90SCarlos Alberto Enciso
1433c397c90SCarlos Alberto Enciso // Create the logical lines.
144*7fbcc244SCarlos Alberto Enciso CREATE(LineOne, createLine);
145*7fbcc244SCarlos Alberto Enciso CREATE(LineTwo, createLine);
146*7fbcc244SCarlos Alberto Enciso CREATE(LineThree, createLine);
147*7fbcc244SCarlos Alberto Enciso CREATE(LineFour, createLine);
148*7fbcc244SCarlos Alberto Enciso CREATE(LineFive, createLine);
149*7fbcc244SCarlos Alberto Enciso CREATE(LineSix, createLine);
1503c397c90SCarlos Alberto Enciso
1513c397c90SCarlos Alberto Enciso // Create the logical locations.
152*7fbcc244SCarlos Alberto Enciso CREATE(LocationOne, createLocation);
153*7fbcc244SCarlos Alberto Enciso CREATE(LocationTwo, createLocation);
154*7fbcc244SCarlos Alberto Enciso CREATE(LocationThree, createLocation);
155*7fbcc244SCarlos Alberto Enciso CREATE(LocationFour, createLocation);
156*7fbcc244SCarlos Alberto Enciso CREATE(LocationFive, createLocation);
157*7fbcc244SCarlos Alberto Enciso CREATE(LocationSix, createLocation);
1583c397c90SCarlos Alberto Enciso }
1593c397c90SCarlos Alberto Enciso
1603c397c90SCarlos Alberto Enciso // Create the logical view adding the created logical elements.
addElements()1613c397c90SCarlos Alberto Enciso void ReaderTestLocations::addElements() {
1623c397c90SCarlos Alberto Enciso setCompileUnit(CompileUnit);
1633c397c90SCarlos Alberto Enciso
1643c397c90SCarlos Alberto Enciso // Root
1653c397c90SCarlos Alberto Enciso // CompileUnit
1663c397c90SCarlos Alberto Enciso // IntegerType
1673c397c90SCarlos Alberto Enciso // Function
1683c397c90SCarlos Alberto Enciso // LocationOne
1693c397c90SCarlos Alberto Enciso // LocationTwo
1703c397c90SCarlos Alberto Enciso // LocationFive
1713c397c90SCarlos Alberto Enciso // LocationSix
1723c397c90SCarlos Alberto Enciso // Parameter
1733c397c90SCarlos Alberto Enciso // LocalVariable
1743c397c90SCarlos Alberto Enciso // LineOne
1753c397c90SCarlos Alberto Enciso // LineTwo
1763c397c90SCarlos Alberto Enciso // NestedScope
1773c397c90SCarlos Alberto Enciso // LocationThree
1783c397c90SCarlos Alberto Enciso // LocationFour
1793c397c90SCarlos Alberto Enciso // NestedVariable
1803c397c90SCarlos Alberto Enciso // LineThree
1813c397c90SCarlos Alberto Enciso // LineFour
1823c397c90SCarlos Alberto Enciso // LineFive
1833c397c90SCarlos Alberto Enciso // LineSix
1843c397c90SCarlos Alberto Enciso
1853c397c90SCarlos Alberto Enciso // Add elements to Root.
1863c397c90SCarlos Alberto Enciso add(Root, CompileUnit);
1873c397c90SCarlos Alberto Enciso
1883c397c90SCarlos Alberto Enciso // Add elements to CompileUnit.
1893c397c90SCarlos Alberto Enciso add(CompileUnit, IntegerType);
1903c397c90SCarlos Alberto Enciso add(CompileUnit, Function);
1913c397c90SCarlos Alberto Enciso
1923c397c90SCarlos Alberto Enciso // Add elements to Function.
1933c397c90SCarlos Alberto Enciso add(Function, Parameter);
1943c397c90SCarlos Alberto Enciso add(Function, LocalVariable);
1953c397c90SCarlos Alberto Enciso add(Function, LineOne);
1963c397c90SCarlos Alberto Enciso add(Function, LineTwo);
1973c397c90SCarlos Alberto Enciso add(Function, LineFive);
1983c397c90SCarlos Alberto Enciso add(Function, LineSix);
1993c397c90SCarlos Alberto Enciso add(Function, NestedScope);
2003c397c90SCarlos Alberto Enciso
2013c397c90SCarlos Alberto Enciso // Add elements to NestedScope.
2023c397c90SCarlos Alberto Enciso add(NestedScope, NestedVariable);
2033c397c90SCarlos Alberto Enciso add(NestedScope, LineThree);
2043c397c90SCarlos Alberto Enciso add(NestedScope, LineFour);
2053c397c90SCarlos Alberto Enciso }
2063c397c90SCarlos Alberto Enciso
2073c397c90SCarlos Alberto Enciso // Set initial values to logical elements.
initElements()2083c397c90SCarlos Alberto Enciso void ReaderTestLocations::initElements() {
2093c397c90SCarlos Alberto Enciso // Types.
2103c397c90SCarlos Alberto Enciso set(IntegerType, "int", 0x1000);
2113c397c90SCarlos Alberto Enciso
2123c397c90SCarlos Alberto Enciso // Scopes.
2133c397c90SCarlos Alberto Enciso set(CompileUnit, "foo.cpp", 0x2000);
2143c397c90SCarlos Alberto Enciso set(Function, "foo", 0x2010, 100, IntegerType);
2153c397c90SCarlos Alberto Enciso set(NestedScope, "", 0x2020, 300);
2163c397c90SCarlos Alberto Enciso
2173c397c90SCarlos Alberto Enciso // Symbols.
2183c397c90SCarlos Alberto Enciso set(Parameter, "Param", 0x3000, 110, IntegerType);
2193c397c90SCarlos Alberto Enciso set(LocalVariable, "LocalVariable", 0x3000, 120, IntegerType);
2203c397c90SCarlos Alberto Enciso set(NestedVariable, "NestedVariable", 0x3010, 310, IntegerType);
2213c397c90SCarlos Alberto Enciso
2223c397c90SCarlos Alberto Enciso // Lines.
2233c397c90SCarlos Alberto Enciso set(LineOne, "", 0x5000, 100);
2243c397c90SCarlos Alberto Enciso set(LineTwo, "", 0x5200, 200);
2253c397c90SCarlos Alberto Enciso set(LineThree, "", 0x5400, 300);
2263c397c90SCarlos Alberto Enciso set(LineFour, "", 0x5600, 400);
2273c397c90SCarlos Alberto Enciso set(LineFive, "", 0x5800, 500);
2283c397c90SCarlos Alberto Enciso set(LineSix, "", 0x6000, 600);
2293c397c90SCarlos Alberto Enciso
2303c397c90SCarlos Alberto Enciso // Locations.
2313c397c90SCarlos Alberto Enciso set(LocationOne, LineOne, LineOne, 0x5000, 0x5100);
2323c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationOne->getIntervalInfo().c_str(),
2333c397c90SCarlos Alberto Enciso " Lines 100:100 [0x0000005000:0x0000005100]");
2343c397c90SCarlos Alberto Enciso
2353c397c90SCarlos Alberto Enciso set(LocationTwo, LineTwo, LineTwo, 0x5200, 0x5300);
2363c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationTwo->getIntervalInfo().c_str(),
2373c397c90SCarlos Alberto Enciso " Lines 200:200 [0x0000005200:0x0000005300]");
2383c397c90SCarlos Alberto Enciso
2393c397c90SCarlos Alberto Enciso set(LocationThree, LineThree, LineThree, 0x5400, 0x5500);
2403c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationThree->getIntervalInfo().c_str(),
2413c397c90SCarlos Alberto Enciso " Lines 300:300 [0x0000005400:0x0000005500]");
2423c397c90SCarlos Alberto Enciso
2433c397c90SCarlos Alberto Enciso set(LocationFour, LineFour, LineFour, 0x5600, 0x5700);
2443c397c90SCarlos Alberto Enciso LocationFour->setIsAddressRange();
2453c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationFour->getIntervalInfo().c_str(),
2463c397c90SCarlos Alberto Enciso "{Range} Lines 400:400 [0x0000005600:0x0000005700]");
2473c397c90SCarlos Alberto Enciso
2483c397c90SCarlos Alberto Enciso set(LocationFive, LineFive, LineFive, 0x5800, 0x5900);
2493c397c90SCarlos Alberto Enciso LocationFive->setIsAddressRange();
2503c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationFive->getIntervalInfo().c_str(),
2513c397c90SCarlos Alberto Enciso "{Range} Lines 500:500 [0x0000005800:0x0000005900]");
2523c397c90SCarlos Alberto Enciso
2533c397c90SCarlos Alberto Enciso set(LocationSix, LineSix, LineSix, 0x6000, 0x6100);
2543c397c90SCarlos Alberto Enciso LocationSix->setIsAddressRange();
2553c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationSix->getIntervalInfo().c_str(),
2563c397c90SCarlos Alberto Enciso "{Range} Lines 600:600 [0x0000006000:0x0000006100]");
2573c397c90SCarlos Alberto Enciso
2583c397c90SCarlos Alberto Enciso // Add ranges to Function.
2593c397c90SCarlos Alberto Enciso // Function: LocationOne, LocationTwo, LocationFive, LocationSix
2603c397c90SCarlos Alberto Enciso Function->addObject(LocationOne);
2613c397c90SCarlos Alberto Enciso Function->addObject(LocationTwo);
2623c397c90SCarlos Alberto Enciso Function->addObject(LocationFive);
2633c397c90SCarlos Alberto Enciso Function->addObject(LocationSix);
2643c397c90SCarlos Alberto Enciso EXPECT_EQ(Function->rangeCount(), 4u);
2653c397c90SCarlos Alberto Enciso
2663c397c90SCarlos Alberto Enciso // Add ranges to NestedScope.
2673c397c90SCarlos Alberto Enciso // NestedScope: LocationThree, LocationFour
2683c397c90SCarlos Alberto Enciso NestedScope->addObject(LocationThree);
2693c397c90SCarlos Alberto Enciso NestedScope->addObject(LocationFour);
2703c397c90SCarlos Alberto Enciso EXPECT_EQ(NestedScope->rangeCount(), 2u);
2713c397c90SCarlos Alberto Enciso
2723c397c90SCarlos Alberto Enciso // Get all ranges.
2733c397c90SCarlos Alberto Enciso LVRange Ranges;
2743c397c90SCarlos Alberto Enciso CompileUnit->getRanges(Ranges);
2753c397c90SCarlos Alberto Enciso Ranges.startSearch();
2763c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x4000), nullptr);
2773c397c90SCarlos Alberto Enciso
2783c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5060), Function);
2793c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5850), Function);
2803c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5010, 0x5090), Function);
2813c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5210, 0x5290), Function);
2823c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5810, 0x5890), Function);
2833c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x6010, 0x6090), Function);
2843c397c90SCarlos Alberto Enciso
2853c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5400), NestedScope);
2863c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5650), NestedScope);
2873c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5410, 0x5490), NestedScope);
2883c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x5610, 0x5690), NestedScope);
2893c397c90SCarlos Alberto Enciso
2903c397c90SCarlos Alberto Enciso EXPECT_EQ(Ranges.getEntry(0x8000), nullptr);
2913c397c90SCarlos Alberto Enciso Ranges.endSearch();
2923c397c90SCarlos Alberto Enciso
2933c397c90SCarlos Alberto Enciso // Add locations to symbols.
2943c397c90SCarlos Alberto Enciso // Parameter: [LineOne, LineSix]
2953c397c90SCarlos Alberto Enciso // LocalVariable: [LineTwo, LineSix], [LineFour, LineFive]
2963c397c90SCarlos Alberto Enciso // NestedVariable: [LineThree, LineFour]
2973c397c90SCarlos Alberto Enciso add(Parameter, LineOne, LineSix);
2983c397c90SCarlos Alberto Enciso add(LocalVariable, LineTwo, LineSix);
2993c397c90SCarlos Alberto Enciso add(LocalVariable, LineFour, LineFive);
3003c397c90SCarlos Alberto Enciso add(NestedVariable, LineThree, LineFour);
3013c397c90SCarlos Alberto Enciso
3023c397c90SCarlos Alberto Enciso LVLocation *Location;
3033c397c90SCarlos Alberto Enciso LVLocations Locations;
3043c397c90SCarlos Alberto Enciso Parameter->getLocations(Locations);
3053c397c90SCarlos Alberto Enciso ASSERT_EQ(Locations.size(), 1u);
3063c397c90SCarlos Alberto Enciso Location = Locations[0];
3073c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineOne->getAddress());
3083c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineSix->getAddress());
3093c397c90SCarlos Alberto Enciso
3103c397c90SCarlos Alberto Enciso Locations.clear();
3113c397c90SCarlos Alberto Enciso LocalVariable->getLocations(Locations);
3123c397c90SCarlos Alberto Enciso ASSERT_EQ(Locations.size(), 2u);
3133c397c90SCarlos Alberto Enciso Location = Locations[0];
3143c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineTwo->getAddress());
3153c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineSix->getAddress());
3163c397c90SCarlos Alberto Enciso Location = Locations[1];
3173c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineFour->getAddress());
3183c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineFive->getAddress());
3193c397c90SCarlos Alberto Enciso
3203c397c90SCarlos Alberto Enciso Locations.clear();
3213c397c90SCarlos Alberto Enciso NestedVariable->getLocations(Locations);
3223c397c90SCarlos Alberto Enciso ASSERT_EQ(Locations.size(), 1u);
3233c397c90SCarlos Alberto Enciso Location = Locations[0];
3243c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineThree->getAddress());
3253c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineFour->getAddress());
3263c397c90SCarlos Alberto Enciso }
3273c397c90SCarlos Alberto Enciso
3283c397c90SCarlos Alberto Enciso class ReaderTestCoverage : public ReaderTest {
3293c397c90SCarlos Alberto Enciso // Types.
3303c397c90SCarlos Alberto Enciso LVType *IntegerType = nullptr;
3313c397c90SCarlos Alberto Enciso
3323c397c90SCarlos Alberto Enciso // Scopes.
3333c397c90SCarlos Alberto Enciso LVScopeFunction *Function = nullptr;
3343c397c90SCarlos Alberto Enciso LVScopeFunctionInlined *InlinedFunction = nullptr;
3353c397c90SCarlos Alberto Enciso
3363c397c90SCarlos Alberto Enciso // Symbols.
3373c397c90SCarlos Alberto Enciso LVSymbol *Variable = nullptr;
3383c397c90SCarlos Alberto Enciso LVSymbol *Parameter = nullptr;
3393c397c90SCarlos Alberto Enciso
3403c397c90SCarlos Alberto Enciso // Lines.
3413c397c90SCarlos Alberto Enciso LVLine *LineOne = nullptr;
3423c397c90SCarlos Alberto Enciso LVLine *LineTwo = nullptr;
3433c397c90SCarlos Alberto Enciso LVLine *LineThree = nullptr;
3443c397c90SCarlos Alberto Enciso LVLine *LineFour = nullptr;
3453c397c90SCarlos Alberto Enciso LVLine *LineFive = nullptr;
3463c397c90SCarlos Alberto Enciso LVLine *LineSix = nullptr;
3473c397c90SCarlos Alberto Enciso
3483c397c90SCarlos Alberto Enciso // Locations.
3493c397c90SCarlos Alberto Enciso LVLocation *LocationOne = nullptr;
3503c397c90SCarlos Alberto Enciso LVLocation *LocationTwo = nullptr;
3513c397c90SCarlos Alberto Enciso LVLocation *LocationFive = nullptr;
3523c397c90SCarlos Alberto Enciso LVLocation *LocationSix = nullptr;
3533c397c90SCarlos Alberto Enciso
3543c397c90SCarlos Alberto Enciso public:
ReaderTestCoverage(ScopedPrinter & W)3553c397c90SCarlos Alberto Enciso ReaderTestCoverage(ScopedPrinter &W) : ReaderTest(W) {}
3563c397c90SCarlos Alberto Enciso
3573c397c90SCarlos Alberto Enciso void createElements();
3583c397c90SCarlos Alberto Enciso void addElements();
3593c397c90SCarlos Alberto Enciso void initElements();
3603c397c90SCarlos Alberto Enciso };
3613c397c90SCarlos Alberto Enciso
3623c397c90SCarlos Alberto Enciso // Create the logical elements.
createElements()3633c397c90SCarlos Alberto Enciso void ReaderTestCoverage::createElements() {
3643c397c90SCarlos Alberto Enciso // Create scope root.
3653c397c90SCarlos Alberto Enciso Error Err = createScopes();
3663c397c90SCarlos Alberto Enciso ASSERT_THAT_ERROR(std::move(Err), Succeeded());
3673c397c90SCarlos Alberto Enciso Root = getScopesRoot();
3683c397c90SCarlos Alberto Enciso EXPECT_NE(Root, nullptr);
3693c397c90SCarlos Alberto Enciso
3703c397c90SCarlos Alberto Enciso // Create the logical types.
371*7fbcc244SCarlos Alberto Enciso IntegerType = createType();
372*7fbcc244SCarlos Alberto Enciso EXPECT_NE(IntegerType, nullptr);
3733c397c90SCarlos Alberto Enciso
3743c397c90SCarlos Alberto Enciso // Create the logical scopes.
375*7fbcc244SCarlos Alberto Enciso CompileUnit = createScopeCompileUnit();
376*7fbcc244SCarlos Alberto Enciso EXPECT_NE(CompileUnit, nullptr);
377*7fbcc244SCarlos Alberto Enciso Function = createScopeFunction();
378*7fbcc244SCarlos Alberto Enciso EXPECT_NE(Function, nullptr);
379*7fbcc244SCarlos Alberto Enciso InlinedFunction = createScopeFunctionInlined();
380*7fbcc244SCarlos Alberto Enciso EXPECT_NE(InlinedFunction, nullptr);
3813c397c90SCarlos Alberto Enciso
3823c397c90SCarlos Alberto Enciso // Create the logical symbols.
383*7fbcc244SCarlos Alberto Enciso Variable = createSymbol();
384*7fbcc244SCarlos Alberto Enciso EXPECT_NE(Variable, nullptr);
385*7fbcc244SCarlos Alberto Enciso Parameter = createSymbol();
386*7fbcc244SCarlos Alberto Enciso EXPECT_NE(Parameter, nullptr);
3873c397c90SCarlos Alberto Enciso
3883c397c90SCarlos Alberto Enciso // Create the logical lines.
389*7fbcc244SCarlos Alberto Enciso LineOne = createLine();
390*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineOne, nullptr);
391*7fbcc244SCarlos Alberto Enciso LineTwo = createLine();
392*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineTwo, nullptr);
393*7fbcc244SCarlos Alberto Enciso LineThree = createLine();
394*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineThree, nullptr);
395*7fbcc244SCarlos Alberto Enciso LineFour = createLine();
396*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineFour, nullptr);
397*7fbcc244SCarlos Alberto Enciso LineFive = createLine();
398*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineFive, nullptr);
399*7fbcc244SCarlos Alberto Enciso LineSix = createLine();
400*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LineSix, nullptr);
4013c397c90SCarlos Alberto Enciso
4023c397c90SCarlos Alberto Enciso // Create the logical locations.
403*7fbcc244SCarlos Alberto Enciso LocationOne = createLocation();
404*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LocationOne, nullptr);
405*7fbcc244SCarlos Alberto Enciso LocationTwo = createLocation();
406*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LocationTwo, nullptr);
407*7fbcc244SCarlos Alberto Enciso LocationFive = createLocation();
408*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LocationFive, nullptr);
409*7fbcc244SCarlos Alberto Enciso LocationSix = createLocation();
410*7fbcc244SCarlos Alberto Enciso EXPECT_NE(LocationSix, nullptr);
4113c397c90SCarlos Alberto Enciso }
4123c397c90SCarlos Alberto Enciso
4133c397c90SCarlos Alberto Enciso // Create the logical view adding the created logical elements.
addElements()4143c397c90SCarlos Alberto Enciso void ReaderTestCoverage::addElements() {
4153c397c90SCarlos Alberto Enciso setCompileUnit(CompileUnit);
4163c397c90SCarlos Alberto Enciso
4173c397c90SCarlos Alberto Enciso // Root
4183c397c90SCarlos Alberto Enciso // CompileUnit
4193c397c90SCarlos Alberto Enciso // IntegerType
4203c397c90SCarlos Alberto Enciso // Function
4213c397c90SCarlos Alberto Enciso // Ranges
4223c397c90SCarlos Alberto Enciso // [LineOne, LineOne]
4233c397c90SCarlos Alberto Enciso // [LineTwo, LineSix]
4243c397c90SCarlos Alberto Enciso // [LineSix, LineSix]
4253c397c90SCarlos Alberto Enciso // LineOne
4263c397c90SCarlos Alberto Enciso // LineTwo
4273c397c90SCarlos Alberto Enciso // InlinedFunction
4283c397c90SCarlos Alberto Enciso // Ranges
4293c397c90SCarlos Alberto Enciso // [LineFive, LineFive]
4303c397c90SCarlos Alberto Enciso // Parameter
4313c397c90SCarlos Alberto Enciso // Location
4323c397c90SCarlos Alberto Enciso // [LineThree, LineThree]
4333c397c90SCarlos Alberto Enciso // Variable
4343c397c90SCarlos Alberto Enciso // Location
4353c397c90SCarlos Alberto Enciso // [LineFour, LineFive]
4363c397c90SCarlos Alberto Enciso // [LineFive, LineSix]
4373c397c90SCarlos Alberto Enciso // LineThree
4383c397c90SCarlos Alberto Enciso // LineFour
4393c397c90SCarlos Alberto Enciso // LineFive
4403c397c90SCarlos Alberto Enciso // LineSix
4413c397c90SCarlos Alberto Enciso
4423c397c90SCarlos Alberto Enciso // Add elements to Root.
4433c397c90SCarlos Alberto Enciso add(Root, CompileUnit);
4443c397c90SCarlos Alberto Enciso
4453c397c90SCarlos Alberto Enciso // Add elements to CompileUnit.
4463c397c90SCarlos Alberto Enciso add(CompileUnit, IntegerType);
4473c397c90SCarlos Alberto Enciso add(CompileUnit, Function);
4483c397c90SCarlos Alberto Enciso
4493c397c90SCarlos Alberto Enciso // Add elements to Function.
4503c397c90SCarlos Alberto Enciso add(Function, InlinedFunction);
4513c397c90SCarlos Alberto Enciso add(Function, LineOne);
4523c397c90SCarlos Alberto Enciso add(Function, LineTwo);
4533c397c90SCarlos Alberto Enciso add(Function, LineSix);
4543c397c90SCarlos Alberto Enciso
4553c397c90SCarlos Alberto Enciso // Add elements to function InlinedFunction.
4563c397c90SCarlos Alberto Enciso add(InlinedFunction, Parameter);
4573c397c90SCarlos Alberto Enciso add(InlinedFunction, Variable);
4583c397c90SCarlos Alberto Enciso add(InlinedFunction, LineThree);
4593c397c90SCarlos Alberto Enciso add(InlinedFunction, LineFour);
4603c397c90SCarlos Alberto Enciso add(InlinedFunction, LineFive);
4613c397c90SCarlos Alberto Enciso }
4623c397c90SCarlos Alberto Enciso
4633c397c90SCarlos Alberto Enciso // Set initial values to logical elements.
initElements()4643c397c90SCarlos Alberto Enciso void ReaderTestCoverage::initElements() {
4653c397c90SCarlos Alberto Enciso // Types.
4663c397c90SCarlos Alberto Enciso set(IntegerType, "int", 0x1000);
4673c397c90SCarlos Alberto Enciso
4683c397c90SCarlos Alberto Enciso // Scopes.
4693c397c90SCarlos Alberto Enciso set(CompileUnit, "foo.cpp", 0x2000);
4703c397c90SCarlos Alberto Enciso set(Function, "foo", 0x2500, 100, IntegerType);
4713c397c90SCarlos Alberto Enciso set(InlinedFunction, "InlinedFunction", 0x3000, 300);
4723c397c90SCarlos Alberto Enciso
4733c397c90SCarlos Alberto Enciso // Symbols.
4743c397c90SCarlos Alberto Enciso set(Parameter, "Parameter", 0x3100, 310, IntegerType);
4753c397c90SCarlos Alberto Enciso set(Variable, "Variable", 0x3200, 320, IntegerType);
4763c397c90SCarlos Alberto Enciso
4773c397c90SCarlos Alberto Enciso // Lines.
4783c397c90SCarlos Alberto Enciso set(LineOne, "", 0x5000, 100);
4793c397c90SCarlos Alberto Enciso set(LineTwo, "", 0x5200, 200);
4803c397c90SCarlos Alberto Enciso set(LineThree, "", 0x5400, 300);
4813c397c90SCarlos Alberto Enciso set(LineFour, "", 0x5600, 400);
4823c397c90SCarlos Alberto Enciso set(LineFive, "", 0x5800, 500);
4833c397c90SCarlos Alberto Enciso set(LineSix, "", 0x6000, 600);
4843c397c90SCarlos Alberto Enciso
4853c397c90SCarlos Alberto Enciso // Locations.
4863c397c90SCarlos Alberto Enciso set(LocationOne, LineOne, LineOne, 0x5000, 0x5199);
4873c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationOne->getIntervalInfo().c_str(),
4883c397c90SCarlos Alberto Enciso " Lines 100:100 [0x0000005000:0x0000005199]");
4893c397c90SCarlos Alberto Enciso
4903c397c90SCarlos Alberto Enciso set(LocationTwo, LineTwo, LineSix, 0x5200, 0x6100);
4913c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationTwo->getIntervalInfo().c_str(),
4923c397c90SCarlos Alberto Enciso " Lines 200:600 [0x0000005200:0x0000006100]");
4933c397c90SCarlos Alberto Enciso
4943c397c90SCarlos Alberto Enciso set(LocationFive, LineFive, LineFive, 0x5800, 0x5900);
4953c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationFive->getIntervalInfo().c_str(),
4963c397c90SCarlos Alberto Enciso " Lines 500:500 [0x0000005800:0x0000005900]");
4973c397c90SCarlos Alberto Enciso
4983c397c90SCarlos Alberto Enciso set(LocationSix, LineSix, LineSix, 0x6000, 0x6100);
4993c397c90SCarlos Alberto Enciso EXPECT_STREQ(LocationSix->getIntervalInfo().c_str(),
5003c397c90SCarlos Alberto Enciso " Lines 600:600 [0x0000006000:0x0000006100]");
5013c397c90SCarlos Alberto Enciso
5023c397c90SCarlos Alberto Enciso // Add ranges to Function.
5033c397c90SCarlos Alberto Enciso // Function: LocationOne, LocationTwo, LocationSix
5043c397c90SCarlos Alberto Enciso Function->addObject(LocationOne);
5053c397c90SCarlos Alberto Enciso Function->addObject(LocationTwo);
5063c397c90SCarlos Alberto Enciso Function->addObject(LocationSix);
5073c397c90SCarlos Alberto Enciso EXPECT_EQ(Function->rangeCount(), 3u);
5083c397c90SCarlos Alberto Enciso
5093c397c90SCarlos Alberto Enciso // Add ranges to Inlined.
5103c397c90SCarlos Alberto Enciso // Inlined: LocationFive
5113c397c90SCarlos Alberto Enciso InlinedFunction->addObject(LocationFive);
5123c397c90SCarlos Alberto Enciso EXPECT_EQ(InlinedFunction->rangeCount(), 1u);
5133c397c90SCarlos Alberto Enciso
5143c397c90SCarlos Alberto Enciso // Add locations to symbols.
5153c397c90SCarlos Alberto Enciso // Parameter: [LineThree, LineThree]
5163c397c90SCarlos Alberto Enciso // Variable: [LineFour, LineFive], [LineFive, LineSix]
5173c397c90SCarlos Alberto Enciso add(Parameter, LineThree, LineThree);
5183c397c90SCarlos Alberto Enciso add(Variable, LineFour, LineFive);
5193c397c90SCarlos Alberto Enciso add(Variable, LineFive, LineSix);
5203c397c90SCarlos Alberto Enciso
5213c397c90SCarlos Alberto Enciso CompileUnit->processRangeLocationCoverage();
5223c397c90SCarlos Alberto Enciso
5233c397c90SCarlos Alberto Enciso LVLocation *Location;
5243c397c90SCarlos Alberto Enciso LVLocations Locations;
5253c397c90SCarlos Alberto Enciso Parameter->getLocations(Locations);
5263c397c90SCarlos Alberto Enciso ASSERT_EQ(Locations.size(), 1u);
5273c397c90SCarlos Alberto Enciso Location = Locations[0];
5283c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineThree->getAddress());
5293c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineThree->getAddress());
5303c397c90SCarlos Alberto Enciso
5313c397c90SCarlos Alberto Enciso Locations.clear();
5323c397c90SCarlos Alberto Enciso Variable->getLocations(Locations);
5333c397c90SCarlos Alberto Enciso ASSERT_EQ(Locations.size(), 2u);
5343c397c90SCarlos Alberto Enciso Location = Locations[0];
5353c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineFour->getAddress());
5363c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineFive->getAddress());
5373c397c90SCarlos Alberto Enciso Location = Locations[1];
5383c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getLowerAddress(), LineFive->getAddress());
5393c397c90SCarlos Alberto Enciso EXPECT_EQ(Location->getUpperAddress(), LineSix->getAddress());
5403c397c90SCarlos Alberto Enciso
5413c397c90SCarlos Alberto Enciso // Test the changes done to 'LVScope::outermostParent' to use the
5423c397c90SCarlos Alberto Enciso // ranges allocated int the current scope during the scopes traversal.
5433c397c90SCarlos Alberto Enciso // These are the pre-conditions for the symbol:
5443c397c90SCarlos Alberto Enciso // - Its parent must be an inlined function.
5453c397c90SCarlos Alberto Enciso // - Have more than one location description.
5463c397c90SCarlos Alberto Enciso
5473c397c90SCarlos Alberto Enciso // Before the changes: Parameter: CoveragePercentage = 100.00
5483c397c90SCarlos Alberto Enciso // After the changes: Parameter: CoveragePercentage = 100.00
549182d1c2aSSimon Pilgrim EXPECT_FLOAT_EQ(Parameter->getCoveragePercentage(), 100.00f);
5503c397c90SCarlos Alberto Enciso
5513c397c90SCarlos Alberto Enciso // Before the changes: Variable: CoveragePercentage = 1000.00
5523c397c90SCarlos Alberto Enciso // After the changes: Variable: CoveragePercentage = 56.83
553182d1c2aSSimon Pilgrim EXPECT_FLOAT_EQ(Variable->getCoveragePercentage(), 56.83f);
5543c397c90SCarlos Alberto Enciso }
5553c397c90SCarlos Alberto Enciso
TEST(LogicalViewTest,LocationRanges)5563c397c90SCarlos Alberto Enciso TEST(LogicalViewTest, LocationRanges) {
5573c397c90SCarlos Alberto Enciso ScopedPrinter W(outs());
5583c397c90SCarlos Alberto Enciso ReaderTestLocations Reader(W);
5593c397c90SCarlos Alberto Enciso
5603c397c90SCarlos Alberto Enciso // Reader options.
5613c397c90SCarlos Alberto Enciso LVOptions ReaderOptions;
5623c397c90SCarlos Alberto Enciso ReaderOptions.setAttributeOffset();
5633c397c90SCarlos Alberto Enciso ReaderOptions.setPrintAll();
5643c397c90SCarlos Alberto Enciso ReaderOptions.resolveDependencies();
5653c397c90SCarlos Alberto Enciso options().setOptions(&ReaderOptions);
5663c397c90SCarlos Alberto Enciso
5673c397c90SCarlos Alberto Enciso Reader.createElements();
5683c397c90SCarlos Alberto Enciso Reader.addElements();
5693c397c90SCarlos Alberto Enciso Reader.initElements();
5703c397c90SCarlos Alberto Enciso }
5713c397c90SCarlos Alberto Enciso
TEST(LogicalViewTest,LocationCoverage)5723c397c90SCarlos Alberto Enciso TEST(LogicalViewTest, LocationCoverage) {
5733c397c90SCarlos Alberto Enciso ScopedPrinter W(outs());
5743c397c90SCarlos Alberto Enciso ReaderTestCoverage Reader(W);
5753c397c90SCarlos Alberto Enciso
5763c397c90SCarlos Alberto Enciso // Reader options.
5773c397c90SCarlos Alberto Enciso LVOptions ReaderOptions;
5783c397c90SCarlos Alberto Enciso ReaderOptions.setAttributeOffset();
5793c397c90SCarlos Alberto Enciso ReaderOptions.setAttributeRange();
5803c397c90SCarlos Alberto Enciso ReaderOptions.setAttributeLocation();
5813c397c90SCarlos Alberto Enciso ReaderOptions.setPrintAll();
5823c397c90SCarlos Alberto Enciso ReaderOptions.resolveDependencies();
5833c397c90SCarlos Alberto Enciso options().setOptions(&ReaderOptions);
5843c397c90SCarlos Alberto Enciso
5853c397c90SCarlos Alberto Enciso Reader.createElements();
5863c397c90SCarlos Alberto Enciso Reader.addElements();
5873c397c90SCarlos Alberto Enciso Reader.initElements();
5883c397c90SCarlos Alberto Enciso }
5893c397c90SCarlos Alberto Enciso
5903c397c90SCarlos Alberto Enciso } // namespace
591