• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
NativeEnumSymbol(NativeSession & Session,SymIndexId Id,const codeview::CVType & CVT)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 
~NativeEnumSymbol()30 NativeEnumSymbol::~NativeEnumSymbol() {}
31 
clone() const32 std::unique_ptr<NativeRawSymbol> NativeEnumSymbol::clone() const {
33   return llvm::make_unique<NativeEnumSymbol>(Session, SymbolId, CV);
34 }
35 
36 std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const37 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 
visitKnownRecord(codeview::CVType & CVR,codeview::EnumRecord & ER)48 Error NativeEnumSymbol::visitKnownRecord(codeview::CVType &CVR,
49                                          codeview::EnumRecord &ER) {
50   Record = ER;
51   return Error::success();
52 }
53 
visitKnownMember(codeview::CVMemberRecord & CVM,codeview::EnumeratorRecord & R)54 Error NativeEnumSymbol::visitKnownMember(codeview::CVMemberRecord &CVM,
55                                          codeview::EnumeratorRecord &R) {
56   return Error::success();
57 }
58 
getSymTag() const59 PDB_SymType NativeEnumSymbol::getSymTag() const { return PDB_SymType::Enum; }
60 
getClassParentId() const61 uint32_t NativeEnumSymbol::getClassParentId() const { return 0xFFFFFFFF; }
62 
getUnmodifiedTypeId() const63 uint32_t NativeEnumSymbol::getUnmodifiedTypeId() const { return 0; }
64 
hasConstructor() const65 bool NativeEnumSymbol::hasConstructor() const {
66   return bool(Record.getOptions() &
67               codeview::ClassOptions::HasConstructorOrDestructor);
68 }
69 
hasAssignmentOperator() const70 bool NativeEnumSymbol::hasAssignmentOperator() const {
71   return bool(Record.getOptions() &
72               codeview::ClassOptions::HasOverloadedAssignmentOperator);
73 }
74 
hasCastOperator() const75 bool NativeEnumSymbol::hasCastOperator() const {
76   return bool(Record.getOptions() &
77               codeview::ClassOptions::HasConversionOperator);
78 }
79 
getLength() const80 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 
getName() const87 std::string NativeEnumSymbol::getName() const { return Record.getName(); }
88 
isNested() const89 bool NativeEnumSymbol::isNested() const {
90   return bool(Record.getOptions() & codeview::ClassOptions::Nested);
91 }
92 
hasOverloadedOperator() const93 bool NativeEnumSymbol::hasOverloadedOperator() const {
94   return bool(Record.getOptions() &
95               codeview::ClassOptions::HasOverloadedOperator);
96 }
97 
isPacked() const98 bool NativeEnumSymbol::isPacked() const {
99   return bool(Record.getOptions() & codeview::ClassOptions::Packed);
100 }
101 
isScoped() const102 bool NativeEnumSymbol::isScoped() const {
103   return bool(Record.getOptions() & codeview::ClassOptions::Scoped);
104 }
105 
getTypeId() const106 uint32_t NativeEnumSymbol::getTypeId() const {
107   return Session.findSymbolByTypeIndex(Record.getUnderlyingType());
108 }
109