mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 21:50:40 +00:00
Revert r306512 "[ELF] - Add ability for DWARFContextInMemory to exit early when any error happen."
It broke BB: [13/106] 13 0.022 Generating VCSRevision.h [25/106] 24 1.209 Building CXX object unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugInfoTest.cpp.o FAILED: unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugInfoTest.cpp.o /home/bb/bin/g++ -DGTEST_HAS_RTTI=0 -DLLVM_BUILD_GLOBAL_ISEL -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Iunittests/DebugInfo/DWARF -I../llvm-project/llvm/unittests/DebugInfo/DWARF -Iinclude -I../llvm-project/llvm/include -I../llvm-project/llvm/utils/unittest/googletest/include -I../llvm-project/llvm/utils/unittest/googlemock/include -fPIC -fvisibility-inlines-hidden -m32 -std=c++11 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -ffunction-sections -fdata-sections -O3 -UNDEBUG -Wno-variadic-macros -fno-exceptions -fno-rtti -MD -MT unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugInfoTest.cpp.o -MF unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugInfoTest.cpp.o.d -o unittests/DebugInfo/DWARF/CMakeFiles/DebugInfoDWARFTests.dir/DWARFDebugInfoTest.cpp.o -c ../llvm-project/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp ../llvm-project/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp:18:37: fatal error: llvm/Codegen/AsmPrinter.h: No such file or directory #include "llvm/Codegen/AsmPrinter.h" ^ compilation terminated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306513 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
75f572053a
commit
61e059d171
@ -289,11 +289,6 @@ private:
|
||||
DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address);
|
||||
};
|
||||
|
||||
/// Used as a return value for a error callback passed to DWARF context.
|
||||
/// Callback should return Halt if client application wants to stop
|
||||
/// object parsing, or should return Continue otherwise.
|
||||
enum class ErrorPolicy { Halt, Continue };
|
||||
|
||||
/// DWARFContextInMemory is the simplest possible implementation of a
|
||||
/// DWARFContext. It assumes all content is available in memory and stores
|
||||
/// pointers to it.
|
||||
@ -351,14 +346,9 @@ class DWARFContextInMemory : public DWARFContext {
|
||||
Error maybeDecompress(const object::SectionRef &Sec, StringRef Name,
|
||||
StringRef &Data);
|
||||
|
||||
/// Function used to handle default error reporting policy. Prints a error
|
||||
/// message and returns Continue, so DWARF context ignores the error.
|
||||
static ErrorPolicy defaultErrorHandler(Error E);
|
||||
|
||||
public:
|
||||
DWARFContextInMemory(
|
||||
const object::ObjectFile &Obj, const LoadedObjectInfo *L = nullptr,
|
||||
function_ref<ErrorPolicy(Error)> HandleError = defaultErrorHandler);
|
||||
DWARFContextInMemory(const object::ObjectFile &Obj,
|
||||
const LoadedObjectInfo *L = nullptr);
|
||||
|
||||
DWARFContextInMemory(const StringMap<std::unique_ptr<MemoryBuffer>> &Sections,
|
||||
uint8_t AddrSize,
|
||||
|
@ -870,13 +870,13 @@ static Expected<SymInfo> getSymbolInfo(const object::ObjectFile &Obj,
|
||||
|
||||
Expected<uint64_t> SymAddrOrErr = Sym->getAddress();
|
||||
if (!SymAddrOrErr)
|
||||
return createError("failed to compute symbol address: ",
|
||||
return createError("error: failed to compute symbol address: ",
|
||||
SymAddrOrErr.takeError());
|
||||
|
||||
// Also remember what section this symbol is in for later
|
||||
auto SectOrErr = Sym->getSection();
|
||||
if (!SectOrErr)
|
||||
return createError("failed to get symbol section: ",
|
||||
return createError("error: failed to get symbol section: ",
|
||||
SectOrErr.takeError());
|
||||
|
||||
RSec = *SectOrErr;
|
||||
@ -937,14 +937,8 @@ Error DWARFContextInMemory::maybeDecompress(const SectionRef &Sec,
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
ErrorPolicy DWARFContextInMemory::defaultErrorHandler(Error E) {
|
||||
errs() << "error: " + toString(std::move(E)) << '\n';
|
||||
return ErrorPolicy::Continue;
|
||||
}
|
||||
|
||||
DWARFContextInMemory::DWARFContextInMemory(
|
||||
const object::ObjectFile &Obj, const LoadedObjectInfo *L,
|
||||
function_ref<ErrorPolicy(Error)> HandleError)
|
||||
DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
|
||||
const LoadedObjectInfo *L)
|
||||
: FileName(Obj.getFileName()), IsLittleEndian(Obj.isLittleEndian()),
|
||||
AddressSize(Obj.getBytesInAddress()) {
|
||||
for (const SectionRef &Section : Obj.sections()) {
|
||||
@ -967,10 +961,9 @@ DWARFContextInMemory::DWARFContextInMemory(
|
||||
Section.getContents(data);
|
||||
|
||||
if (auto Err = maybeDecompress(Section, name, data)) {
|
||||
ErrorPolicy EP = HandleError(
|
||||
createError("failed to decompress '" + name + "', ", std::move(Err)));
|
||||
if (EP == ErrorPolicy::Halt)
|
||||
return;
|
||||
errs() << "error: failed to decompress '" + name + "', " +
|
||||
toString(std::move(Err))
|
||||
<< '\n';
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1062,8 +1055,7 @@ DWARFContextInMemory::DWARFContextInMemory(
|
||||
|
||||
Expected<SymInfo> SymInfoOrErr = getSymbolInfo(Obj, Reloc, L, AddrCache);
|
||||
if (!SymInfoOrErr) {
|
||||
if (HandleError(SymInfoOrErr.takeError()) == ErrorPolicy::Halt)
|
||||
return;
|
||||
errs() << toString(SymInfoOrErr.takeError()) << '\n';
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1072,11 +1064,7 @@ DWARFContextInMemory::DWARFContextInMemory(
|
||||
if (V.error()) {
|
||||
SmallString<32> Name;
|
||||
Reloc.getTypeName(Name);
|
||||
ErrorPolicy EP = HandleError(
|
||||
createError("failed to compute relocation: " + name + ", ",
|
||||
errorCodeToError(object_error::parse_failed)));
|
||||
if (EP == ErrorPolicy::Halt)
|
||||
return;
|
||||
errs() << "error: failed to compute relocation: " << Name << "\n";
|
||||
continue;
|
||||
}
|
||||
RelocAddrEntry Rel = {SymInfoOrErr->SectionIndex, Val};
|
||||
|
@ -15,14 +15,10 @@
|
||||
#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"
|
||||
@ -2150,47 +2146,4 @@ 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
|
||||
|
@ -215,7 +215,6 @@ public:
|
||||
|
||||
BumpPtrAllocator &getAllocator() { return Allocator; }
|
||||
AsmPrinter *getAsmPrinter() const { return Asm.get(); }
|
||||
MCContext *getMCContext() const { return MC.get(); }
|
||||
DIEAbbrevSet &getAbbrevSet() { return Abbreviations; }
|
||||
DwarfStringPool &getStringPool() { return *StringPool; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user