| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1 | //===- BitcodeReader.cpp - Internal BitcodeReader implementation ----------===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This header defines the BitcodeReader class. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 14 | #include "llvm/Bitcode/ReaderWriter.h" | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 15 | #include "BitcodeReader.h" | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 16 | #include "llvm/Constants.h" | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 17 | #include "llvm/DerivedTypes.h" | 
| Chris Lattner | 2bce93a | 2007-05-06 01:58:20 +0000 | [diff] [blame] | 18 | #include "llvm/InlineAsm.h" | 
| Devang Patel | e4b2756 | 2009-08-28 23:24:31 +0000 | [diff] [blame] | 19 | #include "llvm/IntrinsicInst.h" | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 20 | #include "llvm/Module.h" | 
| Dan Gohman | 1224c38 | 2009-07-20 21:19:07 +0000 | [diff] [blame] | 21 | #include "llvm/Operator.h" | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 22 | #include "llvm/AutoUpgrade.h" | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 23 | #include "llvm/ADT/SmallString.h" | 
| Devang Patel | f4511cd | 2008-02-26 19:38:17 +0000 | [diff] [blame] | 24 | #include "llvm/ADT/SmallVector.h" | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 25 | #include "llvm/Support/MathExtras.h" | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 26 | #include "llvm/Support/MemoryBuffer.h" | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 27 | #include "llvm/OperandTraits.h" | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 28 | using namespace llvm; | 
 | 29 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 30 | void BitcodeReader::FreeState() { | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 31 |   if (BufferOwned) | 
 | 32 |     delete Buffer; | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 33 |   Buffer = 0; | 
 | 34 |   std::vector<PATypeHolder>().swap(TypeList); | 
 | 35 |   ValueList.clear(); | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 36 |   MDValueList.clear(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 37 |  | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 38 |   std::vector<AttrListPtr>().swap(MAttributes); | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 39 |   std::vector<BasicBlock*>().swap(FunctionBBs); | 
 | 40 |   std::vector<Function*>().swap(FunctionsWithBodies); | 
 | 41 |   DeferredFunctionInfo.clear(); | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 42 | } | 
 | 43 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 44 | //===----------------------------------------------------------------------===// | 
 | 45 | //  Helper functions to implement forward reference resolution, etc. | 
 | 46 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 47 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 48 | /// ConvertToString - Convert a string from a record into an std::string, return | 
 | 49 | /// true on failure. | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 50 | template<typename StrTy> | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 51 | static bool ConvertToString(SmallVector<uint64_t, 64> &Record, unsigned Idx, | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 52 |                             StrTy &Result) { | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 53 |   if (Idx > Record.size()) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 54 |     return true; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 55 |  | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 56 |   for (unsigned i = Idx, e = Record.size(); i != e; ++i) | 
 | 57 |     Result += (char)Record[i]; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 58 |   return false; | 
 | 59 | } | 
 | 60 |  | 
 | 61 | static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) { | 
 | 62 |   switch (Val) { | 
 | 63 |   default: // Map unknown/new linkages to external | 
| Bill Wendling | 3d10a5a | 2009-07-20 01:03:30 +0000 | [diff] [blame] | 64 |   case 0:  return GlobalValue::ExternalLinkage; | 
 | 65 |   case 1:  return GlobalValue::WeakAnyLinkage; | 
 | 66 |   case 2:  return GlobalValue::AppendingLinkage; | 
 | 67 |   case 3:  return GlobalValue::InternalLinkage; | 
 | 68 |   case 4:  return GlobalValue::LinkOnceAnyLinkage; | 
 | 69 |   case 5:  return GlobalValue::DLLImportLinkage; | 
 | 70 |   case 6:  return GlobalValue::DLLExportLinkage; | 
 | 71 |   case 7:  return GlobalValue::ExternalWeakLinkage; | 
 | 72 |   case 8:  return GlobalValue::CommonLinkage; | 
 | 73 |   case 9:  return GlobalValue::PrivateLinkage; | 
| Duncan Sands | 667d4b8 | 2009-03-07 15:45:40 +0000 | [diff] [blame] | 74 |   case 10: return GlobalValue::WeakODRLinkage; | 
 | 75 |   case 11: return GlobalValue::LinkOnceODRLinkage; | 
| Chris Lattner | 266c7bb | 2009-04-13 05:44:34 +0000 | [diff] [blame] | 76 |   case 12: return GlobalValue::AvailableExternallyLinkage; | 
| Bill Wendling | 3d10a5a | 2009-07-20 01:03:30 +0000 | [diff] [blame] | 77 |   case 13: return GlobalValue::LinkerPrivateLinkage; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 78 |   } | 
 | 79 | } | 
 | 80 |  | 
 | 81 | static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) { | 
 | 82 |   switch (Val) { | 
 | 83 |   default: // Map unknown visibilities to default. | 
 | 84 |   case 0: return GlobalValue::DefaultVisibility; | 
 | 85 |   case 1: return GlobalValue::HiddenVisibility; | 
| Anton Korobeynikov | 9cd3ccf | 2007-04-29 20:56:48 +0000 | [diff] [blame] | 86 |   case 2: return GlobalValue::ProtectedVisibility; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 87 |   } | 
 | 88 | } | 
 | 89 |  | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 90 | static int GetDecodedCastOpcode(unsigned Val) { | 
 | 91 |   switch (Val) { | 
 | 92 |   default: return -1; | 
 | 93 |   case bitc::CAST_TRUNC   : return Instruction::Trunc; | 
 | 94 |   case bitc::CAST_ZEXT    : return Instruction::ZExt; | 
 | 95 |   case bitc::CAST_SEXT    : return Instruction::SExt; | 
 | 96 |   case bitc::CAST_FPTOUI  : return Instruction::FPToUI; | 
 | 97 |   case bitc::CAST_FPTOSI  : return Instruction::FPToSI; | 
 | 98 |   case bitc::CAST_UITOFP  : return Instruction::UIToFP; | 
 | 99 |   case bitc::CAST_SITOFP  : return Instruction::SIToFP; | 
 | 100 |   case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; | 
 | 101 |   case bitc::CAST_FPEXT   : return Instruction::FPExt; | 
 | 102 |   case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; | 
 | 103 |   case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; | 
 | 104 |   case bitc::CAST_BITCAST : return Instruction::BitCast; | 
 | 105 |   } | 
 | 106 | } | 
 | 107 | static int GetDecodedBinaryOpcode(unsigned Val, const Type *Ty) { | 
 | 108 |   switch (Val) { | 
 | 109 |   default: return -1; | 
| Dan Gohman | ae3a0be | 2009-06-04 22:49:04 +0000 | [diff] [blame] | 110 |   case bitc::BINOP_ADD: | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 111 |     return Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; | 
| Dan Gohman | ae3a0be | 2009-06-04 22:49:04 +0000 | [diff] [blame] | 112 |   case bitc::BINOP_SUB: | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 113 |     return Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; | 
| Dan Gohman | ae3a0be | 2009-06-04 22:49:04 +0000 | [diff] [blame] | 114 |   case bitc::BINOP_MUL: | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 115 |     return Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 116 |   case bitc::BINOP_UDIV: return Instruction::UDiv; | 
 | 117 |   case bitc::BINOP_SDIV: | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 118 |     return Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 119 |   case bitc::BINOP_UREM: return Instruction::URem; | 
 | 120 |   case bitc::BINOP_SREM: | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 121 |     return Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 122 |   case bitc::BINOP_SHL:  return Instruction::Shl; | 
 | 123 |   case bitc::BINOP_LSHR: return Instruction::LShr; | 
 | 124 |   case bitc::BINOP_ASHR: return Instruction::AShr; | 
 | 125 |   case bitc::BINOP_AND:  return Instruction::And; | 
 | 126 |   case bitc::BINOP_OR:   return Instruction::Or; | 
 | 127 |   case bitc::BINOP_XOR:  return Instruction::Xor; | 
 | 128 |   } | 
 | 129 | } | 
 | 130 |  | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 131 | namespace llvm { | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 132 | namespace { | 
 | 133 |   /// @brief A class for maintaining the slot number definition | 
 | 134 |   /// as a placeholder for the actual definition for forward constants defs. | 
 | 135 |   class ConstantPlaceHolder : public ConstantExpr { | 
 | 136 |     ConstantPlaceHolder();                       // DO NOT IMPLEMENT | 
 | 137 |     void operator=(const ConstantPlaceHolder &); // DO NOT IMPLEMENT | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 138 |   public: | 
 | 139 |     // allocate space for exactly one operand | 
 | 140 |     void *operator new(size_t s) { | 
 | 141 |       return User::operator new(s, 1); | 
 | 142 |     } | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 143 |     explicit ConstantPlaceHolder(const Type *Ty, LLVMContext& Context) | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 144 |       : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 145 |       Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 146 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 147 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 148 |     /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. | 
 | 149 |     static inline bool classof(const ConstantPlaceHolder *) { return true; } | 
 | 150 |     static bool classof(const Value *V) { | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 151 |       return isa<ConstantExpr>(V) && | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 152 |              cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; | 
 | 153 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 154 |  | 
 | 155 |  | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 156 |     /// Provide fast operand accessors | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 157 |     //DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 158 |   }; | 
 | 159 | } | 
 | 160 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 161 | // FIXME: can we inherit this from ConstantExpr? | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 162 | template <> | 
| Duncan Sands | 59bf4fc | 2009-09-06 08:55:57 +0000 | [diff] [blame] | 163 | struct OperandTraits<ConstantPlaceHolder> : public FixedNumOperandTraits<1> { | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 164 | }; | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 165 | } | 
 | 166 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 167 |  | 
 | 168 | void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { | 
 | 169 |   if (Idx == size()) { | 
 | 170 |     push_back(V); | 
 | 171 |     return; | 
 | 172 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 173 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 174 |   if (Idx >= size()) | 
 | 175 |     resize(Idx+1); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 176 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 177 |   WeakVH &OldV = ValuePtrs[Idx]; | 
 | 178 |   if (OldV == 0) { | 
 | 179 |     OldV = V; | 
 | 180 |     return; | 
 | 181 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 182 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 183 |   // Handle constants and non-constants (e.g. instrs) differently for | 
 | 184 |   // efficiency. | 
 | 185 |   if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { | 
 | 186 |     ResolveConstants.push_back(std::make_pair(PHC, Idx)); | 
 | 187 |     OldV = V; | 
 | 188 |   } else { | 
 | 189 |     // If there was a forward reference to this value, replace it. | 
 | 190 |     Value *PrevVal = OldV; | 
 | 191 |     OldV->replaceAllUsesWith(V); | 
 | 192 |     delete PrevVal; | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 193 |   } | 
 | 194 | } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 195 |  | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 196 |  | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 197 | Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, | 
 | 198 |                                                     const Type *Ty) { | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 199 |   if (Idx >= size()) | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 200 |     resize(Idx + 1); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 201 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 202 |   if (Value *V = ValuePtrs[Idx]) { | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 203 |     assert(Ty == V->getType() && "Type mismatch in constant table!"); | 
 | 204 |     return cast<Constant>(V); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 205 |   } | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 206 |  | 
 | 207 |   // Create and return a placeholder, which will later be RAUW'd. | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 208 |   Constant *C = new ConstantPlaceHolder(Ty, Context); | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 209 |   ValuePtrs[Idx] = C; | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 210 |   return C; | 
 | 211 | } | 
 | 212 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 213 | Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, const Type *Ty) { | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 214 |   if (Idx >= size()) | 
| Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 215 |     resize(Idx + 1); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 216 |  | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 217 |   if (Value *V = ValuePtrs[Idx]) { | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 218 |     assert((Ty == 0 || Ty == V->getType()) && "Type mismatch in value table!"); | 
 | 219 |     return V; | 
 | 220 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 221 |  | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 222 |   // No type specified, must be invalid reference. | 
 | 223 |   if (Ty == 0) return 0; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 224 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 225 |   // Create and return a placeholder, which will later be RAUW'd. | 
 | 226 |   Value *V = new Argument(Ty); | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 227 |   ValuePtrs[Idx] = V; | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 228 |   return V; | 
 | 229 | } | 
 | 230 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 231 | /// ResolveConstantForwardRefs - Once all constants are read, this method bulk | 
 | 232 | /// resolves any forward references.  The idea behind this is that we sometimes | 
 | 233 | /// get constants (such as large arrays) which reference *many* forward ref | 
 | 234 | /// constants.  Replacing each of these causes a lot of thrashing when | 
 | 235 | /// building/reuniquing the constant.  Instead of doing this, we look at all the | 
 | 236 | /// uses and rewrite all the place holders at once for any constant that uses | 
 | 237 | /// a placeholder. | 
 | 238 | void BitcodeReaderValueList::ResolveConstantForwardRefs() { | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 239 |   // Sort the values by-pointer so that they are efficient to look up with a | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 240 |   // binary search. | 
 | 241 |   std::sort(ResolveConstants.begin(), ResolveConstants.end()); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 242 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 243 |   SmallVector<Constant*, 64> NewOps; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 244 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 245 |   while (!ResolveConstants.empty()) { | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 246 |     Value *RealVal = operator[](ResolveConstants.back().second); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 247 |     Constant *Placeholder = ResolveConstants.back().first; | 
 | 248 |     ResolveConstants.pop_back(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 249 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 250 |     // Loop over all users of the placeholder, updating them to reference the | 
 | 251 |     // new value.  If they reference more than one placeholder, update them all | 
 | 252 |     // at once. | 
 | 253 |     while (!Placeholder->use_empty()) { | 
| Chris Lattner | b6135a0 | 2008-08-21 17:31:45 +0000 | [diff] [blame] | 254 |       Value::use_iterator UI = Placeholder->use_begin(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 255 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 256 |       // If the using object isn't uniqued, just update the operands.  This | 
 | 257 |       // handles instructions and initializers for global variables. | 
| Chris Lattner | b6135a0 | 2008-08-21 17:31:45 +0000 | [diff] [blame] | 258 |       if (!isa<Constant>(*UI) || isa<GlobalValue>(*UI)) { | 
 | 259 |         UI.getUse().set(RealVal); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 260 |         continue; | 
 | 261 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 262 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 263 |       // Otherwise, we have a constant that uses the placeholder.  Replace that | 
 | 264 |       // constant with a new constant that has *all* placeholder uses updated. | 
| Chris Lattner | b6135a0 | 2008-08-21 17:31:45 +0000 | [diff] [blame] | 265 |       Constant *UserC = cast<Constant>(*UI); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 266 |       for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); | 
 | 267 |            I != E; ++I) { | 
 | 268 |         Value *NewOp; | 
 | 269 |         if (!isa<ConstantPlaceHolder>(*I)) { | 
 | 270 |           // Not a placeholder reference. | 
 | 271 |           NewOp = *I; | 
 | 272 |         } else if (*I == Placeholder) { | 
 | 273 |           // Common case is that it just references this one placeholder. | 
 | 274 |           NewOp = RealVal; | 
 | 275 |         } else { | 
 | 276 |           // Otherwise, look up the placeholder in ResolveConstants. | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 277 |           ResolveConstantsTy::iterator It = | 
 | 278 |             std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 279 |                              std::pair<Constant*, unsigned>(cast<Constant>(*I), | 
 | 280 |                                                             0)); | 
 | 281 |           assert(It != ResolveConstants.end() && It->first == *I); | 
| Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 282 |           NewOp = operator[](It->second); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 283 |         } | 
 | 284 |  | 
 | 285 |         NewOps.push_back(cast<Constant>(NewOp)); | 
 | 286 |       } | 
 | 287 |  | 
 | 288 |       // Make the new constant. | 
 | 289 |       Constant *NewC; | 
 | 290 |       if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { | 
| Owen Anderson | 1fd7096 | 2009-07-28 18:32:17 +0000 | [diff] [blame] | 291 |         NewC = ConstantArray::get(UserCA->getType(), &NewOps[0], | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 292 |                                         NewOps.size()); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 293 |       } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { | 
| Owen Anderson | d7f2a6c | 2009-08-05 23:16:16 +0000 | [diff] [blame] | 294 |         NewC = ConstantStruct::get(Context, &NewOps[0], NewOps.size(), | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 295 |                                          UserCS->getType()->isPacked()); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 296 |       } else if (isa<ConstantVector>(UserC)) { | 
| Owen Anderson | af7ec97 | 2009-07-28 21:19:26 +0000 | [diff] [blame] | 297 |         NewC = ConstantVector::get(&NewOps[0], NewOps.size()); | 
| Nick Lewycky | cb33799 | 2009-05-10 20:57:05 +0000 | [diff] [blame] | 298 |       } else { | 
 | 299 |         assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 300 |         NewC = cast<ConstantExpr>(UserC)->getWithOperands(&NewOps[0], | 
 | 301 |                                                           NewOps.size()); | 
 | 302 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 303 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 304 |       UserC->replaceAllUsesWith(NewC); | 
 | 305 |       UserC->destroyConstant(); | 
 | 306 |       NewOps.clear(); | 
 | 307 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 308 |  | 
| Nick Lewycky | cb33799 | 2009-05-10 20:57:05 +0000 | [diff] [blame] | 309 |     // Update all ValueHandles, they should be the only users at this point. | 
 | 310 |     Placeholder->replaceAllUsesWith(RealVal); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 311 |     delete Placeholder; | 
 | 312 |   } | 
 | 313 | } | 
 | 314 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 315 | void BitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) { | 
 | 316 |   if (Idx == size()) { | 
 | 317 |     push_back(V); | 
 | 318 |     return; | 
 | 319 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 320 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 321 |   if (Idx >= size()) | 
 | 322 |     resize(Idx+1); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 323 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 324 |   WeakVH &OldV = MDValuePtrs[Idx]; | 
 | 325 |   if (OldV == 0) { | 
 | 326 |     OldV = V; | 
 | 327 |     return; | 
 | 328 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 329 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 330 |   // If there was a forward reference to this value, replace it. | 
 | 331 |   Value *PrevVal = OldV; | 
 | 332 |   OldV->replaceAllUsesWith(V); | 
 | 333 |   delete PrevVal; | 
| Devang Patel | c0ff8c8 | 2009-09-03 01:38:02 +0000 | [diff] [blame] | 334 |   // Deleting PrevVal sets Idx value in MDValuePtrs to null. Set new | 
 | 335 |   // value for Idx. | 
 | 336 |   MDValuePtrs[Idx] = V; | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 337 | } | 
 | 338 |  | 
 | 339 | Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { | 
 | 340 |   if (Idx >= size()) | 
 | 341 |     resize(Idx + 1); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 342 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 343 |   if (Value *V = MDValuePtrs[Idx]) { | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 344 |     assert(V->getType()->isMetadataTy() && "Type mismatch in value table!"); | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 345 |     return V; | 
 | 346 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 347 |  | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 348 |   // Create and return a placeholder, which will later be RAUW'd. | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 349 |   Value *V = new Argument(Type::getMetadataTy(Context)); | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 350 |   MDValuePtrs[Idx] = V; | 
 | 351 |   return V; | 
 | 352 | } | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 353 |  | 
 | 354 | const Type *BitcodeReader::getTypeByID(unsigned ID, bool isTypeTable) { | 
 | 355 |   // If the TypeID is in range, return it. | 
 | 356 |   if (ID < TypeList.size()) | 
 | 357 |     return TypeList[ID].get(); | 
 | 358 |   if (!isTypeTable) return 0; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 359 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 360 |   // The type table allows forward references.  Push as many Opaque types as | 
 | 361 |   // needed to get up to ID. | 
 | 362 |   while (TypeList.size() <= ID) | 
| Owen Anderson | 0e275dc | 2009-08-13 23:27:32 +0000 | [diff] [blame] | 363 |     TypeList.push_back(OpaqueType::get(Context)); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 364 |   return TypeList.back().get(); | 
 | 365 | } | 
 | 366 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 367 | //===----------------------------------------------------------------------===// | 
 | 368 | //  Functions for parsing blocks from the bitcode file | 
 | 369 | //===----------------------------------------------------------------------===// | 
 | 370 |  | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 371 | bool BitcodeReader::ParseAttributeBlock() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 372 |   if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 373 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 374 |  | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 375 |   if (!MAttributes.empty()) | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 376 |     return Error("Multiple PARAMATTR blocks found!"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 377 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 378 |   SmallVector<uint64_t, 64> Record; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 379 |  | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 380 |   SmallVector<AttributeWithIndex, 8> Attrs; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 381 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 382 |   // Read all the records. | 
 | 383 |   while (1) { | 
 | 384 |     unsigned Code = Stream.ReadCode(); | 
 | 385 |     if (Code == bitc::END_BLOCK) { | 
 | 386 |       if (Stream.ReadBlockEnd()) | 
 | 387 |         return Error("Error at end of PARAMATTR block"); | 
 | 388 |       return false; | 
 | 389 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 390 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 391 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 392 |       // No known subblocks, always skip them. | 
 | 393 |       Stream.ReadSubBlockID(); | 
 | 394 |       if (Stream.SkipBlock()) | 
 | 395 |         return Error("Malformed block record"); | 
 | 396 |       continue; | 
 | 397 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 398 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 399 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 400 |       Stream.ReadAbbrevRecord(); | 
 | 401 |       continue; | 
 | 402 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 403 |  | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 404 |     // Read a record. | 
 | 405 |     Record.clear(); | 
 | 406 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 407 |     default:  // Default behavior: ignore. | 
 | 408 |       break; | 
 | 409 |     case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [paramidx0, attr0, ...] | 
 | 410 |       if (Record.size() & 1) | 
 | 411 |         return Error("Invalid ENTRY record"); | 
 | 412 |  | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 413 |       // FIXME : Remove this autoupgrade code in LLVM 3.0. | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 414 |       // If Function attributes are using index 0 then transfer them | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 415 |       // to index ~0. Index 0 is used for return value attributes but used to be | 
 | 416 |       // used for function attributes. | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 417 |       Attributes RetAttribute = Attribute::None; | 
 | 418 |       Attributes FnAttribute = Attribute::None; | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 419 |       for (unsigned i = 0, e = Record.size(); i != e; i += 2) { | 
| Nick Lewycky | 73ddd4f | 2008-12-19 09:38:31 +0000 | [diff] [blame] | 420 |         // FIXME: remove in LLVM 3.0 | 
 | 421 |         // The alignment is stored as a 16-bit raw value from bits 31--16. | 
 | 422 |         // We shift the bits above 31 down by 11 bits. | 
 | 423 |  | 
 | 424 |         unsigned Alignment = (Record[i+1] & (0xffffull << 16)) >> 16; | 
 | 425 |         if (Alignment && !isPowerOf2_32(Alignment)) | 
 | 426 |           return Error("Alignment is not a power of two."); | 
 | 427 |  | 
 | 428 |         Attributes ReconstitutedAttr = Record[i+1] & 0xffff; | 
 | 429 |         if (Alignment) | 
 | 430 |           ReconstitutedAttr |= Attribute::constructAlignmentFromInt(Alignment); | 
 | 431 |         ReconstitutedAttr |= (Record[i+1] & (0xffffull << 32)) >> 11; | 
 | 432 |         Record[i+1] = ReconstitutedAttr; | 
 | 433 |  | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 434 |         if (Record[i] == 0) | 
 | 435 |           RetAttribute = Record[i+1]; | 
 | 436 |         else if (Record[i] == ~0U) | 
 | 437 |           FnAttribute = Record[i+1]; | 
 | 438 |       } | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 439 |  | 
 | 440 |       unsigned OldRetAttrs = (Attribute::NoUnwind|Attribute::NoReturn| | 
 | 441 |                               Attribute::ReadOnly|Attribute::ReadNone); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 442 |  | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 443 |       if (FnAttribute == Attribute::None && RetAttribute != Attribute::None && | 
 | 444 |           (RetAttribute & OldRetAttrs) != 0) { | 
 | 445 |         if (FnAttribute == Attribute::None) { // add a slot so they get added. | 
 | 446 |           Record.push_back(~0U); | 
 | 447 |           Record.push_back(0); | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 448 |         } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 449 |  | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 450 |         FnAttribute  |= RetAttribute & OldRetAttrs; | 
 | 451 |         RetAttribute &= ~OldRetAttrs; | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 452 |       } | 
| Chris Lattner | 461edd9 | 2008-03-12 02:25:52 +0000 | [diff] [blame] | 453 |  | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 454 |       for (unsigned i = 0, e = Record.size(); i != e; i += 2) { | 
| Chris Lattner | 9a6cb15 | 2008-10-05 18:22:09 +0000 | [diff] [blame] | 455 |         if (Record[i] == 0) { | 
 | 456 |           if (RetAttribute != Attribute::None) | 
 | 457 |             Attrs.push_back(AttributeWithIndex::get(0, RetAttribute)); | 
 | 458 |         } else if (Record[i] == ~0U) { | 
 | 459 |           if (FnAttribute != Attribute::None) | 
 | 460 |             Attrs.push_back(AttributeWithIndex::get(~0U, FnAttribute)); | 
 | 461 |         } else if (Record[i+1] != Attribute::None) | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 462 |           Attrs.push_back(AttributeWithIndex::get(Record[i], Record[i+1])); | 
 | 463 |       } | 
| Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 464 |  | 
 | 465 |       MAttributes.push_back(AttrListPtr::get(Attrs.begin(), Attrs.end())); | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 466 |       Attrs.clear(); | 
 | 467 |       break; | 
 | 468 |     } | 
| Duncan Sands | 5e41f65 | 2007-11-20 14:09:29 +0000 | [diff] [blame] | 469 |     } | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 470 |   } | 
 | 471 | } | 
 | 472 |  | 
 | 473 |  | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 474 | bool BitcodeReader::ParseTypeTable() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 475 |   if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID)) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 476 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 477 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 478 |   if (!TypeList.empty()) | 
 | 479 |     return Error("Multiple TYPE_BLOCKs found!"); | 
 | 480 |  | 
 | 481 |   SmallVector<uint64_t, 64> Record; | 
 | 482 |   unsigned NumRecords = 0; | 
 | 483 |  | 
 | 484 |   // Read all the records for this type table. | 
 | 485 |   while (1) { | 
 | 486 |     unsigned Code = Stream.ReadCode(); | 
 | 487 |     if (Code == bitc::END_BLOCK) { | 
 | 488 |       if (NumRecords != TypeList.size()) | 
 | 489 |         return Error("Invalid type forward reference in TYPE_BLOCK"); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 490 |       if (Stream.ReadBlockEnd()) | 
 | 491 |         return Error("Error at end of type table block"); | 
 | 492 |       return false; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 493 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 494 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 495 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 496 |       // No known subblocks, always skip them. | 
 | 497 |       Stream.ReadSubBlockID(); | 
 | 498 |       if (Stream.SkipBlock()) | 
 | 499 |         return Error("Malformed block record"); | 
 | 500 |       continue; | 
 | 501 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 502 |  | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 503 |     if (Code == bitc::DEFINE_ABBREV) { | 
| Chris Lattner | d127c1b | 2007-04-23 18:58:34 +0000 | [diff] [blame] | 504 |       Stream.ReadAbbrevRecord(); | 
 | 505 |       continue; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 506 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 507 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 508 |     // Read a record. | 
 | 509 |     Record.clear(); | 
 | 510 |     const Type *ResultTy = 0; | 
 | 511 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 512 |     default:  // Default behavior: unknown type. | 
 | 513 |       ResultTy = 0; | 
 | 514 |       break; | 
 | 515 |     case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] | 
 | 516 |       // TYPE_CODE_NUMENTRY contains a count of the number of types in the | 
 | 517 |       // type list.  This allows us to reserve space. | 
 | 518 |       if (Record.size() < 1) | 
 | 519 |         return Error("Invalid TYPE_CODE_NUMENTRY record"); | 
 | 520 |       TypeList.reserve(Record[0]); | 
 | 521 |       continue; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 522 |     case bitc::TYPE_CODE_VOID:      // VOID | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 523 |       ResultTy = Type::getVoidTy(Context); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 524 |       break; | 
 | 525 |     case bitc::TYPE_CODE_FLOAT:     // FLOAT | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 526 |       ResultTy = Type::getFloatTy(Context); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 527 |       break; | 
 | 528 |     case bitc::TYPE_CODE_DOUBLE:    // DOUBLE | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 529 |       ResultTy = Type::getDoubleTy(Context); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 530 |       break; | 
| Dale Johannesen | 320fc8a | 2007-08-03 01:03:46 +0000 | [diff] [blame] | 531 |     case bitc::TYPE_CODE_X86_FP80:  // X86_FP80 | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 532 |       ResultTy = Type::getX86_FP80Ty(Context); | 
| Dale Johannesen | 320fc8a | 2007-08-03 01:03:46 +0000 | [diff] [blame] | 533 |       break; | 
 | 534 |     case bitc::TYPE_CODE_FP128:     // FP128 | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 535 |       ResultTy = Type::getFP128Ty(Context); | 
| Dale Johannesen | 320fc8a | 2007-08-03 01:03:46 +0000 | [diff] [blame] | 536 |       break; | 
 | 537 |     case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 538 |       ResultTy = Type::getPPC_FP128Ty(Context); | 
| Dale Johannesen | 320fc8a | 2007-08-03 01:03:46 +0000 | [diff] [blame] | 539 |       break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 540 |     case bitc::TYPE_CODE_LABEL:     // LABEL | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 541 |       ResultTy = Type::getLabelTy(Context); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 542 |       break; | 
 | 543 |     case bitc::TYPE_CODE_OPAQUE:    // OPAQUE | 
 | 544 |       ResultTy = 0; | 
 | 545 |       break; | 
| Nick Lewycky | 7a0370f | 2009-05-30 05:06:04 +0000 | [diff] [blame] | 546 |     case bitc::TYPE_CODE_METADATA:  // METADATA | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 547 |       ResultTy = Type::getMetadataTy(Context); | 
| Nick Lewycky | 7a0370f | 2009-05-30 05:06:04 +0000 | [diff] [blame] | 548 |       break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 549 |     case bitc::TYPE_CODE_INTEGER:   // INTEGER: [width] | 
 | 550 |       if (Record.size() < 1) | 
 | 551 |         return Error("Invalid Integer type record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 552 |  | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 553 |       ResultTy = IntegerType::get(Context, Record[0]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 554 |       break; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 555 |     case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 556 |                                     //          [pointee type, address space] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 557 |       if (Record.size() < 1) | 
 | 558 |         return Error("Invalid POINTER type record"); | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 559 |       unsigned AddressSpace = 0; | 
 | 560 |       if (Record.size() == 2) | 
 | 561 |         AddressSpace = Record[1]; | 
| Owen Anderson | debcb01 | 2009-07-29 22:17:13 +0000 | [diff] [blame] | 562 |       ResultTy = PointerType::get(getTypeByID(Record[0], true), | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 563 |                                         AddressSpace); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 564 |       break; | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 565 |     } | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 566 |     case bitc::TYPE_CODE_FUNCTION: { | 
| Chris Lattner | a1afde7 | 2007-11-27 17:48:06 +0000 | [diff] [blame] | 567 |       // FIXME: attrid is dead, remove it in LLVM 3.0 | 
 | 568 |       // FUNCTION: [vararg, attrid, retty, paramty x N] | 
 | 569 |       if (Record.size() < 3) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 570 |         return Error("Invalid FUNCTION type record"); | 
 | 571 |       std::vector<const Type*> ArgTys; | 
| Chris Lattner | a1afde7 | 2007-11-27 17:48:06 +0000 | [diff] [blame] | 572 |       for (unsigned i = 3, e = Record.size(); i != e; ++i) | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 573 |         ArgTys.push_back(getTypeByID(Record[i], true)); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 574 |  | 
| Owen Anderson | debcb01 | 2009-07-29 22:17:13 +0000 | [diff] [blame] | 575 |       ResultTy = FunctionType::get(getTypeByID(Record[2], true), ArgTys, | 
| Duncan Sands | dc02467 | 2007-11-27 13:23:08 +0000 | [diff] [blame] | 576 |                                    Record[0]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 577 |       break; | 
 | 578 |     } | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 579 |     case bitc::TYPE_CODE_STRUCT: {  // STRUCT: [ispacked, eltty x N] | 
| Chris Lattner | 7108dce | 2007-05-06 08:21:50 +0000 | [diff] [blame] | 580 |       if (Record.size() < 1) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 581 |         return Error("Invalid STRUCT type record"); | 
 | 582 |       std::vector<const Type*> EltTys; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 583 |       for (unsigned i = 1, e = Record.size(); i != e; ++i) | 
 | 584 |         EltTys.push_back(getTypeByID(Record[i], true)); | 
| Owen Anderson | d7f2a6c | 2009-08-05 23:16:16 +0000 | [diff] [blame] | 585 |       ResultTy = StructType::get(Context, EltTys, Record[0]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 586 |       break; | 
 | 587 |     } | 
| Chris Lattner | fdfeb69 | 2010-02-12 20:49:41 +0000 | [diff] [blame] | 588 |     case bitc::TYPE_CODE_UNION: {  // UNION: [eltty x N] | 
 | 589 |       SmallVector<const Type*, 8> EltTys; | 
 | 590 |       for (unsigned i = 0, e = Record.size(); i != e; ++i) | 
 | 591 |         EltTys.push_back(getTypeByID(Record[i], true)); | 
 | 592 |       ResultTy = UnionType::get(&EltTys[0], EltTys.size()); | 
 | 593 |       break; | 
 | 594 |     } | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 595 |     case bitc::TYPE_CODE_ARRAY:     // ARRAY: [numelts, eltty] | 
 | 596 |       if (Record.size() < 2) | 
 | 597 |         return Error("Invalid ARRAY type record"); | 
| Owen Anderson | debcb01 | 2009-07-29 22:17:13 +0000 | [diff] [blame] | 598 |       ResultTy = ArrayType::get(getTypeByID(Record[1], true), Record[0]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 599 |       break; | 
 | 600 |     case bitc::TYPE_CODE_VECTOR:    // VECTOR: [numelts, eltty] | 
 | 601 |       if (Record.size() < 2) | 
 | 602 |         return Error("Invalid VECTOR type record"); | 
| Owen Anderson | debcb01 | 2009-07-29 22:17:13 +0000 | [diff] [blame] | 603 |       ResultTy = VectorType::get(getTypeByID(Record[1], true), Record[0]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 604 |       break; | 
 | 605 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 606 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 607 |     if (NumRecords == TypeList.size()) { | 
 | 608 |       // If this is a new type slot, just append it. | 
| Owen Anderson | 0e275dc | 2009-08-13 23:27:32 +0000 | [diff] [blame] | 609 |       TypeList.push_back(ResultTy ? ResultTy : OpaqueType::get(Context)); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 610 |       ++NumRecords; | 
 | 611 |     } else if (ResultTy == 0) { | 
 | 612 |       // Otherwise, this was forward referenced, so an opaque type was created, | 
 | 613 |       // but the result type is actually just an opaque.  Leave the one we | 
 | 614 |       // created previously. | 
 | 615 |       ++NumRecords; | 
 | 616 |     } else { | 
 | 617 |       // Otherwise, this was forward referenced, so an opaque type was created. | 
 | 618 |       // Resolve the opaque type to the real type now. | 
 | 619 |       assert(NumRecords < TypeList.size() && "Typelist imbalance"); | 
 | 620 |       const OpaqueType *OldTy = cast<OpaqueType>(TypeList[NumRecords++].get()); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 621 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 622 |       // Don't directly push the new type on the Tab. Instead we want to replace | 
 | 623 |       // the opaque type we previously inserted with the new concrete value. The | 
 | 624 |       // refinement from the abstract (opaque) type to the new type causes all | 
 | 625 |       // uses of the abstract type to use the concrete type (NewTy). This will | 
 | 626 |       // also cause the opaque type to be deleted. | 
 | 627 |       const_cast<OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 628 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 629 |       // This should have replaced the old opaque type with the new type in the | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 630 |       // value table... or with a preexisting type that was already in the | 
 | 631 |       // system.  Let's just make sure it did. | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 632 |       assert(TypeList[NumRecords-1].get() != OldTy && | 
 | 633 |              "refineAbstractType didn't work!"); | 
 | 634 |     } | 
 | 635 |   } | 
 | 636 | } | 
 | 637 |  | 
 | 638 |  | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 639 | bool BitcodeReader::ParseTypeSymbolTable() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 640 |   if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID)) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 641 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 642 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 643 |   SmallVector<uint64_t, 64> Record; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 644 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 645 |   // Read all the records for this type table. | 
 | 646 |   std::string TypeName; | 
 | 647 |   while (1) { | 
 | 648 |     unsigned Code = Stream.ReadCode(); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 649 |     if (Code == bitc::END_BLOCK) { | 
 | 650 |       if (Stream.ReadBlockEnd()) | 
 | 651 |         return Error("Error at end of type symbol table block"); | 
 | 652 |       return false; | 
 | 653 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 654 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 655 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 656 |       // No known subblocks, always skip them. | 
 | 657 |       Stream.ReadSubBlockID(); | 
 | 658 |       if (Stream.SkipBlock()) | 
 | 659 |         return Error("Malformed block record"); | 
 | 660 |       continue; | 
 | 661 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 662 |  | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 663 |     if (Code == bitc::DEFINE_ABBREV) { | 
| Chris Lattner | d127c1b | 2007-04-23 18:58:34 +0000 | [diff] [blame] | 664 |       Stream.ReadAbbrevRecord(); | 
 | 665 |       continue; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 666 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 667 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 668 |     // Read a record. | 
 | 669 |     Record.clear(); | 
 | 670 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 671 |     default:  // Default behavior: unknown type. | 
 | 672 |       break; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 673 |     case bitc::TST_CODE_ENTRY:    // TST_ENTRY: [typeid, namechar x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 674 |       if (ConvertToString(Record, 1, TypeName)) | 
 | 675 |         return Error("Invalid TST_ENTRY record"); | 
 | 676 |       unsigned TypeID = Record[0]; | 
 | 677 |       if (TypeID >= TypeList.size()) | 
 | 678 |         return Error("Invalid Type ID in TST_ENTRY record"); | 
 | 679 |  | 
 | 680 |       TheModule->addTypeName(TypeName, TypeList[TypeID].get()); | 
 | 681 |       TypeName.clear(); | 
 | 682 |       break; | 
 | 683 |     } | 
 | 684 |   } | 
 | 685 | } | 
 | 686 |  | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 687 | bool BitcodeReader::ParseValueSymbolTable() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 688 |   if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 689 |     return Error("Malformed block record"); | 
 | 690 |  | 
 | 691 |   SmallVector<uint64_t, 64> Record; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 692 |  | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 693 |   // Read all the records for this value table. | 
 | 694 |   SmallString<128> ValueName; | 
 | 695 |   while (1) { | 
 | 696 |     unsigned Code = Stream.ReadCode(); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 697 |     if (Code == bitc::END_BLOCK) { | 
 | 698 |       if (Stream.ReadBlockEnd()) | 
 | 699 |         return Error("Error at end of value symbol table block"); | 
 | 700 |       return false; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 701 |     } | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 702 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 703 |       // No known subblocks, always skip them. | 
 | 704 |       Stream.ReadSubBlockID(); | 
 | 705 |       if (Stream.SkipBlock()) | 
 | 706 |         return Error("Malformed block record"); | 
 | 707 |       continue; | 
 | 708 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 709 |  | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 710 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 711 |       Stream.ReadAbbrevRecord(); | 
 | 712 |       continue; | 
 | 713 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 714 |  | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 715 |     // Read a record. | 
 | 716 |     Record.clear(); | 
 | 717 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 718 |     default:  // Default behavior: unknown type. | 
 | 719 |       break; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 720 |     case bitc::VST_CODE_ENTRY: {  // VST_ENTRY: [valueid, namechar x N] | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 721 |       if (ConvertToString(Record, 1, ValueName)) | 
| Nick Lewycky | 88b7293 | 2009-05-31 06:07:28 +0000 | [diff] [blame] | 722 |         return Error("Invalid VST_ENTRY record"); | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 723 |       unsigned ValueID = Record[0]; | 
 | 724 |       if (ValueID >= ValueList.size()) | 
 | 725 |         return Error("Invalid Value ID in VST_ENTRY record"); | 
 | 726 |       Value *V = ValueList[ValueID]; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 727 |  | 
| Daniel Dunbar | 3f53fa9 | 2009-07-26 00:34:27 +0000 | [diff] [blame] | 728 |       V->setName(StringRef(ValueName.data(), ValueName.size())); | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 729 |       ValueName.clear(); | 
 | 730 |       break; | 
| Reid Spencer | c8f8a24 | 2007-05-04 01:43:33 +0000 | [diff] [blame] | 731 |     } | 
 | 732 |     case bitc::VST_CODE_BBENTRY: { | 
| Chris Lattner | e825ed5 | 2007-05-03 22:18:21 +0000 | [diff] [blame] | 733 |       if (ConvertToString(Record, 1, ValueName)) | 
 | 734 |         return Error("Invalid VST_BBENTRY record"); | 
 | 735 |       BasicBlock *BB = getBasicBlock(Record[0]); | 
 | 736 |       if (BB == 0) | 
 | 737 |         return Error("Invalid BB ID in VST_BBENTRY record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 738 |  | 
| Daniel Dunbar | 3f53fa9 | 2009-07-26 00:34:27 +0000 | [diff] [blame] | 739 |       BB->setName(StringRef(ValueName.data(), ValueName.size())); | 
| Chris Lattner | e825ed5 | 2007-05-03 22:18:21 +0000 | [diff] [blame] | 740 |       ValueName.clear(); | 
 | 741 |       break; | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 742 |     } | 
| Reid Spencer | c8f8a24 | 2007-05-04 01:43:33 +0000 | [diff] [blame] | 743 |     } | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 744 |   } | 
 | 745 | } | 
 | 746 |  | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 747 | bool BitcodeReader::ParseMetadata() { | 
| Devang Patel | 2359850 | 2010-01-11 18:52:33 +0000 | [diff] [blame] | 748 |   unsigned NextMDValueNo = MDValueList.size(); | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 749 |  | 
 | 750 |   if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) | 
 | 751 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 752 |  | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 753 |   SmallVector<uint64_t, 64> Record; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 754 |  | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 755 |   // Read all the records. | 
 | 756 |   while (1) { | 
 | 757 |     unsigned Code = Stream.ReadCode(); | 
 | 758 |     if (Code == bitc::END_BLOCK) { | 
 | 759 |       if (Stream.ReadBlockEnd()) | 
 | 760 |         return Error("Error at end of PARAMATTR block"); | 
 | 761 |       return false; | 
 | 762 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 763 |  | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 764 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 765 |       // No known subblocks, always skip them. | 
 | 766 |       Stream.ReadSubBlockID(); | 
 | 767 |       if (Stream.SkipBlock()) | 
 | 768 |         return Error("Malformed block record"); | 
 | 769 |       continue; | 
 | 770 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 771 |  | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 772 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 773 |       Stream.ReadAbbrevRecord(); | 
 | 774 |       continue; | 
 | 775 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 776 |  | 
| Victor Hernandez | 24e64df | 2010-01-10 07:14:18 +0000 | [diff] [blame] | 777 |     bool IsFunctionLocal = false; | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 778 |     // Read a record. | 
 | 779 |     Record.clear(); | 
 | 780 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 781 |     default:  // Default behavior: ignore. | 
 | 782 |       break; | 
| Devang Patel | aa99314 | 2009-07-29 22:34:41 +0000 | [diff] [blame] | 783 |     case bitc::METADATA_NAME: { | 
 | 784 |       // Read named of the named metadata. | 
 | 785 |       unsigned NameLength = Record.size(); | 
 | 786 |       SmallString<8> Name; | 
 | 787 |       Name.resize(NameLength); | 
 | 788 |       for (unsigned i = 0; i != NameLength; ++i) | 
 | 789 |         Name[i] = Record[i]; | 
 | 790 |       Record.clear(); | 
 | 791 |       Code = Stream.ReadCode(); | 
 | 792 |  | 
 | 793 |       // METADATA_NAME is always followed by METADATA_NAMED_NODE. | 
 | 794 |       if (Stream.ReadRecord(Code, Record) != bitc::METADATA_NAMED_NODE) | 
 | 795 |         assert ( 0 && "Inavlid Named Metadata record"); | 
 | 796 |  | 
 | 797 |       // Read named metadata elements. | 
 | 798 |       unsigned Size = Record.size(); | 
| Devang Patel | 3e30c2a | 2010-01-05 20:41:31 +0000 | [diff] [blame] | 799 |       SmallVector<MDNode *, 8> Elts; | 
| Devang Patel | aa99314 | 2009-07-29 22:34:41 +0000 | [diff] [blame] | 800 |       for (unsigned i = 0; i != Size; ++i) { | 
| Chris Lattner | 70644e9 | 2010-01-09 02:02:37 +0000 | [diff] [blame] | 801 |         if (Record[i] == ~0U) { | 
| Devang Patel | 69d02e0 | 2010-01-05 21:47:32 +0000 | [diff] [blame] | 802 |           Elts.push_back(NULL); | 
| Chris Lattner | 70644e9 | 2010-01-09 02:02:37 +0000 | [diff] [blame] | 803 |           continue; | 
| Devang Patel | 69d02e0 | 2010-01-05 21:47:32 +0000 | [diff] [blame] | 804 |         } | 
| Chris Lattner | 70644e9 | 2010-01-09 02:02:37 +0000 | [diff] [blame] | 805 |         MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i])); | 
 | 806 |         if (MD == 0) | 
 | 807 |           return Error("Malformed metadata record"); | 
 | 808 |         Elts.push_back(MD); | 
| Devang Patel | aa99314 | 2009-07-29 22:34:41 +0000 | [diff] [blame] | 809 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 810 |       Value *V = NamedMDNode::Create(Context, Name.str(), Elts.data(), | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 811 |                                      Elts.size(), TheModule); | 
| Devang Patel | 2359850 | 2010-01-11 18:52:33 +0000 | [diff] [blame] | 812 |       MDValueList.AssignValue(V, NextMDValueNo++); | 
| Devang Patel | aa99314 | 2009-07-29 22:34:41 +0000 | [diff] [blame] | 813 |       break; | 
 | 814 |     } | 
| Victor Hernandez | 24e64df | 2010-01-10 07:14:18 +0000 | [diff] [blame] | 815 |     case bitc::METADATA_FN_NODE: | 
 | 816 |       IsFunctionLocal = true; | 
 | 817 |       // fall-through | 
| Devang Patel | 104cf9e | 2009-07-23 01:07:34 +0000 | [diff] [blame] | 818 |     case bitc::METADATA_NODE: { | 
 | 819 |       if (Record.empty() || Record.size() % 2 == 1) | 
 | 820 |         return Error("Invalid METADATA_NODE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 821 |  | 
| Devang Patel | 104cf9e | 2009-07-23 01:07:34 +0000 | [diff] [blame] | 822 |       unsigned Size = Record.size(); | 
 | 823 |       SmallVector<Value*, 8> Elts; | 
 | 824 |       for (unsigned i = 0; i != Size; i += 2) { | 
 | 825 |         const Type *Ty = getTypeByID(Record[i], false); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 826 |         if (Ty->isMetadataTy()) | 
| Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 827 |           Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); | 
| Benjamin Kramer | f012705 | 2010-01-05 13:12:22 +0000 | [diff] [blame] | 828 |         else if (!Ty->isVoidTy()) | 
| Devang Patel | 104cf9e | 2009-07-23 01:07:34 +0000 | [diff] [blame] | 829 |           Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); | 
 | 830 |         else | 
 | 831 |           Elts.push_back(NULL); | 
 | 832 |       } | 
| Victor Hernandez | 24e64df | 2010-01-10 07:14:18 +0000 | [diff] [blame] | 833 |       Value *V = MDNode::getWhenValsUnresolved(Context, &Elts[0], Elts.size(), | 
 | 834 |                                                IsFunctionLocal); | 
 | 835 |       IsFunctionLocal = false; | 
| Devang Patel | 2359850 | 2010-01-11 18:52:33 +0000 | [diff] [blame] | 836 |       MDValueList.AssignValue(V, NextMDValueNo++); | 
| Devang Patel | 104cf9e | 2009-07-23 01:07:34 +0000 | [diff] [blame] | 837 |       break; | 
 | 838 |     } | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 839 |     case bitc::METADATA_STRING: { | 
 | 840 |       unsigned MDStringLength = Record.size(); | 
 | 841 |       SmallString<8> String; | 
 | 842 |       String.resize(MDStringLength); | 
 | 843 |       for (unsigned i = 0; i != MDStringLength; ++i) | 
 | 844 |         String[i] = Record[i]; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 845 |       Value *V = MDString::get(Context, | 
| Owen Anderson | 647e301 | 2009-07-31 21:35:40 +0000 | [diff] [blame] | 846 |                                StringRef(String.data(), String.size())); | 
| Devang Patel | 2359850 | 2010-01-11 18:52:33 +0000 | [diff] [blame] | 847 |       MDValueList.AssignValue(V, NextMDValueNo++); | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 848 |       break; | 
 | 849 |     } | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 850 |     case bitc::METADATA_KIND: { | 
 | 851 |       unsigned RecordLength = Record.size(); | 
 | 852 |       if (Record.empty() || RecordLength < 2) | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 853 |         return Error("Invalid METADATA_KIND record"); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 854 |       SmallString<8> Name; | 
 | 855 |       Name.resize(RecordLength-1); | 
| Devang Patel | a214840 | 2009-09-28 21:14:55 +0000 | [diff] [blame] | 856 |       unsigned Kind = Record[0]; | 
| Daniel Dunbar | 22bbd9b | 2009-10-25 23:11:06 +0000 | [diff] [blame] | 857 |       (void) Kind; | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 858 |       for (unsigned i = 1; i != RecordLength; ++i) | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 859 |         Name[i-1] = Record[i]; | 
| Chris Lattner | 0eb4198 | 2009-12-28 20:45:51 +0000 | [diff] [blame] | 860 |        | 
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 861 |       unsigned NewKind = TheModule->getMDKindID(Name.str()); | 
| Chris Lattner | 0eb4198 | 2009-12-28 20:45:51 +0000 | [diff] [blame] | 862 |       assert(Kind == NewKind && | 
 | 863 |              "FIXME: Unable to handle custom metadata mismatch!");(void)NewKind; | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 864 |       break; | 
 | 865 |     } | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 866 |     } | 
 | 867 |   } | 
 | 868 | } | 
 | 869 |  | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 870 | /// DecodeSignRotatedValue - Decode a signed value stored with the sign bit in | 
 | 871 | /// the LSB for dense VBR encoding. | 
 | 872 | static uint64_t DecodeSignRotatedValue(uint64_t V) { | 
 | 873 |   if ((V & 1) == 0) | 
 | 874 |     return V >> 1; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 875 |   if (V != 1) | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 876 |     return -(V >> 1); | 
 | 877 |   // There is no such thing as -0 with integers.  "-0" really means MININT. | 
 | 878 |   return 1ULL << 63; | 
 | 879 | } | 
 | 880 |  | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 881 | /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global | 
 | 882 | /// values and aliases that we can. | 
 | 883 | bool BitcodeReader::ResolveGlobalAndAliasInits() { | 
 | 884 |   std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; | 
 | 885 |   std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 886 |  | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 887 |   GlobalInitWorklist.swap(GlobalInits); | 
 | 888 |   AliasInitWorklist.swap(AliasInits); | 
 | 889 |  | 
 | 890 |   while (!GlobalInitWorklist.empty()) { | 
| Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 891 |     unsigned ValID = GlobalInitWorklist.back().second; | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 892 |     if (ValID >= ValueList.size()) { | 
 | 893 |       // Not ready to resolve this yet, it requires something later in the file. | 
| Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 894 |       GlobalInits.push_back(GlobalInitWorklist.back()); | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 895 |     } else { | 
 | 896 |       if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) | 
 | 897 |         GlobalInitWorklist.back().first->setInitializer(C); | 
 | 898 |       else | 
 | 899 |         return Error("Global variable initializer is not a constant!"); | 
 | 900 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 901 |     GlobalInitWorklist.pop_back(); | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 902 |   } | 
 | 903 |  | 
 | 904 |   while (!AliasInitWorklist.empty()) { | 
 | 905 |     unsigned ValID = AliasInitWorklist.back().second; | 
 | 906 |     if (ValID >= ValueList.size()) { | 
 | 907 |       AliasInits.push_back(AliasInitWorklist.back()); | 
 | 908 |     } else { | 
 | 909 |       if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) | 
| Anton Korobeynikov | 7dde0ff | 2007-04-28 14:57:59 +0000 | [diff] [blame] | 910 |         AliasInitWorklist.back().first->setAliasee(C); | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 911 |       else | 
 | 912 |         return Error("Alias initializer is not a constant!"); | 
 | 913 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 914 |     AliasInitWorklist.pop_back(); | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 915 |   } | 
 | 916 |   return false; | 
 | 917 | } | 
 | 918 |  | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 919 | bool BitcodeReader::ParseConstants() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 920 |   if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 921 |     return Error("Malformed block record"); | 
 | 922 |  | 
 | 923 |   SmallVector<uint64_t, 64> Record; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 924 |  | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 925 |   // Read all the records for this value table. | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 926 |   const Type *CurTy = Type::getInt32Ty(Context); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 927 |   unsigned NextCstNo = ValueList.size(); | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 928 |   while (1) { | 
 | 929 |     unsigned Code = Stream.ReadCode(); | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 930 |     if (Code == bitc::END_BLOCK) | 
 | 931 |       break; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 932 |  | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 933 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 934 |       // No known subblocks, always skip them. | 
 | 935 |       Stream.ReadSubBlockID(); | 
 | 936 |       if (Stream.SkipBlock()) | 
 | 937 |         return Error("Malformed block record"); | 
 | 938 |       continue; | 
 | 939 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 940 |  | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 941 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 942 |       Stream.ReadAbbrevRecord(); | 
 | 943 |       continue; | 
 | 944 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 945 |  | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 946 |     // Read a record. | 
 | 947 |     Record.clear(); | 
 | 948 |     Value *V = 0; | 
