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.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/llvm/tools/yaml2obj/yaml2dwarf.cpp b/llvm/tools/yaml2obj/yaml2dwarf.cpp
index 6096f4c5f19..7a17717c758 100644
--- a/llvm/tools/yaml2obj/yaml2dwarf.cpp
+++ b/llvm/tools/yaml2obj/yaml2dwarf.cpp
@@ -17,6 +17,8 @@
#include "llvm/Support/LEB128.h"
#include "llvm/Support/raw_ostream.h"
+#include <algorithm>
+
using namespace llvm;
void ZeroFillBytes(raw_ostream &OS, size_t Size) {
@@ -80,3 +82,121 @@ void yaml2pubsection(raw_ostream &OS, const DWARFYAML::PubSection &Sect) {
OS.write('\0');
}
}
+
+void yaml2debug_info(raw_ostream &OS, const DWARFYAML::Data &DI) {
+
+ for (auto CU : DI.CompileUnits) {
+ OS.write(reinterpret_cast<char *>(&CU.Length), 4);
+ OS.write(reinterpret_cast<char *>(&CU.Version), 2);
+ OS.write(reinterpret_cast<char *>(&CU.AbbrOffset), 4);
+ OS.write(reinterpret_cast<char *>(&CU.AddrSize), 1);
+
+ for (auto Entry : CU.Entries) {
+ encodeULEB128(Entry.AbbrCode, OS);
+ bool Indirect = false;
+ auto &Abbrev = DI.AbbrevDecls[Entry.AbbrCode-1];
+
+ auto FormVal = Entry.Values.begin();
+ auto AbbrForm = Abbrev.Attributes.begin();
+ for (;
+ FormVal != Entry.Values.end() && AbbrForm != Abbrev.Attributes.end();
+ ++FormVal, ++AbbrForm) {
+ dwarf::Form Form = AbbrForm->Form;
+ do {
+ bool Indirect = false;
+ switch (Form) {
+ case dwarf::DW_FORM_addr:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), CU.AddrSize);
+ break;
+ case dwarf::DW_FORM_ref_addr: {
+ // TODO: Handle DWARF32/DWARF64 after Line Table data is done
+ auto writeSize = CU.Version == 2 ? CU.AddrSize : 4;
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), writeSize);
+ break;
+ }
+ case dwarf::DW_FORM_exprloc:
+ case dwarf::DW_FORM_block:
+ encodeULEB128(FormVal->BlockData.size(), OS);
+ OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
+ FormVal->BlockData.size());
+ break;
+ case dwarf::DW_FORM_block1: {
+ auto writeSize = FormVal->BlockData.size();
+ OS.write(reinterpret_cast<char *>(&writeSize), 1);
+ OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
+ FormVal->BlockData.size());
+ break;
+ }
+ case dwarf::DW_FORM_block2: {
+ auto writeSize = FormVal->BlockData.size();
+ OS.write(reinterpret_cast<char *>(&writeSize), 2);
+ OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
+ FormVal->BlockData.size());
+ break;
+ }
+ case dwarf::DW_FORM_block4: {
+ auto writeSize = FormVal->BlockData.size();
+ OS.write(reinterpret_cast<char *>(&writeSize), 4);
+ OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
+ FormVal->BlockData.size());
+ break;
+ }
+ case dwarf::DW_FORM_data1:
+ case dwarf::DW_FORM_ref1:
+ case dwarf::DW_FORM_flag:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 1);
+ break;
+ case dwarf::DW_FORM_data2:
+ case dwarf::DW_FORM_ref2:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 2);
+ break;
+ case dwarf::DW_FORM_data4:
+ case dwarf::DW_FORM_ref4:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 4);
+ break;
+ case dwarf::DW_FORM_data8:
+ case dwarf::DW_FORM_ref8:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 8);
+ break;
+ case dwarf::DW_FORM_sdata:
+ encodeSLEB128(FormVal->Value, OS);
+ break;
+ case dwarf::DW_FORM_udata:
+ case dwarf::DW_FORM_ref_udata:
+ encodeULEB128(FormVal->Value, OS);
+ break;
+ case dwarf::DW_FORM_string:
+ OS.write(FormVal->CStr.data(), FormVal->CStr.size());
+ OS.write('\0');
+ break;
+ case dwarf::DW_FORM_indirect:
+ encodeULEB128(FormVal->Value, OS);
+ Indirect = true;
+ Form = static_cast<dwarf::Form>((uint64_t)FormVal->Value);
+ ++FormVal;
+ break;
+ case dwarf::DW_FORM_strp:
+ case dwarf::DW_FORM_sec_offset:
+ case dwarf::DW_FORM_GNU_ref_alt:
+ case dwarf::DW_FORM_GNU_strp_alt:
+ case dwarf::DW_FORM_line_strp:
+ case dwarf::DW_FORM_strp_sup:
+ case dwarf::DW_FORM_ref_sup:
+ // TODO: Handle DWARF32/64
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 4);
+ break;
+ case dwarf::DW_FORM_ref_sig8:
+ OS.write(reinterpret_cast<char *>(&FormVal->Value), 8);
+ break;
+ case dwarf::DW_FORM_GNU_addr_index:
+ case dwarf::DW_FORM_GNU_str_index:
+ encodeULEB128(FormVal->Value, OS);
+ break;
+ default:
+ break;
+ }
+ } while (Indirect);
+ }
+ }
+ }
+}
OpenPOWER on IntegriCloud