diff options
Diffstat (limited to 'llvm/tools/yaml2obj')
-rw-r--r-- | llvm/tools/yaml2obj/yaml2dwarf.cpp | 27 | ||||
-rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 3 | ||||
-rw-r--r-- | llvm/tools/yaml2obj/yaml2obj.h | 2 |
3 files changed, 32 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); + } +} diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index a6d56ef8501..76dec4bb389 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/tools/yaml2obj/yaml2macho.cpp @@ -393,6 +393,9 @@ Error MachOWriter::writeDWARFData(raw_ostream &OS, } else if (0 == strncmp(&Section.sectname[0], "__debug_abbrev", 16)) { yaml2debug_abbrev(OS, Obj.DWARF); } + else if (0 == strncmp(&Section.sectname[0], "__debug_aranges", 16)) { + yaml2debug_aranges(OS, Obj.DWARF); + } } return Error::success(); } diff --git a/llvm/tools/yaml2obj/yaml2obj.h b/llvm/tools/yaml2obj/yaml2obj.h index f54ffe57c0b..cd481c0fd4e 100644 --- a/llvm/tools/yaml2obj/yaml2obj.h +++ b/llvm/tools/yaml2obj/yaml2obj.h @@ -42,4 +42,6 @@ void yaml2debug_abbrev(llvm::raw_ostream &OS, void yaml2debug_str(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI); +void yaml2debug_aranges(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI); + #endif |