reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | //===- TypeRecordHelpers.cpp ------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h" #include "llvm/ADT/SmallVector.h" #include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h" #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" using namespace llvm; using namespace llvm::codeview; template <typename RecordT> static ClassOptions getUdtOptions(CVType CVT) { RecordT Record; if (auto EC = TypeDeserializer::deserializeAs<RecordT>(CVT, Record)) { consumeError(std::move(EC)); return ClassOptions::None; } return Record.getOptions(); } bool llvm::codeview::isUdtForwardRef(CVType CVT) { ClassOptions UdtOptions = ClassOptions::None; switch (CVT.kind()) { case LF_STRUCTURE: case LF_CLASS: case LF_INTERFACE: UdtOptions = getUdtOptions<ClassRecord>(std::move(CVT)); break; case LF_ENUM: UdtOptions = getUdtOptions<EnumRecord>(std::move(CVT)); break; case LF_UNION: UdtOptions = getUdtOptions<UnionRecord>(std::move(CVT)); break; default: return false; } return (UdtOptions & ClassOptions::ForwardReference) != ClassOptions::None; } TypeIndex llvm::codeview::getModifiedType(const CVType &CVT) { assert(CVT.kind() == LF_MODIFIER); SmallVector<TypeIndex, 1> Refs; discoverTypeIndices(CVT, Refs); return Refs.front(); } |