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