//===- yaml2dwarf - Convert YAML to DWARF binary data ---------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief The DWARF component of yaml2obj. /// //===----------------------------------------------------------------------===// #include "llvm/ObjectYAML/DWARFYAML.h" #include "llvm/Support/Error.h" #include "llvm/Support/LEB128.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; void ZeroFillBytes(raw_ostream &OS, size_t Size) { std::vector FillData; FillData.insert(FillData.begin(), Size, 0); OS.write(reinterpret_cast(FillData.data()), Size); } void yaml2debug_str(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto Str : DI.DebugStrings) { OS.write(Str.data(), Str.size()); OS.write('\0'); } } void yaml2debug_abbrev(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto AbbrevDecl : DI.AbbrevDecls) { encodeULEB128(AbbrevDecl.Code, OS); encodeULEB128(AbbrevDecl.Tag, OS); OS.write(AbbrevDecl.Children); for (auto Attr : AbbrevDecl.Attributes) { encodeULEB128(Attr.Attribute, OS); encodeULEB128(Attr.Form, OS); } encodeULEB128(0, OS); 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(&Range.Length), 4); OS.write(reinterpret_cast(&Range.Version), 2); OS.write(reinterpret_cast(&Range.CuOffset), 4); OS.write(reinterpret_cast(&Range.AddrSize), 1); OS.write(reinterpret_cast(&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(&Descriptor.Address), Range.AddrSize); OS.write(reinterpret_cast(&Descriptor.Length), Range.AddrSize); } ZeroFillBytes(OS, Range.AddrSize * 2); } }