mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-16 00:33:10 +00:00
[DWARF parser] Fix nasty memory corruption in .dwo files handling.
Forge a test case where llvm-symbolizer has to use external .dwo file to produce the inlining information. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217270 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1455ac7a30
commit
54543afeba
@ -235,11 +235,14 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
|
|||||||
return DieArray.size();
|
return DieArray.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
DWARFUnit::DWOHolder::DWOHolder(std::unique_ptr<object::ObjectFile> DWOFile)
|
DWARFUnit::DWOHolder::DWOHolder(StringRef DWOPath)
|
||||||
: DWOFile(std::move(DWOFile)),
|
: DWOFile(), DWOContext(), DWOU(nullptr) {
|
||||||
DWOContext(
|
auto Obj = object::ObjectFile::createObjectFile(DWOPath);
|
||||||
cast<DWARFContext>(DIContext::getDWARFContext(*this->DWOFile))),
|
if (!Obj)
|
||||||
DWOU(nullptr) {
|
return;
|
||||||
|
DWOFile = std::move(Obj.get());
|
||||||
|
DWOContext.reset(
|
||||||
|
cast<DWARFContext>(DIContext::getDWARFContext(*DWOFile.getBinary())));
|
||||||
if (DWOContext->getNumDWOCompileUnits() > 0)
|
if (DWOContext->getNumDWOCompileUnits() > 0)
|
||||||
DWOU = DWOContext->getDWOCompileUnitAtIndex(0);
|
DWOU = DWOContext->getDWOCompileUnitAtIndex(0);
|
||||||
}
|
}
|
||||||
@ -261,12 +264,7 @@ bool DWARFUnit::parseDWO() {
|
|||||||
sys::path::append(AbsolutePath, CompilationDir);
|
sys::path::append(AbsolutePath, CompilationDir);
|
||||||
}
|
}
|
||||||
sys::path::append(AbsolutePath, DWOFileName);
|
sys::path::append(AbsolutePath, DWOFileName);
|
||||||
ErrorOr<object::OwningBinary<object::ObjectFile>> DWOFile =
|
DWO = llvm::make_unique<DWOHolder>(AbsolutePath);
|
||||||
object::ObjectFile::createObjectFile(AbsolutePath);
|
|
||||||
if (!DWOFile)
|
|
||||||
return false;
|
|
||||||
// Reset DWOHolder.
|
|
||||||
DWO = llvm::make_unique<DWOHolder>(std::move(DWOFile->getBinary()));
|
|
||||||
DWARFUnit *DWOCU = DWO->getUnit();
|
DWARFUnit *DWOCU = DWO->getUnit();
|
||||||
// Verify that compile unit in .dwo file is valid.
|
// Verify that compile unit in .dwo file is valid.
|
||||||
if (!DWOCU || DWOCU->getDWOId() != getDWOId()) {
|
if (!DWOCU || DWOCU->getDWOId() != getDWOId()) {
|
||||||
|
@ -51,11 +51,11 @@ class DWARFUnit {
|
|||||||
std::vector<DWARFDebugInfoEntryMinimal> DieArray;
|
std::vector<DWARFDebugInfoEntryMinimal> DieArray;
|
||||||
|
|
||||||
class DWOHolder {
|
class DWOHolder {
|
||||||
std::unique_ptr<object::ObjectFile> DWOFile;
|
object::OwningBinary<object::ObjectFile> DWOFile;
|
||||||
std::unique_ptr<DWARFContext> DWOContext;
|
std::unique_ptr<DWARFContext> DWOContext;
|
||||||
DWARFUnit *DWOU;
|
DWARFUnit *DWOU;
|
||||||
public:
|
public:
|
||||||
DWOHolder(std::unique_ptr<object::ObjectFile> DWOFile);
|
DWOHolder(StringRef DWOPath);
|
||||||
DWARFUnit *getUnit() const { return DWOU; }
|
DWARFUnit *getUnit() const { return DWOU; }
|
||||||
};
|
};
|
||||||
std::unique_ptr<DWOHolder> DWO;
|
std::unique_ptr<DWOHolder> DWO;
|
||||||
|
BIN
test/DebugInfo/Inputs/split-dwarf-test
Executable file
BIN
test/DebugInfo/Inputs/split-dwarf-test
Executable file
Binary file not shown.
17
test/DebugInfo/Inputs/split-dwarf-test.cc
Normal file
17
test/DebugInfo/Inputs/split-dwarf-test.cc
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
int foo(int a) {
|
||||||
|
return a + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
return foo(argc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build instructions:
|
||||||
|
// 1) clang++ -### -O2 -gsplit-dwarf.cc split-dwarf-test.cc -o split-dwarf-test
|
||||||
|
// 2) Replace the value "-fdebug-compilation-dir" flag to "Output"
|
||||||
|
// (this is the temp directory used by lit).
|
||||||
|
// 3) Manually run clang-cc1, objcopy and ld invocations.
|
||||||
|
// 4) Copy the binary and .dwo file to the Inputs directory. Make sure the
|
||||||
|
// .dwo file will be available for symbolizer (use test RUN-lines to copy
|
||||||
|
// the .dwo file to a directory
|
||||||
|
// <execution_directory>/<directory_provided_in_fdebug_compilation_dir>.
|
BIN
test/DebugInfo/Inputs/split-dwarf-test.dwo
Normal file
BIN
test/DebugInfo/Inputs/split-dwarf-test.dwo
Normal file
Binary file not shown.
@ -19,10 +19,15 @@ RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %t.input
|
|||||||
RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input
|
RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input
|
||||||
RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input
|
RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input
|
||||||
RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input
|
RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input
|
||||||
|
RUN: cp %p/Inputs/split-dwarf-test.dwo %T
|
||||||
|
RUN: echo "%p/Inputs/split-dwarf-test 0x4004d0" >> %t.input
|
||||||
|
RUN: echo "%p/Inputs/split-dwarf-test 0x4004c0" >> %t.input
|
||||||
|
|
||||||
RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
|
RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
|
||||||
RUN: --default-arch=i386 < %t.input | FileCheck %s
|
RUN: --default-arch=i386 < %t.input | FileCheck %s
|
||||||
|
|
||||||
|
REQUIRES: shell
|
||||||
|
|
||||||
CHECK: main
|
CHECK: main
|
||||||
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16
|
CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16
|
||||||
|
|
||||||
@ -98,6 +103,14 @@ CHECK-NEXT: {{.*}}fission-ranges.cc:6
|
|||||||
CHECK: _ZN1S3bazEv
|
CHECK: _ZN1S3bazEv
|
||||||
CHECK-NEXT: {{.*}}arange-overlap.cc:6
|
CHECK-NEXT: {{.*}}arange-overlap.cc:6
|
||||||
|
|
||||||
|
CHECK: _Z3fooi
|
||||||
|
CHECK-NEXT: {{.*}}split-dwarf-test.cc
|
||||||
|
CHECK-NEXT: main
|
||||||
|
CHECK-NEXT: {{.*}}split-dwarf-test.cc
|
||||||
|
|
||||||
|
CHECK: _Z3fooi
|
||||||
|
CHECK-NEXT: {{.*}}split-dwarf-test.cc
|
||||||
|
|
||||||
RUN: echo "unexisting-file 0x1234" > %t.input2
|
RUN: echo "unexisting-file 0x1234" > %t.input2
|
||||||
RUN: llvm-symbolizer < %t.input2
|
RUN: llvm-symbolizer < %t.input2
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user