mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-04 03:17:51 +00:00
[codeview] Fix dumping VFTables, stop when we see LF_PAD*
Also stop visiting type records when we encounter an error. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269374 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b6b8f76650
commit
2eea1812c8
@ -78,8 +78,11 @@ public:
|
||||
|
||||
/// Visits the type records in Data. Sets the error flag on parse failures.
|
||||
void visitTypeStream(ArrayRef<uint8_t> Data) {
|
||||
for (const auto &I : makeTypeRange(Data))
|
||||
for (const auto &I : makeTypeRange(Data)) {
|
||||
visitTypeRecord(I);
|
||||
if (hadError())
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// Action to take on unknown types. By default, they are ignored.
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/Endian.h"
|
||||
#include "llvm/DebugInfo/CodeView/CodeView.h"
|
||||
#include <cinttypes>
|
||||
#include <tuple>
|
||||
|
||||
@ -113,7 +114,8 @@ template <typename T> struct serialize_array_tail_impl {
|
||||
|
||||
std::error_code deserialize(ArrayRef<uint8_t> &Data) const {
|
||||
T Field;
|
||||
while (!Data.empty()) {
|
||||
// Stop when we run out of bytes or we hit record padding bytes.
|
||||
while (!Data.empty() && Data.front() < LF_PAD0) {
|
||||
if (auto EC = consume(Data, Field))
|
||||
return EC;
|
||||
Item.push_back(Field);
|
||||
|
BIN
test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff
Normal file
BIN
test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff
Normal file
Binary file not shown.
51
test/tools/llvm-readobj/codeview-vftable.test
Normal file
51
test/tools/llvm-readobj/codeview-vftable.test
Normal file
@ -0,0 +1,51 @@
|
||||
; The following two object files were generated using the following command:
|
||||
; $ cl /Z7 /c t.cpp
|
||||
; The contents of t.cpp follow:
|
||||
; struct A {
|
||||
; virtual void f();
|
||||
; };
|
||||
; struct B {
|
||||
; virtual void f();
|
||||
; virtual void g();
|
||||
; };
|
||||
; struct C {
|
||||
; virtual void f();
|
||||
; virtual void g();
|
||||
; virtual void h();
|
||||
; };
|
||||
; A a;
|
||||
; B b;
|
||||
; C c;
|
||||
|
||||
RUN: llvm-readobj -codeview %p/Inputs/codeview-vftable.obj.coff | FileCheck %s
|
||||
|
||||
CHECK: VFTableType {
|
||||
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
||||
CHECK-NEXT: TypeIndex: 0x10F0
|
||||
CHECK-NEXT: CompleteClass: A
|
||||
CHECK-NEXT: OverriddenVFTable: 0x0
|
||||
CHECK-NEXT: VFPtrOffset: 0x0
|
||||
CHECK-NEXT: VFTableName: ??_7A@@6B@
|
||||
CHECK-NEXT: MethodName: ?f@A@@UEAAXXZ
|
||||
CHECK-NEXT: }
|
||||
CHECK-NEXT: VFTableType {
|
||||
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
||||
CHECK-NEXT: TypeIndex: 0x10F1
|
||||
CHECK-NEXT: CompleteClass: B
|
||||
CHECK-NEXT: OverriddenVFTable: ??_7A@@6B@ (0x10F0)
|
||||
CHECK-NEXT: VFPtrOffset: 0x0
|
||||
CHECK-NEXT: VFTableName: ??_7B@@6B@
|
||||
CHECK-NEXT: MethodName: ?f@B@@UEAAXXZ
|
||||
CHECK-NEXT: MethodName: ?g@B@@UEAAXXZ
|
||||
CHECK-NEXT: }
|
||||
CHECK-NEXT: VFTableType {
|
||||
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
||||
CHECK-NEXT: TypeIndex: 0x10F2
|
||||
CHECK-NEXT: CompleteClass: C
|
||||
CHECK-NEXT: OverriddenVFTable: ??_7B@@6B@ (0x10F1)
|
||||
CHECK-NEXT: VFPtrOffset: 0x0
|
||||
CHECK-NEXT: VFTableName: ??_7C@@6B@
|
||||
CHECK-NEXT: MethodName: ?f@C@@UEAAXXZ
|
||||
CHECK-NEXT: MethodName: ?g@C@@UEAAXXZ
|
||||
CHECK-NEXT: MethodName: ?h@C@@UEAAXXZ
|
||||
CHECK-NEXT: }
|
Loading…
x
Reference in New Issue
Block a user