1616#include " llvm/ADT/ArrayRef.h"
1717#include " llvm/ADT/MapVector.h"
1818#include " llvm/ADT/STLFunctionalExtras.h"
19- #include " llvm/ADT/StringMap.h"
2019#include " llvm/ADT/StringRef.h"
2120#include " llvm/BinaryFormat/Dwarf.h"
2221#include " llvm/CodeGen/DIE.h"
104103namespace llvm {
105104
106105class AsmPrinter ;
107- class DwarfCompileUnit ;
106+ class DwarfUnit ;
108107class DwarfDebug ;
108+ class DwarfTypeUnit ;
109109class MCSymbol ;
110110class raw_ostream ;
111111
@@ -197,6 +197,9 @@ template <typename DataT> class AccelTable : public AccelTableBase {
197197
198198 template <typename ... Types>
199199 void addName (DwarfStringPoolEntryRef Name, Types &&... Args);
200+ void clear () { Entries.clear (); }
201+ void addEntries (AccelTable<DataT> &Table);
202+ const StringEntries getEntries () const { return Entries; }
200203};
201204
202205template <typename AccelTableDataT>
@@ -250,11 +253,18 @@ class AppleAccelTableData : public AccelTableData {
250253// / emitDWARF5AccelTable function.
251254class DWARF5AccelTableData : public AccelTableData {
252255public:
256+ struct AttributeEncoding {
257+ dwarf::Index Index;
258+ dwarf::Form Form;
259+ };
260+
253261 static uint32_t hash (StringRef Name) { return caseFoldingDjbHash (Name); }
254262
255- DWARF5AccelTableData (const DIE &Die, const DwarfCompileUnit &CU);
256- DWARF5AccelTableData (uint64_t DieOffset, unsigned DieTag, unsigned CUIndex)
257- : OffsetVal(DieOffset), DieTag(DieTag), UnitID(CUIndex) {}
263+ DWARF5AccelTableData (const DIE &Die, const uint32_t UnitID,
264+ const bool IsTU = false );
265+ DWARF5AccelTableData (const uint64_t DieOffset, const unsigned DieTag,
266+ const unsigned UnitID, const bool IsTU = false )
267+ : OffsetVal(DieOffset), DieTag(DieTag), UnitID(UnitID), IsTU(IsTU) {}
258268
259269#ifndef NDEBUG
260270 void print (raw_ostream &OS) const override ;
@@ -267,28 +277,66 @@ class DWARF5AccelTableData : public AccelTableData {
267277 }
268278 unsigned getDieTag () const { return DieTag; }
269279 unsigned getUnitID () const { return UnitID; }
280+ bool isTU () const { return IsTU; }
270281 void normalizeDIEToOffset () {
271282 assert (std::holds_alternative<const DIE *>(OffsetVal) &&
272283 " Accessing offset after normalizing." );
273284 OffsetVal = std::get<const DIE *>(OffsetVal)->getOffset ();
274285 }
286+ bool isNormalized () const {
287+ return std::holds_alternative<uint64_t >(OffsetVal);
288+ }
275289
276290protected:
277291 std::variant<const DIE *, uint64_t > OffsetVal;
278- unsigned DieTag;
279- unsigned UnitID;
292+ uint32_t DieTag : 16 ;
293+ uint32_t UnitID : 15 ;
294+ uint32_t IsTU : 1 ;
280295
281296 uint64_t order () const override { return getDieOffset (); }
282297};
283298
299+ struct TypeUnitMetaInfo {
300+ // Symbol for start of the TU section.
301+ MCSymbol *Label;
302+ // Unique ID of Type Unit.
303+ unsigned UniqueID;
304+ };
305+ using TUVectorTy = SmallVector<TypeUnitMetaInfo, 1 >;
284306class DWARF5AccelTable : public AccelTable <DWARF5AccelTableData> {
307+ // Symbols to start of all the TU sections that were generated.
308+ TUVectorTy TUSymbols;
309+
285310public:
311+ struct UnitIndexAndEncoding {
312+ unsigned Index;
313+ DWARF5AccelTableData::AttributeEncoding Endoding;
314+ };
315+ // / Returns type units that were constructed.
316+ const TUVectorTy &getTypeUnitsSymbols () { return TUSymbols; }
317+ // / Add a type unit start symbol.
318+ void addTypeUnitSymbol (DwarfTypeUnit &U);
286319 // / Convert DIE entries to explicit offset.
287320 // / Needs to be called after DIE offsets are computed.
288321 void convertDieToOffset () {
289322 for (auto &Entry : Entries) {
290323 for (AccelTableData *Value : Entry.second .Values ) {
291- static_cast <DWARF5AccelTableData *>(Value)->normalizeDIEToOffset ();
324+ DWARF5AccelTableData *Data = static_cast <DWARF5AccelTableData *>(Value);
325+ // For TU we normalize as each Unit is emitted.
326+ // So when this is invoked after CU construction we will be in mixed
327+ // state.
328+ if (!Data->isNormalized ())
329+ Data->normalizeDIEToOffset ();
330+ }
331+ }
332+ }
333+
334+ void addTypeEntries (DWARF5AccelTable &Table) {
335+ for (auto &Entry : Table.getEntries ()) {
336+ for (AccelTableData *Value : Entry.second .Values ) {
337+ DWARF5AccelTableData *Data = static_cast <DWARF5AccelTableData *>(Value);
338+ addName (Entry.second .Name , Data->getDieOffset (), Data->getDieTag (),
339+ Data->getUnitID (), true );
292340 }
293341 }
294342 }
@@ -319,8 +367,9 @@ void emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents,
319367void emitDWARF5AccelTable (
320368 AsmPrinter *Asm, DWARF5AccelTable &Contents,
321369 ArrayRef<std::variant<MCSymbol *, uint64_t >> CUs,
322- llvm::function_ref<unsigned (const DWARF5AccelTableData &)>
323- getCUIndexForEntry);
370+ llvm::function_ref<std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(
371+ const DWARF5AccelTableData &)>
372+ getIndexForEntry);
324373
325374// / Accelerator table data implementation for simple Apple accelerator tables
326375// / with just a DIE reference.
0 commit comments