Index: llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h =================================================================== --- llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h +++ llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h @@ -39,11 +39,12 @@ void EmitDebugLine(raw_ostream &OS, const Data &DI); Expected>> -EmitDebugSections(StringRef YAMLString, +EmitDebugSections(StringRef YAMLString, bool ApplyFixups = false, bool IsLittleEndian = sys::IsLittleEndianHost); +StringMap> +EmitDebugSections(llvm::DWARFYAML::Data &DI, bool ApplyFixups); } // end namespace DWARFYAML - } // end namespace llvm #endif // LLVM_OBJECTYAML_DWARFEMITTER_H Index: llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp +++ llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp @@ -149,7 +149,6 @@ 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 @@ 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>> -DWARFYAML::EmitDebugSections(StringRef YAMLString, +DWARFYAML::EmitDebugSections(StringRef YAMLString, bool ApplyFixups, bool IsLittleEndian) { - StringMap> DebugSections; - yaml::Input YIn(YAMLString); DWARFYAML::Data DI; @@ -321,6 +357,12 @@ if (YIn.error()) return errorCodeToError(YIn.error()); + if (ApplyFixups) { + DIEFixupVisitor DIFixer(DI); + DIFixer.traverseDebugInfo(); + } + + StringMap> DebugSections; EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugInfo, "debug_info", DebugSections); EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line", Index: llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp =================================================================== --- llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -1166,7 +1166,7 @@ " 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 @@ " - 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::create(*ErrOrSections, 8);