//===- NativeEnumSymbol.cpp - info about enum type --------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h" #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h" #include using namespace llvm; using namespace llvm::pdb; NativeEnumSymbol::NativeEnumSymbol(NativeSession &Session, SymIndexId Id, const codeview::CVType &CVT) : NativeRawSymbol(Session, Id), CV(CVT), Record(codeview::TypeRecordKind::Enum) { assert(CV.kind() == codeview::TypeLeafKind::LF_ENUM); cantFail(visitTypeRecord(CV, *this)); } NativeEnumSymbol::~NativeEnumSymbol() {} std::unique_ptr NativeEnumSymbol::clone() const { return llvm::make_unique(Session, SymbolId, CV); } std::unique_ptr NativeEnumSymbol::findChildren(PDB_SymType Type) const { switch (Type) { case PDB_SymType::Data: { // TODO(amccarth): Provide an actual implementation. return nullptr; } default: return nullptr; } } Error NativeEnumSymbol::visitKnownRecord(codeview::CVType &CVR, codeview::EnumRecord &ER) { Record = ER; return Error::success(); } Error NativeEnumSymbol::visitKnownMember(codeview::CVMemberRecord &CVM, codeview::EnumeratorRecord &R) { return Error::success(); } PDB_SymType NativeEnumSymbol::getSymTag() const { return PDB_SymType::Enum; } uint32_t NativeEnumSymbol::getClassParentId() const { return 0xFFFFFFFF; } uint32_t NativeEnumSymbol::getUnmodifiedTypeId() const { return 0; } bool NativeEnumSymbol::hasConstructor() const { return bool(Record.getOptions() & codeview::ClassOptions::HasConstructorOrDestructor); } bool NativeEnumSymbol::hasAssignmentOperator() const { return bool(Record.getOptions() & codeview::ClassOptions::HasOverloadedAssignmentOperator); } bool NativeEnumSymbol::hasCastOperator() const { return bool(Record.getOptions() & codeview::ClassOptions::HasConversionOperator); } uint64_t NativeEnumSymbol::getLength() const { const auto Id = Session.findSymbolByTypeIndex(Record.getUnderlyingType()); const auto UnderlyingType = Session.getConcreteSymbolById(Id); return UnderlyingType ? UnderlyingType->getLength() : 0; } std::string NativeEnumSymbol::getName() const { return Record.getName(); } bool NativeEnumSymbol::isNested() const { return bool(Record.getOptions() & codeview::ClassOptions::Nested); } bool NativeEnumSymbol::hasOverloadedOperator() const { return bool(Record.getOptions() & codeview::ClassOptions::HasOverloadedOperator); } bool NativeEnumSymbol::isPacked() const { return bool(Record.getOptions() & codeview::ClassOptions::Packed); } bool NativeEnumSymbol::isScoped() const { return bool(Record.getOptions() & codeview::ClassOptions::Scoped); } uint32_t NativeEnumSymbol::getTypeId() const { return Session.findSymbolByTypeIndex(Record.getUnderlyingType()); }