//===- 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 static ClassOptions getUdtOptions(CVType CVT) { RecordT Record; if (auto EC = TypeDeserializer::deserializeAs(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(std::move(CVT)); break; case LF_ENUM: UdtOptions = getUdtOptions(std::move(CVT)); break; case LF_UNION: UdtOptions = getUdtOptions(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 Refs; discoverTypeIndices(CVT, Refs); return Refs.front(); }