diff options
author | George Rimar <grimar@accesssoftek.com> | 2017-06-28 08:21:19 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2017-06-28 08:21:19 +0000 |
commit | 1af3cb2912bad7454db673721e22e3ef64850e6c (patch) | |
tree | ff62340e0a5ff6caa90197fe8ebb7b960098d2ce /llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp | |
parent | 99e376956d6fd12641f8515fb019e9220a2e477f (diff) | |
download | bcm5719-llvm-1af3cb2912bad7454db673721e22e3ef64850e6c.tar.gz bcm5719-llvm-1af3cb2912bad7454db673721e22e3ef64850e6c.zip |
Recommit "[ELF] - Add ability for DWARFContextInMemory to exit early when any error happen."
With fix in include folder character case:
#include "llvm/Codegen/AsmPrinter.h" -> #include "llvm/CodeGen/AsmPrinter.h"
Original commit message:
Change introduces error reporting policy for DWARFContextInMemory.
New callback provided by client is able to handle error on it's
side and return Halt or Continue.
That allows to either keep current behavior when parser prints all errors
but continues parsing object or implement something very different, like
stop parsing on a first error and report an error in a client style.
Differential revision: https://reviews.llvm.org/D34328
llvm-svn: 306517
Diffstat (limited to 'llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp')
-rw-r--r-- | llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index bf004d6ffc2..7f6492ee6d1 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -15,10 +15,14 @@ #include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/Config/llvm-config.h" +#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/DWARF/DWARFDie.h" #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCSectionELF.h" +#include "llvm/MC/MCStreamer.h" #include "llvm/Object/ObjectFile.h" #include "llvm/ObjectYAML/DWARFEmitter.h" #include "llvm/ObjectYAML/DWARFYAML.h" @@ -2146,4 +2150,47 @@ TEST(DWARFDebugInfo, TestDwarfVerifyCUDontShareLineTable) { "offset:"); } +TEST(DWARFDebugInfo, TestErrorReportingPolicy) { + initLLVMIfNeeded(); + auto ExpectedDG = dwarfgen::Generator::create(Triple("x86_64-pc-linux"), + 4 /*DwarfVersion*/); + if (HandleExpectedError(ExpectedDG)) + return; + dwarfgen::Generator *DG = ExpectedDG.get().get(); + AsmPrinter *AP = DG->getAsmPrinter(); + MCContext *MC = DG->getMCContext(); + + // Emit two compressed sections with broken headers. + AP->OutStreamer->SwitchSection( + MC->getELFSection(".zdebug_foo", 0 /*Type*/, 0 /*Flags*/)); + AP->OutStreamer->EmitBytes("0"); + AP->OutStreamer->SwitchSection( + MC->getELFSection(".zdebug_bar", 0 /*Type*/, 0 /*Flags*/)); + AP->OutStreamer->EmitBytes("0"); + + MemoryBufferRef FileBuffer(DG->generate(), "dwarf"); + auto Obj = object::ObjectFile::createObjectFile(FileBuffer); + EXPECT_TRUE((bool)Obj); + + // Case 1: error handler handles all errors. That allows + // DWARFContextInMemory + // to parse whole file and find both two errors we know about. + int Errors = 0; + DWARFContextInMemory Ctx1(*Obj.get(), nullptr, [&](Error E) { + ++Errors; + consumeError(std::move(E)); + return ErrorPolicy::Continue; + }); + EXPECT_TRUE(Errors == 2); + + // Case 2: error handler stops parsing of object after first error. + Errors = 0; + DWARFContextInMemory Ctx2(*Obj.get(), nullptr, [&](Error E) { + ++Errors; + consumeError(std::move(E)); + return ErrorPolicy::Halt; + }); + EXPECT_TRUE(Errors == 1); +} + } // end anonymous namespace |