]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/DebugInfo/PDB/Native/NativeEnumSymbol.cpp
MFC r345703:
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / DebugInfo / PDB / Native / NativeEnumSymbol.cpp
1 //===- NativeEnumSymbol.cpp - info about enum type --------------*- C++ -*-===//
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 "llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h"
11
12 #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
13 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
14 #include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h"
15 #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
16
17 #include <cassert>
18
19 using namespace llvm;
20 using namespace llvm::pdb;
21
22 NativeEnumSymbol::NativeEnumSymbol(NativeSession &Session, SymIndexId Id,
23                                    const codeview::CVType &CVT)
24     : NativeRawSymbol(Session, Id), CV(CVT),
25       Record(codeview::TypeRecordKind::Enum) {
26   assert(CV.kind() == codeview::TypeLeafKind::LF_ENUM);
27   cantFail(visitTypeRecord(CV, *this));
28 }
29
30 NativeEnumSymbol::~NativeEnumSymbol() {}
31
32 std::unique_ptr<NativeRawSymbol> NativeEnumSymbol::clone() const {
33   return llvm::make_unique<NativeEnumSymbol>(Session, SymbolId, CV);
34 }
35
36 std::unique_ptr<IPDBEnumSymbols>
37 NativeEnumSymbol::findChildren(PDB_SymType Type) const {
38   switch (Type) {
39   case PDB_SymType::Data: {
40     // TODO(amccarth):  Provide an actual implementation.
41     return nullptr;
42   }
43   default:
44     return nullptr;
45   }
46 }
47
48 Error NativeEnumSymbol::visitKnownRecord(codeview::CVType &CVR,
49                                          codeview::EnumRecord &ER) {
50   Record = ER;
51   return Error::success();
52 }
53
54 Error NativeEnumSymbol::visitKnownMember(codeview::CVMemberRecord &CVM,
55                                          codeview::EnumeratorRecord &R) {
56   return Error::success();
57 }
58
59 PDB_SymType NativeEnumSymbol::getSymTag() const { return PDB_SymType::Enum; }
60
61 uint32_t NativeEnumSymbol::getClassParentId() const { return 0xFFFFFFFF; }
62
63 uint32_t NativeEnumSymbol::getUnmodifiedTypeId() const { return 0; }
64
65 bool NativeEnumSymbol::hasConstructor() const {
66   return bool(Record.getOptions() &
67               codeview::ClassOptions::HasConstructorOrDestructor);
68 }
69
70 bool NativeEnumSymbol::hasAssignmentOperator() const {
71   return bool(Record.getOptions() &
72               codeview::ClassOptions::HasOverloadedAssignmentOperator);
73 }
74
75 bool NativeEnumSymbol::hasCastOperator() const {
76   return bool(Record.getOptions() &
77               codeview::ClassOptions::HasConversionOperator);
78 }
79
80 uint64_t NativeEnumSymbol::getLength() const {
81   const auto Id = Session.findSymbolByTypeIndex(Record.getUnderlyingType());
82   const auto UnderlyingType =
83       Session.getConcreteSymbolById<PDBSymbolTypeBuiltin>(Id);
84   return UnderlyingType ? UnderlyingType->getLength() : 0;
85 }
86
87 std::string NativeEnumSymbol::getName() const { return Record.getName(); }
88
89 bool NativeEnumSymbol::isNested() const {
90   return bool(Record.getOptions() & codeview::ClassOptions::Nested);
91 }
92
93 bool NativeEnumSymbol::hasOverloadedOperator() const {
94   return bool(Record.getOptions() &
95               codeview::ClassOptions::HasOverloadedOperator);
96 }
97
98 bool NativeEnumSymbol::isPacked() const {
99   return bool(Record.getOptions() & codeview::ClassOptions::Packed);
100 }
101
102 bool NativeEnumSymbol::isScoped() const {
103   return bool(Record.getOptions() & codeview::ClassOptions::Scoped);
104 }
105
106 uint32_t NativeEnumSymbol::getTypeId() const {
107   return Session.findSymbolByTypeIndex(Record.getUnderlyingType());
108 }