1 //===- AcceleratorRecordsSaver.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_ACCELERATORRECORDSSAVER_H
10 #define LLVM_LIB_DWARFLINKER_PARALLEL_ACCELERATORRECORDSSAVER_H
11 
12 #include "DIEAttributeCloner.h"
13 #include "DWARFLinkerCompileUnit.h"
14 #include "DWARFLinkerGlobalData.h"
15 #include "DWARFLinkerTypeUnit.h"
16 
17 namespace llvm {
18 namespace dwarf_linker {
19 namespace parallel {
20 
21 /// This class helps to store information for accelerator entries.
22 /// It prepares accelerator info for the certain DIE and store it inside
23 /// OutUnit.
24 class AcceleratorRecordsSaver {
25 public:
26   AcceleratorRecordsSaver(LinkingGlobalData &GlobalData, CompileUnit &InUnit,
27                           CompileUnit *OutUnit)
28       : AcceleratorRecordsSaver(GlobalData, InUnit,
29                                 CompileUnit::OutputUnitVariantPtr(OutUnit)) {}
30 
31   AcceleratorRecordsSaver(LinkingGlobalData &GlobalData, CompileUnit &InUnit,
32                           TypeUnit *OutUnit)
33       : AcceleratorRecordsSaver(GlobalData, InUnit,
34                                 CompileUnit::OutputUnitVariantPtr(OutUnit)) {}
35 
36   /// Save accelerator info for the specified \p OutDIE inside OutUnit.
37   /// Side effects: set attributes in \p AttrInfo.
38   void save(const DWARFDebugInfoEntry *InputDieEntry, DIE *OutDIE,
39             AttributesInfo &AttrInfo, TypeEntry *TypeEntry);
40 
41 protected:
42   AcceleratorRecordsSaver(LinkingGlobalData &GlobalData, CompileUnit &InUnit,
43                           CompileUnit::OutputUnitVariantPtr OutUnit)
44       : GlobalData(GlobalData), InUnit(InUnit), OutUnit(OutUnit) {}
45 
46   void saveObjC(const DWARFDebugInfoEntry *InputDieEntry, DIE *OutDIE,
47                 AttributesInfo &AttrInfo);
48 
49   void saveNameRecord(StringEntry *Name, DIE *OutDIE, dwarf::Tag Tag,
50                       bool AvoidForPubSections);
51   void saveNamespaceRecord(StringEntry *Name, DIE *OutDIE, dwarf::Tag Tag,
52                            TypeEntry *TypeEntry);
53   void saveObjCNameRecord(StringEntry *Name, DIE *OutDIE, dwarf::Tag Tag);
54   void saveTypeRecord(StringEntry *Name, DIE *OutDIE, dwarf::Tag Tag,
55                       uint32_t QualifiedNameHash, bool ObjcClassImplementation,
56                       TypeEntry *TypeEntry);
57 
58   /// Global linking data.
59   LinkingGlobalData &GlobalData;
60 
61   /// Comiple unit corresponding to input DWARF.
62   CompileUnit &InUnit;
63 
64   /// Compile unit or Artificial type unit corresponding to the output DWARF.
65   CompileUnit::OutputUnitVariantPtr OutUnit;
66 };
67 
68 } // end of namespace parallel
69 } // end of namespace dwarf_linker
70 } // end of namespace llvm
71 
72 #endif // LLVM_LIB_DWARFLINKER_PARALLEL_ACCELERATORRECORDSSAVER_H
73