1f22ef01cSRoman Divacky //===- BitcodeReader.cpp - Internal BitcodeReader implementation ----------===// 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 #include "llvm/Bitcode/ReaderWriter.h" 11f22ef01cSRoman Divacky #include "BitcodeReader.h" 12f22ef01cSRoman Divacky #include "llvm/ADT/SmallString.h" 13f22ef01cSRoman Divacky #include "llvm/ADT/SmallVector.h" 14139f7f9bSDimitry Andric #include "llvm/AutoUpgrade.h" 15f785676fSDimitry Andric #include "llvm/Bitcode/LLVMBitCodes.h" 16139f7f9bSDimitry Andric #include "llvm/IR/Constants.h" 17139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h" 18139f7f9bSDimitry Andric #include "llvm/IR/InlineAsm.h" 19139f7f9bSDimitry Andric #include "llvm/IR/IntrinsicInst.h" 20f785676fSDimitry Andric #include "llvm/IR/LLVMContext.h" 21139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 22139f7f9bSDimitry Andric #include "llvm/IR/OperandTraits.h" 23139f7f9bSDimitry Andric #include "llvm/IR/Operator.h" 24dff0c46cSDimitry Andric #include "llvm/Support/DataStream.h" 25f22ef01cSRoman Divacky #include "llvm/Support/MathExtras.h" 26f22ef01cSRoman Divacky #include "llvm/Support/MemoryBuffer.h" 27f785676fSDimitry Andric #include "llvm/Support/raw_ostream.h" 28f22ef01cSRoman Divacky using namespace llvm; 29f22ef01cSRoman Divacky 307ae0e2c9SDimitry Andric enum { 317ae0e2c9SDimitry Andric SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex 327ae0e2c9SDimitry Andric }; 337ae0e2c9SDimitry Andric 34dff0c46cSDimitry Andric void BitcodeReader::materializeForwardReferencedFunctions() { 35dff0c46cSDimitry Andric while (!BlockAddrFwdRefs.empty()) { 36dff0c46cSDimitry Andric Function *F = BlockAddrFwdRefs.begin()->first; 37dff0c46cSDimitry Andric F->Materialize(); 38dff0c46cSDimitry Andric } 39dff0c46cSDimitry Andric } 40dff0c46cSDimitry Andric 41f22ef01cSRoman Divacky void BitcodeReader::FreeState() { 42f22ef01cSRoman Divacky if (BufferOwned) 43f22ef01cSRoman Divacky delete Buffer; 44f22ef01cSRoman Divacky Buffer = 0; 4517a519f9SDimitry Andric std::vector<Type*>().swap(TypeList); 46f22ef01cSRoman Divacky ValueList.clear(); 47f22ef01cSRoman Divacky MDValueList.clear(); 48f22ef01cSRoman Divacky 49139f7f9bSDimitry Andric std::vector<AttributeSet>().swap(MAttributes); 50f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 51f22ef01cSRoman Divacky std::vector<Function*>().swap(FunctionsWithBodies); 52f22ef01cSRoman Divacky DeferredFunctionInfo.clear(); 53e580952dSDimitry Andric MDKindMap.clear(); 543861d79fSDimitry Andric 553861d79fSDimitry Andric assert(BlockAddrFwdRefs.empty() && "Unresolved blockaddress fwd references"); 56f22ef01cSRoman Divacky } 57f22ef01cSRoman Divacky 58f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 59f22ef01cSRoman Divacky // Helper functions to implement forward reference resolution, etc. 60f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 61f22ef01cSRoman Divacky 62f22ef01cSRoman Divacky /// ConvertToString - Convert a string from a record into an std::string, return 63f22ef01cSRoman Divacky /// true on failure. 64f22ef01cSRoman Divacky template<typename StrTy> 657ae0e2c9SDimitry Andric static bool ConvertToString(ArrayRef<uint64_t> Record, unsigned Idx, 66f22ef01cSRoman Divacky StrTy &Result) { 67f22ef01cSRoman Divacky if (Idx > Record.size()) 68f22ef01cSRoman Divacky return true; 69f22ef01cSRoman Divacky 70f22ef01cSRoman Divacky for (unsigned i = Idx, e = Record.size(); i != e; ++i) 71f22ef01cSRoman Divacky Result += (char)Record[i]; 72f22ef01cSRoman Divacky return false; 73f22ef01cSRoman Divacky } 74f22ef01cSRoman Divacky 75f22ef01cSRoman Divacky static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) { 76f22ef01cSRoman Divacky switch (Val) { 77f22ef01cSRoman Divacky default: // Map unknown/new linkages to external 78f22ef01cSRoman Divacky case 0: return GlobalValue::ExternalLinkage; 79f22ef01cSRoman Divacky case 1: return GlobalValue::WeakAnyLinkage; 80f22ef01cSRoman Divacky case 2: return GlobalValue::AppendingLinkage; 81f22ef01cSRoman Divacky case 3: return GlobalValue::InternalLinkage; 82f22ef01cSRoman Divacky case 4: return GlobalValue::LinkOnceAnyLinkage; 83f22ef01cSRoman Divacky case 5: return GlobalValue::DLLImportLinkage; 84f22ef01cSRoman Divacky case 6: return GlobalValue::DLLExportLinkage; 85f22ef01cSRoman Divacky case 7: return GlobalValue::ExternalWeakLinkage; 86f22ef01cSRoman Divacky case 8: return GlobalValue::CommonLinkage; 87f22ef01cSRoman Divacky case 9: return GlobalValue::PrivateLinkage; 88f22ef01cSRoman Divacky case 10: return GlobalValue::WeakODRLinkage; 89f22ef01cSRoman Divacky case 11: return GlobalValue::LinkOnceODRLinkage; 90f22ef01cSRoman Divacky case 12: return GlobalValue::AvailableExternallyLinkage; 91f22ef01cSRoman Divacky case 13: return GlobalValue::LinkerPrivateLinkage; 92ffd1746dSEd Schouten case 14: return GlobalValue::LinkerPrivateWeakLinkage; 93f22ef01cSRoman Divacky } 94f22ef01cSRoman Divacky } 95f22ef01cSRoman Divacky 96f22ef01cSRoman Divacky static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) { 97f22ef01cSRoman Divacky switch (Val) { 98f22ef01cSRoman Divacky default: // Map unknown visibilities to default. 99f22ef01cSRoman Divacky case 0: return GlobalValue::DefaultVisibility; 100f22ef01cSRoman Divacky case 1: return GlobalValue::HiddenVisibility; 101f22ef01cSRoman Divacky case 2: return GlobalValue::ProtectedVisibility; 102f22ef01cSRoman Divacky } 103f22ef01cSRoman Divacky } 104f22ef01cSRoman Divacky 1057ae0e2c9SDimitry Andric static GlobalVariable::ThreadLocalMode GetDecodedThreadLocalMode(unsigned Val) { 1067ae0e2c9SDimitry Andric switch (Val) { 1077ae0e2c9SDimitry Andric case 0: return GlobalVariable::NotThreadLocal; 1087ae0e2c9SDimitry Andric default: // Map unknown non-zero value to general dynamic. 1097ae0e2c9SDimitry Andric case 1: return GlobalVariable::GeneralDynamicTLSModel; 1107ae0e2c9SDimitry Andric case 2: return GlobalVariable::LocalDynamicTLSModel; 1117ae0e2c9SDimitry Andric case 3: return GlobalVariable::InitialExecTLSModel; 1127ae0e2c9SDimitry Andric case 4: return GlobalVariable::LocalExecTLSModel; 1137ae0e2c9SDimitry Andric } 1147ae0e2c9SDimitry Andric } 1157ae0e2c9SDimitry Andric 116f22ef01cSRoman Divacky static int GetDecodedCastOpcode(unsigned Val) { 117f22ef01cSRoman Divacky switch (Val) { 118f22ef01cSRoman Divacky default: return -1; 119f22ef01cSRoman Divacky case bitc::CAST_TRUNC : return Instruction::Trunc; 120f22ef01cSRoman Divacky case bitc::CAST_ZEXT : return Instruction::ZExt; 121f22ef01cSRoman Divacky case bitc::CAST_SEXT : return Instruction::SExt; 122f22ef01cSRoman Divacky case bitc::CAST_FPTOUI : return Instruction::FPToUI; 123f22ef01cSRoman Divacky case bitc::CAST_FPTOSI : return Instruction::FPToSI; 124f22ef01cSRoman Divacky case bitc::CAST_UITOFP : return Instruction::UIToFP; 125f22ef01cSRoman Divacky case bitc::CAST_SITOFP : return Instruction::SIToFP; 126f22ef01cSRoman Divacky case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; 127f22ef01cSRoman Divacky case bitc::CAST_FPEXT : return Instruction::FPExt; 128f22ef01cSRoman Divacky case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; 129f22ef01cSRoman Divacky case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; 130f22ef01cSRoman Divacky case bitc::CAST_BITCAST : return Instruction::BitCast; 131f785676fSDimitry Andric case bitc::CAST_ADDRSPACECAST: return Instruction::AddrSpaceCast; 132f22ef01cSRoman Divacky } 133f22ef01cSRoman Divacky } 1346122f3e6SDimitry Andric static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) { 135f22ef01cSRoman Divacky switch (Val) { 136f22ef01cSRoman Divacky default: return -1; 137f22ef01cSRoman Divacky case bitc::BINOP_ADD: 138f22ef01cSRoman Divacky return Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; 139f22ef01cSRoman Divacky case bitc::BINOP_SUB: 140f22ef01cSRoman Divacky return Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; 141f22ef01cSRoman Divacky case bitc::BINOP_MUL: 142f22ef01cSRoman Divacky return Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; 143f22ef01cSRoman Divacky case bitc::BINOP_UDIV: return Instruction::UDiv; 144f22ef01cSRoman Divacky case bitc::BINOP_SDIV: 145f22ef01cSRoman Divacky return Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; 146f22ef01cSRoman Divacky case bitc::BINOP_UREM: return Instruction::URem; 147f22ef01cSRoman Divacky case bitc::BINOP_SREM: 148f22ef01cSRoman Divacky return Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; 149f22ef01cSRoman Divacky case bitc::BINOP_SHL: return Instruction::Shl; 150f22ef01cSRoman Divacky case bitc::BINOP_LSHR: return Instruction::LShr; 151f22ef01cSRoman Divacky case bitc::BINOP_ASHR: return Instruction::AShr; 152f22ef01cSRoman Divacky case bitc::BINOP_AND: return Instruction::And; 153f22ef01cSRoman Divacky case bitc::BINOP_OR: return Instruction::Or; 154f22ef01cSRoman Divacky case bitc::BINOP_XOR: return Instruction::Xor; 155f22ef01cSRoman Divacky } 156f22ef01cSRoman Divacky } 157f22ef01cSRoman Divacky 1586122f3e6SDimitry Andric static AtomicRMWInst::BinOp GetDecodedRMWOperation(unsigned Val) { 1596122f3e6SDimitry Andric switch (Val) { 1606122f3e6SDimitry Andric default: return AtomicRMWInst::BAD_BINOP; 1616122f3e6SDimitry Andric case bitc::RMW_XCHG: return AtomicRMWInst::Xchg; 1626122f3e6SDimitry Andric case bitc::RMW_ADD: return AtomicRMWInst::Add; 1636122f3e6SDimitry Andric case bitc::RMW_SUB: return AtomicRMWInst::Sub; 1646122f3e6SDimitry Andric case bitc::RMW_AND: return AtomicRMWInst::And; 1656122f3e6SDimitry Andric case bitc::RMW_NAND: return AtomicRMWInst::Nand; 1666122f3e6SDimitry Andric case bitc::RMW_OR: return AtomicRMWInst::Or; 1676122f3e6SDimitry Andric case bitc::RMW_XOR: return AtomicRMWInst::Xor; 1686122f3e6SDimitry Andric case bitc::RMW_MAX: return AtomicRMWInst::Max; 1696122f3e6SDimitry Andric case bitc::RMW_MIN: return AtomicRMWInst::Min; 1706122f3e6SDimitry Andric case bitc::RMW_UMAX: return AtomicRMWInst::UMax; 1716122f3e6SDimitry Andric case bitc::RMW_UMIN: return AtomicRMWInst::UMin; 1726122f3e6SDimitry Andric } 1736122f3e6SDimitry Andric } 1746122f3e6SDimitry Andric 1756122f3e6SDimitry Andric static AtomicOrdering GetDecodedOrdering(unsigned Val) { 1766122f3e6SDimitry Andric switch (Val) { 1776122f3e6SDimitry Andric case bitc::ORDERING_NOTATOMIC: return NotAtomic; 1786122f3e6SDimitry Andric case bitc::ORDERING_UNORDERED: return Unordered; 1796122f3e6SDimitry Andric case bitc::ORDERING_MONOTONIC: return Monotonic; 1806122f3e6SDimitry Andric case bitc::ORDERING_ACQUIRE: return Acquire; 1816122f3e6SDimitry Andric case bitc::ORDERING_RELEASE: return Release; 1826122f3e6SDimitry Andric case bitc::ORDERING_ACQREL: return AcquireRelease; 1836122f3e6SDimitry Andric default: // Map unknown orderings to sequentially-consistent. 1846122f3e6SDimitry Andric case bitc::ORDERING_SEQCST: return SequentiallyConsistent; 1856122f3e6SDimitry Andric } 1866122f3e6SDimitry Andric } 1876122f3e6SDimitry Andric 1886122f3e6SDimitry Andric static SynchronizationScope GetDecodedSynchScope(unsigned Val) { 1896122f3e6SDimitry Andric switch (Val) { 1906122f3e6SDimitry Andric case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; 1916122f3e6SDimitry Andric default: // Map unknown scopes to cross-thread. 1926122f3e6SDimitry Andric case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; 1936122f3e6SDimitry Andric } 1946122f3e6SDimitry Andric } 1956122f3e6SDimitry Andric 196f22ef01cSRoman Divacky namespace llvm { 197f22ef01cSRoman Divacky namespace { 198f22ef01cSRoman Divacky /// @brief A class for maintaining the slot number definition 199f22ef01cSRoman Divacky /// as a placeholder for the actual definition for forward constants defs. 200f22ef01cSRoman Divacky class ConstantPlaceHolder : public ConstantExpr { 2013861d79fSDimitry Andric void operator=(const ConstantPlaceHolder &) LLVM_DELETED_FUNCTION; 202f22ef01cSRoman Divacky public: 203f22ef01cSRoman Divacky // allocate space for exactly one operand 204f22ef01cSRoman Divacky void *operator new(size_t s) { 205f22ef01cSRoman Divacky return User::operator new(s, 1); 206f22ef01cSRoman Divacky } 2076122f3e6SDimitry Andric explicit ConstantPlaceHolder(Type *Ty, LLVMContext& Context) 208f22ef01cSRoman Divacky : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { 209f22ef01cSRoman Divacky Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); 210f22ef01cSRoman Divacky } 211f22ef01cSRoman Divacky 212f22ef01cSRoman Divacky /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. 213f22ef01cSRoman Divacky static bool classof(const Value *V) { 214f22ef01cSRoman Divacky return isa<ConstantExpr>(V) && 215f22ef01cSRoman Divacky cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; 216f22ef01cSRoman Divacky } 217f22ef01cSRoman Divacky 218f22ef01cSRoman Divacky 219f22ef01cSRoman Divacky /// Provide fast operand accessors 220f22ef01cSRoman Divacky //DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 221f22ef01cSRoman Divacky }; 222f22ef01cSRoman Divacky } 223f22ef01cSRoman Divacky 224f22ef01cSRoman Divacky // FIXME: can we inherit this from ConstantExpr? 225f22ef01cSRoman Divacky template <> 2262754fe60SDimitry Andric struct OperandTraits<ConstantPlaceHolder> : 2272754fe60SDimitry Andric public FixedNumOperandTraits<ConstantPlaceHolder, 1> { 228f22ef01cSRoman Divacky }; 229f22ef01cSRoman Divacky } 230f22ef01cSRoman Divacky 231f22ef01cSRoman Divacky 232f22ef01cSRoman Divacky void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { 233f22ef01cSRoman Divacky if (Idx == size()) { 234f22ef01cSRoman Divacky push_back(V); 235f22ef01cSRoman Divacky return; 236f22ef01cSRoman Divacky } 237f22ef01cSRoman Divacky 238f22ef01cSRoman Divacky if (Idx >= size()) 239f22ef01cSRoman Divacky resize(Idx+1); 240f22ef01cSRoman Divacky 241f22ef01cSRoman Divacky WeakVH &OldV = ValuePtrs[Idx]; 242f22ef01cSRoman Divacky if (OldV == 0) { 243f22ef01cSRoman Divacky OldV = V; 244f22ef01cSRoman Divacky return; 245f22ef01cSRoman Divacky } 246f22ef01cSRoman Divacky 247f22ef01cSRoman Divacky // Handle constants and non-constants (e.g. instrs) differently for 248f22ef01cSRoman Divacky // efficiency. 249f22ef01cSRoman Divacky if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { 250f22ef01cSRoman Divacky ResolveConstants.push_back(std::make_pair(PHC, Idx)); 251f22ef01cSRoman Divacky OldV = V; 252f22ef01cSRoman Divacky } else { 253f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 254f22ef01cSRoman Divacky Value *PrevVal = OldV; 255f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 256f22ef01cSRoman Divacky delete PrevVal; 257f22ef01cSRoman Divacky } 258f22ef01cSRoman Divacky } 259f22ef01cSRoman Divacky 260f22ef01cSRoman Divacky 261f22ef01cSRoman Divacky Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, 2626122f3e6SDimitry Andric Type *Ty) { 263f22ef01cSRoman Divacky if (Idx >= size()) 264f22ef01cSRoman Divacky resize(Idx + 1); 265f22ef01cSRoman Divacky 266f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 267f22ef01cSRoman Divacky assert(Ty == V->getType() && "Type mismatch in constant table!"); 268f22ef01cSRoman Divacky return cast<Constant>(V); 269f22ef01cSRoman Divacky } 270f22ef01cSRoman Divacky 271f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 272f22ef01cSRoman Divacky Constant *C = new ConstantPlaceHolder(Ty, Context); 273f22ef01cSRoman Divacky ValuePtrs[Idx] = C; 274f22ef01cSRoman Divacky return C; 275f22ef01cSRoman Divacky } 276f22ef01cSRoman Divacky 2776122f3e6SDimitry Andric Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { 278f22ef01cSRoman Divacky if (Idx >= size()) 279f22ef01cSRoman Divacky resize(Idx + 1); 280f22ef01cSRoman Divacky 281f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 282f22ef01cSRoman Divacky assert((Ty == 0 || Ty == V->getType()) && "Type mismatch in value table!"); 283f22ef01cSRoman Divacky return V; 284f22ef01cSRoman Divacky } 285f22ef01cSRoman Divacky 286f22ef01cSRoman Divacky // No type specified, must be invalid reference. 287f22ef01cSRoman Divacky if (Ty == 0) return 0; 288f22ef01cSRoman Divacky 289f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 290f22ef01cSRoman Divacky Value *V = new Argument(Ty); 291f22ef01cSRoman Divacky ValuePtrs[Idx] = V; 292f22ef01cSRoman Divacky return V; 293f22ef01cSRoman Divacky } 294f22ef01cSRoman Divacky 295f22ef01cSRoman Divacky /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 296f22ef01cSRoman Divacky /// resolves any forward references. The idea behind this is that we sometimes 297f22ef01cSRoman Divacky /// get constants (such as large arrays) which reference *many* forward ref 298f22ef01cSRoman Divacky /// constants. Replacing each of these causes a lot of thrashing when 299f22ef01cSRoman Divacky /// building/reuniquing the constant. Instead of doing this, we look at all the 300f22ef01cSRoman Divacky /// uses and rewrite all the place holders at once for any constant that uses 301f22ef01cSRoman Divacky /// a placeholder. 302f22ef01cSRoman Divacky void BitcodeReaderValueList::ResolveConstantForwardRefs() { 303f22ef01cSRoman Divacky // Sort the values by-pointer so that they are efficient to look up with a 304f22ef01cSRoman Divacky // binary search. 305f22ef01cSRoman Divacky std::sort(ResolveConstants.begin(), ResolveConstants.end()); 306f22ef01cSRoman Divacky 307f22ef01cSRoman Divacky SmallVector<Constant*, 64> NewOps; 308f22ef01cSRoman Divacky 309f22ef01cSRoman Divacky while (!ResolveConstants.empty()) { 310f22ef01cSRoman Divacky Value *RealVal = operator[](ResolveConstants.back().second); 311f22ef01cSRoman Divacky Constant *Placeholder = ResolveConstants.back().first; 312f22ef01cSRoman Divacky ResolveConstants.pop_back(); 313f22ef01cSRoman Divacky 314f22ef01cSRoman Divacky // Loop over all users of the placeholder, updating them to reference the 315f22ef01cSRoman Divacky // new value. If they reference more than one placeholder, update them all 316f22ef01cSRoman Divacky // at once. 317f22ef01cSRoman Divacky while (!Placeholder->use_empty()) { 318f22ef01cSRoman Divacky Value::use_iterator UI = Placeholder->use_begin(); 319ffd1746dSEd Schouten User *U = *UI; 320f22ef01cSRoman Divacky 321f22ef01cSRoman Divacky // If the using object isn't uniqued, just update the operands. This 322f22ef01cSRoman Divacky // handles instructions and initializers for global variables. 323ffd1746dSEd Schouten if (!isa<Constant>(U) || isa<GlobalValue>(U)) { 324f22ef01cSRoman Divacky UI.getUse().set(RealVal); 325f22ef01cSRoman Divacky continue; 326f22ef01cSRoman Divacky } 327f22ef01cSRoman Divacky 328f22ef01cSRoman Divacky // Otherwise, we have a constant that uses the placeholder. Replace that 329f22ef01cSRoman Divacky // constant with a new constant that has *all* placeholder uses updated. 330ffd1746dSEd Schouten Constant *UserC = cast<Constant>(U); 331f22ef01cSRoman Divacky for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); 332f22ef01cSRoman Divacky I != E; ++I) { 333f22ef01cSRoman Divacky Value *NewOp; 334f22ef01cSRoman Divacky if (!isa<ConstantPlaceHolder>(*I)) { 335f22ef01cSRoman Divacky // Not a placeholder reference. 336f22ef01cSRoman Divacky NewOp = *I; 337f22ef01cSRoman Divacky } else if (*I == Placeholder) { 338f22ef01cSRoman Divacky // Common case is that it just references this one placeholder. 339f22ef01cSRoman Divacky NewOp = RealVal; 340f22ef01cSRoman Divacky } else { 341f22ef01cSRoman Divacky // Otherwise, look up the placeholder in ResolveConstants. 342f22ef01cSRoman Divacky ResolveConstantsTy::iterator It = 343f22ef01cSRoman Divacky std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), 344f22ef01cSRoman Divacky std::pair<Constant*, unsigned>(cast<Constant>(*I), 345f22ef01cSRoman Divacky 0)); 346f22ef01cSRoman Divacky assert(It != ResolveConstants.end() && It->first == *I); 347f22ef01cSRoman Divacky NewOp = operator[](It->second); 348f22ef01cSRoman Divacky } 349f22ef01cSRoman Divacky 350f22ef01cSRoman Divacky NewOps.push_back(cast<Constant>(NewOp)); 351f22ef01cSRoman Divacky } 352f22ef01cSRoman Divacky 353f22ef01cSRoman Divacky // Make the new constant. 354f22ef01cSRoman Divacky Constant *NewC; 355f22ef01cSRoman Divacky if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { 35617a519f9SDimitry Andric NewC = ConstantArray::get(UserCA->getType(), NewOps); 357f22ef01cSRoman Divacky } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { 35817a519f9SDimitry Andric NewC = ConstantStruct::get(UserCS->getType(), NewOps); 359f22ef01cSRoman Divacky } else if (isa<ConstantVector>(UserC)) { 3602754fe60SDimitry Andric NewC = ConstantVector::get(NewOps); 361f22ef01cSRoman Divacky } else { 362f22ef01cSRoman Divacky assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); 3633b0f4066SDimitry Andric NewC = cast<ConstantExpr>(UserC)->getWithOperands(NewOps); 364f22ef01cSRoman Divacky } 365f22ef01cSRoman Divacky 366f22ef01cSRoman Divacky UserC->replaceAllUsesWith(NewC); 367f22ef01cSRoman Divacky UserC->destroyConstant(); 368f22ef01cSRoman Divacky NewOps.clear(); 369f22ef01cSRoman Divacky } 370f22ef01cSRoman Divacky 371f22ef01cSRoman Divacky // Update all ValueHandles, they should be the only users at this point. 372f22ef01cSRoman Divacky Placeholder->replaceAllUsesWith(RealVal); 373f22ef01cSRoman Divacky delete Placeholder; 374f22ef01cSRoman Divacky } 375f22ef01cSRoman Divacky } 376f22ef01cSRoman Divacky 377f22ef01cSRoman Divacky void BitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) { 378f22ef01cSRoman Divacky if (Idx == size()) { 379f22ef01cSRoman Divacky push_back(V); 380f22ef01cSRoman Divacky return; 381f22ef01cSRoman Divacky } 382f22ef01cSRoman Divacky 383f22ef01cSRoman Divacky if (Idx >= size()) 384f22ef01cSRoman Divacky resize(Idx+1); 385f22ef01cSRoman Divacky 386f22ef01cSRoman Divacky WeakVH &OldV = MDValuePtrs[Idx]; 387f22ef01cSRoman Divacky if (OldV == 0) { 388f22ef01cSRoman Divacky OldV = V; 389f22ef01cSRoman Divacky return; 390f22ef01cSRoman Divacky } 391f22ef01cSRoman Divacky 392f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 393e580952dSDimitry Andric MDNode *PrevVal = cast<MDNode>(OldV); 394f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 395e580952dSDimitry Andric MDNode::deleteTemporary(PrevVal); 396f22ef01cSRoman Divacky // Deleting PrevVal sets Idx value in MDValuePtrs to null. Set new 397f22ef01cSRoman Divacky // value for Idx. 398f22ef01cSRoman Divacky MDValuePtrs[Idx] = V; 399f22ef01cSRoman Divacky } 400f22ef01cSRoman Divacky 401f22ef01cSRoman Divacky Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { 402f22ef01cSRoman Divacky if (Idx >= size()) 403f22ef01cSRoman Divacky resize(Idx + 1); 404f22ef01cSRoman Divacky 405f22ef01cSRoman Divacky if (Value *V = MDValuePtrs[Idx]) { 406f22ef01cSRoman Divacky assert(V->getType()->isMetadataTy() && "Type mismatch in value table!"); 407f22ef01cSRoman Divacky return V; 408f22ef01cSRoman Divacky } 409f22ef01cSRoman Divacky 410f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 411284c1978SDimitry Andric Value *V = MDNode::getTemporary(Context, None); 412f22ef01cSRoman Divacky MDValuePtrs[Idx] = V; 413f22ef01cSRoman Divacky return V; 414f22ef01cSRoman Divacky } 415f22ef01cSRoman Divacky 41617a519f9SDimitry Andric Type *BitcodeReader::getTypeByID(unsigned ID) { 41717a519f9SDimitry Andric // The type table size is always specified correctly. 41817a519f9SDimitry Andric if (ID >= TypeList.size()) 41917a519f9SDimitry Andric return 0; 420f22ef01cSRoman Divacky 42117a519f9SDimitry Andric if (Type *Ty = TypeList[ID]) 42217a519f9SDimitry Andric return Ty; 42317a519f9SDimitry Andric 42417a519f9SDimitry Andric // If we have a forward reference, the only possible case is when it is to a 42517a519f9SDimitry Andric // named struct. Just create a placeholder for now. 4266122f3e6SDimitry Andric return TypeList[ID] = StructType::create(Context); 427f22ef01cSRoman Divacky } 428f22ef01cSRoman Divacky 42917a519f9SDimitry Andric 430f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 431f22ef01cSRoman Divacky // Functions for parsing blocks from the bitcode file 432f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 433f22ef01cSRoman Divacky 434139f7f9bSDimitry Andric 435139f7f9bSDimitry Andric /// \brief This fills an AttrBuilder object with the LLVM attributes that have 436139f7f9bSDimitry Andric /// been decoded from the given integer. This function must stay in sync with 437139f7f9bSDimitry Andric /// 'encodeLLVMAttributesForBitcode'. 438139f7f9bSDimitry Andric static void decodeLLVMAttributesForBitcode(AttrBuilder &B, 439139f7f9bSDimitry Andric uint64_t EncodedAttrs) { 440139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 441139f7f9bSDimitry Andric 442139f7f9bSDimitry Andric // The alignment is stored as a 16-bit raw value from bits 31--16. We shift 443139f7f9bSDimitry Andric // the bits above 31 down by 11 bits. 444139f7f9bSDimitry Andric unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; 445139f7f9bSDimitry Andric assert((!Alignment || isPowerOf2_32(Alignment)) && 446139f7f9bSDimitry Andric "Alignment must be a power of two."); 447139f7f9bSDimitry Andric 448139f7f9bSDimitry Andric if (Alignment) 449139f7f9bSDimitry Andric B.addAlignmentAttr(Alignment); 450139f7f9bSDimitry Andric B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | 451139f7f9bSDimitry Andric (EncodedAttrs & 0xffff)); 452139f7f9bSDimitry Andric } 453139f7f9bSDimitry Andric 454f785676fSDimitry Andric error_code BitcodeReader::ParseAttributeBlock() { 455f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) 456f785676fSDimitry Andric return Error(InvalidRecord); 457f22ef01cSRoman Divacky 458f22ef01cSRoman Divacky if (!MAttributes.empty()) 459f785676fSDimitry Andric return Error(InvalidMultipleBlocks); 460f22ef01cSRoman Divacky 461f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 462f22ef01cSRoman Divacky 463139f7f9bSDimitry Andric SmallVector<AttributeSet, 8> Attrs; 464f22ef01cSRoman Divacky 465f22ef01cSRoman Divacky // Read all the records. 466f22ef01cSRoman Divacky while (1) { 467139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 468139f7f9bSDimitry Andric 469139f7f9bSDimitry Andric switch (Entry.Kind) { 470139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 471139f7f9bSDimitry Andric case BitstreamEntry::Error: 472f785676fSDimitry Andric return Error(MalformedBlock); 473139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 474f785676fSDimitry Andric return error_code::success(); 475139f7f9bSDimitry Andric case BitstreamEntry::Record: 476139f7f9bSDimitry Andric // The interesting case. 477139f7f9bSDimitry Andric break; 478f22ef01cSRoman Divacky } 479f22ef01cSRoman Divacky 480f22ef01cSRoman Divacky // Read a record. 481f22ef01cSRoman Divacky Record.clear(); 482139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 483f22ef01cSRoman Divacky default: // Default behavior: ignore. 484f22ef01cSRoman Divacky break; 485139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] 486139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 487f22ef01cSRoman Divacky if (Record.size() & 1) 488f785676fSDimitry Andric return Error(InvalidRecord); 489f22ef01cSRoman Divacky 490f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 491139f7f9bSDimitry Andric AttrBuilder B; 492139f7f9bSDimitry Andric decodeLLVMAttributesForBitcode(B, Record[i+1]); 493139f7f9bSDimitry Andric Attrs.push_back(AttributeSet::get(Context, Record[i], B)); 494f22ef01cSRoman Divacky } 495f22ef01cSRoman Divacky 496139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 497f22ef01cSRoman Divacky Attrs.clear(); 498f22ef01cSRoman Divacky break; 499f22ef01cSRoman Divacky } 500139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] 501139f7f9bSDimitry Andric for (unsigned i = 0, e = Record.size(); i != e; ++i) 502139f7f9bSDimitry Andric Attrs.push_back(MAttributeGroups[Record[i]]); 503139f7f9bSDimitry Andric 504139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 505139f7f9bSDimitry Andric Attrs.clear(); 506139f7f9bSDimitry Andric break; 507139f7f9bSDimitry Andric } 508139f7f9bSDimitry Andric } 509139f7f9bSDimitry Andric } 510139f7f9bSDimitry Andric } 511139f7f9bSDimitry Andric 512f785676fSDimitry Andric // Returns Attribute::None on unrecognized codes. 513f785676fSDimitry Andric static Attribute::AttrKind GetAttrFromCode(uint64_t Code) { 514f785676fSDimitry Andric switch (Code) { 515f785676fSDimitry Andric default: 516f785676fSDimitry Andric return Attribute::None; 517f785676fSDimitry Andric case bitc::ATTR_KIND_ALIGNMENT: 518f785676fSDimitry Andric return Attribute::Alignment; 519f785676fSDimitry Andric case bitc::ATTR_KIND_ALWAYS_INLINE: 520f785676fSDimitry Andric return Attribute::AlwaysInline; 521f785676fSDimitry Andric case bitc::ATTR_KIND_BUILTIN: 522f785676fSDimitry Andric return Attribute::Builtin; 523f785676fSDimitry Andric case bitc::ATTR_KIND_BY_VAL: 524f785676fSDimitry Andric return Attribute::ByVal; 525f785676fSDimitry Andric case bitc::ATTR_KIND_COLD: 526f785676fSDimitry Andric return Attribute::Cold; 527f785676fSDimitry Andric case bitc::ATTR_KIND_INLINE_HINT: 528f785676fSDimitry Andric return Attribute::InlineHint; 529f785676fSDimitry Andric case bitc::ATTR_KIND_IN_REG: 530f785676fSDimitry Andric return Attribute::InReg; 531f785676fSDimitry Andric case bitc::ATTR_KIND_MIN_SIZE: 532f785676fSDimitry Andric return Attribute::MinSize; 533f785676fSDimitry Andric case bitc::ATTR_KIND_NAKED: 534f785676fSDimitry Andric return Attribute::Naked; 535f785676fSDimitry Andric case bitc::ATTR_KIND_NEST: 536f785676fSDimitry Andric return Attribute::Nest; 537f785676fSDimitry Andric case bitc::ATTR_KIND_NO_ALIAS: 538f785676fSDimitry Andric return Attribute::NoAlias; 539f785676fSDimitry Andric case bitc::ATTR_KIND_NO_BUILTIN: 540f785676fSDimitry Andric return Attribute::NoBuiltin; 541f785676fSDimitry Andric case bitc::ATTR_KIND_NO_CAPTURE: 542f785676fSDimitry Andric return Attribute::NoCapture; 543f785676fSDimitry Andric case bitc::ATTR_KIND_NO_DUPLICATE: 544f785676fSDimitry Andric return Attribute::NoDuplicate; 545f785676fSDimitry Andric case bitc::ATTR_KIND_NO_IMPLICIT_FLOAT: 546f785676fSDimitry Andric return Attribute::NoImplicitFloat; 547f785676fSDimitry Andric case bitc::ATTR_KIND_NO_INLINE: 548f785676fSDimitry Andric return Attribute::NoInline; 549f785676fSDimitry Andric case bitc::ATTR_KIND_NON_LAZY_BIND: 550f785676fSDimitry Andric return Attribute::NonLazyBind; 551f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RED_ZONE: 552f785676fSDimitry Andric return Attribute::NoRedZone; 553f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RETURN: 554f785676fSDimitry Andric return Attribute::NoReturn; 555f785676fSDimitry Andric case bitc::ATTR_KIND_NO_UNWIND: 556f785676fSDimitry Andric return Attribute::NoUnwind; 557f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: 558f785676fSDimitry Andric return Attribute::OptimizeForSize; 559f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_NONE: 560f785676fSDimitry Andric return Attribute::OptimizeNone; 561f785676fSDimitry Andric case bitc::ATTR_KIND_READ_NONE: 562f785676fSDimitry Andric return Attribute::ReadNone; 563f785676fSDimitry Andric case bitc::ATTR_KIND_READ_ONLY: 564f785676fSDimitry Andric return Attribute::ReadOnly; 565f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNED: 566f785676fSDimitry Andric return Attribute::Returned; 567f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNS_TWICE: 568f785676fSDimitry Andric return Attribute::ReturnsTwice; 569f785676fSDimitry Andric case bitc::ATTR_KIND_S_EXT: 570f785676fSDimitry Andric return Attribute::SExt; 571f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_ALIGNMENT: 572f785676fSDimitry Andric return Attribute::StackAlignment; 573f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT: 574f785676fSDimitry Andric return Attribute::StackProtect; 575f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_REQ: 576f785676fSDimitry Andric return Attribute::StackProtectReq; 577f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_STRONG: 578f785676fSDimitry Andric return Attribute::StackProtectStrong; 579f785676fSDimitry Andric case bitc::ATTR_KIND_STRUCT_RET: 580f785676fSDimitry Andric return Attribute::StructRet; 581f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_ADDRESS: 582f785676fSDimitry Andric return Attribute::SanitizeAddress; 583f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_THREAD: 584f785676fSDimitry Andric return Attribute::SanitizeThread; 585f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_MEMORY: 586f785676fSDimitry Andric return Attribute::SanitizeMemory; 587f785676fSDimitry Andric case bitc::ATTR_KIND_UW_TABLE: 588f785676fSDimitry Andric return Attribute::UWTable; 589f785676fSDimitry Andric case bitc::ATTR_KIND_Z_EXT: 590f785676fSDimitry Andric return Attribute::ZExt; 591f785676fSDimitry Andric } 592f785676fSDimitry Andric } 593f785676fSDimitry Andric 594f785676fSDimitry Andric error_code BitcodeReader::ParseAttrKind(uint64_t Code, 595f785676fSDimitry Andric Attribute::AttrKind *Kind) { 596f785676fSDimitry Andric *Kind = GetAttrFromCode(Code); 597f785676fSDimitry Andric if (*Kind == Attribute::None) 598f785676fSDimitry Andric return Error(InvalidValue); 599f785676fSDimitry Andric return error_code::success(); 600f785676fSDimitry Andric } 601f785676fSDimitry Andric 602f785676fSDimitry Andric error_code BitcodeReader::ParseAttributeGroupBlock() { 603139f7f9bSDimitry Andric if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) 604f785676fSDimitry Andric return Error(InvalidRecord); 605139f7f9bSDimitry Andric 606139f7f9bSDimitry Andric if (!MAttributeGroups.empty()) 607f785676fSDimitry Andric return Error(InvalidMultipleBlocks); 608139f7f9bSDimitry Andric 609139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 610139f7f9bSDimitry Andric 611139f7f9bSDimitry Andric // Read all the records. 612139f7f9bSDimitry Andric while (1) { 613139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 614139f7f9bSDimitry Andric 615139f7f9bSDimitry Andric switch (Entry.Kind) { 616139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 617139f7f9bSDimitry Andric case BitstreamEntry::Error: 618f785676fSDimitry Andric return Error(MalformedBlock); 619139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 620f785676fSDimitry Andric return error_code::success(); 621139f7f9bSDimitry Andric case BitstreamEntry::Record: 622139f7f9bSDimitry Andric // The interesting case. 623139f7f9bSDimitry Andric break; 624139f7f9bSDimitry Andric } 625139f7f9bSDimitry Andric 626139f7f9bSDimitry Andric // Read a record. 627139f7f9bSDimitry Andric Record.clear(); 628139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 629139f7f9bSDimitry Andric default: // Default behavior: ignore. 630139f7f9bSDimitry Andric break; 631139f7f9bSDimitry Andric case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] 632139f7f9bSDimitry Andric if (Record.size() < 3) 633f785676fSDimitry Andric return Error(InvalidRecord); 634139f7f9bSDimitry Andric 635139f7f9bSDimitry Andric uint64_t GrpID = Record[0]; 636139f7f9bSDimitry Andric uint64_t Idx = Record[1]; // Index of the object this attribute refers to. 637139f7f9bSDimitry Andric 638139f7f9bSDimitry Andric AttrBuilder B; 639139f7f9bSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 640139f7f9bSDimitry Andric if (Record[i] == 0) { // Enum attribute 641f785676fSDimitry Andric Attribute::AttrKind Kind; 642f785676fSDimitry Andric if (error_code EC = ParseAttrKind(Record[++i], &Kind)) 643f785676fSDimitry Andric return EC; 644f785676fSDimitry Andric 645f785676fSDimitry Andric B.addAttribute(Kind); 646139f7f9bSDimitry Andric } else if (Record[i] == 1) { // Align attribute 647f785676fSDimitry Andric Attribute::AttrKind Kind; 648f785676fSDimitry Andric if (error_code EC = ParseAttrKind(Record[++i], &Kind)) 649f785676fSDimitry Andric return EC; 650f785676fSDimitry Andric if (Kind == Attribute::Alignment) 651139f7f9bSDimitry Andric B.addAlignmentAttr(Record[++i]); 652139f7f9bSDimitry Andric else 653139f7f9bSDimitry Andric B.addStackAlignmentAttr(Record[++i]); 654139f7f9bSDimitry Andric } else { // String attribute 655139f7f9bSDimitry Andric assert((Record[i] == 3 || Record[i] == 4) && 656139f7f9bSDimitry Andric "Invalid attribute group entry"); 657139f7f9bSDimitry Andric bool HasValue = (Record[i++] == 4); 658139f7f9bSDimitry Andric SmallString<64> KindStr; 659139f7f9bSDimitry Andric SmallString<64> ValStr; 660139f7f9bSDimitry Andric 661139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 662139f7f9bSDimitry Andric KindStr += Record[i++]; 663139f7f9bSDimitry Andric assert(Record[i] == 0 && "Kind string not null terminated"); 664139f7f9bSDimitry Andric 665139f7f9bSDimitry Andric if (HasValue) { 666139f7f9bSDimitry Andric // Has a value associated with it. 667139f7f9bSDimitry Andric ++i; // Skip the '0' that terminates the "kind" string. 668139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 669139f7f9bSDimitry Andric ValStr += Record[i++]; 670139f7f9bSDimitry Andric assert(Record[i] == 0 && "Value string not null terminated"); 671139f7f9bSDimitry Andric } 672139f7f9bSDimitry Andric 673139f7f9bSDimitry Andric B.addAttribute(KindStr.str(), ValStr.str()); 674139f7f9bSDimitry Andric } 675139f7f9bSDimitry Andric } 676139f7f9bSDimitry Andric 677139f7f9bSDimitry Andric MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); 678139f7f9bSDimitry Andric break; 679139f7f9bSDimitry Andric } 680f22ef01cSRoman Divacky } 681f22ef01cSRoman Divacky } 682f22ef01cSRoman Divacky } 683f22ef01cSRoman Divacky 684f785676fSDimitry Andric error_code BitcodeReader::ParseTypeTable() { 68517a519f9SDimitry Andric if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) 686f785676fSDimitry Andric return Error(InvalidRecord); 687f22ef01cSRoman Divacky 68817a519f9SDimitry Andric return ParseTypeTableBody(); 68917a519f9SDimitry Andric } 69017a519f9SDimitry Andric 691f785676fSDimitry Andric error_code BitcodeReader::ParseTypeTableBody() { 692f22ef01cSRoman Divacky if (!TypeList.empty()) 693f785676fSDimitry Andric return Error(InvalidMultipleBlocks); 694f22ef01cSRoman Divacky 695f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 696f22ef01cSRoman Divacky unsigned NumRecords = 0; 697f22ef01cSRoman Divacky 69817a519f9SDimitry Andric SmallString<64> TypeName; 69917a519f9SDimitry Andric 700f22ef01cSRoman Divacky // Read all the records for this type table. 701f22ef01cSRoman Divacky while (1) { 702139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 703139f7f9bSDimitry Andric 704139f7f9bSDimitry Andric switch (Entry.Kind) { 705139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 706139f7f9bSDimitry Andric case BitstreamEntry::Error: 707f785676fSDimitry Andric return Error(MalformedBlock); 708139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 709f22ef01cSRoman Divacky if (NumRecords != TypeList.size()) 710f785676fSDimitry Andric return Error(MalformedBlock); 711f785676fSDimitry Andric return error_code::success(); 712139f7f9bSDimitry Andric case BitstreamEntry::Record: 713139f7f9bSDimitry Andric // The interesting case. 714139f7f9bSDimitry Andric break; 715f22ef01cSRoman Divacky } 716f22ef01cSRoman Divacky 717f22ef01cSRoman Divacky // Read a record. 718f22ef01cSRoman Divacky Record.clear(); 71917a519f9SDimitry Andric Type *ResultTy = 0; 720139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 721f785676fSDimitry Andric default: 722f785676fSDimitry Andric return Error(InvalidValue); 723f22ef01cSRoman Divacky case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] 724f22ef01cSRoman Divacky // TYPE_CODE_NUMENTRY contains a count of the number of types in the 725f22ef01cSRoman Divacky // type list. This allows us to reserve space. 726f22ef01cSRoman Divacky if (Record.size() < 1) 727f785676fSDimitry Andric return Error(InvalidRecord); 72817a519f9SDimitry Andric TypeList.resize(Record[0]); 729f22ef01cSRoman Divacky continue; 730f22ef01cSRoman Divacky case bitc::TYPE_CODE_VOID: // VOID 731f22ef01cSRoman Divacky ResultTy = Type::getVoidTy(Context); 732f22ef01cSRoman Divacky break; 733dff0c46cSDimitry Andric case bitc::TYPE_CODE_HALF: // HALF 734dff0c46cSDimitry Andric ResultTy = Type::getHalfTy(Context); 735dff0c46cSDimitry Andric break; 736f22ef01cSRoman Divacky case bitc::TYPE_CODE_FLOAT: // FLOAT 737f22ef01cSRoman Divacky ResultTy = Type::getFloatTy(Context); 738f22ef01cSRoman Divacky break; 739f22ef01cSRoman Divacky case bitc::TYPE_CODE_DOUBLE: // DOUBLE 740f22ef01cSRoman Divacky ResultTy = Type::getDoubleTy(Context); 741f22ef01cSRoman Divacky break; 742f22ef01cSRoman Divacky case bitc::TYPE_CODE_X86_FP80: // X86_FP80 743f22ef01cSRoman Divacky ResultTy = Type::getX86_FP80Ty(Context); 744f22ef01cSRoman Divacky break; 745f22ef01cSRoman Divacky case bitc::TYPE_CODE_FP128: // FP128 746f22ef01cSRoman Divacky ResultTy = Type::getFP128Ty(Context); 747f22ef01cSRoman Divacky break; 748f22ef01cSRoman Divacky case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 749f22ef01cSRoman Divacky ResultTy = Type::getPPC_FP128Ty(Context); 750f22ef01cSRoman Divacky break; 751f22ef01cSRoman Divacky case bitc::TYPE_CODE_LABEL: // LABEL 752f22ef01cSRoman Divacky ResultTy = Type::getLabelTy(Context); 753f22ef01cSRoman Divacky break; 754f22ef01cSRoman Divacky case bitc::TYPE_CODE_METADATA: // METADATA 755f22ef01cSRoman Divacky ResultTy = Type::getMetadataTy(Context); 756f22ef01cSRoman Divacky break; 7572754fe60SDimitry Andric case bitc::TYPE_CODE_X86_MMX: // X86_MMX 7582754fe60SDimitry Andric ResultTy = Type::getX86_MMXTy(Context); 7592754fe60SDimitry Andric break; 760f22ef01cSRoman Divacky case bitc::TYPE_CODE_INTEGER: // INTEGER: [width] 761f22ef01cSRoman Divacky if (Record.size() < 1) 762f785676fSDimitry Andric return Error(InvalidRecord); 763f22ef01cSRoman Divacky 764f22ef01cSRoman Divacky ResultTy = IntegerType::get(Context, Record[0]); 765f22ef01cSRoman Divacky break; 766f22ef01cSRoman Divacky case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or 767f22ef01cSRoman Divacky // [pointee type, address space] 768f22ef01cSRoman Divacky if (Record.size() < 1) 769f785676fSDimitry Andric return Error(InvalidRecord); 770f22ef01cSRoman Divacky unsigned AddressSpace = 0; 771f22ef01cSRoman Divacky if (Record.size() == 2) 772f22ef01cSRoman Divacky AddressSpace = Record[1]; 77317a519f9SDimitry Andric ResultTy = getTypeByID(Record[0]); 774f785676fSDimitry Andric if (ResultTy == 0) 775f785676fSDimitry Andric return Error(InvalidType); 77617a519f9SDimitry Andric ResultTy = PointerType::get(ResultTy, AddressSpace); 777f22ef01cSRoman Divacky break; 778f22ef01cSRoman Divacky } 779dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION_OLD: { 7807ae0e2c9SDimitry Andric // FIXME: attrid is dead, remove it in LLVM 4.0 781f22ef01cSRoman Divacky // FUNCTION: [vararg, attrid, retty, paramty x N] 782f22ef01cSRoman Divacky if (Record.size() < 3) 783f785676fSDimitry Andric return Error(InvalidRecord); 784dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 78517a519f9SDimitry Andric for (unsigned i = 3, e = Record.size(); i != e; ++i) { 78617a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 78717a519f9SDimitry Andric ArgTys.push_back(T); 78817a519f9SDimitry Andric else 789f22ef01cSRoman Divacky break; 790f22ef01cSRoman Divacky } 79117a519f9SDimitry Andric 79217a519f9SDimitry Andric ResultTy = getTypeByID(Record[2]); 79317a519f9SDimitry Andric if (ResultTy == 0 || ArgTys.size() < Record.size()-3) 794f785676fSDimitry Andric return Error(InvalidType); 79517a519f9SDimitry Andric 79617a519f9SDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 79717a519f9SDimitry Andric break; 79817a519f9SDimitry Andric } 799dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION: { 800dff0c46cSDimitry Andric // FUNCTION: [vararg, retty, paramty x N] 801dff0c46cSDimitry Andric if (Record.size() < 2) 802f785676fSDimitry Andric return Error(InvalidRecord); 803dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 804dff0c46cSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 805dff0c46cSDimitry Andric if (Type *T = getTypeByID(Record[i])) 806dff0c46cSDimitry Andric ArgTys.push_back(T); 807dff0c46cSDimitry Andric else 808dff0c46cSDimitry Andric break; 809dff0c46cSDimitry Andric } 810dff0c46cSDimitry Andric 811dff0c46cSDimitry Andric ResultTy = getTypeByID(Record[1]); 812dff0c46cSDimitry Andric if (ResultTy == 0 || ArgTys.size() < Record.size()-2) 813f785676fSDimitry Andric return Error(InvalidType); 814dff0c46cSDimitry Andric 815dff0c46cSDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 816dff0c46cSDimitry Andric break; 817dff0c46cSDimitry Andric } 81817a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] 819f22ef01cSRoman Divacky if (Record.size() < 1) 820f785676fSDimitry Andric return Error(InvalidRecord); 821dff0c46cSDimitry Andric SmallVector<Type*, 8> EltTys; 82217a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 82317a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 82417a519f9SDimitry Andric EltTys.push_back(T); 82517a519f9SDimitry Andric else 82617a519f9SDimitry Andric break; 82717a519f9SDimitry Andric } 82817a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 829f785676fSDimitry Andric return Error(InvalidType); 830f22ef01cSRoman Divacky ResultTy = StructType::get(Context, EltTys, Record[0]); 831f22ef01cSRoman Divacky break; 832f22ef01cSRoman Divacky } 83317a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] 83417a519f9SDimitry Andric if (ConvertToString(Record, 0, TypeName)) 835f785676fSDimitry Andric return Error(InvalidRecord); 83617a519f9SDimitry Andric continue; 83717a519f9SDimitry Andric 83817a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] 83917a519f9SDimitry Andric if (Record.size() < 1) 840f785676fSDimitry Andric return Error(InvalidRecord); 84117a519f9SDimitry Andric 84217a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 843f785676fSDimitry Andric return Error(InvalidTYPETable); 84417a519f9SDimitry Andric 84517a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 84617a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 84717a519f9SDimitry Andric if (Res) { 84817a519f9SDimitry Andric Res->setName(TypeName); 84917a519f9SDimitry Andric TypeList[NumRecords] = 0; 85017a519f9SDimitry Andric } else // Otherwise, create a new struct. 8516122f3e6SDimitry Andric Res = StructType::create(Context, TypeName); 85217a519f9SDimitry Andric TypeName.clear(); 85317a519f9SDimitry Andric 85417a519f9SDimitry Andric SmallVector<Type*, 8> EltTys; 85517a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 85617a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 85717a519f9SDimitry Andric EltTys.push_back(T); 85817a519f9SDimitry Andric else 85917a519f9SDimitry Andric break; 86017a519f9SDimitry Andric } 86117a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 862f785676fSDimitry Andric return Error(InvalidRecord); 86317a519f9SDimitry Andric Res->setBody(EltTys, Record[0]); 86417a519f9SDimitry Andric ResultTy = Res; 86517a519f9SDimitry Andric break; 86617a519f9SDimitry Andric } 86717a519f9SDimitry Andric case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] 86817a519f9SDimitry Andric if (Record.size() != 1) 869f785676fSDimitry Andric return Error(InvalidRecord); 87017a519f9SDimitry Andric 87117a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 872f785676fSDimitry Andric return Error(InvalidTYPETable); 87317a519f9SDimitry Andric 87417a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 87517a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 87617a519f9SDimitry Andric if (Res) { 87717a519f9SDimitry Andric Res->setName(TypeName); 87817a519f9SDimitry Andric TypeList[NumRecords] = 0; 87917a519f9SDimitry Andric } else // Otherwise, create a new struct with no body. 8806122f3e6SDimitry Andric Res = StructType::create(Context, TypeName); 88117a519f9SDimitry Andric TypeName.clear(); 88217a519f9SDimitry Andric ResultTy = Res; 88317a519f9SDimitry Andric break; 88417a519f9SDimitry Andric } 885f22ef01cSRoman Divacky case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] 886f22ef01cSRoman Divacky if (Record.size() < 2) 887f785676fSDimitry Andric return Error(InvalidRecord); 88817a519f9SDimitry Andric if ((ResultTy = getTypeByID(Record[1]))) 88917a519f9SDimitry Andric ResultTy = ArrayType::get(ResultTy, Record[0]); 89017a519f9SDimitry Andric else 891f785676fSDimitry Andric return Error(InvalidType); 892f22ef01cSRoman Divacky break; 893f22ef01cSRoman Divacky case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] 894f22ef01cSRoman Divacky if (Record.size() < 2) 895f785676fSDimitry Andric return Error(InvalidRecord); 89617a519f9SDimitry Andric if ((ResultTy = getTypeByID(Record[1]))) 89717a519f9SDimitry Andric ResultTy = VectorType::get(ResultTy, Record[0]); 89817a519f9SDimitry Andric else 899f785676fSDimitry Andric return Error(InvalidType); 900f22ef01cSRoman Divacky break; 901f22ef01cSRoman Divacky } 902f22ef01cSRoman Divacky 90317a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 904f785676fSDimitry Andric return Error(InvalidTYPETable); 90517a519f9SDimitry Andric assert(ResultTy && "Didn't read a type?"); 90617a519f9SDimitry Andric assert(TypeList[NumRecords] == 0 && "Already read type?"); 90717a519f9SDimitry Andric TypeList[NumRecords++] = ResultTy; 908f22ef01cSRoman Divacky } 909f22ef01cSRoman Divacky } 91017a519f9SDimitry Andric 911f785676fSDimitry Andric error_code BitcodeReader::ParseValueSymbolTable() { 912f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) 913f785676fSDimitry Andric return Error(InvalidRecord); 914f22ef01cSRoman Divacky 915f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 916f22ef01cSRoman Divacky 917f22ef01cSRoman Divacky // Read all the records for this value table. 918f22ef01cSRoman Divacky SmallString<128> ValueName; 919f22ef01cSRoman Divacky while (1) { 920139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 921f22ef01cSRoman Divacky 922139f7f9bSDimitry Andric switch (Entry.Kind) { 923139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 924139f7f9bSDimitry Andric case BitstreamEntry::Error: 925f785676fSDimitry Andric return Error(MalformedBlock); 926139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 927f785676fSDimitry Andric return error_code::success(); 928139f7f9bSDimitry Andric case BitstreamEntry::Record: 929139f7f9bSDimitry Andric // The interesting case. 930139f7f9bSDimitry Andric break; 931f22ef01cSRoman Divacky } 932f22ef01cSRoman Divacky 933f22ef01cSRoman Divacky // Read a record. 934f22ef01cSRoman Divacky Record.clear(); 935139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 936f22ef01cSRoman Divacky default: // Default behavior: unknown type. 937f22ef01cSRoman Divacky break; 938f22ef01cSRoman Divacky case bitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] 939f22ef01cSRoman Divacky if (ConvertToString(Record, 1, ValueName)) 940f785676fSDimitry Andric return Error(InvalidRecord); 941f22ef01cSRoman Divacky unsigned ValueID = Record[0]; 942f22ef01cSRoman Divacky if (ValueID >= ValueList.size()) 943f785676fSDimitry Andric return Error(InvalidRecord); 944f22ef01cSRoman Divacky Value *V = ValueList[ValueID]; 945f22ef01cSRoman Divacky 946f22ef01cSRoman Divacky V->setName(StringRef(ValueName.data(), ValueName.size())); 947f22ef01cSRoman Divacky ValueName.clear(); 948f22ef01cSRoman Divacky break; 949f22ef01cSRoman Divacky } 950f22ef01cSRoman Divacky case bitc::VST_CODE_BBENTRY: { 951f22ef01cSRoman Divacky if (ConvertToString(Record, 1, ValueName)) 952f785676fSDimitry Andric return Error(InvalidRecord); 953f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[0]); 954f22ef01cSRoman Divacky if (BB == 0) 955f785676fSDimitry Andric return Error(InvalidRecord); 956f22ef01cSRoman Divacky 957f22ef01cSRoman Divacky BB->setName(StringRef(ValueName.data(), ValueName.size())); 958f22ef01cSRoman Divacky ValueName.clear(); 959f22ef01cSRoman Divacky break; 960f22ef01cSRoman Divacky } 961f22ef01cSRoman Divacky } 962f22ef01cSRoman Divacky } 963f22ef01cSRoman Divacky } 964f22ef01cSRoman Divacky 965f785676fSDimitry Andric error_code BitcodeReader::ParseMetadata() { 966f22ef01cSRoman Divacky unsigned NextMDValueNo = MDValueList.size(); 967f22ef01cSRoman Divacky 968f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 969f785676fSDimitry Andric return Error(InvalidRecord); 970f22ef01cSRoman Divacky 971f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 972f22ef01cSRoman Divacky 973f22ef01cSRoman Divacky // Read all the records. 974f22ef01cSRoman Divacky while (1) { 975139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 976139f7f9bSDimitry Andric 977139f7f9bSDimitry Andric switch (Entry.Kind) { 978139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 979139f7f9bSDimitry Andric case BitstreamEntry::Error: 980f785676fSDimitry Andric return Error(MalformedBlock); 981139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 982f785676fSDimitry Andric return error_code::success(); 983139f7f9bSDimitry Andric case BitstreamEntry::Record: 984139f7f9bSDimitry Andric // The interesting case. 985139f7f9bSDimitry Andric break; 986f22ef01cSRoman Divacky } 987f22ef01cSRoman Divacky 988f22ef01cSRoman Divacky bool IsFunctionLocal = false; 989f22ef01cSRoman Divacky // Read a record. 990f22ef01cSRoman Divacky Record.clear(); 991139f7f9bSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record); 992e580952dSDimitry Andric switch (Code) { 993f22ef01cSRoman Divacky default: // Default behavior: ignore. 994f22ef01cSRoman Divacky break; 995f22ef01cSRoman Divacky case bitc::METADATA_NAME: { 996139f7f9bSDimitry Andric // Read name of the named metadata. 9977ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 998f22ef01cSRoman Divacky Record.clear(); 999f22ef01cSRoman Divacky Code = Stream.ReadCode(); 1000f22ef01cSRoman Divacky 100117a519f9SDimitry Andric // METADATA_NAME is always followed by METADATA_NAMED_NODE. 1002139f7f9bSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record); 100317a519f9SDimitry Andric assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode; 1004f22ef01cSRoman Divacky 1005f22ef01cSRoman Divacky // Read named metadata elements. 1006f22ef01cSRoman Divacky unsigned Size = Record.size(); 1007e580952dSDimitry Andric NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); 1008f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) { 1009f22ef01cSRoman Divacky MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i])); 1010f22ef01cSRoman Divacky if (MD == 0) 1011f785676fSDimitry Andric return Error(InvalidRecord); 1012e580952dSDimitry Andric NMD->addOperand(MD); 1013f22ef01cSRoman Divacky } 1014f22ef01cSRoman Divacky break; 1015f22ef01cSRoman Divacky } 101617a519f9SDimitry Andric case bitc::METADATA_FN_NODE: 1017f22ef01cSRoman Divacky IsFunctionLocal = true; 1018f22ef01cSRoman Divacky // fall-through 101917a519f9SDimitry Andric case bitc::METADATA_NODE: { 1020ffd1746dSEd Schouten if (Record.size() % 2 == 1) 1021f785676fSDimitry Andric return Error(InvalidRecord); 1022f22ef01cSRoman Divacky 1023f22ef01cSRoman Divacky unsigned Size = Record.size(); 1024f22ef01cSRoman Divacky SmallVector<Value*, 8> Elts; 1025f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; i += 2) { 10266122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[i]); 1027f785676fSDimitry Andric if (!Ty) 1028f785676fSDimitry Andric return Error(InvalidRecord); 1029f22ef01cSRoman Divacky if (Ty->isMetadataTy()) 1030f22ef01cSRoman Divacky Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); 1031f22ef01cSRoman Divacky else if (!Ty->isVoidTy()) 1032f22ef01cSRoman Divacky Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); 1033f22ef01cSRoman Divacky else 1034f22ef01cSRoman Divacky Elts.push_back(NULL); 1035f22ef01cSRoman Divacky } 10363b0f4066SDimitry Andric Value *V = MDNode::getWhenValsUnresolved(Context, Elts, IsFunctionLocal); 1037f22ef01cSRoman Divacky IsFunctionLocal = false; 1038f22ef01cSRoman Divacky MDValueList.AssignValue(V, NextMDValueNo++); 1039f22ef01cSRoman Divacky break; 1040f22ef01cSRoman Divacky } 1041f22ef01cSRoman Divacky case bitc::METADATA_STRING: { 10427ae0e2c9SDimitry Andric SmallString<8> String(Record.begin(), Record.end()); 10437ae0e2c9SDimitry Andric Value *V = MDString::get(Context, String); 1044f22ef01cSRoman Divacky MDValueList.AssignValue(V, NextMDValueNo++); 1045f22ef01cSRoman Divacky break; 1046f22ef01cSRoman Divacky } 1047f22ef01cSRoman Divacky case bitc::METADATA_KIND: { 10487ae0e2c9SDimitry Andric if (Record.size() < 2) 1049f785676fSDimitry Andric return Error(InvalidRecord); 10507ae0e2c9SDimitry Andric 1051f22ef01cSRoman Divacky unsigned Kind = Record[0]; 10527ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin()+1, Record.end()); 1053f22ef01cSRoman Divacky 1054f22ef01cSRoman Divacky unsigned NewKind = TheModule->getMDKindID(Name.str()); 1055e580952dSDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 1056f785676fSDimitry Andric return Error(ConflictingMETADATA_KINDRecords); 1057f22ef01cSRoman Divacky break; 1058f22ef01cSRoman Divacky } 1059f22ef01cSRoman Divacky } 1060f22ef01cSRoman Divacky } 1061f22ef01cSRoman Divacky } 1062f22ef01cSRoman Divacky 10633861d79fSDimitry Andric /// decodeSignRotatedValue - Decode a signed value stored with the sign bit in 1064f22ef01cSRoman Divacky /// the LSB for dense VBR encoding. 10653861d79fSDimitry Andric uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { 1066f22ef01cSRoman Divacky if ((V & 1) == 0) 1067f22ef01cSRoman Divacky return V >> 1; 1068f22ef01cSRoman Divacky if (V != 1) 1069f22ef01cSRoman Divacky return -(V >> 1); 1070f22ef01cSRoman Divacky // There is no such thing as -0 with integers. "-0" really means MININT. 1071f22ef01cSRoman Divacky return 1ULL << 63; 1072f22ef01cSRoman Divacky } 1073f22ef01cSRoman Divacky 1074f22ef01cSRoman Divacky /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global 1075f22ef01cSRoman Divacky /// values and aliases that we can. 1076f785676fSDimitry Andric error_code BitcodeReader::ResolveGlobalAndAliasInits() { 1077f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; 1078f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; 1079f785676fSDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixWorklist; 1080f22ef01cSRoman Divacky 1081f22ef01cSRoman Divacky GlobalInitWorklist.swap(GlobalInits); 1082f22ef01cSRoman Divacky AliasInitWorklist.swap(AliasInits); 1083f785676fSDimitry Andric FunctionPrefixWorklist.swap(FunctionPrefixes); 1084f22ef01cSRoman Divacky 1085f22ef01cSRoman Divacky while (!GlobalInitWorklist.empty()) { 1086f22ef01cSRoman Divacky unsigned ValID = GlobalInitWorklist.back().second; 1087f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 1088f22ef01cSRoman Divacky // Not ready to resolve this yet, it requires something later in the file. 1089f22ef01cSRoman Divacky GlobalInits.push_back(GlobalInitWorklist.back()); 1090f22ef01cSRoman Divacky } else { 1091f22ef01cSRoman Divacky if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) 1092f22ef01cSRoman Divacky GlobalInitWorklist.back().first->setInitializer(C); 1093f22ef01cSRoman Divacky else 1094f785676fSDimitry Andric return Error(ExpectedConstant); 1095f22ef01cSRoman Divacky } 1096f22ef01cSRoman Divacky GlobalInitWorklist.pop_back(); 1097f22ef01cSRoman Divacky } 1098f22ef01cSRoman Divacky 1099f22ef01cSRoman Divacky while (!AliasInitWorklist.empty()) { 1100f22ef01cSRoman Divacky unsigned ValID = AliasInitWorklist.back().second; 1101f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 1102f22ef01cSRoman Divacky AliasInits.push_back(AliasInitWorklist.back()); 1103f22ef01cSRoman Divacky } else { 1104f22ef01cSRoman Divacky if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) 1105f22ef01cSRoman Divacky AliasInitWorklist.back().first->setAliasee(C); 1106f22ef01cSRoman Divacky else 1107f785676fSDimitry Andric return Error(ExpectedConstant); 1108f22ef01cSRoman Divacky } 1109f22ef01cSRoman Divacky AliasInitWorklist.pop_back(); 1110f22ef01cSRoman Divacky } 1111f785676fSDimitry Andric 1112f785676fSDimitry Andric while (!FunctionPrefixWorklist.empty()) { 1113f785676fSDimitry Andric unsigned ValID = FunctionPrefixWorklist.back().second; 1114f785676fSDimitry Andric if (ValID >= ValueList.size()) { 1115f785676fSDimitry Andric FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); 1116f785676fSDimitry Andric } else { 1117f785676fSDimitry Andric if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) 1118f785676fSDimitry Andric FunctionPrefixWorklist.back().first->setPrefixData(C); 1119f785676fSDimitry Andric else 1120f785676fSDimitry Andric return Error(ExpectedConstant); 1121f785676fSDimitry Andric } 1122f785676fSDimitry Andric FunctionPrefixWorklist.pop_back(); 1123f785676fSDimitry Andric } 1124f785676fSDimitry Andric 1125f785676fSDimitry Andric return error_code::success(); 1126f22ef01cSRoman Divacky } 1127f22ef01cSRoman Divacky 11287ae0e2c9SDimitry Andric static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { 11297ae0e2c9SDimitry Andric SmallVector<uint64_t, 8> Words(Vals.size()); 11307ae0e2c9SDimitry Andric std::transform(Vals.begin(), Vals.end(), Words.begin(), 11313861d79fSDimitry Andric BitcodeReader::decodeSignRotatedValue); 11327ae0e2c9SDimitry Andric 11337ae0e2c9SDimitry Andric return APInt(TypeBits, Words); 11347ae0e2c9SDimitry Andric } 11357ae0e2c9SDimitry Andric 1136f785676fSDimitry Andric error_code BitcodeReader::ParseConstants() { 1137f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) 1138f785676fSDimitry Andric return Error(InvalidRecord); 1139f22ef01cSRoman Divacky 1140f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1141f22ef01cSRoman Divacky 1142f22ef01cSRoman Divacky // Read all the records for this value table. 11436122f3e6SDimitry Andric Type *CurTy = Type::getInt32Ty(Context); 1144f22ef01cSRoman Divacky unsigned NextCstNo = ValueList.size(); 1145f22ef01cSRoman Divacky while (1) { 1146139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1147139f7f9bSDimitry Andric 1148139f7f9bSDimitry Andric switch (Entry.Kind) { 1149139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1150139f7f9bSDimitry Andric case BitstreamEntry::Error: 1151f785676fSDimitry Andric return Error(MalformedBlock); 1152139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1153139f7f9bSDimitry Andric if (NextCstNo != ValueList.size()) 1154f785676fSDimitry Andric return Error(InvalidConstantReference); 1155139f7f9bSDimitry Andric 1156139f7f9bSDimitry Andric // Once all the constants have been read, go through and resolve forward 1157139f7f9bSDimitry Andric // references. 1158139f7f9bSDimitry Andric ValueList.ResolveConstantForwardRefs(); 1159f785676fSDimitry Andric return error_code::success(); 1160139f7f9bSDimitry Andric case BitstreamEntry::Record: 1161139f7f9bSDimitry Andric // The interesting case. 1162f22ef01cSRoman Divacky break; 1163f22ef01cSRoman Divacky } 1164f22ef01cSRoman Divacky 1165f22ef01cSRoman Divacky // Read a record. 1166f22ef01cSRoman Divacky Record.clear(); 1167f22ef01cSRoman Divacky Value *V = 0; 1168139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 1169f22ef01cSRoman Divacky switch (BitCode) { 1170f22ef01cSRoman Divacky default: // Default behavior: unknown constant 1171f22ef01cSRoman Divacky case bitc::CST_CODE_UNDEF: // UNDEF 1172f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 1173f22ef01cSRoman Divacky break; 1174f22ef01cSRoman Divacky case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] 1175f22ef01cSRoman Divacky if (Record.empty()) 1176f785676fSDimitry Andric return Error(InvalidRecord); 1177f22ef01cSRoman Divacky if (Record[0] >= TypeList.size()) 1178f785676fSDimitry Andric return Error(InvalidRecord); 1179f22ef01cSRoman Divacky CurTy = TypeList[Record[0]]; 1180f22ef01cSRoman Divacky continue; // Skip the ValueList manipulation. 1181f22ef01cSRoman Divacky case bitc::CST_CODE_NULL: // NULL 1182f22ef01cSRoman Divacky V = Constant::getNullValue(CurTy); 1183f22ef01cSRoman Divacky break; 1184f22ef01cSRoman Divacky case bitc::CST_CODE_INTEGER: // INTEGER: [intval] 1185f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 1186f785676fSDimitry Andric return Error(InvalidRecord); 11873861d79fSDimitry Andric V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); 1188f22ef01cSRoman Divacky break; 1189f22ef01cSRoman Divacky case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] 1190f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 1191f785676fSDimitry Andric return Error(InvalidRecord); 1192f22ef01cSRoman Divacky 11937ae0e2c9SDimitry Andric APInt VInt = ReadWideAPInt(Record, 11947ae0e2c9SDimitry Andric cast<IntegerType>(CurTy)->getBitWidth()); 11957ae0e2c9SDimitry Andric V = ConstantInt::get(Context, VInt); 11967ae0e2c9SDimitry Andric 1197f22ef01cSRoman Divacky break; 1198f22ef01cSRoman Divacky } 1199f22ef01cSRoman Divacky case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] 1200f22ef01cSRoman Divacky if (Record.empty()) 1201f785676fSDimitry Andric return Error(InvalidRecord); 1202dff0c46cSDimitry Andric if (CurTy->isHalfTy()) 1203139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, 1204139f7f9bSDimitry Andric APInt(16, (uint16_t)Record[0]))); 1205dff0c46cSDimitry Andric else if (CurTy->isFloatTy()) 1206139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, 1207139f7f9bSDimitry Andric APInt(32, (uint32_t)Record[0]))); 1208f22ef01cSRoman Divacky else if (CurTy->isDoubleTy()) 1209139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, 1210139f7f9bSDimitry Andric APInt(64, Record[0]))); 1211f22ef01cSRoman Divacky else if (CurTy->isX86_FP80Ty()) { 1212f22ef01cSRoman Divacky // Bits are not stored the same way as a normal i80 APInt, compensate. 1213f22ef01cSRoman Divacky uint64_t Rearrange[2]; 1214f22ef01cSRoman Divacky Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); 1215f22ef01cSRoman Divacky Rearrange[1] = Record[0] >> 48; 1216139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, 1217139f7f9bSDimitry Andric APInt(80, Rearrange))); 1218f22ef01cSRoman Divacky } else if (CurTy->isFP128Ty()) 1219139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, 1220139f7f9bSDimitry Andric APInt(128, Record))); 1221f22ef01cSRoman Divacky else if (CurTy->isPPC_FP128Ty()) 1222139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, 1223139f7f9bSDimitry Andric APInt(128, Record))); 1224f22ef01cSRoman Divacky else 1225f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 1226f22ef01cSRoman Divacky break; 1227f22ef01cSRoman Divacky } 1228f22ef01cSRoman Divacky 1229f22ef01cSRoman Divacky case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] 1230f22ef01cSRoman Divacky if (Record.empty()) 1231f785676fSDimitry Andric return Error(InvalidRecord); 1232f22ef01cSRoman Divacky 1233f22ef01cSRoman Divacky unsigned Size = Record.size(); 1234dff0c46cSDimitry Andric SmallVector<Constant*, 16> Elts; 1235f22ef01cSRoman Divacky 12366122f3e6SDimitry Andric if (StructType *STy = dyn_cast<StructType>(CurTy)) { 1237f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 1238f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], 1239f22ef01cSRoman Divacky STy->getElementType(i))); 1240f22ef01cSRoman Divacky V = ConstantStruct::get(STy, Elts); 12416122f3e6SDimitry Andric } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { 12426122f3e6SDimitry Andric Type *EltTy = ATy->getElementType(); 1243f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 1244f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 1245f22ef01cSRoman Divacky V = ConstantArray::get(ATy, Elts); 12466122f3e6SDimitry Andric } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { 12476122f3e6SDimitry Andric Type *EltTy = VTy->getElementType(); 1248f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 1249f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 1250f22ef01cSRoman Divacky V = ConstantVector::get(Elts); 1251f22ef01cSRoman Divacky } else { 1252f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 1253f22ef01cSRoman Divacky } 1254f22ef01cSRoman Divacky break; 1255f22ef01cSRoman Divacky } 1256dff0c46cSDimitry Andric case bitc::CST_CODE_STRING: // STRING: [values] 1257f22ef01cSRoman Divacky case bitc::CST_CODE_CSTRING: { // CSTRING: [values] 1258f22ef01cSRoman Divacky if (Record.empty()) 1259f785676fSDimitry Andric return Error(InvalidRecord); 1260f22ef01cSRoman Divacky 12617ae0e2c9SDimitry Andric SmallString<16> Elts(Record.begin(), Record.end()); 1262dff0c46cSDimitry Andric V = ConstantDataArray::getString(Context, Elts, 1263dff0c46cSDimitry Andric BitCode == bitc::CST_CODE_CSTRING); 1264f22ef01cSRoman Divacky break; 1265f22ef01cSRoman Divacky } 1266dff0c46cSDimitry Andric case bitc::CST_CODE_DATA: {// DATA: [n x value] 1267dff0c46cSDimitry Andric if (Record.empty()) 1268f785676fSDimitry Andric return Error(InvalidRecord); 1269dff0c46cSDimitry Andric 1270dff0c46cSDimitry Andric Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); 1271dff0c46cSDimitry Andric unsigned Size = Record.size(); 1272dff0c46cSDimitry Andric 1273dff0c46cSDimitry Andric if (EltTy->isIntegerTy(8)) { 1274dff0c46cSDimitry Andric SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); 1275dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1276dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1277dff0c46cSDimitry Andric else 1278dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1279dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(16)) { 1280dff0c46cSDimitry Andric SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end()); 1281dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1282dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1283dff0c46cSDimitry Andric else 1284dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1285dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(32)) { 1286dff0c46cSDimitry Andric SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end()); 1287dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1288dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1289dff0c46cSDimitry Andric else 1290dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1291dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(64)) { 1292dff0c46cSDimitry Andric SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end()); 1293dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1294dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1295dff0c46cSDimitry Andric else 1296dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1297dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 12987ae0e2c9SDimitry Andric SmallVector<float, 16> Elts(Size); 12997ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), BitsToFloat); 1300dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1301dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1302dff0c46cSDimitry Andric else 1303dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1304dff0c46cSDimitry Andric } else if (EltTy->isDoubleTy()) { 13057ae0e2c9SDimitry Andric SmallVector<double, 16> Elts(Size); 13067ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), 13077ae0e2c9SDimitry Andric BitsToDouble); 1308dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 1309dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 1310dff0c46cSDimitry Andric else 1311dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 1312dff0c46cSDimitry Andric } else { 1313f785676fSDimitry Andric return Error(InvalidTypeForValue); 1314dff0c46cSDimitry Andric } 1315dff0c46cSDimitry Andric break; 1316dff0c46cSDimitry Andric } 1317dff0c46cSDimitry Andric 1318f22ef01cSRoman Divacky case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] 1319f785676fSDimitry Andric if (Record.size() < 3) 1320f785676fSDimitry Andric return Error(InvalidRecord); 1321f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); 1322f22ef01cSRoman Divacky if (Opc < 0) { 1323f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown binop. 1324f22ef01cSRoman Divacky } else { 1325f22ef01cSRoman Divacky Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); 1326f22ef01cSRoman Divacky Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); 1327f22ef01cSRoman Divacky unsigned Flags = 0; 1328f22ef01cSRoman Divacky if (Record.size() >= 4) { 1329f22ef01cSRoman Divacky if (Opc == Instruction::Add || 1330f22ef01cSRoman Divacky Opc == Instruction::Sub || 13312754fe60SDimitry Andric Opc == Instruction::Mul || 13322754fe60SDimitry Andric Opc == Instruction::Shl) { 1333f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 1334f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoSignedWrap; 1335f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 1336f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoUnsignedWrap; 13372754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 13382754fe60SDimitry Andric Opc == Instruction::UDiv || 13392754fe60SDimitry Andric Opc == Instruction::LShr || 13402754fe60SDimitry Andric Opc == Instruction::AShr) { 13412754fe60SDimitry Andric if (Record[3] & (1 << bitc::PEO_EXACT)) 1342f22ef01cSRoman Divacky Flags |= SDivOperator::IsExact; 1343f22ef01cSRoman Divacky } 1344f22ef01cSRoman Divacky } 1345f22ef01cSRoman Divacky V = ConstantExpr::get(Opc, LHS, RHS, Flags); 1346f22ef01cSRoman Divacky } 1347f22ef01cSRoman Divacky break; 1348f22ef01cSRoman Divacky } 1349f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] 1350f785676fSDimitry Andric if (Record.size() < 3) 1351f785676fSDimitry Andric return Error(InvalidRecord); 1352f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[0]); 1353f22ef01cSRoman Divacky if (Opc < 0) { 1354f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown cast. 1355f22ef01cSRoman Divacky } else { 13566122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 1357f785676fSDimitry Andric if (!OpTy) 1358f785676fSDimitry Andric return Error(InvalidRecord); 1359f22ef01cSRoman Divacky Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); 1360f785676fSDimitry Andric V = UpgradeBitCastExpr(Opc, Op, CurTy); 1361f785676fSDimitry Andric if (!V) V = ConstantExpr::getCast(Opc, Op, CurTy); 1362f22ef01cSRoman Divacky } 1363f22ef01cSRoman Divacky break; 1364f22ef01cSRoman Divacky } 1365f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INBOUNDS_GEP: 1366f22ef01cSRoman Divacky case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] 1367f785676fSDimitry Andric if (Record.size() & 1) 1368f785676fSDimitry Andric return Error(InvalidRecord); 1369f22ef01cSRoman Divacky SmallVector<Constant*, 16> Elts; 1370f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 13716122f3e6SDimitry Andric Type *ElTy = getTypeByID(Record[i]); 1372f785676fSDimitry Andric if (!ElTy) 1373f785676fSDimitry Andric return Error(InvalidRecord); 1374f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy)); 1375f22ef01cSRoman Divacky } 13766122f3e6SDimitry Andric ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); 13776122f3e6SDimitry Andric V = ConstantExpr::getGetElementPtr(Elts[0], Indices, 13786122f3e6SDimitry Andric BitCode == 13796122f3e6SDimitry Andric bitc::CST_CODE_CE_INBOUNDS_GEP); 1380f22ef01cSRoman Divacky break; 1381f22ef01cSRoman Divacky } 1382f785676fSDimitry Andric case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#] 1383f785676fSDimitry Andric if (Record.size() < 3) 1384f785676fSDimitry Andric return Error(InvalidRecord); 1385f785676fSDimitry Andric 1386f785676fSDimitry Andric Type *SelectorTy = Type::getInt1Ty(Context); 1387f785676fSDimitry Andric 1388f785676fSDimitry Andric // If CurTy is a vector of length n, then Record[0] must be a <n x i1> 1389f785676fSDimitry Andric // vector. Otherwise, it must be a single bit. 1390f785676fSDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) 1391f785676fSDimitry Andric SelectorTy = VectorType::get(Type::getInt1Ty(Context), 1392f785676fSDimitry Andric VTy->getNumElements()); 1393f785676fSDimitry Andric 1394f785676fSDimitry Andric V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], 1395f785676fSDimitry Andric SelectorTy), 1396f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[1],CurTy), 1397f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[2],CurTy)); 1398f22ef01cSRoman Divacky break; 1399f785676fSDimitry Andric } 1400f22ef01cSRoman Divacky case bitc::CST_CODE_CE_EXTRACTELT: { // CE_EXTRACTELT: [opty, opval, opval] 1401f785676fSDimitry Andric if (Record.size() < 3) 1402f785676fSDimitry Andric return Error(InvalidRecord); 14036122f3e6SDimitry Andric VectorType *OpTy = 1404f22ef01cSRoman Divacky dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 1405f785676fSDimitry Andric if (OpTy == 0) 1406f785676fSDimitry Andric return Error(InvalidRecord); 1407f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 1408139f7f9bSDimitry Andric Constant *Op1 = ValueList.getConstantFwdRef(Record[2], 1409139f7f9bSDimitry Andric Type::getInt32Ty(Context)); 1410f22ef01cSRoman Divacky V = ConstantExpr::getExtractElement(Op0, Op1); 1411f22ef01cSRoman Divacky break; 1412f22ef01cSRoman Divacky } 1413f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INSERTELT: { // CE_INSERTELT: [opval, opval, opval] 14146122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 1415f22ef01cSRoman Divacky if (Record.size() < 3 || OpTy == 0) 1416f785676fSDimitry Andric return Error(InvalidRecord); 1417f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 1418f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], 1419f22ef01cSRoman Divacky OpTy->getElementType()); 1420139f7f9bSDimitry Andric Constant *Op2 = ValueList.getConstantFwdRef(Record[2], 1421139f7f9bSDimitry Andric Type::getInt32Ty(Context)); 1422f22ef01cSRoman Divacky V = ConstantExpr::getInsertElement(Op0, Op1, Op2); 1423f22ef01cSRoman Divacky break; 1424f22ef01cSRoman Divacky } 1425f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] 14266122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 1427f22ef01cSRoman Divacky if (Record.size() < 3 || OpTy == 0) 1428f785676fSDimitry Andric return Error(InvalidRecord); 1429f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 1430f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); 14316122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 1432f22ef01cSRoman Divacky OpTy->getNumElements()); 1433f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); 1434f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 1435f22ef01cSRoman Divacky break; 1436f22ef01cSRoman Divacky } 1437f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] 14386122f3e6SDimitry Andric VectorType *RTy = dyn_cast<VectorType>(CurTy); 14396122f3e6SDimitry Andric VectorType *OpTy = 14402754fe60SDimitry Andric dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 1441f22ef01cSRoman Divacky if (Record.size() < 4 || RTy == 0 || OpTy == 0) 1442f785676fSDimitry Andric return Error(InvalidRecord); 1443f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 1444f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 14456122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 1446f22ef01cSRoman Divacky RTy->getNumElements()); 1447f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); 1448f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 1449f22ef01cSRoman Divacky break; 1450f22ef01cSRoman Divacky } 1451f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] 1452f785676fSDimitry Andric if (Record.size() < 4) 1453f785676fSDimitry Andric return Error(InvalidRecord); 14546122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 1455f785676fSDimitry Andric if (OpTy == 0) 1456f785676fSDimitry Andric return Error(InvalidRecord); 1457f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 1458f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 1459f22ef01cSRoman Divacky 1460f22ef01cSRoman Divacky if (OpTy->isFPOrFPVectorTy()) 1461f22ef01cSRoman Divacky V = ConstantExpr::getFCmp(Record[3], Op0, Op1); 1462f22ef01cSRoman Divacky else 1463f22ef01cSRoman Divacky V = ConstantExpr::getICmp(Record[3], Op0, Op1); 1464f22ef01cSRoman Divacky break; 1465f22ef01cSRoman Divacky } 14663861d79fSDimitry Andric // This maintains backward compatibility, pre-asm dialect keywords. 14673861d79fSDimitry Andric // FIXME: Remove with the 4.0 release. 14683861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM_OLD: { 1469f785676fSDimitry Andric if (Record.size() < 2) 1470f785676fSDimitry Andric return Error(InvalidRecord); 1471f22ef01cSRoman Divacky std::string AsmStr, ConstrStr; 1472f22ef01cSRoman Divacky bool HasSideEffects = Record[0] & 1; 1473f22ef01cSRoman Divacky bool IsAlignStack = Record[0] >> 1; 1474f22ef01cSRoman Divacky unsigned AsmStrSize = Record[1]; 1475f22ef01cSRoman Divacky if (2+AsmStrSize >= Record.size()) 1476f785676fSDimitry Andric return Error(InvalidRecord); 1477f22ef01cSRoman Divacky unsigned ConstStrSize = Record[2+AsmStrSize]; 1478f22ef01cSRoman Divacky if (3+AsmStrSize+ConstStrSize > Record.size()) 1479f785676fSDimitry Andric return Error(InvalidRecord); 1480f22ef01cSRoman Divacky 1481f22ef01cSRoman Divacky for (unsigned i = 0; i != AsmStrSize; ++i) 1482f22ef01cSRoman Divacky AsmStr += (char)Record[2+i]; 1483f22ef01cSRoman Divacky for (unsigned i = 0; i != ConstStrSize; ++i) 1484f22ef01cSRoman Divacky ConstrStr += (char)Record[3+AsmStrSize+i]; 14856122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 1486f22ef01cSRoman Divacky V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 1487f22ef01cSRoman Divacky AsmStr, ConstrStr, HasSideEffects, IsAlignStack); 1488f22ef01cSRoman Divacky break; 1489f22ef01cSRoman Divacky } 14903861d79fSDimitry Andric // This version adds support for the asm dialect keywords (e.g., 14913861d79fSDimitry Andric // inteldialect). 14923861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM: { 1493f785676fSDimitry Andric if (Record.size() < 2) 1494f785676fSDimitry Andric return Error(InvalidRecord); 14953861d79fSDimitry Andric std::string AsmStr, ConstrStr; 14963861d79fSDimitry Andric bool HasSideEffects = Record[0] & 1; 14973861d79fSDimitry Andric bool IsAlignStack = (Record[0] >> 1) & 1; 14983861d79fSDimitry Andric unsigned AsmDialect = Record[0] >> 2; 14993861d79fSDimitry Andric unsigned AsmStrSize = Record[1]; 15003861d79fSDimitry Andric if (2+AsmStrSize >= Record.size()) 1501f785676fSDimitry Andric return Error(InvalidRecord); 15023861d79fSDimitry Andric unsigned ConstStrSize = Record[2+AsmStrSize]; 15033861d79fSDimitry Andric if (3+AsmStrSize+ConstStrSize > Record.size()) 1504f785676fSDimitry Andric return Error(InvalidRecord); 15053861d79fSDimitry Andric 15063861d79fSDimitry Andric for (unsigned i = 0; i != AsmStrSize; ++i) 15073861d79fSDimitry Andric AsmStr += (char)Record[2+i]; 15083861d79fSDimitry Andric for (unsigned i = 0; i != ConstStrSize; ++i) 15093861d79fSDimitry Andric ConstrStr += (char)Record[3+AsmStrSize+i]; 15103861d79fSDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 15113861d79fSDimitry Andric V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 15123861d79fSDimitry Andric AsmStr, ConstrStr, HasSideEffects, IsAlignStack, 15133861d79fSDimitry Andric InlineAsm::AsmDialect(AsmDialect)); 15143861d79fSDimitry Andric break; 15153861d79fSDimitry Andric } 1516f22ef01cSRoman Divacky case bitc::CST_CODE_BLOCKADDRESS:{ 1517f785676fSDimitry Andric if (Record.size() < 3) 1518f785676fSDimitry Andric return Error(InvalidRecord); 15196122f3e6SDimitry Andric Type *FnTy = getTypeByID(Record[0]); 1520f785676fSDimitry Andric if (FnTy == 0) 1521f785676fSDimitry Andric return Error(InvalidRecord); 1522f22ef01cSRoman Divacky Function *Fn = 1523f22ef01cSRoman Divacky dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); 1524f785676fSDimitry Andric if (Fn == 0) 1525f785676fSDimitry Andric return Error(InvalidRecord); 1526f22ef01cSRoman Divacky 15273861d79fSDimitry Andric // If the function is already parsed we can insert the block address right 15283861d79fSDimitry Andric // away. 15293861d79fSDimitry Andric if (!Fn->empty()) { 15303861d79fSDimitry Andric Function::iterator BBI = Fn->begin(), BBE = Fn->end(); 15313861d79fSDimitry Andric for (size_t I = 0, E = Record[2]; I != E; ++I) { 15323861d79fSDimitry Andric if (BBI == BBE) 1533f785676fSDimitry Andric return Error(InvalidID); 15343861d79fSDimitry Andric ++BBI; 15353861d79fSDimitry Andric } 15363861d79fSDimitry Andric V = BlockAddress::get(Fn, BBI); 15373861d79fSDimitry Andric } else { 15383861d79fSDimitry Andric // Otherwise insert a placeholder and remember it so it can be inserted 15393861d79fSDimitry Andric // when the function is parsed. 1540f22ef01cSRoman Divacky GlobalVariable *FwdRef = new GlobalVariable(*Fn->getParent(), 1541f22ef01cSRoman Divacky Type::getInt8Ty(Context), 1542f22ef01cSRoman Divacky false, GlobalValue::InternalLinkage, 1543f22ef01cSRoman Divacky 0, ""); 1544f22ef01cSRoman Divacky BlockAddrFwdRefs[Fn].push_back(std::make_pair(Record[2], FwdRef)); 1545f22ef01cSRoman Divacky V = FwdRef; 15463861d79fSDimitry Andric } 1547f22ef01cSRoman Divacky break; 1548f22ef01cSRoman Divacky } 1549f22ef01cSRoman Divacky } 1550f22ef01cSRoman Divacky 1551f22ef01cSRoman Divacky ValueList.AssignValue(V, NextCstNo); 1552f22ef01cSRoman Divacky ++NextCstNo; 1553f22ef01cSRoman Divacky } 1554f22ef01cSRoman Divacky } 1555f22ef01cSRoman Divacky 1556f785676fSDimitry Andric error_code BitcodeReader::ParseUseLists() { 1557dff0c46cSDimitry Andric if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) 1558f785676fSDimitry Andric return Error(InvalidRecord); 1559dff0c46cSDimitry Andric 1560dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 1561dff0c46cSDimitry Andric 1562dff0c46cSDimitry Andric // Read all the records. 1563dff0c46cSDimitry Andric while (1) { 1564139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1565139f7f9bSDimitry Andric 1566139f7f9bSDimitry Andric switch (Entry.Kind) { 1567139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1568139f7f9bSDimitry Andric case BitstreamEntry::Error: 1569f785676fSDimitry Andric return Error(MalformedBlock); 1570139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1571f785676fSDimitry Andric return error_code::success(); 1572139f7f9bSDimitry Andric case BitstreamEntry::Record: 1573139f7f9bSDimitry Andric // The interesting case. 1574139f7f9bSDimitry Andric break; 1575dff0c46cSDimitry Andric } 1576dff0c46cSDimitry Andric 1577dff0c46cSDimitry Andric // Read a use list record. 1578dff0c46cSDimitry Andric Record.clear(); 1579139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1580dff0c46cSDimitry Andric default: // Default behavior: unknown type. 1581dff0c46cSDimitry Andric break; 1582dff0c46cSDimitry Andric case bitc::USELIST_CODE_ENTRY: { // USELIST_CODE_ENTRY: TBD. 1583dff0c46cSDimitry Andric unsigned RecordLength = Record.size(); 1584dff0c46cSDimitry Andric if (RecordLength < 1) 1585f785676fSDimitry Andric return Error(InvalidRecord); 1586dff0c46cSDimitry Andric UseListRecords.push_back(Record); 1587dff0c46cSDimitry Andric break; 1588dff0c46cSDimitry Andric } 1589dff0c46cSDimitry Andric } 1590dff0c46cSDimitry Andric } 1591dff0c46cSDimitry Andric } 1592dff0c46cSDimitry Andric 1593f22ef01cSRoman Divacky /// RememberAndSkipFunctionBody - When we see the block for a function body, 1594f22ef01cSRoman Divacky /// remember where it is and then skip it. This lets us lazily deserialize the 1595f22ef01cSRoman Divacky /// functions. 1596f785676fSDimitry Andric error_code BitcodeReader::RememberAndSkipFunctionBody() { 1597f22ef01cSRoman Divacky // Get the function we are talking about. 1598f22ef01cSRoman Divacky if (FunctionsWithBodies.empty()) 1599f785676fSDimitry Andric return Error(InsufficientFunctionProtos); 1600f22ef01cSRoman Divacky 1601f22ef01cSRoman Divacky Function *Fn = FunctionsWithBodies.back(); 1602f22ef01cSRoman Divacky FunctionsWithBodies.pop_back(); 1603f22ef01cSRoman Divacky 1604f22ef01cSRoman Divacky // Save the current stream state. 1605f22ef01cSRoman Divacky uint64_t CurBit = Stream.GetCurrentBitNo(); 1606f22ef01cSRoman Divacky DeferredFunctionInfo[Fn] = CurBit; 1607f22ef01cSRoman Divacky 1608f22ef01cSRoman Divacky // Skip over the function block for now. 1609f22ef01cSRoman Divacky if (Stream.SkipBlock()) 1610f785676fSDimitry Andric return Error(InvalidRecord); 1611f785676fSDimitry Andric return error_code::success(); 1612f22ef01cSRoman Divacky } 1613f22ef01cSRoman Divacky 1614f785676fSDimitry Andric error_code BitcodeReader::GlobalCleanup() { 1615f22ef01cSRoman Divacky // Patch the initializers for globals and aliases up. 1616f22ef01cSRoman Divacky ResolveGlobalAndAliasInits(); 1617f22ef01cSRoman Divacky if (!GlobalInits.empty() || !AliasInits.empty()) 1618f785676fSDimitry Andric return Error(MalformedGlobalInitializerSet); 1619f22ef01cSRoman Divacky 1620f22ef01cSRoman Divacky // Look for intrinsic functions which need to be upgraded at some point 1621f22ef01cSRoman Divacky for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); 1622f22ef01cSRoman Divacky FI != FE; ++FI) { 1623f22ef01cSRoman Divacky Function *NewFn; 1624f22ef01cSRoman Divacky if (UpgradeIntrinsicFunction(FI, NewFn)) 1625f22ef01cSRoman Divacky UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); 1626f22ef01cSRoman Divacky } 1627f22ef01cSRoman Divacky 1628e580952dSDimitry Andric // Look for global variables which need to be renamed. 1629e580952dSDimitry Andric for (Module::global_iterator 1630e580952dSDimitry Andric GI = TheModule->global_begin(), GE = TheModule->global_end(); 1631e580952dSDimitry Andric GI != GE; ++GI) 1632e580952dSDimitry Andric UpgradeGlobalVariable(GI); 1633f22ef01cSRoman Divacky // Force deallocation of memory for these vectors to favor the client that 1634f22ef01cSRoman Divacky // want lazy deserialization. 1635f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); 1636f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); 1637f785676fSDimitry Andric return error_code::success(); 1638f22ef01cSRoman Divacky } 1639f22ef01cSRoman Divacky 1640f785676fSDimitry Andric error_code BitcodeReader::ParseModule(bool Resume) { 1641dff0c46cSDimitry Andric if (Resume) 1642dff0c46cSDimitry Andric Stream.JumpToBit(NextUnreadBit); 1643dff0c46cSDimitry Andric else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 1644f785676fSDimitry Andric return Error(InvalidRecord); 1645dff0c46cSDimitry Andric 1646dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 1647dff0c46cSDimitry Andric std::vector<std::string> SectionTable; 1648dff0c46cSDimitry Andric std::vector<std::string> GCTable; 1649dff0c46cSDimitry Andric 1650dff0c46cSDimitry Andric // Read all the records for this module. 1651139f7f9bSDimitry Andric while (1) { 1652139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 1653dff0c46cSDimitry Andric 1654139f7f9bSDimitry Andric switch (Entry.Kind) { 1655139f7f9bSDimitry Andric case BitstreamEntry::Error: 1656f785676fSDimitry Andric return Error(MalformedBlock); 1657139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1658dff0c46cSDimitry Andric return GlobalCleanup(); 1659dff0c46cSDimitry Andric 1660139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 1661139f7f9bSDimitry Andric switch (Entry.ID) { 1662f22ef01cSRoman Divacky default: // Skip unknown content. 1663f22ef01cSRoman Divacky if (Stream.SkipBlock()) 1664f785676fSDimitry Andric return Error(InvalidRecord); 1665f22ef01cSRoman Divacky break; 1666f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 1667f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 1668f785676fSDimitry Andric return Error(MalformedBlock); 1669f22ef01cSRoman Divacky break; 1670f22ef01cSRoman Divacky case bitc::PARAMATTR_BLOCK_ID: 1671f785676fSDimitry Andric if (error_code EC = ParseAttributeBlock()) 1672f785676fSDimitry Andric return EC; 1673f22ef01cSRoman Divacky break; 1674139f7f9bSDimitry Andric case bitc::PARAMATTR_GROUP_BLOCK_ID: 1675f785676fSDimitry Andric if (error_code EC = ParseAttributeGroupBlock()) 1676f785676fSDimitry Andric return EC; 1677139f7f9bSDimitry Andric break; 167817a519f9SDimitry Andric case bitc::TYPE_BLOCK_ID_NEW: 1679f785676fSDimitry Andric if (error_code EC = ParseTypeTable()) 1680f785676fSDimitry Andric return EC; 1681f22ef01cSRoman Divacky break; 1682f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 1683f785676fSDimitry Andric if (error_code EC = ParseValueSymbolTable()) 1684f785676fSDimitry Andric return EC; 1685dff0c46cSDimitry Andric SeenValueSymbolTable = true; 1686f22ef01cSRoman Divacky break; 1687f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 1688f785676fSDimitry Andric if (error_code EC = ParseConstants()) 1689f785676fSDimitry Andric return EC; 1690f785676fSDimitry Andric if (error_code EC = ResolveGlobalAndAliasInits()) 1691f785676fSDimitry Andric return EC; 1692f22ef01cSRoman Divacky break; 1693f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 1694f785676fSDimitry Andric if (error_code EC = ParseMetadata()) 1695f785676fSDimitry Andric return EC; 1696f22ef01cSRoman Divacky break; 1697f22ef01cSRoman Divacky case bitc::FUNCTION_BLOCK_ID: 1698f22ef01cSRoman Divacky // If this is the first function body we've seen, reverse the 1699f22ef01cSRoman Divacky // FunctionsWithBodies list. 1700dff0c46cSDimitry Andric if (!SeenFirstFunctionBody) { 1701f22ef01cSRoman Divacky std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); 1702f785676fSDimitry Andric if (error_code EC = GlobalCleanup()) 1703f785676fSDimitry Andric return EC; 1704dff0c46cSDimitry Andric SeenFirstFunctionBody = true; 1705f22ef01cSRoman Divacky } 1706f22ef01cSRoman Divacky 1707f785676fSDimitry Andric if (error_code EC = RememberAndSkipFunctionBody()) 1708f785676fSDimitry Andric return EC; 1709dff0c46cSDimitry Andric // For streaming bitcode, suspend parsing when we reach the function 1710dff0c46cSDimitry Andric // bodies. Subsequent materialization calls will resume it when 1711dff0c46cSDimitry Andric // necessary. For streaming, the function bodies must be at the end of 1712dff0c46cSDimitry Andric // the bitcode. If the bitcode file is old, the symbol table will be 1713dff0c46cSDimitry Andric // at the end instead and will not have been seen yet. In this case, 1714dff0c46cSDimitry Andric // just finish the parse now. 1715dff0c46cSDimitry Andric if (LazyStreamer && SeenValueSymbolTable) { 1716dff0c46cSDimitry Andric NextUnreadBit = Stream.GetCurrentBitNo(); 1717f785676fSDimitry Andric return error_code::success(); 1718dff0c46cSDimitry Andric } 1719dff0c46cSDimitry Andric break; 1720dff0c46cSDimitry Andric case bitc::USELIST_BLOCK_ID: 1721f785676fSDimitry Andric if (error_code EC = ParseUseLists()) 1722f785676fSDimitry Andric return EC; 1723f22ef01cSRoman Divacky break; 1724f22ef01cSRoman Divacky } 1725f22ef01cSRoman Divacky continue; 1726139f7f9bSDimitry Andric 1727139f7f9bSDimitry Andric case BitstreamEntry::Record: 1728139f7f9bSDimitry Andric // The interesting case. 1729139f7f9bSDimitry Andric break; 1730f22ef01cSRoman Divacky } 1731f22ef01cSRoman Divacky 1732f22ef01cSRoman Divacky 1733f22ef01cSRoman Divacky // Read a record. 1734139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1735f22ef01cSRoman Divacky default: break; // Default behavior, ignore unknown content. 17363861d79fSDimitry Andric case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] 1737f22ef01cSRoman Divacky if (Record.size() < 1) 1738f785676fSDimitry Andric return Error(InvalidRecord); 17393861d79fSDimitry Andric // Only version #0 and #1 are supported so far. 17403861d79fSDimitry Andric unsigned module_version = Record[0]; 17413861d79fSDimitry Andric switch (module_version) { 1742f785676fSDimitry Andric default: 1743f785676fSDimitry Andric return Error(InvalidValue); 17443861d79fSDimitry Andric case 0: 17453861d79fSDimitry Andric UseRelativeIDs = false; 1746f22ef01cSRoman Divacky break; 17473861d79fSDimitry Andric case 1: 17483861d79fSDimitry Andric UseRelativeIDs = true; 17493861d79fSDimitry Andric break; 17503861d79fSDimitry Andric } 17513861d79fSDimitry Andric break; 17523861d79fSDimitry Andric } 1753f22ef01cSRoman Divacky case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 1754f22ef01cSRoman Divacky std::string S; 1755f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1756f785676fSDimitry Andric return Error(InvalidRecord); 1757f22ef01cSRoman Divacky TheModule->setTargetTriple(S); 1758f22ef01cSRoman Divacky break; 1759f22ef01cSRoman Divacky } 1760f22ef01cSRoman Divacky case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] 1761f22ef01cSRoman Divacky std::string S; 1762f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1763f785676fSDimitry Andric return Error(InvalidRecord); 1764f22ef01cSRoman Divacky TheModule->setDataLayout(S); 1765f22ef01cSRoman Divacky break; 1766f22ef01cSRoman Divacky } 1767f22ef01cSRoman Divacky case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] 1768f22ef01cSRoman Divacky std::string S; 1769f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1770f785676fSDimitry Andric return Error(InvalidRecord); 1771f22ef01cSRoman Divacky TheModule->setModuleInlineAsm(S); 1772f22ef01cSRoman Divacky break; 1773f22ef01cSRoman Divacky } 1774f22ef01cSRoman Divacky case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] 1775139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1776f22ef01cSRoman Divacky std::string S; 1777f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1778f785676fSDimitry Andric return Error(InvalidRecord); 1779139f7f9bSDimitry Andric // Ignore value. 1780f22ef01cSRoman Divacky break; 1781f22ef01cSRoman Divacky } 1782f22ef01cSRoman Divacky case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] 1783f22ef01cSRoman Divacky std::string S; 1784f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1785f785676fSDimitry Andric return Error(InvalidRecord); 1786f22ef01cSRoman Divacky SectionTable.push_back(S); 1787f22ef01cSRoman Divacky break; 1788f22ef01cSRoman Divacky } 1789f22ef01cSRoman Divacky case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] 1790f22ef01cSRoman Divacky std::string S; 1791f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 1792f785676fSDimitry Andric return Error(InvalidRecord); 1793f22ef01cSRoman Divacky GCTable.push_back(S); 1794f22ef01cSRoman Divacky break; 1795f22ef01cSRoman Divacky } 1796f22ef01cSRoman Divacky // GLOBALVAR: [pointer type, isconst, initid, 17972754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 17982754fe60SDimitry Andric // unnamed_addr] 1799f22ef01cSRoman Divacky case bitc::MODULE_CODE_GLOBALVAR: { 1800f22ef01cSRoman Divacky if (Record.size() < 6) 1801f785676fSDimitry Andric return Error(InvalidRecord); 18026122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 1803f785676fSDimitry Andric if (!Ty) 1804f785676fSDimitry Andric return Error(InvalidRecord); 1805f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 1806f785676fSDimitry Andric return Error(InvalidTypeForValue); 1807f22ef01cSRoman Divacky unsigned AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); 1808f22ef01cSRoman Divacky Ty = cast<PointerType>(Ty)->getElementType(); 1809f22ef01cSRoman Divacky 1810f22ef01cSRoman Divacky bool isConstant = Record[1]; 1811f22ef01cSRoman Divacky GlobalValue::LinkageTypes Linkage = GetDecodedLinkage(Record[3]); 1812f22ef01cSRoman Divacky unsigned Alignment = (1 << Record[4]) >> 1; 1813f22ef01cSRoman Divacky std::string Section; 1814f22ef01cSRoman Divacky if (Record[5]) { 1815f22ef01cSRoman Divacky if (Record[5]-1 >= SectionTable.size()) 1816f785676fSDimitry Andric return Error(InvalidID); 1817f22ef01cSRoman Divacky Section = SectionTable[Record[5]-1]; 1818f22ef01cSRoman Divacky } 1819f22ef01cSRoman Divacky GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 1820f22ef01cSRoman Divacky if (Record.size() > 6) 1821f22ef01cSRoman Divacky Visibility = GetDecodedVisibility(Record[6]); 18227ae0e2c9SDimitry Andric 18237ae0e2c9SDimitry Andric GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; 1824f22ef01cSRoman Divacky if (Record.size() > 7) 18257ae0e2c9SDimitry Andric TLM = GetDecodedThreadLocalMode(Record[7]); 1826f22ef01cSRoman Divacky 18272754fe60SDimitry Andric bool UnnamedAddr = false; 18282754fe60SDimitry Andric if (Record.size() > 8) 18292754fe60SDimitry Andric UnnamedAddr = Record[8]; 18302754fe60SDimitry Andric 1831139f7f9bSDimitry Andric bool ExternallyInitialized = false; 1832139f7f9bSDimitry Andric if (Record.size() > 9) 1833139f7f9bSDimitry Andric ExternallyInitialized = Record[9]; 1834139f7f9bSDimitry Andric 1835f22ef01cSRoman Divacky GlobalVariable *NewGV = 1836f22ef01cSRoman Divacky new GlobalVariable(*TheModule, Ty, isConstant, Linkage, 0, "", 0, 1837139f7f9bSDimitry Andric TLM, AddressSpace, ExternallyInitialized); 1838f22ef01cSRoman Divacky NewGV->setAlignment(Alignment); 1839f22ef01cSRoman Divacky if (!Section.empty()) 1840f22ef01cSRoman Divacky NewGV->setSection(Section); 1841f22ef01cSRoman Divacky NewGV->setVisibility(Visibility); 18422754fe60SDimitry Andric NewGV->setUnnamedAddr(UnnamedAddr); 1843f22ef01cSRoman Divacky 1844f22ef01cSRoman Divacky ValueList.push_back(NewGV); 1845f22ef01cSRoman Divacky 1846f22ef01cSRoman Divacky // Remember which value to use for the global initializer. 1847f22ef01cSRoman Divacky if (unsigned InitID = Record[2]) 1848f22ef01cSRoman Divacky GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); 1849f22ef01cSRoman Divacky break; 1850f22ef01cSRoman Divacky } 1851f22ef01cSRoman Divacky // FUNCTION: [type, callingconv, isproto, linkage, paramattr, 18522754fe60SDimitry Andric // alignment, section, visibility, gc, unnamed_addr] 1853f22ef01cSRoman Divacky case bitc::MODULE_CODE_FUNCTION: { 1854f22ef01cSRoman Divacky if (Record.size() < 8) 1855f785676fSDimitry Andric return Error(InvalidRecord); 18566122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 1857f785676fSDimitry Andric if (!Ty) 1858f785676fSDimitry Andric return Error(InvalidRecord); 1859f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 1860f785676fSDimitry Andric return Error(InvalidTypeForValue); 18616122f3e6SDimitry Andric FunctionType *FTy = 1862f22ef01cSRoman Divacky dyn_cast<FunctionType>(cast<PointerType>(Ty)->getElementType()); 1863f22ef01cSRoman Divacky if (!FTy) 1864f785676fSDimitry Andric return Error(InvalidTypeForValue); 1865f22ef01cSRoman Divacky 1866f22ef01cSRoman Divacky Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, 1867f22ef01cSRoman Divacky "", TheModule); 1868f22ef01cSRoman Divacky 1869f22ef01cSRoman Divacky Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); 1870f22ef01cSRoman Divacky bool isProto = Record[2]; 1871f22ef01cSRoman Divacky Func->setLinkage(GetDecodedLinkage(Record[3])); 1872f22ef01cSRoman Divacky Func->setAttributes(getAttributes(Record[4])); 1873f22ef01cSRoman Divacky 1874f22ef01cSRoman Divacky Func->setAlignment((1 << Record[5]) >> 1); 1875f22ef01cSRoman Divacky if (Record[6]) { 1876f22ef01cSRoman Divacky if (Record[6]-1 >= SectionTable.size()) 1877f785676fSDimitry Andric return Error(InvalidID); 1878f22ef01cSRoman Divacky Func->setSection(SectionTable[Record[6]-1]); 1879f22ef01cSRoman Divacky } 1880f22ef01cSRoman Divacky Func->setVisibility(GetDecodedVisibility(Record[7])); 1881f22ef01cSRoman Divacky if (Record.size() > 8 && Record[8]) { 1882f22ef01cSRoman Divacky if (Record[8]-1 > GCTable.size()) 1883f785676fSDimitry Andric return Error(InvalidID); 1884f22ef01cSRoman Divacky Func->setGC(GCTable[Record[8]-1].c_str()); 1885f22ef01cSRoman Divacky } 18862754fe60SDimitry Andric bool UnnamedAddr = false; 18872754fe60SDimitry Andric if (Record.size() > 9) 18882754fe60SDimitry Andric UnnamedAddr = Record[9]; 18892754fe60SDimitry Andric Func->setUnnamedAddr(UnnamedAddr); 1890f785676fSDimitry Andric if (Record.size() > 10 && Record[10] != 0) 1891f785676fSDimitry Andric FunctionPrefixes.push_back(std::make_pair(Func, Record[10]-1)); 1892f22ef01cSRoman Divacky ValueList.push_back(Func); 1893f22ef01cSRoman Divacky 1894f22ef01cSRoman Divacky // If this is a function with a body, remember the prototype we are 1895f22ef01cSRoman Divacky // creating now, so that we can match up the body with them later. 1896dff0c46cSDimitry Andric if (!isProto) { 1897f22ef01cSRoman Divacky FunctionsWithBodies.push_back(Func); 1898dff0c46cSDimitry Andric if (LazyStreamer) DeferredFunctionInfo[Func] = 0; 1899dff0c46cSDimitry Andric } 1900f22ef01cSRoman Divacky break; 1901f22ef01cSRoman Divacky } 1902f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage] 1903f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage, visibility] 1904f22ef01cSRoman Divacky case bitc::MODULE_CODE_ALIAS: { 1905f22ef01cSRoman Divacky if (Record.size() < 3) 1906f785676fSDimitry Andric return Error(InvalidRecord); 19076122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 1908f785676fSDimitry Andric if (!Ty) 1909f785676fSDimitry Andric return Error(InvalidRecord); 1910f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 1911f785676fSDimitry Andric return Error(InvalidTypeForValue); 1912f22ef01cSRoman Divacky 1913f22ef01cSRoman Divacky GlobalAlias *NewGA = new GlobalAlias(Ty, GetDecodedLinkage(Record[2]), 1914f22ef01cSRoman Divacky "", 0, TheModule); 1915f22ef01cSRoman Divacky // Old bitcode files didn't have visibility field. 1916f22ef01cSRoman Divacky if (Record.size() > 3) 1917f22ef01cSRoman Divacky NewGA->setVisibility(GetDecodedVisibility(Record[3])); 1918f22ef01cSRoman Divacky ValueList.push_back(NewGA); 1919f22ef01cSRoman Divacky AliasInits.push_back(std::make_pair(NewGA, Record[1])); 1920f22ef01cSRoman Divacky break; 1921f22ef01cSRoman Divacky } 1922f22ef01cSRoman Divacky /// MODULE_CODE_PURGEVALS: [numvals] 1923f22ef01cSRoman Divacky case bitc::MODULE_CODE_PURGEVALS: 1924f22ef01cSRoman Divacky // Trim down the value list to the specified size. 1925f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] > ValueList.size()) 1926f785676fSDimitry Andric return Error(InvalidRecord); 1927f22ef01cSRoman Divacky ValueList.shrinkTo(Record[0]); 1928f22ef01cSRoman Divacky break; 1929f22ef01cSRoman Divacky } 1930f22ef01cSRoman Divacky Record.clear(); 1931f22ef01cSRoman Divacky } 1932f22ef01cSRoman Divacky } 1933f22ef01cSRoman Divacky 1934f785676fSDimitry Andric error_code BitcodeReader::ParseBitcodeInto(Module *M) { 1935f22ef01cSRoman Divacky TheModule = 0; 1936f22ef01cSRoman Divacky 1937f785676fSDimitry Andric if (error_code EC = InitStream()) 1938f785676fSDimitry Andric return EC; 1939f22ef01cSRoman Divacky 1940f22ef01cSRoman Divacky // Sniff for the signature. 1941f22ef01cSRoman Divacky if (Stream.Read(8) != 'B' || 1942f22ef01cSRoman Divacky Stream.Read(8) != 'C' || 1943f22ef01cSRoman Divacky Stream.Read(4) != 0x0 || 1944f22ef01cSRoman Divacky Stream.Read(4) != 0xC || 1945f22ef01cSRoman Divacky Stream.Read(4) != 0xE || 1946f22ef01cSRoman Divacky Stream.Read(4) != 0xD) 1947f785676fSDimitry Andric return Error(InvalidBitcodeSignature); 1948f22ef01cSRoman Divacky 1949f22ef01cSRoman Divacky // We expect a number of well-defined blocks, though we don't necessarily 1950f22ef01cSRoman Divacky // need to understand them all. 1951139f7f9bSDimitry Andric while (1) { 1952139f7f9bSDimitry Andric if (Stream.AtEndOfStream()) 1953f785676fSDimitry Andric return error_code::success(); 1954bd5abe19SDimitry Andric 1955139f7f9bSDimitry Andric BitstreamEntry Entry = 1956139f7f9bSDimitry Andric Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); 1957f22ef01cSRoman Divacky 1958139f7f9bSDimitry Andric switch (Entry.Kind) { 1959139f7f9bSDimitry Andric case BitstreamEntry::Error: 1960f785676fSDimitry Andric return Error(MalformedBlock); 1961139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1962f785676fSDimitry Andric return error_code::success(); 1963f22ef01cSRoman Divacky 1964139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 1965139f7f9bSDimitry Andric switch (Entry.ID) { 1966f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 1967f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 1968f785676fSDimitry Andric return Error(MalformedBlock); 1969f22ef01cSRoman Divacky break; 1970f22ef01cSRoman Divacky case bitc::MODULE_BLOCK_ID: 1971f22ef01cSRoman Divacky // Reject multiple MODULE_BLOCK's in a single bitstream. 1972f22ef01cSRoman Divacky if (TheModule) 1973f785676fSDimitry Andric return Error(InvalidMultipleBlocks); 1974f22ef01cSRoman Divacky TheModule = M; 1975f785676fSDimitry Andric if (error_code EC = ParseModule(false)) 1976f785676fSDimitry Andric return EC; 1977f785676fSDimitry Andric if (LazyStreamer) 1978f785676fSDimitry Andric return error_code::success(); 1979f22ef01cSRoman Divacky break; 1980f22ef01cSRoman Divacky default: 1981f22ef01cSRoman Divacky if (Stream.SkipBlock()) 1982f785676fSDimitry Andric return Error(InvalidRecord); 1983f22ef01cSRoman Divacky break; 1984f22ef01cSRoman Divacky } 1985139f7f9bSDimitry Andric continue; 1986139f7f9bSDimitry Andric case BitstreamEntry::Record: 1987139f7f9bSDimitry Andric // There should be no records in the top-level of blocks. 1988f22ef01cSRoman Divacky 1989139f7f9bSDimitry Andric // The ranlib in Xcode 4 will align archive members by appending newlines 1990139f7f9bSDimitry Andric // to the end of them. If this file size is a multiple of 4 but not 8, we 1991139f7f9bSDimitry Andric // have to read and ignore these final 4 bytes :-( 1992139f7f9bSDimitry Andric if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 && 1993139f7f9bSDimitry Andric Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a && 1994139f7f9bSDimitry Andric Stream.AtEndOfStream()) 1995f785676fSDimitry Andric return error_code::success(); 1996139f7f9bSDimitry Andric 1997f785676fSDimitry Andric return Error(InvalidRecord); 1998139f7f9bSDimitry Andric } 1999139f7f9bSDimitry Andric } 2000f22ef01cSRoman Divacky } 2001f22ef01cSRoman Divacky 2002f785676fSDimitry Andric error_code BitcodeReader::ParseModuleTriple(std::string &Triple) { 20032754fe60SDimitry Andric if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 2004f785676fSDimitry Andric return Error(InvalidRecord); 20052754fe60SDimitry Andric 20062754fe60SDimitry Andric SmallVector<uint64_t, 64> Record; 20072754fe60SDimitry Andric 20082754fe60SDimitry Andric // Read all the records for this module. 2009139f7f9bSDimitry Andric while (1) { 2010139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 20112754fe60SDimitry Andric 2012139f7f9bSDimitry Andric switch (Entry.Kind) { 2013139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2014139f7f9bSDimitry Andric case BitstreamEntry::Error: 2015f785676fSDimitry Andric return Error(MalformedBlock); 2016139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2017f785676fSDimitry Andric return error_code::success(); 2018139f7f9bSDimitry Andric case BitstreamEntry::Record: 2019139f7f9bSDimitry Andric // The interesting case. 20202754fe60SDimitry Andric break; 20212754fe60SDimitry Andric } 20222754fe60SDimitry Andric 20232754fe60SDimitry Andric // Read a record. 2024139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 20252754fe60SDimitry Andric default: break; // Default behavior, ignore unknown content. 20262754fe60SDimitry Andric case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 20272754fe60SDimitry Andric std::string S; 20282754fe60SDimitry Andric if (ConvertToString(Record, 0, S)) 2029f785676fSDimitry Andric return Error(InvalidRecord); 20302754fe60SDimitry Andric Triple = S; 20312754fe60SDimitry Andric break; 20322754fe60SDimitry Andric } 20332754fe60SDimitry Andric } 20342754fe60SDimitry Andric Record.clear(); 20352754fe60SDimitry Andric } 20362754fe60SDimitry Andric } 20372754fe60SDimitry Andric 2038f785676fSDimitry Andric error_code BitcodeReader::ParseTriple(std::string &Triple) { 2039f785676fSDimitry Andric if (error_code EC = InitStream()) 2040f785676fSDimitry Andric return EC; 20412754fe60SDimitry Andric 20422754fe60SDimitry Andric // Sniff for the signature. 20432754fe60SDimitry Andric if (Stream.Read(8) != 'B' || 20442754fe60SDimitry Andric Stream.Read(8) != 'C' || 20452754fe60SDimitry Andric Stream.Read(4) != 0x0 || 20462754fe60SDimitry Andric Stream.Read(4) != 0xC || 20472754fe60SDimitry Andric Stream.Read(4) != 0xE || 20482754fe60SDimitry Andric Stream.Read(4) != 0xD) 2049f785676fSDimitry Andric return Error(InvalidBitcodeSignature); 20502754fe60SDimitry Andric 20512754fe60SDimitry Andric // We expect a number of well-defined blocks, though we don't necessarily 20522754fe60SDimitry Andric // need to understand them all. 2053139f7f9bSDimitry Andric while (1) { 2054139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 20552754fe60SDimitry Andric 2056139f7f9bSDimitry Andric switch (Entry.Kind) { 2057139f7f9bSDimitry Andric case BitstreamEntry::Error: 2058f785676fSDimitry Andric return Error(MalformedBlock); 2059139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2060f785676fSDimitry Andric return error_code::success(); 2061139f7f9bSDimitry Andric 2062139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2063139f7f9bSDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 2064139f7f9bSDimitry Andric return ParseModuleTriple(Triple); 2065139f7f9bSDimitry Andric 2066139f7f9bSDimitry Andric // Ignore other sub-blocks. 2067f785676fSDimitry Andric if (Stream.SkipBlock()) 2068f785676fSDimitry Andric return Error(MalformedBlock); 2069139f7f9bSDimitry Andric continue; 2070139f7f9bSDimitry Andric 2071139f7f9bSDimitry Andric case BitstreamEntry::Record: 2072139f7f9bSDimitry Andric Stream.skipRecord(Entry.ID); 2073139f7f9bSDimitry Andric continue; 2074139f7f9bSDimitry Andric } 2075139f7f9bSDimitry Andric } 20762754fe60SDimitry Andric } 20772754fe60SDimitry Andric 2078f22ef01cSRoman Divacky /// ParseMetadataAttachment - Parse metadata attachments. 2079f785676fSDimitry Andric error_code BitcodeReader::ParseMetadataAttachment() { 2080f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 2081f785676fSDimitry Andric return Error(InvalidRecord); 2082f22ef01cSRoman Divacky 2083f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2084f22ef01cSRoman Divacky while (1) { 2085139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2086139f7f9bSDimitry Andric 2087139f7f9bSDimitry Andric switch (Entry.Kind) { 2088139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2089139f7f9bSDimitry Andric case BitstreamEntry::Error: 2090f785676fSDimitry Andric return Error(MalformedBlock); 2091139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2092f785676fSDimitry Andric return error_code::success(); 2093139f7f9bSDimitry Andric case BitstreamEntry::Record: 2094139f7f9bSDimitry Andric // The interesting case. 2095f22ef01cSRoman Divacky break; 2096f22ef01cSRoman Divacky } 2097139f7f9bSDimitry Andric 2098f22ef01cSRoman Divacky // Read a metadata attachment record. 2099f22ef01cSRoman Divacky Record.clear(); 2100139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2101f22ef01cSRoman Divacky default: // Default behavior: ignore. 2102f22ef01cSRoman Divacky break; 210317a519f9SDimitry Andric case bitc::METADATA_ATTACHMENT: { 2104f22ef01cSRoman Divacky unsigned RecordLength = Record.size(); 2105f22ef01cSRoman Divacky if (Record.empty() || (RecordLength - 1) % 2 == 1) 2106f785676fSDimitry Andric return Error(InvalidRecord); 2107f22ef01cSRoman Divacky Instruction *Inst = InstructionList[Record[0]]; 2108f22ef01cSRoman Divacky for (unsigned i = 1; i != RecordLength; i = i+2) { 2109f22ef01cSRoman Divacky unsigned Kind = Record[i]; 2110e580952dSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = 2111e580952dSDimitry Andric MDKindMap.find(Kind); 2112e580952dSDimitry Andric if (I == MDKindMap.end()) 2113f785676fSDimitry Andric return Error(InvalidID); 2114f22ef01cSRoman Divacky Value *Node = MDValueList.getValueFwdRef(Record[i+1]); 2115e580952dSDimitry Andric Inst->setMetadata(I->second, cast<MDNode>(Node)); 2116f785676fSDimitry Andric if (I->second == LLVMContext::MD_tbaa) 2117f785676fSDimitry Andric InstsWithTBAATag.push_back(Inst); 2118f22ef01cSRoman Divacky } 2119f22ef01cSRoman Divacky break; 2120f22ef01cSRoman Divacky } 2121f22ef01cSRoman Divacky } 2122f22ef01cSRoman Divacky } 2123f22ef01cSRoman Divacky } 2124f22ef01cSRoman Divacky 2125f22ef01cSRoman Divacky /// ParseFunctionBody - Lazily parse the specified function body block. 2126f785676fSDimitry Andric error_code BitcodeReader::ParseFunctionBody(Function *F) { 2127f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) 2128f785676fSDimitry Andric return Error(InvalidRecord); 2129f22ef01cSRoman Divacky 2130f22ef01cSRoman Divacky InstructionList.clear(); 2131f22ef01cSRoman Divacky unsigned ModuleValueListSize = ValueList.size(); 2132e580952dSDimitry Andric unsigned ModuleMDValueListSize = MDValueList.size(); 2133f22ef01cSRoman Divacky 2134f22ef01cSRoman Divacky // Add all the function arguments to the value table. 2135f22ef01cSRoman Divacky for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) 2136f22ef01cSRoman Divacky ValueList.push_back(I); 2137f22ef01cSRoman Divacky 2138f22ef01cSRoman Divacky unsigned NextValueNo = ValueList.size(); 2139f22ef01cSRoman Divacky BasicBlock *CurBB = 0; 2140f22ef01cSRoman Divacky unsigned CurBBNo = 0; 2141f22ef01cSRoman Divacky 2142f22ef01cSRoman Divacky DebugLoc LastLoc; 2143f22ef01cSRoman Divacky 2144f22ef01cSRoman Divacky // Read all the records. 2145f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2146f22ef01cSRoman Divacky while (1) { 2147139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 2148f22ef01cSRoman Divacky 2149139f7f9bSDimitry Andric switch (Entry.Kind) { 2150139f7f9bSDimitry Andric case BitstreamEntry::Error: 2151f785676fSDimitry Andric return Error(MalformedBlock); 2152139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2153139f7f9bSDimitry Andric goto OutOfRecordLoop; 2154139f7f9bSDimitry Andric 2155139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2156139f7f9bSDimitry Andric switch (Entry.ID) { 2157f22ef01cSRoman Divacky default: // Skip unknown content. 2158f22ef01cSRoman Divacky if (Stream.SkipBlock()) 2159f785676fSDimitry Andric return Error(InvalidRecord); 2160f22ef01cSRoman Divacky break; 2161f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 2162f785676fSDimitry Andric if (error_code EC = ParseConstants()) 2163f785676fSDimitry Andric return EC; 2164f22ef01cSRoman Divacky NextValueNo = ValueList.size(); 2165f22ef01cSRoman Divacky break; 2166f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 2167f785676fSDimitry Andric if (error_code EC = ParseValueSymbolTable()) 2168f785676fSDimitry Andric return EC; 2169f22ef01cSRoman Divacky break; 2170f22ef01cSRoman Divacky case bitc::METADATA_ATTACHMENT_ID: 2171f785676fSDimitry Andric if (error_code EC = ParseMetadataAttachment()) 2172f785676fSDimitry Andric return EC; 2173f22ef01cSRoman Divacky break; 2174f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 2175f785676fSDimitry Andric if (error_code EC = ParseMetadata()) 2176f785676fSDimitry Andric return EC; 2177f22ef01cSRoman Divacky break; 2178f22ef01cSRoman Divacky } 2179f22ef01cSRoman Divacky continue; 2180f22ef01cSRoman Divacky 2181139f7f9bSDimitry Andric case BitstreamEntry::Record: 2182139f7f9bSDimitry Andric // The interesting case. 2183139f7f9bSDimitry Andric break; 2184f22ef01cSRoman Divacky } 2185f22ef01cSRoman Divacky 2186f22ef01cSRoman Divacky // Read a record. 2187f22ef01cSRoman Divacky Record.clear(); 2188f22ef01cSRoman Divacky Instruction *I = 0; 2189139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 2190f22ef01cSRoman Divacky switch (BitCode) { 2191f22ef01cSRoman Divacky default: // Default behavior: reject 2192f785676fSDimitry Andric return Error(InvalidValue); 2193f22ef01cSRoman Divacky case bitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] 2194f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] == 0) 2195f785676fSDimitry Andric return Error(InvalidRecord); 2196f22ef01cSRoman Divacky // Create all the basic blocks for the function. 2197f22ef01cSRoman Divacky FunctionBBs.resize(Record[0]); 2198f22ef01cSRoman Divacky for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) 2199f22ef01cSRoman Divacky FunctionBBs[i] = BasicBlock::Create(Context, "", F); 2200f22ef01cSRoman Divacky CurBB = FunctionBBs[0]; 2201f22ef01cSRoman Divacky continue; 2202f22ef01cSRoman Divacky 2203f22ef01cSRoman Divacky case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN 2204f22ef01cSRoman Divacky // This record indicates that the last instruction is at the same 2205f22ef01cSRoman Divacky // location as the previous instruction with a location. 2206f22ef01cSRoman Divacky I = 0; 2207f22ef01cSRoman Divacky 2208f22ef01cSRoman Divacky // Get the last instruction emitted. 2209f22ef01cSRoman Divacky if (CurBB && !CurBB->empty()) 2210f22ef01cSRoman Divacky I = &CurBB->back(); 2211f22ef01cSRoman Divacky else if (CurBBNo && FunctionBBs[CurBBNo-1] && 2212f22ef01cSRoman Divacky !FunctionBBs[CurBBNo-1]->empty()) 2213f22ef01cSRoman Divacky I = &FunctionBBs[CurBBNo-1]->back(); 2214f22ef01cSRoman Divacky 2215f785676fSDimitry Andric if (I == 0) 2216f785676fSDimitry Andric return Error(InvalidRecord); 2217f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 2218f22ef01cSRoman Divacky I = 0; 2219f22ef01cSRoman Divacky continue; 2220f22ef01cSRoman Divacky 222117a519f9SDimitry Andric case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] 2222f22ef01cSRoman Divacky I = 0; // Get the last instruction emitted. 2223f22ef01cSRoman Divacky if (CurBB && !CurBB->empty()) 2224f22ef01cSRoman Divacky I = &CurBB->back(); 2225f22ef01cSRoman Divacky else if (CurBBNo && FunctionBBs[CurBBNo-1] && 2226f22ef01cSRoman Divacky !FunctionBBs[CurBBNo-1]->empty()) 2227f22ef01cSRoman Divacky I = &FunctionBBs[CurBBNo-1]->back(); 2228f22ef01cSRoman Divacky if (I == 0 || Record.size() < 4) 2229f785676fSDimitry Andric return Error(InvalidRecord); 2230f22ef01cSRoman Divacky 2231f22ef01cSRoman Divacky unsigned Line = Record[0], Col = Record[1]; 2232f22ef01cSRoman Divacky unsigned ScopeID = Record[2], IAID = Record[3]; 2233f22ef01cSRoman Divacky 2234f22ef01cSRoman Divacky MDNode *Scope = 0, *IA = 0; 2235f22ef01cSRoman Divacky if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); 2236f22ef01cSRoman Divacky if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); 2237f22ef01cSRoman Divacky LastLoc = DebugLoc::get(Line, Col, Scope, IA); 2238f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 2239f22ef01cSRoman Divacky I = 0; 2240f22ef01cSRoman Divacky continue; 2241f22ef01cSRoman Divacky } 2242f22ef01cSRoman Divacky 2243f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] 2244f22ef01cSRoman Divacky unsigned OpNum = 0; 2245f22ef01cSRoman Divacky Value *LHS, *RHS; 2246f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 22473861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 2248f22ef01cSRoman Divacky OpNum+1 > Record.size()) 2249f785676fSDimitry Andric return Error(InvalidRecord); 2250f22ef01cSRoman Divacky 2251f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); 2252f785676fSDimitry Andric if (Opc == -1) 2253f785676fSDimitry Andric return Error(InvalidRecord); 2254f22ef01cSRoman Divacky I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); 2255f22ef01cSRoman Divacky InstructionList.push_back(I); 2256f22ef01cSRoman Divacky if (OpNum < Record.size()) { 2257f22ef01cSRoman Divacky if (Opc == Instruction::Add || 2258f22ef01cSRoman Divacky Opc == Instruction::Sub || 22592754fe60SDimitry Andric Opc == Instruction::Mul || 22602754fe60SDimitry Andric Opc == Instruction::Shl) { 2261f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 2262f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoSignedWrap(true); 2263f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 2264f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); 22652754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 22662754fe60SDimitry Andric Opc == Instruction::UDiv || 22672754fe60SDimitry Andric Opc == Instruction::LShr || 22682754fe60SDimitry Andric Opc == Instruction::AShr) { 22692754fe60SDimitry Andric if (Record[OpNum] & (1 << bitc::PEO_EXACT)) 2270f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setIsExact(true); 2271139f7f9bSDimitry Andric } else if (isa<FPMathOperator>(I)) { 2272139f7f9bSDimitry Andric FastMathFlags FMF; 2273139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) 2274139f7f9bSDimitry Andric FMF.setUnsafeAlgebra(); 2275139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) 2276139f7f9bSDimitry Andric FMF.setNoNaNs(); 2277139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) 2278139f7f9bSDimitry Andric FMF.setNoInfs(); 2279139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) 2280139f7f9bSDimitry Andric FMF.setNoSignedZeros(); 2281139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) 2282139f7f9bSDimitry Andric FMF.setAllowReciprocal(); 2283139f7f9bSDimitry Andric if (FMF.any()) 2284139f7f9bSDimitry Andric I->setFastMathFlags(FMF); 2285f22ef01cSRoman Divacky } 2286139f7f9bSDimitry Andric 2287f22ef01cSRoman Divacky } 2288f22ef01cSRoman Divacky break; 2289f22ef01cSRoman Divacky } 2290f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] 2291f22ef01cSRoman Divacky unsigned OpNum = 0; 2292f22ef01cSRoman Divacky Value *Op; 2293f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 2294f22ef01cSRoman Divacky OpNum+2 != Record.size()) 2295f785676fSDimitry Andric return Error(InvalidRecord); 2296f22ef01cSRoman Divacky 22976122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[OpNum]); 2298f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[OpNum+1]); 2299f22ef01cSRoman Divacky if (Opc == -1 || ResTy == 0) 2300f785676fSDimitry Andric return Error(InvalidRecord); 2301f785676fSDimitry Andric Instruction *Temp = 0; 2302f785676fSDimitry Andric if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) { 2303f785676fSDimitry Andric if (Temp) { 2304f785676fSDimitry Andric InstructionList.push_back(Temp); 2305f785676fSDimitry Andric CurBB->getInstList().push_back(Temp); 2306f785676fSDimitry Andric } 2307f785676fSDimitry Andric } else { 2308f22ef01cSRoman Divacky I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); 2309f785676fSDimitry Andric } 2310f22ef01cSRoman Divacky InstructionList.push_back(I); 2311f22ef01cSRoman Divacky break; 2312f22ef01cSRoman Divacky } 2313f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INBOUNDS_GEP: 2314f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_GEP: { // GEP: [n x operands] 2315f22ef01cSRoman Divacky unsigned OpNum = 0; 2316f22ef01cSRoman Divacky Value *BasePtr; 2317f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) 2318f785676fSDimitry Andric return Error(InvalidRecord); 2319f22ef01cSRoman Divacky 2320f22ef01cSRoman Divacky SmallVector<Value*, 16> GEPIdx; 2321f22ef01cSRoman Divacky while (OpNum != Record.size()) { 2322f22ef01cSRoman Divacky Value *Op; 2323f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 2324f785676fSDimitry Andric return Error(InvalidRecord); 2325f22ef01cSRoman Divacky GEPIdx.push_back(Op); 2326f22ef01cSRoman Divacky } 2327f22ef01cSRoman Divacky 23286122f3e6SDimitry Andric I = GetElementPtrInst::Create(BasePtr, GEPIdx); 2329f22ef01cSRoman Divacky InstructionList.push_back(I); 2330f22ef01cSRoman Divacky if (BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP) 2331f22ef01cSRoman Divacky cast<GetElementPtrInst>(I)->setIsInBounds(true); 2332f22ef01cSRoman Divacky break; 2333f22ef01cSRoman Divacky } 2334f22ef01cSRoman Divacky 2335f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTVAL: { 2336f22ef01cSRoman Divacky // EXTRACTVAL: [opty, opval, n x indices] 2337f22ef01cSRoman Divacky unsigned OpNum = 0; 2338f22ef01cSRoman Divacky Value *Agg; 2339f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 2340f785676fSDimitry Andric return Error(InvalidRecord); 2341f22ef01cSRoman Divacky 2342f22ef01cSRoman Divacky SmallVector<unsigned, 4> EXTRACTVALIdx; 2343f22ef01cSRoman Divacky for (unsigned RecSize = Record.size(); 2344f22ef01cSRoman Divacky OpNum != RecSize; ++OpNum) { 2345f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 2346f22ef01cSRoman Divacky if ((unsigned)Index != Index) 2347f785676fSDimitry Andric return Error(InvalidValue); 2348f22ef01cSRoman Divacky EXTRACTVALIdx.push_back((unsigned)Index); 2349f22ef01cSRoman Divacky } 2350f22ef01cSRoman Divacky 235117a519f9SDimitry Andric I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); 2352f22ef01cSRoman Divacky InstructionList.push_back(I); 2353f22ef01cSRoman Divacky break; 2354f22ef01cSRoman Divacky } 2355f22ef01cSRoman Divacky 2356f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTVAL: { 2357f22ef01cSRoman Divacky // INSERTVAL: [opty, opval, opty, opval, n x indices] 2358f22ef01cSRoman Divacky unsigned OpNum = 0; 2359f22ef01cSRoman Divacky Value *Agg; 2360f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 2361f785676fSDimitry Andric return Error(InvalidRecord); 2362f22ef01cSRoman Divacky Value *Val; 2363f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Val)) 2364f785676fSDimitry Andric return Error(InvalidRecord); 2365f22ef01cSRoman Divacky 2366f22ef01cSRoman Divacky SmallVector<unsigned, 4> INSERTVALIdx; 2367f22ef01cSRoman Divacky for (unsigned RecSize = Record.size(); 2368f22ef01cSRoman Divacky OpNum != RecSize; ++OpNum) { 2369f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 2370f22ef01cSRoman Divacky if ((unsigned)Index != Index) 2371f785676fSDimitry Andric return Error(InvalidValue); 2372f22ef01cSRoman Divacky INSERTVALIdx.push_back((unsigned)Index); 2373f22ef01cSRoman Divacky } 2374f22ef01cSRoman Divacky 237517a519f9SDimitry Andric I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); 2376f22ef01cSRoman Divacky InstructionList.push_back(I); 2377f22ef01cSRoman Divacky break; 2378f22ef01cSRoman Divacky } 2379f22ef01cSRoman Divacky 2380f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] 2381f22ef01cSRoman Divacky // obsolete form of select 2382f22ef01cSRoman Divacky // handles select i1 ... in old bitcode 2383f22ef01cSRoman Divacky unsigned OpNum = 0; 2384f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 2385f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 23863861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 23873861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) 2388f785676fSDimitry Andric return Error(InvalidRecord); 2389f22ef01cSRoman Divacky 2390f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 2391f22ef01cSRoman Divacky InstructionList.push_back(I); 2392f22ef01cSRoman Divacky break; 2393f22ef01cSRoman Divacky } 2394f22ef01cSRoman Divacky 2395f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] 2396f22ef01cSRoman Divacky // new form of select 2397f22ef01cSRoman Divacky // handles select i1 or select [N x i1] 2398f22ef01cSRoman Divacky unsigned OpNum = 0; 2399f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 2400f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 24013861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 2402f22ef01cSRoman Divacky getValueTypePair(Record, OpNum, NextValueNo, Cond)) 2403f785676fSDimitry Andric return Error(InvalidRecord); 2404f22ef01cSRoman Divacky 2405f22ef01cSRoman Divacky // select condition can be either i1 or [N x i1] 24066122f3e6SDimitry Andric if (VectorType* vector_type = 24076122f3e6SDimitry Andric dyn_cast<VectorType>(Cond->getType())) { 2408f22ef01cSRoman Divacky // expect <n x i1> 2409f22ef01cSRoman Divacky if (vector_type->getElementType() != Type::getInt1Ty(Context)) 2410f785676fSDimitry Andric return Error(InvalidTypeForValue); 2411f22ef01cSRoman Divacky } else { 2412f22ef01cSRoman Divacky // expect i1 2413f22ef01cSRoman Divacky if (Cond->getType() != Type::getInt1Ty(Context)) 2414f785676fSDimitry Andric return Error(InvalidTypeForValue); 2415f22ef01cSRoman Divacky } 2416f22ef01cSRoman Divacky 2417f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 2418f22ef01cSRoman Divacky InstructionList.push_back(I); 2419f22ef01cSRoman Divacky break; 2420f22ef01cSRoman Divacky } 2421f22ef01cSRoman Divacky 2422f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] 2423f22ef01cSRoman Divacky unsigned OpNum = 0; 2424f22ef01cSRoman Divacky Value *Vec, *Idx; 2425f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 24263861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) 2427f785676fSDimitry Andric return Error(InvalidRecord); 2428f22ef01cSRoman Divacky I = ExtractElementInst::Create(Vec, Idx); 2429f22ef01cSRoman Divacky InstructionList.push_back(I); 2430f22ef01cSRoman Divacky break; 2431f22ef01cSRoman Divacky } 2432f22ef01cSRoman Divacky 2433f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] 2434f22ef01cSRoman Divacky unsigned OpNum = 0; 2435f22ef01cSRoman Divacky Value *Vec, *Elt, *Idx; 2436f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 24373861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 2438f22ef01cSRoman Divacky cast<VectorType>(Vec->getType())->getElementType(), Elt) || 24393861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) 2440f785676fSDimitry Andric return Error(InvalidRecord); 2441f22ef01cSRoman Divacky I = InsertElementInst::Create(Vec, Elt, Idx); 2442f22ef01cSRoman Divacky InstructionList.push_back(I); 2443f22ef01cSRoman Divacky break; 2444f22ef01cSRoman Divacky } 2445f22ef01cSRoman Divacky 2446f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] 2447f22ef01cSRoman Divacky unsigned OpNum = 0; 2448f22ef01cSRoman Divacky Value *Vec1, *Vec2, *Mask; 2449f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || 24503861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) 2451f785676fSDimitry Andric return Error(InvalidRecord); 2452f22ef01cSRoman Divacky 2453f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) 2454f785676fSDimitry Andric return Error(InvalidRecord); 2455f22ef01cSRoman Divacky I = new ShuffleVectorInst(Vec1, Vec2, Mask); 2456f22ef01cSRoman Divacky InstructionList.push_back(I); 2457f22ef01cSRoman Divacky break; 2458f22ef01cSRoman Divacky } 2459f22ef01cSRoman Divacky 2460f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] 2461f22ef01cSRoman Divacky // Old form of ICmp/FCmp returning bool 2462f22ef01cSRoman Divacky // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were 2463f22ef01cSRoman Divacky // both legal on vectors but had different behaviour. 2464f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] 2465f22ef01cSRoman Divacky // FCmp/ICmp returning bool or vector of bool 2466f22ef01cSRoman Divacky 2467f22ef01cSRoman Divacky unsigned OpNum = 0; 2468f22ef01cSRoman Divacky Value *LHS, *RHS; 2469f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 24703861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 2471f22ef01cSRoman Divacky OpNum+1 != Record.size()) 2472f785676fSDimitry Andric return Error(InvalidRecord); 2473f22ef01cSRoman Divacky 2474f22ef01cSRoman Divacky if (LHS->getType()->isFPOrFPVectorTy()) 2475f22ef01cSRoman Divacky I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); 2476f22ef01cSRoman Divacky else 2477f22ef01cSRoman Divacky I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); 2478f22ef01cSRoman Divacky InstructionList.push_back(I); 2479f22ef01cSRoman Divacky break; 2480f22ef01cSRoman Divacky } 2481f22ef01cSRoman Divacky 2482f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] 2483f22ef01cSRoman Divacky { 2484f22ef01cSRoman Divacky unsigned Size = Record.size(); 2485f22ef01cSRoman Divacky if (Size == 0) { 2486f22ef01cSRoman Divacky I = ReturnInst::Create(Context); 2487f22ef01cSRoman Divacky InstructionList.push_back(I); 2488f22ef01cSRoman Divacky break; 2489f22ef01cSRoman Divacky } 2490f22ef01cSRoman Divacky 2491f22ef01cSRoman Divacky unsigned OpNum = 0; 2492f22ef01cSRoman Divacky Value *Op = NULL; 2493f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 2494f785676fSDimitry Andric return Error(InvalidRecord); 249517a519f9SDimitry Andric if (OpNum != Record.size()) 2496f785676fSDimitry Andric return Error(InvalidRecord); 2497f22ef01cSRoman Divacky 249817a519f9SDimitry Andric I = ReturnInst::Create(Context, Op); 2499f22ef01cSRoman Divacky InstructionList.push_back(I); 2500f22ef01cSRoman Divacky break; 2501f22ef01cSRoman Divacky } 2502f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] 2503f22ef01cSRoman Divacky if (Record.size() != 1 && Record.size() != 3) 2504f785676fSDimitry Andric return Error(InvalidRecord); 2505f22ef01cSRoman Divacky BasicBlock *TrueDest = getBasicBlock(Record[0]); 2506f22ef01cSRoman Divacky if (TrueDest == 0) 2507f785676fSDimitry Andric return Error(InvalidRecord); 2508f22ef01cSRoman Divacky 2509f22ef01cSRoman Divacky if (Record.size() == 1) { 2510f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest); 2511f22ef01cSRoman Divacky InstructionList.push_back(I); 2512f22ef01cSRoman Divacky } 2513f22ef01cSRoman Divacky else { 2514f22ef01cSRoman Divacky BasicBlock *FalseDest = getBasicBlock(Record[1]); 25153861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, 25163861d79fSDimitry Andric Type::getInt1Ty(Context)); 2517f22ef01cSRoman Divacky if (FalseDest == 0 || Cond == 0) 2518f785676fSDimitry Andric return Error(InvalidRecord); 2519f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest, FalseDest, Cond); 2520f22ef01cSRoman Divacky InstructionList.push_back(I); 2521f22ef01cSRoman Divacky } 2522f22ef01cSRoman Divacky break; 2523f22ef01cSRoman Divacky } 2524f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] 25257ae0e2c9SDimitry Andric // Check magic 25267ae0e2c9SDimitry Andric if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { 2527f785676fSDimitry Andric // "New" SwitchInst format with case ranges. The changes to write this 2528f785676fSDimitry Andric // format were reverted but we still recognize bitcode that uses it. 2529f785676fSDimitry Andric // Hopefully someday we will have support for case ranges and can use 2530f785676fSDimitry Andric // this format again. 25317ae0e2c9SDimitry Andric 25327ae0e2c9SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 25337ae0e2c9SDimitry Andric unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); 25347ae0e2c9SDimitry Andric 25353861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, OpTy); 25367ae0e2c9SDimitry Andric BasicBlock *Default = getBasicBlock(Record[3]); 25377ae0e2c9SDimitry Andric if (OpTy == 0 || Cond == 0 || Default == 0) 2538f785676fSDimitry Andric return Error(InvalidRecord); 25397ae0e2c9SDimitry Andric 25407ae0e2c9SDimitry Andric unsigned NumCases = Record[4]; 25417ae0e2c9SDimitry Andric 25427ae0e2c9SDimitry Andric SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 25437ae0e2c9SDimitry Andric InstructionList.push_back(SI); 25447ae0e2c9SDimitry Andric 25457ae0e2c9SDimitry Andric unsigned CurIdx = 5; 25467ae0e2c9SDimitry Andric for (unsigned i = 0; i != NumCases; ++i) { 2547f785676fSDimitry Andric SmallVector<ConstantInt*, 1> CaseVals; 25487ae0e2c9SDimitry Andric unsigned NumItems = Record[CurIdx++]; 25497ae0e2c9SDimitry Andric for (unsigned ci = 0; ci != NumItems; ++ci) { 25507ae0e2c9SDimitry Andric bool isSingleNumber = Record[CurIdx++]; 25517ae0e2c9SDimitry Andric 25527ae0e2c9SDimitry Andric APInt Low; 25537ae0e2c9SDimitry Andric unsigned ActiveWords = 1; 25547ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 25557ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 25567ae0e2c9SDimitry Andric Low = ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 25577ae0e2c9SDimitry Andric ValueBitWidth); 25587ae0e2c9SDimitry Andric CurIdx += ActiveWords; 25597ae0e2c9SDimitry Andric 25607ae0e2c9SDimitry Andric if (!isSingleNumber) { 25617ae0e2c9SDimitry Andric ActiveWords = 1; 25627ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 25637ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 25647ae0e2c9SDimitry Andric APInt High = 25657ae0e2c9SDimitry Andric ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 25667ae0e2c9SDimitry Andric ValueBitWidth); 25677ae0e2c9SDimitry Andric CurIdx += ActiveWords; 2568f785676fSDimitry Andric 2569f785676fSDimitry Andric // FIXME: It is not clear whether values in the range should be 2570f785676fSDimitry Andric // compared as signed or unsigned values. The partially 2571f785676fSDimitry Andric // implemented changes that used this format in the past used 2572f785676fSDimitry Andric // unsigned comparisons. 2573f785676fSDimitry Andric for ( ; Low.ule(High); ++Low) 2574f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 25757ae0e2c9SDimitry Andric } else 2576f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 25777ae0e2c9SDimitry Andric } 25787ae0e2c9SDimitry Andric BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); 2579f785676fSDimitry Andric for (SmallVector<ConstantInt*, 1>::iterator cvi = CaseVals.begin(), 2580f785676fSDimitry Andric cve = CaseVals.end(); cvi != cve; ++cvi) 2581f785676fSDimitry Andric SI->addCase(*cvi, DestBB); 25827ae0e2c9SDimitry Andric } 25837ae0e2c9SDimitry Andric I = SI; 25847ae0e2c9SDimitry Andric break; 25857ae0e2c9SDimitry Andric } 25867ae0e2c9SDimitry Andric 25877ae0e2c9SDimitry Andric // Old SwitchInst format without case ranges. 25887ae0e2c9SDimitry Andric 2589f22ef01cSRoman Divacky if (Record.size() < 3 || (Record.size() & 1) == 0) 2590f785676fSDimitry Andric return Error(InvalidRecord); 25916122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 25923861d79fSDimitry Andric Value *Cond = getValue(Record, 1, NextValueNo, OpTy); 2593f22ef01cSRoman Divacky BasicBlock *Default = getBasicBlock(Record[2]); 2594f22ef01cSRoman Divacky if (OpTy == 0 || Cond == 0 || Default == 0) 2595f785676fSDimitry Andric return Error(InvalidRecord); 2596f22ef01cSRoman Divacky unsigned NumCases = (Record.size()-3)/2; 2597f22ef01cSRoman Divacky SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 2598f22ef01cSRoman Divacky InstructionList.push_back(SI); 2599f22ef01cSRoman Divacky for (unsigned i = 0, e = NumCases; i != e; ++i) { 2600f22ef01cSRoman Divacky ConstantInt *CaseVal = 2601f22ef01cSRoman Divacky dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); 2602f22ef01cSRoman Divacky BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); 2603f22ef01cSRoman Divacky if (CaseVal == 0 || DestBB == 0) { 2604f22ef01cSRoman Divacky delete SI; 2605f785676fSDimitry Andric return Error(InvalidRecord); 2606f22ef01cSRoman Divacky } 2607f22ef01cSRoman Divacky SI->addCase(CaseVal, DestBB); 2608f22ef01cSRoman Divacky } 2609f22ef01cSRoman Divacky I = SI; 2610f22ef01cSRoman Divacky break; 2611f22ef01cSRoman Divacky } 2612f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] 2613f22ef01cSRoman Divacky if (Record.size() < 2) 2614f785676fSDimitry Andric return Error(InvalidRecord); 26156122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 26163861d79fSDimitry Andric Value *Address = getValue(Record, 1, NextValueNo, OpTy); 2617f22ef01cSRoman Divacky if (OpTy == 0 || Address == 0) 2618f785676fSDimitry Andric return Error(InvalidRecord); 2619f22ef01cSRoman Divacky unsigned NumDests = Record.size()-2; 2620f22ef01cSRoman Divacky IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); 2621f22ef01cSRoman Divacky InstructionList.push_back(IBI); 2622f22ef01cSRoman Divacky for (unsigned i = 0, e = NumDests; i != e; ++i) { 2623f22ef01cSRoman Divacky if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { 2624f22ef01cSRoman Divacky IBI->addDestination(DestBB); 2625f22ef01cSRoman Divacky } else { 2626f22ef01cSRoman Divacky delete IBI; 2627f785676fSDimitry Andric return Error(InvalidRecord); 2628f22ef01cSRoman Divacky } 2629f22ef01cSRoman Divacky } 2630f22ef01cSRoman Divacky I = IBI; 2631f22ef01cSRoman Divacky break; 2632f22ef01cSRoman Divacky } 2633f22ef01cSRoman Divacky 2634f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INVOKE: { 2635f22ef01cSRoman Divacky // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] 2636f785676fSDimitry Andric if (Record.size() < 4) 2637f785676fSDimitry Andric return Error(InvalidRecord); 2638139f7f9bSDimitry Andric AttributeSet PAL = getAttributes(Record[0]); 2639f22ef01cSRoman Divacky unsigned CCInfo = Record[1]; 2640f22ef01cSRoman Divacky BasicBlock *NormalBB = getBasicBlock(Record[2]); 2641f22ef01cSRoman Divacky BasicBlock *UnwindBB = getBasicBlock(Record[3]); 2642f22ef01cSRoman Divacky 2643f22ef01cSRoman Divacky unsigned OpNum = 4; 2644f22ef01cSRoman Divacky Value *Callee; 2645f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 2646f785676fSDimitry Andric return Error(InvalidRecord); 2647f22ef01cSRoman Divacky 26486122f3e6SDimitry Andric PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); 26496122f3e6SDimitry Andric FunctionType *FTy = !CalleeTy ? 0 : 2650f22ef01cSRoman Divacky dyn_cast<FunctionType>(CalleeTy->getElementType()); 2651f22ef01cSRoman Divacky 2652f22ef01cSRoman Divacky // Check that the right number of fixed parameters are here. 2653f22ef01cSRoman Divacky if (FTy == 0 || NormalBB == 0 || UnwindBB == 0 || 2654f22ef01cSRoman Divacky Record.size() < OpNum+FTy->getNumParams()) 2655f785676fSDimitry Andric return Error(InvalidRecord); 2656f22ef01cSRoman Divacky 2657f22ef01cSRoman Divacky SmallVector<Value*, 16> Ops; 2658f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 26593861d79fSDimitry Andric Ops.push_back(getValue(Record, OpNum, NextValueNo, 26603861d79fSDimitry Andric FTy->getParamType(i))); 2661f785676fSDimitry Andric if (Ops.back() == 0) 2662f785676fSDimitry Andric return Error(InvalidRecord); 2663f22ef01cSRoman Divacky } 2664f22ef01cSRoman Divacky 2665f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 2666f22ef01cSRoman Divacky if (Record.size() != OpNum) 2667f785676fSDimitry Andric return Error(InvalidRecord); 2668f22ef01cSRoman Divacky } else { 2669f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 2670f22ef01cSRoman Divacky while (OpNum != Record.size()) { 2671f22ef01cSRoman Divacky Value *Op; 2672f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 2673f785676fSDimitry Andric return Error(InvalidRecord); 2674f22ef01cSRoman Divacky Ops.push_back(Op); 2675f22ef01cSRoman Divacky } 2676f22ef01cSRoman Divacky } 2677f22ef01cSRoman Divacky 267817a519f9SDimitry Andric I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); 2679f22ef01cSRoman Divacky InstructionList.push_back(I); 2680f22ef01cSRoman Divacky cast<InvokeInst>(I)->setCallingConv( 2681f22ef01cSRoman Divacky static_cast<CallingConv::ID>(CCInfo)); 2682f22ef01cSRoman Divacky cast<InvokeInst>(I)->setAttributes(PAL); 2683f22ef01cSRoman Divacky break; 2684f22ef01cSRoman Divacky } 26856122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] 26866122f3e6SDimitry Andric unsigned Idx = 0; 26876122f3e6SDimitry Andric Value *Val = 0; 26886122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) 2689f785676fSDimitry Andric return Error(InvalidRecord); 26906122f3e6SDimitry Andric I = ResumeInst::Create(Val); 26916122f3e6SDimitry Andric InstructionList.push_back(I); 26926122f3e6SDimitry Andric break; 26936122f3e6SDimitry Andric } 2694f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE 2695f22ef01cSRoman Divacky I = new UnreachableInst(Context); 2696f22ef01cSRoman Divacky InstructionList.push_back(I); 2697f22ef01cSRoman Divacky break; 2698f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] 2699f22ef01cSRoman Divacky if (Record.size() < 1 || ((Record.size()-1)&1)) 2700f785676fSDimitry Andric return Error(InvalidRecord); 27016122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2702f785676fSDimitry Andric if (!Ty) 2703f785676fSDimitry Andric return Error(InvalidRecord); 2704f22ef01cSRoman Divacky 27053b0f4066SDimitry Andric PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); 2706f22ef01cSRoman Divacky InstructionList.push_back(PN); 2707f22ef01cSRoman Divacky 2708f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { 27093861d79fSDimitry Andric Value *V; 27103861d79fSDimitry Andric // With the new function encoding, it is possible that operands have 27113861d79fSDimitry Andric // negative IDs (for forward references). Use a signed VBR 27123861d79fSDimitry Andric // representation to keep the encoding small. 27133861d79fSDimitry Andric if (UseRelativeIDs) 27143861d79fSDimitry Andric V = getValueSigned(Record, 1+i, NextValueNo, Ty); 27153861d79fSDimitry Andric else 27163861d79fSDimitry Andric V = getValue(Record, 1+i, NextValueNo, Ty); 2717f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[2+i]); 2718f785676fSDimitry Andric if (!V || !BB) 2719f785676fSDimitry Andric return Error(InvalidRecord); 2720f22ef01cSRoman Divacky PN->addIncoming(V, BB); 2721f22ef01cSRoman Divacky } 2722f22ef01cSRoman Divacky I = PN; 2723f22ef01cSRoman Divacky break; 2724f22ef01cSRoman Divacky } 2725f22ef01cSRoman Divacky 27266122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD: { 27276122f3e6SDimitry Andric // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] 27286122f3e6SDimitry Andric unsigned Idx = 0; 27296122f3e6SDimitry Andric if (Record.size() < 4) 2730f785676fSDimitry Andric return Error(InvalidRecord); 27316122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[Idx++]); 2732f785676fSDimitry Andric if (!Ty) 2733f785676fSDimitry Andric return Error(InvalidRecord); 27346122f3e6SDimitry Andric Value *PersFn = 0; 27356122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) 2736f785676fSDimitry Andric return Error(InvalidRecord); 27376122f3e6SDimitry Andric 27386122f3e6SDimitry Andric bool IsCleanup = !!Record[Idx++]; 27396122f3e6SDimitry Andric unsigned NumClauses = Record[Idx++]; 27406122f3e6SDimitry Andric LandingPadInst *LP = LandingPadInst::Create(Ty, PersFn, NumClauses); 27416122f3e6SDimitry Andric LP->setCleanup(IsCleanup); 27426122f3e6SDimitry Andric for (unsigned J = 0; J != NumClauses; ++J) { 27436122f3e6SDimitry Andric LandingPadInst::ClauseType CT = 27446122f3e6SDimitry Andric LandingPadInst::ClauseType(Record[Idx++]); (void)CT; 27456122f3e6SDimitry Andric Value *Val; 27466122f3e6SDimitry Andric 27476122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) { 27486122f3e6SDimitry Andric delete LP; 2749f785676fSDimitry Andric return Error(InvalidRecord); 27506122f3e6SDimitry Andric } 27516122f3e6SDimitry Andric 27526122f3e6SDimitry Andric assert((CT != LandingPadInst::Catch || 27536122f3e6SDimitry Andric !isa<ArrayType>(Val->getType())) && 27546122f3e6SDimitry Andric "Catch clause has a invalid type!"); 27556122f3e6SDimitry Andric assert((CT != LandingPadInst::Filter || 27566122f3e6SDimitry Andric isa<ArrayType>(Val->getType())) && 27576122f3e6SDimitry Andric "Filter clause has invalid type!"); 27586122f3e6SDimitry Andric LP->addClause(Val); 27596122f3e6SDimitry Andric } 27606122f3e6SDimitry Andric 27616122f3e6SDimitry Andric I = LP; 27626122f3e6SDimitry Andric InstructionList.push_back(I); 27636122f3e6SDimitry Andric break; 27646122f3e6SDimitry Andric } 27656122f3e6SDimitry Andric 276617a519f9SDimitry Andric case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] 276717a519f9SDimitry Andric if (Record.size() != 4) 2768f785676fSDimitry Andric return Error(InvalidRecord); 27696122f3e6SDimitry Andric PointerType *Ty = 2770f22ef01cSRoman Divacky dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); 27716122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 277217a519f9SDimitry Andric Value *Size = getFnValueByID(Record[2], OpTy); 277317a519f9SDimitry Andric unsigned Align = Record[3]; 2774f785676fSDimitry Andric if (!Ty || !Size) 2775f785676fSDimitry Andric return Error(InvalidRecord); 2776f22ef01cSRoman Divacky I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); 2777f22ef01cSRoman Divacky InstructionList.push_back(I); 2778f22ef01cSRoman Divacky break; 2779f22ef01cSRoman Divacky } 2780f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] 2781f22ef01cSRoman Divacky unsigned OpNum = 0; 2782f22ef01cSRoman Divacky Value *Op; 2783f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 2784f22ef01cSRoman Divacky OpNum+2 != Record.size()) 2785f785676fSDimitry Andric return Error(InvalidRecord); 2786f22ef01cSRoman Divacky 2787f22ef01cSRoman Divacky I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1); 2788f22ef01cSRoman Divacky InstructionList.push_back(I); 2789f22ef01cSRoman Divacky break; 2790f22ef01cSRoman Divacky } 27916122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LOADATOMIC: { 27926122f3e6SDimitry Andric // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] 27936122f3e6SDimitry Andric unsigned OpNum = 0; 27946122f3e6SDimitry Andric Value *Op; 27956122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 27966122f3e6SDimitry Andric OpNum+4 != Record.size()) 2797f785676fSDimitry Andric return Error(InvalidRecord); 27986122f3e6SDimitry Andric 27996122f3e6SDimitry Andric 28006122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 28016122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Release || 28026122f3e6SDimitry Andric Ordering == AcquireRelease) 2803f785676fSDimitry Andric return Error(InvalidRecord); 28046122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 2805f785676fSDimitry Andric return Error(InvalidRecord); 28066122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 28076122f3e6SDimitry Andric 28086122f3e6SDimitry Andric I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1, 28096122f3e6SDimitry Andric Ordering, SynchScope); 28106122f3e6SDimitry Andric InstructionList.push_back(I); 28116122f3e6SDimitry Andric break; 28126122f3e6SDimitry Andric } 281317a519f9SDimitry Andric case bitc::FUNC_CODE_INST_STORE: { // STORE2:[ptrty, ptr, val, align, vol] 2814f22ef01cSRoman Divacky unsigned OpNum = 0; 2815f22ef01cSRoman Divacky Value *Val, *Ptr; 2816f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 28173861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 2818f22ef01cSRoman Divacky cast<PointerType>(Ptr->getType())->getElementType(), Val) || 2819f22ef01cSRoman Divacky OpNum+2 != Record.size()) 2820f785676fSDimitry Andric return Error(InvalidRecord); 2821f22ef01cSRoman Divacky 2822f22ef01cSRoman Divacky I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); 2823f22ef01cSRoman Divacky InstructionList.push_back(I); 2824f22ef01cSRoman Divacky break; 2825f22ef01cSRoman Divacky } 28266122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC: { 28276122f3e6SDimitry Andric // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] 28286122f3e6SDimitry Andric unsigned OpNum = 0; 28296122f3e6SDimitry Andric Value *Val, *Ptr; 28306122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 28313861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 28326122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 28336122f3e6SDimitry Andric OpNum+4 != Record.size()) 2834f785676fSDimitry Andric return Error(InvalidRecord); 28356122f3e6SDimitry Andric 28366122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 28376122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Acquire || 28386122f3e6SDimitry Andric Ordering == AcquireRelease) 2839f785676fSDimitry Andric return Error(InvalidRecord); 28406122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 28416122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 2842f785676fSDimitry Andric return Error(InvalidRecord); 28436122f3e6SDimitry Andric 28446122f3e6SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1, 28456122f3e6SDimitry Andric Ordering, SynchScope); 28466122f3e6SDimitry Andric InstructionList.push_back(I); 28476122f3e6SDimitry Andric break; 28486122f3e6SDimitry Andric } 28496122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG: { 28506122f3e6SDimitry Andric // CMPXCHG:[ptrty, ptr, cmp, new, vol, ordering, synchscope] 28516122f3e6SDimitry Andric unsigned OpNum = 0; 28526122f3e6SDimitry Andric Value *Ptr, *Cmp, *New; 28536122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 28543861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 28556122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Cmp) || 28563861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 28576122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), New) || 28586122f3e6SDimitry Andric OpNum+3 != Record.size()) 2859f785676fSDimitry Andric return Error(InvalidRecord); 28606122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+1]); 28616122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 2862f785676fSDimitry Andric return Error(InvalidRecord); 28636122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); 28646122f3e6SDimitry Andric I = new AtomicCmpXchgInst(Ptr, Cmp, New, Ordering, SynchScope); 28656122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); 28666122f3e6SDimitry Andric InstructionList.push_back(I); 28676122f3e6SDimitry Andric break; 28686122f3e6SDimitry Andric } 28696122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_ATOMICRMW: { 28706122f3e6SDimitry Andric // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] 28716122f3e6SDimitry Andric unsigned OpNum = 0; 28726122f3e6SDimitry Andric Value *Ptr, *Val; 28736122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 28743861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 28756122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 28766122f3e6SDimitry Andric OpNum+4 != Record.size()) 2877f785676fSDimitry Andric return Error(InvalidRecord); 28786122f3e6SDimitry Andric AtomicRMWInst::BinOp Operation = GetDecodedRMWOperation(Record[OpNum]); 28796122f3e6SDimitry Andric if (Operation < AtomicRMWInst::FIRST_BINOP || 28806122f3e6SDimitry Andric Operation > AtomicRMWInst::LAST_BINOP) 2881f785676fSDimitry Andric return Error(InvalidRecord); 28826122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 28836122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 2884f785676fSDimitry Andric return Error(InvalidRecord); 28856122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 28866122f3e6SDimitry Andric I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); 28876122f3e6SDimitry Andric cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); 28886122f3e6SDimitry Andric InstructionList.push_back(I); 28896122f3e6SDimitry Andric break; 28906122f3e6SDimitry Andric } 28916122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] 28926122f3e6SDimitry Andric if (2 != Record.size()) 2893f785676fSDimitry Andric return Error(InvalidRecord); 28946122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[0]); 28956122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered || 28966122f3e6SDimitry Andric Ordering == Monotonic) 2897f785676fSDimitry Andric return Error(InvalidRecord); 28986122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]); 28996122f3e6SDimitry Andric I = new FenceInst(Context, Ordering, SynchScope); 29006122f3e6SDimitry Andric InstructionList.push_back(I); 29016122f3e6SDimitry Andric break; 29026122f3e6SDimitry Andric } 290317a519f9SDimitry Andric case bitc::FUNC_CODE_INST_CALL: { 2904f22ef01cSRoman Divacky // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] 2905f22ef01cSRoman Divacky if (Record.size() < 3) 2906f785676fSDimitry Andric return Error(InvalidRecord); 2907f22ef01cSRoman Divacky 2908139f7f9bSDimitry Andric AttributeSet PAL = getAttributes(Record[0]); 2909f22ef01cSRoman Divacky unsigned CCInfo = Record[1]; 2910f22ef01cSRoman Divacky 2911f22ef01cSRoman Divacky unsigned OpNum = 2; 2912f22ef01cSRoman Divacky Value *Callee; 2913f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 2914f785676fSDimitry Andric return Error(InvalidRecord); 2915f22ef01cSRoman Divacky 29166122f3e6SDimitry Andric PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); 29176122f3e6SDimitry Andric FunctionType *FTy = 0; 2918f22ef01cSRoman Divacky if (OpTy) FTy = dyn_cast<FunctionType>(OpTy->getElementType()); 2919f22ef01cSRoman Divacky if (!FTy || Record.size() < FTy->getNumParams()+OpNum) 2920f785676fSDimitry Andric return Error(InvalidRecord); 2921f22ef01cSRoman Divacky 2922f22ef01cSRoman Divacky SmallVector<Value*, 16> Args; 2923f22ef01cSRoman Divacky // Read the fixed params. 2924f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 292517a519f9SDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 2926f22ef01cSRoman Divacky Args.push_back(getBasicBlock(Record[OpNum])); 2927f22ef01cSRoman Divacky else 29283861d79fSDimitry Andric Args.push_back(getValue(Record, OpNum, NextValueNo, 29293861d79fSDimitry Andric FTy->getParamType(i))); 2930f785676fSDimitry Andric if (Args.back() == 0) 2931f785676fSDimitry Andric return Error(InvalidRecord); 2932f22ef01cSRoman Divacky } 2933f22ef01cSRoman Divacky 2934f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 2935f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 2936f22ef01cSRoman Divacky if (OpNum != Record.size()) 2937f785676fSDimitry Andric return Error(InvalidRecord); 2938f22ef01cSRoman Divacky } else { 2939f22ef01cSRoman Divacky while (OpNum != Record.size()) { 2940f22ef01cSRoman Divacky Value *Op; 2941f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 2942f785676fSDimitry Andric return Error(InvalidRecord); 2943f22ef01cSRoman Divacky Args.push_back(Op); 2944f22ef01cSRoman Divacky } 2945f22ef01cSRoman Divacky } 2946f22ef01cSRoman Divacky 294717a519f9SDimitry Andric I = CallInst::Create(Callee, Args); 2948f22ef01cSRoman Divacky InstructionList.push_back(I); 2949f22ef01cSRoman Divacky cast<CallInst>(I)->setCallingConv( 2950f22ef01cSRoman Divacky static_cast<CallingConv::ID>(CCInfo>>1)); 2951f22ef01cSRoman Divacky cast<CallInst>(I)->setTailCall(CCInfo & 1); 2952f22ef01cSRoman Divacky cast<CallInst>(I)->setAttributes(PAL); 2953f22ef01cSRoman Divacky break; 2954f22ef01cSRoman Divacky } 2955f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] 2956f22ef01cSRoman Divacky if (Record.size() < 3) 2957f785676fSDimitry Andric return Error(InvalidRecord); 29586122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 29593861d79fSDimitry Andric Value *Op = getValue(Record, 1, NextValueNo, OpTy); 29606122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[2]); 2961f22ef01cSRoman Divacky if (!OpTy || !Op || !ResTy) 2962f785676fSDimitry Andric return Error(InvalidRecord); 2963f22ef01cSRoman Divacky I = new VAArgInst(Op, ResTy); 2964f22ef01cSRoman Divacky InstructionList.push_back(I); 2965f22ef01cSRoman Divacky break; 2966f22ef01cSRoman Divacky } 2967f22ef01cSRoman Divacky } 2968f22ef01cSRoman Divacky 2969f22ef01cSRoman Divacky // Add instruction to end of current BB. If there is no current BB, reject 2970f22ef01cSRoman Divacky // this file. 2971f22ef01cSRoman Divacky if (CurBB == 0) { 2972f22ef01cSRoman Divacky delete I; 2973f785676fSDimitry Andric return Error(InvalidInstructionWithNoBB); 2974f22ef01cSRoman Divacky } 2975f22ef01cSRoman Divacky CurBB->getInstList().push_back(I); 2976f22ef01cSRoman Divacky 2977f22ef01cSRoman Divacky // If this was a terminator instruction, move to the next block. 2978f22ef01cSRoman Divacky if (isa<TerminatorInst>(I)) { 2979f22ef01cSRoman Divacky ++CurBBNo; 2980f22ef01cSRoman Divacky CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : 0; 2981f22ef01cSRoman Divacky } 2982f22ef01cSRoman Divacky 2983f22ef01cSRoman Divacky // Non-void values get registered in the value table for future use. 2984f22ef01cSRoman Divacky if (I && !I->getType()->isVoidTy()) 2985f22ef01cSRoman Divacky ValueList.AssignValue(I, NextValueNo++); 2986f22ef01cSRoman Divacky } 2987f22ef01cSRoman Divacky 2988139f7f9bSDimitry Andric OutOfRecordLoop: 2989139f7f9bSDimitry Andric 2990f22ef01cSRoman Divacky // Check the function list for unresolved values. 2991f22ef01cSRoman Divacky if (Argument *A = dyn_cast<Argument>(ValueList.back())) { 2992f22ef01cSRoman Divacky if (A->getParent() == 0) { 2993f22ef01cSRoman Divacky // We found at least one unresolved value. Nuke them all to avoid leaks. 2994f22ef01cSRoman Divacky for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ 2995e580952dSDimitry Andric if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) { 2996f22ef01cSRoman Divacky A->replaceAllUsesWith(UndefValue::get(A->getType())); 2997f22ef01cSRoman Divacky delete A; 2998f22ef01cSRoman Divacky } 2999f22ef01cSRoman Divacky } 3000f785676fSDimitry Andric return Error(NeverResolvedValueFoundInFunction); 3001f22ef01cSRoman Divacky } 3002f22ef01cSRoman Divacky } 3003f22ef01cSRoman Divacky 3004e580952dSDimitry Andric // FIXME: Check for unresolved forward-declared metadata references 3005e580952dSDimitry Andric // and clean up leaks. 3006e580952dSDimitry Andric 3007f22ef01cSRoman Divacky // See if anything took the address of blocks in this function. If so, 3008f22ef01cSRoman Divacky // resolve them now. 3009f22ef01cSRoman Divacky DenseMap<Function*, std::vector<BlockAddrRefTy> >::iterator BAFRI = 3010f22ef01cSRoman Divacky BlockAddrFwdRefs.find(F); 3011f22ef01cSRoman Divacky if (BAFRI != BlockAddrFwdRefs.end()) { 3012f22ef01cSRoman Divacky std::vector<BlockAddrRefTy> &RefList = BAFRI->second; 3013f22ef01cSRoman Divacky for (unsigned i = 0, e = RefList.size(); i != e; ++i) { 3014f22ef01cSRoman Divacky unsigned BlockIdx = RefList[i].first; 3015f22ef01cSRoman Divacky if (BlockIdx >= FunctionBBs.size()) 3016f785676fSDimitry Andric return Error(InvalidID); 3017f22ef01cSRoman Divacky 3018f22ef01cSRoman Divacky GlobalVariable *FwdRef = RefList[i].second; 3019f22ef01cSRoman Divacky FwdRef->replaceAllUsesWith(BlockAddress::get(F, FunctionBBs[BlockIdx])); 3020f22ef01cSRoman Divacky FwdRef->eraseFromParent(); 3021f22ef01cSRoman Divacky } 3022f22ef01cSRoman Divacky 3023f22ef01cSRoman Divacky BlockAddrFwdRefs.erase(BAFRI); 3024f22ef01cSRoman Divacky } 3025f22ef01cSRoman Divacky 3026f22ef01cSRoman Divacky // Trim the value list down to the size it was before we parsed this function. 3027f22ef01cSRoman Divacky ValueList.shrinkTo(ModuleValueListSize); 3028e580952dSDimitry Andric MDValueList.shrinkTo(ModuleMDValueListSize); 3029f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 3030f785676fSDimitry Andric return error_code::success(); 3031f22ef01cSRoman Divacky } 3032f22ef01cSRoman Divacky 3033f785676fSDimitry Andric /// Find the function body in the bitcode stream 3034f785676fSDimitry Andric error_code BitcodeReader::FindFunctionInStream(Function *F, 3035dff0c46cSDimitry Andric DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { 3036dff0c46cSDimitry Andric while (DeferredFunctionInfoIterator->second == 0) { 3037dff0c46cSDimitry Andric if (Stream.AtEndOfStream()) 3038f785676fSDimitry Andric return Error(CouldNotFindFunctionInStream); 3039dff0c46cSDimitry Andric // ParseModule will parse the next body in the stream and set its 3040dff0c46cSDimitry Andric // position in the DeferredFunctionInfo map. 3041f785676fSDimitry Andric if (error_code EC = ParseModule(true)) 3042f785676fSDimitry Andric return EC; 3043dff0c46cSDimitry Andric } 3044f785676fSDimitry Andric return error_code::success(); 3045dff0c46cSDimitry Andric } 3046dff0c46cSDimitry Andric 3047f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 3048f22ef01cSRoman Divacky // GVMaterializer implementation 3049f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 3050f22ef01cSRoman Divacky 3051f22ef01cSRoman Divacky 3052f22ef01cSRoman Divacky bool BitcodeReader::isMaterializable(const GlobalValue *GV) const { 3053f22ef01cSRoman Divacky if (const Function *F = dyn_cast<Function>(GV)) { 3054f22ef01cSRoman Divacky return F->isDeclaration() && 3055f22ef01cSRoman Divacky DeferredFunctionInfo.count(const_cast<Function*>(F)); 3056f22ef01cSRoman Divacky } 3057f22ef01cSRoman Divacky return false; 3058f22ef01cSRoman Divacky } 3059f22ef01cSRoman Divacky 3060f785676fSDimitry Andric error_code BitcodeReader::Materialize(GlobalValue *GV) { 3061f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 3062f22ef01cSRoman Divacky // If it's not a function or is already material, ignore the request. 3063f785676fSDimitry Andric if (!F || !F->isMaterializable()) 3064f785676fSDimitry Andric return error_code::success(); 3065f22ef01cSRoman Divacky 3066f22ef01cSRoman Divacky DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); 3067f22ef01cSRoman Divacky assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); 3068dff0c46cSDimitry Andric // If its position is recorded as 0, its body is somewhere in the stream 3069dff0c46cSDimitry Andric // but we haven't seen it yet. 3070f785676fSDimitry Andric if (DFII->second == 0 && LazyStreamer) 3071f785676fSDimitry Andric if (error_code EC = FindFunctionInStream(F, DFII)) 3072f785676fSDimitry Andric return EC; 3073f22ef01cSRoman Divacky 3074f22ef01cSRoman Divacky // Move the bit stream to the saved position of the deferred function body. 3075f22ef01cSRoman Divacky Stream.JumpToBit(DFII->second); 3076f22ef01cSRoman Divacky 3077f785676fSDimitry Andric if (error_code EC = ParseFunctionBody(F)) 3078f785676fSDimitry Andric return EC; 3079f22ef01cSRoman Divacky 3080f22ef01cSRoman Divacky // Upgrade any old intrinsic calls in the function. 3081f22ef01cSRoman Divacky for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), 3082f22ef01cSRoman Divacky E = UpgradedIntrinsics.end(); I != E; ++I) { 3083f22ef01cSRoman Divacky if (I->first != I->second) { 3084f22ef01cSRoman Divacky for (Value::use_iterator UI = I->first->use_begin(), 3085f22ef01cSRoman Divacky UE = I->first->use_end(); UI != UE; ) { 3086f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 3087f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 3088f22ef01cSRoman Divacky } 3089f22ef01cSRoman Divacky } 3090f22ef01cSRoman Divacky } 3091f22ef01cSRoman Divacky 3092f785676fSDimitry Andric return error_code::success(); 3093f22ef01cSRoman Divacky } 3094f22ef01cSRoman Divacky 3095f22ef01cSRoman Divacky bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { 3096f22ef01cSRoman Divacky const Function *F = dyn_cast<Function>(GV); 3097f22ef01cSRoman Divacky if (!F || F->isDeclaration()) 3098f22ef01cSRoman Divacky return false; 3099f22ef01cSRoman Divacky return DeferredFunctionInfo.count(const_cast<Function*>(F)); 3100f22ef01cSRoman Divacky } 3101f22ef01cSRoman Divacky 3102f22ef01cSRoman Divacky void BitcodeReader::Dematerialize(GlobalValue *GV) { 3103f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 3104f22ef01cSRoman Divacky // If this function isn't dematerializable, this is a noop. 3105f22ef01cSRoman Divacky if (!F || !isDematerializable(F)) 3106f22ef01cSRoman Divacky return; 3107f22ef01cSRoman Divacky 3108f22ef01cSRoman Divacky assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); 3109f22ef01cSRoman Divacky 3110f22ef01cSRoman Divacky // Just forget the function body, we can remat it later. 3111f22ef01cSRoman Divacky F->deleteBody(); 3112f22ef01cSRoman Divacky } 3113f22ef01cSRoman Divacky 3114f22ef01cSRoman Divacky 3115f785676fSDimitry Andric error_code BitcodeReader::MaterializeModule(Module *M) { 3116f22ef01cSRoman Divacky assert(M == TheModule && 3117f22ef01cSRoman Divacky "Can only Materialize the Module this BitcodeReader is attached to."); 3118f22ef01cSRoman Divacky // Iterate over the module, deserializing any functions that are still on 3119f22ef01cSRoman Divacky // disk. 3120f22ef01cSRoman Divacky for (Module::iterator F = TheModule->begin(), E = TheModule->end(); 3121f785676fSDimitry Andric F != E; ++F) { 3122f785676fSDimitry Andric if (F->isMaterializable()) { 3123f785676fSDimitry Andric if (error_code EC = Materialize(F)) 3124f785676fSDimitry Andric return EC; 3125f785676fSDimitry Andric } 3126f785676fSDimitry Andric } 3127dff0c46cSDimitry Andric // At this point, if there are any function bodies, the current bit is 3128dff0c46cSDimitry Andric // pointing to the END_BLOCK record after them. Now make sure the rest 3129dff0c46cSDimitry Andric // of the bits in the module have been read. 3130dff0c46cSDimitry Andric if (NextUnreadBit) 3131dff0c46cSDimitry Andric ParseModule(true); 3132dff0c46cSDimitry Andric 3133f22ef01cSRoman Divacky // Upgrade any intrinsic calls that slipped through (should not happen!) and 3134f22ef01cSRoman Divacky // delete the old functions to clean up. We can't do this unless the entire 3135f22ef01cSRoman Divacky // module is materialized because there could always be another function body 3136f22ef01cSRoman Divacky // with calls to the old function. 3137f22ef01cSRoman Divacky for (std::vector<std::pair<Function*, Function*> >::iterator I = 3138f22ef01cSRoman Divacky UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) { 3139f22ef01cSRoman Divacky if (I->first != I->second) { 3140f22ef01cSRoman Divacky for (Value::use_iterator UI = I->first->use_begin(), 3141f22ef01cSRoman Divacky UE = I->first->use_end(); UI != UE; ) { 3142f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 3143f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 3144f22ef01cSRoman Divacky } 3145f22ef01cSRoman Divacky if (!I->first->use_empty()) 3146f22ef01cSRoman Divacky I->first->replaceAllUsesWith(I->second); 3147f22ef01cSRoman Divacky I->first->eraseFromParent(); 3148f22ef01cSRoman Divacky } 3149f22ef01cSRoman Divacky } 3150f22ef01cSRoman Divacky std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); 3151f22ef01cSRoman Divacky 3152f785676fSDimitry Andric for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) 3153f785676fSDimitry Andric UpgradeInstWithTBAATag(InstsWithTBAATag[I]); 3154f785676fSDimitry Andric 3155f785676fSDimitry Andric UpgradeDebugInfo(*M); 3156f785676fSDimitry Andric return error_code::success(); 3157dff0c46cSDimitry Andric } 31586122f3e6SDimitry Andric 3159f785676fSDimitry Andric error_code BitcodeReader::InitStream() { 3160f785676fSDimitry Andric if (LazyStreamer) 3161f785676fSDimitry Andric return InitLazyStream(); 3162dff0c46cSDimitry Andric return InitStreamFromBuffer(); 3163dff0c46cSDimitry Andric } 3164dff0c46cSDimitry Andric 3165f785676fSDimitry Andric error_code BitcodeReader::InitStreamFromBuffer() { 31663861d79fSDimitry Andric const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); 3167dff0c46cSDimitry Andric const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); 3168dff0c46cSDimitry Andric 3169dff0c46cSDimitry Andric if (Buffer->getBufferSize() & 3) { 3170dff0c46cSDimitry Andric if (!isRawBitcode(BufPtr, BufEnd) && !isBitcodeWrapper(BufPtr, BufEnd)) 3171f785676fSDimitry Andric return Error(InvalidBitcodeSignature); 3172dff0c46cSDimitry Andric else 3173f785676fSDimitry Andric return Error(BitcodeStreamInvalidSize); 3174dff0c46cSDimitry Andric } 3175dff0c46cSDimitry Andric 3176dff0c46cSDimitry Andric // If we have a wrapper header, parse it and ignore the non-bc file contents. 3177dff0c46cSDimitry Andric // The magic number is 0x0B17C0DE stored in little endian. 3178dff0c46cSDimitry Andric if (isBitcodeWrapper(BufPtr, BufEnd)) 3179dff0c46cSDimitry Andric if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) 3180f785676fSDimitry Andric return Error(InvalidBitcodeWrapperHeader); 3181dff0c46cSDimitry Andric 3182dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); 3183dff0c46cSDimitry Andric Stream.init(*StreamFile); 3184f22ef01cSRoman Divacky 3185f785676fSDimitry Andric return error_code::success(); 3186f22ef01cSRoman Divacky } 3187f22ef01cSRoman Divacky 3188f785676fSDimitry Andric error_code BitcodeReader::InitLazyStream() { 3189dff0c46cSDimitry Andric // Check and strip off the bitcode wrapper; BitstreamReader expects never to 3190dff0c46cSDimitry Andric // see it. 3191dff0c46cSDimitry Andric StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); 3192dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(Bytes)); 3193dff0c46cSDimitry Andric Stream.init(*StreamFile); 3194dff0c46cSDimitry Andric 3195dff0c46cSDimitry Andric unsigned char buf[16]; 3196f785676fSDimitry Andric if (Bytes->readBytes(0, 16, buf) == -1) 3197f785676fSDimitry Andric return Error(BitcodeStreamInvalidSize); 3198dff0c46cSDimitry Andric 3199dff0c46cSDimitry Andric if (!isBitcode(buf, buf + 16)) 3200f785676fSDimitry Andric return Error(InvalidBitcodeSignature); 3201dff0c46cSDimitry Andric 3202dff0c46cSDimitry Andric if (isBitcodeWrapper(buf, buf + 4)) { 3203dff0c46cSDimitry Andric const unsigned char *bitcodeStart = buf; 3204dff0c46cSDimitry Andric const unsigned char *bitcodeEnd = buf + 16; 3205dff0c46cSDimitry Andric SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); 3206dff0c46cSDimitry Andric Bytes->dropLeadingBytes(bitcodeStart - buf); 3207dff0c46cSDimitry Andric Bytes->setKnownObjectSize(bitcodeEnd - bitcodeStart); 3208dff0c46cSDimitry Andric } 3209f785676fSDimitry Andric return error_code::success(); 3210f785676fSDimitry Andric } 3211f785676fSDimitry Andric 3212f785676fSDimitry Andric namespace { 3213f785676fSDimitry Andric class BitcodeErrorCategoryType : public _do_message { 3214f785676fSDimitry Andric const char *name() const LLVM_OVERRIDE { 3215f785676fSDimitry Andric return "llvm.bitcode"; 3216f785676fSDimitry Andric } 3217f785676fSDimitry Andric std::string message(int IE) const LLVM_OVERRIDE { 3218f785676fSDimitry Andric BitcodeReader::ErrorType E = static_cast<BitcodeReader::ErrorType>(IE); 3219f785676fSDimitry Andric switch (E) { 3220f785676fSDimitry Andric case BitcodeReader::BitcodeStreamInvalidSize: 3221f785676fSDimitry Andric return "Bitcode stream length should be >= 16 bytes and a multiple of 4"; 3222f785676fSDimitry Andric case BitcodeReader::ConflictingMETADATA_KINDRecords: 3223f785676fSDimitry Andric return "Conflicting METADATA_KIND records"; 3224f785676fSDimitry Andric case BitcodeReader::CouldNotFindFunctionInStream: 3225f785676fSDimitry Andric return "Could not find function in stream"; 3226f785676fSDimitry Andric case BitcodeReader::ExpectedConstant: 3227f785676fSDimitry Andric return "Expected a constant"; 3228f785676fSDimitry Andric case BitcodeReader::InsufficientFunctionProtos: 3229f785676fSDimitry Andric return "Insufficient function protos"; 3230f785676fSDimitry Andric case BitcodeReader::InvalidBitcodeSignature: 3231f785676fSDimitry Andric return "Invalid bitcode signature"; 3232f785676fSDimitry Andric case BitcodeReader::InvalidBitcodeWrapperHeader: 3233f785676fSDimitry Andric return "Invalid bitcode wrapper header"; 3234f785676fSDimitry Andric case BitcodeReader::InvalidConstantReference: 3235f785676fSDimitry Andric return "Invalid ronstant reference"; 3236f785676fSDimitry Andric case BitcodeReader::InvalidID: 3237f785676fSDimitry Andric return "Invalid ID"; 3238f785676fSDimitry Andric case BitcodeReader::InvalidInstructionWithNoBB: 3239f785676fSDimitry Andric return "Invalid instruction with no BB"; 3240f785676fSDimitry Andric case BitcodeReader::InvalidRecord: 3241f785676fSDimitry Andric return "Invalid record"; 3242f785676fSDimitry Andric case BitcodeReader::InvalidTypeForValue: 3243f785676fSDimitry Andric return "Invalid type for value"; 3244f785676fSDimitry Andric case BitcodeReader::InvalidTYPETable: 3245f785676fSDimitry Andric return "Invalid TYPE table"; 3246f785676fSDimitry Andric case BitcodeReader::InvalidType: 3247f785676fSDimitry Andric return "Invalid type"; 3248f785676fSDimitry Andric case BitcodeReader::MalformedBlock: 3249f785676fSDimitry Andric return "Malformed block"; 3250f785676fSDimitry Andric case BitcodeReader::MalformedGlobalInitializerSet: 3251f785676fSDimitry Andric return "Malformed global initializer set"; 3252f785676fSDimitry Andric case BitcodeReader::InvalidMultipleBlocks: 3253f785676fSDimitry Andric return "Invalid multiple blocks"; 3254f785676fSDimitry Andric case BitcodeReader::NeverResolvedValueFoundInFunction: 3255f785676fSDimitry Andric return "Never resolved value found in function"; 3256f785676fSDimitry Andric case BitcodeReader::InvalidValue: 3257f785676fSDimitry Andric return "Invalid value"; 3258f785676fSDimitry Andric } 3259f785676fSDimitry Andric llvm_unreachable("Unknown error type!"); 3260f785676fSDimitry Andric } 3261f785676fSDimitry Andric }; 3262f785676fSDimitry Andric } 3263f785676fSDimitry Andric 3264f785676fSDimitry Andric const error_category &BitcodeReader::BitcodeErrorCategory() { 3265f785676fSDimitry Andric static BitcodeErrorCategoryType O; 3266f785676fSDimitry Andric return O; 3267dff0c46cSDimitry Andric } 3268f22ef01cSRoman Divacky 3269f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 3270f22ef01cSRoman Divacky // External interface 3271f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 3272f22ef01cSRoman Divacky 3273f22ef01cSRoman Divacky /// getLazyBitcodeModule - lazy function-at-a-time loading from a file. 3274f22ef01cSRoman Divacky /// 3275f22ef01cSRoman Divacky Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, 3276f22ef01cSRoman Divacky LLVMContext& Context, 3277f22ef01cSRoman Divacky std::string *ErrMsg) { 3278f22ef01cSRoman Divacky Module *M = new Module(Buffer->getBufferIdentifier(), Context); 3279f22ef01cSRoman Divacky BitcodeReader *R = new BitcodeReader(Buffer, Context); 3280f22ef01cSRoman Divacky M->setMaterializer(R); 3281f785676fSDimitry Andric if (error_code EC = R->ParseBitcodeInto(M)) { 3282f22ef01cSRoman Divacky if (ErrMsg) 3283f785676fSDimitry Andric *ErrMsg = EC.message(); 3284f22ef01cSRoman Divacky 3285f22ef01cSRoman Divacky delete M; // Also deletes R. 3286f22ef01cSRoman Divacky return 0; 3287f22ef01cSRoman Divacky } 3288f22ef01cSRoman Divacky // Have the BitcodeReader dtor delete 'Buffer'. 3289f22ef01cSRoman Divacky R->setBufferOwned(true); 3290dff0c46cSDimitry Andric 3291dff0c46cSDimitry Andric R->materializeForwardReferencedFunctions(); 3292dff0c46cSDimitry Andric 3293dff0c46cSDimitry Andric return M; 3294dff0c46cSDimitry Andric } 3295dff0c46cSDimitry Andric 3296dff0c46cSDimitry Andric 3297dff0c46cSDimitry Andric Module *llvm::getStreamedBitcodeModule(const std::string &name, 3298dff0c46cSDimitry Andric DataStreamer *streamer, 3299dff0c46cSDimitry Andric LLVMContext &Context, 3300dff0c46cSDimitry Andric std::string *ErrMsg) { 3301dff0c46cSDimitry Andric Module *M = new Module(name, Context); 3302dff0c46cSDimitry Andric BitcodeReader *R = new BitcodeReader(streamer, Context); 3303dff0c46cSDimitry Andric M->setMaterializer(R); 3304f785676fSDimitry Andric if (error_code EC = R->ParseBitcodeInto(M)) { 3305dff0c46cSDimitry Andric if (ErrMsg) 3306f785676fSDimitry Andric *ErrMsg = EC.message(); 3307dff0c46cSDimitry Andric delete M; // Also deletes R. 3308dff0c46cSDimitry Andric return 0; 3309dff0c46cSDimitry Andric } 3310dff0c46cSDimitry Andric R->setBufferOwned(false); // no buffer to delete 3311f22ef01cSRoman Divacky return M; 3312f22ef01cSRoman Divacky } 3313f22ef01cSRoman Divacky 3314f22ef01cSRoman Divacky /// ParseBitcodeFile - Read the specified bitcode file, returning the module. 3315f22ef01cSRoman Divacky /// If an error occurs, return null and fill in *ErrMsg if non-null. 3316f22ef01cSRoman Divacky Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, 3317f22ef01cSRoman Divacky std::string *ErrMsg){ 3318f22ef01cSRoman Divacky Module *M = getLazyBitcodeModule(Buffer, Context, ErrMsg); 3319f22ef01cSRoman Divacky if (!M) return 0; 3320f22ef01cSRoman Divacky 3321f22ef01cSRoman Divacky // Don't let the BitcodeReader dtor delete 'Buffer', regardless of whether 3322f22ef01cSRoman Divacky // there was an error. 3323f22ef01cSRoman Divacky static_cast<BitcodeReader*>(M->getMaterializer())->setBufferOwned(false); 3324f22ef01cSRoman Divacky 3325f22ef01cSRoman Divacky // Read in the entire module, and destroy the BitcodeReader. 3326f22ef01cSRoman Divacky if (M->MaterializeAllPermanently(ErrMsg)) { 3327f22ef01cSRoman Divacky delete M; 33282754fe60SDimitry Andric return 0; 3329f22ef01cSRoman Divacky } 33302754fe60SDimitry Andric 3331dff0c46cSDimitry Andric // TODO: Restore the use-lists to the in-memory state when the bitcode was 3332dff0c46cSDimitry Andric // written. We must defer until the Module has been fully materialized. 3333dff0c46cSDimitry Andric 3334f22ef01cSRoman Divacky return M; 3335f22ef01cSRoman Divacky } 33362754fe60SDimitry Andric 33372754fe60SDimitry Andric std::string llvm::getBitcodeTargetTriple(MemoryBuffer *Buffer, 33382754fe60SDimitry Andric LLVMContext& Context, 33392754fe60SDimitry Andric std::string *ErrMsg) { 33402754fe60SDimitry Andric BitcodeReader *R = new BitcodeReader(Buffer, Context); 33412754fe60SDimitry Andric // Don't let the BitcodeReader dtor delete 'Buffer'. 33422754fe60SDimitry Andric R->setBufferOwned(false); 33432754fe60SDimitry Andric 33442754fe60SDimitry Andric std::string Triple(""); 3345f785676fSDimitry Andric if (error_code EC = R->ParseTriple(Triple)) 33462754fe60SDimitry Andric if (ErrMsg) 3347f785676fSDimitry Andric *ErrMsg = EC.message(); 33482754fe60SDimitry Andric 33492754fe60SDimitry Andric delete R; 33502754fe60SDimitry Andric return Triple; 33512754fe60SDimitry Andric } 3352