diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/LEB128.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/SwapByteOrder.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" @@ -475,13 +476,19 @@ Expected>> DWARFYAML::emitDebugSections(StringRef YAMLString, bool ApplyFixups, bool IsLittleEndian) { - yaml::Input YIn(YAMLString); + auto CollectDiagnostic = [](const SMDiagnostic &Diag, void *DiagContext) { + *static_cast(DiagContext) = Diag; + }; + + SMDiagnostic GeneratedDiag; + yaml::Input YIn(YAMLString, /*Ctxt=*/nullptr, CollectDiagnostic, + &GeneratedDiag); DWARFYAML::Data DI; DI.IsLittleEndian = IsLittleEndian; YIn >> DI; if (YIn.error()) - return errorCodeToError(YIn.error()); + return createStringError(YIn.error(), GeneratedDiag.getMessage()); if (ApplyFixups) { DIEFixupVisitor DIFixer(DI); diff --git a/llvm/unittests/ObjectYAML/CMakeLists.txt b/llvm/unittests/ObjectYAML/CMakeLists.txt --- a/llvm/unittests/ObjectYAML/CMakeLists.txt +++ b/llvm/unittests/ObjectYAML/CMakeLists.txt @@ -4,6 +4,7 @@ ) add_llvm_unittest(ObjectYAMLTests + DWARFYAMLTest.cpp ELFYAMLTest.cpp MinidumpYAMLTest.cpp YAML2ObjTest.cpp diff --git a/llvm/unittests/ObjectYAML/DWARFYAMLTest.cpp b/llvm/unittests/ObjectYAML/DWARFYAMLTest.cpp new file mode 100644 --- /dev/null +++ b/llvm/unittests/ObjectYAML/DWARFYAMLTest.cpp @@ -0,0 +1,49 @@ +//===- DWARFYAMLTest.cpp - Tests for DWARFYAML.cpp ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/ObjectYAML/DWARFYAML.h" +#include "llvm/ObjectYAML/DWARFEmitter.h" +#include "llvm/Testing/Support/Error.h" +#include "gtest/gtest.h" + +using namespace llvm; + +TEST(DebugAddrSection, TestParseDebugAddrYAML) { + StringRef Yaml = R"( +debug_addr: + - Format: DWARF64 + Length: 0x1234 + Version: 5 +)"; + auto SectionsOrErr = DWARFYAML::emitDebugSections(Yaml); + EXPECT_THAT_EXPECTED(SectionsOrErr, Succeeded()); +} + +TEST(DebugAddrSection, TestMissingVersion) { + StringRef Yaml = R"( +debug_addr: + - Format: DWARF64 + Length: 0x1234 +)"; + auto SectionsOrErr = DWARFYAML::emitDebugSections(Yaml); + EXPECT_THAT_ERROR(SectionsOrErr.takeError(), + FailedWithMessage("missing required key 'Version'")); +} + +TEST(DebugAddrSection, TestUnexpectedKey) { + StringRef Yaml = R"( +debug_addr: + - Format: DWARF64 + Length: 0x1234 + Version: 5 + Blah: unexpected +)"; + auto SectionsOrErr = DWARFYAML::emitDebugSections(Yaml); + EXPECT_THAT_ERROR(SectionsOrErr.takeError(), + FailedWithMessage("unknown key 'Blah'")); +}