| Dan Gohman | 1224c38 | 2009-07-20 21:19:07 +0000 | [diff] [blame] | 949 |     unsigned BitCode = Stream.ReadRecord(Code, Record); | 
 | 950 |     switch (BitCode) { | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 951 |     default:  // Default behavior: unknown constant | 
 | 952 |     case bitc::CST_CODE_UNDEF:     // UNDEF | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 953 |       V = UndefValue::get(CurTy); | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 954 |       break; | 
 | 955 |     case bitc::CST_CODE_SETTYPE:   // SETTYPE: [typeid] | 
 | 956 |       if (Record.empty()) | 
 | 957 |         return Error("Malformed CST_SETTYPE record"); | 
 | 958 |       if (Record[0] >= TypeList.size()) | 
 | 959 |         return Error("Invalid Type ID in CST_SETTYPE record"); | 
 | 960 |       CurTy = TypeList[Record[0]]; | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 961 |       continue;  // Skip the ValueList manipulation. | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 962 |     case bitc::CST_CODE_NULL:      // NULL | 
| Owen Anderson | a7235ea | 2009-07-31 20:28:14 +0000 | [diff] [blame] | 963 |       V = Constant::getNullValue(CurTy); | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 964 |       break; | 
 | 965 |     case bitc::CST_CODE_INTEGER:   // INTEGER: [intval] | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 966 |       if (!isa<IntegerType>(CurTy) || Record.empty()) | 
 | 967 |         return Error("Invalid CST_INTEGER record"); | 
| Owen Anderson | eed707b | 2009-07-24 23:12:02 +0000 | [diff] [blame] | 968 |       V = ConstantInt::get(CurTy, DecodeSignRotatedValue(Record[0])); | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 969 |       break; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 970 |     case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] | 
 | 971 |       if (!isa<IntegerType>(CurTy) || Record.empty()) | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 972 |         return Error("Invalid WIDE_INTEGER record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 973 |  | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 974 |       unsigned NumWords = Record.size(); | 
| Chris Lattner | 084a844 | 2007-04-24 17:22:05 +0000 | [diff] [blame] | 975 |       SmallVector<uint64_t, 8> Words; | 
 | 976 |       Words.resize(NumWords); | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 977 |       for (unsigned i = 0; i != NumWords; ++i) | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 978 |         Words[i] = DecodeSignRotatedValue(Record[i]); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 979 |       V = ConstantInt::get(Context, | 
| Owen Anderson | eed707b | 2009-07-24 23:12:02 +0000 | [diff] [blame] | 980 |                            APInt(cast<IntegerType>(CurTy)->getBitWidth(), | 
 | 981 |                            NumWords, &Words[0])); | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 982 |       break; | 
 | 983 |     } | 
