mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[ObjectYAML] Add ability for DWARFYAML to calculate DIE lengths
This patch adds the ability for the ObjectYAML DWARFEmitter to calculate the lengths of DIEs. This is accomplished by creating a DIEFixupVisitor class which traverses the DWARF DIEs to calculate and fix up the lengths in the Compile Unit header. The DIEFixupVisitor can be extended in the future to enable more complex fix ups which will enable simplified YAML string representations. This is also very useful when using the YAML format in unit tests because you no longer need to know the length of the compile unit when writing the YAML string. Differential commandeered from Chris Bieneman (beanz) Differential revision: https://reviews.llvm.org/D30666 llvm-svn: 330421
This commit is contained in:
parent
312638e5f5
commit
c0a6317d37
@ -39,11 +39,12 @@ void EmitDebugInfo(raw_ostream &OS, const Data &DI);
|
|||||||
void EmitDebugLine(raw_ostream &OS, const Data &DI);
|
void EmitDebugLine(raw_ostream &OS, const Data &DI);
|
||||||
|
|
||||||
Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
|
Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
|
||||||
EmitDebugSections(StringRef YAMLString,
|
EmitDebugSections(StringRef YAMLString, bool ApplyFixups = false,
|
||||||
bool IsLittleEndian = sys::IsLittleEndianHost);
|
bool IsLittleEndian = sys::IsLittleEndianHost);
|
||||||
|
StringMap<std::unique_ptr<MemoryBuffer>>
|
||||||
|
EmitDebugSections(llvm::DWARFYAML::Data &DI, bool ApplyFixups);
|
||||||
|
|
||||||
} // end namespace DWARFYAML
|
} // end namespace DWARFYAML
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
#endif // LLVM_OBJECTYAML_DWARFEMITTER_H
|
#endif // LLVM_OBJECTYAML_DWARFEMITTER_H
|
||||||
|
@ -149,7 +149,6 @@ protected:
|
|||||||
writeInteger((uint32_t)CU.AbbrOffset, OS, DebugInfo.IsLittleEndian);
|
writeInteger((uint32_t)CU.AbbrOffset, OS, DebugInfo.IsLittleEndian);
|
||||||
writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian);
|
writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onStartDIE(const DWARFYAML::Unit &CU,
|
void onStartDIE(const DWARFYAML::Unit &CU,
|
||||||
@ -308,11 +307,48 @@ EmitDebugSectionImpl(const DWARFYAML::Data &DI, EmitFuncType EmitFunc,
|
|||||||
OutputBuffers[Sec] = MemoryBuffer::getMemBufferCopy(Data);
|
OutputBuffers[Sec] = MemoryBuffer::getMemBufferCopy(Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
|
class DIEFixupVisitor : public DWARFYAML::Visitor {
|
||||||
DWARFYAML::EmitDebugSections(StringRef YAMLString,
|
uint64_t Length;
|
||||||
bool IsLittleEndian) {
|
|
||||||
StringMap<std::unique_ptr<MemoryBuffer>> DebugSections;
|
|
||||||
|
|
||||||
|
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, bool ApplyFixups,
|
||||||
|
bool IsLittleEndian) {
|
||||||
yaml::Input YIn(YAMLString);
|
yaml::Input YIn(YAMLString);
|
||||||
|
|
||||||
DWARFYAML::Data DI;
|
DWARFYAML::Data DI;
|
||||||
@ -321,6 +357,12 @@ DWARFYAML::EmitDebugSections(StringRef YAMLString,
|
|||||||
if (YIn.error())
|
if (YIn.error())
|
||||||
return errorCodeToError(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",
|
EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugInfo, "debug_info",
|
||||||
DebugSections);
|
DebugSections);
|
||||||
EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line",
|
EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line",
|
||||||
|
@ -1166,7 +1166,7 @@ TEST(DWARFDebugInfo, TestEmptyChildren) {
|
|||||||
" Attributes:\n"
|
" Attributes:\n"
|
||||||
"debug_info:\n"
|
"debug_info:\n"
|
||||||
" - Length:\n"
|
" - Length:\n"
|
||||||
" TotalLength: 9\n"
|
" TotalLength: 0\n"
|
||||||
" Version: 4\n"
|
" Version: 4\n"
|
||||||
" AbbrOffset: 0\n"
|
" AbbrOffset: 0\n"
|
||||||
" AddrSize: 8\n"
|
" AddrSize: 8\n"
|
||||||
@ -1176,7 +1176,7 @@ TEST(DWARFDebugInfo, TestEmptyChildren) {
|
|||||||
" - AbbrCode: 0x00000000\n"
|
" - AbbrCode: 0x00000000\n"
|
||||||
" Values:\n";
|
" Values:\n";
|
||||||
|
|
||||||
auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
|
auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata), true);
|
||||||
ASSERT_TRUE((bool)ErrOrSections);
|
ASSERT_TRUE((bool)ErrOrSections);
|
||||||
std::unique_ptr<DWARFContext> DwarfContext =
|
std::unique_ptr<DWARFContext> DwarfContext =
|
||||||
DWARFContext::create(*ErrOrSections, 8);
|
DWARFContext::create(*ErrOrSections, 8);
|
||||||
|
Loading…
Reference in New Issue
Block a user