diff options
author | Chris Bieneman <beanz@apple.com> | 2017-03-03 21:11:55 +0000 |
---|---|---|
committer | Chris Bieneman <beanz@apple.com> | 2017-03-03 21:11:55 +0000 |
commit | faf1feb57dfad798b29241a8f0714014beed733a (patch) | |
tree | e293bd463503979a41f6fd948ab3de830e6256cd /llvm/lib/ObjectYAML/DWARFEmitter.cpp | |
parent | 29cb868aa4d0279449b56288fde0358adade1a68 (diff) | |
download | bcm5719-llvm-faf1feb57dfad798b29241a8f0714014beed733a.tar.gz bcm5719-llvm-faf1feb57dfad798b29241a8f0714014beed733a.zip |
[ObjectYAML] [DWARF] Abstract DWARF Initial Length values
In the DWARF 4 Spec section 7.2.2, data in many DWARF sections, and some DWARF structures start with "Initial Length Values", which are a 32-bit length, and an optional 64-bit length if the 32 bit value == UINT32_MAX.
This patch abstracts the Initial Length type in YAML, and extends its use to all the DWARF structures that are supported in the DWARFYAML code that have Initial Length values.
llvm-svn: 296911
Diffstat (limited to 'llvm/lib/ObjectYAML/DWARFEmitter.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/DWARFEmitter.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp index 2c2d8958e53..69f7d368ddc 100644 --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -50,6 +50,13 @@ static void ZeroFillBytes(raw_ostream &OS, size_t Size) { OS.write(reinterpret_cast<char *>(FillData.data()), Size); } +void writeInitialLength(const DWARFYAML::InitialLength &Length, raw_ostream &OS, + bool IsLittleEndian) { + writeInteger((uint32_t)Length.TotalLength, OS, IsLittleEndian); + if (Length.isDWARF64()) + writeInteger((uint64_t)Length.TotalLength64, OS, IsLittleEndian); +} + void DWARFYAML::EmitDebugStr(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto Str : DI.DebugStrings) { OS.write(Str.data(), Str.size()); @@ -74,7 +81,7 @@ void DWARFYAML::EmitDebugAbbrev(raw_ostream &OS, const DWARFYAML::Data &DI) { void DWARFYAML::EmitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto Range : DI.ARanges) { auto HeaderStart = OS.tell(); - writeInteger((uint32_t)Range.Length, OS, DI.IsLittleEndian); + writeInitialLength(Range.Length, OS, DI.IsLittleEndian); writeInteger((uint16_t)Range.Version, OS, DI.IsLittleEndian); writeInteger((uint32_t)Range.CuOffset, OS, DI.IsLittleEndian); writeInteger((uint8_t)Range.AddrSize, OS, DI.IsLittleEndian); @@ -97,7 +104,7 @@ void DWARFYAML::EmitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) { void DWARFYAML::EmitPubSection(raw_ostream &OS, const DWARFYAML::PubSection &Sect, bool IsLittleEndian) { - writeInteger((uint32_t)Sect.Length, OS, IsLittleEndian); + writeInitialLength(Sect.Length, OS, IsLittleEndian); writeInteger((uint16_t)Sect.Version, OS, IsLittleEndian); writeInteger((uint32_t)Sect.UnitOffset, OS, IsLittleEndian); writeInteger((uint32_t)Sect.UnitSize, OS, IsLittleEndian); @@ -113,7 +120,7 @@ void DWARFYAML::EmitPubSection(raw_ostream &OS, void DWARFYAML::EmitDebugInfo(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto CU : DI.CompileUnits) { - writeInteger((uint32_t)CU.Length, OS, DI.IsLittleEndian); + writeInitialLength(CU.Length, OS, DI.IsLittleEndian); writeInteger((uint16_t)CU.Version, OS, DI.IsLittleEndian); writeInteger((uint32_t)CU.AbbrOffset, OS, DI.IsLittleEndian); writeInteger((uint8_t)CU.AddrSize, OS, DI.IsLittleEndian); @@ -246,12 +253,8 @@ static void EmitFileEntry(raw_ostream &OS, const DWARFYAML::File &File) { void DWARFYAML::EmitDebugLine(raw_ostream &OS, const DWARFYAML::Data &DI) { for (const auto &LineTable : DI.DebugLines) { - writeInteger((uint32_t)LineTable.TotalLength, OS, DI.IsLittleEndian); - uint64_t SizeOfPrologueLength = 4; - if (LineTable.TotalLength == UINT32_MAX) { - writeInteger((uint64_t)LineTable.TotalLength64, OS, DI.IsLittleEndian); - SizeOfPrologueLength = 8; - } + writeInitialLength(LineTable.Length, OS, DI.IsLittleEndian); + uint64_t SizeOfPrologueLength = LineTable.Length.isDWARF64() ? 8 : 4; writeInteger((uint16_t)LineTable.Version, OS, DI.IsLittleEndian); writeVariableSizedInteger(LineTable.PrologueLength, SizeOfPrologueLength, OS, DI.IsLittleEndian); |