10b57cec5SDimitry Andric //===- TypeRecordHelpers.h --------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPERECORDHELPERS_H
100b57cec5SDimitry Andric #define LLVM_DEBUGINFO_CODEVIEW_TYPERECORDHELPERS_H
110b57cec5SDimitry Andric 
12e8d8bef9SDimitry Andric #include "llvm/DebugInfo/CodeView/CVRecord.h"
13e8d8bef9SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeIndex.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric namespace llvm {
160b57cec5SDimitry Andric namespace codeview {
17480093f4SDimitry Andric 
180b57cec5SDimitry Andric /// Given an arbitrary codeview type, determine if it is an LF_STRUCTURE,
190b57cec5SDimitry Andric /// LF_CLASS, LF_INTERFACE, LF_UNION, or LF_ENUM with the forward ref class
200b57cec5SDimitry Andric /// option.
210b57cec5SDimitry Andric bool isUdtForwardRef(CVType CVT);
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric /// Given a CVType which is assumed to be an LF_MODIFIER, return the
240b57cec5SDimitry Andric /// TypeIndex of the type that the LF_MODIFIER modifies.
250b57cec5SDimitry Andric TypeIndex getModifiedType(const CVType &CVT);
26480093f4SDimitry Andric 
27480093f4SDimitry Andric /// Return true if this record should be in the IPI stream of a PDB. In an
28480093f4SDimitry Andric /// object file, these record kinds will appear mixed into the .debug$T section.
isIdRecord(TypeLeafKind K)29480093f4SDimitry Andric inline bool isIdRecord(TypeLeafKind K) {
30480093f4SDimitry Andric   switch (K) {
31480093f4SDimitry Andric   case TypeLeafKind::LF_FUNC_ID:
32480093f4SDimitry Andric   case TypeLeafKind::LF_MFUNC_ID:
33480093f4SDimitry Andric   case TypeLeafKind::LF_STRING_ID:
34480093f4SDimitry Andric   case TypeLeafKind::LF_SUBSTR_LIST:
35480093f4SDimitry Andric   case TypeLeafKind::LF_BUILDINFO:
36480093f4SDimitry Andric   case TypeLeafKind::LF_UDT_SRC_LINE:
37480093f4SDimitry Andric   case TypeLeafKind::LF_UDT_MOD_SRC_LINE:
38480093f4SDimitry Andric     return true;
39480093f4SDimitry Andric   default:
40480093f4SDimitry Andric     return false;
410b57cec5SDimitry Andric   }
420b57cec5SDimitry Andric }
430b57cec5SDimitry Andric 
44bdd1243dSDimitry Andric /// Given an arbitrary codeview type, determine if it is an LF_STRUCTURE,
45bdd1243dSDimitry Andric /// LF_CLASS, LF_INTERFACE, LF_UNION.
isAggregate(CVType CVT)46bdd1243dSDimitry Andric inline bool isAggregate(CVType CVT) {
47bdd1243dSDimitry Andric   switch (CVT.kind()) {
48bdd1243dSDimitry Andric   case LF_STRUCTURE:
49bdd1243dSDimitry Andric   case LF_CLASS:
50bdd1243dSDimitry Andric   case LF_INTERFACE:
51bdd1243dSDimitry Andric   case LF_UNION:
52bdd1243dSDimitry Andric     return true;
53bdd1243dSDimitry Andric   default:
54bdd1243dSDimitry Andric     return false;
55bdd1243dSDimitry Andric   }
56bdd1243dSDimitry Andric }
57bdd1243dSDimitry Andric 
58bdd1243dSDimitry Andric /// Given an arbitrary codeview type index, determine its size.
59bdd1243dSDimitry Andric uint64_t getSizeInBytesForTypeIndex(TypeIndex TI);
60bdd1243dSDimitry Andric 
61bdd1243dSDimitry Andric /// Given an arbitrary codeview type, return the type's size in the case
62bdd1243dSDimitry Andric /// of aggregate (LF_STRUCTURE, LF_CLASS, LF_INTERFACE, LF_UNION).
63bdd1243dSDimitry Andric uint64_t getSizeInBytesForTypeRecord(CVType CVT);
64bdd1243dSDimitry Andric 
65480093f4SDimitry Andric } // namespace codeview
66480093f4SDimitry Andric } // namespace llvm
67480093f4SDimitry Andric 
680b57cec5SDimitry Andric #endif
69