| Dale Johannesen | 3f6eb74 | 2007-09-11 18:32:33 +0000 | [diff] [blame] | 984 |     case bitc::CST_CODE_FLOAT: {    // FLOAT: [fpval] | 
| Chris Lattner | 0eef080 | 2007-04-24 04:04:35 +0000 | [diff] [blame] | 985 |       if (Record.empty()) | 
 | 986 |         return Error("Invalid FLOAT record"); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 987 |       if (CurTy->isFloatTy()) | 
| Owen Anderson | 6f83c9c | 2009-07-27 20:59:43 +0000 | [diff] [blame] | 988 |         V = ConstantFP::get(Context, APFloat(APInt(32, (uint32_t)Record[0]))); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 989 |       else if (CurTy->isDoubleTy()) | 
| Owen Anderson | 6f83c9c | 2009-07-27 20:59:43 +0000 | [diff] [blame] | 990 |         V = ConstantFP::get(Context, APFloat(APInt(64, Record[0]))); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 991 |       else if (CurTy->isX86_FP80Ty()) { | 
| Dale Johannesen | 1b25cb2 | 2009-03-23 21:16:53 +0000 | [diff] [blame] | 992 |         // Bits are not stored the same way as a normal i80 APInt, compensate. | 
 | 993 |         uint64_t Rearrange[2]; | 
 | 994 |         Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); | 
 | 995 |         Rearrange[1] = Record[0] >> 48; | 
| Owen Anderson | 6f83c9c | 2009-07-27 20:59:43 +0000 | [diff] [blame] | 996 |         V = ConstantFP::get(Context, APFloat(APInt(80, 2, Rearrange))); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 997 |       } else if (CurTy->isFP128Ty()) | 
| Owen Anderson | 6f83c9c | 2009-07-27 20:59:43 +0000 | [diff] [blame] | 998 |         V = ConstantFP::get(Context, APFloat(APInt(128, 2, &Record[0]), true)); | 
| Chris Lattner | cf0fe8d | 2009-10-05 05:54:46 +0000 | [diff] [blame] | 999 |       else if (CurTy->isPPC_FP128Ty()) | 
| Owen Anderson | 6f83c9c | 2009-07-27 20:59:43 +0000 | [diff] [blame] | 1000 |         V = ConstantFP::get(Context, APFloat(APInt(128, 2, &Record[0]))); | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1001 |       else | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 1002 |         V = UndefValue::get(CurTy); | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1003 |       break; | 
| Dale Johannesen | 3f6eb74 | 2007-09-11 18:32:33 +0000 | [diff] [blame] | 1004 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1005 |  | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1006 |     case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] | 
 | 1007 |       if (Record.empty()) | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1008 |         return Error("Invalid CST_AGGREGATE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1009 |  | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1010 |       unsigned Size = Record.size(); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1011 |       std::vector<Constant*> Elts; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1012 |  | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1013 |       if (const StructType *STy = dyn_cast<StructType>(CurTy)) { | 
 | 1014 |         for (unsigned i = 0; i != Size; ++i) | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1015 |           Elts.push_back(ValueList.getConstantFwdRef(Record[i], | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1016 |                                                      STy->getElementType(i))); | 
| Owen Anderson | 8fa3338 | 2009-07-27 22:29:26 +0000 | [diff] [blame] | 1017 |         V = ConstantStruct::get(STy, Elts); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1018 |       } else if (const ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { | 
 | 1019 |         const Type *EltTy = ATy->getElementType(); | 
 | 1020 |         for (unsigned i = 0; i != Size; ++i) | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1021 |           Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); | 
| Owen Anderson | 1fd7096 | 2009-07-28 18:32:17 +0000 | [diff] [blame] | 1022 |         V = ConstantArray::get(ATy, Elts); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1023 |       } else if (const VectorType *VTy = dyn_cast<VectorType>(CurTy)) { | 
 | 1024 |         const Type *EltTy = VTy->getElementType(); | 
 | 1025 |         for (unsigned i = 0; i != Size; ++i) | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1026 |           Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); | 
