summaryrefslogtreecommitdiffstats
path: root/llvm/tools/yaml2obj/yaml2dwarf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/yaml2obj/yaml2dwarf.cpp')
-rw-r--r--llvm/tools/yaml2obj/yaml2dwarf.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/tools/yaml2obj/yaml2dwarf.cpp b/llvm/tools/yaml2obj/yaml2dwarf.cpp
index deef9a1d98b..fcc58330ee9 100644
--- a/llvm/tools/yaml2obj/yaml2dwarf.cpp
+++ b/llvm/tools/yaml2obj/yaml2dwarf.cpp
@@ -19,6 +19,12 @@
using namespace llvm;
+void ZeroFillBytes(raw_ostream &OS, size_t Size) {
+ std::vector<uint8_t> FillData;
+ FillData.insert(FillData.begin(), Size, 0);
+ OS.write(reinterpret_cast<char *>(FillData.data()), Size);
+}
+
void yaml2debug_str(raw_ostream &OS, const DWARFYAML::Data &DI) {
for (auto Str : DI.DebugStrings) {
OS.write(Str.data(), Str.size());
@@ -39,3 +45,24 @@ void yaml2debug_abbrev(raw_ostream &OS, const DWARFYAML::Data &DI) {
encodeULEB128(0, OS);
}
}
+
+void yaml2debug_aranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
+ for (auto Range : DI.ARanges) {
+ auto HeaderStart = OS.tell();
+ OS.write(reinterpret_cast<char *>(&Range.Length), 4);
+ OS.write(reinterpret_cast<char *>(&Range.Version), 2);
+ OS.write(reinterpret_cast<char *>(&Range.CuOffset), 4);
+ OS.write(reinterpret_cast<char *>(&Range.AddrSize), 1);
+ OS.write(reinterpret_cast<char *>(&Range.SegSize), 1);
+
+ auto HeaderSize = OS.tell() - HeaderStart;
+ auto FirstDescriptor = alignTo(HeaderSize, Range.AddrSize * 2);
+ ZeroFillBytes(OS, FirstDescriptor - HeaderSize);
+
+ for (auto Descriptor : Range.Descriptors) {
+ OS.write(reinterpret_cast<char *>(&Descriptor.Address), Range.AddrSize);
+ OS.write(reinterpret_cast<char *>(&Descriptor.Length), Range.AddrSize);
+ }
+ ZeroFillBytes(OS, Range.AddrSize * 2);
+ }
+}
OpenPOWER on IntegriCloud