1*66702629SJames Henderson //===- DWARFDebugLineTest.cpp ---------------------------------------------===// 2*66702629SJames Henderson // 3*66702629SJames Henderson // The LLVM Compiler Infrastructure 4*66702629SJames Henderson // 5*66702629SJames Henderson // This file is distributed under the University of Illinois Open Source 6*66702629SJames Henderson // License. See LICENSE.TXT for details. 7*66702629SJames Henderson // 8*66702629SJames Henderson //===----------------------------------------------------------------------===// 9*66702629SJames Henderson 10*66702629SJames Henderson #include "DwarfGenerator.h" 11*66702629SJames Henderson #include "DwarfUtils.h" 12*66702629SJames Henderson #include "llvm/DebugInfo/DWARF/DWARFContext.h" 13*66702629SJames Henderson #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h" 14*66702629SJames Henderson #include "llvm/Object/ObjectFile.h" 15*66702629SJames Henderson #include "llvm/Testing/Support/Error.h" 16*66702629SJames Henderson #include "gtest/gtest.h" 17*66702629SJames Henderson 18*66702629SJames Henderson using namespace llvm; 19*66702629SJames Henderson using namespace dwarf; 20*66702629SJames Henderson using namespace object; 21*66702629SJames Henderson using namespace utils; 22*66702629SJames Henderson 23*66702629SJames Henderson namespace { 24*66702629SJames Henderson 25*66702629SJames Henderson struct DebugLineGenerator { 26*66702629SJames Henderson bool init() { 27*66702629SJames Henderson Triple T = getHostTripleForAddrSize(8); 28*66702629SJames Henderson if (!isConfigurationSupported(T)) 29*66702629SJames Henderson return false; 30*66702629SJames Henderson auto ExpectedGenerator = dwarfgen::Generator::create(T, 4); 31*66702629SJames Henderson if (ExpectedGenerator) 32*66702629SJames Henderson Generator.reset(ExpectedGenerator->release()); 33*66702629SJames Henderson return true; 34*66702629SJames Henderson } 35*66702629SJames Henderson 36*66702629SJames Henderson std::unique_ptr<DWARFContext> createContext() { 37*66702629SJames Henderson if (!Generator) 38*66702629SJames Henderson return nullptr; 39*66702629SJames Henderson StringRef FileBytes = Generator->generate(); 40*66702629SJames Henderson MemoryBufferRef FileBuffer(FileBytes, "dwarf"); 41*66702629SJames Henderson auto Obj = object::ObjectFile::createObjectFile(FileBuffer); 42*66702629SJames Henderson if (Obj) 43*66702629SJames Henderson return DWARFContext::create(**Obj); 44*66702629SJames Henderson return nullptr; 45*66702629SJames Henderson } 46*66702629SJames Henderson 47*66702629SJames Henderson std::unique_ptr<dwarfgen::Generator> Generator; 48*66702629SJames Henderson }; 49*66702629SJames Henderson 50*66702629SJames Henderson TEST(DWARFDebugLine, GetLineTableAtInvalidOffset) { 51*66702629SJames Henderson DebugLineGenerator LineGen; 52*66702629SJames Henderson if (!LineGen.init()) 53*66702629SJames Henderson return; 54*66702629SJames Henderson 55*66702629SJames Henderson DWARFDebugLine Line; 56*66702629SJames Henderson std::unique_ptr<DWARFContext> Context = LineGen.createContext(); 57*66702629SJames Henderson ASSERT_TRUE(Context != nullptr); 58*66702629SJames Henderson const DWARFObject &Obj = Context->getDWARFObj(); 59*66702629SJames Henderson DWARFDataExtractor LineData(Obj, Obj.getLineSection(), true, 8); 60*66702629SJames Henderson 61*66702629SJames Henderson EXPECT_EQ(Line.getOrParseLineTable(LineData, 0, *Context, nullptr), nullptr); 62*66702629SJames Henderson } 63*66702629SJames Henderson 64*66702629SJames Henderson } // end anonymous namespace 65