| Owen Anderson | af7ec97 | 2009-07-28 21:19:26 +0000 | [diff] [blame] | 1027 |         V = ConstantVector::get(Elts); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1028 |       } else { | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 1029 |         V = UndefValue::get(CurTy); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1030 |       } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1031 |       break; | 
 | 1032 |     } | 
| Chris Lattner | ff7fc5d | 2007-05-06 00:35:24 +0000 | [diff] [blame] | 1033 |     case bitc::CST_CODE_STRING: { // STRING: [values] | 
 | 1034 |       if (Record.empty()) | 
 | 1035 |         return Error("Invalid CST_AGGREGATE record"); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1036 |  | 
| Chris Lattner | ff7fc5d | 2007-05-06 00:35:24 +0000 | [diff] [blame] | 1037 |       const ArrayType *ATy = cast<ArrayType>(CurTy); | 
 | 1038 |       const Type *EltTy = ATy->getElementType(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1039 |  | 
| Chris Lattner | ff7fc5d | 2007-05-06 00:35:24 +0000 | [diff] [blame] | 1040 |       unsigned Size = Record.size(); | 
 | 1041 |       std::vector<Constant*> Elts; | 
| Chris Lattner | ff7fc5d | 2007-05-06 00:35:24 +0000 | [diff] [blame] | 1042 |       for (unsigned i = 0; i != Size; ++i) | 
| Owen Anderson | eed707b | 2009-07-24 23:12:02 +0000 | [diff] [blame] | 1043 |         Elts.push_back(ConstantInt::get(EltTy, Record[i])); | 
| Owen Anderson | 1fd7096 | 2009-07-28 18:32:17 +0000 | [diff] [blame] | 1044 |       V = ConstantArray::get(ATy, Elts); | 
| Chris Lattner | ff7fc5d | 2007-05-06 00:35:24 +0000 | [diff] [blame] | 1045 |       break; | 
 | 1046 |     } | 
| Chris Lattner | cb3d91b | 2007-05-06 00:53:07 +0000 | [diff] [blame] | 1047 |     case bitc::CST_CODE_CSTRING: { // CSTRING: [values] | 
 | 1048 |       if (Record.empty()) | 
 | 1049 |         return Error("Invalid CST_AGGREGATE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1050 |  | 
| Chris Lattner | cb3d91b | 2007-05-06 00:53:07 +0000 | [diff] [blame] | 1051 |       const ArrayType *ATy = cast<ArrayType>(CurTy); | 
 | 1052 |       const Type *EltTy = ATy->getElementType(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1053 |  | 
| Chris Lattner | cb3d91b | 2007-05-06 00:53:07 +0000 | [diff] [blame] | 1054 |       unsigned Size = Record.size(); | 
 | 1055 |       std::vector<Constant*> Elts; | 
 | 1056 |       for (unsigned i = 0; i != Size; ++i) | 
| Owen Anderson | eed707b | 2009-07-24 23:12:02 +0000 | [diff] [blame] | 1057 |         Elts.push_back(ConstantInt::get(EltTy, Record[i])); | 
| Owen Anderson | a7235ea | 2009-07-31 20:28:14 +0000 | [diff] [blame] | 1058 |       Elts.push_back(Constant::getNullValue(EltTy)); | 
| Owen Anderson | 1fd7096 | 2009-07-28 18:32:17 +0000 | [diff] [blame] | 1059 |       V = ConstantArray::get(ATy, Elts); | 
| Chris Lattner | cb3d91b | 2007-05-06 00:53:07 +0000 | [diff] [blame] | 1060 |       break; | 
 | 1061 |     } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1062 |     case bitc::CST_CODE_CE_BINOP: {  // CE_BINOP: [opcode, opval, opval] | 
 | 1063 |       if (Record.size() < 3) return Error("Invalid CE_BINOP record"); | 
 | 1064 |       int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1065 |       if (Opc < 0) { | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 1066 |         V = UndefValue::get(CurTy);  // Unknown binop. | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1067 |       } else { | 
 | 1068 |         Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); | 
 | 1069 |         Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1070 |         unsigned Flags = 0; | 
 | 1071 |         if (Record.size() >= 4) { | 
 | 1072 |           if (Opc == Instruction::Add || | 
 | 1073 |               Opc == Instruction::Sub || | 
 | 1074 |               Opc == Instruction::Mul) { | 
 | 1075 |             if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) | 
 | 1076 |               Flags |= OverflowingBinaryOperator::NoSignedWrap; | 
 | 1077 |             if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) | 
 | 1078 |               Flags |= OverflowingBinaryOperator::NoUnsignedWrap; | 
 | 1079 |           } else if (Opc == Instruction::SDiv) { | 
 | 1080 |             if (Record[3] & (1 << bitc::SDIV_EXACT)) | 
 | 1081 |               Flags |= SDivOperator::IsExact; | 
 | 1082 |           } | 
 | 1083 |         } | 
 | 1084 |         V = ConstantExpr::get(Opc, LHS, RHS, Flags); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1085 |       } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1086 |       break; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1087 |     } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1088 |     case bitc::CST_CODE_CE_CAST: {  // CE_CAST: [opcode, opty, opval] | 
 | 1089 |       if (Record.size() < 3) return Error("Invalid CE_CAST record"); | 
 | 1090 |       int Opc = GetDecodedCastOpcode(Record[0]); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1091 |       if (Opc < 0) { | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 1092 |         V = UndefValue::get(CurTy);  // Unknown cast. | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1093 |       } else { | 
 | 1094 |         const Type *OpTy = getTypeByID(Record[1]); | 
| Chris Lattner | bfcc380 | 2007-05-06 07:33:01 +0000 | [diff] [blame] | 1095 |         if (!OpTy) return Error("Invalid CE_CAST record"); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1096 |         Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1097 |         V = ConstantExpr::getCast(Opc, Op, CurTy); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1098 |       } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1099 |       break; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1100 |     } | 
| Dan Gohman | dd8004d | 2009-07-27 21:53:46 +0000 | [diff] [blame] | 1101 |     case bitc::CST_CODE_CE_INBOUNDS_GEP: | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1102 |     case bitc::CST_CODE_CE_GEP: {  // CE_GEP:        [n x operands] | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1103 |       if (Record.size() & 1) return Error("Invalid CE_GEP record"); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1104 |       SmallVector<Constant*, 16> Elts; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1105 |       for (unsigned i = 0, e = Record.size(); i != e; i += 2) { | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1106 |         const Type *ElTy = getTypeByID(Record[i]); | 
 | 1107 |         if (!ElTy) return Error("Invalid CE_GEP record"); | 
 | 1108 |         Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy)); | 
 | 1109 |       } | 
| Dan Gohman | dd8004d | 2009-07-27 21:53:46 +0000 | [diff] [blame] | 1110 |       if (BitCode == bitc::CST_CODE_CE_INBOUNDS_GEP) | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1111 |         V = ConstantExpr::getInBoundsGetElementPtr(Elts[0], &Elts[1], | 
 | 1112 |                                                    Elts.size()-1); | 
 | 1113 |       else | 
 | 1114 |         V = ConstantExpr::getGetElementPtr(Elts[0], &Elts[1], | 
 | 1115 |                                            Elts.size()-1); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1116 |       break; | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1117 |     } | 
 | 1118 |     case bitc::CST_CODE_CE_SELECT:  // CE_SELECT: [opval#, opval#, opval#] | 
 | 1119 |       if (Record.size() < 3) return Error("Invalid CE_SELECT record"); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1120 |       V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1121 |                                                               Type::getInt1Ty(Context)), | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1122 |                                   ValueList.getConstantFwdRef(Record[1],CurTy), | 
 | 1123 |                                   ValueList.getConstantFwdRef(Record[2],CurTy)); | 
 | 1124 |       break; | 
 | 1125 |     case bitc::CST_CODE_CE_EXTRACTELT: { // CE_EXTRACTELT: [opty, opval, opval] | 
 | 1126 |       if (Record.size() < 3) return Error("Invalid CE_EXTRACTELT record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1127 |       const VectorType *OpTy = | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1128 |         dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); | 
 | 1129 |       if (OpTy == 0) return Error("Invalid CE_EXTRACTELT record"); | 
 | 1130 |       Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1131 |       Constant *Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1132 |       V = ConstantExpr::getExtractElement(Op0, Op1); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1133 |       break; | 
 | 1134 |     } | 
 | 1135 |     case bitc::CST_CODE_CE_INSERTELT: { // CE_INSERTELT: [opval, opval, opval] | 
 | 1136 |       const VectorType *OpTy = dyn_cast<VectorType>(CurTy); | 
 | 1137 |       if (Record.size() < 3 || OpTy == 0) | 
 | 1138 |         return Error("Invalid CE_INSERTELT record"); | 
 | 1139 |       Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); | 
 | 1140 |       Constant *Op1 = ValueList.getConstantFwdRef(Record[1], | 
 | 1141 |                                                   OpTy->getElementType()); | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1142 |       Constant *Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1143 |       V = ConstantExpr::getInsertElement(Op0, Op1, Op2); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1144 |       break; | 
 | 1145 |     } | 
 | 1146 |     case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] | 
 | 1147 |       const VectorType *OpTy = dyn_cast<VectorType>(CurTy); | 
 | 1148 |       if (Record.size() < 3 || OpTy == 0) | 
| Nate Begeman | 0f123cf | 2009-02-12 21:28:33 +0000 | [diff] [blame] | 1149 |         return Error("Invalid CE_SHUFFLEVEC record"); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1150 |       Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); | 
 | 1151 |       Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1152 |       const Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 1153 |                                                  OpTy->getNumElements()); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1154 |       Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1155 |       V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1156 |       break; | 
 | 1157 |     } | 
| Nate Begeman | 0f123cf | 2009-02-12 21:28:33 +0000 | [diff] [blame] | 1158 |     case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] | 
 | 1159 |       const VectorType *RTy = dyn_cast<VectorType>(CurTy); | 
 | 1160 |       const VectorType *OpTy = dyn_cast<VectorType>(getTypeByID(Record[0])); | 
 | 1161 |       if (Record.size() < 4 || RTy == 0 || OpTy == 0) | 
 | 1162 |         return Error("Invalid CE_SHUFVEC_EX record"); | 
 | 1163 |       Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 
 | 1164 |       Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1165 |       const Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), | 
| Owen Anderson | 74a7781 | 2009-07-07 20:18:58 +0000 | [diff] [blame] | 1166 |                                                  RTy->getNumElements()); | 
| Nate Begeman | 0f123cf | 2009-02-12 21:28:33 +0000 | [diff] [blame] | 1167 |       Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1168 |       V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); | 
| Nate Begeman | 0f123cf | 2009-02-12 21:28:33 +0000 | [diff] [blame] | 1169 |       break; | 
 | 1170 |     } | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1171 |     case bitc::CST_CODE_CE_CMP: {     // CE_CMP: [opty, opval, opval, pred] | 
 | 1172 |       if (Record.size() < 4) return Error("Invalid CE_CMP record"); | 
 | 1173 |       const Type *OpTy = getTypeByID(Record[0]); | 
 | 1174 |       if (OpTy == 0) return Error("Invalid CE_CMP record"); | 
 | 1175 |       Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 
 | 1176 |       Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); | 
 | 1177 |  | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 1178 |       if (OpTy->isFPOrFPVectorTy()) | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1179 |         V = ConstantExpr::getFCmp(Record[3], Op0, Op1); | 
| Nate Begeman | ac80ade | 2008-05-12 19:01:56 +0000 | [diff] [blame] | 1180 |       else | 
| Owen Anderson | baf3c40 | 2009-07-29 18:55:55 +0000 | [diff] [blame] | 1181 |         V = ConstantExpr::getICmp(Record[3], Op0, Op1); | 
| Chris Lattner | f581c3b | 2007-04-24 07:07:11 +0000 | [diff] [blame] | 1182 |       break; | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1183 |     } | 
| Chris Lattner | 2bce93a | 2007-05-06 01:58:20 +0000 | [diff] [blame] | 1184 |     case bitc::CST_CODE_INLINEASM: { | 
 | 1185 |       if (Record.size() < 2) return Error("Invalid INLINEASM record"); | 
 | 1186 |       std::string AsmStr, ConstrStr; | 
| Dale Johannesen | 4360298 | 2009-10-13 20:46:56 +0000 | [diff] [blame] | 1187 |       bool HasSideEffects = Record[0] & 1; | 
| Dale Johannesen | 8ba2d5b | 2009-10-21 23:28:00 +0000 | [diff] [blame] | 1188 |       bool IsAlignStack = Record[0] >> 1; | 
| Chris Lattner | 2bce93a | 2007-05-06 01:58:20 +0000 | [diff] [blame] | 1189 |       unsigned AsmStrSize = Record[1]; | 
 | 1190 |       if (2+AsmStrSize >= Record.size()) | 
 | 1191 |         return Error("Invalid INLINEASM record"); | 
 | 1192 |       unsigned ConstStrSize = Record[2+AsmStrSize]; | 
 | 1193 |       if (3+AsmStrSize+ConstStrSize > Record.size()) | 
 | 1194 |         return Error("Invalid INLINEASM record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1195 |  | 
| Chris Lattner | 2bce93a | 2007-05-06 01:58:20 +0000 | [diff] [blame] | 1196 |       for (unsigned i = 0; i != AsmStrSize; ++i) | 
 | 1197 |         AsmStr += (char)Record[2+i]; | 
 | 1198 |       for (unsigned i = 0; i != ConstStrSize; ++i) | 
 | 1199 |         ConstrStr += (char)Record[3+AsmStrSize+i]; | 
 | 1200 |       const PointerType *PTy = cast<PointerType>(CurTy); | 
 | 1201 |       V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), | 
| Dale Johannesen | 8ba2d5b | 2009-10-21 23:28:00 +0000 | [diff] [blame] | 1202 |                          AsmStr, ConstrStr, HasSideEffects, IsAlignStack); | 
| Chris Lattner | 2bce93a | 2007-05-06 01:58:20 +0000 | [diff] [blame] | 1203 |       break; | 
 | 1204 |     } | 
| Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 1205 |     case bitc::CST_CODE_BLOCKADDRESS:{ | 
 | 1206 |       if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record"); | 
 | 1207 |       const Type *FnTy = getTypeByID(Record[0]); | 
 | 1208 |       if (FnTy == 0) return Error("Invalid CE_BLOCKADDRESS record"); | 
 | 1209 |       Function *Fn = | 
 | 1210 |         dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); | 
 | 1211 |       if (Fn == 0) return Error("Invalid CE_BLOCKADDRESS record"); | 
 | 1212 |        | 
 | 1213 |       GlobalVariable *FwdRef = new GlobalVariable(*Fn->getParent(), | 
 | 1214 |                                                   Type::getInt8Ty(Context), | 
 | 1215 |                                             false, GlobalValue::InternalLinkage, | 
 | 1216 |                                                   0, ""); | 
 | 1217 |       BlockAddrFwdRefs[Fn].push_back(std::make_pair(Record[2], FwdRef)); | 
 | 1218 |       V = FwdRef; | 
 | 1219 |       break; | 
 | 1220 |     }   | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1221 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1222 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1223 |     ValueList.AssignValue(V, NextCstNo); | 
| Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 1224 |     ++NextCstNo; | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1225 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1226 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 1227 |   if (NextCstNo != ValueList.size()) | 
 | 1228 |     return Error("Invalid constant reference!"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1229 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 1230 |   if (Stream.ReadBlockEnd()) | 
 | 1231 |     return Error("Error at end of constants block"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1232 |  | 
| Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 1233 |   // Once all the constants have been read, go through and resolve forward | 
 | 1234 |   // references. | 
 | 1235 |   ValueList.ResolveConstantForwardRefs(); | 
 | 1236 |   return false; | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1237 | } | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1238 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1239 | /// RememberAndSkipFunctionBody - When we see the block for a function body, | 
 | 1240 | /// remember where it is and then skip it.  This lets us lazily deserialize the | 
 | 1241 | /// functions. | 
 | 1242 | bool BitcodeReader::RememberAndSkipFunctionBody() { | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1243 |   // Get the function we are talking about. | 
 | 1244 |   if (FunctionsWithBodies.empty()) | 
 | 1245 |     return Error("Insufficient function protos"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1246 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1247 |   Function *Fn = FunctionsWithBodies.back(); | 
 | 1248 |   FunctionsWithBodies.pop_back(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1249 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1250 |   // Save the current stream state. | 
 | 1251 |   uint64_t CurBit = Stream.GetCurrentBitNo(); | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 1252 |   DeferredFunctionInfo[Fn] = CurBit; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1253 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1254 |   // Skip over the function block for now. | 
 | 1255 |   if (Stream.SkipBlock()) | 
 | 1256 |     return Error("Malformed block record"); | 
 | 1257 |   return false; | 
 | 1258 | } | 
 | 1259 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 1260 | bool BitcodeReader::ParseModule() { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 1261 |   if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1262 |     return Error("Malformed block record"); | 
 | 1263 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1264 |   SmallVector<uint64_t, 64> Record; | 
 | 1265 |   std::vector<std::string> SectionTable; | 
| Gordon Henriksen | 5eca075 | 2008-08-17 18:44:35 +0000 | [diff] [blame] | 1266 |   std::vector<std::string> GCTable; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1267 |  | 
 | 1268 |   // Read all the records for this module. | 
 | 1269 |   while (!Stream.AtEndOfStream()) { | 
 | 1270 |     unsigned Code = Stream.ReadCode(); | 
| Chris Lattner | e84bcb9 | 2007-04-24 00:21:45 +0000 | [diff] [blame] | 1271 |     if (Code == bitc::END_BLOCK) { | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1272 |       if (Stream.ReadBlockEnd()) | 
 | 1273 |         return Error("Error at end of module block"); | 
 | 1274 |  | 
 | 1275 |       // Patch the initializers for globals and aliases up. | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 1276 |       ResolveGlobalAndAliasInits(); | 
 | 1277 |       if (!GlobalInits.empty() || !AliasInits.empty()) | 
| Chris Lattner | e84bcb9 | 2007-04-24 00:21:45 +0000 | [diff] [blame] | 1278 |         return Error("Malformed global initializer set"); | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1279 |       if (!FunctionsWithBodies.empty()) | 
 | 1280 |         return Error("Too few function bodies found"); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1281 |  | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 1282 |       // Look for intrinsic functions which need to be upgraded at some point | 
 | 1283 |       for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); | 
 | 1284 |            FI != FE; ++FI) { | 
| Evan Cheng | f9b83fc | 2007-12-17 22:33:23 +0000 | [diff] [blame] | 1285 |         Function* NewFn; | 
 | 1286 |         if (UpgradeIntrinsicFunction(FI, NewFn)) | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 1287 |           UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); | 
 | 1288 |       } | 
 | 1289 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1290 |       // Force deallocation of memory for these vectors to favor the client that | 
 | 1291 |       // want lazy deserialization. | 
 | 1292 |       std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); | 
 | 1293 |       std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); | 
 | 1294 |       std::vector<Function*>().swap(FunctionsWithBodies); | 
| Chris Lattner | f66d20d | 2007-04-24 18:15:21 +0000 | [diff] [blame] | 1295 |       return false; | 
| Chris Lattner | e84bcb9 | 2007-04-24 00:21:45 +0000 | [diff] [blame] | 1296 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1297 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1298 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 1299 |       switch (Stream.ReadSubBlockID()) { | 
 | 1300 |       default:  // Skip unknown content. | 
 | 1301 |         if (Stream.SkipBlock()) | 
 | 1302 |           return Error("Malformed block record"); | 
 | 1303 |         break; | 
| Chris Lattner | 3f79980 | 2007-05-05 18:57:30 +0000 | [diff] [blame] | 1304 |       case bitc::BLOCKINFO_BLOCK_ID: | 
 | 1305 |         if (Stream.ReadBlockInfoBlock()) | 
 | 1306 |           return Error("Malformed BlockInfoBlock"); | 
 | 1307 |         break; | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 1308 |       case bitc::PARAMATTR_BLOCK_ID: | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 1309 |         if (ParseAttributeBlock()) | 
| Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 1310 |           return true; | 
 | 1311 |         break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1312 |       case bitc::TYPE_BLOCK_ID: | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 1313 |         if (ParseTypeTable()) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1314 |           return true; | 
 | 1315 |         break; | 
 | 1316 |       case bitc::TYPE_SYMTAB_BLOCK_ID: | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 1317 |         if (ParseTypeSymbolTable()) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1318 |           return true; | 
 | 1319 |         break; | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 1320 |       case bitc::VALUE_SYMTAB_BLOCK_ID: | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 1321 |         if (ParseValueSymbolTable()) | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 1322 |           return true; | 
 | 1323 |         break; | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1324 |       case bitc::CONSTANTS_BLOCK_ID: | 
| Chris Lattner | 8669714 | 2007-05-01 05:01:34 +0000 | [diff] [blame] | 1325 |         if (ParseConstants() || ResolveGlobalAndAliasInits()) | 
| Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 1326 |           return true; | 
 | 1327 |         break; | 
| Devang Patel | e54abc9 | 2009-07-22 17:43:22 +0000 | [diff] [blame] | 1328 |       case bitc::METADATA_BLOCK_ID: | 
 | 1329 |         if (ParseMetadata()) | 
 | 1330 |           return true; | 
 | 1331 |         break; | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1332 |       case bitc::FUNCTION_BLOCK_ID: | 
 | 1333 |         // If this is the first function body we've seen, reverse the | 
 | 1334 |         // FunctionsWithBodies list. | 
 | 1335 |         if (!HasReversedFunctionsWithBodies) { | 
 | 1336 |           std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); | 
 | 1337 |           HasReversedFunctionsWithBodies = true; | 
 | 1338 |         } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1339 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1340 |         if (RememberAndSkipFunctionBody()) | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1341 |           return true; | 
 | 1342 |         break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1343 |       } | 
 | 1344 |       continue; | 
 | 1345 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1346 |  | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 1347 |     if (Code == bitc::DEFINE_ABBREV) { | 
| Chris Lattner | d127c1b | 2007-04-23 18:58:34 +0000 | [diff] [blame] | 1348 |       Stream.ReadAbbrevRecord(); | 
 | 1349 |       continue; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1350 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1351 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1352 |     // Read a record. | 
 | 1353 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 1354 |     default: break;  // Default behavior, ignore unknown content. | 
 | 1355 |     case bitc::MODULE_CODE_VERSION:  // VERSION: [version#] | 
 | 1356 |       if (Record.size() < 1) | 
 | 1357 |         return Error("Malformed MODULE_CODE_VERSION"); | 
 | 1358 |       // Only version #0 is supported so far. | 
 | 1359 |       if (Record[0] != 0) | 
 | 1360 |         return Error("Unknown bitstream version!"); | 
 | 1361 |       break; | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1362 |     case bitc::MODULE_CODE_TRIPLE: {  // TRIPLE: [strchr x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1363 |       std::string S; | 
 | 1364 |       if (ConvertToString(Record, 0, S)) | 
 | 1365 |         return Error("Invalid MODULE_CODE_TRIPLE record"); | 
 | 1366 |       TheModule->setTargetTriple(S); | 
 | 1367 |       break; | 
 | 1368 |     } | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1369 |     case bitc::MODULE_CODE_DATALAYOUT: {  // DATALAYOUT: [strchr x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1370 |       std::string S; | 
 | 1371 |       if (ConvertToString(Record, 0, S)) | 
 | 1372 |         return Error("Invalid MODULE_CODE_DATALAYOUT record"); | 
 | 1373 |       TheModule->setDataLayout(S); | 
 | 1374 |       break; | 
 | 1375 |     } | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1376 |     case bitc::MODULE_CODE_ASM: {  // ASM: [strchr x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1377 |       std::string S; | 
 | 1378 |       if (ConvertToString(Record, 0, S)) | 
 | 1379 |         return Error("Invalid MODULE_CODE_ASM record"); | 
 | 1380 |       TheModule->setModuleInlineAsm(S); | 
 | 1381 |       break; | 
 | 1382 |     } | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1383 |     case bitc::MODULE_CODE_DEPLIB: {  // DEPLIB: [strchr x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1384 |       std::string S; | 
 | 1385 |       if (ConvertToString(Record, 0, S)) | 
 | 1386 |         return Error("Invalid MODULE_CODE_DEPLIB record"); | 
 | 1387 |       TheModule->addLibrary(S); | 
 | 1388 |       break; | 
 | 1389 |     } | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1390 |     case bitc::MODULE_CODE_SECTIONNAME: {  // SECTIONNAME: [strchr x N] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1391 |       std::string S; | 
 | 1392 |       if (ConvertToString(Record, 0, S)) | 
 | 1393 |         return Error("Invalid MODULE_CODE_SECTIONNAME record"); | 
 | 1394 |       SectionTable.push_back(S); | 
 | 1395 |       break; | 
 | 1396 |     } | 
| Gordon Henriksen | 5eca075 | 2008-08-17 18:44:35 +0000 | [diff] [blame] | 1397 |     case bitc::MODULE_CODE_GCNAME: {  // SECTIONNAME: [strchr x N] | 
| Gordon Henriksen | 80a75bf | 2007-12-10 03:18:06 +0000 | [diff] [blame] | 1398 |       std::string S; | 
 | 1399 |       if (ConvertToString(Record, 0, S)) | 
| Gordon Henriksen | 5eca075 | 2008-08-17 18:44:35 +0000 | [diff] [blame] | 1400 |         return Error("Invalid MODULE_CODE_GCNAME record"); | 
 | 1401 |       GCTable.push_back(S); | 
| Gordon Henriksen | 80a75bf | 2007-12-10 03:18:06 +0000 | [diff] [blame] | 1402 |       break; | 
 | 1403 |     } | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 1404 |     // GLOBALVAR: [pointer type, isconst, initid, | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1405 |     //             linkage, alignment, section, visibility, threadlocal] | 
 | 1406 |     case bitc::MODULE_CODE_GLOBALVAR: { | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 1407 |       if (Record.size() < 6) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1408 |         return Error("Invalid MODULE_CODE_GLOBALVAR record"); | 
 | 1409 |       const Type *Ty = getTypeByID(Record[0]); | 
 | 1410 |       if (!isa<PointerType>(Ty)) | 
 | 1411 |         return Error("Global not a pointer type!"); | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 1412 |       unsigned AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1413 |       Ty = cast<PointerType>(Ty)->getElementType(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1414 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1415 |       bool isConstant = Record[1]; | 
 | 1416 |       GlobalValue::LinkageTypes Linkage = GetDecodedLinkage(Record[3]); | 
 | 1417 |       unsigned Alignment = (1 << Record[4]) >> 1; | 
 | 1418 |       std::string Section; | 
 | 1419 |       if (Record[5]) { | 
 | 1420 |         if (Record[5]-1 >= SectionTable.size()) | 
 | 1421 |           return Error("Invalid section ID"); | 
 | 1422 |         Section = SectionTable[Record[5]-1]; | 
 | 1423 |       } | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 1424 |       GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; | 
| Chris Lattner | 5f32c01 | 2007-05-06 19:27:46 +0000 | [diff] [blame] | 1425 |       if (Record.size() > 6) | 
 | 1426 |         Visibility = GetDecodedVisibility(Record[6]); | 
| Chris Lattner | 36d5e7d | 2007-04-23 16:04:05 +0000 | [diff] [blame] | 1427 |       bool isThreadLocal = false; | 
| Chris Lattner | 5f32c01 | 2007-05-06 19:27:46 +0000 | [diff] [blame] | 1428 |       if (Record.size() > 7) | 
 | 1429 |         isThreadLocal = Record[7]; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1430 |  | 
 | 1431 |       GlobalVariable *NewGV = | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1432 |         new GlobalVariable(*TheModule, Ty, isConstant, Linkage, 0, "", 0, | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 1433 |                            isThreadLocal, AddressSpace); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1434 |       NewGV->setAlignment(Alignment); | 
 | 1435 |       if (!Section.empty()) | 
 | 1436 |         NewGV->setSection(Section); | 
 | 1437 |       NewGV->setVisibility(Visibility); | 
 | 1438 |       NewGV->setThreadLocal(isThreadLocal); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1439 |  | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 1440 |       ValueList.push_back(NewGV); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1441 |  | 
| Chris Lattner | 6dbfd7b | 2007-04-24 00:18:21 +0000 | [diff] [blame] | 1442 |       // Remember which value to use for the global initializer. | 
 | 1443 |       if (unsigned InitID = Record[2]) | 
 | 1444 |         GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1445 |       break; | 
 | 1446 |     } | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 1447 |     // FUNCTION:  [type, callingconv, isproto, linkage, paramattr, | 
| Gordon Henriksen | 5eca075 | 2008-08-17 18:44:35 +0000 | [diff] [blame] | 1448 |     //             alignment, section, visibility, gc] | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1449 |     case bitc::MODULE_CODE_FUNCTION: { | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 1450 |       if (Record.size() < 8) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1451 |         return Error("Invalid MODULE_CODE_FUNCTION record"); | 
 | 1452 |       const Type *Ty = getTypeByID(Record[0]); | 
 | 1453 |       if (!isa<PointerType>(Ty)) | 
 | 1454 |         return Error("Function not a pointer type!"); | 
 | 1455 |       const FunctionType *FTy = | 
 | 1456 |         dyn_cast<FunctionType>(cast<PointerType>(Ty)->getElementType()); | 
 | 1457 |       if (!FTy) | 
 | 1458 |         return Error("Function not a pointer to function type!"); | 
 | 1459 |  | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1460 |       Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, | 
 | 1461 |                                         "", TheModule); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1462 |  | 
| Sandeep Patel | 65c3c8f | 2009-09-02 08:44:58 +0000 | [diff] [blame] | 1463 |       Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1464 |       bool isProto = Record[2]; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1465 |       Func->setLinkage(GetDecodedLinkage(Record[3])); | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 1466 |       Func->setAttributes(getAttributes(Record[4])); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1467 |  | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 1468 |       Func->setAlignment((1 << Record[5]) >> 1); | 
 | 1469 |       if (Record[6]) { | 
 | 1470 |         if (Record[6]-1 >= SectionTable.size()) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1471 |           return Error("Invalid section ID"); | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 1472 |         Func->setSection(SectionTable[Record[6]-1]); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1473 |       } | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 1474 |       Func->setVisibility(GetDecodedVisibility(Record[7])); | 
| Gordon Henriksen | 80a75bf | 2007-12-10 03:18:06 +0000 | [diff] [blame] | 1475 |       if (Record.size() > 8 && Record[8]) { | 
| Gordon Henriksen | 5eca075 | 2008-08-17 18:44:35 +0000 | [diff] [blame] | 1476 |         if (Record[8]-1 > GCTable.size()) | 
 | 1477 |           return Error("Invalid GC ID"); | 
 | 1478 |         Func->setGC(GCTable[Record[8]-1].c_str()); | 
| Gordon Henriksen | 80a75bf | 2007-12-10 03:18:06 +0000 | [diff] [blame] | 1479 |       } | 
| Chris Lattner | 0b2482a | 2007-04-23 21:26:05 +0000 | [diff] [blame] | 1480 |       ValueList.push_back(Func); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1481 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1482 |       // If this is a function with a body, remember the prototype we are | 
 | 1483 |       // creating now, so that we can match up the body with them later. | 
 | 1484 |       if (!isProto) | 
 | 1485 |         FunctionsWithBodies.push_back(Func); | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1486 |       break; | 
 | 1487 |     } | 
