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