1//===- llvm/IR/DebugInfoFlags.def - Debug info flag definitions -*- 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// Macros for running through debug info flags.
10//
11//===----------------------------------------------------------------------===//
12
13#if !(defined HANDLE_DI_FLAG || defined HANDLE_DISP_FLAG)
14#error "Missing macro definition of HANDLE_DI*"
15#endif
16
17#ifndef HANDLE_DI_FLAG
18#define HANDLE_DI_FLAG(ID, NAME)
19#endif
20
21#ifndef HANDLE_DISP_FLAG
22#define HANDLE_DISP_FLAG(ID, NAME)
23#endif
24
25// General flags kept in DINode.
26
27HANDLE_DI_FLAG(0, Zero) // Use it as zero value.
28                        // For example: void foo(DIFlags Flags = FlagZero).
29HANDLE_DI_FLAG(1, Private)
30HANDLE_DI_FLAG(2, Protected)
31HANDLE_DI_FLAG(3, Public)
32HANDLE_DI_FLAG((1 << 2), FwdDecl)
33HANDLE_DI_FLAG((1 << 3), AppleBlock)
34HANDLE_DI_FLAG((1 << 4), BlockByrefStruct)
35HANDLE_DI_FLAG((1 << 5), Virtual)
36HANDLE_DI_FLAG((1 << 6), Artificial)
37HANDLE_DI_FLAG((1 << 7), Explicit)
38HANDLE_DI_FLAG((1 << 8), Prototyped)
39HANDLE_DI_FLAG((1 << 9), ObjcClassComplete)
40HANDLE_DI_FLAG((1 << 10), ObjectPointer)
41HANDLE_DI_FLAG((1 << 11), Vector)
42HANDLE_DI_FLAG((1 << 12), StaticMember)
43HANDLE_DI_FLAG((1 << 13), LValueReference)
44HANDLE_DI_FLAG((1 << 14), RValueReference)
45// 15 was formerly ExternalTypeRef, but this was never used.
46HANDLE_DI_FLAG((1 << 15), Reserved)
47HANDLE_DI_FLAG((1 << 16), SingleInheritance)
48HANDLE_DI_FLAG((2 << 16), MultipleInheritance)
49HANDLE_DI_FLAG((3 << 16), VirtualInheritance)
50HANDLE_DI_FLAG((1 << 18), IntroducedVirtual)
51HANDLE_DI_FLAG((1 << 19), BitField)
52HANDLE_DI_FLAG((1 << 20), NoReturn)
53HANDLE_DI_FLAG((1 << 21), ArgumentNotModified)
54HANDLE_DI_FLAG((1 << 22), TypePassByValue)
55HANDLE_DI_FLAG((1 << 23), TypePassByReference)
56HANDLE_DI_FLAG((1 << 24), EnumClass)
57HANDLE_DI_FLAG((1 << 25), Thunk)
58HANDLE_DI_FLAG((1 << 26), NonTrivial)
59HANDLE_DI_FLAG((1 << 27), BigEndian)
60HANDLE_DI_FLAG((1 << 28), LittleEndian)
61HANDLE_DI_FLAG((1 << 29), AllCallsDescribed)
62
63// To avoid needing a dedicated value for IndirectVirtualBase, we use
64// the bitwise or of Virtual and FwdDecl, which does not otherwise
65// make sense for inheritance.
66HANDLE_DI_FLAG((1 << 2) | (1 << 5), IndirectVirtualBase)
67
68#ifdef DI_FLAG_LARGEST_NEEDED
69// intended to be used with ADT/BitmaskEnum.h
70// NOTE: always must be equal to largest flag, check this when adding new flag
71HANDLE_DI_FLAG((1 << 29), Largest)
72#undef DI_FLAG_LARGEST_NEEDED
73#endif
74
75// Subprogram-specific flags kept in DISubprogram.
76
77// Use this as a zero/initialization value.
78// For example: void foo(DISPFlags Flags = SPFlagZero).
79HANDLE_DISP_FLAG(0, Zero)
80// Virtuality is a two-bit enum field in the LSB of the word.
81// Values should match DW_VIRTUALITY_*.
82HANDLE_DISP_FLAG(1u, Virtual)
83HANDLE_DISP_FLAG(2u, PureVirtual)
84HANDLE_DISP_FLAG((1u << 2), LocalToUnit)
85HANDLE_DISP_FLAG((1u << 3), Definition)
86HANDLE_DISP_FLAG((1u << 4), Optimized)
87HANDLE_DISP_FLAG((1u << 5), Pure)
88HANDLE_DISP_FLAG((1u << 6), Elemental)
89HANDLE_DISP_FLAG((1u << 7), Recursive)
90HANDLE_DISP_FLAG((1u << 8), MainSubprogram)
91
92#ifdef DISP_FLAG_LARGEST_NEEDED
93// Intended to be used with ADT/BitmaskEnum.h.
94// NOTE: Always must be equal to largest flag, check this when adding new flags.
95HANDLE_DISP_FLAG((1 << 8), Largest)
96#undef DISP_FLAG_LARGEST_NEEDED
97#endif
98
99#undef HANDLE_DI_FLAG
100#undef HANDLE_DISP_FLAG
101