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;
set(DebugInfoSources
DwarfGenerator.cpp
+ DwarfUtils.cpp
DWARFDebugInfoTest.cpp
+ DWARFDebugLineTest.cpp
DWARFFormValueTest.cpp
)
-//===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===//
+//===- llvm/unittest/DebugInfo/DWARFDebugInfoTest.cpp ---------------------===//
//
// The LLVM Compiler Infrastructure
//
//===----------------------------------------------------------------------===//
#include "DwarfGenerator.h"
+#include "DwarfUtils.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
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));
--- /dev/null
+//===- 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
--- /dev/null
+//===--- 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);
+}
--- /dev/null
+//===--- 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