| Anton Korobeynikov | 91342d8 | 2008-03-12 00:49:19 +0000 | [diff] [blame] | 1488 |     // ALIAS: [alias type, aliasee val#, linkage] | 
| Anton Korobeynikov | f8342b9 | 2008-03-11 21:40:17 +0000 | [diff] [blame] | 1489 |     // ALIAS: [alias type, aliasee val#, linkage, visibility] | 
| Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 1490 |     case bitc::MODULE_CODE_ALIAS: { | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 1491 |       if (Record.size() < 3) | 
 | 1492 |         return Error("Invalid MODULE_ALIAS record"); | 
 | 1493 |       const Type *Ty = getTypeByID(Record[0]); | 
 | 1494 |       if (!isa<PointerType>(Ty)) | 
 | 1495 |         return Error("Function not a pointer type!"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1496 |  | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 1497 |       GlobalAlias *NewGA = new GlobalAlias(Ty, GetDecodedLinkage(Record[2]), | 
 | 1498 |                                            "", 0, TheModule); | 
| Anton Korobeynikov | 91342d8 | 2008-03-12 00:49:19 +0000 | [diff] [blame] | 1499 |       // Old bitcode files didn't have visibility field. | 
 | 1500 |       if (Record.size() > 3) | 
 | 1501 |         NewGA->setVisibility(GetDecodedVisibility(Record[3])); | 
| Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 1502 |       ValueList.push_back(NewGA); | 
 | 1503 |       AliasInits.push_back(std::make_pair(NewGA, Record[1])); | 
 | 1504 |       break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1505 |     } | 
| Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 1506 |     /// MODULE_CODE_PURGEVALS: [numvals] | 
 | 1507 |     case bitc::MODULE_CODE_PURGEVALS: | 
 | 1508 |       // Trim down the value list to the specified size. | 
 | 1509 |       if (Record.size() < 1 || Record[0] > ValueList.size()) | 
 | 1510 |         return Error("Invalid MODULE_PURGEVALS record"); | 
 | 1511 |       ValueList.shrinkTo(Record[0]); | 
 | 1512 |       break; | 
 | 1513 |     } | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1514 |     Record.clear(); | 
 | 1515 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1516 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1517 |   return Error("Premature end of bitstream"); | 
 | 1518 | } | 
 | 1519 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 1520 | bool BitcodeReader::ParseBitcodeInto(Module *M) { | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1521 |   TheModule = 0; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1522 |  | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 1523 |   if (Buffer->getBufferSize() & 3) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1524 |     return Error("Bitcode stream should be a multiple of 4 bytes in length"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1525 |  | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 1526 |   unsigned char *BufPtr = (unsigned char *)Buffer->getBufferStart(); | 
| Chris Lattner | 6fa6a32 | 2008-07-09 05:14:23 +0000 | [diff] [blame] | 1527 |   unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1528 |  | 
| Chris Lattner | 6fa6a32 | 2008-07-09 05:14:23 +0000 | [diff] [blame] | 1529 |   // If we have a wrapper header, parse it and ignore the non-bc file contents. | 
 | 1530 |   // The magic number is 0x0B17C0DE stored in little endian. | 
| Chris Lattner | e2a466b | 2009-04-06 20:54:32 +0000 | [diff] [blame] | 1531 |   if (isBitcodeWrapper(BufPtr, BufEnd)) | 
 | 1532 |     if (SkipBitcodeWrapperHeader(BufPtr, BufEnd)) | 
| Chris Lattner | 6fa6a32 | 2008-07-09 05:14:23 +0000 | [diff] [blame] | 1533 |       return Error("Invalid bitcode wrapper header"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1534 |  | 
| Chris Lattner | 962dde3 | 2009-04-26 20:59:02 +0000 | [diff] [blame] | 1535 |   StreamFile.init(BufPtr, BufEnd); | 
 | 1536 |   Stream.init(StreamFile); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1537 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1538 |   // Sniff for the signature. | 
 | 1539 |   if (Stream.Read(8) != 'B' || | 
 | 1540 |       Stream.Read(8) != 'C' || | 
 | 1541 |       Stream.Read(4) != 0x0 || | 
 | 1542 |       Stream.Read(4) != 0xC || | 
 | 1543 |       Stream.Read(4) != 0xE || | 
 | 1544 |       Stream.Read(4) != 0xD) | 
 | 1545 |     return Error("Invalid bitcode signature"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1546 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1547 |   // We expect a number of well-defined blocks, though we don't necessarily | 
 | 1548 |   // need to understand them all. | 
 | 1549 |   while (!Stream.AtEndOfStream()) { | 
 | 1550 |     unsigned Code = Stream.ReadCode(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1551 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1552 |     if (Code != bitc::ENTER_SUBBLOCK) | 
 | 1553 |       return Error("Invalid record at top-level"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1554 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1555 |     unsigned BlockID = Stream.ReadSubBlockID(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1556 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1557 |     // We only know the MODULE subblock ID. | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 1558 |     switch (BlockID) { | 
 | 1559 |     case bitc::BLOCKINFO_BLOCK_ID: | 
 | 1560 |       if (Stream.ReadBlockInfoBlock()) | 
 | 1561 |         return Error("Malformed BlockInfoBlock"); | 
 | 1562 |       break; | 
 | 1563 |     case bitc::MODULE_BLOCK_ID: | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 1564 |       // Reject multiple MODULE_BLOCK's in a single bitstream. | 
 | 1565 |       if (TheModule) | 
 | 1566 |         return Error("Multiple MODULE_BLOCKs in same stream"); | 
 | 1567 |       TheModule = M; | 
 | 1568 |       if (ParseModule()) | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1569 |         return true; | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 1570 |       break; | 
 | 1571 |     default: | 
 | 1572 |       if (Stream.SkipBlock()) | 
 | 1573 |         return Error("Malformed block record"); | 
 | 1574 |       break; | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1575 |     } | 
 | 1576 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1577 |  | 
| Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1578 |   return false; | 
 | 1579 | } | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 1580 |  | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1581 | /// ParseMetadataAttachment - Parse metadata attachments. | 
 | 1582 | bool BitcodeReader::ParseMetadataAttachment() { | 
 | 1583 |   if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) | 
 | 1584 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1585 |  | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1586 |   SmallVector<uint64_t, 64> Record; | 
 | 1587 |   while(1) { | 
 | 1588 |     unsigned Code = Stream.ReadCode(); | 
 | 1589 |     if (Code == bitc::END_BLOCK) { | 
 | 1590 |       if (Stream.ReadBlockEnd()) | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1591 |         return Error("Error at end of PARAMATTR block"); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1592 |       break; | 
 | 1593 |     } | 
 | 1594 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 1595 |       Stream.ReadAbbrevRecord(); | 
 | 1596 |       continue; | 
 | 1597 |     } | 
 | 1598 |     // Read a metadata attachment record. | 
 | 1599 |     Record.clear(); | 
 | 1600 |     switch (Stream.ReadRecord(Code, Record)) { | 
 | 1601 |     default:  // Default behavior: ignore. | 
 | 1602 |       break; | 
 | 1603 |     case bitc::METADATA_ATTACHMENT: { | 
 | 1604 |       unsigned RecordLength = Record.size(); | 
 | 1605 |       if (Record.empty() || (RecordLength - 1) % 2 == 1) | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1606 |         return Error ("Invalid METADATA_ATTACHMENT reader!"); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1607 |       Instruction *Inst = InstructionList[Record[0]]; | 
 | 1608 |       for (unsigned i = 1; i != RecordLength; i = i+2) { | 
| Devang Patel | a214840 | 2009-09-28 21:14:55 +0000 | [diff] [blame] | 1609 |         unsigned Kind = Record[i]; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1610 |         Value *Node = MDValueList.getValueFwdRef(Record[i+1]); | 
| Chris Lattner | 3990b12 | 2009-12-28 23:41:32 +0000 | [diff] [blame] | 1611 |         Inst->setMetadata(Kind, cast<MDNode>(Node)); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1612 |       } | 
 | 1613 |       break; | 
 | 1614 |     } | 
 | 1615 |     } | 
 | 1616 |   } | 
 | 1617 |   return false; | 
 | 1618 | } | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 1619 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1620 | /// ParseFunctionBody - Lazily parse the specified function body block. | 
 | 1621 | bool BitcodeReader::ParseFunctionBody(Function *F) { | 
| Chris Lattner | e17b658 | 2007-05-05 00:17:00 +0000 | [diff] [blame] | 1622 |   if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1623 |     return Error("Malformed block record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1624 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1625 |   unsigned ModuleValueListSize = ValueList.size(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1626 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1627 |   // Add all the function arguments to the value table. | 
 | 1628 |   for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 
 | 1629 |     ValueList.push_back(I); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1630 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1631 |   unsigned NextValueNo = ValueList.size(); | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 1632 |   BasicBlock *CurBB = 0; | 
 | 1633 |   unsigned CurBBNo = 0; | 
 | 1634 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1635 |   // Read all the records. | 
 | 1636 |   SmallVector<uint64_t, 64> Record; | 
 | 1637 |   while (1) { | 
 | 1638 |     unsigned Code = Stream.ReadCode(); | 
 | 1639 |     if (Code == bitc::END_BLOCK) { | 
 | 1640 |       if (Stream.ReadBlockEnd()) | 
 | 1641 |         return Error("Error at end of function block"); | 
 | 1642 |       break; | 
 | 1643 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1644 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1645 |     if (Code == bitc::ENTER_SUBBLOCK) { | 
 | 1646 |       switch (Stream.ReadSubBlockID()) { | 
 | 1647 |       default:  // Skip unknown content. | 
 | 1648 |         if (Stream.SkipBlock()) | 
 | 1649 |           return Error("Malformed block record"); | 
 | 1650 |         break; | 
 | 1651 |       case bitc::CONSTANTS_BLOCK_ID: | 
 | 1652 |         if (ParseConstants()) return true; | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1653 |         NextValueNo = ValueList.size(); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1654 |         break; | 
 | 1655 |       case bitc::VALUE_SYMTAB_BLOCK_ID: | 
 | 1656 |         if (ParseValueSymbolTable()) return true; | 
 | 1657 |         break; | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1658 |       case bitc::METADATA_ATTACHMENT_ID: | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1659 |         if (ParseMetadataAttachment()) return true; | 
 | 1660 |         break; | 
| Victor Hernandez | fab9e99c | 2010-01-13 19:34:08 +0000 | [diff] [blame] | 1661 |       case bitc::METADATA_BLOCK_ID: | 
 | 1662 |         if (ParseMetadata()) return true; | 
 | 1663 |         break; | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1664 |       } | 
 | 1665 |       continue; | 
 | 1666 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1667 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1668 |     if (Code == bitc::DEFINE_ABBREV) { | 
 | 1669 |       Stream.ReadAbbrevRecord(); | 
 | 1670 |       continue; | 
 | 1671 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1672 |  | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1673 |     // Read a record. | 
 | 1674 |     Record.clear(); | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1675 |     Instruction *I = 0; | 
| Dan Gohman | 1224c38 | 2009-07-20 21:19:07 +0000 | [diff] [blame] | 1676 |     unsigned BitCode = Stream.ReadRecord(Code, Record); | 
 | 1677 |     switch (BitCode) { | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1678 |     default: // Default behavior: reject | 
 | 1679 |       return Error("Unknown instruction"); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1680 |     case bitc::FUNC_CODE_DECLAREBLOCKS:     // DECLAREBLOCKS: [nblocks] | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1681 |       if (Record.size() < 1 || Record[0] == 0) | 
 | 1682 |         return Error("Invalid DECLAREBLOCKS record"); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1683 |       // Create all the basic blocks for the function. | 
| Chris Lattner | f61e645 | 2007-05-03 22:09:51 +0000 | [diff] [blame] | 1684 |       FunctionBBs.resize(Record[0]); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1685 |       for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1686 |         FunctionBBs[i] = BasicBlock::Create(Context, "", F); | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 1687 |       CurBB = FunctionBBs[0]; | 
 | 1688 |       continue; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1689 |  | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1690 |     case bitc::FUNC_CODE_INST_BINOP: {    // BINOP: [opval, ty, opval, opcode] | 
 | 1691 |       unsigned OpNum = 0; | 
 | 1692 |       Value *LHS, *RHS; | 
 | 1693 |       if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || | 
 | 1694 |           getValue(Record, OpNum, LHS->getType(), RHS) || | 
| Dan Gohman | 1224c38 | 2009-07-20 21:19:07 +0000 | [diff] [blame] | 1695 |           OpNum+1 > Record.size()) | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1696 |         return Error("Invalid BINOP record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1697 |  | 
| Dan Gohman | 1224c38 | 2009-07-20 21:19:07 +0000 | [diff] [blame] | 1698 |       int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1699 |       if (Opc == -1) return Error("Invalid BINOP record"); | 
| Gabor Greif | 7cbd8a3 | 2008-05-16 19:29:10 +0000 | [diff] [blame] | 1700 |       I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1701 |       InstructionList.push_back(I); | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1702 |       if (OpNum < Record.size()) { | 
 | 1703 |         if (Opc == Instruction::Add || | 
 | 1704 |             Opc == Instruction::Sub || | 
 | 1705 |             Opc == Instruction::Mul) { | 
| Dan Gohman | 26793ed | 2010-01-25 21:55:39 +0000 | [diff] [blame] | 1706 |           if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1707 |             cast<BinaryOperator>(I)->setHasNoSignedWrap(true); | 
| Dan Gohman | 26793ed | 2010-01-25 21:55:39 +0000 | [diff] [blame] | 1708 |           if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1709 |             cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); | 
 | 1710 |         } else if (Opc == Instruction::SDiv) { | 
| Dan Gohman | 26793ed | 2010-01-25 21:55:39 +0000 | [diff] [blame] | 1711 |           if (Record[OpNum] & (1 << bitc::SDIV_EXACT)) | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1712 |             cast<BinaryOperator>(I)->setIsExact(true); | 
 | 1713 |         } | 
 | 1714 |       } | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 1715 |       break; | 
 | 1716 |     } | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1717 |     case bitc::FUNC_CODE_INST_CAST: {    // CAST: [opval, opty, destty, castopc] | 
 | 1718 |       unsigned OpNum = 0; | 
 | 1719 |       Value *Op; | 
 | 1720 |       if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 
 | 1721 |           OpNum+2 != Record.size()) | 
 | 1722 |         return Error("Invalid CAST record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1723 |  | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1724 |       const Type *ResTy = getTypeByID(Record[OpNum]); | 
 | 1725 |       int Opc = GetDecodedCastOpcode(Record[OpNum+1]); | 
 | 1726 |       if (Opc == -1 || ResTy == 0) | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 1727 |         return Error("Invalid CAST record"); | 
| Gabor Greif | 7cbd8a3 | 2008-05-16 19:29:10 +0000 | [diff] [blame] | 1728 |       I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1729 |       InstructionList.push_back(I); | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 1730 |       break; | 
 | 1731 |     } | 
| Dan Gohman | dd8004d | 2009-07-27 21:53:46 +0000 | [diff] [blame] | 1732 |     case bitc::FUNC_CODE_INST_INBOUNDS_GEP: | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 1733 |     case bitc::FUNC_CODE_INST_GEP: { // GEP: [n x operands] | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 1734 |       unsigned OpNum = 0; | 
 | 1735 |       Value *BasePtr; | 
 | 1736 |       if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1737 |         return Error("Invalid GEP record"); | 
 | 1738 |  | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1739 |       SmallVector<Value*, 16> GEPIdx; | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 1740 |       while (OpNum != Record.size()) { | 
 | 1741 |         Value *Op; | 
 | 1742 |         if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1743 |           return Error("Invalid GEP record"); | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 1744 |         GEPIdx.push_back(Op); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1745 |       } | 
 | 1746 |  | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1747 |       I = GetElementPtrInst::Create(BasePtr, GEPIdx.begin(), GEPIdx.end()); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1748 |       InstructionList.push_back(I); | 
| Dan Gohman | dd8004d | 2009-07-27 21:53:46 +0000 | [diff] [blame] | 1749 |       if (BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP) | 
| Dan Gohman | f8dbee7 | 2009-09-07 23:54:19 +0000 | [diff] [blame] | 1750 |         cast<GetElementPtrInst>(I)->setIsInBounds(true); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1751 |       break; | 
 | 1752 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1753 |  | 
| Dan Gohman | 81a0c0b | 2008-05-31 00:58:22 +0000 | [diff] [blame] | 1754 |     case bitc::FUNC_CODE_INST_EXTRACTVAL: { | 
 | 1755 |                                        // EXTRACTVAL: [opty, opval, n x indices] | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1756 |       unsigned OpNum = 0; | 
 | 1757 |       Value *Agg; | 
 | 1758 |       if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) | 
 | 1759 |         return Error("Invalid EXTRACTVAL record"); | 
 | 1760 |  | 
| Dan Gohman | 81a0c0b | 2008-05-31 00:58:22 +0000 | [diff] [blame] | 1761 |       SmallVector<unsigned, 4> EXTRACTVALIdx; | 
 | 1762 |       for (unsigned RecSize = Record.size(); | 
 | 1763 |            OpNum != RecSize; ++OpNum) { | 
 | 1764 |         uint64_t Index = Record[OpNum]; | 
 | 1765 |         if ((unsigned)Index != Index) | 
 | 1766 |           return Error("Invalid EXTRACTVAL index"); | 
 | 1767 |         EXTRACTVALIdx.push_back((unsigned)Index); | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1768 |       } | 
 | 1769 |  | 
 | 1770 |       I = ExtractValueInst::Create(Agg, | 
 | 1771 |                                    EXTRACTVALIdx.begin(), EXTRACTVALIdx.end()); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1772 |       InstructionList.push_back(I); | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1773 |       break; | 
 | 1774 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1775 |  | 
| Dan Gohman | 81a0c0b | 2008-05-31 00:58:22 +0000 | [diff] [blame] | 1776 |     case bitc::FUNC_CODE_INST_INSERTVAL: { | 
 | 1777 |                            // INSERTVAL: [opty, opval, opty, opval, n x indices] | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1778 |       unsigned OpNum = 0; | 
 | 1779 |       Value *Agg; | 
 | 1780 |       if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) | 
 | 1781 |         return Error("Invalid INSERTVAL record"); | 
 | 1782 |       Value *Val; | 
 | 1783 |       if (getValueTypePair(Record, OpNum, NextValueNo, Val)) | 
 | 1784 |         return Error("Invalid INSERTVAL record"); | 
 | 1785 |  | 
| Dan Gohman | 81a0c0b | 2008-05-31 00:58:22 +0000 | [diff] [blame] | 1786 |       SmallVector<unsigned, 4> INSERTVALIdx; | 
 | 1787 |       for (unsigned RecSize = Record.size(); | 
 | 1788 |            OpNum != RecSize; ++OpNum) { | 
 | 1789 |         uint64_t Index = Record[OpNum]; | 
 | 1790 |         if ((unsigned)Index != Index) | 
 | 1791 |           return Error("Invalid INSERTVAL index"); | 
 | 1792 |         INSERTVALIdx.push_back((unsigned)Index); | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1793 |       } | 
 | 1794 |  | 
 | 1795 |       I = InsertValueInst::Create(Agg, Val, | 
 | 1796 |                                   INSERTVALIdx.begin(), INSERTVALIdx.end()); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1797 |       InstructionList.push_back(I); | 
| Dan Gohman | e4977cf | 2008-05-23 01:55:30 +0000 | [diff] [blame] | 1798 |       break; | 
 | 1799 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1800 |  | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1801 |     case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] | 
| Dan Gohman | fb2bbbe | 2008-09-16 01:01:33 +0000 | [diff] [blame] | 1802 |       // obsolete form of select | 
 | 1803 |       // handles select i1 ... in old bitcode | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1804 |       unsigned OpNum = 0; | 
 | 1805 |       Value *TrueVal, *FalseVal, *Cond; | 
 | 1806 |       if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || | 
 | 1807 |           getValue(Record, OpNum, TrueVal->getType(), FalseVal) || | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1808 |           getValue(Record, OpNum, Type::getInt1Ty(Context), Cond)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1809 |         return Error("Invalid SELECT record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1810 |  | 
| Dan Gohman | fb2bbbe | 2008-09-16 01:01:33 +0000 | [diff] [blame] | 1811 |       I = SelectInst::Create(Cond, TrueVal, FalseVal); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1812 |       InstructionList.push_back(I); | 
| Dan Gohman | fb2bbbe | 2008-09-16 01:01:33 +0000 | [diff] [blame] | 1813 |       break; | 
 | 1814 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1815 |  | 
| Dan Gohman | fb2bbbe | 2008-09-16 01:01:33 +0000 | [diff] [blame] | 1816 |     case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] | 
 | 1817 |       // new form of select | 
 | 1818 |       // handles select i1 or select [N x i1] | 
 | 1819 |       unsigned OpNum = 0; | 
 | 1820 |       Value *TrueVal, *FalseVal, *Cond; | 
 | 1821 |       if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || | 
 | 1822 |           getValue(Record, OpNum, TrueVal->getType(), FalseVal) || | 
 | 1823 |           getValueTypePair(Record, OpNum, NextValueNo, Cond)) | 
 | 1824 |         return Error("Invalid SELECT record"); | 
| Dan Gohman | f72fb67 | 2008-09-09 01:02:47 +0000 | [diff] [blame] | 1825 |  | 
 | 1826 |       // select condition can be either i1 or [N x i1] | 
| Dan Gohman | fb2bbbe | 2008-09-16 01:01:33 +0000 | [diff] [blame] | 1827 |       if (const VectorType* vector_type = | 
 | 1828 |           dyn_cast<const VectorType>(Cond->getType())) { | 
| Dan Gohman | f72fb67 | 2008-09-09 01:02:47 +0000 | [diff] [blame] | 1829 |         // expect <n x i1> | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1830 |         if (vector_type->getElementType() != Type::getInt1Ty(Context)) | 
| Dan Gohman | f72fb67 | 2008-09-09 01:02:47 +0000 | [diff] [blame] | 1831 |           return Error("Invalid SELECT condition type"); | 
 | 1832 |       } else { | 
 | 1833 |         // expect i1 | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1834 |         if (Cond->getType() != Type::getInt1Ty(Context)) | 
| Dan Gohman | f72fb67 | 2008-09-09 01:02:47 +0000 | [diff] [blame] | 1835 |           return Error("Invalid SELECT condition type"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1836 |       } | 
 | 1837 |  | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1838 |       I = SelectInst::Create(Cond, TrueVal, FalseVal); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1839 |       InstructionList.push_back(I); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1840 |       break; | 
 | 1841 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1842 |  | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1843 |     case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1844 |       unsigned OpNum = 0; | 
 | 1845 |       Value *Vec, *Idx; | 
 | 1846 |       if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1847 |           getValue(Record, OpNum, Type::getInt32Ty(Context), Idx)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1848 |         return Error("Invalid EXTRACTELT record"); | 
| Eric Christopher | a3500da | 2009-07-25 02:28:41 +0000 | [diff] [blame] | 1849 |       I = ExtractElementInst::Create(Vec, Idx); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1850 |       InstructionList.push_back(I); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1851 |       break; | 
 | 1852 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1853 |  | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1854 |     case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1855 |       unsigned OpNum = 0; | 
 | 1856 |       Value *Vec, *Elt, *Idx; | 
 | 1857 |       if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1858 |           getValue(Record, OpNum, | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1859 |                    cast<VectorType>(Vec->getType())->getElementType(), Elt) || | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1860 |           getValue(Record, OpNum, Type::getInt32Ty(Context), Idx)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1861 |         return Error("Invalid INSERTELT record"); | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1862 |       I = InsertElementInst::Create(Vec, Elt, Idx); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1863 |       InstructionList.push_back(I); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1864 |       break; | 
 | 1865 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1866 |  | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 1867 |     case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] | 
 | 1868 |       unsigned OpNum = 0; | 
 | 1869 |       Value *Vec1, *Vec2, *Mask; | 
 | 1870 |       if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || | 
 | 1871 |           getValue(Record, OpNum, Vec1->getType(), Vec2)) | 
 | 1872 |         return Error("Invalid SHUFFLEVEC record"); | 
 | 1873 |  | 
| Mon P Wang | aeb06d2 | 2008-11-10 04:46:22 +0000 | [diff] [blame] | 1874 |       if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1875 |         return Error("Invalid SHUFFLEVEC record"); | 
 | 1876 |       I = new ShuffleVectorInst(Vec1, Vec2, Mask); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1877 |       InstructionList.push_back(I); | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1878 |       break; | 
 | 1879 |     } | 
| Mon P Wang | aeb06d2 | 2008-11-10 04:46:22 +0000 | [diff] [blame] | 1880 |  | 
| Nick Lewycky | 7f6aa2b | 2009-07-08 03:04:38 +0000 | [diff] [blame] | 1881 |     case bitc::FUNC_CODE_INST_CMP:   // CMP: [opty, opval, opval, pred] | 
 | 1882 |       // Old form of ICmp/FCmp returning bool | 
 | 1883 |       // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were | 
 | 1884 |       // both legal on vectors but had different behaviour. | 
 | 1885 |     case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] | 
 | 1886 |       // FCmp/ICmp returning bool or vector of bool | 
 | 1887 |  | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 1888 |       unsigned OpNum = 0; | 
 | 1889 |       Value *LHS, *RHS; | 
 | 1890 |       if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || | 
 | 1891 |           getValue(Record, OpNum, LHS->getType(), RHS) || | 
 | 1892 |           OpNum+1 != Record.size()) | 
| Chris Lattner | 01ff65f | 2007-05-02 05:16:49 +0000 | [diff] [blame] | 1893 |         return Error("Invalid CMP record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1894 |  | 
| Duncan Sands | b0bc6c3 | 2010-02-15 16:12:20 +0000 | [diff] [blame^] | 1895 |       if (LHS->getType()->isFPOrFPVectorTy()) | 
| Dan Gohman | 1c8a23c | 2009-08-25 23:17:54 +0000 | [diff] [blame] | 1896 |         I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); | 
| Nick Lewycky | 7f6aa2b | 2009-07-08 03:04:38 +0000 | [diff] [blame] | 1897 |       else | 
| Dan Gohman | 1c8a23c | 2009-08-25 23:17:54 +0000 | [diff] [blame] | 1898 |         I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1899 |       InstructionList.push_back(I); | 
| Dan Gohman | f72fb67 | 2008-09-09 01:02:47 +0000 | [diff] [blame] | 1900 |       break; | 
 | 1901 |     } | 
| Nick Lewycky | 7f6aa2b | 2009-07-08 03:04:38 +0000 | [diff] [blame] | 1902 |  | 
| Devang Patel | 197be3d | 2008-02-22 02:49:49 +0000 | [diff] [blame] | 1903 |     case bitc::FUNC_CODE_INST_GETRESULT: { // GETRESULT: [ty, val, n] | 
 | 1904 |       if (Record.size() != 2) | 
 | 1905 |         return Error("Invalid GETRESULT record"); | 
 | 1906 |       unsigned OpNum = 0; | 
 | 1907 |       Value *Op; | 
 | 1908 |       getValueTypePair(Record, OpNum, NextValueNo, Op); | 
 | 1909 |       unsigned Index = Record[1]; | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1910 |       I = ExtractValueInst::Create(Op, Index); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1911 |       InstructionList.push_back(I); | 
| Devang Patel | 197be3d | 2008-02-22 02:49:49 +0000 | [diff] [blame] | 1912 |       break; | 
 | 1913 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1914 |  | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 1915 |     case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] | 
| Devang Patel | d9d99ff | 2008-02-26 01:29:32 +0000 | [diff] [blame] | 1916 |       { | 
 | 1917 |         unsigned Size = Record.size(); | 
 | 1918 |         if (Size == 0) { | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1919 |           I = ReturnInst::Create(Context); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1920 |           InstructionList.push_back(I); | 
| Devang Patel | d9d99ff | 2008-02-26 01:29:32 +0000 | [diff] [blame] | 1921 |           break; | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1922 |         } | 
| Devang Patel | d9d99ff | 2008-02-26 01:29:32 +0000 | [diff] [blame] | 1923 |  | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1924 |         unsigned OpNum = 0; | 
 | 1925 |         SmallVector<Value *,4> Vs; | 
 | 1926 |         do { | 
 | 1927 |           Value *Op = NULL; | 
 | 1928 |           if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 
 | 1929 |             return Error("Invalid RET record"); | 
 | 1930 |           Vs.push_back(Op); | 
 | 1931 |         } while(OpNum != Record.size()); | 
 | 1932 |  | 
 | 1933 |         const Type *ReturnType = F->getReturnType(); | 
 | 1934 |         if (Vs.size() > 1 || | 
 | 1935 |             (isa<StructType>(ReturnType) && | 
 | 1936 |              (Vs.empty() || Vs[0]->getType() != ReturnType))) { | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 1937 |           Value *RV = UndefValue::get(ReturnType); | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1938 |           for (unsigned i = 0, e = Vs.size(); i != e; ++i) { | 
 | 1939 |             I = InsertValueInst::Create(RV, Vs[i], i, "mrv"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1940 |             InstructionList.push_back(I); | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1941 |             CurBB->getInstList().push_back(I); | 
 | 1942 |             ValueList.AssignValue(I, NextValueNo++); | 
 | 1943 |             RV = I; | 
 | 1944 |           } | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1945 |           I = ReturnInst::Create(Context, RV); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1946 |           InstructionList.push_back(I); | 
| Devang Patel | d9d99ff | 2008-02-26 01:29:32 +0000 | [diff] [blame] | 1947 |           break; | 
 | 1948 |         } | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1949 |  | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1950 |         I = ReturnInst::Create(Context, Vs[0]); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1951 |         InstructionList.push_back(I); | 
| Dan Gohman | fc74abf | 2008-07-23 00:34:11 +0000 | [diff] [blame] | 1952 |         break; | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 1953 |       } | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1954 |     case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] | 
| Chris Lattner | f61e645 | 2007-05-03 22:09:51 +0000 | [diff] [blame] | 1955 |       if (Record.size() != 1 && Record.size() != 3) | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1956 |         return Error("Invalid BR record"); | 
 | 1957 |       BasicBlock *TrueDest = getBasicBlock(Record[0]); | 
 | 1958 |       if (TrueDest == 0) | 
 | 1959 |         return Error("Invalid BR record"); | 
 | 1960 |  | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1961 |       if (Record.size() == 1) { | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1962 |         I = BranchInst::Create(TrueDest); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1963 |         InstructionList.push_back(I); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1964 |       } | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1965 |       else { | 
 | 1966 |         BasicBlock *FalseDest = getBasicBlock(Record[1]); | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 1967 |         Value *Cond = getFnValueByID(Record[2], Type::getInt1Ty(Context)); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1968 |         if (FalseDest == 0 || Cond == 0) | 
 | 1969 |           return Error("Invalid BR record"); | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1970 |         I = BranchInst::Create(TrueDest, FalseDest, Cond); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1971 |         InstructionList.push_back(I); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1972 |       } | 
 | 1973 |       break; | 
 | 1974 |     } | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 1975 |     case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1976 |       if (Record.size() < 3 || (Record.size() & 1) == 0) | 
 | 1977 |         return Error("Invalid SWITCH record"); | 
 | 1978 |       const Type *OpTy = getTypeByID(Record[0]); | 
 | 1979 |       Value *Cond = getFnValueByID(Record[1], OpTy); | 
 | 1980 |       BasicBlock *Default = getBasicBlock(Record[2]); | 
 | 1981 |       if (OpTy == 0 || Cond == 0 || Default == 0) | 
 | 1982 |         return Error("Invalid SWITCH record"); | 
 | 1983 |       unsigned NumCases = (Record.size()-3)/2; | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 1984 |       SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 1985 |       InstructionList.push_back(SI); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1986 |       for (unsigned i = 0, e = NumCases; i != e; ++i) { | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 1987 |         ConstantInt *CaseVal = | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 1988 |           dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); | 
 | 1989 |         BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); | 
 | 1990 |         if (CaseVal == 0 || DestBB == 0) { | 
 | 1991 |           delete SI; | 
 | 1992 |           return Error("Invalid SWITCH record!"); | 
 | 1993 |         } | 
 | 1994 |         SI->addCase(CaseVal, DestBB); | 
 | 1995 |       } | 
 | 1996 |       I = SI; | 
 | 1997 |       break; | 
 | 1998 |     } | 
