LLVM 24.0.0git
SyntheticTypeNameBuilder.h
Go to the documentation of this file.
1//===- SyntheticTypeNameBuilder.h -------------------------------*- 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#ifndef LLVM_LIB_DWARFLINKER_PARALLEL_SYNTHETICTYPENAMEBUILDER_H
10#define LLVM_LIB_DWARFLINKER_PARALLEL_SYNTHETICTYPENAMEBUILDER_H
11
16
17namespace llvm {
19
20namespace dwarf_linker {
21namespace parallel {
22struct LinkContext;
23class TypeTableUnit;
24class CompileUnit;
25
26/// The helper class to build type name based on DIE properties.
27/// It builds synthetic name based on explicit attributes: DW_AT_name,
28/// DW_AT_linkage_name or based on implicit attributes(DW_AT_decl*).
29/// Names for specific DIEs(like subprograms, template classes...) include
30/// additional attributes: subprogram parameters, template parameters,
31/// array ranges. Examples of built name:
32///
33/// class A { } : {8}A
34///
35/// namspace llvm { class A { } } : {1}llvm{8}A
36///
37/// template <int> structure B { } : {F}B<{0}int>
38///
39/// void foo ( int p1, float p3 ) : {a}void foo({0}int, {0}int)
40///
41/// int *ptr; : {c}ptr {0}int
42///
43/// int var; : {d}var
44///
45/// These names is used to refer DIEs describing types.
47public:
49
50 /// Create synthetic name for the specified DIE \p InputUnitEntryPair
51 /// and assign created name to the DIE type info. \p ChildIndex is used
52 /// to create name for ordered DIEs(function arguments f.e.).
53 Error assignName(UnitEntryPairTy InputUnitEntryPair,
54 std::optional<std::pair<size_t, size_t>> ChildIndex);
55
56protected:
57 /// Add array type dimension.
58 void addArrayDimension(UnitEntryPairTy InputUnitEntryPair);
59
60 /// Add signature( entry type plus type of parameters plus type of template
61 /// parameters(if \p addTemplateParameters is true).
62 Error addSignature(UnitEntryPairTy InputUnitEntryPair,
63 bool addTemplateParameters);
64
65 /// Add specified \p FunctionParameters to the built name.
69
70 /// Add specified \p TemplateParameters to the built name.
74
75 /// Analyze \p InputUnitEntryPair's ODR attributes and put names
76 /// of the referenced type dies to the built name.
78 bool AssignNameToTypeDescriptor,
80
81 /// Add names of parent dies to the built name.
82 Error addParentName(UnitEntryPairTy &InputUnitEntryPair);
83
84 /// \returns synthetic name of the specified \p DieEntry.
85 /// The name is constructed from the dwarf::DW_AT_decl_file
86 /// and dwarf::DW_AT_decl_line attributes.
88 bool &HasDeclFileName);
89
90 /// Add type prefix to the built name.
91 void addTypePrefix(CompileUnit &CU, const DWARFDebugInfoEntry *DieEntry);
92
93 /// Add type name to the built name.
94 Error addTypeName(UnitEntryPairTy InputUnitEntryPair, bool AddParentNames);
95
96 /// Analyze \p InputUnitEntryPair for the type name and possibly assign
97 /// built type name to the DIE's type info.
98 /// NOTE: while analyzing types we may create different kind of names
99 /// for the same type depending on whether the type is part of another type.
100 /// f.e. DW_TAG_formal_parameter would receive "{02}01" name when
101 /// examined alone. Or "{0}int" name when it is a part of a function name:
102 /// {a}void foo({0}int). The \p AssignNameToTypeDescriptor tells whether
103 /// the type name is part of another type name and then should not be assigned
104 /// to DIE type descriptor.
105 Error addDIETypeName(UnitEntryPairTy InputUnitEntryPair,
106 std::optional<std::pair<size_t, size_t>> ChildIndex,
107 bool AssignNameToTypeDescriptor);
108
109 /// Add ordered name to the built name.
110 void addOrderedName(std::pair<size_t, size_t> ChildIdx);
111
112 /// Add value name to the built name.
113 void addValueName(UnitEntryPairTy InputUnitEntryPair, dwarf::Attribute Attr);
114
115 /// Buffer keeping bult name.
117
118 /// Recursion counter
119 size_t RecursionDepth = 0;
120
121 /// Type pool
123};
124
125/// This class helps to assign indexes for DIE children.
126/// Indexes are used to create type name for children which
127/// should be presented in the original order(function parameters,
128/// array dimensions, enumeration members, class/structure members).
130public:
132 const DWARFDebugInfoEntry *DieEntry);
133
134 /// Returns index of the specified child and width of hexadecimal
135 /// representation.
136 std::optional<std::pair<size_t, size_t>>
137 getChildIndex(CompileUnit &CU, const DWARFDebugInfoEntry *ChildDieEntry);
138
139protected:
140 using OrderedChildrenIndexesArrayTy = std::array<size_t, 8>;
141
142 std::optional<size_t> tagToArrayIndex(CompileUnit &CU,
143 const DWARFDebugInfoEntry *DieEntry);
144
145 bool NeedCountChildren = false;
148};
149
150} // end of namespace parallel
151} // end of namespace dwarf_linker
152} // end of namespace llvm
153
154#endif // LLVM_LIB_DWARFLINKER_PARALLEL_SYNTHETICTYPENAMEBUILDER_H
This file defines the SmallString class.
This file defines the SmallVector class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
DWARFDebugInfoEntry - A DIE with only the minimum required data.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Stores all information related to a compile unit, be it in its original instance of the object file o...
OrderedChildrenIndexAssigner(CompileUnit &CU, const DWARFDebugInfoEntry *DieEntry)
std::optional< size_t > tagToArrayIndex(CompileUnit &CU, const DWARFDebugInfoEntry *DieEntry)
std::optional< std::pair< size_t, size_t > > getChildIndex(CompileUnit &CU, const DWARFDebugInfoEntry *ChildDieEntry)
Returns index of the specified child and width of hexadecimal representation.
Error addReferencedODRDies(UnitEntryPairTy InputUnitEntryPair, bool AssignNameToTypeDescriptor, ArrayRef< dwarf::Attribute > ODRAttrs)
Analyze InputUnitEntryPair's ODR attributes and put names of the referenced type dies to the built na...
Error addTemplateParamNames(CompileUnit &CU, SmallVector< const DWARFDebugInfoEntry *, 10 > &TemplateParameters)
Add specified TemplateParameters to the built name.
Error addParentName(UnitEntryPairTy &InputUnitEntryPair)
Add names of parent dies to the built name.
Error addSignature(UnitEntryPairTy InputUnitEntryPair, bool addTemplateParameters)
Add signature( entry type plus type of parameters plus type of template parameters(if addTemplatePara...
Error addParamNames(CompileUnit &CU, SmallVector< const DWARFDebugInfoEntry *, 20 > &FunctionParameters)
Add specified FunctionParameters to the built name.
void addDieNameFromDeclFileAndDeclLine(UnitEntryPairTy &InputUnitEntryPair, bool &HasDeclFileName)
SmallString< 1000 > SyntheticName
Buffer keeping bult name.
void addOrderedName(std::pair< size_t, size_t > ChildIdx)
Add ordered name to the built name.
Error assignName(UnitEntryPairTy InputUnitEntryPair, std::optional< std::pair< size_t, size_t > > ChildIndex)
Create synthetic name for the specified DIE InputUnitEntryPair and assign created name to the DIE typ...
Error addDIETypeName(UnitEntryPairTy InputUnitEntryPair, std::optional< std::pair< size_t, size_t > > ChildIndex, bool AssignNameToTypeDescriptor)
Analyze InputUnitEntryPair for the type name and possibly assign built type name to the DIE's type in...
Error addTypeName(UnitEntryPairTy InputUnitEntryPair, bool AddParentNames)
Add type name to the built name.
void addArrayDimension(UnitEntryPairTy InputUnitEntryPair)
Add array type dimension.
void addValueName(UnitEntryPairTy InputUnitEntryPair, dwarf::Attribute Attr)
Add value name to the built name.
void addTypePrefix(CompileUnit &CU, const DWARFDebugInfoEntry *DieEntry)
Add type prefix to the built name.
TypePool keeps type descriptors which contain partially cloned DIE correspinding to each type.
Definition TypePool.h:129
Attribute
Attributes.
Definition Dwarf.h:125
This is an optimization pass for GlobalISel generic memory operations.
This is a helper structure which keeps a debug info entry with it's containing compilation unit.