clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
105 lines
3.5 KiB
C++
105 lines
3.5 KiB
C++
#ifndef LLVM_DWP_DWP_H
|
|
#define LLVM_DWP_DWP_H
|
|
|
|
#include "DWPStringPool.h"
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/MapVector.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
|
|
#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
|
|
#include "llvm/MC/MCSection.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/Object/ObjectFile.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include <deque>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
enum OnCuIndexOverflow {
|
|
HardStop,
|
|
SoftStop,
|
|
Continue,
|
|
};
|
|
|
|
struct UnitIndexEntry {
|
|
DWARFUnitIndex::Entry::SectionContribution Contributions[8];
|
|
std::string Name;
|
|
std::string DWOName;
|
|
StringRef DWPName;
|
|
};
|
|
|
|
// Holds data for Skeleton, Split Compilation, and Type Unit Headers (only in
|
|
// v5) as defined in Dwarf 5 specification, 7.5.1.2, 7.5.1.3 and Dwarf 4
|
|
// specification 7.5.1.1.
|
|
struct InfoSectionUnitHeader {
|
|
// unit_length field. Note that the type is uint64_t even in 32-bit dwarf.
|
|
uint64_t Length = 0;
|
|
|
|
// version field.
|
|
uint16_t Version = 0;
|
|
|
|
// unit_type field. Initialized only if Version >= 5.
|
|
uint8_t UnitType = 0;
|
|
|
|
// address_size field.
|
|
uint8_t AddrSize = 0;
|
|
|
|
// debug_abbrev_offset field. Note that the type is uint64_t even in 32-bit
|
|
// dwarf. It is assumed to be 0.
|
|
uint64_t DebugAbbrevOffset = 0;
|
|
|
|
// dwo_id field. This resides in the header only if Version >= 5.
|
|
// In earlier versions, it is read from DW_AT_GNU_dwo_id.
|
|
std::optional<uint64_t> Signature;
|
|
|
|
// Derived from the length of Length field.
|
|
dwarf::DwarfFormat Format = dwarf::DwarfFormat::DWARF32;
|
|
|
|
// The size of the Header in bytes. This is derived while parsing the header,
|
|
// and is stored as a convenience.
|
|
uint8_t HeaderSize = 0;
|
|
};
|
|
|
|
struct CompileUnitIdentifiers {
|
|
uint64_t Signature = 0;
|
|
const char *Name = "";
|
|
const char *DWOName = "";
|
|
};
|
|
|
|
Error write(MCStreamer &Out, ArrayRef<std::string> Inputs,
|
|
OnCuIndexOverflow OverflowOptValue);
|
|
|
|
unsigned getContributionIndex(DWARFSectionKind Kind, uint32_t IndexVersion);
|
|
|
|
Error handleSection(
|
|
const StringMap<std::pair<MCSection *, DWARFSectionKind>> &KnownSections,
|
|
const MCSection *StrSection, const MCSection *StrOffsetSection,
|
|
const MCSection *TypesSection, const MCSection *CUIndexSection,
|
|
const MCSection *TUIndexSection, const MCSection *InfoSection,
|
|
const object::SectionRef &Section, MCStreamer &Out,
|
|
std::deque<SmallString<32>> &UncompressedSections,
|
|
uint32_t (&ContributionOffsets)[8], UnitIndexEntry &CurEntry,
|
|
StringRef &CurStrSection, StringRef &CurStrOffsetSection,
|
|
std::vector<StringRef> &CurTypesSection,
|
|
std::vector<StringRef> &CurInfoSection, StringRef &AbbrevSection,
|
|
StringRef &CurCUIndexSection, StringRef &CurTUIndexSection,
|
|
std::vector<std::pair<DWARFSectionKind, uint32_t>> &SectionLength);
|
|
|
|
Expected<InfoSectionUnitHeader> parseInfoSectionUnitHeader(StringRef Info);
|
|
|
|
void writeStringsAndOffsets(MCStreamer &Out, DWPStringPool &Strings,
|
|
MCSection *StrOffsetSection,
|
|
StringRef CurStrSection,
|
|
StringRef CurStrOffsetSection, uint16_t Version);
|
|
|
|
Error buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
|
|
const CompileUnitIdentifiers &ID, StringRef DWPName);
|
|
|
|
void writeIndex(MCStreamer &Out, MCSection *Section,
|
|
ArrayRef<unsigned> ContributionOffsets,
|
|
const MapVector<uint64_t, UnitIndexEntry> &IndexEntries,
|
|
uint32_t IndexVersion);
|
|
|
|
} // namespace llvm
|
|
#endif // LLVM_DWP_DWP_H
|