| Chris Lattner | ab21db7 | 2009-10-28 00:19:10 +0000 | [diff] [blame] | 1999 |     case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 2000 |       if (Record.size() < 2) | 
| Chris Lattner | ab21db7 | 2009-10-28 00:19:10 +0000 | [diff] [blame] | 2001 |         return Error("Invalid INDIRECTBR record"); | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 2002 |       const Type *OpTy = getTypeByID(Record[0]); | 
 | 2003 |       Value *Address = getFnValueByID(Record[1], OpTy); | 
 | 2004 |       if (OpTy == 0 || Address == 0) | 
| Chris Lattner | ab21db7 | 2009-10-28 00:19:10 +0000 | [diff] [blame] | 2005 |         return Error("Invalid INDIRECTBR record"); | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 2006 |       unsigned NumDests = Record.size()-2; | 
| Chris Lattner | ab21db7 | 2009-10-28 00:19:10 +0000 | [diff] [blame] | 2007 |       IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 2008 |       InstructionList.push_back(IBI); | 
 | 2009 |       for (unsigned i = 0, e = NumDests; i != e; ++i) { | 
 | 2010 |         if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { | 
 | 2011 |           IBI->addDestination(DestBB); | 
 | 2012 |         } else { | 
 | 2013 |           delete IBI; | 
| Chris Lattner | ab21db7 | 2009-10-28 00:19:10 +0000 | [diff] [blame] | 2014 |           return Error("Invalid INDIRECTBR record!"); | 
| Chris Lattner | f9be95f | 2009-10-27 19:13:16 +0000 | [diff] [blame] | 2015 |         } | 
 | 2016 |       } | 
 | 2017 |       I = IBI; | 
 | 2018 |       break; | 
 | 2019 |     } | 
 | 2020 |          | 
| Duncan Sands | dc02467 | 2007-11-27 13:23:08 +0000 | [diff] [blame] | 2021 |     case bitc::FUNC_CODE_INST_INVOKE: { | 
 | 2022 |       // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 2023 |       if (Record.size() < 4) return Error("Invalid INVOKE record"); | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 2024 |       AttrListPtr PAL = getAttributes(Record[0]); | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 2025 |       unsigned CCInfo = Record[1]; | 
 | 2026 |       BasicBlock *NormalBB = getBasicBlock(Record[2]); | 
 | 2027 |       BasicBlock *UnwindBB = getBasicBlock(Record[3]); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2028 |  | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 2029 |       unsigned OpNum = 4; | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2030 |       Value *Callee; | 
 | 2031 |       if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2032 |         return Error("Invalid INVOKE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2033 |  | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2034 |       const PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); | 
 | 2035 |       const FunctionType *FTy = !CalleeTy ? 0 : | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2036 |         dyn_cast<FunctionType>(CalleeTy->getElementType()); | 
 | 2037 |  | 
 | 2038 |       // Check that the right number of fixed parameters are here. | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2039 |       if (FTy == 0 || NormalBB == 0 || UnwindBB == 0 || | 
 | 2040 |           Record.size() < OpNum+FTy->getNumParams()) | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2041 |         return Error("Invalid INVOKE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2042 |  | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2043 |       SmallVector<Value*, 16> Ops; | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2044 |       for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { | 
 | 2045 |         Ops.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i))); | 
 | 2046 |         if (Ops.back() == 0) return Error("Invalid INVOKE record"); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2047 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2048 |  | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2049 |       if (!FTy->isVarArg()) { | 
 | 2050 |         if (Record.size() != OpNum) | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2051 |           return Error("Invalid INVOKE record"); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2052 |       } else { | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2053 |         // Read type/value pairs for varargs params. | 
 | 2054 |         while (OpNum != Record.size()) { | 
 | 2055 |           Value *Op; | 
 | 2056 |           if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 
 | 2057 |             return Error("Invalid INVOKE record"); | 
 | 2058 |           Ops.push_back(Op); | 
 | 2059 |         } | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2060 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2061 |  | 
| Gabor Greif | b1dbcd8 | 2008-05-15 10:04:30 +0000 | [diff] [blame] | 2062 |       I = InvokeInst::Create(Callee, NormalBB, UnwindBB, | 
 | 2063 |                              Ops.begin(), Ops.end()); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2064 |       InstructionList.push_back(I); | 
| Sandeep Patel | 65c3c8f | 2009-09-02 08:44:58 +0000 | [diff] [blame] | 2065 |       cast<InvokeInst>(I)->setCallingConv( | 
 | 2066 |         static_cast<CallingConv::ID>(CCInfo)); | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 2067 |       cast<InvokeInst>(I)->setAttributes(PAL); | 
| Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 2068 |       break; | 
 | 2069 |     } | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 2070 |     case bitc::FUNC_CODE_INST_UNWIND: // UNWIND | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 2071 |       I = new UnwindInst(Context); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2072 |       InstructionList.push_back(I); | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 2073 |       break; | 
 | 2074 |     case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 2075 |       I = new UnreachableInst(Context); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2076 |       InstructionList.push_back(I); | 
| Chris Lattner | 231cbcb | 2007-05-02 04:27:25 +0000 | [diff] [blame] | 2077 |       break; | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2078 |     case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 2079 |       if (Record.size() < 1 || ((Record.size()-1)&1)) | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2080 |         return Error("Invalid PHI record"); | 
 | 2081 |       const Type *Ty = getTypeByID(Record[0]); | 
 | 2082 |       if (!Ty) return Error("Invalid PHI record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2083 |  | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 2084 |       PHINode *PN = PHINode::Create(Ty); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2085 |       InstructionList.push_back(PN); | 
| Chris Lattner | 8694161 | 2008-04-13 00:14:42 +0000 | [diff] [blame] | 2086 |       PN->reserveOperandSpace((Record.size()-1)/2); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2087 |  | 
| Chris Lattner | 15e6d17 | 2007-05-04 19:11:41 +0000 | [diff] [blame] | 2088 |       for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { | 
 | 2089 |         Value *V = getFnValueByID(Record[1+i], Ty); | 
 | 2090 |         BasicBlock *BB = getBasicBlock(Record[2+i]); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2091 |         if (!V || !BB) return Error("Invalid PHI record"); | 
 | 2092 |         PN->addIncoming(V, BB); | 
 | 2093 |       } | 
 | 2094 |       I = PN; | 
 | 2095 |       break; | 
 | 2096 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2097 |  | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2098 |     case bitc::FUNC_CODE_INST_MALLOC: { // MALLOC: [instty, op, align] | 
| Victor Hernandez | 13ad5aa | 2009-10-17 00:00:19 +0000 | [diff] [blame] | 2099 |       // Autoupgrade malloc instruction to malloc call. | 
| Victor Hernandez | 68afa54 | 2009-10-21 19:11:40 +0000 | [diff] [blame] | 2100 |       // FIXME: Remove in LLVM 3.0. | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2101 |       if (Record.size() < 3) | 
 | 2102 |         return Error("Invalid MALLOC record"); | 
 | 2103 |       const PointerType *Ty = | 
 | 2104 |         dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 2105 |       Value *Size = getFnValueByID(Record[1], Type::getInt32Ty(Context)); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2106 |       if (!Ty || !Size) return Error("Invalid MALLOC record"); | 
| Victor Hernandez | 13ad5aa | 2009-10-17 00:00:19 +0000 | [diff] [blame] | 2107 |       if (!CurBB) return Error("Invalid malloc instruction with no BB"); | 
| Victor Hernandez | 68afa54 | 2009-10-21 19:11:40 +0000 | [diff] [blame] | 2108 |       const Type *Int32Ty = IntegerType::getInt32Ty(CurBB->getContext()); | 
| Victor Hernandez | 9d0b704 | 2009-11-07 00:16:28 +0000 | [diff] [blame] | 2109 |       Constant *AllocSize = ConstantExpr::getSizeOf(Ty->getElementType()); | 
 | 2110 |       AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, Int32Ty); | 
| Victor Hernandez | 68afa54 | 2009-10-21 19:11:40 +0000 | [diff] [blame] | 2111 |       I = CallInst::CreateMalloc(CurBB, Int32Ty, Ty->getElementType(), | 
| Victor Hernandez | 9d0b704 | 2009-11-07 00:16:28 +0000 | [diff] [blame] | 2112 |                                  AllocSize, Size, NULL); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2113 |       InstructionList.push_back(I); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2114 |       break; | 
 | 2115 |     } | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2116 |     case bitc::FUNC_CODE_INST_FREE: { // FREE: [op, opty] | 
 | 2117 |       unsigned OpNum = 0; | 
 | 2118 |       Value *Op; | 
 | 2119 |       if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 
 | 2120 |           OpNum != Record.size()) | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2121 |         return Error("Invalid FREE record"); | 
