summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/ObjectYAML/DWARFEmitter.h5
-rw-r--r--llvm/lib/ObjectYAML/DWARFEmitter.cpp50
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp4
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);
OpenPOWER on IntegriCloud