Index: lib/DebugInfo/DWARF/DWARFDebugLine.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -449,6 +449,9 @@ DWARFDebugLine::getOrParseLineTable(DWARFDataExtractor &DebugLineData, uint32_t Offset, const DWARFContext &Ctx, const DWARFUnit *U) { + if (!DebugLineData.isValidOffset(Offset)) + return nullptr; + std::pair Pos = LineTableMap.insert(LineTableMapTy::value_type(Offset, LineTable())); LineTable *LT = &Pos.first->second; Index: unittests/DebugInfo/DWARF/CMakeLists.txt =================================================================== --- unittests/DebugInfo/DWARF/CMakeLists.txt +++ unittests/DebugInfo/DWARF/CMakeLists.txt @@ -10,7 +10,9 @@ set(DebugInfoSources DwarfGenerator.cpp + DwarfUtils.cpp DWARFDebugInfoTest.cpp + DWARFDebugLineTest.cpp DWARFFormValueTest.cpp ) Index: unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp =================================================================== --- unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ 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 void TestAllForms() { Triple Triple = getHostTripleForAddrSize(sizeof(AddrType)); Index: unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp =================================================================== --- unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp +++ 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 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 Generator; +}; + +TEST(DWARFDebugLine, GetLineTableAtInvalidOffset) { + DebugLineGenerator LineGen; + if (!LineGen.init()) + return; + + DWARFDebugLine Line; + std::unique_ptr 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 Index: unittests/DebugInfo/DWARF/DwarfUtils.h =================================================================== --- unittests/DebugInfo/DWARF/DwarfUtils.h +++ 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 + +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 Index: unittests/DebugInfo/DWARF/DwarfUtils.cpp =================================================================== --- unittests/DebugInfo/DWARF/DwarfUtils.cpp +++ 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); +}