| Victor Hernandez | 66284e0 | 2009-10-24 04:23:03 +0000 | [diff] [blame] | 2122 |       if (!CurBB) return Error("Invalid free instruction with no BB"); | 
 | 2123 |       I = CallInst::CreateFree(Op, CurBB); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2124 |       InstructionList.push_back(I); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2125 |       break; | 
 | 2126 |     } | 
 | 2127 |     case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, op, align] | 
 | 2128 |       if (Record.size() < 3) | 
 | 2129 |         return Error("Invalid ALLOCA record"); | 
 | 2130 |       const PointerType *Ty = | 
 | 2131 |         dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); | 
| Owen Anderson | 1d0be15 | 2009-08-13 21:58:54 +0000 | [diff] [blame] | 2132 |       Value *Size = getFnValueByID(Record[1], Type::getInt32Ty(Context)); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2133 |       unsigned Align = Record[2]; | 
 | 2134 |       if (!Ty || !Size) return Error("Invalid ALLOCA record"); | 
| Owen Anderson | 50dead0 | 2009-07-15 23:53:25 +0000 | [diff] [blame] | 2135 |       I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2136 |       InstructionList.push_back(I); | 
| Chris Lattner | 2a98cca | 2007-05-03 18:58:09 +0000 | [diff] [blame] | 2137 |       break; | 
 | 2138 |     } | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2139 |     case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2140 |       unsigned OpNum = 0; | 
 | 2141 |       Value *Op; | 
 | 2142 |       if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 
 | 2143 |           OpNum+2 != Record.size()) | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2144 |         return Error("Invalid LOAD record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2145 |  | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2146 |       I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2147 |       InstructionList.push_back(I); | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2148 |       break; | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2149 |     } | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 2150 |     case bitc::FUNC_CODE_INST_STORE2: { // STORE2:[ptrty, ptr, val, align, vol] | 
 | 2151 |       unsigned OpNum = 0; | 
 | 2152 |       Value *Val, *Ptr; | 
 | 2153 |       if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2154 |           getValue(Record, OpNum, | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 2155 |                     cast<PointerType>(Ptr->getType())->getElementType(), Val) || | 
 | 2156 |           OpNum+2 != Record.size()) | 
 | 2157 |         return Error("Invalid STORE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2158 |  | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 2159 |       I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2160 |       InstructionList.push_back(I); | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 2161 |       break; | 
 | 2162 |     } | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2163 |     case bitc::FUNC_CODE_INST_STORE: { // STORE:[val, valty, ptr, align, vol] | 
| Christopher Lamb | fe63fb9 | 2007-12-11 08:59:05 +0000 | [diff] [blame] | 2164 |       // FIXME: Legacy form of store instruction. Should be removed in LLVM 3.0. | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2165 |       unsigned OpNum = 0; | 
 | 2166 |       Value *Val, *Ptr; | 
 | 2167 |       if (getValueTypePair(Record, OpNum, NextValueNo, Val) || | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2168 |           getValue(Record, OpNum, | 
| Owen Anderson | debcb01 | 2009-07-29 22:17:13 +0000 | [diff] [blame] | 2169 |                    PointerType::getUnqual(Val->getType()), Ptr)|| | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2170 |           OpNum+2 != Record.size()) | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2171 |         return Error("Invalid STORE record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2172 |  | 
| Chris Lattner | abfbf85 | 2007-05-06 00:21:25 +0000 | [diff] [blame] | 2173 |       I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2174 |       InstructionList.push_back(I); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2175 |       break; | 
 | 2176 |     } | 
| Duncan Sands | dc02467 | 2007-11-27 13:23:08 +0000 | [diff] [blame] | 2177 |     case bitc::FUNC_CODE_INST_CALL: { | 
 | 2178 |       // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] | 
 | 2179 |       if (Record.size() < 3) | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2180 |         return Error("Invalid CALL record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2181 |  | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 2182 |       AttrListPtr PAL = getAttributes(Record[0]); | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 2183 |       unsigned CCInfo = Record[1]; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2184 |  | 
| Chris Lattner | a9bb713 | 2007-05-08 05:38:01 +0000 | [diff] [blame] | 2185 |       unsigned OpNum = 2; | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2186 |       Value *Callee; | 
 | 2187 |       if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) | 
 | 2188 |         return Error("Invalid CALL record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2189 |  | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2190 |       const PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2191 |       const FunctionType *FTy = 0; | 
 | 2192 |       if (OpTy) FTy = dyn_cast<FunctionType>(OpTy->getElementType()); | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2193 |       if (!FTy || Record.size() < FTy->getNumParams()+OpNum) | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2194 |         return Error("Invalid CALL record"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2195 |  | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2196 |       SmallVector<Value*, 16> Args; | 
 | 2197 |       // Read the fixed params. | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2198 |       for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { | 
| Dale Johannesen | eb57ea7 | 2007-11-05 21:20:28 +0000 | [diff] [blame] | 2199 |         if (FTy->getParamType(i)->getTypeID()==Type::LabelTyID) | 
 | 2200 |           Args.push_back(getBasicBlock(Record[OpNum])); | 
 | 2201 |         else | 
 | 2202 |           Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i))); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2203 |         if (Args.back() == 0) return Error("Invalid CALL record"); | 
 | 2204 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2205 |  | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2206 |       // Read type/value pairs for varargs params. | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2207 |       if (!FTy->isVarArg()) { | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2208 |         if (OpNum != Record.size()) | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2209 |           return Error("Invalid CALL record"); | 
 | 2210 |       } else { | 
| Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 2211 |         while (OpNum != Record.size()) { | 
 | 2212 |           Value *Op; | 
 | 2213 |           if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 
 | 2214 |             return Error("Invalid CALL record"); | 
 | 2215 |           Args.push_back(Op); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2216 |         } | 
 | 2217 |       } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2218 |  | 
| Gabor Greif | 051a950 | 2008-04-06 20:25:17 +0000 | [diff] [blame] | 2219 |       I = CallInst::Create(Callee, Args.begin(), Args.end()); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2220 |       InstructionList.push_back(I); | 
| Sandeep Patel | 65c3c8f | 2009-09-02 08:44:58 +0000 | [diff] [blame] | 2221 |       cast<CallInst>(I)->setCallingConv( | 
 | 2222 |         static_cast<CallingConv::ID>(CCInfo>>1)); | 
| Chris Lattner | 7652019 | 2007-05-03 22:34:03 +0000 | [diff] [blame] | 2223 |       cast<CallInst>(I)->setTailCall(CCInfo & 1); | 
| Devang Patel | 0598866 | 2008-09-25 21:00:45 +0000 | [diff] [blame] | 2224 |       cast<CallInst>(I)->setAttributes(PAL); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2225 |       break; | 
 | 2226 |     } | 
 | 2227 |     case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] | 
 | 2228 |       if (Record.size() < 3) | 
 | 2229 |         return Error("Invalid VAARG record"); | 
 | 2230 |       const Type *OpTy = getTypeByID(Record[0]); | 
 | 2231 |       Value *Op = getFnValueByID(Record[1], OpTy); | 
 | 2232 |       const Type *ResTy = getTypeByID(Record[2]); | 
 | 2233 |       if (!OpTy || !Op || !ResTy) | 
 | 2234 |         return Error("Invalid VAARG record"); | 
 | 2235 |       I = new VAArgInst(Op, ResTy); | 
| Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 2236 |       InstructionList.push_back(I); | 
| Chris Lattner | 0579f7f | 2007-05-03 22:04:19 +0000 | [diff] [blame] | 2237 |       break; | 
 | 2238 |     } | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2239 |     } | 
 | 2240 |  | 
 | 2241 |     // Add instruction to end of current BB.  If there is no current BB, reject | 
 | 2242 |     // this file. | 
 | 2243 |     if (CurBB == 0) { | 
 | 2244 |       delete I; | 
 | 2245 |       return Error("Invalid instruction with no BB"); | 
 | 2246 |     } | 
 | 2247 |     CurBB->getInstList().push_back(I); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2248 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2249 |     // If this was a terminator instruction, move to the next block. | 
 | 2250 |     if (isa<TerminatorInst>(I)) { | 
 | 2251 |       ++CurBBNo; | 
 | 2252 |       CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : 0; | 
 | 2253 |     } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2254 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2255 |     // Non-void values get registered in the value table for future use. | 
| Benjamin Kramer | f012705 | 2010-01-05 13:12:22 +0000 | [diff] [blame] | 2256 |     if (I && !I->getType()->isVoidTy()) | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2257 |       ValueList.AssignValue(I, NextValueNo++); | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 2258 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2259 |  | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2260 |   // Check the function list for unresolved values. | 
 | 2261 |   if (Argument *A = dyn_cast<Argument>(ValueList.back())) { | 
 | 2262 |     if (A->getParent() == 0) { | 
 | 2263 |       // We found at least one unresolved value.  Nuke them all to avoid leaks. | 
 | 2264 |       for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ | 
 | 2265 |         if ((A = dyn_cast<Argument>(ValueList.back())) && A->getParent() == 0) { | 
| Owen Anderson | 9e9a0d5 | 2009-07-30 23:03:37 +0000 | [diff] [blame] | 2266 |           A->replaceAllUsesWith(UndefValue::get(A->getType())); | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2267 |           delete A; | 
 | 2268 |         } | 
 | 2269 |       } | 
| Chris Lattner | 35a0470 | 2007-05-04 03:50:29 +0000 | [diff] [blame] | 2270 |       return Error("Never resolved value found in function!"); | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2271 |     } | 
| Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 2272 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2273 |  | 
| Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 2274 |   // See if anything took the address of blocks in this function.  If so, | 
 | 2275 |   // resolve them now. | 
 | 2276 |   /// BlockAddrFwdRefs - These are blockaddr references to basic blocks.  These | 
 | 2277 |   /// are resolved lazily when functions are loaded. | 
 | 2278 |   DenseMap<Function*, std::vector<BlockAddrRefTy> >::iterator BAFRI = | 
 | 2279 |     BlockAddrFwdRefs.find(F); | 
 | 2280 |   if (BAFRI != BlockAddrFwdRefs.end()) { | 
 | 2281 |     std::vector<BlockAddrRefTy> &RefList = BAFRI->second; | 
 | 2282 |     for (unsigned i = 0, e = RefList.size(); i != e; ++i) { | 
 | 2283 |       unsigned BlockIdx = RefList[i].first; | 
| Chris Lattner | cdfc940 | 2009-11-01 01:27:45 +0000 | [diff] [blame] | 2284 |       if (BlockIdx >= FunctionBBs.size()) | 
| Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 2285 |         return Error("Invalid blockaddress block #"); | 
 | 2286 |      | 
 | 2287 |       GlobalVariable *FwdRef = RefList[i].second; | 
| Chris Lattner | cdfc940 | 2009-11-01 01:27:45 +0000 | [diff] [blame] | 2288 |       FwdRef->replaceAllUsesWith(BlockAddress::get(F, FunctionBBs[BlockIdx])); | 
| Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 2289 |       FwdRef->eraseFromParent(); | 
 | 2290 |     } | 
 | 2291 |      | 
 | 2292 |     BlockAddrFwdRefs.erase(BAFRI); | 
 | 2293 |   } | 
 | 2294 |    | 
| Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 2295 |   // Trim the value list down to the size it was before we parsed this function. | 
 | 2296 |   ValueList.shrinkTo(ModuleValueListSize); | 
 | 2297 |   std::vector<BasicBlock*>().swap(FunctionBBs); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2298 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 2299 |   return false; | 
 | 2300 | } | 
 | 2301 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2302 | //===----------------------------------------------------------------------===// | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2303 | // GVMaterializer implementation | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2304 | //===----------------------------------------------------------------------===// | 
 | 2305 |  | 
 | 2306 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2307 | bool BitcodeReader::isMaterializable(const GlobalValue *GV) const { | 
 | 2308 |   if (const Function *F = dyn_cast<Function>(GV)) { | 
 | 2309 |     return F->isDeclaration() && | 
 | 2310 |       DeferredFunctionInfo.count(const_cast<Function*>(F)); | 
 | 2311 |   } | 
 | 2312 |   return false; | 
 | 2313 | } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2314 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2315 | bool BitcodeReader::Materialize(GlobalValue *GV, std::string *ErrInfo) { | 
 | 2316 |   Function *F = dyn_cast<Function>(GV); | 
 | 2317 |   // If it's not a function or is already material, ignore the request. | 
 | 2318 |   if (!F || !F->isMaterializable()) return false; | 
 | 2319 |  | 
 | 2320 |   DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2321 |   assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2322 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2323 |   // Move the bit stream to the saved position of the deferred function body. | 
 | 2324 |   Stream.JumpToBit(DFII->second); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2325 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2326 |   if (ParseFunctionBody(F)) { | 
 | 2327 |     if (ErrInfo) *ErrInfo = ErrorString; | 
 | 2328 |     return true; | 
 | 2329 |   } | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 2330 |  | 
 | 2331 |   // Upgrade any old intrinsic calls in the function. | 
 | 2332 |   for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), | 
 | 2333 |        E = UpgradedIntrinsics.end(); I != E; ++I) { | 
 | 2334 |     if (I->first != I->second) { | 
 | 2335 |       for (Value::use_iterator UI = I->first->use_begin(), | 
 | 2336 |            UE = I->first->use_end(); UI != UE; ) { | 
 | 2337 |         if (CallInst* CI = dyn_cast<CallInst>(*UI++)) | 
 | 2338 |           UpgradeIntrinsicCall(CI, I->second); | 
 | 2339 |       } | 
 | 2340 |     } | 
 | 2341 |   } | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2342 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2343 |   return false; | 
 | 2344 | } | 
 | 2345 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2346 | bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { | 
 | 2347 |   const Function *F = dyn_cast<Function>(GV); | 
 | 2348 |   if (!F || F->isDeclaration()) | 
 | 2349 |     return false; | 
 | 2350 |   return DeferredFunctionInfo.count(const_cast<Function*>(F)); | 
 | 2351 | } | 
 | 2352 |  | 
 | 2353 | void BitcodeReader::Dematerialize(GlobalValue *GV) { | 
 | 2354 |   Function *F = dyn_cast<Function>(GV); | 
 | 2355 |   // If this function isn't dematerializable, this is a noop. | 
 | 2356 |   if (!F || !isDematerializable(F)) | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2357 |     return; | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2358 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2359 |   assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2360 |  | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2361 |   // Just forget the function body, we can remat it later. | 
 | 2362 |   F->deleteBody(); | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2363 | } | 
 | 2364 |  | 
 | 2365 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2366 | bool BitcodeReader::MaterializeModule(Module *M, std::string *ErrInfo) { | 
 | 2367 |   assert(M == TheModule && | 
 | 2368 |          "Can only Materialize the Module this BitcodeReader is attached to."); | 
| Chris Lattner | 714fa95 | 2009-06-16 05:15:21 +0000 | [diff] [blame] | 2369 |   // Iterate over the module, deserializing any functions that are still on | 
 | 2370 |   // disk. | 
 | 2371 |   for (Module::iterator F = TheModule->begin(), E = TheModule->end(); | 
 | 2372 |        F != E; ++F) | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2373 |     if (F->isMaterializable() && | 
 | 2374 |         Materialize(F, ErrInfo)) | 
 | 2375 |       return true; | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 2376 |  | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2377 |   // Upgrade any intrinsic calls that slipped through (should not happen!) and | 
 | 2378 |   // delete the old functions to clean up. We can't do this unless the entire | 
 | 2379 |   // module is materialized because there could always be another function body | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 2380 |   // with calls to the old function. | 
 | 2381 |   for (std::vector<std::pair<Function*, Function*> >::iterator I = | 
 | 2382 |        UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) { | 
 | 2383 |     if (I->first != I->second) { | 
 | 2384 |       for (Value::use_iterator UI = I->first->use_begin(), | 
 | 2385 |            UE = I->first->use_end(); UI != UE; ) { | 
 | 2386 |         if (CallInst* CI = dyn_cast<CallInst>(*UI++)) | 
 | 2387 |           UpgradeIntrinsicCall(CI, I->second); | 
 | 2388 |       } | 
| Chris Lattner | 7d9eb58 | 2009-04-01 01:43:03 +0000 | [diff] [blame] | 2389 |       if (!I->first->use_empty()) | 
 | 2390 |         I->first->replaceAllUsesWith(I->second); | 
| Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 2391 |       I->first->eraseFromParent(); | 
 | 2392 |     } | 
 | 2393 |   } | 
 | 2394 |   std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); | 
| Devang Patel | e4b2756 | 2009-08-28 23:24:31 +0000 | [diff] [blame] | 2395 |  | 
 | 2396 |   // Check debug info intrinsics. | 
 | 2397 |   CheckDebugInfoIntrinsics(TheModule); | 
 | 2398 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2399 |   return false; | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2400 | } | 
 | 2401 |  | 
| Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 2402 |  | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2403 | //===----------------------------------------------------------------------===// | 
 | 2404 | // External interface | 
 | 2405 | //===----------------------------------------------------------------------===// | 
 | 2406 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2407 | /// getLazyBitcodeModule - lazy function-at-a-time loading from a file. | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2408 | /// | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2409 | Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, | 
 | 2410 |                                    LLVMContext& Context, | 
 | 2411 |                                    std::string *ErrMsg) { | 
 | 2412 |   Module *M = new Module(Buffer->getBufferIdentifier(), Context); | 
| Owen Anderson | 8b477ed | 2009-07-01 16:58:40 +0000 | [diff] [blame] | 2413 |   BitcodeReader *R = new BitcodeReader(Buffer, Context); | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2414 |   M->setMaterializer(R); | 
 | 2415 |   if (R->ParseBitcodeInto(M)) { | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2416 |     if (ErrMsg) | 
 | 2417 |       *ErrMsg = R->getErrorString(); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2418 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2419 |     delete M;  // Also deletes R. | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2420 |     return 0; | 
 | 2421 |   } | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2422 |   // Have the BitcodeReader dtor delete 'Buffer'. | 
 | 2423 |   R->setBufferOwned(true); | 
 | 2424 |   return M; | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2425 | } | 
 | 2426 |  | 
 | 2427 | /// ParseBitcodeFile - Read the specified bitcode file, returning the module. | 
 | 2428 | /// If an error occurs, return null and fill in *ErrMsg if non-null. | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2429 | Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, | 
| Owen Anderson | 8b477ed | 2009-07-01 16:58:40 +0000 | [diff] [blame] | 2430 |                                std::string *ErrMsg){ | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2431 |   Module *M = getLazyBitcodeModule(Buffer, Context, ErrMsg); | 
 | 2432 |   if (!M) return 0; | 
| Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 2433 |  | 
 | 2434 |   // Don't let the BitcodeReader dtor delete 'Buffer', regardless of whether | 
 | 2435 |   // there was an error. | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2436 |   static_cast<BitcodeReader*>(M->getMaterializer())->setBufferOwned(false); | 
| Daniel Dunbar | a279bc3 | 2009-09-20 02:20:51 +0000 | [diff] [blame] | 2437 |  | 
| Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 2438 |   // Read in the entire module, and destroy the BitcodeReader. | 
 | 2439 |   if (M->MaterializeAllPermanently(ErrMsg)) { | 
 | 2440 |     delete M; | 
 | 2441 |     return NULL; | 
 | 2442 |   } | 
| Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 2443 |   return M; | 
 | 2444 | } |