1*07088c10SChris Bieneman //===- DWARFEmitter - Convert YAML to DWARF binary data -------------------===//
2*07088c10SChris Bieneman //
3*07088c10SChris Bieneman //                     The LLVM Compiler Infrastructure
4*07088c10SChris Bieneman //
5*07088c10SChris Bieneman // This file is distributed under the University of Illinois Open Source
6*07088c10SChris Bieneman // License. See LICENSE.TXT for details.
7*07088c10SChris Bieneman //
8*07088c10SChris Bieneman //===----------------------------------------------------------------------===//
9*07088c10SChris Bieneman ///
10*07088c10SChris Bieneman /// \file
11*07088c10SChris Bieneman /// \brief The DWARF component of yaml2obj. Provided as library code for tests.
12*07088c10SChris Bieneman ///
13*07088c10SChris Bieneman //===----------------------------------------------------------------------===//
14*07088c10SChris Bieneman 
15*07088c10SChris Bieneman #include "llvm/ObjectYAML/DWARFEmitter.h"
16*07088c10SChris Bieneman #include "llvm/ObjectYAML/DWARFYAML.h"
17*07088c10SChris Bieneman #include "llvm/Support/Error.h"
18*07088c10SChris Bieneman #include "llvm/Support/LEB128.h"
19*07088c10SChris Bieneman #include "llvm/Support/raw_ostream.h"
20*07088c10SChris Bieneman #include "llvm/Support/SwapByteOrder.h"
21*07088c10SChris Bieneman 
22*07088c10SChris Bieneman #include <algorithm>
23*07088c10SChris Bieneman 
24*07088c10SChris Bieneman using namespace llvm;
25*07088c10SChris Bieneman 
26*07088c10SChris Bieneman template <typename T>
27*07088c10SChris Bieneman void writeInteger(T Integer, raw_ostream &OS, bool IsLittleEndian) {
28*07088c10SChris Bieneman   if (IsLittleEndian != sys::IsLittleEndianHost)
29*07088c10SChris Bieneman     sys::swapByteOrder(Integer);
30*07088c10SChris Bieneman   OS.write(reinterpret_cast<char *>(&Integer), sizeof(T));
31*07088c10SChris Bieneman }
32*07088c10SChris Bieneman 
33*07088c10SChris Bieneman void writeVariableSizedInteger(uint64_t Integer, size_t Size, raw_ostream &OS,
34*07088c10SChris Bieneman                                bool IsLittleEndian) {
35*07088c10SChris Bieneman   if (8 == Size)
36*07088c10SChris Bieneman     writeInteger((uint64_t)Integer, OS, IsLittleEndian);
37*07088c10SChris Bieneman   else if (4 == Size)
38*07088c10SChris Bieneman     writeInteger((uint32_t)Integer, OS, IsLittleEndian);
39*07088c10SChris Bieneman   else if (2 == Size)
40*07088c10SChris Bieneman     writeInteger((uint16_t)Integer, OS, IsLittleEndian);
41*07088c10SChris Bieneman   else if (1 == Size)
42*07088c10SChris Bieneman     writeInteger((uint8_t)Integer, OS, IsLittleEndian);
43*07088c10SChris Bieneman   else
44*07088c10SChris Bieneman     assert(false && "Invalid integer write size.");
45*07088c10SChris Bieneman }
46*07088c10SChris Bieneman 
47*07088c10SChris Bieneman void ZeroFillBytes(raw_ostream &OS, size_t Size) {
48*07088c10SChris Bieneman   std::vector<uint8_t> FillData;
49*07088c10SChris Bieneman   FillData.insert(FillData.begin(), Size, 0);
50*07088c10SChris Bieneman   OS.write(reinterpret_cast<char *>(FillData.data()), Size);
51*07088c10SChris Bieneman }
52*07088c10SChris Bieneman 
53*07088c10SChris Bieneman void DWARFYAML::EmitDebugStr(raw_ostream &OS, const DWARFYAML::Data &DI) {
54*07088c10SChris Bieneman   for (auto Str : DI.DebugStrings) {
55*07088c10SChris Bieneman     OS.write(Str.data(), Str.size());
56*07088c10SChris Bieneman     OS.write('\0');
57*07088c10SChris Bieneman   }
58*07088c10SChris Bieneman }
59*07088c10SChris Bieneman 
60*07088c10SChris Bieneman void DWARFYAML::EmitDebugAbbrev(raw_ostream &OS, const DWARFYAML::Data &DI) {
61*07088c10SChris Bieneman   for (auto AbbrevDecl : DI.AbbrevDecls) {
62*07088c10SChris Bieneman     encodeULEB128(AbbrevDecl.Code, OS);
63*07088c10SChris Bieneman     encodeULEB128(AbbrevDecl.Tag, OS);
64*07088c10SChris Bieneman     OS.write(AbbrevDecl.Children);
65*07088c10SChris Bieneman     for (auto Attr : AbbrevDecl.Attributes) {
66*07088c10SChris Bieneman       encodeULEB128(Attr.Attribute, OS);
67*07088c10SChris Bieneman       encodeULEB128(Attr.Form, OS);
68*07088c10SChris Bieneman     }
69*07088c10SChris Bieneman     encodeULEB128(0, OS);
70*07088c10SChris Bieneman     encodeULEB128(0, OS);
71*07088c10SChris Bieneman   }
72*07088c10SChris Bieneman }
73*07088c10SChris Bieneman 
74*07088c10SChris Bieneman void DWARFYAML::EmitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
75*07088c10SChris Bieneman   for (auto Range : DI.ARanges) {
76*07088c10SChris Bieneman     auto HeaderStart = OS.tell();
77*07088c10SChris Bieneman     writeInteger((uint32_t)Range.Length, OS, DI.IsLittleEndian);
78*07088c10SChris Bieneman     writeInteger((uint16_t)Range.Version, OS, DI.IsLittleEndian);
79*07088c10SChris Bieneman     writeInteger((uint32_t)Range.CuOffset, OS, DI.IsLittleEndian);
80*07088c10SChris Bieneman     writeInteger((uint8_t)Range.AddrSize, OS, DI.IsLittleEndian);
81*07088c10SChris Bieneman     writeInteger((uint8_t)Range.SegSize, OS, DI.IsLittleEndian);
82*07088c10SChris Bieneman 
83*07088c10SChris Bieneman     auto HeaderSize = OS.tell() - HeaderStart;
84*07088c10SChris Bieneman     auto FirstDescriptor = alignTo(HeaderSize, Range.AddrSize * 2);
85*07088c10SChris Bieneman     ZeroFillBytes(OS, FirstDescriptor - HeaderSize);
86*07088c10SChris Bieneman 
87*07088c10SChris Bieneman     for (auto Descriptor : Range.Descriptors) {
88*07088c10SChris Bieneman       writeVariableSizedInteger(Descriptor.Address, Range.AddrSize, OS,
89*07088c10SChris Bieneman                                 DI.IsLittleEndian);
90*07088c10SChris Bieneman       writeVariableSizedInteger(Descriptor.Length, Range.AddrSize, OS,
91*07088c10SChris Bieneman                                 DI.IsLittleEndian);
92*07088c10SChris Bieneman     }
93*07088c10SChris Bieneman     ZeroFillBytes(OS, Range.AddrSize * 2);
94*07088c10SChris Bieneman   }
95*07088c10SChris Bieneman }
96*07088c10SChris Bieneman 
97*07088c10SChris Bieneman void DWARFYAML::EmitPubSection(raw_ostream &OS,
98*07088c10SChris Bieneman                                const DWARFYAML::PubSection &Sect,
99*07088c10SChris Bieneman                                bool IsLittleEndian) {
100*07088c10SChris Bieneman   writeInteger((uint32_t)Sect.Length, OS, IsLittleEndian);
101*07088c10SChris Bieneman   writeInteger((uint16_t)Sect.Version, OS, IsLittleEndian);
102*07088c10SChris Bieneman   writeInteger((uint32_t)Sect.UnitOffset, OS, IsLittleEndian);
103*07088c10SChris Bieneman   writeInteger((uint32_t)Sect.UnitSize, OS, IsLittleEndian);
104*07088c10SChris Bieneman   for (auto Entry : Sect.Entries) {
105*07088c10SChris Bieneman     writeInteger((uint32_t)Entry.DieOffset, OS, IsLittleEndian);
106*07088c10SChris Bieneman     if (Sect.IsGNUStyle)
107*07088c10SChris Bieneman       writeInteger((uint32_t)Entry.Descriptor, OS, IsLittleEndian);
108*07088c10SChris Bieneman     OS.write(Entry.Name.data(), Entry.Name.size());
109*07088c10SChris Bieneman     OS.write('\0');
110*07088c10SChris Bieneman   }
111*07088c10SChris Bieneman }
112*07088c10SChris Bieneman 
113*07088c10SChris Bieneman void DWARFYAML::EmitDebugInfo(raw_ostream &OS, const DWARFYAML::Data &DI) {
114*07088c10SChris Bieneman 
115*07088c10SChris Bieneman   for (auto CU : DI.CompileUnits) {
116*07088c10SChris Bieneman     writeInteger((uint32_t)CU.Length, OS, DI.IsLittleEndian);
117*07088c10SChris Bieneman     writeInteger((uint16_t)CU.Version, OS, DI.IsLittleEndian);
118*07088c10SChris Bieneman     writeInteger((uint32_t)CU.AbbrOffset, OS, DI.IsLittleEndian);
119*07088c10SChris Bieneman     writeInteger((uint8_t)CU.AddrSize, OS, DI.IsLittleEndian);
120*07088c10SChris Bieneman 
121*07088c10SChris Bieneman     auto FirstAbbrevCode = CU.Entries[0].AbbrCode;
122*07088c10SChris Bieneman 
123*07088c10SChris Bieneman     for (auto Entry : CU.Entries) {
124*07088c10SChris Bieneman       encodeULEB128(Entry.AbbrCode, OS);
125*07088c10SChris Bieneman       if (Entry.AbbrCode == 0u)
126*07088c10SChris Bieneman         continue;
127*07088c10SChris Bieneman       bool Indirect = false;
128*07088c10SChris Bieneman       assert(Entry.AbbrCode - FirstAbbrevCode < DI.AbbrevDecls.size() &&
129*07088c10SChris Bieneman              "Out of range AbbCode");
130*07088c10SChris Bieneman       auto &Abbrev = DI.AbbrevDecls[Entry.AbbrCode - FirstAbbrevCode];
131*07088c10SChris Bieneman 
132*07088c10SChris Bieneman       auto FormVal = Entry.Values.begin();
133*07088c10SChris Bieneman       auto AbbrForm = Abbrev.Attributes.begin();
134*07088c10SChris Bieneman       for (;
135*07088c10SChris Bieneman            FormVal != Entry.Values.end() && AbbrForm != Abbrev.Attributes.end();
136*07088c10SChris Bieneman            ++FormVal, ++AbbrForm) {
137*07088c10SChris Bieneman         dwarf::Form Form = AbbrForm->Form;
138*07088c10SChris Bieneman         do {
139*07088c10SChris Bieneman           Indirect = false;
140*07088c10SChris Bieneman           switch (Form) {
141*07088c10SChris Bieneman           case dwarf::DW_FORM_addr:
142*07088c10SChris Bieneman             writeVariableSizedInteger(FormVal->Value, CU.AddrSize, OS,
143*07088c10SChris Bieneman                                       DI.IsLittleEndian);
144*07088c10SChris Bieneman             break;
145*07088c10SChris Bieneman           case dwarf::DW_FORM_ref_addr: {
146*07088c10SChris Bieneman             // TODO: Handle DWARF32/DWARF64 after Line Table data is done
147*07088c10SChris Bieneman             auto writeSize = CU.Version == 2 ? CU.AddrSize : 4;
148*07088c10SChris Bieneman             writeVariableSizedInteger(FormVal->Value, writeSize, OS,
149*07088c10SChris Bieneman                                       DI.IsLittleEndian);
150*07088c10SChris Bieneman             break;
151*07088c10SChris Bieneman           }
152*07088c10SChris Bieneman           case dwarf::DW_FORM_exprloc:
153*07088c10SChris Bieneman           case dwarf::DW_FORM_block:
154*07088c10SChris Bieneman             encodeULEB128(FormVal->BlockData.size(), OS);
155*07088c10SChris Bieneman             OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
156*07088c10SChris Bieneman                      FormVal->BlockData.size());
157*07088c10SChris Bieneman             break;
158*07088c10SChris Bieneman           case dwarf::DW_FORM_block1: {
159*07088c10SChris Bieneman             auto writeSize = FormVal->BlockData.size();
160*07088c10SChris Bieneman             writeInteger((uint8_t)writeSize, OS, DI.IsLittleEndian);
161*07088c10SChris Bieneman             OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
162*07088c10SChris Bieneman                      FormVal->BlockData.size());
163*07088c10SChris Bieneman             break;
164*07088c10SChris Bieneman           }
165*07088c10SChris Bieneman           case dwarf::DW_FORM_block2: {
166*07088c10SChris Bieneman             auto writeSize = FormVal->BlockData.size();
167*07088c10SChris Bieneman             writeInteger((uint16_t)writeSize, OS, DI.IsLittleEndian);
168*07088c10SChris Bieneman             OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
169*07088c10SChris Bieneman                      FormVal->BlockData.size());
170*07088c10SChris Bieneman             break;
171*07088c10SChris Bieneman           }
172*07088c10SChris Bieneman           case dwarf::DW_FORM_block4: {
173*07088c10SChris Bieneman             auto writeSize = FormVal->BlockData.size();
174*07088c10SChris Bieneman             writeInteger((uint32_t)writeSize, OS, DI.IsLittleEndian);
175*07088c10SChris Bieneman             OS.write(reinterpret_cast<char *>(&FormVal->BlockData[0]),
176*07088c10SChris Bieneman                      FormVal->BlockData.size());
177*07088c10SChris Bieneman             break;
178*07088c10SChris Bieneman           }
179*07088c10SChris Bieneman           case dwarf::DW_FORM_data1:
180*07088c10SChris Bieneman           case dwarf::DW_FORM_ref1:
181*07088c10SChris Bieneman           case dwarf::DW_FORM_flag:
182*07088c10SChris Bieneman             writeInteger((uint8_t)FormVal->Value, OS, DI.IsLittleEndian);
183*07088c10SChris Bieneman             break;
184*07088c10SChris Bieneman           case dwarf::DW_FORM_data2:
185*07088c10SChris Bieneman           case dwarf::DW_FORM_ref2:
186*07088c10SChris Bieneman             writeInteger((uint16_t)FormVal->Value, OS, DI.IsLittleEndian);
187*07088c10SChris Bieneman             break;
188*07088c10SChris Bieneman           case dwarf::DW_FORM_data4:
189*07088c10SChris Bieneman           case dwarf::DW_FORM_ref4:
190*07088c10SChris Bieneman             writeInteger((uint32_t)FormVal->Value, OS, DI.IsLittleEndian);
191*07088c10SChris Bieneman             break;
192*07088c10SChris Bieneman           case dwarf::DW_FORM_data8:
193*07088c10SChris Bieneman           case dwarf::DW_FORM_ref8:
194*07088c10SChris Bieneman             writeInteger((uint64_t)FormVal->Value, OS, DI.IsLittleEndian);
195*07088c10SChris Bieneman             break;
196*07088c10SChris Bieneman           case dwarf::DW_FORM_sdata:
197*07088c10SChris Bieneman             encodeSLEB128(FormVal->Value, OS);
198*07088c10SChris Bieneman             break;
199*07088c10SChris Bieneman           case dwarf::DW_FORM_udata:
200*07088c10SChris Bieneman           case dwarf::DW_FORM_ref_udata:
201*07088c10SChris Bieneman             encodeULEB128(FormVal->Value, OS);
202*07088c10SChris Bieneman             break;
203*07088c10SChris Bieneman           case dwarf::DW_FORM_string:
204*07088c10SChris Bieneman             OS.write(FormVal->CStr.data(), FormVal->CStr.size());
205*07088c10SChris Bieneman             OS.write('\0');
206*07088c10SChris Bieneman             break;
207*07088c10SChris Bieneman           case dwarf::DW_FORM_indirect:
208*07088c10SChris Bieneman             encodeULEB128(FormVal->Value, OS);
209*07088c10SChris Bieneman             Indirect = true;
210*07088c10SChris Bieneman             Form = static_cast<dwarf::Form>((uint64_t)FormVal->Value);
211*07088c10SChris Bieneman             ++FormVal;
212*07088c10SChris Bieneman             break;
213*07088c10SChris Bieneman           case dwarf::DW_FORM_strp:
214*07088c10SChris Bieneman           case dwarf::DW_FORM_sec_offset:
215*07088c10SChris Bieneman           case dwarf::DW_FORM_GNU_ref_alt:
216*07088c10SChris Bieneman           case dwarf::DW_FORM_GNU_strp_alt:
217*07088c10SChris Bieneman           case dwarf::DW_FORM_line_strp:
218*07088c10SChris Bieneman           case dwarf::DW_FORM_strp_sup:
219*07088c10SChris Bieneman           case dwarf::DW_FORM_ref_sup:
220*07088c10SChris Bieneman             // TODO: Handle DWARF32/64
221*07088c10SChris Bieneman             writeInteger((uint32_t)FormVal->Value, OS, DI.IsLittleEndian);
222*07088c10SChris Bieneman             break;
223*07088c10SChris Bieneman           case dwarf::DW_FORM_ref_sig8:
224*07088c10SChris Bieneman             writeInteger((uint64_t)FormVal->Value, OS, DI.IsLittleEndian);
225*07088c10SChris Bieneman             break;
226*07088c10SChris Bieneman           case dwarf::DW_FORM_GNU_addr_index:
227*07088c10SChris Bieneman           case dwarf::DW_FORM_GNU_str_index:
228*07088c10SChris Bieneman             encodeULEB128(FormVal->Value, OS);
229*07088c10SChris Bieneman             break;
230*07088c10SChris Bieneman           default:
231*07088c10SChris Bieneman             break;
232*07088c10SChris Bieneman           }
233*07088c10SChris Bieneman         } while (Indirect);
234*07088c10SChris Bieneman       }
235*07088c10SChris Bieneman     }
236*07088c10SChris Bieneman   }
237*07088c10SChris Bieneman }
238*07088c10SChris Bieneman 
239*07088c10SChris Bieneman void EmitFileEntry(raw_ostream &OS, const DWARFYAML::File &File) {
240*07088c10SChris Bieneman   OS.write(File.Name.data(), File.Name.size());
241*07088c10SChris Bieneman   OS.write('\0');
242*07088c10SChris Bieneman   encodeULEB128(File.DirIdx, OS);
243*07088c10SChris Bieneman   encodeULEB128(File.ModTime, OS);
244*07088c10SChris Bieneman   encodeULEB128(File.Length, OS);
245*07088c10SChris Bieneman }
246*07088c10SChris Bieneman 
247*07088c10SChris Bieneman void DWARFYAML::EmitDebugLine(raw_ostream &OS, const DWARFYAML::Data &DI) {
248*07088c10SChris Bieneman   for (const auto LineTable : DI.DebugLines) {
249*07088c10SChris Bieneman     writeInteger((uint32_t)LineTable.TotalLength, OS, DI.IsLittleEndian);
250*07088c10SChris Bieneman     uint64_t SizeOfPrologueLength = 4;
251*07088c10SChris Bieneman     if (LineTable.TotalLength == UINT32_MAX) {
252*07088c10SChris Bieneman       writeInteger((uint64_t)LineTable.TotalLength64, OS, DI.IsLittleEndian);
253*07088c10SChris Bieneman       SizeOfPrologueLength = 8;
254*07088c10SChris Bieneman     }
255*07088c10SChris Bieneman     writeInteger((uint16_t)LineTable.Version, OS, DI.IsLittleEndian);
256*07088c10SChris Bieneman     writeVariableSizedInteger(LineTable.PrologueLength, SizeOfPrologueLength,
257*07088c10SChris Bieneman                               OS, DI.IsLittleEndian);
258*07088c10SChris Bieneman     writeInteger((uint8_t)LineTable.MinInstLength, OS, DI.IsLittleEndian);
259*07088c10SChris Bieneman     if (LineTable.Version >= 4)
260*07088c10SChris Bieneman       writeInteger((uint8_t)LineTable.MaxOpsPerInst, OS, DI.IsLittleEndian);
261*07088c10SChris Bieneman     writeInteger((uint8_t)LineTable.DefaultIsStmt, OS, DI.IsLittleEndian);
262*07088c10SChris Bieneman     writeInteger((uint8_t)LineTable.LineBase, OS, DI.IsLittleEndian);
263*07088c10SChris Bieneman     writeInteger((uint8_t)LineTable.LineRange, OS, DI.IsLittleEndian);
264*07088c10SChris Bieneman     writeInteger((uint8_t)LineTable.OpcodeBase, OS, DI.IsLittleEndian);
265*07088c10SChris Bieneman 
266*07088c10SChris Bieneman     for (auto OpcodeLength : LineTable.StandardOpcodeLengths)
267*07088c10SChris Bieneman       writeInteger((uint8_t)OpcodeLength, OS, DI.IsLittleEndian);
268*07088c10SChris Bieneman 
269*07088c10SChris Bieneman     for (auto IncludeDir : LineTable.IncludeDirs) {
270*07088c10SChris Bieneman       OS.write(IncludeDir.data(), IncludeDir.size());
271*07088c10SChris Bieneman       OS.write('\0');
272*07088c10SChris Bieneman     }
273*07088c10SChris Bieneman     OS.write('\0');
274*07088c10SChris Bieneman 
275*07088c10SChris Bieneman     for (auto File : LineTable.Files)
276*07088c10SChris Bieneman       EmitFileEntry(OS, File);
277*07088c10SChris Bieneman     OS.write('\0');
278*07088c10SChris Bieneman 
279*07088c10SChris Bieneman     for (auto Op : LineTable.Opcodes) {
280*07088c10SChris Bieneman       writeInteger((uint8_t)Op.Opcode, OS, DI.IsLittleEndian);
281*07088c10SChris Bieneman       if (Op.Opcode == 0) {
282*07088c10SChris Bieneman         encodeULEB128(Op.ExtLen, OS);
283*07088c10SChris Bieneman         writeInteger((uint8_t)Op.SubOpcode, OS, DI.IsLittleEndian);
284*07088c10SChris Bieneman         switch (Op.SubOpcode) {
285*07088c10SChris Bieneman         case dwarf::DW_LNE_set_address:
286*07088c10SChris Bieneman         case dwarf::DW_LNE_set_discriminator:
287*07088c10SChris Bieneman           writeVariableSizedInteger(Op.Data, DI.CompileUnits[0].AddrSize, OS,
288*07088c10SChris Bieneman                                     DI.IsLittleEndian);
289*07088c10SChris Bieneman           break;
290*07088c10SChris Bieneman         case dwarf::DW_LNE_define_file:
291*07088c10SChris Bieneman           EmitFileEntry(OS, Op.FileEntry);
292*07088c10SChris Bieneman           break;
293*07088c10SChris Bieneman         case dwarf::DW_LNE_end_sequence:
294*07088c10SChris Bieneman           break;
295*07088c10SChris Bieneman         default:
296*07088c10SChris Bieneman           for (auto OpByte : Op.UnknownOpcodeData)
297*07088c10SChris Bieneman             writeInteger((uint8_t)OpByte, OS, DI.IsLittleEndian);
298*07088c10SChris Bieneman         }
299*07088c10SChris Bieneman       } else if (Op.Opcode < LineTable.OpcodeBase) {
300*07088c10SChris Bieneman         switch (Op.Opcode) {
301*07088c10SChris Bieneman         case dwarf::DW_LNS_copy:
302*07088c10SChris Bieneman         case dwarf::DW_LNS_negate_stmt:
303*07088c10SChris Bieneman         case dwarf::DW_LNS_set_basic_block:
304*07088c10SChris Bieneman         case dwarf::DW_LNS_const_add_pc:
305*07088c10SChris Bieneman         case dwarf::DW_LNS_set_prologue_end:
306*07088c10SChris Bieneman         case dwarf::DW_LNS_set_epilogue_begin:
307*07088c10SChris Bieneman           break;
308*07088c10SChris Bieneman 
309*07088c10SChris Bieneman         case dwarf::DW_LNS_advance_pc:
310*07088c10SChris Bieneman         case dwarf::DW_LNS_set_file:
311*07088c10SChris Bieneman         case dwarf::DW_LNS_set_column:
312*07088c10SChris Bieneman         case dwarf::DW_LNS_set_isa:
313*07088c10SChris Bieneman           encodeULEB128(Op.Data, OS);
314*07088c10SChris Bieneman           break;
315*07088c10SChris Bieneman 
316*07088c10SChris Bieneman         case dwarf::DW_LNS_advance_line:
317*07088c10SChris Bieneman           encodeSLEB128(Op.SData, OS);
318*07088c10SChris Bieneman           break;
319*07088c10SChris Bieneman 
320*07088c10SChris Bieneman         case dwarf::DW_LNS_fixed_advance_pc:
321*07088c10SChris Bieneman           writeInteger((uint16_t)Op.Data, OS, DI.IsLittleEndian);
322*07088c10SChris Bieneman           break;
323*07088c10SChris Bieneman 
324*07088c10SChris Bieneman         default:
325*07088c10SChris Bieneman           for (auto OpData : Op.StandardOpcodeData) {
326*07088c10SChris Bieneman             encodeULEB128(OpData, OS);
327*07088c10SChris Bieneman           }
328*07088c10SChris Bieneman         }
329*07088c10SChris Bieneman       }
330*07088c10SChris Bieneman     }
331*07088c10SChris Bieneman   }
332*07088c10SChris Bieneman }
333