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