summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp3
-rw-r--r--llvm/unittests/DebugInfo/DWARF/CMakeLists.txt2
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp31
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp64
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp42
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DwarfUtils.h29
6 files changed, 143 insertions, 28 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
index 56e7af24af5..efc1870fd8c 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
@@ -449,6 +449,9 @@ const DWARFDebugLine::LineTable *
DWARFDebugLine::getOrParseLineTable(DWARFDataExtractor &DebugLineData,
uint32_t Offset, const DWARFContext &Ctx,
const DWARFUnit *U) {
+ if (!DebugLineData.isValidOffset(Offset))
+ return nullptr;
+
std::pair<LineTableIter, bool> Pos =
LineTableMap.insert(LineTableMapTy::value_type(Offset, LineTable()));
LineTable *LT = &Pos.first->second;
diff --git a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt
index f490097a21a..f8ebedf7c34 100644
--- a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt
+++ b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt
@@ -10,7 +10,9 @@ set(LLVM_LINK_COMPONENTS
set(DebugInfoSources
DwarfGenerator.cpp
+ DwarfUtils.cpp
DWARFDebugInfoTest.cpp
+ DWARFDebugLineTest.cpp
DWARFFormValueTest.cpp
)
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
index cb7bf82d86f..a61ab7d3aff 100644
--- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
@@ -1,4 +1,4 @@
-//===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===//
+//===- llvm/unittest/DebugInfo/DWARFDebugInfoTest.cpp ---------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "DwarfGenerator.h"
+#include "DwarfUtils.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
@@ -36,36 +37,10 @@
using namespace llvm;
using namespace dwarf;
+using namespace utils;
namespace {
-void initLLVMIfNeeded() {
- static bool gInitialized = false;
- if (!gInitialized) {
- gInitialized = true;
- InitializeAllTargets();
- InitializeAllTargetMCs();
- InitializeAllAsmPrinters();
- InitializeAllAsmParsers();
- }
-}
-
-Triple getHostTripleForAddrSize(uint8_t AddrSize) {
- Triple PT(Triple::normalize(LLVM_HOST_TRIPLE));
-
- if (AddrSize == 8 && PT.isArch32Bit())
- return PT.get64BitArchVariant();
- if (AddrSize == 4 && PT.isArch64Bit())
- return PT.get32BitArchVariant();
- return PT;
-}
-
-static bool isConfigurationSupported(Triple &T) {
- initLLVMIfNeeded();
- std::string Err;
- return TargetRegistry::lookupTarget(T.getTriple(), Err);
-}
-
template <uint16_t Version, class AddrType, class RefAddrType>
void TestAllForms() {
Triple Triple = getHostTripleForAddrSize(sizeof(AddrType));
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
new file mode 100644
index 00000000000..8073b705dc2
--- /dev/null
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
@@ -0,0 +1,64 @@
+//===- DWARFDebugLineTest.cpp ---------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DwarfGenerator.h"
+#include "DwarfUtils.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace dwarf;
+using namespace object;
+using namespace utils;
+
+namespace {
+
+struct DebugLineGenerator {
+ bool init() {
+ Triple T = getHostTripleForAddrSize(8);
+ if (!isConfigurationSupported(T))
+ return false;
+ auto ExpectedGenerator = dwarfgen::Generator::create(T, 4);
+ if (ExpectedGenerator)
+ Generator.reset(ExpectedGenerator->release());
+ return true;
+ }
+
+ std::unique_ptr<DWARFContext> createContext() {
+ if (!Generator)
+ return nullptr;
+ StringRef FileBytes = Generator->generate();
+ MemoryBufferRef FileBuffer(FileBytes, "dwarf");
+ auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
+ if (Obj)
+ return DWARFContext::create(**Obj);
+ return nullptr;
+ }
+
+ std::unique_ptr<dwarfgen::Generator> Generator;
+};
+
+TEST(DWARFDebugLine, GetLineTableAtInvalidOffset) {
+ DebugLineGenerator LineGen;
+ if (!LineGen.init())
+ return;
+
+ DWARFDebugLine Line;
+ std::unique_ptr<DWARFContext> Context = LineGen.createContext();
+ ASSERT_TRUE(Context != nullptr);
+ const DWARFObject &Obj = Context->getDWARFObj();
+ DWARFDataExtractor LineData(Obj, Obj.getLineSection(), true, 8);
+
+ EXPECT_EQ(Line.getOrParseLineTable(LineData, 0, *Context, nullptr), nullptr);
+}
+
+} // end anonymous namespace
diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp
new file mode 100644
index 00000000000..8cb74587afe
--- /dev/null
+++ b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp
@@ -0,0 +1,42 @@
+//===--- unittests/DebugInfo/DWARF/DwarfUtils.cpp ---------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DwarfUtils.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+
+using namespace llvm;
+
+static void initLLVMIfNeeded() {
+ static bool gInitialized = false;
+ if (!gInitialized) {
+ gInitialized = true;
+ InitializeAllTargets();
+ InitializeAllTargetMCs();
+ InitializeAllAsmPrinters();
+ InitializeAllAsmParsers();
+ }
+}
+
+Triple llvm::dwarf::utils::getHostTripleForAddrSize(uint8_t AddrSize) {
+ Triple T(Triple::normalize(LLVM_HOST_TRIPLE));
+
+ if (AddrSize == 8 && T.isArch32Bit())
+ return T.get64BitArchVariant();
+ if (AddrSize == 4 && T.isArch64Bit())
+ return T.get32BitArchVariant();
+ return T;
+}
+
+bool llvm::dwarf::utils::isConfigurationSupported(Triple &T) {
+ initLLVMIfNeeded();
+ std::string Err;
+ return TargetRegistry::lookupTarget(T.getTriple(), Err);
+}
diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfUtils.h b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.h
new file mode 100644
index 00000000000..3d8045679d5
--- /dev/null
+++ b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.h
@@ -0,0 +1,29 @@
+//===--- unittests/DebugInfo/DWARF/DwarfUtils.h -----------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_UNITTESTS_DEBUG_INFO_DWARF_DWARFUTILS_H
+#define LLVM_UNITTESTS_DEBUG_INFO_DWARF_DWARFUTILS_H
+
+#include <cstdint>
+
+namespace llvm {
+
+class Triple;
+
+namespace dwarf {
+namespace utils {
+
+Triple getHostTripleForAddrSize(uint8_t AddrSize);
+bool isConfigurationSupported(Triple &T);
+
+} // end namespace utils
+} // end namespace dwarf
+} // end namespace llvm
+
+#endif // LLVM_UNITTESTS_DEBUG_INFO_DWARF_DWARFUTILS_H
OpenPOWER on IntegriCloud