]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp
Note r317395 as merged.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / DebugInfo / DWARF / DWARFDebugInfoEntry.cpp
1 //===-- DWARFDebugInfoEntry.cpp -------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "SyntaxHighlighting.h"
11 #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
12 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
13 #include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"
14 #include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h"
15 #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
16 #include "llvm/Support/DataTypes.h"
17 #include "llvm/Support/Debug.h"
18 #include "llvm/Support/Dwarf.h"
19 #include "llvm/Support/Format.h"
20 #include "llvm/Support/raw_ostream.h"
21 using namespace llvm;
22 using namespace dwarf;
23 using namespace syntax;
24
25 bool DWARFDebugInfoEntry::extractFast(const DWARFUnit &U,
26                                              uint32_t *OffsetPtr) {
27   DataExtractor DebugInfoData = U.getDebugInfoExtractor();
28   const uint32_t UEndOffset = U.getNextUnitOffset();
29   return extractFast(U, OffsetPtr, DebugInfoData, UEndOffset, 0);
30 }
31 bool DWARFDebugInfoEntry::extractFast(const DWARFUnit &U, uint32_t *OffsetPtr,
32                                       const DataExtractor &DebugInfoData,
33                                       uint32_t UEndOffset, uint32_t D) {
34   Offset = *OffsetPtr;
35   Depth = D;
36   if (Offset >= UEndOffset || !DebugInfoData.isValidOffset(Offset))
37     return false;
38   uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
39   if (0 == AbbrCode) {
40     // NULL debug tag entry.
41     AbbrevDecl = nullptr;
42     return true;
43   }
44   AbbrevDecl = U.getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
45   if (nullptr == AbbrevDecl) {
46     // Restore the original offset.
47     *OffsetPtr = Offset;
48     return false;
49   }
50   // See if all attributes in this DIE have fixed byte sizes. If so, we can
51   // just add this size to the offset to skip to the next DIE.
52   if (Optional<size_t> FixedSize = AbbrevDecl->getFixedAttributesByteSize(U)) {
53     *OffsetPtr += *FixedSize;
54     return true;
55   }
56
57   // Skip all data in the .debug_info for the attributes
58   for (const auto &AttrSpec : AbbrevDecl->attributes()) {
59     // Check if this attribute has a fixed byte size.
60     if (auto FixedSize = AttrSpec.getByteSize(U)) {
61       // Attribute byte size if fixed, just add the size to the offset.
62       *OffsetPtr += *FixedSize;
63     } else if (!DWARFFormValue::skipValue(AttrSpec.Form, DebugInfoData,
64                                           OffsetPtr, &U)) {
65       // We failed to skip this attribute's value, restore the original offset
66       // and return the failure status.
67       *OffsetPtr = Offset;
68       return false;
69     }
70   }
71   return true;
72 }