1f22ef01cSRoman Divacky //===--- Bitcode/Writer/BitcodeWriter.cpp - Bitcode Writer ----------------===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // Bitcode writer implementation. 11f22ef01cSRoman Divacky // 12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 13f22ef01cSRoman Divacky 14f22ef01cSRoman Divacky #include "llvm/Bitcode/ReaderWriter.h" 15139f7f9bSDimitry Andric #include "ValueEnumerator.h" 167d523365SDimitry Andric #include "llvm/ADT/STLExtras.h" 17139f7f9bSDimitry Andric #include "llvm/ADT/Triple.h" 18f22ef01cSRoman Divacky #include "llvm/Bitcode/BitstreamWriter.h" 19f22ef01cSRoman Divacky #include "llvm/Bitcode/LLVMBitCodes.h" 207d523365SDimitry Andric #include "llvm/IR/CallSite.h" 21139f7f9bSDimitry Andric #include "llvm/IR/Constants.h" 22ff0cc061SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 23139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h" 24139f7f9bSDimitry Andric #include "llvm/IR/InlineAsm.h" 25139f7f9bSDimitry Andric #include "llvm/IR/Instructions.h" 267d523365SDimitry Andric #include "llvm/IR/LLVMContext.h" 277d523365SDimitry Andric #include "llvm/IR/IntrinsicInst.h" 28139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 29139f7f9bSDimitry Andric #include "llvm/IR/Operator.h" 3039d628a0SDimitry Andric #include "llvm/IR/UseListOrder.h" 31139f7f9bSDimitry Andric #include "llvm/IR/ValueSymbolTable.h" 32dff0c46cSDimitry Andric #include "llvm/Support/CommandLine.h" 33f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 34f22ef01cSRoman Divacky #include "llvm/Support/MathExtras.h" 352754fe60SDimitry Andric #include "llvm/Support/Program.h" 36139f7f9bSDimitry Andric #include "llvm/Support/raw_ostream.h" 372754fe60SDimitry Andric #include <cctype> 3817a519f9SDimitry Andric #include <map> 39f22ef01cSRoman Divacky using namespace llvm; 40f22ef01cSRoman Divacky 41f22ef01cSRoman Divacky /// These are manifest constants used by the bitcode writer. They do not need to 42f22ef01cSRoman Divacky /// be kept in sync with the reader, but need to be consistent within this file. 43f22ef01cSRoman Divacky enum { 44f22ef01cSRoman Divacky // VALUE_SYMTAB_BLOCK abbrev id's. 45f22ef01cSRoman Divacky VST_ENTRY_8_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 46f22ef01cSRoman Divacky VST_ENTRY_7_ABBREV, 47f22ef01cSRoman Divacky VST_ENTRY_6_ABBREV, 48f22ef01cSRoman Divacky VST_BBENTRY_6_ABBREV, 49f22ef01cSRoman Divacky 50f22ef01cSRoman Divacky // CONSTANTS_BLOCK abbrev id's. 51f22ef01cSRoman Divacky CONSTANTS_SETTYPE_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 52f22ef01cSRoman Divacky CONSTANTS_INTEGER_ABBREV, 53f22ef01cSRoman Divacky CONSTANTS_CE_CAST_Abbrev, 54f22ef01cSRoman Divacky CONSTANTS_NULL_Abbrev, 55f22ef01cSRoman Divacky 56f22ef01cSRoman Divacky // FUNCTION_BLOCK abbrev id's. 57f22ef01cSRoman Divacky FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 58f22ef01cSRoman Divacky FUNCTION_INST_BINOP_ABBREV, 59f22ef01cSRoman Divacky FUNCTION_INST_BINOP_FLAGS_ABBREV, 60f22ef01cSRoman Divacky FUNCTION_INST_CAST_ABBREV, 61f22ef01cSRoman Divacky FUNCTION_INST_RET_VOID_ABBREV, 62f22ef01cSRoman Divacky FUNCTION_INST_RET_VAL_ABBREV, 63ff0cc061SDimitry Andric FUNCTION_INST_UNREACHABLE_ABBREV, 64ff0cc061SDimitry Andric FUNCTION_INST_GEP_ABBREV, 65f22ef01cSRoman Divacky }; 66f22ef01cSRoman Divacky 67f22ef01cSRoman Divacky static unsigned GetEncodedCastOpcode(unsigned Opcode) { 68f22ef01cSRoman Divacky switch (Opcode) { 69f22ef01cSRoman Divacky default: llvm_unreachable("Unknown cast instruction!"); 70f22ef01cSRoman Divacky case Instruction::Trunc : return bitc::CAST_TRUNC; 71f22ef01cSRoman Divacky case Instruction::ZExt : return bitc::CAST_ZEXT; 72f22ef01cSRoman Divacky case Instruction::SExt : return bitc::CAST_SEXT; 73f22ef01cSRoman Divacky case Instruction::FPToUI : return bitc::CAST_FPTOUI; 74f22ef01cSRoman Divacky case Instruction::FPToSI : return bitc::CAST_FPTOSI; 75f22ef01cSRoman Divacky case Instruction::UIToFP : return bitc::CAST_UITOFP; 76f22ef01cSRoman Divacky case Instruction::SIToFP : return bitc::CAST_SITOFP; 77f22ef01cSRoman Divacky case Instruction::FPTrunc : return bitc::CAST_FPTRUNC; 78f22ef01cSRoman Divacky case Instruction::FPExt : return bitc::CAST_FPEXT; 79f22ef01cSRoman Divacky case Instruction::PtrToInt: return bitc::CAST_PTRTOINT; 80f22ef01cSRoman Divacky case Instruction::IntToPtr: return bitc::CAST_INTTOPTR; 81f22ef01cSRoman Divacky case Instruction::BitCast : return bitc::CAST_BITCAST; 82f785676fSDimitry Andric case Instruction::AddrSpaceCast: return bitc::CAST_ADDRSPACECAST; 83f22ef01cSRoman Divacky } 84f22ef01cSRoman Divacky } 85f22ef01cSRoman Divacky 86f22ef01cSRoman Divacky static unsigned GetEncodedBinaryOpcode(unsigned Opcode) { 87f22ef01cSRoman Divacky switch (Opcode) { 88f22ef01cSRoman Divacky default: llvm_unreachable("Unknown binary instruction!"); 89f22ef01cSRoman Divacky case Instruction::Add: 90f22ef01cSRoman Divacky case Instruction::FAdd: return bitc::BINOP_ADD; 91f22ef01cSRoman Divacky case Instruction::Sub: 92f22ef01cSRoman Divacky case Instruction::FSub: return bitc::BINOP_SUB; 93f22ef01cSRoman Divacky case Instruction::Mul: 94f22ef01cSRoman Divacky case Instruction::FMul: return bitc::BINOP_MUL; 95f22ef01cSRoman Divacky case Instruction::UDiv: return bitc::BINOP_UDIV; 96f22ef01cSRoman Divacky case Instruction::FDiv: 97f22ef01cSRoman Divacky case Instruction::SDiv: return bitc::BINOP_SDIV; 98f22ef01cSRoman Divacky case Instruction::URem: return bitc::BINOP_UREM; 99f22ef01cSRoman Divacky case Instruction::FRem: 100f22ef01cSRoman Divacky case Instruction::SRem: return bitc::BINOP_SREM; 101f22ef01cSRoman Divacky case Instruction::Shl: return bitc::BINOP_SHL; 102f22ef01cSRoman Divacky case Instruction::LShr: return bitc::BINOP_LSHR; 103f22ef01cSRoman Divacky case Instruction::AShr: return bitc::BINOP_ASHR; 104f22ef01cSRoman Divacky case Instruction::And: return bitc::BINOP_AND; 105f22ef01cSRoman Divacky case Instruction::Or: return bitc::BINOP_OR; 106f22ef01cSRoman Divacky case Instruction::Xor: return bitc::BINOP_XOR; 107f22ef01cSRoman Divacky } 108f22ef01cSRoman Divacky } 109f22ef01cSRoman Divacky 1106122f3e6SDimitry Andric static unsigned GetEncodedRMWOperation(AtomicRMWInst::BinOp Op) { 1116122f3e6SDimitry Andric switch (Op) { 1126122f3e6SDimitry Andric default: llvm_unreachable("Unknown RMW operation!"); 1136122f3e6SDimitry Andric case AtomicRMWInst::Xchg: return bitc::RMW_XCHG; 1146122f3e6SDimitry Andric case AtomicRMWInst::Add: return bitc::RMW_ADD; 1156122f3e6SDimitry Andric case AtomicRMWInst::Sub: return bitc::RMW_SUB; 1166122f3e6SDimitry Andric case AtomicRMWInst::And: return bitc::RMW_AND; 1176122f3e6SDimitry Andric case AtomicRMWInst::Nand: return bitc::RMW_NAND; 1186122f3e6SDimitry Andric case AtomicRMWInst::Or: return bitc::RMW_OR; 1196122f3e6SDimitry Andric case AtomicRMWInst::Xor: return bitc::RMW_XOR; 1206122f3e6SDimitry Andric case AtomicRMWInst::Max: return bitc::RMW_MAX; 1216122f3e6SDimitry Andric case AtomicRMWInst::Min: return bitc::RMW_MIN; 1226122f3e6SDimitry Andric case AtomicRMWInst::UMax: return bitc::RMW_UMAX; 1236122f3e6SDimitry Andric case AtomicRMWInst::UMin: return bitc::RMW_UMIN; 1246122f3e6SDimitry Andric } 1256122f3e6SDimitry Andric } 1266122f3e6SDimitry Andric 1276122f3e6SDimitry Andric static unsigned GetEncodedOrdering(AtomicOrdering Ordering) { 1286122f3e6SDimitry Andric switch (Ordering) { 1296122f3e6SDimitry Andric case NotAtomic: return bitc::ORDERING_NOTATOMIC; 1306122f3e6SDimitry Andric case Unordered: return bitc::ORDERING_UNORDERED; 1316122f3e6SDimitry Andric case Monotonic: return bitc::ORDERING_MONOTONIC; 1326122f3e6SDimitry Andric case Acquire: return bitc::ORDERING_ACQUIRE; 1336122f3e6SDimitry Andric case Release: return bitc::ORDERING_RELEASE; 1346122f3e6SDimitry Andric case AcquireRelease: return bitc::ORDERING_ACQREL; 1356122f3e6SDimitry Andric case SequentiallyConsistent: return bitc::ORDERING_SEQCST; 1366122f3e6SDimitry Andric } 137dff0c46cSDimitry Andric llvm_unreachable("Invalid ordering"); 1386122f3e6SDimitry Andric } 1396122f3e6SDimitry Andric 1406122f3e6SDimitry Andric static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) { 1416122f3e6SDimitry Andric switch (SynchScope) { 1426122f3e6SDimitry Andric case SingleThread: return bitc::SYNCHSCOPE_SINGLETHREAD; 1436122f3e6SDimitry Andric case CrossThread: return bitc::SYNCHSCOPE_CROSSTHREAD; 1446122f3e6SDimitry Andric } 145dff0c46cSDimitry Andric llvm_unreachable("Invalid synch scope"); 1466122f3e6SDimitry Andric } 1476122f3e6SDimitry Andric 14817a519f9SDimitry Andric static void WriteStringRecord(unsigned Code, StringRef Str, 149f22ef01cSRoman Divacky unsigned AbbrevToUse, BitstreamWriter &Stream) { 150f22ef01cSRoman Divacky SmallVector<unsigned, 64> Vals; 151f22ef01cSRoman Divacky 152f22ef01cSRoman Divacky // Code: [strchar x N] 15317a519f9SDimitry Andric for (unsigned i = 0, e = Str.size(); i != e; ++i) { 15417a519f9SDimitry Andric if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(Str[i])) 15517a519f9SDimitry Andric AbbrevToUse = 0; 156f22ef01cSRoman Divacky Vals.push_back(Str[i]); 15717a519f9SDimitry Andric } 158f22ef01cSRoman Divacky 159f22ef01cSRoman Divacky // Emit the finished record. 160f22ef01cSRoman Divacky Stream.EmitRecord(Code, Vals, AbbrevToUse); 161f22ef01cSRoman Divacky } 162f22ef01cSRoman Divacky 163f785676fSDimitry Andric static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) { 164f785676fSDimitry Andric switch (Kind) { 165f785676fSDimitry Andric case Attribute::Alignment: 166f785676fSDimitry Andric return bitc::ATTR_KIND_ALIGNMENT; 167f785676fSDimitry Andric case Attribute::AlwaysInline: 168f785676fSDimitry Andric return bitc::ATTR_KIND_ALWAYS_INLINE; 169875ed548SDimitry Andric case Attribute::ArgMemOnly: 170875ed548SDimitry Andric return bitc::ATTR_KIND_ARGMEMONLY; 171f785676fSDimitry Andric case Attribute::Builtin: 172f785676fSDimitry Andric return bitc::ATTR_KIND_BUILTIN; 173f785676fSDimitry Andric case Attribute::ByVal: 174f785676fSDimitry Andric return bitc::ATTR_KIND_BY_VAL; 175ff0cc061SDimitry Andric case Attribute::Convergent: 176ff0cc061SDimitry Andric return bitc::ATTR_KIND_CONVERGENT; 17791bc56edSDimitry Andric case Attribute::InAlloca: 17891bc56edSDimitry Andric return bitc::ATTR_KIND_IN_ALLOCA; 179f785676fSDimitry Andric case Attribute::Cold: 180f785676fSDimitry Andric return bitc::ATTR_KIND_COLD; 1817d523365SDimitry Andric case Attribute::InaccessibleMemOnly: 1827d523365SDimitry Andric return bitc::ATTR_KIND_INACCESSIBLEMEM_ONLY; 1837d523365SDimitry Andric case Attribute::InaccessibleMemOrArgMemOnly: 1847d523365SDimitry Andric return bitc::ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY; 185f785676fSDimitry Andric case Attribute::InlineHint: 186f785676fSDimitry Andric return bitc::ATTR_KIND_INLINE_HINT; 187f785676fSDimitry Andric case Attribute::InReg: 188f785676fSDimitry Andric return bitc::ATTR_KIND_IN_REG; 18991bc56edSDimitry Andric case Attribute::JumpTable: 19091bc56edSDimitry Andric return bitc::ATTR_KIND_JUMP_TABLE; 191f785676fSDimitry Andric case Attribute::MinSize: 192f785676fSDimitry Andric return bitc::ATTR_KIND_MIN_SIZE; 193f785676fSDimitry Andric case Attribute::Naked: 194f785676fSDimitry Andric return bitc::ATTR_KIND_NAKED; 195f785676fSDimitry Andric case Attribute::Nest: 196f785676fSDimitry Andric return bitc::ATTR_KIND_NEST; 197f785676fSDimitry Andric case Attribute::NoAlias: 198f785676fSDimitry Andric return bitc::ATTR_KIND_NO_ALIAS; 199f785676fSDimitry Andric case Attribute::NoBuiltin: 200f785676fSDimitry Andric return bitc::ATTR_KIND_NO_BUILTIN; 201f785676fSDimitry Andric case Attribute::NoCapture: 202f785676fSDimitry Andric return bitc::ATTR_KIND_NO_CAPTURE; 203f785676fSDimitry Andric case Attribute::NoDuplicate: 204f785676fSDimitry Andric return bitc::ATTR_KIND_NO_DUPLICATE; 205f785676fSDimitry Andric case Attribute::NoImplicitFloat: 206f785676fSDimitry Andric return bitc::ATTR_KIND_NO_IMPLICIT_FLOAT; 207f785676fSDimitry Andric case Attribute::NoInline: 208f785676fSDimitry Andric return bitc::ATTR_KIND_NO_INLINE; 2097d523365SDimitry Andric case Attribute::NoRecurse: 2107d523365SDimitry Andric return bitc::ATTR_KIND_NO_RECURSE; 211f785676fSDimitry Andric case Attribute::NonLazyBind: 212f785676fSDimitry Andric return bitc::ATTR_KIND_NON_LAZY_BIND; 21391bc56edSDimitry Andric case Attribute::NonNull: 21491bc56edSDimitry Andric return bitc::ATTR_KIND_NON_NULL; 21591bc56edSDimitry Andric case Attribute::Dereferenceable: 21691bc56edSDimitry Andric return bitc::ATTR_KIND_DEREFERENCEABLE; 217ff0cc061SDimitry Andric case Attribute::DereferenceableOrNull: 218ff0cc061SDimitry Andric return bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL; 219f785676fSDimitry Andric case Attribute::NoRedZone: 220f785676fSDimitry Andric return bitc::ATTR_KIND_NO_RED_ZONE; 221f785676fSDimitry Andric case Attribute::NoReturn: 222f785676fSDimitry Andric return bitc::ATTR_KIND_NO_RETURN; 223f785676fSDimitry Andric case Attribute::NoUnwind: 224f785676fSDimitry Andric return bitc::ATTR_KIND_NO_UNWIND; 225f785676fSDimitry Andric case Attribute::OptimizeForSize: 226f785676fSDimitry Andric return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE; 227f785676fSDimitry Andric case Attribute::OptimizeNone: 228f785676fSDimitry Andric return bitc::ATTR_KIND_OPTIMIZE_NONE; 229f785676fSDimitry Andric case Attribute::ReadNone: 230f785676fSDimitry Andric return bitc::ATTR_KIND_READ_NONE; 231f785676fSDimitry Andric case Attribute::ReadOnly: 232f785676fSDimitry Andric return bitc::ATTR_KIND_READ_ONLY; 233f785676fSDimitry Andric case Attribute::Returned: 234f785676fSDimitry Andric return bitc::ATTR_KIND_RETURNED; 235f785676fSDimitry Andric case Attribute::ReturnsTwice: 236f785676fSDimitry Andric return bitc::ATTR_KIND_RETURNS_TWICE; 237f785676fSDimitry Andric case Attribute::SExt: 238f785676fSDimitry Andric return bitc::ATTR_KIND_S_EXT; 239f785676fSDimitry Andric case Attribute::StackAlignment: 240f785676fSDimitry Andric return bitc::ATTR_KIND_STACK_ALIGNMENT; 241f785676fSDimitry Andric case Attribute::StackProtect: 242f785676fSDimitry Andric return bitc::ATTR_KIND_STACK_PROTECT; 243f785676fSDimitry Andric case Attribute::StackProtectReq: 244f785676fSDimitry Andric return bitc::ATTR_KIND_STACK_PROTECT_REQ; 245f785676fSDimitry Andric case Attribute::StackProtectStrong: 246f785676fSDimitry Andric return bitc::ATTR_KIND_STACK_PROTECT_STRONG; 2478f0fd8f6SDimitry Andric case Attribute::SafeStack: 2488f0fd8f6SDimitry Andric return bitc::ATTR_KIND_SAFESTACK; 249f785676fSDimitry Andric case Attribute::StructRet: 250f785676fSDimitry Andric return bitc::ATTR_KIND_STRUCT_RET; 251f785676fSDimitry Andric case Attribute::SanitizeAddress: 252f785676fSDimitry Andric return bitc::ATTR_KIND_SANITIZE_ADDRESS; 253f785676fSDimitry Andric case Attribute::SanitizeThread: 254f785676fSDimitry Andric return bitc::ATTR_KIND_SANITIZE_THREAD; 255f785676fSDimitry Andric case Attribute::SanitizeMemory: 256f785676fSDimitry Andric return bitc::ATTR_KIND_SANITIZE_MEMORY; 257f785676fSDimitry Andric case Attribute::UWTable: 258f785676fSDimitry Andric return bitc::ATTR_KIND_UW_TABLE; 259f785676fSDimitry Andric case Attribute::ZExt: 260f785676fSDimitry Andric return bitc::ATTR_KIND_Z_EXT; 261f785676fSDimitry Andric case Attribute::EndAttrKinds: 262f785676fSDimitry Andric llvm_unreachable("Can not encode end-attribute kinds marker."); 263f785676fSDimitry Andric case Attribute::None: 264f785676fSDimitry Andric llvm_unreachable("Can not encode none-attribute."); 265f785676fSDimitry Andric } 266f785676fSDimitry Andric 267f785676fSDimitry Andric llvm_unreachable("Trying to encode unknown attribute"); 268f785676fSDimitry Andric } 269f785676fSDimitry Andric 270139f7f9bSDimitry Andric static void WriteAttributeGroupTable(const ValueEnumerator &VE, 271139f7f9bSDimitry Andric BitstreamWriter &Stream) { 272139f7f9bSDimitry Andric const std::vector<AttributeSet> &AttrGrps = VE.getAttributeGroups(); 273139f7f9bSDimitry Andric if (AttrGrps.empty()) return; 274139f7f9bSDimitry Andric 275139f7f9bSDimitry Andric Stream.EnterSubblock(bitc::PARAMATTR_GROUP_BLOCK_ID, 3); 276139f7f9bSDimitry Andric 277139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 278139f7f9bSDimitry Andric for (unsigned i = 0, e = AttrGrps.size(); i != e; ++i) { 279139f7f9bSDimitry Andric AttributeSet AS = AttrGrps[i]; 280139f7f9bSDimitry Andric for (unsigned i = 0, e = AS.getNumSlots(); i != e; ++i) { 281139f7f9bSDimitry Andric AttributeSet A = AS.getSlotAttributes(i); 282139f7f9bSDimitry Andric 283139f7f9bSDimitry Andric Record.push_back(VE.getAttributeGroupID(A)); 284139f7f9bSDimitry Andric Record.push_back(AS.getSlotIndex(i)); 285139f7f9bSDimitry Andric 286139f7f9bSDimitry Andric for (AttributeSet::iterator I = AS.begin(0), E = AS.end(0); 287139f7f9bSDimitry Andric I != E; ++I) { 288139f7f9bSDimitry Andric Attribute Attr = *I; 289139f7f9bSDimitry Andric if (Attr.isEnumAttribute()) { 290139f7f9bSDimitry Andric Record.push_back(0); 291f785676fSDimitry Andric Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum())); 29291bc56edSDimitry Andric } else if (Attr.isIntAttribute()) { 293139f7f9bSDimitry Andric Record.push_back(1); 294f785676fSDimitry Andric Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum())); 295139f7f9bSDimitry Andric Record.push_back(Attr.getValueAsInt()); 296139f7f9bSDimitry Andric } else { 297139f7f9bSDimitry Andric StringRef Kind = Attr.getKindAsString(); 298139f7f9bSDimitry Andric StringRef Val = Attr.getValueAsString(); 299139f7f9bSDimitry Andric 300139f7f9bSDimitry Andric Record.push_back(Val.empty() ? 3 : 4); 301139f7f9bSDimitry Andric Record.append(Kind.begin(), Kind.end()); 302139f7f9bSDimitry Andric Record.push_back(0); 303139f7f9bSDimitry Andric if (!Val.empty()) { 304139f7f9bSDimitry Andric Record.append(Val.begin(), Val.end()); 305139f7f9bSDimitry Andric Record.push_back(0); 306139f7f9bSDimitry Andric } 307139f7f9bSDimitry Andric } 308139f7f9bSDimitry Andric } 309139f7f9bSDimitry Andric 310139f7f9bSDimitry Andric Stream.EmitRecord(bitc::PARAMATTR_GRP_CODE_ENTRY, Record); 311139f7f9bSDimitry Andric Record.clear(); 312139f7f9bSDimitry Andric } 313139f7f9bSDimitry Andric } 314139f7f9bSDimitry Andric 315139f7f9bSDimitry Andric Stream.ExitBlock(); 316139f7f9bSDimitry Andric } 317139f7f9bSDimitry Andric 318f22ef01cSRoman Divacky static void WriteAttributeTable(const ValueEnumerator &VE, 319f22ef01cSRoman Divacky BitstreamWriter &Stream) { 320139f7f9bSDimitry Andric const std::vector<AttributeSet> &Attrs = VE.getAttributes(); 321f22ef01cSRoman Divacky if (Attrs.empty()) return; 322f22ef01cSRoman Divacky 323f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3); 324f22ef01cSRoman Divacky 325f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 326f22ef01cSRoman Divacky for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { 327139f7f9bSDimitry Andric const AttributeSet &A = Attrs[i]; 328139f7f9bSDimitry Andric for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) 329139f7f9bSDimitry Andric Record.push_back(VE.getAttributeGroupID(A.getSlotAttributes(i))); 330f22ef01cSRoman Divacky 331f22ef01cSRoman Divacky Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record); 332f22ef01cSRoman Divacky Record.clear(); 333f22ef01cSRoman Divacky } 334f22ef01cSRoman Divacky 335f22ef01cSRoman Divacky Stream.ExitBlock(); 336f22ef01cSRoman Divacky } 337f22ef01cSRoman Divacky 338f22ef01cSRoman Divacky /// WriteTypeTable - Write out the type table for a module. 339f22ef01cSRoman Divacky static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) { 340f22ef01cSRoman Divacky const ValueEnumerator::TypeList &TypeList = VE.getTypes(); 341f22ef01cSRoman Divacky 34217a519f9SDimitry Andric Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */); 343f22ef01cSRoman Divacky SmallVector<uint64_t, 64> TypeVals; 344f22ef01cSRoman Divacky 345ff0cc061SDimitry Andric uint64_t NumBits = VE.computeBitsRequiredForTypeIndicies(); 346dff0c46cSDimitry Andric 347f22ef01cSRoman Divacky // Abbrev for TYPE_CODE_POINTER. 348f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 349f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER)); 350dff0c46cSDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 351f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0 352f22ef01cSRoman Divacky unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv); 353f22ef01cSRoman Divacky 354f22ef01cSRoman Divacky // Abbrev for TYPE_CODE_FUNCTION. 355f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 356f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION)); 357f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg 358f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 359dff0c46cSDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 360dff0c46cSDimitry Andric 361f22ef01cSRoman Divacky unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv); 362f22ef01cSRoman Divacky 36317a519f9SDimitry Andric // Abbrev for TYPE_CODE_STRUCT_ANON. 364f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 36517a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON)); 366f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 367f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 368dff0c46cSDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 369dff0c46cSDimitry Andric 37017a519f9SDimitry Andric unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv); 37117a519f9SDimitry Andric 37217a519f9SDimitry Andric // Abbrev for TYPE_CODE_STRUCT_NAME. 37317a519f9SDimitry Andric Abbv = new BitCodeAbbrev(); 37417a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME)); 37517a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 37617a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 37717a519f9SDimitry Andric unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv); 37817a519f9SDimitry Andric 37917a519f9SDimitry Andric // Abbrev for TYPE_CODE_STRUCT_NAMED. 38017a519f9SDimitry Andric Abbv = new BitCodeAbbrev(); 38117a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED)); 38217a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 38317a519f9SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 384dff0c46cSDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 385dff0c46cSDimitry Andric 38617a519f9SDimitry Andric unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); 38717a519f9SDimitry Andric 388f22ef01cSRoman Divacky // Abbrev for TYPE_CODE_ARRAY. 389f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 390f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); 391f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size 392dff0c46cSDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 393dff0c46cSDimitry Andric 394f22ef01cSRoman Divacky unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv); 395f22ef01cSRoman Divacky 396f22ef01cSRoman Divacky // Emit an entry count so the reader can reserve space. 397f22ef01cSRoman Divacky TypeVals.push_back(TypeList.size()); 398f22ef01cSRoman Divacky Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals); 399f22ef01cSRoman Divacky TypeVals.clear(); 400f22ef01cSRoman Divacky 401f22ef01cSRoman Divacky // Loop over all of the types, emitting each in turn. 402f22ef01cSRoman Divacky for (unsigned i = 0, e = TypeList.size(); i != e; ++i) { 4036122f3e6SDimitry Andric Type *T = TypeList[i]; 404f22ef01cSRoman Divacky int AbbrevToUse = 0; 405f22ef01cSRoman Divacky unsigned Code = 0; 406f22ef01cSRoman Divacky 407f22ef01cSRoman Divacky switch (T->getTypeID()) { 408f22ef01cSRoman Divacky case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break; 409dff0c46cSDimitry Andric case Type::HalfTyID: Code = bitc::TYPE_CODE_HALF; break; 410f22ef01cSRoman Divacky case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break; 411f22ef01cSRoman Divacky case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break; 412f22ef01cSRoman Divacky case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break; 413f22ef01cSRoman Divacky case Type::FP128TyID: Code = bitc::TYPE_CODE_FP128; break; 414f22ef01cSRoman Divacky case Type::PPC_FP128TyID: Code = bitc::TYPE_CODE_PPC_FP128; break; 415f22ef01cSRoman Divacky case Type::LabelTyID: Code = bitc::TYPE_CODE_LABEL; break; 416f22ef01cSRoman Divacky case Type::MetadataTyID: Code = bitc::TYPE_CODE_METADATA; break; 4172754fe60SDimitry Andric case Type::X86_MMXTyID: Code = bitc::TYPE_CODE_X86_MMX; break; 4187d523365SDimitry Andric case Type::TokenTyID: Code = bitc::TYPE_CODE_TOKEN; break; 419f22ef01cSRoman Divacky case Type::IntegerTyID: 420f22ef01cSRoman Divacky // INTEGER: [width] 421f22ef01cSRoman Divacky Code = bitc::TYPE_CODE_INTEGER; 422f22ef01cSRoman Divacky TypeVals.push_back(cast<IntegerType>(T)->getBitWidth()); 423f22ef01cSRoman Divacky break; 424f22ef01cSRoman Divacky case Type::PointerTyID: { 4256122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(T); 426f22ef01cSRoman Divacky // POINTER: [pointee type, address space] 427f22ef01cSRoman Divacky Code = bitc::TYPE_CODE_POINTER; 428f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(PTy->getElementType())); 429f22ef01cSRoman Divacky unsigned AddressSpace = PTy->getAddressSpace(); 430f22ef01cSRoman Divacky TypeVals.push_back(AddressSpace); 431f22ef01cSRoman Divacky if (AddressSpace == 0) AbbrevToUse = PtrAbbrev; 432f22ef01cSRoman Divacky break; 433f22ef01cSRoman Divacky } 434f22ef01cSRoman Divacky case Type::FunctionTyID: { 4356122f3e6SDimitry Andric FunctionType *FT = cast<FunctionType>(T); 436dff0c46cSDimitry Andric // FUNCTION: [isvararg, retty, paramty x N] 437f22ef01cSRoman Divacky Code = bitc::TYPE_CODE_FUNCTION; 438f22ef01cSRoman Divacky TypeVals.push_back(FT->isVarArg()); 439f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(FT->getReturnType())); 440f22ef01cSRoman Divacky for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) 441f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(FT->getParamType(i))); 442f22ef01cSRoman Divacky AbbrevToUse = FunctionAbbrev; 443f22ef01cSRoman Divacky break; 444f22ef01cSRoman Divacky } 445f22ef01cSRoman Divacky case Type::StructTyID: { 4466122f3e6SDimitry Andric StructType *ST = cast<StructType>(T); 447f22ef01cSRoman Divacky // STRUCT: [ispacked, eltty x N] 448f22ef01cSRoman Divacky TypeVals.push_back(ST->isPacked()); 449f22ef01cSRoman Divacky // Output all of the element types. 450f22ef01cSRoman Divacky for (StructType::element_iterator I = ST->element_begin(), 451f22ef01cSRoman Divacky E = ST->element_end(); I != E; ++I) 452f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(*I)); 45317a519f9SDimitry Andric 4546122f3e6SDimitry Andric if (ST->isLiteral()) { 45517a519f9SDimitry Andric Code = bitc::TYPE_CODE_STRUCT_ANON; 45617a519f9SDimitry Andric AbbrevToUse = StructAnonAbbrev; 45717a519f9SDimitry Andric } else { 45817a519f9SDimitry Andric if (ST->isOpaque()) { 45917a519f9SDimitry Andric Code = bitc::TYPE_CODE_OPAQUE; 46017a519f9SDimitry Andric } else { 46117a519f9SDimitry Andric Code = bitc::TYPE_CODE_STRUCT_NAMED; 46217a519f9SDimitry Andric AbbrevToUse = StructNamedAbbrev; 46317a519f9SDimitry Andric } 46417a519f9SDimitry Andric 46517a519f9SDimitry Andric // Emit the name if it is present. 46617a519f9SDimitry Andric if (!ST->getName().empty()) 46717a519f9SDimitry Andric WriteStringRecord(bitc::TYPE_CODE_STRUCT_NAME, ST->getName(), 46817a519f9SDimitry Andric StructNameAbbrev, Stream); 46917a519f9SDimitry Andric } 470f22ef01cSRoman Divacky break; 471f22ef01cSRoman Divacky } 472f22ef01cSRoman Divacky case Type::ArrayTyID: { 4736122f3e6SDimitry Andric ArrayType *AT = cast<ArrayType>(T); 474f22ef01cSRoman Divacky // ARRAY: [numelts, eltty] 475f22ef01cSRoman Divacky Code = bitc::TYPE_CODE_ARRAY; 476f22ef01cSRoman Divacky TypeVals.push_back(AT->getNumElements()); 477f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(AT->getElementType())); 478f22ef01cSRoman Divacky AbbrevToUse = ArrayAbbrev; 479f22ef01cSRoman Divacky break; 480f22ef01cSRoman Divacky } 481f22ef01cSRoman Divacky case Type::VectorTyID: { 4826122f3e6SDimitry Andric VectorType *VT = cast<VectorType>(T); 483f22ef01cSRoman Divacky // VECTOR [numelts, eltty] 484f22ef01cSRoman Divacky Code = bitc::TYPE_CODE_VECTOR; 485f22ef01cSRoman Divacky TypeVals.push_back(VT->getNumElements()); 486f22ef01cSRoman Divacky TypeVals.push_back(VE.getTypeID(VT->getElementType())); 487f22ef01cSRoman Divacky break; 488f22ef01cSRoman Divacky } 489f22ef01cSRoman Divacky } 490f22ef01cSRoman Divacky 491f22ef01cSRoman Divacky // Emit the finished record. 492f22ef01cSRoman Divacky Stream.EmitRecord(Code, TypeVals, AbbrevToUse); 493f22ef01cSRoman Divacky TypeVals.clear(); 494f22ef01cSRoman Divacky } 495f22ef01cSRoman Divacky 496f22ef01cSRoman Divacky Stream.ExitBlock(); 497f22ef01cSRoman Divacky } 498f22ef01cSRoman Divacky 49991bc56edSDimitry Andric static unsigned getEncodedLinkage(const GlobalValue &GV) { 50091bc56edSDimitry Andric switch (GV.getLinkage()) { 50139d628a0SDimitry Andric case GlobalValue::ExternalLinkage: 50239d628a0SDimitry Andric return 0; 50339d628a0SDimitry Andric case GlobalValue::WeakAnyLinkage: 504ff0cc061SDimitry Andric return 16; 50539d628a0SDimitry Andric case GlobalValue::AppendingLinkage: 50639d628a0SDimitry Andric return 2; 50739d628a0SDimitry Andric case GlobalValue::InternalLinkage: 50839d628a0SDimitry Andric return 3; 50939d628a0SDimitry Andric case GlobalValue::LinkOnceAnyLinkage: 510ff0cc061SDimitry Andric return 18; 51139d628a0SDimitry Andric case GlobalValue::ExternalWeakLinkage: 51239d628a0SDimitry Andric return 7; 51339d628a0SDimitry Andric case GlobalValue::CommonLinkage: 51439d628a0SDimitry Andric return 8; 51539d628a0SDimitry Andric case GlobalValue::PrivateLinkage: 51639d628a0SDimitry Andric return 9; 51739d628a0SDimitry Andric case GlobalValue::WeakODRLinkage: 518ff0cc061SDimitry Andric return 17; 51939d628a0SDimitry Andric case GlobalValue::LinkOnceODRLinkage: 520ff0cc061SDimitry Andric return 19; 52139d628a0SDimitry Andric case GlobalValue::AvailableExternallyLinkage: 52239d628a0SDimitry Andric return 12; 523f22ef01cSRoman Divacky } 524dff0c46cSDimitry Andric llvm_unreachable("Invalid linkage"); 525f22ef01cSRoman Divacky } 526f22ef01cSRoman Divacky 52791bc56edSDimitry Andric static unsigned getEncodedVisibility(const GlobalValue &GV) { 52891bc56edSDimitry Andric switch (GV.getVisibility()) { 529f22ef01cSRoman Divacky case GlobalValue::DefaultVisibility: return 0; 530f22ef01cSRoman Divacky case GlobalValue::HiddenVisibility: return 1; 531f22ef01cSRoman Divacky case GlobalValue::ProtectedVisibility: return 2; 532f22ef01cSRoman Divacky } 533dff0c46cSDimitry Andric llvm_unreachable("Invalid visibility"); 534f22ef01cSRoman Divacky } 535f22ef01cSRoman Divacky 53691bc56edSDimitry Andric static unsigned getEncodedDLLStorageClass(const GlobalValue &GV) { 53791bc56edSDimitry Andric switch (GV.getDLLStorageClass()) { 53891bc56edSDimitry Andric case GlobalValue::DefaultStorageClass: return 0; 53991bc56edSDimitry Andric case GlobalValue::DLLImportStorageClass: return 1; 54091bc56edSDimitry Andric case GlobalValue::DLLExportStorageClass: return 2; 54191bc56edSDimitry Andric } 54291bc56edSDimitry Andric llvm_unreachable("Invalid DLL storage class"); 54391bc56edSDimitry Andric } 54491bc56edSDimitry Andric 54591bc56edSDimitry Andric static unsigned getEncodedThreadLocalMode(const GlobalValue &GV) { 54691bc56edSDimitry Andric switch (GV.getThreadLocalMode()) { 5477ae0e2c9SDimitry Andric case GlobalVariable::NotThreadLocal: return 0; 5487ae0e2c9SDimitry Andric case GlobalVariable::GeneralDynamicTLSModel: return 1; 5497ae0e2c9SDimitry Andric case GlobalVariable::LocalDynamicTLSModel: return 2; 5507ae0e2c9SDimitry Andric case GlobalVariable::InitialExecTLSModel: return 3; 5517ae0e2c9SDimitry Andric case GlobalVariable::LocalExecTLSModel: return 4; 5527ae0e2c9SDimitry Andric } 5537ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model"); 5547ae0e2c9SDimitry Andric } 5557ae0e2c9SDimitry Andric 55691bc56edSDimitry Andric static unsigned getEncodedComdatSelectionKind(const Comdat &C) { 55791bc56edSDimitry Andric switch (C.getSelectionKind()) { 55891bc56edSDimitry Andric case Comdat::Any: 55991bc56edSDimitry Andric return bitc::COMDAT_SELECTION_KIND_ANY; 56091bc56edSDimitry Andric case Comdat::ExactMatch: 56191bc56edSDimitry Andric return bitc::COMDAT_SELECTION_KIND_EXACT_MATCH; 56291bc56edSDimitry Andric case Comdat::Largest: 56391bc56edSDimitry Andric return bitc::COMDAT_SELECTION_KIND_LARGEST; 56491bc56edSDimitry Andric case Comdat::NoDuplicates: 56591bc56edSDimitry Andric return bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES; 56691bc56edSDimitry Andric case Comdat::SameSize: 56791bc56edSDimitry Andric return bitc::COMDAT_SELECTION_KIND_SAME_SIZE; 56891bc56edSDimitry Andric } 56991bc56edSDimitry Andric llvm_unreachable("Invalid selection kind"); 57091bc56edSDimitry Andric } 57191bc56edSDimitry Andric 57291bc56edSDimitry Andric static void writeComdats(const ValueEnumerator &VE, BitstreamWriter &Stream) { 573ff0cc061SDimitry Andric SmallVector<uint16_t, 64> Vals; 57491bc56edSDimitry Andric for (const Comdat *C : VE.getComdats()) { 57591bc56edSDimitry Andric // COMDAT: [selection_kind, name] 57691bc56edSDimitry Andric Vals.push_back(getEncodedComdatSelectionKind(*C)); 577ff0cc061SDimitry Andric size_t Size = C->getName().size(); 578ff0cc061SDimitry Andric assert(isUInt<16>(Size)); 579ff0cc061SDimitry Andric Vals.push_back(Size); 58091bc56edSDimitry Andric for (char Chr : C->getName()) 58191bc56edSDimitry Andric Vals.push_back((unsigned char)Chr); 58291bc56edSDimitry Andric Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0); 58391bc56edSDimitry Andric Vals.clear(); 58491bc56edSDimitry Andric } 58591bc56edSDimitry Andric } 58691bc56edSDimitry Andric 5877d523365SDimitry Andric /// Write a record that will eventually hold the word offset of the 5887d523365SDimitry Andric /// module-level VST. For now the offset is 0, which will be backpatched 5897d523365SDimitry Andric /// after the real VST is written. Returns the bit offset to backpatch. 5907d523365SDimitry Andric static uint64_t WriteValueSymbolTableForwardDecl(const ValueSymbolTable &VST, 5917d523365SDimitry Andric BitstreamWriter &Stream) { 5927d523365SDimitry Andric if (VST.empty()) 5937d523365SDimitry Andric return 0; 5947d523365SDimitry Andric 5957d523365SDimitry Andric // Write a placeholder value in for the offset of the real VST, 5967d523365SDimitry Andric // which is written after the function blocks so that it can include 5977d523365SDimitry Andric // the offset of each function. The placeholder offset will be 5987d523365SDimitry Andric // updated when the real VST is written. 5997d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 6007d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_VSTOFFSET)); 6017d523365SDimitry Andric // Blocks are 32-bit aligned, so we can use a 32-bit word offset to 6027d523365SDimitry Andric // hold the real VST offset. Must use fixed instead of VBR as we don't 6037d523365SDimitry Andric // know how many VBR chunks to reserve ahead of time. 6047d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 6057d523365SDimitry Andric unsigned VSTOffsetAbbrev = Stream.EmitAbbrev(Abbv); 6067d523365SDimitry Andric 6077d523365SDimitry Andric // Emit the placeholder 6087d523365SDimitry Andric uint64_t Vals[] = {bitc::MODULE_CODE_VSTOFFSET, 0}; 6097d523365SDimitry Andric Stream.EmitRecordWithAbbrev(VSTOffsetAbbrev, Vals); 6107d523365SDimitry Andric 6117d523365SDimitry Andric // Compute and return the bit offset to the placeholder, which will be 6127d523365SDimitry Andric // patched when the real VST is written. We can simply subtract the 32-bit 6137d523365SDimitry Andric // fixed size from the current bit number to get the location to backpatch. 6147d523365SDimitry Andric return Stream.GetCurrentBitNo() - 32; 6157d523365SDimitry Andric } 6167d523365SDimitry Andric 6177d523365SDimitry Andric /// Emit top-level description of module, including target triple, inline asm, 6187d523365SDimitry Andric /// descriptors for global variables, and function prototype info. 6197d523365SDimitry Andric /// Returns the bit offset to backpatch with the location of the real VST. 6207d523365SDimitry Andric static uint64_t WriteModuleInfo(const Module *M, const ValueEnumerator &VE, 621f22ef01cSRoman Divacky BitstreamWriter &Stream) { 622f22ef01cSRoman Divacky // Emit various pieces of data attached to a module. 623f22ef01cSRoman Divacky if (!M->getTargetTriple().empty()) 624f22ef01cSRoman Divacky WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), 625f22ef01cSRoman Divacky 0/*TODO*/, Stream); 62691bc56edSDimitry Andric const std::string &DL = M->getDataLayoutStr(); 62791bc56edSDimitry Andric if (!DL.empty()) 62891bc56edSDimitry Andric WriteStringRecord(bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/, Stream); 629f22ef01cSRoman Divacky if (!M->getModuleInlineAsm().empty()) 630f22ef01cSRoman Divacky WriteStringRecord(bitc::MODULE_CODE_ASM, M->getModuleInlineAsm(), 631f22ef01cSRoman Divacky 0/*TODO*/, Stream); 632f22ef01cSRoman Divacky 633f22ef01cSRoman Divacky // Emit information about sections and GC, computing how many there are. Also 634f22ef01cSRoman Divacky // compute the maximum alignment value. 635f22ef01cSRoman Divacky std::map<std::string, unsigned> SectionMap; 636f22ef01cSRoman Divacky std::map<std::string, unsigned> GCMap; 637f22ef01cSRoman Divacky unsigned MaxAlignment = 0; 638f22ef01cSRoman Divacky unsigned MaxGlobalType = 0; 63991bc56edSDimitry Andric for (const GlobalValue &GV : M->globals()) { 64091bc56edSDimitry Andric MaxAlignment = std::max(MaxAlignment, GV.getAlignment()); 641ff0cc061SDimitry Andric MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getValueType())); 64291bc56edSDimitry Andric if (GV.hasSection()) { 643f22ef01cSRoman Divacky // Give section names unique ID's. 64491bc56edSDimitry Andric unsigned &Entry = SectionMap[GV.getSection()]; 6456122f3e6SDimitry Andric if (!Entry) { 64691bc56edSDimitry Andric WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV.getSection(), 647f22ef01cSRoman Divacky 0/*TODO*/, Stream); 648f22ef01cSRoman Divacky Entry = SectionMap.size(); 649f22ef01cSRoman Divacky } 6506122f3e6SDimitry Andric } 6516122f3e6SDimitry Andric } 65291bc56edSDimitry Andric for (const Function &F : *M) { 65391bc56edSDimitry Andric MaxAlignment = std::max(MaxAlignment, F.getAlignment()); 65491bc56edSDimitry Andric if (F.hasSection()) { 655f22ef01cSRoman Divacky // Give section names unique ID's. 65691bc56edSDimitry Andric unsigned &Entry = SectionMap[F.getSection()]; 657f22ef01cSRoman Divacky if (!Entry) { 65891bc56edSDimitry Andric WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F.getSection(), 659f22ef01cSRoman Divacky 0/*TODO*/, Stream); 660f22ef01cSRoman Divacky Entry = SectionMap.size(); 661f22ef01cSRoman Divacky } 662f22ef01cSRoman Divacky } 66391bc56edSDimitry Andric if (F.hasGC()) { 664f22ef01cSRoman Divacky // Same for GC names. 66591bc56edSDimitry Andric unsigned &Entry = GCMap[F.getGC()]; 666f22ef01cSRoman Divacky if (!Entry) { 66791bc56edSDimitry Andric WriteStringRecord(bitc::MODULE_CODE_GCNAME, F.getGC(), 668f22ef01cSRoman Divacky 0/*TODO*/, Stream); 669f22ef01cSRoman Divacky Entry = GCMap.size(); 670f22ef01cSRoman Divacky } 671f22ef01cSRoman Divacky } 672f22ef01cSRoman Divacky } 673f22ef01cSRoman Divacky 674f22ef01cSRoman Divacky // Emit abbrev for globals, now that we know # sections and max alignment. 675f22ef01cSRoman Divacky unsigned SimpleGVarAbbrev = 0; 676f22ef01cSRoman Divacky if (!M->global_empty()) { 677f22ef01cSRoman Divacky // Add an abbrev for common globals with no visibility or thread localness. 678f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 679f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR)); 680f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 681f22ef01cSRoman Divacky Log2_32_Ceil(MaxGlobalType+1))); 682ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddrSpace << 2 683ff0cc061SDimitry Andric //| explicitType << 1 684ff0cc061SDimitry Andric //| constant 685f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. 686ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage. 687f22ef01cSRoman Divacky if (MaxAlignment == 0) // Alignment. 688f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(0)); 689f22ef01cSRoman Divacky else { 690f22ef01cSRoman Divacky unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; 691f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 692f22ef01cSRoman Divacky Log2_32_Ceil(MaxEncAlignment+1))); 693f22ef01cSRoman Divacky } 694f22ef01cSRoman Divacky if (SectionMap.empty()) // Section. 695f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(0)); 696f22ef01cSRoman Divacky else 697f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 698f22ef01cSRoman Divacky Log2_32_Ceil(SectionMap.size()+1))); 699f22ef01cSRoman Divacky // Don't bother emitting vis + thread local. 700f22ef01cSRoman Divacky SimpleGVarAbbrev = Stream.EmitAbbrev(Abbv); 701f22ef01cSRoman Divacky } 702f22ef01cSRoman Divacky 703f22ef01cSRoman Divacky // Emit the global variable information. 704f22ef01cSRoman Divacky SmallVector<unsigned, 64> Vals; 70591bc56edSDimitry Andric for (const GlobalVariable &GV : M->globals()) { 706f22ef01cSRoman Divacky unsigned AbbrevToUse = 0; 707f22ef01cSRoman Divacky 708f22ef01cSRoman Divacky // GLOBALVAR: [type, isconst, initid, 7092754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 710ff0cc061SDimitry Andric // unnamed_addr, externally_initialized, dllstorageclass, 711ff0cc061SDimitry Andric // comdat] 712ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(GV.getValueType())); 713ff0cc061SDimitry Andric Vals.push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant()); 71491bc56edSDimitry Andric Vals.push_back(GV.isDeclaration() ? 0 : 71591bc56edSDimitry Andric (VE.getValueID(GV.getInitializer()) + 1)); 716f22ef01cSRoman Divacky Vals.push_back(getEncodedLinkage(GV)); 71791bc56edSDimitry Andric Vals.push_back(Log2_32(GV.getAlignment())+1); 71891bc56edSDimitry Andric Vals.push_back(GV.hasSection() ? SectionMap[GV.getSection()] : 0); 71991bc56edSDimitry Andric if (GV.isThreadLocal() || 72091bc56edSDimitry Andric GV.getVisibility() != GlobalValue::DefaultVisibility || 72191bc56edSDimitry Andric GV.hasUnnamedAddr() || GV.isExternallyInitialized() || 72291bc56edSDimitry Andric GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass || 72391bc56edSDimitry Andric GV.hasComdat()) { 724f22ef01cSRoman Divacky Vals.push_back(getEncodedVisibility(GV)); 7257ae0e2c9SDimitry Andric Vals.push_back(getEncodedThreadLocalMode(GV)); 72691bc56edSDimitry Andric Vals.push_back(GV.hasUnnamedAddr()); 72791bc56edSDimitry Andric Vals.push_back(GV.isExternallyInitialized()); 72891bc56edSDimitry Andric Vals.push_back(getEncodedDLLStorageClass(GV)); 72991bc56edSDimitry Andric Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0); 730f22ef01cSRoman Divacky } else { 731f22ef01cSRoman Divacky AbbrevToUse = SimpleGVarAbbrev; 732f22ef01cSRoman Divacky } 733f22ef01cSRoman Divacky 734f22ef01cSRoman Divacky Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse); 735f22ef01cSRoman Divacky Vals.clear(); 736f22ef01cSRoman Divacky } 737f22ef01cSRoman Divacky 738f22ef01cSRoman Divacky // Emit the function proto information. 73991bc56edSDimitry Andric for (const Function &F : *M) { 740dff0c46cSDimitry Andric // FUNCTION: [type, callingconv, isproto, linkage, paramattrs, alignment, 74139d628a0SDimitry Andric // section, visibility, gc, unnamed_addr, prologuedata, 7428f0fd8f6SDimitry Andric // dllstorageclass, comdat, prefixdata, personalityfn] 743ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(F.getFunctionType())); 74491bc56edSDimitry Andric Vals.push_back(F.getCallingConv()); 74591bc56edSDimitry Andric Vals.push_back(F.isDeclaration()); 746f22ef01cSRoman Divacky Vals.push_back(getEncodedLinkage(F)); 74791bc56edSDimitry Andric Vals.push_back(VE.getAttributeID(F.getAttributes())); 74891bc56edSDimitry Andric Vals.push_back(Log2_32(F.getAlignment())+1); 74991bc56edSDimitry Andric Vals.push_back(F.hasSection() ? SectionMap[F.getSection()] : 0); 750f22ef01cSRoman Divacky Vals.push_back(getEncodedVisibility(F)); 75191bc56edSDimitry Andric Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0); 75291bc56edSDimitry Andric Vals.push_back(F.hasUnnamedAddr()); 75339d628a0SDimitry Andric Vals.push_back(F.hasPrologueData() ? (VE.getValueID(F.getPrologueData()) + 1) 754f785676fSDimitry Andric : 0); 75591bc56edSDimitry Andric Vals.push_back(getEncodedDLLStorageClass(F)); 75691bc56edSDimitry Andric Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0); 75739d628a0SDimitry Andric Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1) 75839d628a0SDimitry Andric : 0); 7598f0fd8f6SDimitry Andric Vals.push_back( 7608f0fd8f6SDimitry Andric F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0); 761f22ef01cSRoman Divacky 762f22ef01cSRoman Divacky unsigned AbbrevToUse = 0; 763f22ef01cSRoman Divacky Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse); 764f22ef01cSRoman Divacky Vals.clear(); 765f22ef01cSRoman Divacky } 766f22ef01cSRoman Divacky 767f22ef01cSRoman Divacky // Emit the alias information. 76891bc56edSDimitry Andric for (const GlobalAlias &A : M->aliases()) { 769dff0c46cSDimitry Andric // ALIAS: [alias type, aliasee val#, linkage, visibility] 7707d523365SDimitry Andric Vals.push_back(VE.getTypeID(A.getValueType())); 7717d523365SDimitry Andric Vals.push_back(A.getType()->getAddressSpace()); 77291bc56edSDimitry Andric Vals.push_back(VE.getValueID(A.getAliasee())); 77391bc56edSDimitry Andric Vals.push_back(getEncodedLinkage(A)); 77491bc56edSDimitry Andric Vals.push_back(getEncodedVisibility(A)); 77591bc56edSDimitry Andric Vals.push_back(getEncodedDLLStorageClass(A)); 77691bc56edSDimitry Andric Vals.push_back(getEncodedThreadLocalMode(A)); 77791bc56edSDimitry Andric Vals.push_back(A.hasUnnamedAddr()); 778f22ef01cSRoman Divacky unsigned AbbrevToUse = 0; 779f22ef01cSRoman Divacky Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); 780f22ef01cSRoman Divacky Vals.clear(); 781f22ef01cSRoman Divacky } 7827d523365SDimitry Andric 7837d523365SDimitry Andric // Write a record indicating the number of module-level metadata IDs 7847d523365SDimitry Andric // This is needed because the ids of metadata are assigned implicitly 7857d523365SDimitry Andric // based on their ordering in the bitcode, with the function-level 7867d523365SDimitry Andric // metadata ids starting after the module-level metadata ids. For 7877d523365SDimitry Andric // function importing where we lazy load the metadata as a postpass, 7887d523365SDimitry Andric // we want to avoid parsing the module-level metadata before parsing 7897d523365SDimitry Andric // the imported functions. 7907d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 7917d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_METADATA_VALUES)); 7927d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 7937d523365SDimitry Andric unsigned MDValsAbbrev = Stream.EmitAbbrev(Abbv); 7947d523365SDimitry Andric Vals.push_back(VE.numMDs()); 7957d523365SDimitry Andric Stream.EmitRecord(bitc::MODULE_CODE_METADATA_VALUES, Vals, MDValsAbbrev); 7967d523365SDimitry Andric Vals.clear(); 7977d523365SDimitry Andric 7987d523365SDimitry Andric uint64_t VSTOffsetPlaceholder = 7997d523365SDimitry Andric WriteValueSymbolTableForwardDecl(M->getValueSymbolTable(), Stream); 8007d523365SDimitry Andric return VSTOffsetPlaceholder; 801f22ef01cSRoman Divacky } 802f22ef01cSRoman Divacky 803f22ef01cSRoman Divacky static uint64_t GetOptimizationFlags(const Value *V) { 804f22ef01cSRoman Divacky uint64_t Flags = 0; 805f22ef01cSRoman Divacky 80639d628a0SDimitry Andric if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) { 807f22ef01cSRoman Divacky if (OBO->hasNoSignedWrap()) 808f22ef01cSRoman Divacky Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP; 809f22ef01cSRoman Divacky if (OBO->hasNoUnsignedWrap()) 810f22ef01cSRoman Divacky Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP; 81139d628a0SDimitry Andric } else if (const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) { 8122754fe60SDimitry Andric if (PEO->isExact()) 8132754fe60SDimitry Andric Flags |= 1 << bitc::PEO_EXACT; 81439d628a0SDimitry Andric } else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) { 815139f7f9bSDimitry Andric if (FPMO->hasUnsafeAlgebra()) 816139f7f9bSDimitry Andric Flags |= FastMathFlags::UnsafeAlgebra; 817139f7f9bSDimitry Andric if (FPMO->hasNoNaNs()) 818139f7f9bSDimitry Andric Flags |= FastMathFlags::NoNaNs; 819139f7f9bSDimitry Andric if (FPMO->hasNoInfs()) 820139f7f9bSDimitry Andric Flags |= FastMathFlags::NoInfs; 821139f7f9bSDimitry Andric if (FPMO->hasNoSignedZeros()) 822139f7f9bSDimitry Andric Flags |= FastMathFlags::NoSignedZeros; 823139f7f9bSDimitry Andric if (FPMO->hasAllowReciprocal()) 824139f7f9bSDimitry Andric Flags |= FastMathFlags::AllowReciprocal; 825f22ef01cSRoman Divacky } 826f22ef01cSRoman Divacky 827f22ef01cSRoman Divacky return Flags; 828f22ef01cSRoman Divacky } 829f22ef01cSRoman Divacky 83039d628a0SDimitry Andric static void WriteValueAsMetadata(const ValueAsMetadata *MD, 83139d628a0SDimitry Andric const ValueEnumerator &VE, 83239d628a0SDimitry Andric BitstreamWriter &Stream, 83339d628a0SDimitry Andric SmallVectorImpl<uint64_t> &Record) { 83439d628a0SDimitry Andric // Mimic an MDNode with a value as one operand. 83539d628a0SDimitry Andric Value *V = MD->getValue(); 83639d628a0SDimitry Andric Record.push_back(VE.getTypeID(V->getType())); 83739d628a0SDimitry Andric Record.push_back(VE.getValueID(V)); 83839d628a0SDimitry Andric Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0); 83939d628a0SDimitry Andric Record.clear(); 84039d628a0SDimitry Andric } 84139d628a0SDimitry Andric 842ff0cc061SDimitry Andric static void WriteMDTuple(const MDTuple *N, const ValueEnumerator &VE, 843f22ef01cSRoman Divacky BitstreamWriter &Stream, 844ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { 845f22ef01cSRoman Divacky for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 84639d628a0SDimitry Andric Metadata *MD = N->getOperand(i); 847ff0cc061SDimitry Andric assert(!(MD && isa<LocalAsMetadata>(MD)) && 848ff0cc061SDimitry Andric "Unexpected function-local metadata"); 849ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(MD)); 850f22ef01cSRoman Divacky } 85139d628a0SDimitry Andric Stream.EmitRecord(N->isDistinct() ? bitc::METADATA_DISTINCT_NODE 85239d628a0SDimitry Andric : bitc::METADATA_NODE, 853ff0cc061SDimitry Andric Record, Abbrev); 85439d628a0SDimitry Andric Record.clear(); 85539d628a0SDimitry Andric } 85639d628a0SDimitry Andric 857ff0cc061SDimitry Andric static void WriteDILocation(const DILocation *N, const ValueEnumerator &VE, 85839d628a0SDimitry Andric BitstreamWriter &Stream, 85939d628a0SDimitry Andric SmallVectorImpl<uint64_t> &Record, 86039d628a0SDimitry Andric unsigned Abbrev) { 86139d628a0SDimitry Andric Record.push_back(N->isDistinct()); 86239d628a0SDimitry Andric Record.push_back(N->getLine()); 86339d628a0SDimitry Andric Record.push_back(N->getColumn()); 86439d628a0SDimitry Andric Record.push_back(VE.getMetadataID(N->getScope())); 865ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt())); 86639d628a0SDimitry Andric 86739d628a0SDimitry Andric Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev); 868f22ef01cSRoman Divacky Record.clear(); 869f22ef01cSRoman Divacky } 870f22ef01cSRoman Divacky 871ff0cc061SDimitry Andric static void WriteGenericDINode(const GenericDINode *N, 872ff0cc061SDimitry Andric const ValueEnumerator &VE, 873ff0cc061SDimitry Andric BitstreamWriter &Stream, 874ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 875ff0cc061SDimitry Andric unsigned Abbrev) { 876ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 877ff0cc061SDimitry Andric Record.push_back(N->getTag()); 878ff0cc061SDimitry Andric Record.push_back(0); // Per-tag version field; unused for now. 879ff0cc061SDimitry Andric 880ff0cc061SDimitry Andric for (auto &I : N->operands()) 881ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(I)); 882ff0cc061SDimitry Andric 883ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_GENERIC_DEBUG, Record, Abbrev); 884ff0cc061SDimitry Andric Record.clear(); 885ff0cc061SDimitry Andric } 886ff0cc061SDimitry Andric 887ff0cc061SDimitry Andric static uint64_t rotateSign(int64_t I) { 888ff0cc061SDimitry Andric uint64_t U = I; 889ff0cc061SDimitry Andric return I < 0 ? ~(U << 1) : U << 1; 890ff0cc061SDimitry Andric } 891ff0cc061SDimitry Andric 892ff0cc061SDimitry Andric static void WriteDISubrange(const DISubrange *N, const ValueEnumerator &, 893ff0cc061SDimitry Andric BitstreamWriter &Stream, 894ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 895ff0cc061SDimitry Andric unsigned Abbrev) { 896ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 897ff0cc061SDimitry Andric Record.push_back(N->getCount()); 898ff0cc061SDimitry Andric Record.push_back(rotateSign(N->getLowerBound())); 899ff0cc061SDimitry Andric 900ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_SUBRANGE, Record, Abbrev); 901ff0cc061SDimitry Andric Record.clear(); 902ff0cc061SDimitry Andric } 903ff0cc061SDimitry Andric 904ff0cc061SDimitry Andric static void WriteDIEnumerator(const DIEnumerator *N, const ValueEnumerator &VE, 905ff0cc061SDimitry Andric BitstreamWriter &Stream, 906ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 907ff0cc061SDimitry Andric unsigned Abbrev) { 908ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 909ff0cc061SDimitry Andric Record.push_back(rotateSign(N->getValue())); 910ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 911ff0cc061SDimitry Andric 912ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_ENUMERATOR, Record, Abbrev); 913ff0cc061SDimitry Andric Record.clear(); 914ff0cc061SDimitry Andric } 915ff0cc061SDimitry Andric 916ff0cc061SDimitry Andric static void WriteDIBasicType(const DIBasicType *N, const ValueEnumerator &VE, 917ff0cc061SDimitry Andric BitstreamWriter &Stream, 918ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 919ff0cc061SDimitry Andric unsigned Abbrev) { 920ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 921ff0cc061SDimitry Andric Record.push_back(N->getTag()); 922ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 923ff0cc061SDimitry Andric Record.push_back(N->getSizeInBits()); 924ff0cc061SDimitry Andric Record.push_back(N->getAlignInBits()); 925ff0cc061SDimitry Andric Record.push_back(N->getEncoding()); 926ff0cc061SDimitry Andric 927ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev); 928ff0cc061SDimitry Andric Record.clear(); 929ff0cc061SDimitry Andric } 930ff0cc061SDimitry Andric 931ff0cc061SDimitry Andric static void WriteDIDerivedType(const DIDerivedType *N, 932ff0cc061SDimitry Andric const ValueEnumerator &VE, 933ff0cc061SDimitry Andric BitstreamWriter &Stream, 934ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 935ff0cc061SDimitry Andric unsigned Abbrev) { 936ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 937ff0cc061SDimitry Andric Record.push_back(N->getTag()); 938ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 939ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 940ff0cc061SDimitry Andric Record.push_back(N->getLine()); 941ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 942ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); 943ff0cc061SDimitry Andric Record.push_back(N->getSizeInBits()); 944ff0cc061SDimitry Andric Record.push_back(N->getAlignInBits()); 945ff0cc061SDimitry Andric Record.push_back(N->getOffsetInBits()); 946ff0cc061SDimitry Andric Record.push_back(N->getFlags()); 947ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getExtraData())); 948ff0cc061SDimitry Andric 949ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev); 950ff0cc061SDimitry Andric Record.clear(); 951ff0cc061SDimitry Andric } 952ff0cc061SDimitry Andric 953ff0cc061SDimitry Andric static void WriteDICompositeType(const DICompositeType *N, 954ff0cc061SDimitry Andric const ValueEnumerator &VE, 955ff0cc061SDimitry Andric BitstreamWriter &Stream, 956ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 957ff0cc061SDimitry Andric unsigned Abbrev) { 958ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 959ff0cc061SDimitry Andric Record.push_back(N->getTag()); 960ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 961ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 962ff0cc061SDimitry Andric Record.push_back(N->getLine()); 963ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 964ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); 965ff0cc061SDimitry Andric Record.push_back(N->getSizeInBits()); 966ff0cc061SDimitry Andric Record.push_back(N->getAlignInBits()); 967ff0cc061SDimitry Andric Record.push_back(N->getOffsetInBits()); 968ff0cc061SDimitry Andric Record.push_back(N->getFlags()); 969ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getElements().get())); 970ff0cc061SDimitry Andric Record.push_back(N->getRuntimeLang()); 971ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder())); 972ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get())); 973ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier())); 974ff0cc061SDimitry Andric 975ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev); 976ff0cc061SDimitry Andric Record.clear(); 977ff0cc061SDimitry Andric } 978ff0cc061SDimitry Andric 979ff0cc061SDimitry Andric static void WriteDISubroutineType(const DISubroutineType *N, 980ff0cc061SDimitry Andric const ValueEnumerator &VE, 981ff0cc061SDimitry Andric BitstreamWriter &Stream, 982ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 983ff0cc061SDimitry Andric unsigned Abbrev) { 984ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 985ff0cc061SDimitry Andric Record.push_back(N->getFlags()); 986ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get())); 987ff0cc061SDimitry Andric 988ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev); 989ff0cc061SDimitry Andric Record.clear(); 990ff0cc061SDimitry Andric } 991ff0cc061SDimitry Andric 992ff0cc061SDimitry Andric static void WriteDIFile(const DIFile *N, const ValueEnumerator &VE, 993ff0cc061SDimitry Andric BitstreamWriter &Stream, 994ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { 995ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 996ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawFilename())); 997ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory())); 998ff0cc061SDimitry Andric 999ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev); 1000ff0cc061SDimitry Andric Record.clear(); 1001ff0cc061SDimitry Andric } 1002ff0cc061SDimitry Andric 1003ff0cc061SDimitry Andric static void WriteDICompileUnit(const DICompileUnit *N, 1004ff0cc061SDimitry Andric const ValueEnumerator &VE, 1005ff0cc061SDimitry Andric BitstreamWriter &Stream, 1006ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1007ff0cc061SDimitry Andric unsigned Abbrev) { 10087d523365SDimitry Andric assert(N->isDistinct() && "Expected distinct compile units"); 10097d523365SDimitry Andric Record.push_back(/* IsDistinct */ true); 1010ff0cc061SDimitry Andric Record.push_back(N->getSourceLanguage()); 1011ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1012ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawProducer())); 1013ff0cc061SDimitry Andric Record.push_back(N->isOptimized()); 1014ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawFlags())); 1015ff0cc061SDimitry Andric Record.push_back(N->getRuntimeVersion()); 1016ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawSplitDebugFilename())); 1017ff0cc061SDimitry Andric Record.push_back(N->getEmissionKind()); 1018ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get())); 1019ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get())); 1020ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getSubprograms().get())); 1021ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get())); 1022ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get())); 1023ff0cc061SDimitry Andric Record.push_back(N->getDWOId()); 10247d523365SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getMacros().get())); 1025ff0cc061SDimitry Andric 1026ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev); 1027ff0cc061SDimitry Andric Record.clear(); 1028ff0cc061SDimitry Andric } 1029ff0cc061SDimitry Andric 1030ff0cc061SDimitry Andric static void WriteDISubprogram(const DISubprogram *N, const ValueEnumerator &VE, 1031ff0cc061SDimitry Andric BitstreamWriter &Stream, 1032ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1033ff0cc061SDimitry Andric unsigned Abbrev) { 1034ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1035ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1036ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1037ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName())); 1038ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1039ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1040ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1041ff0cc061SDimitry Andric Record.push_back(N->isLocalToUnit()); 1042ff0cc061SDimitry Andric Record.push_back(N->isDefinition()); 1043ff0cc061SDimitry Andric Record.push_back(N->getScopeLine()); 1044ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getContainingType())); 1045ff0cc061SDimitry Andric Record.push_back(N->getVirtuality()); 1046ff0cc061SDimitry Andric Record.push_back(N->getVirtualIndex()); 1047ff0cc061SDimitry Andric Record.push_back(N->getFlags()); 1048ff0cc061SDimitry Andric Record.push_back(N->isOptimized()); 1049ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get())); 1050ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getDeclaration())); 1051ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getVariables().get())); 1052ff0cc061SDimitry Andric 1053ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev); 1054ff0cc061SDimitry Andric Record.clear(); 1055ff0cc061SDimitry Andric } 1056ff0cc061SDimitry Andric 1057ff0cc061SDimitry Andric static void WriteDILexicalBlock(const DILexicalBlock *N, 1058ff0cc061SDimitry Andric const ValueEnumerator &VE, 1059ff0cc061SDimitry Andric BitstreamWriter &Stream, 1060ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1061ff0cc061SDimitry Andric unsigned Abbrev) { 1062ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1063ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1064ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1065ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1066ff0cc061SDimitry Andric Record.push_back(N->getColumn()); 1067ff0cc061SDimitry Andric 1068ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK, Record, Abbrev); 1069ff0cc061SDimitry Andric Record.clear(); 1070ff0cc061SDimitry Andric } 1071ff0cc061SDimitry Andric 1072ff0cc061SDimitry Andric static void WriteDILexicalBlockFile(const DILexicalBlockFile *N, 1073ff0cc061SDimitry Andric const ValueEnumerator &VE, 1074ff0cc061SDimitry Andric BitstreamWriter &Stream, 1075ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1076ff0cc061SDimitry Andric unsigned Abbrev) { 1077ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1078ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1079ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1080ff0cc061SDimitry Andric Record.push_back(N->getDiscriminator()); 1081ff0cc061SDimitry Andric 1082ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK_FILE, Record, Abbrev); 1083ff0cc061SDimitry Andric Record.clear(); 1084ff0cc061SDimitry Andric } 1085ff0cc061SDimitry Andric 1086ff0cc061SDimitry Andric static void WriteDINamespace(const DINamespace *N, const ValueEnumerator &VE, 1087ff0cc061SDimitry Andric BitstreamWriter &Stream, 1088ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1089ff0cc061SDimitry Andric unsigned Abbrev) { 1090ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1091ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1092ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1093ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1094ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1095ff0cc061SDimitry Andric 1096ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_NAMESPACE, Record, Abbrev); 1097ff0cc061SDimitry Andric Record.clear(); 1098ff0cc061SDimitry Andric } 1099ff0cc061SDimitry Andric 11007d523365SDimitry Andric static void WriteDIMacro(const DIMacro *N, const ValueEnumerator &VE, 11017d523365SDimitry Andric BitstreamWriter &Stream, 11027d523365SDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { 11037d523365SDimitry Andric Record.push_back(N->isDistinct()); 11047d523365SDimitry Andric Record.push_back(N->getMacinfoType()); 11057d523365SDimitry Andric Record.push_back(N->getLine()); 11067d523365SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 11077d523365SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawValue())); 11087d523365SDimitry Andric 11097d523365SDimitry Andric Stream.EmitRecord(bitc::METADATA_MACRO, Record, Abbrev); 11107d523365SDimitry Andric Record.clear(); 11117d523365SDimitry Andric } 11127d523365SDimitry Andric 11137d523365SDimitry Andric static void WriteDIMacroFile(const DIMacroFile *N, const ValueEnumerator &VE, 11147d523365SDimitry Andric BitstreamWriter &Stream, 11157d523365SDimitry Andric SmallVectorImpl<uint64_t> &Record, 11167d523365SDimitry Andric unsigned Abbrev) { 11177d523365SDimitry Andric Record.push_back(N->isDistinct()); 11187d523365SDimitry Andric Record.push_back(N->getMacinfoType()); 11197d523365SDimitry Andric Record.push_back(N->getLine()); 11207d523365SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 11217d523365SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getElements().get())); 11227d523365SDimitry Andric 11237d523365SDimitry Andric Stream.EmitRecord(bitc::METADATA_MACRO_FILE, Record, Abbrev); 11247d523365SDimitry Andric Record.clear(); 11257d523365SDimitry Andric } 11267d523365SDimitry Andric 11273dac3a9bSDimitry Andric static void WriteDIModule(const DIModule *N, const ValueEnumerator &VE, 11283dac3a9bSDimitry Andric BitstreamWriter &Stream, 11293dac3a9bSDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { 11303dac3a9bSDimitry Andric Record.push_back(N->isDistinct()); 11313dac3a9bSDimitry Andric for (auto &I : N->operands()) 11323dac3a9bSDimitry Andric Record.push_back(VE.getMetadataOrNullID(I)); 11333dac3a9bSDimitry Andric 11343dac3a9bSDimitry Andric Stream.EmitRecord(bitc::METADATA_MODULE, Record, Abbrev); 11353dac3a9bSDimitry Andric Record.clear(); 11363dac3a9bSDimitry Andric } 11373dac3a9bSDimitry Andric 1138ff0cc061SDimitry Andric static void WriteDITemplateTypeParameter(const DITemplateTypeParameter *N, 1139ff0cc061SDimitry Andric const ValueEnumerator &VE, 1140ff0cc061SDimitry Andric BitstreamWriter &Stream, 1141ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1142ff0cc061SDimitry Andric unsigned Abbrev) { 1143ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1144ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1145ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1146ff0cc061SDimitry Andric 1147ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_TEMPLATE_TYPE, Record, Abbrev); 1148ff0cc061SDimitry Andric Record.clear(); 1149ff0cc061SDimitry Andric } 1150ff0cc061SDimitry Andric 1151ff0cc061SDimitry Andric static void WriteDITemplateValueParameter(const DITemplateValueParameter *N, 1152ff0cc061SDimitry Andric const ValueEnumerator &VE, 1153ff0cc061SDimitry Andric BitstreamWriter &Stream, 1154ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1155ff0cc061SDimitry Andric unsigned Abbrev) { 1156ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1157ff0cc061SDimitry Andric Record.push_back(N->getTag()); 1158ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1159ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1160ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getValue())); 1161ff0cc061SDimitry Andric 1162ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_TEMPLATE_VALUE, Record, Abbrev); 1163ff0cc061SDimitry Andric Record.clear(); 1164ff0cc061SDimitry Andric } 1165ff0cc061SDimitry Andric 1166ff0cc061SDimitry Andric static void WriteDIGlobalVariable(const DIGlobalVariable *N, 1167ff0cc061SDimitry Andric const ValueEnumerator &VE, 1168ff0cc061SDimitry Andric BitstreamWriter &Stream, 1169ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1170ff0cc061SDimitry Andric unsigned Abbrev) { 1171ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1172ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1173ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1174ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName())); 1175ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1176ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1177ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1178ff0cc061SDimitry Andric Record.push_back(N->isLocalToUnit()); 1179ff0cc061SDimitry Andric Record.push_back(N->isDefinition()); 1180ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawVariable())); 1181ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration())); 1182ff0cc061SDimitry Andric 1183ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev); 1184ff0cc061SDimitry Andric Record.clear(); 1185ff0cc061SDimitry Andric } 1186ff0cc061SDimitry Andric 1187ff0cc061SDimitry Andric static void WriteDILocalVariable(const DILocalVariable *N, 1188ff0cc061SDimitry Andric const ValueEnumerator &VE, 1189ff0cc061SDimitry Andric BitstreamWriter &Stream, 1190ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1191ff0cc061SDimitry Andric unsigned Abbrev) { 1192ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1193ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1194ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1195ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1196ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1197ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1198ff0cc061SDimitry Andric Record.push_back(N->getArg()); 1199ff0cc061SDimitry Andric Record.push_back(N->getFlags()); 1200ff0cc061SDimitry Andric 1201ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev); 1202ff0cc061SDimitry Andric Record.clear(); 1203ff0cc061SDimitry Andric } 1204ff0cc061SDimitry Andric 1205ff0cc061SDimitry Andric static void WriteDIExpression(const DIExpression *N, const ValueEnumerator &, 1206ff0cc061SDimitry Andric BitstreamWriter &Stream, 1207ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1208ff0cc061SDimitry Andric unsigned Abbrev) { 1209ff0cc061SDimitry Andric Record.reserve(N->getElements().size() + 1); 1210ff0cc061SDimitry Andric 1211ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1212ff0cc061SDimitry Andric Record.append(N->elements_begin(), N->elements_end()); 1213ff0cc061SDimitry Andric 1214ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev); 1215ff0cc061SDimitry Andric Record.clear(); 1216ff0cc061SDimitry Andric } 1217ff0cc061SDimitry Andric 1218ff0cc061SDimitry Andric static void WriteDIObjCProperty(const DIObjCProperty *N, 1219ff0cc061SDimitry Andric const ValueEnumerator &VE, 1220ff0cc061SDimitry Andric BitstreamWriter &Stream, 1221ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1222ff0cc061SDimitry Andric unsigned Abbrev) { 1223ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1224ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1225ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getFile())); 1226ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1227ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawSetterName())); 1228ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawGetterName())); 1229ff0cc061SDimitry Andric Record.push_back(N->getAttributes()); 1230ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getType())); 1231ff0cc061SDimitry Andric 1232ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_OBJC_PROPERTY, Record, Abbrev); 1233ff0cc061SDimitry Andric Record.clear(); 1234ff0cc061SDimitry Andric } 1235ff0cc061SDimitry Andric 1236ff0cc061SDimitry Andric static void WriteDIImportedEntity(const DIImportedEntity *N, 1237ff0cc061SDimitry Andric const ValueEnumerator &VE, 1238ff0cc061SDimitry Andric BitstreamWriter &Stream, 1239ff0cc061SDimitry Andric SmallVectorImpl<uint64_t> &Record, 1240ff0cc061SDimitry Andric unsigned Abbrev) { 1241ff0cc061SDimitry Andric Record.push_back(N->isDistinct()); 1242ff0cc061SDimitry Andric Record.push_back(N->getTag()); 1243ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getScope())); 1244ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getEntity())); 1245ff0cc061SDimitry Andric Record.push_back(N->getLine()); 1246ff0cc061SDimitry Andric Record.push_back(VE.getMetadataOrNullID(N->getRawName())); 1247ff0cc061SDimitry Andric 1248ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev); 1249ff0cc061SDimitry Andric Record.clear(); 1250ff0cc061SDimitry Andric } 1251ff0cc061SDimitry Andric 1252e580952dSDimitry Andric static void WriteModuleMetadata(const Module *M, 1253e580952dSDimitry Andric const ValueEnumerator &VE, 1254f22ef01cSRoman Divacky BitstreamWriter &Stream) { 125539d628a0SDimitry Andric const auto &MDs = VE.getMDs(); 125639d628a0SDimitry Andric if (MDs.empty() && M->named_metadata_empty()) 125739d628a0SDimitry Andric return; 125839d628a0SDimitry Andric 125939d628a0SDimitry Andric Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); 126039d628a0SDimitry Andric 1261f22ef01cSRoman Divacky unsigned MDSAbbrev = 0; 126239d628a0SDimitry Andric if (VE.hasMDString()) { 1263f22ef01cSRoman Divacky // Abbrev for METADATA_STRING. 1264f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1265f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING)); 1266f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1267f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 1268f22ef01cSRoman Divacky MDSAbbrev = Stream.EmitAbbrev(Abbv); 1269f22ef01cSRoman Divacky } 1270f22ef01cSRoman Divacky 1271ff0cc061SDimitry Andric // Initialize MDNode abbreviations. 1272ff0cc061SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0; 1273ff0cc061SDimitry Andric #include "llvm/IR/Metadata.def" 1274ff0cc061SDimitry Andric 1275ff0cc061SDimitry Andric if (VE.hasDILocation()) { 127639d628a0SDimitry Andric // Abbrev for METADATA_LOCATION. 127739d628a0SDimitry Andric // 127839d628a0SDimitry Andric // Assume the column is usually under 128, and always output the inlined-at 127939d628a0SDimitry Andric // location (it's never more expensive than building an array size 1). 128039d628a0SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 128139d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_LOCATION)); 128239d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); 128339d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 128439d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 128539d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 128639d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1287ff0cc061SDimitry Andric DILocationAbbrev = Stream.EmitAbbrev(Abbv); 1288ff0cc061SDimitry Andric } 1289ff0cc061SDimitry Andric 1290ff0cc061SDimitry Andric if (VE.hasGenericDINode()) { 1291ff0cc061SDimitry Andric // Abbrev for METADATA_GENERIC_DEBUG. 1292ff0cc061SDimitry Andric // 1293ff0cc061SDimitry Andric // Assume the column is usually under 128, and always output the inlined-at 1294ff0cc061SDimitry Andric // location (it's never more expensive than building an array size 1). 1295ff0cc061SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1296ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_GENERIC_DEBUG)); 1297ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); 1298ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1299ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); 1300ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1301ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1302ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 1303ff0cc061SDimitry Andric GenericDINodeAbbrev = Stream.EmitAbbrev(Abbv); 130439d628a0SDimitry Andric } 130539d628a0SDimitry Andric 130639d628a0SDimitry Andric unsigned NameAbbrev = 0; 130739d628a0SDimitry Andric if (!M->named_metadata_empty()) { 130839d628a0SDimitry Andric // Abbrev for METADATA_NAME. 130939d628a0SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 131039d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_NAME)); 131139d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 131239d628a0SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 131339d628a0SDimitry Andric NameAbbrev = Stream.EmitAbbrev(Abbv); 131439d628a0SDimitry Andric } 131539d628a0SDimitry Andric 131639d628a0SDimitry Andric SmallVector<uint64_t, 64> Record; 131739d628a0SDimitry Andric for (const Metadata *MD : MDs) { 131839d628a0SDimitry Andric if (const MDNode *N = dyn_cast<MDNode>(MD)) { 1319ff0cc061SDimitry Andric assert(N->isResolved() && "Expected forward references to be resolved"); 1320ff0cc061SDimitry Andric 1321ff0cc061SDimitry Andric switch (N->getMetadataID()) { 1322ff0cc061SDimitry Andric default: 1323ff0cc061SDimitry Andric llvm_unreachable("Invalid MDNode subclass"); 1324ff0cc061SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) \ 1325ff0cc061SDimitry Andric case Metadata::CLASS##Kind: \ 1326ff0cc061SDimitry Andric Write##CLASS(cast<CLASS>(N), VE, Stream, Record, CLASS##Abbrev); \ 132739d628a0SDimitry Andric continue; 1328ff0cc061SDimitry Andric #include "llvm/IR/Metadata.def" 1329ff0cc061SDimitry Andric } 133039d628a0SDimitry Andric } 133139d628a0SDimitry Andric if (const auto *MDC = dyn_cast<ConstantAsMetadata>(MD)) { 133239d628a0SDimitry Andric WriteValueAsMetadata(MDC, VE, Stream, Record); 133339d628a0SDimitry Andric continue; 133439d628a0SDimitry Andric } 133539d628a0SDimitry Andric const MDString *MDS = cast<MDString>(MD); 1336f22ef01cSRoman Divacky // Code: [strchar x N] 133739d628a0SDimitry Andric Record.append(MDS->bytes_begin(), MDS->bytes_end()); 1338f22ef01cSRoman Divacky 1339f22ef01cSRoman Divacky // Emit the finished record. 1340f22ef01cSRoman Divacky Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev); 1341f22ef01cSRoman Divacky Record.clear(); 1342e580952dSDimitry Andric } 1343e580952dSDimitry Andric 1344e580952dSDimitry Andric // Write named metadata. 134539d628a0SDimitry Andric for (const NamedMDNode &NMD : M->named_metadata()) { 1346f22ef01cSRoman Divacky // Write name. 134739d628a0SDimitry Andric StringRef Str = NMD.getName(); 134839d628a0SDimitry Andric Record.append(Str.bytes_begin(), Str.bytes_end()); 134939d628a0SDimitry Andric Stream.EmitRecord(bitc::METADATA_NAME, Record, NameAbbrev); 1350f22ef01cSRoman Divacky Record.clear(); 1351f22ef01cSRoman Divacky 1352f22ef01cSRoman Divacky // Write named metadata operands. 135339d628a0SDimitry Andric for (const MDNode *N : NMD.operands()) 135439d628a0SDimitry Andric Record.push_back(VE.getMetadataID(N)); 135517a519f9SDimitry Andric Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0); 1356f22ef01cSRoman Divacky Record.clear(); 1357f22ef01cSRoman Divacky } 1358f22ef01cSRoman Divacky 1359f22ef01cSRoman Divacky Stream.ExitBlock(); 1360f22ef01cSRoman Divacky } 1361f22ef01cSRoman Divacky 1362f22ef01cSRoman Divacky static void WriteFunctionLocalMetadata(const Function &F, 1363f22ef01cSRoman Divacky const ValueEnumerator &VE, 1364f22ef01cSRoman Divacky BitstreamWriter &Stream) { 1365f22ef01cSRoman Divacky bool StartedMetadataBlock = false; 1366f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 136739d628a0SDimitry Andric const SmallVectorImpl<const LocalAsMetadata *> &MDs = 136839d628a0SDimitry Andric VE.getFunctionLocalMDs(); 136939d628a0SDimitry Andric for (unsigned i = 0, e = MDs.size(); i != e; ++i) { 137039d628a0SDimitry Andric assert(MDs[i] && "Expected valid function-local metadata"); 1371f22ef01cSRoman Divacky if (!StartedMetadataBlock) { 1372f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); 1373f22ef01cSRoman Divacky StartedMetadataBlock = true; 1374f22ef01cSRoman Divacky } 137539d628a0SDimitry Andric WriteValueAsMetadata(MDs[i], VE, Stream, Record); 1376f22ef01cSRoman Divacky } 1377f22ef01cSRoman Divacky 1378f22ef01cSRoman Divacky if (StartedMetadataBlock) 1379f22ef01cSRoman Divacky Stream.ExitBlock(); 1380f22ef01cSRoman Divacky } 1381f22ef01cSRoman Divacky 1382f22ef01cSRoman Divacky static void WriteMetadataAttachment(const Function &F, 1383f22ef01cSRoman Divacky const ValueEnumerator &VE, 1384f22ef01cSRoman Divacky BitstreamWriter &Stream) { 1385f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); 1386f22ef01cSRoman Divacky 1387f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1388f22ef01cSRoman Divacky 1389f22ef01cSRoman Divacky // Write metadata attachments 139017a519f9SDimitry Andric // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] 1391f22ef01cSRoman Divacky SmallVector<std::pair<unsigned, MDNode *>, 4> MDs; 1392ff0cc061SDimitry Andric F.getAllMetadata(MDs); 1393ff0cc061SDimitry Andric if (!MDs.empty()) { 1394ff0cc061SDimitry Andric for (const auto &I : MDs) { 1395ff0cc061SDimitry Andric Record.push_back(I.first); 1396ff0cc061SDimitry Andric Record.push_back(VE.getMetadataID(I.second)); 1397ff0cc061SDimitry Andric } 1398ff0cc061SDimitry Andric Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); 1399ff0cc061SDimitry Andric Record.clear(); 1400ff0cc061SDimitry Andric } 1401f22ef01cSRoman Divacky 14027d523365SDimitry Andric for (const BasicBlock &BB : F) 14037d523365SDimitry Andric for (const Instruction &I : BB) { 1404f22ef01cSRoman Divacky MDs.clear(); 14057d523365SDimitry Andric I.getAllMetadataOtherThanDebugLoc(MDs); 1406f22ef01cSRoman Divacky 1407f22ef01cSRoman Divacky // If no metadata, ignore instruction. 1408f22ef01cSRoman Divacky if (MDs.empty()) continue; 1409f22ef01cSRoman Divacky 14107d523365SDimitry Andric Record.push_back(VE.getInstructionID(&I)); 1411f22ef01cSRoman Divacky 1412f22ef01cSRoman Divacky for (unsigned i = 0, e = MDs.size(); i != e; ++i) { 1413f22ef01cSRoman Divacky Record.push_back(MDs[i].first); 141439d628a0SDimitry Andric Record.push_back(VE.getMetadataID(MDs[i].second)); 1415f22ef01cSRoman Divacky } 141617a519f9SDimitry Andric Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); 1417f22ef01cSRoman Divacky Record.clear(); 1418f22ef01cSRoman Divacky } 1419f22ef01cSRoman Divacky 1420f22ef01cSRoman Divacky Stream.ExitBlock(); 1421f22ef01cSRoman Divacky } 1422f22ef01cSRoman Divacky 1423f22ef01cSRoman Divacky static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) { 1424f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1425f22ef01cSRoman Divacky 1426f22ef01cSRoman Divacky // Write metadata kinds 1427f22ef01cSRoman Divacky // METADATA_KIND - [n x [id, name]] 1428139f7f9bSDimitry Andric SmallVector<StringRef, 8> Names; 1429f22ef01cSRoman Divacky M->getMDKindNames(Names); 1430f22ef01cSRoman Divacky 1431e580952dSDimitry Andric if (Names.empty()) return; 1432f22ef01cSRoman Divacky 14337d523365SDimitry Andric Stream.EnterSubblock(bitc::METADATA_KIND_BLOCK_ID, 3); 1434f22ef01cSRoman Divacky 1435e580952dSDimitry Andric for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) { 1436f22ef01cSRoman Divacky Record.push_back(MDKindID); 1437f22ef01cSRoman Divacky StringRef KName = Names[MDKindID]; 1438f22ef01cSRoman Divacky Record.append(KName.begin(), KName.end()); 1439f22ef01cSRoman Divacky 1440f22ef01cSRoman Divacky Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); 1441f22ef01cSRoman Divacky Record.clear(); 1442f22ef01cSRoman Divacky } 1443f22ef01cSRoman Divacky 1444f22ef01cSRoman Divacky Stream.ExitBlock(); 1445f22ef01cSRoman Divacky } 1446f22ef01cSRoman Divacky 14477d523365SDimitry Andric static void WriteOperandBundleTags(const Module *M, BitstreamWriter &Stream) { 14487d523365SDimitry Andric // Write metadata kinds 14497d523365SDimitry Andric // 14507d523365SDimitry Andric // OPERAND_BUNDLE_TAGS_BLOCK_ID : N x OPERAND_BUNDLE_TAG 14517d523365SDimitry Andric // 14527d523365SDimitry Andric // OPERAND_BUNDLE_TAG - [strchr x N] 14537d523365SDimitry Andric 14547d523365SDimitry Andric SmallVector<StringRef, 8> Tags; 14557d523365SDimitry Andric M->getOperandBundleTags(Tags); 14567d523365SDimitry Andric 14577d523365SDimitry Andric if (Tags.empty()) 14587d523365SDimitry Andric return; 14597d523365SDimitry Andric 14607d523365SDimitry Andric Stream.EnterSubblock(bitc::OPERAND_BUNDLE_TAGS_BLOCK_ID, 3); 14617d523365SDimitry Andric 14627d523365SDimitry Andric SmallVector<uint64_t, 64> Record; 14637d523365SDimitry Andric 14647d523365SDimitry Andric for (auto Tag : Tags) { 14657d523365SDimitry Andric Record.append(Tag.begin(), Tag.end()); 14667d523365SDimitry Andric 14677d523365SDimitry Andric Stream.EmitRecord(bitc::OPERAND_BUNDLE_TAG, Record, 0); 14687d523365SDimitry Andric Record.clear(); 14697d523365SDimitry Andric } 14707d523365SDimitry Andric 14717d523365SDimitry Andric Stream.ExitBlock(); 14727d523365SDimitry Andric } 14737d523365SDimitry Andric 14743861d79fSDimitry Andric static void emitSignedInt64(SmallVectorImpl<uint64_t> &Vals, uint64_t V) { 14753861d79fSDimitry Andric if ((int64_t)V >= 0) 14763861d79fSDimitry Andric Vals.push_back(V << 1); 14773861d79fSDimitry Andric else 14783861d79fSDimitry Andric Vals.push_back((-V << 1) | 1); 14793861d79fSDimitry Andric } 14803861d79fSDimitry Andric 1481f22ef01cSRoman Divacky static void WriteConstants(unsigned FirstVal, unsigned LastVal, 1482f22ef01cSRoman Divacky const ValueEnumerator &VE, 1483f22ef01cSRoman Divacky BitstreamWriter &Stream, bool isGlobal) { 1484f22ef01cSRoman Divacky if (FirstVal == LastVal) return; 1485f22ef01cSRoman Divacky 1486f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4); 1487f22ef01cSRoman Divacky 1488f22ef01cSRoman Divacky unsigned AggregateAbbrev = 0; 1489f22ef01cSRoman Divacky unsigned String8Abbrev = 0; 1490f22ef01cSRoman Divacky unsigned CString7Abbrev = 0; 1491f22ef01cSRoman Divacky unsigned CString6Abbrev = 0; 1492f22ef01cSRoman Divacky // If this is a constant pool for the module, emit module-specific abbrevs. 1493f22ef01cSRoman Divacky if (isGlobal) { 1494f22ef01cSRoman Divacky // Abbrev for CST_CODE_AGGREGATE. 1495f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1496f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE)); 1497f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1498f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1))); 1499f22ef01cSRoman Divacky AggregateAbbrev = Stream.EmitAbbrev(Abbv); 1500f22ef01cSRoman Divacky 1501f22ef01cSRoman Divacky // Abbrev for CST_CODE_STRING. 1502f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 1503f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING)); 1504f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1505f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 1506f22ef01cSRoman Divacky String8Abbrev = Stream.EmitAbbrev(Abbv); 1507f22ef01cSRoman Divacky // Abbrev for CST_CODE_CSTRING. 1508f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 1509f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING)); 1510f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1511f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 1512f22ef01cSRoman Divacky CString7Abbrev = Stream.EmitAbbrev(Abbv); 1513f22ef01cSRoman Divacky // Abbrev for CST_CODE_CSTRING. 1514f22ef01cSRoman Divacky Abbv = new BitCodeAbbrev(); 1515f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING)); 1516f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1517f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 1518f22ef01cSRoman Divacky CString6Abbrev = Stream.EmitAbbrev(Abbv); 1519f22ef01cSRoman Divacky } 1520f22ef01cSRoman Divacky 1521f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1522f22ef01cSRoman Divacky 1523f22ef01cSRoman Divacky const ValueEnumerator::ValueList &Vals = VE.getValues(); 152491bc56edSDimitry Andric Type *LastTy = nullptr; 1525f22ef01cSRoman Divacky for (unsigned i = FirstVal; i != LastVal; ++i) { 1526f22ef01cSRoman Divacky const Value *V = Vals[i].first; 1527f22ef01cSRoman Divacky // If we need to switch types, do so now. 1528f22ef01cSRoman Divacky if (V->getType() != LastTy) { 1529f22ef01cSRoman Divacky LastTy = V->getType(); 1530f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(LastTy)); 1531f22ef01cSRoman Divacky Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record, 1532f22ef01cSRoman Divacky CONSTANTS_SETTYPE_ABBREV); 1533f22ef01cSRoman Divacky Record.clear(); 1534f22ef01cSRoman Divacky } 1535f22ef01cSRoman Divacky 1536f22ef01cSRoman Divacky if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) { 1537f22ef01cSRoman Divacky Record.push_back(unsigned(IA->hasSideEffects()) | 15383861d79fSDimitry Andric unsigned(IA->isAlignStack()) << 1 | 15393861d79fSDimitry Andric unsigned(IA->getDialect()&1) << 2); 1540f22ef01cSRoman Divacky 1541f22ef01cSRoman Divacky // Add the asm string. 1542f22ef01cSRoman Divacky const std::string &AsmStr = IA->getAsmString(); 1543f22ef01cSRoman Divacky Record.push_back(AsmStr.size()); 1544ff0cc061SDimitry Andric Record.append(AsmStr.begin(), AsmStr.end()); 1545f22ef01cSRoman Divacky 1546f22ef01cSRoman Divacky // Add the constraint string. 1547f22ef01cSRoman Divacky const std::string &ConstraintStr = IA->getConstraintString(); 1548f22ef01cSRoman Divacky Record.push_back(ConstraintStr.size()); 1549ff0cc061SDimitry Andric Record.append(ConstraintStr.begin(), ConstraintStr.end()); 1550f22ef01cSRoman Divacky Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record); 1551f22ef01cSRoman Divacky Record.clear(); 1552f22ef01cSRoman Divacky continue; 1553f22ef01cSRoman Divacky } 1554f22ef01cSRoman Divacky const Constant *C = cast<Constant>(V); 1555f22ef01cSRoman Divacky unsigned Code = -1U; 1556f22ef01cSRoman Divacky unsigned AbbrevToUse = 0; 1557f22ef01cSRoman Divacky if (C->isNullValue()) { 1558f22ef01cSRoman Divacky Code = bitc::CST_CODE_NULL; 1559f22ef01cSRoman Divacky } else if (isa<UndefValue>(C)) { 1560f22ef01cSRoman Divacky Code = bitc::CST_CODE_UNDEF; 1561f22ef01cSRoman Divacky } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) { 1562f785676fSDimitry Andric if (IV->getBitWidth() <= 64) { 1563f785676fSDimitry Andric uint64_t V = IV->getSExtValue(); 1564f785676fSDimitry Andric emitSignedInt64(Record, V); 1565f785676fSDimitry Andric Code = bitc::CST_CODE_INTEGER; 1566f785676fSDimitry Andric AbbrevToUse = CONSTANTS_INTEGER_ABBREV; 1567f785676fSDimitry Andric } else { // Wide integers, > 64 bits in size. 1568f785676fSDimitry Andric // We have an arbitrary precision integer value to write whose 1569f785676fSDimitry Andric // bit width is > 64. However, in canonical unsigned integer 1570f785676fSDimitry Andric // format it is likely that the high bits are going to be zero. 1571f785676fSDimitry Andric // So, we only write the number of active words. 1572f785676fSDimitry Andric unsigned NWords = IV->getValue().getActiveWords(); 1573f785676fSDimitry Andric const uint64_t *RawWords = IV->getValue().getRawData(); 1574f785676fSDimitry Andric for (unsigned i = 0; i != NWords; ++i) { 1575f785676fSDimitry Andric emitSignedInt64(Record, RawWords[i]); 1576f785676fSDimitry Andric } 1577f785676fSDimitry Andric Code = bitc::CST_CODE_WIDE_INTEGER; 1578f785676fSDimitry Andric } 1579f22ef01cSRoman Divacky } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) { 1580f22ef01cSRoman Divacky Code = bitc::CST_CODE_FLOAT; 15816122f3e6SDimitry Andric Type *Ty = CFP->getType(); 1582dff0c46cSDimitry Andric if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) { 1583f22ef01cSRoman Divacky Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue()); 1584f22ef01cSRoman Divacky } else if (Ty->isX86_FP80Ty()) { 1585f22ef01cSRoman Divacky // api needed to prevent premature destruction 1586f22ef01cSRoman Divacky // bits are not in the same order as a normal i80 APInt, compensate. 1587f22ef01cSRoman Divacky APInt api = CFP->getValueAPF().bitcastToAPInt(); 1588f22ef01cSRoman Divacky const uint64_t *p = api.getRawData(); 1589f22ef01cSRoman Divacky Record.push_back((p[1] << 48) | (p[0] >> 16)); 1590f22ef01cSRoman Divacky Record.push_back(p[0] & 0xffffLL); 1591f22ef01cSRoman Divacky } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) { 1592f22ef01cSRoman Divacky APInt api = CFP->getValueAPF().bitcastToAPInt(); 1593f22ef01cSRoman Divacky const uint64_t *p = api.getRawData(); 1594f22ef01cSRoman Divacky Record.push_back(p[0]); 1595f22ef01cSRoman Divacky Record.push_back(p[1]); 1596f22ef01cSRoman Divacky } else { 1597f22ef01cSRoman Divacky assert (0 && "Unknown FP type!"); 1598f22ef01cSRoman Divacky } 1599dff0c46cSDimitry Andric } else if (isa<ConstantDataSequential>(C) && 1600dff0c46cSDimitry Andric cast<ConstantDataSequential>(C)->isString()) { 1601dff0c46cSDimitry Andric const ConstantDataSequential *Str = cast<ConstantDataSequential>(C); 1602f22ef01cSRoman Divacky // Emit constant strings specially. 1603dff0c46cSDimitry Andric unsigned NumElts = Str->getNumElements(); 1604f22ef01cSRoman Divacky // If this is a null-terminated string, use the denser CSTRING encoding. 1605dff0c46cSDimitry Andric if (Str->isCString()) { 1606f22ef01cSRoman Divacky Code = bitc::CST_CODE_CSTRING; 1607dff0c46cSDimitry Andric --NumElts; // Don't encode the null, which isn't allowed by char6. 1608f22ef01cSRoman Divacky } else { 1609f22ef01cSRoman Divacky Code = bitc::CST_CODE_STRING; 1610f22ef01cSRoman Divacky AbbrevToUse = String8Abbrev; 1611f22ef01cSRoman Divacky } 1612f22ef01cSRoman Divacky bool isCStr7 = Code == bitc::CST_CODE_CSTRING; 1613f22ef01cSRoman Divacky bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING; 1614dff0c46cSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 1615dff0c46cSDimitry Andric unsigned char V = Str->getElementAsInteger(i); 1616f22ef01cSRoman Divacky Record.push_back(V); 1617f22ef01cSRoman Divacky isCStr7 &= (V & 128) == 0; 1618f22ef01cSRoman Divacky if (isCStrChar6) 1619f22ef01cSRoman Divacky isCStrChar6 = BitCodeAbbrevOp::isChar6(V); 1620f22ef01cSRoman Divacky } 1621f22ef01cSRoman Divacky 1622f22ef01cSRoman Divacky if (isCStrChar6) 1623f22ef01cSRoman Divacky AbbrevToUse = CString6Abbrev; 1624f22ef01cSRoman Divacky else if (isCStr7) 1625f22ef01cSRoman Divacky AbbrevToUse = CString7Abbrev; 1626dff0c46cSDimitry Andric } else if (const ConstantDataSequential *CDS = 1627dff0c46cSDimitry Andric dyn_cast<ConstantDataSequential>(C)) { 1628dff0c46cSDimitry Andric Code = bitc::CST_CODE_DATA; 1629dff0c46cSDimitry Andric Type *EltTy = CDS->getType()->getElementType(); 1630dff0c46cSDimitry Andric if (isa<IntegerType>(EltTy)) { 1631dff0c46cSDimitry Andric for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) 1632dff0c46cSDimitry Andric Record.push_back(CDS->getElementAsInteger(i)); 1633dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 1634dff0c46cSDimitry Andric for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { 1635dff0c46cSDimitry Andric union { float F; uint32_t I; }; 1636dff0c46cSDimitry Andric F = CDS->getElementAsFloat(i); 1637dff0c46cSDimitry Andric Record.push_back(I); 1638dff0c46cSDimitry Andric } 1639dff0c46cSDimitry Andric } else { 1640dff0c46cSDimitry Andric assert(EltTy->isDoubleTy() && "Unknown ConstantData element type"); 1641dff0c46cSDimitry Andric for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { 1642dff0c46cSDimitry Andric union { double F; uint64_t I; }; 1643dff0c46cSDimitry Andric F = CDS->getElementAsDouble(i); 1644dff0c46cSDimitry Andric Record.push_back(I); 1645dff0c46cSDimitry Andric } 1646dff0c46cSDimitry Andric } 1647dff0c46cSDimitry Andric } else if (isa<ConstantArray>(C) || isa<ConstantStruct>(C) || 1648dff0c46cSDimitry Andric isa<ConstantVector>(C)) { 1649f22ef01cSRoman Divacky Code = bitc::CST_CODE_AGGREGATE; 16503dac3a9bSDimitry Andric for (const Value *Op : C->operands()) 16513dac3a9bSDimitry Andric Record.push_back(VE.getValueID(Op)); 1652f22ef01cSRoman Divacky AbbrevToUse = AggregateAbbrev; 1653f22ef01cSRoman Divacky } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 1654f22ef01cSRoman Divacky switch (CE->getOpcode()) { 1655f22ef01cSRoman Divacky default: 1656f22ef01cSRoman Divacky if (Instruction::isCast(CE->getOpcode())) { 1657f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_CAST; 1658f22ef01cSRoman Divacky Record.push_back(GetEncodedCastOpcode(CE->getOpcode())); 1659f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); 1660f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1661f22ef01cSRoman Divacky AbbrevToUse = CONSTANTS_CE_CAST_Abbrev; 1662f22ef01cSRoman Divacky } else { 1663f22ef01cSRoman Divacky assert(CE->getNumOperands() == 2 && "Unknown constant expr!"); 1664f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_BINOP; 1665f22ef01cSRoman Divacky Record.push_back(GetEncodedBinaryOpcode(CE->getOpcode())); 1666f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1667f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 1668f22ef01cSRoman Divacky uint64_t Flags = GetOptimizationFlags(CE); 1669f22ef01cSRoman Divacky if (Flags != 0) 1670f22ef01cSRoman Divacky Record.push_back(Flags); 1671f22ef01cSRoman Divacky } 1672f22ef01cSRoman Divacky break; 1673ff0cc061SDimitry Andric case Instruction::GetElementPtr: { 1674f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_GEP; 1675ff0cc061SDimitry Andric const auto *GO = cast<GEPOperator>(C); 1676ff0cc061SDimitry Andric if (GO->isInBounds()) 1677f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_INBOUNDS_GEP; 1678ff0cc061SDimitry Andric Record.push_back(VE.getTypeID(GO->getSourceElementType())); 1679f22ef01cSRoman Divacky for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { 1680f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(C->getOperand(i)->getType())); 1681f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(i))); 1682f22ef01cSRoman Divacky } 1683f22ef01cSRoman Divacky break; 1684ff0cc061SDimitry Andric } 1685f22ef01cSRoman Divacky case Instruction::Select: 1686f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_SELECT; 1687f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1688f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 1689f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(2))); 1690f22ef01cSRoman Divacky break; 1691f22ef01cSRoman Divacky case Instruction::ExtractElement: 1692f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_EXTRACTELT; 1693f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); 1694f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 169591bc56edSDimitry Andric Record.push_back(VE.getTypeID(C->getOperand(1)->getType())); 1696f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 1697f22ef01cSRoman Divacky break; 1698f22ef01cSRoman Divacky case Instruction::InsertElement: 1699f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_INSERTELT; 1700f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1701f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 170291bc56edSDimitry Andric Record.push_back(VE.getTypeID(C->getOperand(2)->getType())); 1703f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(2))); 1704f22ef01cSRoman Divacky break; 1705f22ef01cSRoman Divacky case Instruction::ShuffleVector: 1706f22ef01cSRoman Divacky // If the return type and argument types are the same, this is a 1707f22ef01cSRoman Divacky // standard shufflevector instruction. If the types are different, 1708f22ef01cSRoman Divacky // then the shuffle is widening or truncating the input vectors, and 1709f22ef01cSRoman Divacky // the argument type must also be encoded. 1710f22ef01cSRoman Divacky if (C->getType() == C->getOperand(0)->getType()) { 1711f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_SHUFFLEVEC; 1712f22ef01cSRoman Divacky } else { 1713f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_SHUFVEC_EX; 1714f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); 1715f22ef01cSRoman Divacky } 1716f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1717f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 1718f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(2))); 1719f22ef01cSRoman Divacky break; 1720f22ef01cSRoman Divacky case Instruction::ICmp: 1721f22ef01cSRoman Divacky case Instruction::FCmp: 1722f22ef01cSRoman Divacky Code = bitc::CST_CODE_CE_CMP; 1723f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); 1724f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(0))); 1725f22ef01cSRoman Divacky Record.push_back(VE.getValueID(C->getOperand(1))); 1726f22ef01cSRoman Divacky Record.push_back(CE->getPredicate()); 1727f22ef01cSRoman Divacky break; 1728f22ef01cSRoman Divacky } 1729f22ef01cSRoman Divacky } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) { 1730f22ef01cSRoman Divacky Code = bitc::CST_CODE_BLOCKADDRESS; 1731f22ef01cSRoman Divacky Record.push_back(VE.getTypeID(BA->getFunction()->getType())); 1732f22ef01cSRoman Divacky Record.push_back(VE.getValueID(BA->getFunction())); 1733f22ef01cSRoman Divacky Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock())); 1734f22ef01cSRoman Divacky } else { 1735e580952dSDimitry Andric #ifndef NDEBUG 1736e580952dSDimitry Andric C->dump(); 1737e580952dSDimitry Andric #endif 1738f22ef01cSRoman Divacky llvm_unreachable("Unknown constant!"); 1739f22ef01cSRoman Divacky } 1740f22ef01cSRoman Divacky Stream.EmitRecord(Code, Record, AbbrevToUse); 1741f22ef01cSRoman Divacky Record.clear(); 1742f22ef01cSRoman Divacky } 1743f22ef01cSRoman Divacky 1744f22ef01cSRoman Divacky Stream.ExitBlock(); 1745f22ef01cSRoman Divacky } 1746f22ef01cSRoman Divacky 1747f22ef01cSRoman Divacky static void WriteModuleConstants(const ValueEnumerator &VE, 1748f22ef01cSRoman Divacky BitstreamWriter &Stream) { 1749f22ef01cSRoman Divacky const ValueEnumerator::ValueList &Vals = VE.getValues(); 1750f22ef01cSRoman Divacky 1751f22ef01cSRoman Divacky // Find the first constant to emit, which is the first non-globalvalue value. 1752f22ef01cSRoman Divacky // We know globalvalues have been emitted by WriteModuleInfo. 1753f22ef01cSRoman Divacky for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 1754f22ef01cSRoman Divacky if (!isa<GlobalValue>(Vals[i].first)) { 1755f22ef01cSRoman Divacky WriteConstants(i, Vals.size(), VE, Stream, true); 1756f22ef01cSRoman Divacky return; 1757f22ef01cSRoman Divacky } 1758f22ef01cSRoman Divacky } 1759f22ef01cSRoman Divacky } 1760f22ef01cSRoman Divacky 1761f22ef01cSRoman Divacky /// PushValueAndType - The file has to encode both the value and type id for 1762f22ef01cSRoman Divacky /// many values, because we need to know what type to create for forward 1763f22ef01cSRoman Divacky /// references. However, most operands are not forward references, so this type 1764f22ef01cSRoman Divacky /// field is not needed. 1765f22ef01cSRoman Divacky /// 1766f22ef01cSRoman Divacky /// This function adds V's value ID to Vals. If the value ID is higher than the 1767f22ef01cSRoman Divacky /// instruction ID, then it is a forward reference, and it also includes the 17683861d79fSDimitry Andric /// type ID. The value ID that is written is encoded relative to the InstID. 1769f22ef01cSRoman Divacky static bool PushValueAndType(const Value *V, unsigned InstID, 1770f785676fSDimitry Andric SmallVectorImpl<unsigned> &Vals, 1771f22ef01cSRoman Divacky ValueEnumerator &VE) { 1772f22ef01cSRoman Divacky unsigned ValID = VE.getValueID(V); 17733861d79fSDimitry Andric // Make encoding relative to the InstID. 17743861d79fSDimitry Andric Vals.push_back(InstID - ValID); 1775f22ef01cSRoman Divacky if (ValID >= InstID) { 1776f22ef01cSRoman Divacky Vals.push_back(VE.getTypeID(V->getType())); 1777f22ef01cSRoman Divacky return true; 1778f22ef01cSRoman Divacky } 1779f22ef01cSRoman Divacky return false; 1780f22ef01cSRoman Divacky } 1781f22ef01cSRoman Divacky 17827d523365SDimitry Andric static void WriteOperandBundles(BitstreamWriter &Stream, ImmutableCallSite CS, 17837d523365SDimitry Andric unsigned InstID, ValueEnumerator &VE) { 17847d523365SDimitry Andric SmallVector<unsigned, 64> Record; 17857d523365SDimitry Andric LLVMContext &C = CS.getInstruction()->getContext(); 17867d523365SDimitry Andric 17877d523365SDimitry Andric for (unsigned i = 0, e = CS.getNumOperandBundles(); i != e; ++i) { 17887d523365SDimitry Andric const auto &Bundle = CS.getOperandBundleAt(i); 17897d523365SDimitry Andric Record.push_back(C.getOperandBundleTagID(Bundle.getTagName())); 17907d523365SDimitry Andric 17917d523365SDimitry Andric for (auto &Input : Bundle.Inputs) 17927d523365SDimitry Andric PushValueAndType(Input, InstID, Record, VE); 17937d523365SDimitry Andric 17947d523365SDimitry Andric Stream.EmitRecord(bitc::FUNC_CODE_OPERAND_BUNDLE, Record); 17957d523365SDimitry Andric Record.clear(); 17967d523365SDimitry Andric } 17977d523365SDimitry Andric } 17987d523365SDimitry Andric 17993861d79fSDimitry Andric /// pushValue - Like PushValueAndType, but where the type of the value is 18003861d79fSDimitry Andric /// omitted (perhaps it was already encoded in an earlier operand). 18013861d79fSDimitry Andric static void pushValue(const Value *V, unsigned InstID, 1802f785676fSDimitry Andric SmallVectorImpl<unsigned> &Vals, 18033861d79fSDimitry Andric ValueEnumerator &VE) { 18043861d79fSDimitry Andric unsigned ValID = VE.getValueID(V); 18053861d79fSDimitry Andric Vals.push_back(InstID - ValID); 18063861d79fSDimitry Andric } 18073861d79fSDimitry Andric 18083861d79fSDimitry Andric static void pushValueSigned(const Value *V, unsigned InstID, 1809f785676fSDimitry Andric SmallVectorImpl<uint64_t> &Vals, 18103861d79fSDimitry Andric ValueEnumerator &VE) { 18113861d79fSDimitry Andric unsigned ValID = VE.getValueID(V); 18123861d79fSDimitry Andric int64_t diff = ((int32_t)InstID - (int32_t)ValID); 18133861d79fSDimitry Andric emitSignedInt64(Vals, diff); 18143861d79fSDimitry Andric } 18153861d79fSDimitry Andric 1816f22ef01cSRoman Divacky /// WriteInstruction - Emit an instruction to the specified stream. 1817f22ef01cSRoman Divacky static void WriteInstruction(const Instruction &I, unsigned InstID, 1818f22ef01cSRoman Divacky ValueEnumerator &VE, BitstreamWriter &Stream, 1819f785676fSDimitry Andric SmallVectorImpl<unsigned> &Vals) { 1820f22ef01cSRoman Divacky unsigned Code = 0; 1821f22ef01cSRoman Divacky unsigned AbbrevToUse = 0; 1822f22ef01cSRoman Divacky VE.setInstructionID(&I); 1823f22ef01cSRoman Divacky switch (I.getOpcode()) { 1824f22ef01cSRoman Divacky default: 1825f22ef01cSRoman Divacky if (Instruction::isCast(I.getOpcode())) { 1826f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_CAST; 1827f22ef01cSRoman Divacky if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) 1828f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_CAST_ABBREV; 1829f22ef01cSRoman Divacky Vals.push_back(VE.getTypeID(I.getType())); 1830f22ef01cSRoman Divacky Vals.push_back(GetEncodedCastOpcode(I.getOpcode())); 1831f22ef01cSRoman Divacky } else { 1832f22ef01cSRoman Divacky assert(isa<BinaryOperator>(I) && "Unknown instruction!"); 1833f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_BINOP; 1834f22ef01cSRoman Divacky if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) 1835f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_BINOP_ABBREV; 18363861d79fSDimitry Andric pushValue(I.getOperand(1), InstID, Vals, VE); 1837f22ef01cSRoman Divacky Vals.push_back(GetEncodedBinaryOpcode(I.getOpcode())); 1838f22ef01cSRoman Divacky uint64_t Flags = GetOptimizationFlags(&I); 1839f22ef01cSRoman Divacky if (Flags != 0) { 1840f22ef01cSRoman Divacky if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV) 1841f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV; 1842f22ef01cSRoman Divacky Vals.push_back(Flags); 1843f22ef01cSRoman Divacky } 1844f22ef01cSRoman Divacky } 1845f22ef01cSRoman Divacky break; 1846f22ef01cSRoman Divacky 1847ff0cc061SDimitry Andric case Instruction::GetElementPtr: { 1848f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_GEP; 1849ff0cc061SDimitry Andric AbbrevToUse = FUNCTION_INST_GEP_ABBREV; 1850ff0cc061SDimitry Andric auto &GEPInst = cast<GetElementPtrInst>(I); 1851ff0cc061SDimitry Andric Vals.push_back(GEPInst.isInBounds()); 1852ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(GEPInst.getSourceElementType())); 1853f22ef01cSRoman Divacky for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) 1854f22ef01cSRoman Divacky PushValueAndType(I.getOperand(i), InstID, Vals, VE); 1855f22ef01cSRoman Divacky break; 1856ff0cc061SDimitry Andric } 1857f22ef01cSRoman Divacky case Instruction::ExtractValue: { 1858f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_EXTRACTVAL; 1859f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 1860f22ef01cSRoman Divacky const ExtractValueInst *EVI = cast<ExtractValueInst>(&I); 1861ff0cc061SDimitry Andric Vals.append(EVI->idx_begin(), EVI->idx_end()); 1862f22ef01cSRoman Divacky break; 1863f22ef01cSRoman Divacky } 1864f22ef01cSRoman Divacky case Instruction::InsertValue: { 1865f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_INSERTVAL; 1866f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 1867f22ef01cSRoman Divacky PushValueAndType(I.getOperand(1), InstID, Vals, VE); 1868f22ef01cSRoman Divacky const InsertValueInst *IVI = cast<InsertValueInst>(&I); 1869ff0cc061SDimitry Andric Vals.append(IVI->idx_begin(), IVI->idx_end()); 1870f22ef01cSRoman Divacky break; 1871f22ef01cSRoman Divacky } 1872f22ef01cSRoman Divacky case Instruction::Select: 1873f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_VSELECT; 1874f22ef01cSRoman Divacky PushValueAndType(I.getOperand(1), InstID, Vals, VE); 18753861d79fSDimitry Andric pushValue(I.getOperand(2), InstID, Vals, VE); 1876f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 1877f22ef01cSRoman Divacky break; 1878f22ef01cSRoman Divacky case Instruction::ExtractElement: 1879f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_EXTRACTELT; 1880f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 188191bc56edSDimitry Andric PushValueAndType(I.getOperand(1), InstID, Vals, VE); 1882f22ef01cSRoman Divacky break; 1883f22ef01cSRoman Divacky case Instruction::InsertElement: 1884f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_INSERTELT; 1885f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 18863861d79fSDimitry Andric pushValue(I.getOperand(1), InstID, Vals, VE); 188791bc56edSDimitry Andric PushValueAndType(I.getOperand(2), InstID, Vals, VE); 1888f22ef01cSRoman Divacky break; 1889f22ef01cSRoman Divacky case Instruction::ShuffleVector: 1890f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_SHUFFLEVEC; 1891f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 18923861d79fSDimitry Andric pushValue(I.getOperand(1), InstID, Vals, VE); 18933861d79fSDimitry Andric pushValue(I.getOperand(2), InstID, Vals, VE); 1894f22ef01cSRoman Divacky break; 1895f22ef01cSRoman Divacky case Instruction::ICmp: 1896875ed548SDimitry Andric case Instruction::FCmp: { 1897f22ef01cSRoman Divacky // compare returning Int1Ty or vector of Int1Ty 1898f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_CMP2; 1899f22ef01cSRoman Divacky PushValueAndType(I.getOperand(0), InstID, Vals, VE); 19003861d79fSDimitry Andric pushValue(I.getOperand(1), InstID, Vals, VE); 1901f22ef01cSRoman Divacky Vals.push_back(cast<CmpInst>(I).getPredicate()); 1902875ed548SDimitry Andric uint64_t Flags = GetOptimizationFlags(&I); 1903875ed548SDimitry Andric if (Flags != 0) 1904875ed548SDimitry Andric Vals.push_back(Flags); 1905f22ef01cSRoman Divacky break; 1906875ed548SDimitry Andric } 1907f22ef01cSRoman Divacky 1908f22ef01cSRoman Divacky case Instruction::Ret: 1909f22ef01cSRoman Divacky { 1910f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_RET; 1911f22ef01cSRoman Divacky unsigned NumOperands = I.getNumOperands(); 1912f22ef01cSRoman Divacky if (NumOperands == 0) 1913f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV; 1914f22ef01cSRoman Divacky else if (NumOperands == 1) { 1915f22ef01cSRoman Divacky if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) 1916f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV; 1917f22ef01cSRoman Divacky } else { 1918f22ef01cSRoman Divacky for (unsigned i = 0, e = NumOperands; i != e; ++i) 1919f22ef01cSRoman Divacky PushValueAndType(I.getOperand(i), InstID, Vals, VE); 1920f22ef01cSRoman Divacky } 1921f22ef01cSRoman Divacky } 1922f22ef01cSRoman Divacky break; 1923f22ef01cSRoman Divacky case Instruction::Br: 1924f22ef01cSRoman Divacky { 1925f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_BR; 1926139f7f9bSDimitry Andric const BranchInst &II = cast<BranchInst>(I); 1927f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(II.getSuccessor(0))); 1928f22ef01cSRoman Divacky if (II.isConditional()) { 1929f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(II.getSuccessor(1))); 19303861d79fSDimitry Andric pushValue(II.getCondition(), InstID, Vals, VE); 1931f22ef01cSRoman Divacky } 1932f22ef01cSRoman Divacky } 1933f22ef01cSRoman Divacky break; 1934f22ef01cSRoman Divacky case Instruction::Switch: 1935dff0c46cSDimitry Andric { 1936f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_SWITCH; 1937139f7f9bSDimitry Andric const SwitchInst &SI = cast<SwitchInst>(I); 1938f785676fSDimitry Andric Vals.push_back(VE.getTypeID(SI.getCondition()->getType())); 1939f785676fSDimitry Andric pushValue(SI.getCondition(), InstID, Vals, VE); 1940f785676fSDimitry Andric Vals.push_back(VE.getValueID(SI.getDefaultDest())); 19417d523365SDimitry Andric for (SwitchInst::ConstCaseIt Case : SI.cases()) { 19427d523365SDimitry Andric Vals.push_back(VE.getValueID(Case.getCaseValue())); 19437d523365SDimitry Andric Vals.push_back(VE.getValueID(Case.getCaseSuccessor())); 1944dff0c46cSDimitry Andric } 1945dff0c46cSDimitry Andric } 1946f22ef01cSRoman Divacky break; 1947f22ef01cSRoman Divacky case Instruction::IndirectBr: 1948f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_INDIRECTBR; 1949f22ef01cSRoman Divacky Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); 19503861d79fSDimitry Andric // Encode the address operand as relative, but not the basic blocks. 19513861d79fSDimitry Andric pushValue(I.getOperand(0), InstID, Vals, VE); 19523861d79fSDimitry Andric for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) 1953f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(I.getOperand(i))); 1954f22ef01cSRoman Divacky break; 1955f22ef01cSRoman Divacky 1956f22ef01cSRoman Divacky case Instruction::Invoke: { 1957f22ef01cSRoman Divacky const InvokeInst *II = cast<InvokeInst>(&I); 1958ff0cc061SDimitry Andric const Value *Callee = II->getCalledValue(); 1959ff0cc061SDimitry Andric FunctionType *FTy = II->getFunctionType(); 19607d523365SDimitry Andric 19617d523365SDimitry Andric if (II->hasOperandBundles()) 19627d523365SDimitry Andric WriteOperandBundles(Stream, II, InstID, VE); 19637d523365SDimitry Andric 1964f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_INVOKE; 1965f22ef01cSRoman Divacky 1966f22ef01cSRoman Divacky Vals.push_back(VE.getAttributeID(II->getAttributes())); 1967ff0cc061SDimitry Andric Vals.push_back(II->getCallingConv() | 1 << 13); 1968f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(II->getNormalDest())); 1969f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(II->getUnwindDest())); 1970ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(FTy)); 1971f22ef01cSRoman Divacky PushValueAndType(Callee, InstID, Vals, VE); 1972f22ef01cSRoman Divacky 1973f22ef01cSRoman Divacky // Emit value #'s for the fixed parameters. 1974f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) 19753861d79fSDimitry Andric pushValue(I.getOperand(i), InstID, Vals, VE); // fixed param. 1976f22ef01cSRoman Divacky 1977f22ef01cSRoman Divacky // Emit type/value pairs for varargs params. 1978f22ef01cSRoman Divacky if (FTy->isVarArg()) { 1979f22ef01cSRoman Divacky for (unsigned i = FTy->getNumParams(), e = I.getNumOperands()-3; 1980f22ef01cSRoman Divacky i != e; ++i) 1981f22ef01cSRoman Divacky PushValueAndType(I.getOperand(i), InstID, Vals, VE); // vararg 1982f22ef01cSRoman Divacky } 1983f22ef01cSRoman Divacky break; 1984f22ef01cSRoman Divacky } 19856122f3e6SDimitry Andric case Instruction::Resume: 19866122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_RESUME; 19876122f3e6SDimitry Andric PushValueAndType(I.getOperand(0), InstID, Vals, VE); 19886122f3e6SDimitry Andric break; 19897d523365SDimitry Andric case Instruction::CleanupRet: { 19907d523365SDimitry Andric Code = bitc::FUNC_CODE_INST_CLEANUPRET; 19917d523365SDimitry Andric const auto &CRI = cast<CleanupReturnInst>(I); 19927d523365SDimitry Andric pushValue(CRI.getCleanupPad(), InstID, Vals, VE); 19937d523365SDimitry Andric if (CRI.hasUnwindDest()) 19947d523365SDimitry Andric Vals.push_back(VE.getValueID(CRI.getUnwindDest())); 19957d523365SDimitry Andric break; 19967d523365SDimitry Andric } 19977d523365SDimitry Andric case Instruction::CatchRet: { 19987d523365SDimitry Andric Code = bitc::FUNC_CODE_INST_CATCHRET; 19997d523365SDimitry Andric const auto &CRI = cast<CatchReturnInst>(I); 20007d523365SDimitry Andric pushValue(CRI.getCatchPad(), InstID, Vals, VE); 20017d523365SDimitry Andric Vals.push_back(VE.getValueID(CRI.getSuccessor())); 20027d523365SDimitry Andric break; 20037d523365SDimitry Andric } 20047d523365SDimitry Andric case Instruction::CleanupPad: 20057d523365SDimitry Andric case Instruction::CatchPad: { 20067d523365SDimitry Andric const auto &FuncletPad = cast<FuncletPadInst>(I); 20077d523365SDimitry Andric Code = isa<CatchPadInst>(FuncletPad) ? bitc::FUNC_CODE_INST_CATCHPAD 20087d523365SDimitry Andric : bitc::FUNC_CODE_INST_CLEANUPPAD; 20097d523365SDimitry Andric pushValue(FuncletPad.getParentPad(), InstID, Vals, VE); 20107d523365SDimitry Andric 20117d523365SDimitry Andric unsigned NumArgOperands = FuncletPad.getNumArgOperands(); 20127d523365SDimitry Andric Vals.push_back(NumArgOperands); 20137d523365SDimitry Andric for (unsigned Op = 0; Op != NumArgOperands; ++Op) 20147d523365SDimitry Andric PushValueAndType(FuncletPad.getArgOperand(Op), InstID, Vals, VE); 20157d523365SDimitry Andric break; 20167d523365SDimitry Andric } 20177d523365SDimitry Andric case Instruction::CatchSwitch: { 20187d523365SDimitry Andric Code = bitc::FUNC_CODE_INST_CATCHSWITCH; 20197d523365SDimitry Andric const auto &CatchSwitch = cast<CatchSwitchInst>(I); 20207d523365SDimitry Andric 20217d523365SDimitry Andric pushValue(CatchSwitch.getParentPad(), InstID, Vals, VE); 20227d523365SDimitry Andric 20237d523365SDimitry Andric unsigned NumHandlers = CatchSwitch.getNumHandlers(); 20247d523365SDimitry Andric Vals.push_back(NumHandlers); 20257d523365SDimitry Andric for (const BasicBlock *CatchPadBB : CatchSwitch.handlers()) 20267d523365SDimitry Andric Vals.push_back(VE.getValueID(CatchPadBB)); 20277d523365SDimitry Andric 20287d523365SDimitry Andric if (CatchSwitch.hasUnwindDest()) 20297d523365SDimitry Andric Vals.push_back(VE.getValueID(CatchSwitch.getUnwindDest())); 20307d523365SDimitry Andric break; 20317d523365SDimitry Andric } 2032f22ef01cSRoman Divacky case Instruction::Unreachable: 2033f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_UNREACHABLE; 2034f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV; 2035f22ef01cSRoman Divacky break; 2036f22ef01cSRoman Divacky 203717a519f9SDimitry Andric case Instruction::PHI: { 203817a519f9SDimitry Andric const PHINode &PN = cast<PHINode>(I); 2039f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_PHI; 20403861d79fSDimitry Andric // With the newer instruction encoding, forward references could give 20413861d79fSDimitry Andric // negative valued IDs. This is most common for PHIs, so we use 20423861d79fSDimitry Andric // signed VBRs. 20433861d79fSDimitry Andric SmallVector<uint64_t, 128> Vals64; 20443861d79fSDimitry Andric Vals64.push_back(VE.getTypeID(PN.getType())); 204517a519f9SDimitry Andric for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) { 20463861d79fSDimitry Andric pushValueSigned(PN.getIncomingValue(i), InstID, Vals64, VE); 20473861d79fSDimitry Andric Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i))); 204817a519f9SDimitry Andric } 20493861d79fSDimitry Andric // Emit a Vals64 vector and exit. 20503861d79fSDimitry Andric Stream.EmitRecord(Code, Vals64, AbbrevToUse); 20513861d79fSDimitry Andric Vals64.clear(); 20523861d79fSDimitry Andric return; 205317a519f9SDimitry Andric } 2054f22ef01cSRoman Divacky 20556122f3e6SDimitry Andric case Instruction::LandingPad: { 20566122f3e6SDimitry Andric const LandingPadInst &LP = cast<LandingPadInst>(I); 20576122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_LANDINGPAD; 20586122f3e6SDimitry Andric Vals.push_back(VE.getTypeID(LP.getType())); 20596122f3e6SDimitry Andric Vals.push_back(LP.isCleanup()); 20606122f3e6SDimitry Andric Vals.push_back(LP.getNumClauses()); 20616122f3e6SDimitry Andric for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) { 20626122f3e6SDimitry Andric if (LP.isCatch(I)) 20636122f3e6SDimitry Andric Vals.push_back(LandingPadInst::Catch); 20646122f3e6SDimitry Andric else 20656122f3e6SDimitry Andric Vals.push_back(LandingPadInst::Filter); 20666122f3e6SDimitry Andric PushValueAndType(LP.getClause(I), InstID, Vals, VE); 20676122f3e6SDimitry Andric } 20686122f3e6SDimitry Andric break; 20696122f3e6SDimitry Andric } 20706122f3e6SDimitry Andric 207191bc56edSDimitry Andric case Instruction::Alloca: { 2072f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_ALLOCA; 2073ff0cc061SDimitry Andric const AllocaInst &AI = cast<AllocaInst>(I); 2074ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(AI.getAllocatedType())); 2075ffd1746dSEd Schouten Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); 2076f22ef01cSRoman Divacky Vals.push_back(VE.getValueID(I.getOperand(0))); // size. 207791bc56edSDimitry Andric unsigned AlignRecord = Log2_32(AI.getAlignment()) + 1; 207891bc56edSDimitry Andric assert(Log2_32(Value::MaximumAlignment) + 1 < 1 << 5 && 207991bc56edSDimitry Andric "not enough bits for maximum alignment"); 208091bc56edSDimitry Andric assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64"); 208191bc56edSDimitry Andric AlignRecord |= AI.isUsedWithInAlloca() << 5; 2082ff0cc061SDimitry Andric AlignRecord |= 1 << 6; 20837d523365SDimitry Andric // Reserve bit 7 for SwiftError flag. 20847d523365SDimitry Andric // AlignRecord |= AI.isSwiftError() << 7; 208591bc56edSDimitry Andric Vals.push_back(AlignRecord); 2086f22ef01cSRoman Divacky break; 208791bc56edSDimitry Andric } 2088f22ef01cSRoman Divacky 2089f22ef01cSRoman Divacky case Instruction::Load: 20906122f3e6SDimitry Andric if (cast<LoadInst>(I).isAtomic()) { 20916122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_LOADATOMIC; 20926122f3e6SDimitry Andric PushValueAndType(I.getOperand(0), InstID, Vals, VE); 20936122f3e6SDimitry Andric } else { 2094f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_LOAD; 2095f22ef01cSRoman Divacky if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) // ptr 2096f22ef01cSRoman Divacky AbbrevToUse = FUNCTION_INST_LOAD_ABBREV; 20976122f3e6SDimitry Andric } 2098ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(I.getType())); 2099f22ef01cSRoman Divacky Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1); 2100f22ef01cSRoman Divacky Vals.push_back(cast<LoadInst>(I).isVolatile()); 21016122f3e6SDimitry Andric if (cast<LoadInst>(I).isAtomic()) { 21026122f3e6SDimitry Andric Vals.push_back(GetEncodedOrdering(cast<LoadInst>(I).getOrdering())); 21036122f3e6SDimitry Andric Vals.push_back(GetEncodedSynchScope(cast<LoadInst>(I).getSynchScope())); 21046122f3e6SDimitry Andric } 2105f22ef01cSRoman Divacky break; 2106f22ef01cSRoman Divacky case Instruction::Store: 21076122f3e6SDimitry Andric if (cast<StoreInst>(I).isAtomic()) 21086122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_STOREATOMIC; 21096122f3e6SDimitry Andric else 211017a519f9SDimitry Andric Code = bitc::FUNC_CODE_INST_STORE; 2111f22ef01cSRoman Divacky PushValueAndType(I.getOperand(1), InstID, Vals, VE); // ptrty + ptr 2112ff0cc061SDimitry Andric PushValueAndType(I.getOperand(0), InstID, Vals, VE); // valty + val 2113f22ef01cSRoman Divacky Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1); 2114f22ef01cSRoman Divacky Vals.push_back(cast<StoreInst>(I).isVolatile()); 21156122f3e6SDimitry Andric if (cast<StoreInst>(I).isAtomic()) { 21166122f3e6SDimitry Andric Vals.push_back(GetEncodedOrdering(cast<StoreInst>(I).getOrdering())); 21176122f3e6SDimitry Andric Vals.push_back(GetEncodedSynchScope(cast<StoreInst>(I).getSynchScope())); 21186122f3e6SDimitry Andric } 21196122f3e6SDimitry Andric break; 21206122f3e6SDimitry Andric case Instruction::AtomicCmpXchg: 21216122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_CMPXCHG; 21226122f3e6SDimitry Andric PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr 2123ff0cc061SDimitry Andric PushValueAndType(I.getOperand(1), InstID, Vals, VE); // cmp. 21243861d79fSDimitry Andric pushValue(I.getOperand(2), InstID, Vals, VE); // newval. 21256122f3e6SDimitry Andric Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile()); 21266122f3e6SDimitry Andric Vals.push_back(GetEncodedOrdering( 212791bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I).getSuccessOrdering())); 21286122f3e6SDimitry Andric Vals.push_back(GetEncodedSynchScope( 21296122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I).getSynchScope())); 213091bc56edSDimitry Andric Vals.push_back(GetEncodedOrdering( 213191bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I).getFailureOrdering())); 213291bc56edSDimitry Andric Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak()); 21336122f3e6SDimitry Andric break; 21346122f3e6SDimitry Andric case Instruction::AtomicRMW: 21356122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_ATOMICRMW; 21366122f3e6SDimitry Andric PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr 21373861d79fSDimitry Andric pushValue(I.getOperand(1), InstID, Vals, VE); // val. 21386122f3e6SDimitry Andric Vals.push_back(GetEncodedRMWOperation( 21396122f3e6SDimitry Andric cast<AtomicRMWInst>(I).getOperation())); 21406122f3e6SDimitry Andric Vals.push_back(cast<AtomicRMWInst>(I).isVolatile()); 21416122f3e6SDimitry Andric Vals.push_back(GetEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering())); 21426122f3e6SDimitry Andric Vals.push_back(GetEncodedSynchScope( 21436122f3e6SDimitry Andric cast<AtomicRMWInst>(I).getSynchScope())); 21446122f3e6SDimitry Andric break; 21456122f3e6SDimitry Andric case Instruction::Fence: 21466122f3e6SDimitry Andric Code = bitc::FUNC_CODE_INST_FENCE; 21476122f3e6SDimitry Andric Vals.push_back(GetEncodedOrdering(cast<FenceInst>(I).getOrdering())); 21486122f3e6SDimitry Andric Vals.push_back(GetEncodedSynchScope(cast<FenceInst>(I).getSynchScope())); 2149f22ef01cSRoman Divacky break; 2150f22ef01cSRoman Divacky case Instruction::Call: { 2151ffd1746dSEd Schouten const CallInst &CI = cast<CallInst>(I); 2152ff0cc061SDimitry Andric FunctionType *FTy = CI.getFunctionType(); 2153f22ef01cSRoman Divacky 21547d523365SDimitry Andric if (CI.hasOperandBundles()) 21557d523365SDimitry Andric WriteOperandBundles(Stream, &CI, InstID, VE); 21567d523365SDimitry Andric 215717a519f9SDimitry Andric Code = bitc::FUNC_CODE_INST_CALL; 2158f22ef01cSRoman Divacky 2159ffd1746dSEd Schouten Vals.push_back(VE.getAttributeID(CI.getAttributes())); 21607d523365SDimitry Andric 21617d523365SDimitry Andric unsigned Flags = GetOptimizationFlags(&I); 21627d523365SDimitry Andric Vals.push_back(CI.getCallingConv() << bitc::CALL_CCONV | 21637d523365SDimitry Andric unsigned(CI.isTailCall()) << bitc::CALL_TAIL | 21647d523365SDimitry Andric unsigned(CI.isMustTailCall()) << bitc::CALL_MUSTTAIL | 21657d523365SDimitry Andric 1 << bitc::CALL_EXPLICIT_TYPE | 21667d523365SDimitry Andric unsigned(CI.isNoTailCall()) << bitc::CALL_NOTAIL | 21677d523365SDimitry Andric unsigned(Flags != 0) << bitc::CALL_FMF); 21687d523365SDimitry Andric if (Flags != 0) 21697d523365SDimitry Andric Vals.push_back(Flags); 21707d523365SDimitry Andric 2171ff0cc061SDimitry Andric Vals.push_back(VE.getTypeID(FTy)); 2172ffd1746dSEd Schouten PushValueAndType(CI.getCalledValue(), InstID, Vals, VE); // Callee 2173f22ef01cSRoman Divacky 2174f22ef01cSRoman Divacky // Emit value #'s for the fixed parameters. 21753861d79fSDimitry Andric for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) { 21763861d79fSDimitry Andric // Check for labels (can happen with asm labels). 21773861d79fSDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 21783861d79fSDimitry Andric Vals.push_back(VE.getValueID(CI.getArgOperand(i))); 21793861d79fSDimitry Andric else 21803861d79fSDimitry Andric pushValue(CI.getArgOperand(i), InstID, Vals, VE); // fixed param. 21813861d79fSDimitry Andric } 2182f22ef01cSRoman Divacky 2183f22ef01cSRoman Divacky // Emit type/value pairs for varargs params. 2184f22ef01cSRoman Divacky if (FTy->isVarArg()) { 2185ffd1746dSEd Schouten for (unsigned i = FTy->getNumParams(), e = CI.getNumArgOperands(); 2186f22ef01cSRoman Divacky i != e; ++i) 2187ffd1746dSEd Schouten PushValueAndType(CI.getArgOperand(i), InstID, Vals, VE); // varargs 2188f22ef01cSRoman Divacky } 2189f22ef01cSRoman Divacky break; 2190f22ef01cSRoman Divacky } 2191f22ef01cSRoman Divacky case Instruction::VAArg: 2192f22ef01cSRoman Divacky Code = bitc::FUNC_CODE_INST_VAARG; 2193f22ef01cSRoman Divacky Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); // valistty 21943861d79fSDimitry Andric pushValue(I.getOperand(0), InstID, Vals, VE); // valist. 2195f22ef01cSRoman Divacky Vals.push_back(VE.getTypeID(I.getType())); // restype. 2196f22ef01cSRoman Divacky break; 2197f22ef01cSRoman Divacky } 2198f22ef01cSRoman Divacky 2199f22ef01cSRoman Divacky Stream.EmitRecord(Code, Vals, AbbrevToUse); 2200f22ef01cSRoman Divacky Vals.clear(); 2201f22ef01cSRoman Divacky } 2202f22ef01cSRoman Divacky 22037d523365SDimitry Andric enum StringEncoding { SE_Char6, SE_Fixed7, SE_Fixed8 }; 22047d523365SDimitry Andric 22057d523365SDimitry Andric /// Determine the encoding to use for the given string name and length. 22067d523365SDimitry Andric static StringEncoding getStringEncoding(const char *Str, unsigned StrLen) { 22077d523365SDimitry Andric bool isChar6 = true; 22087d523365SDimitry Andric for (const char *C = Str, *E = C + StrLen; C != E; ++C) { 22097d523365SDimitry Andric if (isChar6) 22107d523365SDimitry Andric isChar6 = BitCodeAbbrevOp::isChar6(*C); 22117d523365SDimitry Andric if ((unsigned char)*C & 128) 22127d523365SDimitry Andric // don't bother scanning the rest. 22137d523365SDimitry Andric return SE_Fixed8; 22147d523365SDimitry Andric } 22157d523365SDimitry Andric if (isChar6) 22167d523365SDimitry Andric return SE_Char6; 22177d523365SDimitry Andric else 22187d523365SDimitry Andric return SE_Fixed7; 22197d523365SDimitry Andric } 22207d523365SDimitry Andric 22217d523365SDimitry Andric /// Emit names for globals/functions etc. The VSTOffsetPlaceholder, 22227d523365SDimitry Andric /// BitcodeStartBit and FunctionIndex are only passed for the module-level 22237d523365SDimitry Andric /// VST, where we are including a function bitcode index and need to 22247d523365SDimitry Andric /// backpatch the VST forward declaration record. 22257d523365SDimitry Andric static void WriteValueSymbolTable( 22267d523365SDimitry Andric const ValueSymbolTable &VST, const ValueEnumerator &VE, 22277d523365SDimitry Andric BitstreamWriter &Stream, uint64_t VSTOffsetPlaceholder = 0, 22287d523365SDimitry Andric uint64_t BitcodeStartBit = 0, 22297d523365SDimitry Andric DenseMap<const Function *, std::unique_ptr<FunctionInfo>> *FunctionIndex = 22307d523365SDimitry Andric nullptr) { 22317d523365SDimitry Andric if (VST.empty()) { 22327d523365SDimitry Andric // WriteValueSymbolTableForwardDecl should have returned early as 22337d523365SDimitry Andric // well. Ensure this handling remains in sync by asserting that 22347d523365SDimitry Andric // the placeholder offset is not set. 22357d523365SDimitry Andric assert(VSTOffsetPlaceholder == 0); 22367d523365SDimitry Andric return; 22377d523365SDimitry Andric } 22387d523365SDimitry Andric 22397d523365SDimitry Andric if (VSTOffsetPlaceholder > 0) { 22407d523365SDimitry Andric // Get the offset of the VST we are writing, and backpatch it into 22417d523365SDimitry Andric // the VST forward declaration record. 22427d523365SDimitry Andric uint64_t VSTOffset = Stream.GetCurrentBitNo(); 22437d523365SDimitry Andric // The BitcodeStartBit was the stream offset of the actual bitcode 22447d523365SDimitry Andric // (e.g. excluding any initial darwin header). 22457d523365SDimitry Andric VSTOffset -= BitcodeStartBit; 22467d523365SDimitry Andric assert((VSTOffset & 31) == 0 && "VST block not 32-bit aligned"); 22477d523365SDimitry Andric Stream.BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32); 22487d523365SDimitry Andric } 22497d523365SDimitry Andric 2250f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4); 2251f22ef01cSRoman Divacky 22527d523365SDimitry Andric // For the module-level VST, add abbrev Ids for the VST_CODE_FNENTRY 22537d523365SDimitry Andric // records, which are not used in the per-function VSTs. 22547d523365SDimitry Andric unsigned FnEntry8BitAbbrev; 22557d523365SDimitry Andric unsigned FnEntry7BitAbbrev; 22567d523365SDimitry Andric unsigned FnEntry6BitAbbrev; 22577d523365SDimitry Andric if (VSTOffsetPlaceholder > 0) { 22587d523365SDimitry Andric // 8-bit fixed-width VST_FNENTRY function strings. 22597d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 22607d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_FNENTRY)); 22617d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id 22627d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 22637d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 22647d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 22657d523365SDimitry Andric FnEntry8BitAbbrev = Stream.EmitAbbrev(Abbv); 22667d523365SDimitry Andric 22677d523365SDimitry Andric // 7-bit fixed width VST_FNENTRY function strings. 22687d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 22697d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_FNENTRY)); 22707d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id 22717d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 22727d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 22737d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 22747d523365SDimitry Andric FnEntry7BitAbbrev = Stream.EmitAbbrev(Abbv); 22757d523365SDimitry Andric 22767d523365SDimitry Andric // 6-bit char6 VST_FNENTRY function strings. 22777d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 22787d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_FNENTRY)); 22797d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id 22807d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 22817d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 22827d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 22837d523365SDimitry Andric FnEntry6BitAbbrev = Stream.EmitAbbrev(Abbv); 22847d523365SDimitry Andric } 22857d523365SDimitry Andric 2286f22ef01cSRoman Divacky // FIXME: Set up the abbrev, we know how many values there are! 2287f22ef01cSRoman Divacky // FIXME: We know if the type names can use 7-bit ascii. 2288f22ef01cSRoman Divacky SmallVector<unsigned, 64> NameVals; 2289f22ef01cSRoman Divacky 22907d523365SDimitry Andric for (const ValueName &Name : VST) { 2291f22ef01cSRoman Divacky // Figure out the encoding to use for the name. 22927d523365SDimitry Andric StringEncoding Bits = 22937d523365SDimitry Andric getStringEncoding(Name.getKeyData(), Name.getKeyLength()); 2294f22ef01cSRoman Divacky 2295f22ef01cSRoman Divacky unsigned AbbrevToUse = VST_ENTRY_8_ABBREV; 22967d523365SDimitry Andric NameVals.push_back(VE.getValueID(Name.getValue())); 22977d523365SDimitry Andric 22987d523365SDimitry Andric Function *F = dyn_cast<Function>(Name.getValue()); 22997d523365SDimitry Andric if (!F) { 23007d523365SDimitry Andric // If value is an alias, need to get the aliased base object to 23017d523365SDimitry Andric // see if it is a function. 23027d523365SDimitry Andric auto *GA = dyn_cast<GlobalAlias>(Name.getValue()); 23037d523365SDimitry Andric if (GA && GA->getBaseObject()) 23047d523365SDimitry Andric F = dyn_cast<Function>(GA->getBaseObject()); 23057d523365SDimitry Andric } 2306f22ef01cSRoman Divacky 2307f22ef01cSRoman Divacky // VST_ENTRY: [valueid, namechar x N] 23087d523365SDimitry Andric // VST_FNENTRY: [valueid, funcoffset, namechar x N] 2309f22ef01cSRoman Divacky // VST_BBENTRY: [bbid, namechar x N] 2310f22ef01cSRoman Divacky unsigned Code; 23117d523365SDimitry Andric if (isa<BasicBlock>(Name.getValue())) { 2312f22ef01cSRoman Divacky Code = bitc::VST_CODE_BBENTRY; 23137d523365SDimitry Andric if (Bits == SE_Char6) 2314f22ef01cSRoman Divacky AbbrevToUse = VST_BBENTRY_6_ABBREV; 23157d523365SDimitry Andric } else if (F && !F->isDeclaration()) { 23167d523365SDimitry Andric // Must be the module-level VST, where we pass in the Index and 23177d523365SDimitry Andric // have a VSTOffsetPlaceholder. The function-level VST should not 23187d523365SDimitry Andric // contain any Function symbols. 23197d523365SDimitry Andric assert(FunctionIndex); 23207d523365SDimitry Andric assert(VSTOffsetPlaceholder > 0); 23217d523365SDimitry Andric 23227d523365SDimitry Andric // Save the word offset of the function (from the start of the 23237d523365SDimitry Andric // actual bitcode written to the stream). 23247d523365SDimitry Andric assert(FunctionIndex->count(F) == 1); 23257d523365SDimitry Andric uint64_t BitcodeIndex = 23267d523365SDimitry Andric (*FunctionIndex)[F]->bitcodeIndex() - BitcodeStartBit; 23277d523365SDimitry Andric assert((BitcodeIndex & 31) == 0 && "function block not 32-bit aligned"); 23287d523365SDimitry Andric NameVals.push_back(BitcodeIndex / 32); 23297d523365SDimitry Andric 23307d523365SDimitry Andric Code = bitc::VST_CODE_FNENTRY; 23317d523365SDimitry Andric AbbrevToUse = FnEntry8BitAbbrev; 23327d523365SDimitry Andric if (Bits == SE_Char6) 23337d523365SDimitry Andric AbbrevToUse = FnEntry6BitAbbrev; 23347d523365SDimitry Andric else if (Bits == SE_Fixed7) 23357d523365SDimitry Andric AbbrevToUse = FnEntry7BitAbbrev; 2336f22ef01cSRoman Divacky } else { 2337f22ef01cSRoman Divacky Code = bitc::VST_CODE_ENTRY; 23387d523365SDimitry Andric if (Bits == SE_Char6) 2339f22ef01cSRoman Divacky AbbrevToUse = VST_ENTRY_6_ABBREV; 23407d523365SDimitry Andric else if (Bits == SE_Fixed7) 2341f22ef01cSRoman Divacky AbbrevToUse = VST_ENTRY_7_ABBREV; 2342f22ef01cSRoman Divacky } 2343f22ef01cSRoman Divacky 23447d523365SDimitry Andric for (const auto P : Name.getKey()) 23457d523365SDimitry Andric NameVals.push_back((unsigned char)P); 2346f22ef01cSRoman Divacky 2347f22ef01cSRoman Divacky // Emit the finished record. 2348f22ef01cSRoman Divacky Stream.EmitRecord(Code, NameVals, AbbrevToUse); 2349f22ef01cSRoman Divacky NameVals.clear(); 2350f22ef01cSRoman Divacky } 2351f22ef01cSRoman Divacky Stream.ExitBlock(); 2352f22ef01cSRoman Divacky } 2353f22ef01cSRoman Divacky 23547d523365SDimitry Andric /// Emit function names and summary offsets for the combined index 23557d523365SDimitry Andric /// used by ThinLTO. 23567d523365SDimitry Andric static void WriteCombinedValueSymbolTable(const FunctionInfoIndex &Index, 23577d523365SDimitry Andric BitstreamWriter &Stream) { 23587d523365SDimitry Andric Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4); 23597d523365SDimitry Andric 23607d523365SDimitry Andric // 8-bit fixed-width VST_COMBINED_FNENTRY function strings. 23617d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 23627d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_COMBINED_FNENTRY)); 23637d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 23647d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 23657d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 23667d523365SDimitry Andric unsigned FnEntry8BitAbbrev = Stream.EmitAbbrev(Abbv); 23677d523365SDimitry Andric 23687d523365SDimitry Andric // 7-bit fixed width VST_COMBINED_FNENTRY function strings. 23697d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 23707d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_COMBINED_FNENTRY)); 23717d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 23727d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 23737d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 23747d523365SDimitry Andric unsigned FnEntry7BitAbbrev = Stream.EmitAbbrev(Abbv); 23757d523365SDimitry Andric 23767d523365SDimitry Andric // 6-bit char6 VST_COMBINED_FNENTRY function strings. 23777d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 23787d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_COMBINED_FNENTRY)); 23797d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset 23807d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 23817d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 23827d523365SDimitry Andric unsigned FnEntry6BitAbbrev = Stream.EmitAbbrev(Abbv); 23837d523365SDimitry Andric 23847d523365SDimitry Andric // FIXME: We know if the type names can use 7-bit ascii. 23857d523365SDimitry Andric SmallVector<unsigned, 64> NameVals; 23867d523365SDimitry Andric 23877d523365SDimitry Andric for (const auto &FII : Index) { 23887d523365SDimitry Andric for (const auto &FI : FII.getValue()) { 23897d523365SDimitry Andric NameVals.push_back(FI->bitcodeIndex()); 23907d523365SDimitry Andric 23917d523365SDimitry Andric StringRef FuncName = FII.first(); 23927d523365SDimitry Andric 23937d523365SDimitry Andric // Figure out the encoding to use for the name. 23947d523365SDimitry Andric StringEncoding Bits = getStringEncoding(FuncName.data(), FuncName.size()); 23957d523365SDimitry Andric 23967d523365SDimitry Andric // VST_COMBINED_FNENTRY: [funcsumoffset, namechar x N] 23977d523365SDimitry Andric unsigned AbbrevToUse = FnEntry8BitAbbrev; 23987d523365SDimitry Andric if (Bits == SE_Char6) 23997d523365SDimitry Andric AbbrevToUse = FnEntry6BitAbbrev; 24007d523365SDimitry Andric else if (Bits == SE_Fixed7) 24017d523365SDimitry Andric AbbrevToUse = FnEntry7BitAbbrev; 24027d523365SDimitry Andric 24037d523365SDimitry Andric for (const auto P : FuncName) 24047d523365SDimitry Andric NameVals.push_back((unsigned char)P); 24057d523365SDimitry Andric 24067d523365SDimitry Andric // Emit the finished record. 24077d523365SDimitry Andric Stream.EmitRecord(bitc::VST_CODE_COMBINED_FNENTRY, NameVals, AbbrevToUse); 24087d523365SDimitry Andric NameVals.clear(); 24097d523365SDimitry Andric } 24107d523365SDimitry Andric } 24117d523365SDimitry Andric Stream.ExitBlock(); 24127d523365SDimitry Andric } 24137d523365SDimitry Andric 241439d628a0SDimitry Andric static void WriteUseList(ValueEnumerator &VE, UseListOrder &&Order, 241539d628a0SDimitry Andric BitstreamWriter &Stream) { 241639d628a0SDimitry Andric assert(Order.Shuffle.size() >= 2 && "Shuffle too small"); 241739d628a0SDimitry Andric unsigned Code; 241839d628a0SDimitry Andric if (isa<BasicBlock>(Order.V)) 241939d628a0SDimitry Andric Code = bitc::USELIST_CODE_BB; 242039d628a0SDimitry Andric else 242139d628a0SDimitry Andric Code = bitc::USELIST_CODE_DEFAULT; 242239d628a0SDimitry Andric 2423ff0cc061SDimitry Andric SmallVector<uint64_t, 64> Record(Order.Shuffle.begin(), Order.Shuffle.end()); 242439d628a0SDimitry Andric Record.push_back(VE.getValueID(Order.V)); 242539d628a0SDimitry Andric Stream.EmitRecord(Code, Record); 242639d628a0SDimitry Andric } 242739d628a0SDimitry Andric 242839d628a0SDimitry Andric static void WriteUseListBlock(const Function *F, ValueEnumerator &VE, 242939d628a0SDimitry Andric BitstreamWriter &Stream) { 2430ff0cc061SDimitry Andric assert(VE.shouldPreserveUseListOrder() && 2431ff0cc061SDimitry Andric "Expected to be preserving use-list order"); 2432ff0cc061SDimitry Andric 243339d628a0SDimitry Andric auto hasMore = [&]() { 243439d628a0SDimitry Andric return !VE.UseListOrders.empty() && VE.UseListOrders.back().F == F; 243539d628a0SDimitry Andric }; 243639d628a0SDimitry Andric if (!hasMore()) 243739d628a0SDimitry Andric // Nothing to do. 243839d628a0SDimitry Andric return; 243939d628a0SDimitry Andric 244039d628a0SDimitry Andric Stream.EnterSubblock(bitc::USELIST_BLOCK_ID, 3); 244139d628a0SDimitry Andric while (hasMore()) { 244239d628a0SDimitry Andric WriteUseList(VE, std::move(VE.UseListOrders.back()), Stream); 244339d628a0SDimitry Andric VE.UseListOrders.pop_back(); 244439d628a0SDimitry Andric } 244539d628a0SDimitry Andric Stream.ExitBlock(); 244639d628a0SDimitry Andric } 244739d628a0SDimitry Andric 24487d523365SDimitry Andric /// \brief Save information for the given function into the function index. 24497d523365SDimitry Andric /// 24507d523365SDimitry Andric /// At a minimum this saves the bitcode index of the function record that 24517d523365SDimitry Andric /// was just written. However, if we are emitting function summary information, 24527d523365SDimitry Andric /// for example for ThinLTO, then a \a FunctionSummary object is created 24537d523365SDimitry Andric /// to hold the provided summary information. 24547d523365SDimitry Andric static void SaveFunctionInfo( 24557d523365SDimitry Andric const Function &F, 24567d523365SDimitry Andric DenseMap<const Function *, std::unique_ptr<FunctionInfo>> &FunctionIndex, 24577d523365SDimitry Andric unsigned NumInsts, uint64_t BitcodeIndex, bool EmitFunctionSummary) { 24587d523365SDimitry Andric std::unique_ptr<FunctionSummary> FuncSummary; 24597d523365SDimitry Andric if (EmitFunctionSummary) { 24607d523365SDimitry Andric FuncSummary = llvm::make_unique<FunctionSummary>(NumInsts); 24617d523365SDimitry Andric FuncSummary->setLocalFunction(F.hasLocalLinkage()); 24627d523365SDimitry Andric } 24637d523365SDimitry Andric FunctionIndex[&F] = 24647d523365SDimitry Andric llvm::make_unique<FunctionInfo>(BitcodeIndex, std::move(FuncSummary)); 24657d523365SDimitry Andric } 24667d523365SDimitry Andric 24677d523365SDimitry Andric /// Emit a function body to the module stream. 24687d523365SDimitry Andric static void WriteFunction( 24697d523365SDimitry Andric const Function &F, ValueEnumerator &VE, BitstreamWriter &Stream, 24707d523365SDimitry Andric DenseMap<const Function *, std::unique_ptr<FunctionInfo>> &FunctionIndex, 24717d523365SDimitry Andric bool EmitFunctionSummary) { 24727d523365SDimitry Andric // Save the bitcode index of the start of this function block for recording 24737d523365SDimitry Andric // in the VST. 24747d523365SDimitry Andric uint64_t BitcodeIndex = Stream.GetCurrentBitNo(); 24757d523365SDimitry Andric 2476f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::FUNCTION_BLOCK_ID, 4); 2477f22ef01cSRoman Divacky VE.incorporateFunction(F); 2478f22ef01cSRoman Divacky 2479f22ef01cSRoman Divacky SmallVector<unsigned, 64> Vals; 2480f22ef01cSRoman Divacky 2481f22ef01cSRoman Divacky // Emit the number of basic blocks, so the reader can create them ahead of 2482f22ef01cSRoman Divacky // time. 2483f22ef01cSRoman Divacky Vals.push_back(VE.getBasicBlocks().size()); 2484f22ef01cSRoman Divacky Stream.EmitRecord(bitc::FUNC_CODE_DECLAREBLOCKS, Vals); 2485f22ef01cSRoman Divacky Vals.clear(); 2486f22ef01cSRoman Divacky 2487f22ef01cSRoman Divacky // If there are function-local constants, emit them now. 2488f22ef01cSRoman Divacky unsigned CstStart, CstEnd; 2489f22ef01cSRoman Divacky VE.getFunctionConstantRange(CstStart, CstEnd); 2490f22ef01cSRoman Divacky WriteConstants(CstStart, CstEnd, VE, Stream, false); 2491f22ef01cSRoman Divacky 2492f22ef01cSRoman Divacky // If there is function-local metadata, emit it now. 2493f22ef01cSRoman Divacky WriteFunctionLocalMetadata(F, VE, Stream); 2494f22ef01cSRoman Divacky 2495f22ef01cSRoman Divacky // Keep a running idea of what the instruction ID is. 2496f22ef01cSRoman Divacky unsigned InstID = CstEnd; 2497f22ef01cSRoman Divacky 2498ff0cc061SDimitry Andric bool NeedsMetadataAttachment = F.hasMetadata(); 2499f22ef01cSRoman Divacky 2500ff0cc061SDimitry Andric DILocation *LastDL = nullptr; 25017d523365SDimitry Andric unsigned NumInsts = 0; 2502f22ef01cSRoman Divacky 2503f22ef01cSRoman Divacky // Finally, emit all the instructions, in order. 2504f22ef01cSRoman Divacky for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 2505f22ef01cSRoman Divacky for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); 2506f22ef01cSRoman Divacky I != E; ++I) { 2507f22ef01cSRoman Divacky WriteInstruction(*I, InstID, VE, Stream, Vals); 2508f22ef01cSRoman Divacky 25097d523365SDimitry Andric if (!isa<DbgInfoIntrinsic>(I)) 25107d523365SDimitry Andric ++NumInsts; 25117d523365SDimitry Andric 2512f22ef01cSRoman Divacky if (!I->getType()->isVoidTy()) 2513f22ef01cSRoman Divacky ++InstID; 2514f22ef01cSRoman Divacky 2515f22ef01cSRoman Divacky // If the instruction has metadata, write a metadata attachment later. 2516f22ef01cSRoman Divacky NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); 2517f22ef01cSRoman Divacky 2518f22ef01cSRoman Divacky // If the instruction has a debug location, emit it. 2519ff0cc061SDimitry Andric DILocation *DL = I->getDebugLoc(); 2520ff0cc061SDimitry Andric if (!DL) 2521ff0cc061SDimitry Andric continue; 2522ff0cc061SDimitry Andric 2523ff0cc061SDimitry Andric if (DL == LastDL) { 2524f22ef01cSRoman Divacky // Just repeat the same debug loc as last time. 2525f22ef01cSRoman Divacky Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); 2526ff0cc061SDimitry Andric continue; 2527ff0cc061SDimitry Andric } 2528f22ef01cSRoman Divacky 2529ff0cc061SDimitry Andric Vals.push_back(DL->getLine()); 2530ff0cc061SDimitry Andric Vals.push_back(DL->getColumn()); 2531ff0cc061SDimitry Andric Vals.push_back(VE.getMetadataOrNullID(DL->getScope())); 2532ff0cc061SDimitry Andric Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt())); 253317a519f9SDimitry Andric Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); 2534f22ef01cSRoman Divacky Vals.clear(); 2535f22ef01cSRoman Divacky 2536f22ef01cSRoman Divacky LastDL = DL; 2537f22ef01cSRoman Divacky } 2538f22ef01cSRoman Divacky 2539f22ef01cSRoman Divacky // Emit names for all the instructions etc. 2540f22ef01cSRoman Divacky WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); 2541f22ef01cSRoman Divacky 2542f22ef01cSRoman Divacky if (NeedsMetadataAttachment) 2543f22ef01cSRoman Divacky WriteMetadataAttachment(F, VE, Stream); 2544ff0cc061SDimitry Andric if (VE.shouldPreserveUseListOrder()) 254539d628a0SDimitry Andric WriteUseListBlock(&F, VE, Stream); 2546f22ef01cSRoman Divacky VE.purgeFunction(); 2547f22ef01cSRoman Divacky Stream.ExitBlock(); 25487d523365SDimitry Andric 25497d523365SDimitry Andric SaveFunctionInfo(F, FunctionIndex, NumInsts, BitcodeIndex, 25507d523365SDimitry Andric EmitFunctionSummary); 2551f22ef01cSRoman Divacky } 2552f22ef01cSRoman Divacky 2553f22ef01cSRoman Divacky // Emit blockinfo, which defines the standard abbreviations etc. 2554f22ef01cSRoman Divacky static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) { 2555f22ef01cSRoman Divacky // We only want to emit block info records for blocks that have multiple 25563861d79fSDimitry Andric // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK. 25573861d79fSDimitry Andric // Other blocks can define their abbrevs inline. 2558f22ef01cSRoman Divacky Stream.EnterBlockInfoBlock(2); 2559f22ef01cSRoman Divacky 2560f22ef01cSRoman Divacky { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings. 2561f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2562f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); 2563f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 2564f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 2565f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 2566f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, 2567f22ef01cSRoman Divacky Abbv) != VST_ENTRY_8_ABBREV) 2568f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2569f22ef01cSRoman Divacky } 2570f22ef01cSRoman Divacky 2571f22ef01cSRoman Divacky { // 7-bit fixed width VST_ENTRY strings. 2572f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2573f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY)); 2574f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 2575f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 2576f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 2577f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, 2578f22ef01cSRoman Divacky Abbv) != VST_ENTRY_7_ABBREV) 2579f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2580f22ef01cSRoman Divacky } 2581f22ef01cSRoman Divacky { // 6-bit char6 VST_ENTRY strings. 2582f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2583f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY)); 2584f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 2585f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 2586f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 2587f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, 2588f22ef01cSRoman Divacky Abbv) != VST_ENTRY_6_ABBREV) 2589f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2590f22ef01cSRoman Divacky } 2591f22ef01cSRoman Divacky { // 6-bit char6 VST_BBENTRY strings. 2592f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2593f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY)); 2594f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 2595f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 2596f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 2597f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, 2598f22ef01cSRoman Divacky Abbv) != VST_BBENTRY_6_ABBREV) 2599f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2600f22ef01cSRoman Divacky } 2601f22ef01cSRoman Divacky 2602f22ef01cSRoman Divacky 2603f22ef01cSRoman Divacky 2604f22ef01cSRoman Divacky { // SETTYPE abbrev for CONSTANTS_BLOCK. 2605f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2606f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE)); 2607f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2608ff0cc061SDimitry Andric VE.computeBitsRequiredForTypeIndicies())); 2609f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, 2610f22ef01cSRoman Divacky Abbv) != CONSTANTS_SETTYPE_ABBREV) 2611f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2612f22ef01cSRoman Divacky } 2613f22ef01cSRoman Divacky 2614f22ef01cSRoman Divacky { // INTEGER abbrev for CONSTANTS_BLOCK. 2615f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2616f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER)); 2617f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 2618f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, 2619f22ef01cSRoman Divacky Abbv) != CONSTANTS_INTEGER_ABBREV) 2620f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2621f22ef01cSRoman Divacky } 2622f22ef01cSRoman Divacky 2623f22ef01cSRoman Divacky { // CE_CAST abbrev for CONSTANTS_BLOCK. 2624f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2625f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST)); 2626f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc 2627f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid 2628ff0cc061SDimitry Andric VE.computeBitsRequiredForTypeIndicies())); 2629f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id 2630f22ef01cSRoman Divacky 2631f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, 2632f22ef01cSRoman Divacky Abbv) != CONSTANTS_CE_CAST_Abbrev) 2633f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2634f22ef01cSRoman Divacky } 2635f22ef01cSRoman Divacky { // NULL abbrev for CONSTANTS_BLOCK. 2636f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2637f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL)); 2638f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, 2639f22ef01cSRoman Divacky Abbv) != CONSTANTS_NULL_Abbrev) 2640f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2641f22ef01cSRoman Divacky } 2642f22ef01cSRoman Divacky 2643f22ef01cSRoman Divacky // FIXME: This should only use space for first class types! 2644f22ef01cSRoman Divacky 2645f22ef01cSRoman Divacky { // INST_LOAD abbrev for FUNCTION_BLOCK. 2646f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2647f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD)); 2648f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr 2649ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty 2650ff0cc061SDimitry Andric VE.computeBitsRequiredForTypeIndicies())); 2651f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align 2652f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile 2653f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2654f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_LOAD_ABBREV) 2655f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2656f22ef01cSRoman Divacky } 2657f22ef01cSRoman Divacky { // INST_BINOP abbrev for FUNCTION_BLOCK. 2658f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2659f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP)); 2660f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS 2661f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS 2662f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 2663f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2664f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_BINOP_ABBREV) 2665f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2666f22ef01cSRoman Divacky } 2667f22ef01cSRoman Divacky { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK. 2668f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2669f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP)); 2670f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS 2671f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS 2672f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 2673f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags 2674f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2675f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_BINOP_FLAGS_ABBREV) 2676f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2677f22ef01cSRoman Divacky } 2678f22ef01cSRoman Divacky { // INST_CAST abbrev for FUNCTION_BLOCK. 2679f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2680f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST)); 2681f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal 2682f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty 2683ff0cc061SDimitry Andric VE.computeBitsRequiredForTypeIndicies())); 2684f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 2685f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2686f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_CAST_ABBREV) 2687f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2688f22ef01cSRoman Divacky } 2689f22ef01cSRoman Divacky 2690f22ef01cSRoman Divacky { // INST_RET abbrev for FUNCTION_BLOCK. 2691f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2692f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET)); 2693f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2694f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_RET_VOID_ABBREV) 2695f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2696f22ef01cSRoman Divacky } 2697f22ef01cSRoman Divacky { // INST_RET abbrev for FUNCTION_BLOCK. 2698f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2699f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET)); 2700f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID 2701f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2702f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_RET_VAL_ABBREV) 2703f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2704f22ef01cSRoman Divacky } 2705f22ef01cSRoman Divacky { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK. 2706f22ef01cSRoman Divacky BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2707f22ef01cSRoman Divacky Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE)); 2708f22ef01cSRoman Divacky if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, 2709f22ef01cSRoman Divacky Abbv) != FUNCTION_INST_UNREACHABLE_ABBREV) 2710f22ef01cSRoman Divacky llvm_unreachable("Unexpected abbrev ordering!"); 2711f22ef01cSRoman Divacky } 2712ff0cc061SDimitry Andric { 2713ff0cc061SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 2714ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_GEP)); 2715ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); 2716ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty 2717ff0cc061SDimitry Andric Log2_32_Ceil(VE.getTypes().size() + 1))); 2718ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 2719ff0cc061SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 2720ff0cc061SDimitry Andric if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) != 2721ff0cc061SDimitry Andric FUNCTION_INST_GEP_ABBREV) 2722ff0cc061SDimitry Andric llvm_unreachable("Unexpected abbrev ordering!"); 2723ff0cc061SDimitry Andric } 2724f22ef01cSRoman Divacky 2725f22ef01cSRoman Divacky Stream.ExitBlock(); 2726f22ef01cSRoman Divacky } 2727f22ef01cSRoman Divacky 27287d523365SDimitry Andric /// Write the module path strings, currently only used when generating 27297d523365SDimitry Andric /// a combined index file. 27307d523365SDimitry Andric static void WriteModStrings(const FunctionInfoIndex &I, 27317d523365SDimitry Andric BitstreamWriter &Stream) { 27327d523365SDimitry Andric Stream.EnterSubblock(bitc::MODULE_STRTAB_BLOCK_ID, 3); 27337d523365SDimitry Andric 27347d523365SDimitry Andric // TODO: See which abbrev sizes we actually need to emit 27357d523365SDimitry Andric 27367d523365SDimitry Andric // 8-bit fixed-width MST_ENTRY strings. 27377d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 27387d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY)); 27397d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 27407d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 27417d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 27427d523365SDimitry Andric unsigned Abbrev8Bit = Stream.EmitAbbrev(Abbv); 27437d523365SDimitry Andric 27447d523365SDimitry Andric // 7-bit fixed width MST_ENTRY strings. 27457d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 27467d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY)); 27477d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 27487d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 27497d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 27507d523365SDimitry Andric unsigned Abbrev7Bit = Stream.EmitAbbrev(Abbv); 27517d523365SDimitry Andric 27527d523365SDimitry Andric // 6-bit char6 MST_ENTRY strings. 27537d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 27547d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY)); 27557d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 27567d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 27577d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 27587d523365SDimitry Andric unsigned Abbrev6Bit = Stream.EmitAbbrev(Abbv); 27597d523365SDimitry Andric 27607d523365SDimitry Andric SmallVector<unsigned, 64> NameVals; 27617d523365SDimitry Andric for (const StringMapEntry<uint64_t> &MPSE : I.modPathStringEntries()) { 27627d523365SDimitry Andric StringEncoding Bits = 27637d523365SDimitry Andric getStringEncoding(MPSE.getKey().data(), MPSE.getKey().size()); 27647d523365SDimitry Andric unsigned AbbrevToUse = Abbrev8Bit; 27657d523365SDimitry Andric if (Bits == SE_Char6) 27667d523365SDimitry Andric AbbrevToUse = Abbrev6Bit; 27677d523365SDimitry Andric else if (Bits == SE_Fixed7) 27687d523365SDimitry Andric AbbrevToUse = Abbrev7Bit; 27697d523365SDimitry Andric 27707d523365SDimitry Andric NameVals.push_back(MPSE.getValue()); 27717d523365SDimitry Andric 27727d523365SDimitry Andric for (const auto P : MPSE.getKey()) 27737d523365SDimitry Andric NameVals.push_back((unsigned char)P); 27747d523365SDimitry Andric 27757d523365SDimitry Andric // Emit the finished record. 27767d523365SDimitry Andric Stream.EmitRecord(bitc::MST_CODE_ENTRY, NameVals, AbbrevToUse); 27777d523365SDimitry Andric NameVals.clear(); 27787d523365SDimitry Andric } 27797d523365SDimitry Andric Stream.ExitBlock(); 27807d523365SDimitry Andric } 27817d523365SDimitry Andric 27827d523365SDimitry Andric // Helper to emit a single function summary record. 27837d523365SDimitry Andric static void WritePerModuleFunctionSummaryRecord( 27847d523365SDimitry Andric SmallVector<unsigned, 64> &NameVals, FunctionSummary *FS, unsigned ValueID, 27857d523365SDimitry Andric unsigned FSAbbrev, BitstreamWriter &Stream) { 27867d523365SDimitry Andric assert(FS); 27877d523365SDimitry Andric NameVals.push_back(ValueID); 27887d523365SDimitry Andric NameVals.push_back(FS->isLocalFunction()); 27897d523365SDimitry Andric NameVals.push_back(FS->instCount()); 27907d523365SDimitry Andric 27917d523365SDimitry Andric // Emit the finished record. 27927d523365SDimitry Andric Stream.EmitRecord(bitc::FS_CODE_PERMODULE_ENTRY, NameVals, FSAbbrev); 27937d523365SDimitry Andric NameVals.clear(); 27947d523365SDimitry Andric } 27957d523365SDimitry Andric 27967d523365SDimitry Andric /// Emit the per-module function summary section alongside the rest of 27977d523365SDimitry Andric /// the module's bitcode. 27987d523365SDimitry Andric static void WritePerModuleFunctionSummary( 27997d523365SDimitry Andric DenseMap<const Function *, std::unique_ptr<FunctionInfo>> &FunctionIndex, 28007d523365SDimitry Andric const Module *M, const ValueEnumerator &VE, BitstreamWriter &Stream) { 28017d523365SDimitry Andric Stream.EnterSubblock(bitc::FUNCTION_SUMMARY_BLOCK_ID, 3); 28027d523365SDimitry Andric 28037d523365SDimitry Andric // Abbrev for FS_CODE_PERMODULE_ENTRY. 28047d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 28057d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::FS_CODE_PERMODULE_ENTRY)); 28067d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid 28077d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // islocal 28087d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount 28097d523365SDimitry Andric unsigned FSAbbrev = Stream.EmitAbbrev(Abbv); 28107d523365SDimitry Andric 28117d523365SDimitry Andric SmallVector<unsigned, 64> NameVals; 28127d523365SDimitry Andric for (auto &I : FunctionIndex) { 28137d523365SDimitry Andric // Skip anonymous functions. We will emit a function summary for 28147d523365SDimitry Andric // any aliases below. 28157d523365SDimitry Andric if (!I.first->hasName()) 28167d523365SDimitry Andric continue; 28177d523365SDimitry Andric 28187d523365SDimitry Andric WritePerModuleFunctionSummaryRecord( 28197d523365SDimitry Andric NameVals, I.second->functionSummary(), 28207d523365SDimitry Andric VE.getValueID(M->getValueSymbolTable().lookup(I.first->getName())), 28217d523365SDimitry Andric FSAbbrev, Stream); 28227d523365SDimitry Andric } 28237d523365SDimitry Andric 28247d523365SDimitry Andric for (const GlobalAlias &A : M->aliases()) { 28257d523365SDimitry Andric if (!A.getBaseObject()) 28267d523365SDimitry Andric continue; 28277d523365SDimitry Andric const Function *F = dyn_cast<Function>(A.getBaseObject()); 28287d523365SDimitry Andric if (!F || F->isDeclaration()) 28297d523365SDimitry Andric continue; 28307d523365SDimitry Andric 28317d523365SDimitry Andric assert(FunctionIndex.count(F) == 1); 28327d523365SDimitry Andric WritePerModuleFunctionSummaryRecord( 28337d523365SDimitry Andric NameVals, FunctionIndex[F]->functionSummary(), 28347d523365SDimitry Andric VE.getValueID(M->getValueSymbolTable().lookup(A.getName())), FSAbbrev, 28357d523365SDimitry Andric Stream); 28367d523365SDimitry Andric } 28377d523365SDimitry Andric 28387d523365SDimitry Andric Stream.ExitBlock(); 28397d523365SDimitry Andric } 28407d523365SDimitry Andric 28417d523365SDimitry Andric /// Emit the combined function summary section into the combined index 28427d523365SDimitry Andric /// file. 28437d523365SDimitry Andric static void WriteCombinedFunctionSummary(const FunctionInfoIndex &I, 28447d523365SDimitry Andric BitstreamWriter &Stream) { 28457d523365SDimitry Andric Stream.EnterSubblock(bitc::FUNCTION_SUMMARY_BLOCK_ID, 3); 28467d523365SDimitry Andric 28477d523365SDimitry Andric // Abbrev for FS_CODE_COMBINED_ENTRY. 28487d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 28497d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::FS_CODE_COMBINED_ENTRY)); 28507d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid 28517d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount 28527d523365SDimitry Andric unsigned FSAbbrev = Stream.EmitAbbrev(Abbv); 28537d523365SDimitry Andric 28547d523365SDimitry Andric SmallVector<unsigned, 64> NameVals; 28557d523365SDimitry Andric for (const auto &FII : I) { 28567d523365SDimitry Andric for (auto &FI : FII.getValue()) { 28577d523365SDimitry Andric FunctionSummary *FS = FI->functionSummary(); 28587d523365SDimitry Andric assert(FS); 28597d523365SDimitry Andric 28607d523365SDimitry Andric NameVals.push_back(I.getModuleId(FS->modulePath())); 28617d523365SDimitry Andric NameVals.push_back(FS->instCount()); 28627d523365SDimitry Andric 28637d523365SDimitry Andric // Record the starting offset of this summary entry for use 28647d523365SDimitry Andric // in the VST entry. Add the current code size since the 28657d523365SDimitry Andric // reader will invoke readRecord after the abbrev id read. 28667d523365SDimitry Andric FI->setBitcodeIndex(Stream.GetCurrentBitNo() + Stream.GetAbbrevIDWidth()); 28677d523365SDimitry Andric 28687d523365SDimitry Andric // Emit the finished record. 28697d523365SDimitry Andric Stream.EmitRecord(bitc::FS_CODE_COMBINED_ENTRY, NameVals, FSAbbrev); 28707d523365SDimitry Andric NameVals.clear(); 28717d523365SDimitry Andric } 28727d523365SDimitry Andric } 28737d523365SDimitry Andric 28747d523365SDimitry Andric Stream.ExitBlock(); 28757d523365SDimitry Andric } 28767d523365SDimitry Andric 28777d523365SDimitry Andric // Create the "IDENTIFICATION_BLOCK_ID" containing a single string with the 28787d523365SDimitry Andric // current llvm version, and a record for the epoch number. 28797d523365SDimitry Andric static void WriteIdentificationBlock(const Module *M, BitstreamWriter &Stream) { 28807d523365SDimitry Andric Stream.EnterSubblock(bitc::IDENTIFICATION_BLOCK_ID, 5); 28817d523365SDimitry Andric 28827d523365SDimitry Andric // Write the "user readable" string identifying the bitcode producer 28837d523365SDimitry Andric BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 28847d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::IDENTIFICATION_CODE_STRING)); 28857d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 28867d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 28877d523365SDimitry Andric auto StringAbbrev = Stream.EmitAbbrev(Abbv); 28887d523365SDimitry Andric WriteStringRecord(bitc::IDENTIFICATION_CODE_STRING, 28897d523365SDimitry Andric "LLVM" LLVM_VERSION_STRING, StringAbbrev, Stream); 28907d523365SDimitry Andric 28917d523365SDimitry Andric // Write the epoch version 28927d523365SDimitry Andric Abbv = new BitCodeAbbrev(); 28937d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(bitc::IDENTIFICATION_CODE_EPOCH)); 28947d523365SDimitry Andric Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); 28957d523365SDimitry Andric auto EpochAbbrev = Stream.EmitAbbrev(Abbv); 28967d523365SDimitry Andric SmallVector<unsigned, 1> Vals = {bitc::BITCODE_CURRENT_EPOCH}; 28977d523365SDimitry Andric Stream.EmitRecord(bitc::IDENTIFICATION_CODE_EPOCH, Vals, EpochAbbrev); 28987d523365SDimitry Andric Stream.ExitBlock(); 28997d523365SDimitry Andric } 29007d523365SDimitry Andric 2901f22ef01cSRoman Divacky /// WriteModule - Emit the specified module to the bitstream. 2902ff0cc061SDimitry Andric static void WriteModule(const Module *M, BitstreamWriter &Stream, 29037d523365SDimitry Andric bool ShouldPreserveUseListOrder, 29047d523365SDimitry Andric uint64_t BitcodeStartBit, bool EmitFunctionSummary) { 2905f22ef01cSRoman Divacky Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3); 2906f22ef01cSRoman Divacky 2907f22ef01cSRoman Divacky SmallVector<unsigned, 1> Vals; 29083861d79fSDimitry Andric unsigned CurVersion = 1; 2909f22ef01cSRoman Divacky Vals.push_back(CurVersion); 2910f22ef01cSRoman Divacky Stream.EmitRecord(bitc::MODULE_CODE_VERSION, Vals); 2911f22ef01cSRoman Divacky 2912f22ef01cSRoman Divacky // Analyze the module, enumerating globals, functions, etc. 2913ff0cc061SDimitry Andric ValueEnumerator VE(*M, ShouldPreserveUseListOrder); 2914f22ef01cSRoman Divacky 2915f22ef01cSRoman Divacky // Emit blockinfo, which defines the standard abbreviations etc. 2916f22ef01cSRoman Divacky WriteBlockInfo(VE, Stream); 2917f22ef01cSRoman Divacky 2918139f7f9bSDimitry Andric // Emit information about attribute groups. 2919139f7f9bSDimitry Andric WriteAttributeGroupTable(VE, Stream); 2920139f7f9bSDimitry Andric 2921f22ef01cSRoman Divacky // Emit information about parameter attributes. 2922f22ef01cSRoman Divacky WriteAttributeTable(VE, Stream); 2923f22ef01cSRoman Divacky 2924f22ef01cSRoman Divacky // Emit information describing all of the types in the module. 2925f22ef01cSRoman Divacky WriteTypeTable(VE, Stream); 2926f22ef01cSRoman Divacky 292791bc56edSDimitry Andric writeComdats(VE, Stream); 292891bc56edSDimitry Andric 2929f22ef01cSRoman Divacky // Emit top-level description of module, including target triple, inline asm, 2930f22ef01cSRoman Divacky // descriptors for global variables, and function prototype info. 29317d523365SDimitry Andric uint64_t VSTOffsetPlaceholder = WriteModuleInfo(M, VE, Stream); 2932f22ef01cSRoman Divacky 2933f22ef01cSRoman Divacky // Emit constants. 2934f22ef01cSRoman Divacky WriteModuleConstants(VE, Stream); 2935f22ef01cSRoman Divacky 2936f22ef01cSRoman Divacky // Emit metadata. 2937e580952dSDimitry Andric WriteModuleMetadata(M, VE, Stream); 2938f22ef01cSRoman Divacky 2939f22ef01cSRoman Divacky // Emit metadata. 2940f22ef01cSRoman Divacky WriteModuleMetadataStore(M, Stream); 2941f22ef01cSRoman Divacky 294239d628a0SDimitry Andric // Emit module-level use-lists. 2943ff0cc061SDimitry Andric if (VE.shouldPreserveUseListOrder()) 294439d628a0SDimitry Andric WriteUseListBlock(nullptr, VE, Stream); 2945dff0c46cSDimitry Andric 29467d523365SDimitry Andric WriteOperandBundleTags(M, Stream); 29477d523365SDimitry Andric 2948dff0c46cSDimitry Andric // Emit function bodies. 29497d523365SDimitry Andric DenseMap<const Function *, std::unique_ptr<FunctionInfo>> FunctionIndex; 2950dff0c46cSDimitry Andric for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) 2951dff0c46cSDimitry Andric if (!F->isDeclaration()) 29527d523365SDimitry Andric WriteFunction(*F, VE, Stream, FunctionIndex, EmitFunctionSummary); 29537d523365SDimitry Andric 29547d523365SDimitry Andric // Need to write after the above call to WriteFunction which populates 29557d523365SDimitry Andric // the summary information in the index. 29567d523365SDimitry Andric if (EmitFunctionSummary) 29577d523365SDimitry Andric WritePerModuleFunctionSummary(FunctionIndex, M, VE, Stream); 29587d523365SDimitry Andric 29597d523365SDimitry Andric WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream, 29607d523365SDimitry Andric VSTOffsetPlaceholder, BitcodeStartBit, &FunctionIndex); 2961dff0c46cSDimitry Andric 2962f22ef01cSRoman Divacky Stream.ExitBlock(); 2963f22ef01cSRoman Divacky } 2964f22ef01cSRoman Divacky 2965f22ef01cSRoman Divacky /// EmitDarwinBCHeader - If generating a bc file on darwin, we have to emit a 2966f22ef01cSRoman Divacky /// header and trailer to make it compatible with the system archiver. To do 2967f22ef01cSRoman Divacky /// this we emit the following header, and then emit a trailer that pads the 2968f22ef01cSRoman Divacky /// file out to be a multiple of 16 bytes. 2969f22ef01cSRoman Divacky /// 2970f22ef01cSRoman Divacky /// struct bc_header { 2971f22ef01cSRoman Divacky /// uint32_t Magic; // 0x0B17C0DE 2972f22ef01cSRoman Divacky /// uint32_t Version; // Version, currently always 0. 2973f22ef01cSRoman Divacky /// uint32_t BitcodeOffset; // Offset to traditional bitcode file. 2974f22ef01cSRoman Divacky /// uint32_t BitcodeSize; // Size of traditional bitcode file. 2975f22ef01cSRoman Divacky /// uint32_t CPUType; // CPU specifier. 2976f22ef01cSRoman Divacky /// ... potentially more later ... 2977f22ef01cSRoman Divacky /// }; 2978f22ef01cSRoman Divacky enum { 2979f22ef01cSRoman Divacky DarwinBCSizeFieldOffset = 3*4, // Offset to bitcode_size. 2980f22ef01cSRoman Divacky DarwinBCHeaderSize = 5*4 2981f22ef01cSRoman Divacky }; 2982f22ef01cSRoman Divacky 2983dff0c46cSDimitry Andric static void WriteInt32ToBuffer(uint32_t Value, SmallVectorImpl<char> &Buffer, 2984dff0c46cSDimitry Andric uint32_t &Position) { 29858f0fd8f6SDimitry Andric support::endian::write32le(&Buffer[Position], Value); 2986dff0c46cSDimitry Andric Position += 4; 2987dff0c46cSDimitry Andric } 2988dff0c46cSDimitry Andric 2989dff0c46cSDimitry Andric static void EmitDarwinBCHeaderAndTrailer(SmallVectorImpl<char> &Buffer, 2990dff0c46cSDimitry Andric const Triple &TT) { 2991f22ef01cSRoman Divacky unsigned CPUType = ~0U; 2992f22ef01cSRoman Divacky 2993f22ef01cSRoman Divacky // Match x86_64-*, i[3-9]86-*, powerpc-*, powerpc64-*, arm-*, thumb-*, 2994f22ef01cSRoman Divacky // armv[0-9]-*, thumbv[0-9]-*, armv5te-*, or armv6t2-*. The CPUType is a magic 2995f22ef01cSRoman Divacky // number from /usr/include/mach/machine.h. It is ok to reproduce the 2996f22ef01cSRoman Divacky // specific constants here because they are implicitly part of the Darwin ABI. 2997f22ef01cSRoman Divacky enum { 2998f22ef01cSRoman Divacky DARWIN_CPU_ARCH_ABI64 = 0x01000000, 2999f22ef01cSRoman Divacky DARWIN_CPU_TYPE_X86 = 7, 3000f22ef01cSRoman Divacky DARWIN_CPU_TYPE_ARM = 12, 3001f22ef01cSRoman Divacky DARWIN_CPU_TYPE_POWERPC = 18 3002f22ef01cSRoman Divacky }; 3003f22ef01cSRoman Divacky 300417a519f9SDimitry Andric Triple::ArchType Arch = TT.getArch(); 300517a519f9SDimitry Andric if (Arch == Triple::x86_64) 3006f22ef01cSRoman Divacky CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64; 300717a519f9SDimitry Andric else if (Arch == Triple::x86) 3008f22ef01cSRoman Divacky CPUType = DARWIN_CPU_TYPE_X86; 300917a519f9SDimitry Andric else if (Arch == Triple::ppc) 3010f22ef01cSRoman Divacky CPUType = DARWIN_CPU_TYPE_POWERPC; 301117a519f9SDimitry Andric else if (Arch == Triple::ppc64) 3012f22ef01cSRoman Divacky CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64; 301317a519f9SDimitry Andric else if (Arch == Triple::arm || Arch == Triple::thumb) 3014f22ef01cSRoman Divacky CPUType = DARWIN_CPU_TYPE_ARM; 3015f22ef01cSRoman Divacky 3016f22ef01cSRoman Divacky // Traditional Bitcode starts after header. 3017dff0c46cSDimitry Andric assert(Buffer.size() >= DarwinBCHeaderSize && 3018dff0c46cSDimitry Andric "Expected header size to be reserved"); 3019f22ef01cSRoman Divacky unsigned BCOffset = DarwinBCHeaderSize; 3020dff0c46cSDimitry Andric unsigned BCSize = Buffer.size()-DarwinBCHeaderSize; 3021f22ef01cSRoman Divacky 3022dff0c46cSDimitry Andric // Write the magic and version. 3023dff0c46cSDimitry Andric unsigned Position = 0; 3024dff0c46cSDimitry Andric WriteInt32ToBuffer(0x0B17C0DE , Buffer, Position); 3025dff0c46cSDimitry Andric WriteInt32ToBuffer(0 , Buffer, Position); // Version. 3026dff0c46cSDimitry Andric WriteInt32ToBuffer(BCOffset , Buffer, Position); 3027dff0c46cSDimitry Andric WriteInt32ToBuffer(BCSize , Buffer, Position); 3028dff0c46cSDimitry Andric WriteInt32ToBuffer(CPUType , Buffer, Position); 3029f22ef01cSRoman Divacky 3030f22ef01cSRoman Divacky // If the file is not a multiple of 16 bytes, insert dummy padding. 3031dff0c46cSDimitry Andric while (Buffer.size() & 15) 3032dff0c46cSDimitry Andric Buffer.push_back(0); 3033f22ef01cSRoman Divacky } 3034f22ef01cSRoman Divacky 30357d523365SDimitry Andric /// Helper to write the header common to all bitcode files. 30367d523365SDimitry Andric static void WriteBitcodeHeader(BitstreamWriter &Stream) { 30377d523365SDimitry Andric // Emit the file header. 30387d523365SDimitry Andric Stream.Emit((unsigned)'B', 8); 30397d523365SDimitry Andric Stream.Emit((unsigned)'C', 8); 30407d523365SDimitry Andric Stream.Emit(0x0, 4); 30417d523365SDimitry Andric Stream.Emit(0xC, 4); 30427d523365SDimitry Andric Stream.Emit(0xE, 4); 30437d523365SDimitry Andric Stream.Emit(0xD, 4); 30447d523365SDimitry Andric } 30457d523365SDimitry Andric 3046f22ef01cSRoman Divacky /// WriteBitcodeToFile - Write the specified module to the specified output 3047f22ef01cSRoman Divacky /// stream. 3048ff0cc061SDimitry Andric void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out, 30497d523365SDimitry Andric bool ShouldPreserveUseListOrder, 30507d523365SDimitry Andric bool EmitFunctionSummary) { 3051139f7f9bSDimitry Andric SmallVector<char, 0> Buffer; 3052f22ef01cSRoman Divacky Buffer.reserve(256*1024); 3053f22ef01cSRoman Divacky 3054dff0c46cSDimitry Andric // If this is darwin or another generic macho target, reserve space for the 3055dff0c46cSDimitry Andric // header. 305617a519f9SDimitry Andric Triple TT(M->getTargetTriple()); 305717a519f9SDimitry Andric if (TT.isOSDarwin()) 3058dff0c46cSDimitry Andric Buffer.insert(Buffer.begin(), DarwinBCHeaderSize, 0); 3059dff0c46cSDimitry Andric 3060dff0c46cSDimitry Andric // Emit the module into the buffer. 3061dff0c46cSDimitry Andric { 3062dff0c46cSDimitry Andric BitstreamWriter Stream(Buffer); 30637d523365SDimitry Andric // Save the start bit of the actual bitcode, in case there is space 30647d523365SDimitry Andric // saved at the start for the darwin header above. The reader stream 30657d523365SDimitry Andric // will start at the bitcode, and we need the offset of the VST 30667d523365SDimitry Andric // to line up. 30677d523365SDimitry Andric uint64_t BitcodeStartBit = Stream.GetCurrentBitNo(); 3068f22ef01cSRoman Divacky 3069f22ef01cSRoman Divacky // Emit the file header. 30707d523365SDimitry Andric WriteBitcodeHeader(Stream); 30717d523365SDimitry Andric 30727d523365SDimitry Andric WriteIdentificationBlock(M, Stream); 3073f22ef01cSRoman Divacky 3074f22ef01cSRoman Divacky // Emit the module. 30757d523365SDimitry Andric WriteModule(M, Stream, ShouldPreserveUseListOrder, BitcodeStartBit, 30767d523365SDimitry Andric EmitFunctionSummary); 3077dff0c46cSDimitry Andric } 3078f22ef01cSRoman Divacky 307917a519f9SDimitry Andric if (TT.isOSDarwin()) 3080dff0c46cSDimitry Andric EmitDarwinBCHeaderAndTrailer(Buffer, TT); 3081dff0c46cSDimitry Andric 3082dff0c46cSDimitry Andric // Write the generated bitstream to "Out". 3083dff0c46cSDimitry Andric Out.write((char*)&Buffer.front(), Buffer.size()); 3084f22ef01cSRoman Divacky } 30857d523365SDimitry Andric 30867d523365SDimitry Andric // Write the specified function summary index to the given raw output stream, 30877d523365SDimitry Andric // where it will be written in a new bitcode block. This is used when 30887d523365SDimitry Andric // writing the combined index file for ThinLTO. 30897d523365SDimitry Andric void llvm::WriteFunctionSummaryToFile(const FunctionInfoIndex &Index, 30907d523365SDimitry Andric raw_ostream &Out) { 30917d523365SDimitry Andric SmallVector<char, 0> Buffer; 30927d523365SDimitry Andric Buffer.reserve(256 * 1024); 30937d523365SDimitry Andric 30947d523365SDimitry Andric BitstreamWriter Stream(Buffer); 30957d523365SDimitry Andric 30967d523365SDimitry Andric // Emit the bitcode header. 30977d523365SDimitry Andric WriteBitcodeHeader(Stream); 30987d523365SDimitry Andric 30997d523365SDimitry Andric Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3); 31007d523365SDimitry Andric 31017d523365SDimitry Andric SmallVector<unsigned, 1> Vals; 31027d523365SDimitry Andric unsigned CurVersion = 1; 31037d523365SDimitry Andric Vals.push_back(CurVersion); 31047d523365SDimitry Andric Stream.EmitRecord(bitc::MODULE_CODE_VERSION, Vals); 31057d523365SDimitry Andric 31067d523365SDimitry Andric // Write the module paths in the combined index. 31077d523365SDimitry Andric WriteModStrings(Index, Stream); 31087d523365SDimitry Andric 31097d523365SDimitry Andric // Write the function summary combined index records. 31107d523365SDimitry Andric WriteCombinedFunctionSummary(Index, Stream); 31117d523365SDimitry Andric 31127d523365SDimitry Andric // Need a special VST writer for the combined index (we don't have a 31137d523365SDimitry Andric // real VST and real values when this is invoked). 31147d523365SDimitry Andric WriteCombinedValueSymbolTable(Index, Stream); 31157d523365SDimitry Andric 31167d523365SDimitry Andric Stream.ExitBlock(); 31177d523365SDimitry Andric 31187d523365SDimitry Andric Out.write((char *)&Buffer.front(), Buffer.size()); 31197d523365SDimitry Andric } 3120