diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/ObjectYAML/DWARFEmitter.h | 5 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/DWARFEmitter.cpp | 50 | ||||
| -rw-r--r-- | llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp | 4 |
3 files changed, 51 insertions, 8 deletions
diff --git a/llvm/include/llvm/ObjectYAML/DWARFEmitter.h b/llvm/include/llvm/ObjectYAML/DWARFEmitter.h index 0d7d8b4efbd..6a761c95d68 100644 --- a/llvm/include/llvm/ObjectYAML/DWARFEmitter.h +++ b/llvm/include/llvm/ObjectYAML/DWARFEmitter.h @@ -39,11 +39,12 @@ void EmitDebugInfo(raw_ostream &OS, const Data &DI); void EmitDebugLine(raw_ostream &OS, const Data &DI); Expected<StringMap<std::unique_ptr<MemoryBuffer>>> -EmitDebugSections(StringRef YAMLString, +EmitDebugSections(StringRef YAMLString, bool ApplyFixups = false, bool IsLittleEndian = sys::IsLittleEndianHost); +StringMap<std::unique_ptr<MemoryBuffer>> +EmitDebugSections(llvm::DWARFYAML::Data &DI, bool ApplyFixups); } // end namespace DWARFYAML - } // end namespace llvm #endif // LLVM_OBJECTYAML_DWARFEMITTER_H diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp index c49c2249cdf..1135127eddc 100644 --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -149,7 +149,6 @@ protected: writeInteger((uint32_t)CU.AbbrOffset, OS, DebugInfo.IsLittleEndian); writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian); } - } void onStartDIE(const DWARFYAML::Unit &CU, @@ -308,11 +307,48 @@ EmitDebugSectionImpl(const DWARFYAML::Data &DI, EmitFuncType EmitFunc, OutputBuffers[Sec] = MemoryBuffer::getMemBufferCopy(Data); } +class DIEFixupVisitor : public DWARFYAML::Visitor { + uint64_t Length; + +public: + DIEFixupVisitor(DWARFYAML::Data &DI) : DWARFYAML::Visitor(DI){}; + +private: + virtual void onStartCompileUnit(DWARFYAML::Unit &CU) { Length = 7; } + + virtual void onEndCompileUnit(DWARFYAML::Unit &CU) { + CU.Length.setLength(Length); + } + + virtual void onStartDIE(DWARFYAML::Unit &CU, DWARFYAML::Entry &DIE) { + Length += getULEB128Size(DIE.AbbrCode); + } + + virtual void onValue(const uint8_t U) { Length += 1; } + virtual void onValue(const uint16_t U) { Length += 2; } + virtual void onValue(const uint32_t U) { Length += 4; } + virtual void onValue(const uint64_t U, const bool LEB = false) { + if (LEB) + Length += getULEB128Size(U); + else + Length += 8; + } + virtual void onValue(const int64_t S, const bool LEB = false) { + if (LEB) + Length += getSLEB128Size(S); + else + Length += 8; + } + virtual void onValue(const StringRef String) { Length += String.size() + 1; } + + virtual void onValue(const MemoryBufferRef MBR) { + Length += MBR.getBufferSize(); + } +}; + Expected<StringMap<std::unique_ptr<MemoryBuffer>>> -DWARFYAML::EmitDebugSections(StringRef YAMLString, +DWARFYAML::EmitDebugSections(StringRef YAMLString, bool ApplyFixups, bool IsLittleEndian) { - StringMap<std::unique_ptr<MemoryBuffer>> DebugSections; - yaml::Input YIn(YAMLString); DWARFYAML::Data DI; @@ -321,6 +357,12 @@ DWARFYAML::EmitDebugSections(StringRef YAMLString, if (YIn.error()) return errorCodeToError(YIn.error()); + if (ApplyFixups) { + DIEFixupVisitor DIFixer(DI); + DIFixer.traverseDebugInfo(); + } + + StringMap<std::unique_ptr<MemoryBuffer>> DebugSections; EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugInfo, "debug_info", DebugSections); EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line", diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index a61ab7d3aff..27c361f7644 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -1166,7 +1166,7 @@ TEST(DWARFDebugInfo, TestEmptyChildren) { " Attributes:\n" "debug_info:\n" " - Length:\n" - " TotalLength: 9\n" + " TotalLength: 0\n" " Version: 4\n" " AbbrOffset: 0\n" " AddrSize: 8\n" @@ -1176,7 +1176,7 @@ TEST(DWARFDebugInfo, TestEmptyChildren) { " - AbbrCode: 0x00000000\n" " Values:\n"; - auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata)); + auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata), true); ASSERT_TRUE((bool)ErrOrSections); std::unique_ptr<DWARFContext> DwarfContext = DWARFContext::create(*ErrOrSections, 8); |

