Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | #ifndef LLVM_DWP_DWP_H |
| 2 | #define LLVM_DWP_DWP_H |
||
| 3 | |||
| 4 | #include "DWPStringPool.h" |
||
| 5 | #include "llvm/ADT/ArrayRef.h" |
||
| 6 | #include "llvm/ADT/MapVector.h" |
||
| 7 | #include "llvm/ADT/StringRef.h" |
||
| 8 | #include "llvm/DebugInfo/DWARF/DWARFContext.h" |
||
| 9 | #include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h" |
||
| 10 | #include "llvm/MC/MCSection.h" |
||
| 11 | #include "llvm/MC/MCStreamer.h" |
||
| 12 | #include "llvm/Object/ObjectFile.h" |
||
| 13 | #include "llvm/Support/Error.h" |
||
| 14 | #include <deque> |
||
| 15 | #include <vector> |
||
| 16 | |||
| 17 | namespace llvm { |
||
| 18 | struct UnitIndexEntry { |
||
| 19 | DWARFUnitIndex::Entry::SectionContribution Contributions[8]; |
||
| 20 | std::string Name; |
||
| 21 | std::string DWOName; |
||
| 22 | StringRef DWPName; |
||
| 23 | }; |
||
| 24 | |||
| 25 | // Holds data for Skeleton, Split Compilation, and Type Unit Headers (only in |
||
| 26 | // v5) as defined in Dwarf 5 specification, 7.5.1.2, 7.5.1.3 and Dwarf 4 |
||
| 27 | // specification 7.5.1.1. |
||
| 28 | struct InfoSectionUnitHeader { |
||
| 29 | // unit_length field. Note that the type is uint64_t even in 32-bit dwarf. |
||
| 30 | uint64_t Length = 0; |
||
| 31 | |||
| 32 | // version field. |
||
| 33 | uint16_t Version = 0; |
||
| 34 | |||
| 35 | // unit_type field. Initialized only if Version >= 5. |
||
| 36 | uint8_t UnitType = 0; |
||
| 37 | |||
| 38 | // address_size field. |
||
| 39 | uint8_t AddrSize = 0; |
||
| 40 | |||
| 41 | // debug_abbrev_offset field. Note that the type is uint64_t even in 32-bit |
||
| 42 | // dwarf. It is assumed to be 0. |
||
| 43 | uint64_t DebugAbbrevOffset = 0; |
||
| 44 | |||
| 45 | // dwo_id field. This resides in the header only if Version >= 5. |
||
| 46 | // In earlier versions, it is read from DW_AT_GNU_dwo_id. |
||
| 47 | std::optional<uint64_t> Signature; |
||
| 48 | |||
| 49 | // Derived from the length of Length field. |
||
| 50 | dwarf::DwarfFormat Format = dwarf::DwarfFormat::DWARF32; |
||
| 51 | |||
| 52 | // The size of the Header in bytes. This is derived while parsing the header, |
||
| 53 | // and is stored as a convenience. |
||
| 54 | uint8_t HeaderSize = 0; |
||
| 55 | }; |
||
| 56 | |||
| 57 | struct CompileUnitIdentifiers { |
||
| 58 | uint64_t Signature = 0; |
||
| 59 | const char *Name = ""; |
||
| 60 | const char *DWOName = ""; |
||
| 61 | }; |
||
| 62 | |||
| 63 | Error write(MCStreamer &Out, ArrayRef<std::string> Inputs); |
||
| 64 | |||
| 65 | unsigned getContributionIndex(DWARFSectionKind Kind, uint32_t IndexVersion); |
||
| 66 | |||
| 67 | Error handleSection( |
||
| 68 | const StringMap<std::pair<MCSection *, DWARFSectionKind>> &KnownSections, |
||
| 69 | const MCSection *StrSection, const MCSection *StrOffsetSection, |
||
| 70 | const MCSection *TypesSection, const MCSection *CUIndexSection, |
||
| 71 | const MCSection *TUIndexSection, const MCSection *InfoSection, |
||
| 72 | const object::SectionRef &Section, MCStreamer &Out, |
||
| 73 | std::deque<SmallString<32>> &UncompressedSections, |
||
| 74 | uint32_t (&ContributionOffsets)[8], UnitIndexEntry &CurEntry, |
||
| 75 | StringRef &CurStrSection, StringRef &CurStrOffsetSection, |
||
| 76 | std::vector<StringRef> &CurTypesSection, |
||
| 77 | std::vector<StringRef> &CurInfoSection, StringRef &AbbrevSection, |
||
| 78 | StringRef &CurCUIndexSection, StringRef &CurTUIndexSection, |
||
| 79 | std::vector<std::pair<DWARFSectionKind, uint32_t>> &SectionLength); |
||
| 80 | |||
| 81 | Expected<InfoSectionUnitHeader> parseInfoSectionUnitHeader(StringRef Info); |
||
| 82 | |||
| 83 | void writeStringsAndOffsets(MCStreamer &Out, DWPStringPool &Strings, |
||
| 84 | MCSection *StrOffsetSection, |
||
| 85 | StringRef CurStrSection, |
||
| 86 | StringRef CurStrOffsetSection, uint16_t Version); |
||
| 87 | |||
| 88 | Error buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE, |
||
| 89 | const CompileUnitIdentifiers &ID, StringRef DWPName); |
||
| 90 | |||
| 91 | void writeIndex(MCStreamer &Out, MCSection *Section, |
||
| 92 | ArrayRef<unsigned> ContributionOffsets, |
||
| 93 | const MapVector<uint64_t, UnitIndexEntry> &IndexEntries, |
||
| 94 | uint32_t IndexVersion); |
||
| 95 | |||
| 96 | } // namespace llvm |
||
| 97 | #endif // LLVM_DWP_DWP_H |