| OLD | NEW |
| 1 //===- BitcodeReader.cpp - Internal BitcodeReader implementation ----------===// | 1 //===- NaClBitcodeReader.cpp ----------------------------------------------===// |
| 2 // Internal NaClBitcodeReader implementation |
| 2 // | 3 // |
| 3 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
| 4 // | 5 // |
| 5 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
| 7 // | 8 // |
| 8 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
| 9 | 10 |
| 10 #include "llvm/Bitcode/ReaderWriter.h" | 11 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
| 11 #include "BitcodeReader.h" | 12 #include "NaClBitcodeReader.h" |
| 12 #include "llvm/ADT/SmallString.h" | 13 #include "llvm/ADT/SmallString.h" |
| 13 #include "llvm/ADT/SmallVector.h" | 14 #include "llvm/ADT/SmallVector.h" |
| 14 #include "llvm/AutoUpgrade.h" | 15 #include "llvm/AutoUpgrade.h" |
| 15 #include "llvm/IR/Constants.h" | 16 #include "llvm/IR/Constants.h" |
| 16 #include "llvm/IR/DerivedTypes.h" | 17 #include "llvm/IR/DerivedTypes.h" |
| 17 #include "llvm/IR/InlineAsm.h" | 18 #include "llvm/IR/InlineAsm.h" |
| 18 #include "llvm/IR/IntrinsicInst.h" | 19 #include "llvm/IR/IntrinsicInst.h" |
| 19 #include "llvm/IR/Module.h" | 20 #include "llvm/IR/Module.h" |
| 20 #include "llvm/IR/OperandTraits.h" | 21 #include "llvm/IR/OperandTraits.h" |
| 21 #include "llvm/IR/Operator.h" | 22 #include "llvm/IR/Operator.h" |
| 22 #include "llvm/Support/DataStream.h" | 23 #include "llvm/Support/DataStream.h" |
| 23 #include "llvm/Support/MathExtras.h" | 24 #include "llvm/Support/MathExtras.h" |
| 24 #include "llvm/Support/MemoryBuffer.h" | 25 #include "llvm/Support/MemoryBuffer.h" |
| 25 using namespace llvm; | 26 using namespace llvm; |
| 26 | 27 |
| 27 enum { | 28 enum { |
| 28 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex | 29 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex |
| 29 }; | 30 }; |
| 30 | 31 |
| 31 void BitcodeReader::materializeForwardReferencedFunctions() { | 32 void NaClBitcodeReader::materializeForwardReferencedFunctions() { |
| 32 while (!BlockAddrFwdRefs.empty()) { | 33 while (!BlockAddrFwdRefs.empty()) { |
| 33 Function *F = BlockAddrFwdRefs.begin()->first; | 34 Function *F = BlockAddrFwdRefs.begin()->first; |
| 34 F->Materialize(); | 35 F->Materialize(); |
| 35 } | 36 } |
| 36 } | 37 } |
| 37 | 38 |
| 38 void BitcodeReader::FreeState() { | 39 void NaClBitcodeReader::FreeState() { |
| 39 if (BufferOwned) | 40 if (BufferOwned) |
| 40 delete Buffer; | 41 delete Buffer; |
| 41 Buffer = 0; | 42 Buffer = 0; |
| 42 std::vector<Type*>().swap(TypeList); | 43 std::vector<Type*>().swap(TypeList); |
| 43 ValueList.clear(); | 44 ValueList.clear(); |
| 44 MDValueList.clear(); | 45 MDValueList.clear(); |
| 45 | 46 |
| 46 std::vector<AttributeSet>().swap(MAttributes); | 47 std::vector<AttributeSet>().swap(MAttributes); |
| 47 std::vector<BasicBlock*>().swap(FunctionBBs); | 48 std::vector<BasicBlock*>().swap(FunctionBBs); |
| 48 std::vector<Function*>().swap(FunctionsWithBodies); | 49 std::vector<Function*>().swap(FunctionsWithBodies); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 case 1: return GlobalVariable::GeneralDynamicTLSModel; | 108 case 1: return GlobalVariable::GeneralDynamicTLSModel; |
| 108 case 2: return GlobalVariable::LocalDynamicTLSModel; | 109 case 2: return GlobalVariable::LocalDynamicTLSModel; |
| 109 case 3: return GlobalVariable::InitialExecTLSModel; | 110 case 3: return GlobalVariable::InitialExecTLSModel; |
| 110 case 4: return GlobalVariable::LocalExecTLSModel; | 111 case 4: return GlobalVariable::LocalExecTLSModel; |
| 111 } | 112 } |
| 112 } | 113 } |
| 113 | 114 |
| 114 static int GetDecodedCastOpcode(unsigned Val) { | 115 static int GetDecodedCastOpcode(unsigned Val) { |
| 115 switch (Val) { | 116 switch (Val) { |
| 116 default: return -1; | 117 default: return -1; |
| 117 case bitc::CAST_TRUNC : return Instruction::Trunc; | 118 case naclbitc::CAST_TRUNC : return Instruction::Trunc; |
| 118 case bitc::CAST_ZEXT : return Instruction::ZExt; | 119 case naclbitc::CAST_ZEXT : return Instruction::ZExt; |
| 119 case bitc::CAST_SEXT : return Instruction::SExt; | 120 case naclbitc::CAST_SEXT : return Instruction::SExt; |
| 120 case bitc::CAST_FPTOUI : return Instruction::FPToUI; | 121 case naclbitc::CAST_FPTOUI : return Instruction::FPToUI; |
| 121 case bitc::CAST_FPTOSI : return Instruction::FPToSI; | 122 case naclbitc::CAST_FPTOSI : return Instruction::FPToSI; |
| 122 case bitc::CAST_UITOFP : return Instruction::UIToFP; | 123 case naclbitc::CAST_UITOFP : return Instruction::UIToFP; |
| 123 case bitc::CAST_SITOFP : return Instruction::SIToFP; | 124 case naclbitc::CAST_SITOFP : return Instruction::SIToFP; |
| 124 case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; | 125 case naclbitc::CAST_FPTRUNC : return Instruction::FPTrunc; |
| 125 case bitc::CAST_FPEXT : return Instruction::FPExt; | 126 case naclbitc::CAST_FPEXT : return Instruction::FPExt; |
| 126 case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; | 127 case naclbitc::CAST_PTRTOINT: return Instruction::PtrToInt; |
| 127 case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; | 128 case naclbitc::CAST_INTTOPTR: return Instruction::IntToPtr; |
| 128 case bitc::CAST_BITCAST : return Instruction::BitCast; | 129 case naclbitc::CAST_BITCAST : return Instruction::BitCast; |
| 129 } | 130 } |
| 130 } | 131 } |
| 131 static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) { | 132 static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) { |
| 132 switch (Val) { | 133 switch (Val) { |
| 133 default: return -1; | 134 default: return -1; |
| 134 case bitc::BINOP_ADD: | 135 case naclbitc::BINOP_ADD: |
| 135 return Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; | 136 return Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; |
| 136 case bitc::BINOP_SUB: | 137 case naclbitc::BINOP_SUB: |
| 137 return Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; | 138 return Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; |
| 138 case bitc::BINOP_MUL: | 139 case naclbitc::BINOP_MUL: |
| 139 return Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; | 140 return Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; |
| 140 case bitc::BINOP_UDIV: return Instruction::UDiv; | 141 case naclbitc::BINOP_UDIV: return Instruction::UDiv; |
| 141 case bitc::BINOP_SDIV: | 142 case naclbitc::BINOP_SDIV: |
| 142 return Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; | 143 return Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; |
| 143 case bitc::BINOP_UREM: return Instruction::URem; | 144 case naclbitc::BINOP_UREM: return Instruction::URem; |
| 144 case bitc::BINOP_SREM: | 145 case naclbitc::BINOP_SREM: |
| 145 return Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; | 146 return Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; |
| 146 case bitc::BINOP_SHL: return Instruction::Shl; | 147 case naclbitc::BINOP_SHL: return Instruction::Shl; |
| 147 case bitc::BINOP_LSHR: return Instruction::LShr; | 148 case naclbitc::BINOP_LSHR: return Instruction::LShr; |
| 148 case bitc::BINOP_ASHR: return Instruction::AShr; | 149 case naclbitc::BINOP_ASHR: return Instruction::AShr; |
| 149 case bitc::BINOP_AND: return Instruction::And; | 150 case naclbitc::BINOP_AND: return Instruction::And; |
| 150 case bitc::BINOP_OR: return Instruction::Or; | 151 case naclbitc::BINOP_OR: return Instruction::Or; |
| 151 case bitc::BINOP_XOR: return Instruction::Xor; | 152 case naclbitc::BINOP_XOR: return Instruction::Xor; |
| 152 } | 153 } |
| 153 } | 154 } |
| 154 | 155 |
| 155 static AtomicRMWInst::BinOp GetDecodedRMWOperation(unsigned Val) { | 156 static AtomicRMWInst::BinOp GetDecodedRMWOperation(unsigned Val) { |
| 156 switch (Val) { | 157 switch (Val) { |
| 157 default: return AtomicRMWInst::BAD_BINOP; | 158 default: return AtomicRMWInst::BAD_BINOP; |
| 158 case bitc::RMW_XCHG: return AtomicRMWInst::Xchg; | 159 case naclbitc::RMW_XCHG: return AtomicRMWInst::Xchg; |
| 159 case bitc::RMW_ADD: return AtomicRMWInst::Add; | 160 case naclbitc::RMW_ADD: return AtomicRMWInst::Add; |
| 160 case bitc::RMW_SUB: return AtomicRMWInst::Sub; | 161 case naclbitc::RMW_SUB: return AtomicRMWInst::Sub; |
| 161 case bitc::RMW_AND: return AtomicRMWInst::And; | 162 case naclbitc::RMW_AND: return AtomicRMWInst::And; |
| 162 case bitc::RMW_NAND: return AtomicRMWInst::Nand; | 163 case naclbitc::RMW_NAND: return AtomicRMWInst::Nand; |
| 163 case bitc::RMW_OR: return AtomicRMWInst::Or; | 164 case naclbitc::RMW_OR: return AtomicRMWInst::Or; |
| 164 case bitc::RMW_XOR: return AtomicRMWInst::Xor; | 165 case naclbitc::RMW_XOR: return AtomicRMWInst::Xor; |
| 165 case bitc::RMW_MAX: return AtomicRMWInst::Max; | 166 case naclbitc::RMW_MAX: return AtomicRMWInst::Max; |
| 166 case bitc::RMW_MIN: return AtomicRMWInst::Min; | 167 case naclbitc::RMW_MIN: return AtomicRMWInst::Min; |
| 167 case bitc::RMW_UMAX: return AtomicRMWInst::UMax; | 168 case naclbitc::RMW_UMAX: return AtomicRMWInst::UMax; |
| 168 case bitc::RMW_UMIN: return AtomicRMWInst::UMin; | 169 case naclbitc::RMW_UMIN: return AtomicRMWInst::UMin; |
| 169 } | 170 } |
| 170 } | 171 } |
| 171 | 172 |
| 172 static AtomicOrdering GetDecodedOrdering(unsigned Val) { | 173 static AtomicOrdering GetDecodedOrdering(unsigned Val) { |
| 173 switch (Val) { | 174 switch (Val) { |
| 174 case bitc::ORDERING_NOTATOMIC: return NotAtomic; | 175 case naclbitc::ORDERING_NOTATOMIC: return NotAtomic; |
| 175 case bitc::ORDERING_UNORDERED: return Unordered; | 176 case naclbitc::ORDERING_UNORDERED: return Unordered; |
| 176 case bitc::ORDERING_MONOTONIC: return Monotonic; | 177 case naclbitc::ORDERING_MONOTONIC: return Monotonic; |
| 177 case bitc::ORDERING_ACQUIRE: return Acquire; | 178 case naclbitc::ORDERING_ACQUIRE: return Acquire; |
| 178 case bitc::ORDERING_RELEASE: return Release; | 179 case naclbitc::ORDERING_RELEASE: return Release; |
| 179 case bitc::ORDERING_ACQREL: return AcquireRelease; | 180 case naclbitc::ORDERING_ACQREL: return AcquireRelease; |
| 180 default: // Map unknown orderings to sequentially-consistent. | 181 default: // Map unknown orderings to sequentially-consistent. |
| 181 case bitc::ORDERING_SEQCST: return SequentiallyConsistent; | 182 case naclbitc::ORDERING_SEQCST: return SequentiallyConsistent; |
| 182 } | 183 } |
| 183 } | 184 } |
| 184 | 185 |
| 185 static SynchronizationScope GetDecodedSynchScope(unsigned Val) { | 186 static SynchronizationScope GetDecodedSynchScope(unsigned Val) { |
| 186 switch (Val) { | 187 switch (Val) { |
| 187 case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; | 188 case naclbitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; |
| 188 default: // Map unknown scopes to cross-thread. | 189 default: // Map unknown scopes to cross-thread. |
| 189 case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; | 190 case naclbitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; |
| 190 } | 191 } |
| 191 } | 192 } |
| 192 | 193 |
| 193 namespace llvm { | 194 namespace llvm { |
| 194 namespace { | 195 namespace { |
| 195 /// @brief A class for maintaining the slot number definition | 196 /// @brief A class for maintaining the slot number definition |
| 196 /// as a placeholder for the actual definition for forward constants defs. | 197 /// as a placeholder for the actual definition for forward constants defs. |
| 197 class ConstantPlaceHolder : public ConstantExpr { | 198 class ConstantPlaceHolder : public ConstantExpr { |
| 198 void operator=(const ConstantPlaceHolder &) LLVM_DELETED_FUNCTION; | 199 void operator=(const ConstantPlaceHolder &) LLVM_DELETED_FUNCTION; |
| 199 public: | 200 public: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 219 } | 220 } |
| 220 | 221 |
| 221 // FIXME: can we inherit this from ConstantExpr? | 222 // FIXME: can we inherit this from ConstantExpr? |
| 222 template <> | 223 template <> |
| 223 struct OperandTraits<ConstantPlaceHolder> : | 224 struct OperandTraits<ConstantPlaceHolder> : |
| 224 public FixedNumOperandTraits<ConstantPlaceHolder, 1> { | 225 public FixedNumOperandTraits<ConstantPlaceHolder, 1> { |
| 225 }; | 226 }; |
| 226 } | 227 } |
| 227 | 228 |
| 228 | 229 |
| 229 void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { | 230 void NaClBitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { |
| 230 if (Idx == size()) { | 231 if (Idx == size()) { |
| 231 push_back(V); | 232 push_back(V); |
| 232 return; | 233 return; |
| 233 } | 234 } |
| 234 | 235 |
| 235 if (Idx >= size()) | 236 if (Idx >= size()) |
| 236 resize(Idx+1); | 237 resize(Idx+1); |
| 237 | 238 |
| 238 WeakVH &OldV = ValuePtrs[Idx]; | 239 WeakVH &OldV = ValuePtrs[Idx]; |
| 239 if (OldV == 0) { | 240 if (OldV == 0) { |
| 240 OldV = V; | 241 OldV = V; |
| 241 return; | 242 return; |
| 242 } | 243 } |
| 243 | 244 |
| 244 // Handle constants and non-constants (e.g. instrs) differently for | 245 // Handle constants and non-constants (e.g. instrs) differently for |
| 245 // efficiency. | 246 // efficiency. |
| 246 if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { | 247 if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { |
| 247 ResolveConstants.push_back(std::make_pair(PHC, Idx)); | 248 ResolveConstants.push_back(std::make_pair(PHC, Idx)); |
| 248 OldV = V; | 249 OldV = V; |
| 249 } else { | 250 } else { |
| 250 // If there was a forward reference to this value, replace it. | 251 // If there was a forward reference to this value, replace it. |
| 251 Value *PrevVal = OldV; | 252 Value *PrevVal = OldV; |
| 252 OldV->replaceAllUsesWith(V); | 253 OldV->replaceAllUsesWith(V); |
| 253 delete PrevVal; | 254 delete PrevVal; |
| 254 } | 255 } |
| 255 } | 256 } |
| 256 | 257 |
| 257 | 258 |
| 258 Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, | 259 Constant *NaClBitcodeReaderValueList::getConstantFwdRef(unsigned Idx, |
| 259 Type *Ty) { | 260 Type *Ty) { |
| 260 if (Idx >= size()) | 261 if (Idx >= size()) |
| 261 resize(Idx + 1); | 262 resize(Idx + 1); |
| 262 | 263 |
| 263 if (Value *V = ValuePtrs[Idx]) { | 264 if (Value *V = ValuePtrs[Idx]) { |
| 264 assert(Ty == V->getType() && "Type mismatch in constant table!"); | 265 assert(Ty == V->getType() && "Type mismatch in constant table!"); |
| 265 return cast<Constant>(V); | 266 return cast<Constant>(V); |
| 266 } | 267 } |
| 267 | 268 |
| 268 // Create and return a placeholder, which will later be RAUW'd. | 269 // Create and return a placeholder, which will later be RAUW'd. |
| 269 Constant *C = new ConstantPlaceHolder(Ty, Context); | 270 Constant *C = new ConstantPlaceHolder(Ty, Context); |
| 270 ValuePtrs[Idx] = C; | 271 ValuePtrs[Idx] = C; |
| 271 return C; | 272 return C; |
| 272 } | 273 } |
| 273 | 274 |
| 274 Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { | 275 Value *NaClBitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { |
| 275 if (Idx >= size()) | 276 if (Idx >= size()) |
| 276 resize(Idx + 1); | 277 resize(Idx + 1); |
| 277 | 278 |
| 278 if (Value *V = ValuePtrs[Idx]) { | 279 if (Value *V = ValuePtrs[Idx]) { |
| 279 assert((Ty == 0 || Ty == V->getType()) && "Type mismatch in value table!"); | 280 assert((Ty == 0 || Ty == V->getType()) && "Type mismatch in value table!"); |
| 280 return V; | 281 return V; |
| 281 } | 282 } |
| 282 | 283 |
| 283 // No type specified, must be invalid reference. | 284 // No type specified, must be invalid reference. |
| 284 if (Ty == 0) return 0; | 285 if (Ty == 0) return 0; |
| 285 | 286 |
| 286 // Create and return a placeholder, which will later be RAUW'd. | 287 // Create and return a placeholder, which will later be RAUW'd. |
| 287 Value *V = new Argument(Ty); | 288 Value *V = new Argument(Ty); |
| 288 ValuePtrs[Idx] = V; | 289 ValuePtrs[Idx] = V; |
| 289 return V; | 290 return V; |
| 290 } | 291 } |
| 291 | 292 |
| 292 /// ResolveConstantForwardRefs - Once all constants are read, this method bulk | 293 /// ResolveConstantForwardRefs - Once all constants are read, this method bulk |
| 293 /// resolves any forward references. The idea behind this is that we sometimes | 294 /// resolves any forward references. The idea behind this is that we sometimes |
| 294 /// get constants (such as large arrays) which reference *many* forward ref | 295 /// get constants (such as large arrays) which reference *many* forward ref |
| 295 /// constants. Replacing each of these causes a lot of thrashing when | 296 /// constants. Replacing each of these causes a lot of thrashing when |
| 296 /// building/reuniquing the constant. Instead of doing this, we look at all the | 297 /// building/reuniquing the constant. Instead of doing this, we look at all the |
| 297 /// uses and rewrite all the place holders at once for any constant that uses | 298 /// uses and rewrite all the place holders at once for any constant that uses |
| 298 /// a placeholder. | 299 /// a placeholder. |
| 299 void BitcodeReaderValueList::ResolveConstantForwardRefs() { | 300 void NaClBitcodeReaderValueList::ResolveConstantForwardRefs() { |
| 300 // Sort the values by-pointer so that they are efficient to look up with a | 301 // Sort the values by-pointer so that they are efficient to look up with a |
| 301 // binary search. | 302 // binary search. |
| 302 std::sort(ResolveConstants.begin(), ResolveConstants.end()); | 303 std::sort(ResolveConstants.begin(), ResolveConstants.end()); |
| 303 | 304 |
| 304 SmallVector<Constant*, 64> NewOps; | 305 SmallVector<Constant*, 64> NewOps; |
| 305 | 306 |
| 306 while (!ResolveConstants.empty()) { | 307 while (!ResolveConstants.empty()) { |
| 307 Value *RealVal = operator[](ResolveConstants.back().second); | 308 Value *RealVal = operator[](ResolveConstants.back().second); |
| 308 Constant *Placeholder = ResolveConstants.back().first; | 309 Constant *Placeholder = ResolveConstants.back().first; |
| 309 ResolveConstants.pop_back(); | 310 ResolveConstants.pop_back(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 UserC->destroyConstant(); | 365 UserC->destroyConstant(); |
| 365 NewOps.clear(); | 366 NewOps.clear(); |
| 366 } | 367 } |
| 367 | 368 |
| 368 // Update all ValueHandles, they should be the only users at this point. | 369 // Update all ValueHandles, they should be the only users at this point. |
| 369 Placeholder->replaceAllUsesWith(RealVal); | 370 Placeholder->replaceAllUsesWith(RealVal); |
| 370 delete Placeholder; | 371 delete Placeholder; |
| 371 } | 372 } |
| 372 } | 373 } |
| 373 | 374 |
| 374 void BitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) { | 375 void NaClBitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) { |
| 375 if (Idx == size()) { | 376 if (Idx == size()) { |
| 376 push_back(V); | 377 push_back(V); |
| 377 return; | 378 return; |
| 378 } | 379 } |
| 379 | 380 |
| 380 if (Idx >= size()) | 381 if (Idx >= size()) |
| 381 resize(Idx+1); | 382 resize(Idx+1); |
| 382 | 383 |
| 383 WeakVH &OldV = MDValuePtrs[Idx]; | 384 WeakVH &OldV = MDValuePtrs[Idx]; |
| 384 if (OldV == 0) { | 385 if (OldV == 0) { |
| 385 OldV = V; | 386 OldV = V; |
| 386 return; | 387 return; |
| 387 } | 388 } |
| 388 | 389 |
| 389 // If there was a forward reference to this value, replace it. | 390 // If there was a forward reference to this value, replace it. |
| 390 MDNode *PrevVal = cast<MDNode>(OldV); | 391 MDNode *PrevVal = cast<MDNode>(OldV); |
| 391 OldV->replaceAllUsesWith(V); | 392 OldV->replaceAllUsesWith(V); |
| 392 MDNode::deleteTemporary(PrevVal); | 393 MDNode::deleteTemporary(PrevVal); |
| 393 // Deleting PrevVal sets Idx value in MDValuePtrs to null. Set new | 394 // Deleting PrevVal sets Idx value in MDValuePtrs to null. Set new |
| 394 // value for Idx. | 395 // value for Idx. |
| 395 MDValuePtrs[Idx] = V; | 396 MDValuePtrs[Idx] = V; |
| 396 } | 397 } |
| 397 | 398 |
| 398 Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { | 399 Value *NaClBitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { |
| 399 if (Idx >= size()) | 400 if (Idx >= size()) |
| 400 resize(Idx + 1); | 401 resize(Idx + 1); |
| 401 | 402 |
| 402 if (Value *V = MDValuePtrs[Idx]) { | 403 if (Value *V = MDValuePtrs[Idx]) { |
| 403 assert(V->getType()->isMetadataTy() && "Type mismatch in value table!"); | 404 assert(V->getType()->isMetadataTy() && "Type mismatch in value table!"); |
| 404 return V; | 405 return V; |
| 405 } | 406 } |
| 406 | 407 |
| 407 // Create and return a placeholder, which will later be RAUW'd. | 408 // Create and return a placeholder, which will later be RAUW'd. |
| 408 Value *V = MDNode::getTemporary(Context, ArrayRef<Value*>()); | 409 Value *V = MDNode::getTemporary(Context, ArrayRef<Value*>()); |
| 409 MDValuePtrs[Idx] = V; | 410 MDValuePtrs[Idx] = V; |
| 410 return V; | 411 return V; |
| 411 } | 412 } |
| 412 | 413 |
| 413 Type *BitcodeReader::getTypeByID(unsigned ID) { | 414 Type *NaClBitcodeReader::getTypeByID(unsigned ID) { |
| 414 // The type table size is always specified correctly. | 415 // The type table size is always specified correctly. |
| 415 if (ID >= TypeList.size()) | 416 if (ID >= TypeList.size()) |
| 416 return 0; | 417 return 0; |
| 417 | 418 |
| 418 if (Type *Ty = TypeList[ID]) | 419 if (Type *Ty = TypeList[ID]) |
| 419 return Ty; | 420 return Ty; |
| 420 | 421 |
| 421 // If we have a forward reference, the only possible case is when it is to a | 422 // If we have a forward reference, the only possible case is when it is to a |
| 422 // named struct. Just create a placeholder for now. | 423 // named struct. Just create a placeholder for now. |
| 423 return TypeList[ID] = StructType::create(Context); | 424 return TypeList[ID] = StructType::create(Context); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 441 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; | 442 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; |
| 442 assert((!Alignment || isPowerOf2_32(Alignment)) && | 443 assert((!Alignment || isPowerOf2_32(Alignment)) && |
| 443 "Alignment must be a power of two."); | 444 "Alignment must be a power of two."); |
| 444 | 445 |
| 445 if (Alignment) | 446 if (Alignment) |
| 446 B.addAlignmentAttr(Alignment); | 447 B.addAlignmentAttr(Alignment); |
| 447 B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | | 448 B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | |
| 448 (EncodedAttrs & 0xffff)); | 449 (EncodedAttrs & 0xffff)); |
| 449 } | 450 } |
| 450 | 451 |
| 451 bool BitcodeReader::ParseAttributeBlock() { | 452 bool NaClBitcodeReader::ParseAttributeBlock() { |
| 452 if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) | 453 if (Stream.EnterSubBlock(naclbitc::PARAMATTR_BLOCK_ID)) |
| 453 return Error("Malformed block record"); | 454 return Error("Malformed block record"); |
| 454 | 455 |
| 455 if (!MAttributes.empty()) | 456 if (!MAttributes.empty()) |
| 456 return Error("Multiple PARAMATTR blocks found!"); | 457 return Error("Multiple PARAMATTR blocks found!"); |
| 457 | 458 |
| 458 SmallVector<uint64_t, 64> Record; | 459 SmallVector<uint64_t, 64> Record; |
| 459 | 460 |
| 460 SmallVector<AttributeSet, 8> Attrs; | 461 SmallVector<AttributeSet, 8> Attrs; |
| 461 | 462 |
| 462 // Read all the records. | 463 // Read all the records. |
| 463 while (1) { | 464 while (1) { |
| 464 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 465 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 465 | 466 |
| 466 switch (Entry.Kind) { | 467 switch (Entry.Kind) { |
| 467 case BitstreamEntry::SubBlock: // Handled for us already. | 468 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 468 case BitstreamEntry::Error: | 469 case NaClBitstreamEntry::Error: |
| 469 return Error("Error at end of PARAMATTR block"); | 470 return Error("Error at end of PARAMATTR block"); |
| 470 case BitstreamEntry::EndBlock: | 471 case NaClBitstreamEntry::EndBlock: |
| 471 return false; | 472 return false; |
| 472 case BitstreamEntry::Record: | 473 case NaClBitstreamEntry::Record: |
| 473 // The interesting case. | 474 // The interesting case. |
| 474 break; | 475 break; |
| 475 } | 476 } |
| 476 | 477 |
| 477 // Read a record. | 478 // Read a record. |
| 478 Record.clear(); | 479 Record.clear(); |
| 479 switch (Stream.readRecord(Entry.ID, Record)) { | 480 switch (Stream.readRecord(Entry.ID, Record)) { |
| 480 default: // Default behavior: ignore. | 481 default: // Default behavior: ignore. |
| 481 break; | 482 break; |
| 482 case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] | 483 case naclbitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] |
| 483 // FIXME: Remove in 4.0. | 484 // FIXME: Remove in 4.0. |
| 484 if (Record.size() & 1) | 485 if (Record.size() & 1) |
| 485 return Error("Invalid ENTRY record"); | 486 return Error("Invalid ENTRY record"); |
| 486 | 487 |
| 487 for (unsigned i = 0, e = Record.size(); i != e; i += 2) { | 488 for (unsigned i = 0, e = Record.size(); i != e; i += 2) { |
| 488 AttrBuilder B; | 489 AttrBuilder B; |
| 489 decodeLLVMAttributesForBitcode(B, Record[i+1]); | 490 decodeLLVMAttributesForBitcode(B, Record[i+1]); |
| 490 Attrs.push_back(AttributeSet::get(Context, Record[i], B)); | 491 Attrs.push_back(AttributeSet::get(Context, Record[i], B)); |
| 491 } | 492 } |
| 492 | 493 |
| 493 MAttributes.push_back(AttributeSet::get(Context, Attrs)); | 494 MAttributes.push_back(AttributeSet::get(Context, Attrs)); |
| 494 Attrs.clear(); | 495 Attrs.clear(); |
| 495 break; | 496 break; |
| 496 } | 497 } |
| 497 case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] | 498 case naclbitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] |
| 498 for (unsigned i = 0, e = Record.size(); i != e; ++i) | 499 for (unsigned i = 0, e = Record.size(); i != e; ++i) |
| 499 Attrs.push_back(MAttributeGroups[Record[i]]); | 500 Attrs.push_back(MAttributeGroups[Record[i]]); |
| 500 | 501 |
| 501 MAttributes.push_back(AttributeSet::get(Context, Attrs)); | 502 MAttributes.push_back(AttributeSet::get(Context, Attrs)); |
| 502 Attrs.clear(); | 503 Attrs.clear(); |
| 503 break; | 504 break; |
| 504 } | 505 } |
| 505 } | 506 } |
| 506 } | 507 } |
| 507 } | 508 } |
| 508 | 509 |
| 509 bool BitcodeReader::ParseAttributeGroupBlock() { | 510 bool NaClBitcodeReader::ParseAttributeGroupBlock() { |
| 510 if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) | 511 if (Stream.EnterSubBlock(naclbitc::PARAMATTR_GROUP_BLOCK_ID)) |
| 511 return Error("Malformed block record"); | 512 return Error("Malformed block record"); |
| 512 | 513 |
| 513 if (!MAttributeGroups.empty()) | 514 if (!MAttributeGroups.empty()) |
| 514 return Error("Multiple PARAMATTR_GROUP blocks found!"); | 515 return Error("Multiple PARAMATTR_GROUP blocks found!"); |
| 515 | 516 |
| 516 SmallVector<uint64_t, 64> Record; | 517 SmallVector<uint64_t, 64> Record; |
| 517 | 518 |
| 518 // Read all the records. | 519 // Read all the records. |
| 519 while (1) { | 520 while (1) { |
| 520 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 521 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 521 | 522 |
| 522 switch (Entry.Kind) { | 523 switch (Entry.Kind) { |
| 523 case BitstreamEntry::SubBlock: // Handled for us already. | 524 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 524 case BitstreamEntry::Error: | 525 case NaClBitstreamEntry::Error: |
| 525 return Error("Error at end of PARAMATTR_GROUP block"); | 526 return Error("Error at end of PARAMATTR_GROUP block"); |
| 526 case BitstreamEntry::EndBlock: | 527 case NaClBitstreamEntry::EndBlock: |
| 527 return false; | 528 return false; |
| 528 case BitstreamEntry::Record: | 529 case NaClBitstreamEntry::Record: |
| 529 // The interesting case. | 530 // The interesting case. |
| 530 break; | 531 break; |
| 531 } | 532 } |
| 532 | 533 |
| 533 // Read a record. | 534 // Read a record. |
| 534 Record.clear(); | 535 Record.clear(); |
| 535 switch (Stream.readRecord(Entry.ID, Record)) { | 536 switch (Stream.readRecord(Entry.ID, Record)) { |
| 536 default: // Default behavior: ignore. | 537 default: // Default behavior: ignore. |
| 537 break; | 538 break; |
| 538 case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] | 539 case naclbitc::PARAMATTR_GRP_CODE_ENTRY: { |
| 540 // ENTRY: [grpid, idx, a0, a1, ...] |
| 539 if (Record.size() < 3) | 541 if (Record.size() < 3) |
| 540 return Error("Invalid ENTRY record"); | 542 return Error("Invalid ENTRY record"); |
| 541 | 543 |
| 542 uint64_t GrpID = Record[0]; | 544 uint64_t GrpID = Record[0]; |
| 543 uint64_t Idx = Record[1]; // Index of the object this attribute refers to. | 545 uint64_t Idx = Record[1]; // Index of the object this attribute refers to. |
| 544 | 546 |
| 545 AttrBuilder B; | 547 AttrBuilder B; |
| 546 for (unsigned i = 2, e = Record.size(); i != e; ++i) { | 548 for (unsigned i = 2, e = Record.size(); i != e; ++i) { |
| 547 if (Record[i] == 0) { // Enum attribute | 549 if (Record[i] == 0) { // Enum attribute |
| 548 B.addAttribute(Attribute::AttrKind(Record[++i])); | 550 B.addAttribute(Attribute::AttrKind(Record[++i])); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 574 } | 576 } |
| 575 } | 577 } |
| 576 | 578 |
| 577 MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); | 579 MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); |
| 578 break; | 580 break; |
| 579 } | 581 } |
| 580 } | 582 } |
| 581 } | 583 } |
| 582 } | 584 } |
| 583 | 585 |
| 584 bool BitcodeReader::ParseTypeTable() { | 586 bool NaClBitcodeReader::ParseTypeTable() { |
| 585 if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) | 587 if (Stream.EnterSubBlock(naclbitc::TYPE_BLOCK_ID_NEW)) |
| 586 return Error("Malformed block record"); | 588 return Error("Malformed block record"); |
| 587 | 589 |
| 588 return ParseTypeTableBody(); | 590 return ParseTypeTableBody(); |
| 589 } | 591 } |
| 590 | 592 |
| 591 bool BitcodeReader::ParseTypeTableBody() { | 593 bool NaClBitcodeReader::ParseTypeTableBody() { |
| 592 if (!TypeList.empty()) | 594 if (!TypeList.empty()) |
| 593 return Error("Multiple TYPE_BLOCKs found!"); | 595 return Error("Multiple TYPE_BLOCKs found!"); |
| 594 | 596 |
| 595 SmallVector<uint64_t, 64> Record; | 597 SmallVector<uint64_t, 64> Record; |
| 596 unsigned NumRecords = 0; | 598 unsigned NumRecords = 0; |
| 597 | 599 |
| 598 SmallString<64> TypeName; | 600 SmallString<64> TypeName; |
| 599 | 601 |
| 600 // Read all the records for this type table. | 602 // Read all the records for this type table. |
| 601 while (1) { | 603 while (1) { |
| 602 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 604 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 603 | 605 |
| 604 switch (Entry.Kind) { | 606 switch (Entry.Kind) { |
| 605 case BitstreamEntry::SubBlock: // Handled for us already. | 607 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 606 case BitstreamEntry::Error: | 608 case NaClBitstreamEntry::Error: |
| 607 Error("Error in the type table block"); | 609 Error("Error in the type table block"); |
| 608 return true; | 610 return true; |
| 609 case BitstreamEntry::EndBlock: | 611 case NaClBitstreamEntry::EndBlock: |
| 610 if (NumRecords != TypeList.size()) | 612 if (NumRecords != TypeList.size()) |
| 611 return Error("Invalid type forward reference in TYPE_BLOCK"); | 613 return Error("Invalid type forward reference in TYPE_BLOCK"); |
| 612 return false; | 614 return false; |
| 613 case BitstreamEntry::Record: | 615 case NaClBitstreamEntry::Record: |
| 614 // The interesting case. | 616 // The interesting case. |
| 615 break; | 617 break; |
| 616 } | 618 } |
| 617 | 619 |
| 618 // Read a record. | 620 // Read a record. |
| 619 Record.clear(); | 621 Record.clear(); |
| 620 Type *ResultTy = 0; | 622 Type *ResultTy = 0; |
| 621 switch (Stream.readRecord(Entry.ID, Record)) { | 623 switch (Stream.readRecord(Entry.ID, Record)) { |
| 622 default: return Error("unknown type in type table"); | 624 default: return Error("unknown type in type table"); |
| 623 case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] | 625 case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] |
| 624 // TYPE_CODE_NUMENTRY contains a count of the number of types in the | 626 // TYPE_CODE_NUMENTRY contains a count of the number of types in the |
| 625 // type list. This allows us to reserve space. | 627 // type list. This allows us to reserve space. |
| 626 if (Record.size() < 1) | 628 if (Record.size() < 1) |
| 627 return Error("Invalid TYPE_CODE_NUMENTRY record"); | 629 return Error("Invalid TYPE_CODE_NUMENTRY record"); |
| 628 TypeList.resize(Record[0]); | 630 TypeList.resize(Record[0]); |
| 629 continue; | 631 continue; |
| 630 case bitc::TYPE_CODE_VOID: // VOID | 632 case naclbitc::TYPE_CODE_VOID: // VOID |
| 631 ResultTy = Type::getVoidTy(Context); | 633 ResultTy = Type::getVoidTy(Context); |
| 632 break; | 634 break; |
| 633 case bitc::TYPE_CODE_HALF: // HALF | 635 case naclbitc::TYPE_CODE_HALF: // HALF |
| 634 ResultTy = Type::getHalfTy(Context); | 636 ResultTy = Type::getHalfTy(Context); |
| 635 break; | 637 break; |
| 636 case bitc::TYPE_CODE_FLOAT: // FLOAT | 638 case naclbitc::TYPE_CODE_FLOAT: // FLOAT |
| 637 ResultTy = Type::getFloatTy(Context); | 639 ResultTy = Type::getFloatTy(Context); |
| 638 break; | 640 break; |
| 639 case bitc::TYPE_CODE_DOUBLE: // DOUBLE | 641 case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE |
| 640 ResultTy = Type::getDoubleTy(Context); | 642 ResultTy = Type::getDoubleTy(Context); |
| 641 break; | 643 break; |
| 642 case bitc::TYPE_CODE_X86_FP80: // X86_FP80 | 644 case naclbitc::TYPE_CODE_X86_FP80: // X86_FP80 |
| 643 ResultTy = Type::getX86_FP80Ty(Context); | 645 ResultTy = Type::getX86_FP80Ty(Context); |
| 644 break; | 646 break; |
| 645 case bitc::TYPE_CODE_FP128: // FP128 | 647 case naclbitc::TYPE_CODE_FP128: // FP128 |
| 646 ResultTy = Type::getFP128Ty(Context); | 648 ResultTy = Type::getFP128Ty(Context); |
| 647 break; | 649 break; |
| 648 case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 | 650 case naclbitc::TYPE_CODE_PPC_FP128: // PPC_FP128 |
| 649 ResultTy = Type::getPPC_FP128Ty(Context); | 651 ResultTy = Type::getPPC_FP128Ty(Context); |
| 650 break; | 652 break; |
| 651 case bitc::TYPE_CODE_LABEL: // LABEL | 653 case naclbitc::TYPE_CODE_LABEL: // LABEL |
| 652 ResultTy = Type::getLabelTy(Context); | 654 ResultTy = Type::getLabelTy(Context); |
| 653 break; | 655 break; |
| 654 case bitc::TYPE_CODE_METADATA: // METADATA | 656 case naclbitc::TYPE_CODE_METADATA: // METADATA |
| 655 ResultTy = Type::getMetadataTy(Context); | 657 ResultTy = Type::getMetadataTy(Context); |
| 656 break; | 658 break; |
| 657 case bitc::TYPE_CODE_X86_MMX: // X86_MMX | 659 case naclbitc::TYPE_CODE_X86_MMX: // X86_MMX |
| 658 ResultTy = Type::getX86_MMXTy(Context); | 660 ResultTy = Type::getX86_MMXTy(Context); |
| 659 break; | 661 break; |
| 660 case bitc::TYPE_CODE_INTEGER: // INTEGER: [width] | 662 case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] |
| 661 if (Record.size() < 1) | 663 if (Record.size() < 1) |
| 662 return Error("Invalid Integer type record"); | 664 return Error("Invalid Integer type record"); |
| 663 | 665 |
| 664 ResultTy = IntegerType::get(Context, Record[0]); | 666 ResultTy = IntegerType::get(Context, Record[0]); |
| 665 break; | 667 break; |
| 666 case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or | 668 case naclbitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or |
| 667 // [pointee type, address space] | 669 // [pointee type, address space] |
| 668 if (Record.size() < 1) | 670 if (Record.size() < 1) |
| 669 return Error("Invalid POINTER type record"); | 671 return Error("Invalid POINTER type record"); |
| 670 unsigned AddressSpace = 0; | 672 unsigned AddressSpace = 0; |
| 671 if (Record.size() == 2) | 673 if (Record.size() == 2) |
| 672 AddressSpace = Record[1]; | 674 AddressSpace = Record[1]; |
| 673 ResultTy = getTypeByID(Record[0]); | 675 ResultTy = getTypeByID(Record[0]); |
| 674 if (ResultTy == 0) return Error("invalid element type in pointer type"); | 676 if (ResultTy == 0) return Error("invalid element type in pointer type"); |
| 675 ResultTy = PointerType::get(ResultTy, AddressSpace); | 677 ResultTy = PointerType::get(ResultTy, AddressSpace); |
| 676 break; | 678 break; |
| 677 } | 679 } |
| 678 case bitc::TYPE_CODE_FUNCTION_OLD: { | 680 case naclbitc::TYPE_CODE_FUNCTION_OLD: { |
| 679 // FIXME: attrid is dead, remove it in LLVM 4.0 | 681 // FIXME: attrid is dead, remove it in LLVM 4.0 |
| 680 // FUNCTION: [vararg, attrid, retty, paramty x N] | 682 // FUNCTION: [vararg, attrid, retty, paramty x N] |
| 681 if (Record.size() < 3) | 683 if (Record.size() < 3) |
| 682 return Error("Invalid FUNCTION type record"); | 684 return Error("Invalid FUNCTION type record"); |
| 683 SmallVector<Type*, 8> ArgTys; | 685 SmallVector<Type*, 8> ArgTys; |
| 684 for (unsigned i = 3, e = Record.size(); i != e; ++i) { | 686 for (unsigned i = 3, e = Record.size(); i != e; ++i) { |
| 685 if (Type *T = getTypeByID(Record[i])) | 687 if (Type *T = getTypeByID(Record[i])) |
| 686 ArgTys.push_back(T); | 688 ArgTys.push_back(T); |
| 687 else | 689 else |
| 688 break; | 690 break; |
| 689 } | 691 } |
| 690 | 692 |
| 691 ResultTy = getTypeByID(Record[2]); | 693 ResultTy = getTypeByID(Record[2]); |
| 692 if (ResultTy == 0 || ArgTys.size() < Record.size()-3) | 694 if (ResultTy == 0 || ArgTys.size() < Record.size()-3) |
| 693 return Error("invalid type in function type"); | 695 return Error("invalid type in function type"); |
| 694 | 696 |
| 695 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); | 697 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
| 696 break; | 698 break; |
| 697 } | 699 } |
| 698 case bitc::TYPE_CODE_FUNCTION: { | 700 case naclbitc::TYPE_CODE_FUNCTION: { |
| 699 // FUNCTION: [vararg, retty, paramty x N] | 701 // FUNCTION: [vararg, retty, paramty x N] |
| 700 if (Record.size() < 2) | 702 if (Record.size() < 2) |
| 701 return Error("Invalid FUNCTION type record"); | 703 return Error("Invalid FUNCTION type record"); |
| 702 SmallVector<Type*, 8> ArgTys; | 704 SmallVector<Type*, 8> ArgTys; |
| 703 for (unsigned i = 2, e = Record.size(); i != e; ++i) { | 705 for (unsigned i = 2, e = Record.size(); i != e; ++i) { |
| 704 if (Type *T = getTypeByID(Record[i])) | 706 if (Type *T = getTypeByID(Record[i])) |
| 705 ArgTys.push_back(T); | 707 ArgTys.push_back(T); |
| 706 else | 708 else |
| 707 break; | 709 break; |
| 708 } | 710 } |
| 709 | 711 |
| 710 ResultTy = getTypeByID(Record[1]); | 712 ResultTy = getTypeByID(Record[1]); |
| 711 if (ResultTy == 0 || ArgTys.size() < Record.size()-2) | 713 if (ResultTy == 0 || ArgTys.size() < Record.size()-2) |
| 712 return Error("invalid type in function type"); | 714 return Error("invalid type in function type"); |
| 713 | 715 |
| 714 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); | 716 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
| 715 break; | 717 break; |
| 716 } | 718 } |
| 717 case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] | 719 case naclbitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] |
| 718 if (Record.size() < 1) | 720 if (Record.size() < 1) |
| 719 return Error("Invalid STRUCT type record"); | 721 return Error("Invalid STRUCT type record"); |
| 720 SmallVector<Type*, 8> EltTys; | 722 SmallVector<Type*, 8> EltTys; |
| 721 for (unsigned i = 1, e = Record.size(); i != e; ++i) { | 723 for (unsigned i = 1, e = Record.size(); i != e; ++i) { |
| 722 if (Type *T = getTypeByID(Record[i])) | 724 if (Type *T = getTypeByID(Record[i])) |
| 723 EltTys.push_back(T); | 725 EltTys.push_back(T); |
| 724 else | 726 else |
| 725 break; | 727 break; |
| 726 } | 728 } |
| 727 if (EltTys.size() != Record.size()-1) | 729 if (EltTys.size() != Record.size()-1) |
| 728 return Error("invalid type in struct type"); | 730 return Error("invalid type in struct type"); |
| 729 ResultTy = StructType::get(Context, EltTys, Record[0]); | 731 ResultTy = StructType::get(Context, EltTys, Record[0]); |
| 730 break; | 732 break; |
| 731 } | 733 } |
| 732 case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] | 734 case naclbitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] |
| 733 if (ConvertToString(Record, 0, TypeName)) | 735 if (ConvertToString(Record, 0, TypeName)) |
| 734 return Error("Invalid STRUCT_NAME record"); | 736 return Error("Invalid STRUCT_NAME record"); |
| 735 continue; | 737 continue; |
| 736 | 738 |
| 737 case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] | 739 case naclbitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] |
| 738 if (Record.size() < 1) | 740 if (Record.size() < 1) |
| 739 return Error("Invalid STRUCT type record"); | 741 return Error("Invalid STRUCT type record"); |
| 740 | 742 |
| 741 if (NumRecords >= TypeList.size()) | 743 if (NumRecords >= TypeList.size()) |
| 742 return Error("invalid TYPE table"); | 744 return Error("invalid TYPE table"); |
| 743 | 745 |
| 744 // Check to see if this was forward referenced, if so fill in the temp. | 746 // Check to see if this was forward referenced, if so fill in the temp. |
| 745 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); | 747 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); |
| 746 if (Res) { | 748 if (Res) { |
| 747 Res->setName(TypeName); | 749 Res->setName(TypeName); |
| 748 TypeList[NumRecords] = 0; | 750 TypeList[NumRecords] = 0; |
| 749 } else // Otherwise, create a new struct. | 751 } else // Otherwise, create a new struct. |
| 750 Res = StructType::create(Context, TypeName); | 752 Res = StructType::create(Context, TypeName); |
| 751 TypeName.clear(); | 753 TypeName.clear(); |
| 752 | 754 |
| 753 SmallVector<Type*, 8> EltTys; | 755 SmallVector<Type*, 8> EltTys; |
| 754 for (unsigned i = 1, e = Record.size(); i != e; ++i) { | 756 for (unsigned i = 1, e = Record.size(); i != e; ++i) { |
| 755 if (Type *T = getTypeByID(Record[i])) | 757 if (Type *T = getTypeByID(Record[i])) |
| 756 EltTys.push_back(T); | 758 EltTys.push_back(T); |
| 757 else | 759 else |
| 758 break; | 760 break; |
| 759 } | 761 } |
| 760 if (EltTys.size() != Record.size()-1) | 762 if (EltTys.size() != Record.size()-1) |
| 761 return Error("invalid STRUCT type record"); | 763 return Error("invalid STRUCT type record"); |
| 762 Res->setBody(EltTys, Record[0]); | 764 Res->setBody(EltTys, Record[0]); |
| 763 ResultTy = Res; | 765 ResultTy = Res; |
| 764 break; | 766 break; |
| 765 } | 767 } |
| 766 case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] | 768 case naclbitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] |
| 767 if (Record.size() != 1) | 769 if (Record.size() != 1) |
| 768 return Error("Invalid OPAQUE type record"); | 770 return Error("Invalid OPAQUE type record"); |
| 769 | 771 |
| 770 if (NumRecords >= TypeList.size()) | 772 if (NumRecords >= TypeList.size()) |
| 771 return Error("invalid TYPE table"); | 773 return Error("invalid TYPE table"); |
| 772 | 774 |
| 773 // Check to see if this was forward referenced, if so fill in the temp. | 775 // Check to see if this was forward referenced, if so fill in the temp. |
| 774 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); | 776 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); |
| 775 if (Res) { | 777 if (Res) { |
| 776 Res->setName(TypeName); | 778 Res->setName(TypeName); |
| 777 TypeList[NumRecords] = 0; | 779 TypeList[NumRecords] = 0; |
| 778 } else // Otherwise, create a new struct with no body. | 780 } else // Otherwise, create a new struct with no body. |
| 779 Res = StructType::create(Context, TypeName); | 781 Res = StructType::create(Context, TypeName); |
| 780 TypeName.clear(); | 782 TypeName.clear(); |
| 781 ResultTy = Res; | 783 ResultTy = Res; |
| 782 break; | 784 break; |
| 783 } | 785 } |
| 784 case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] | 786 case naclbitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] |
| 785 if (Record.size() < 2) | 787 if (Record.size() < 2) |
| 786 return Error("Invalid ARRAY type record"); | 788 return Error("Invalid ARRAY type record"); |
| 787 if ((ResultTy = getTypeByID(Record[1]))) | 789 if ((ResultTy = getTypeByID(Record[1]))) |
| 788 ResultTy = ArrayType::get(ResultTy, Record[0]); | 790 ResultTy = ArrayType::get(ResultTy, Record[0]); |
| 789 else | 791 else |
| 790 return Error("Invalid ARRAY type element"); | 792 return Error("Invalid ARRAY type element"); |
| 791 break; | 793 break; |
| 792 case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] | 794 case naclbitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] |
| 793 if (Record.size() < 2) | 795 if (Record.size() < 2) |
| 794 return Error("Invalid VECTOR type record"); | 796 return Error("Invalid VECTOR type record"); |
| 795 if ((ResultTy = getTypeByID(Record[1]))) | 797 if ((ResultTy = getTypeByID(Record[1]))) |
| 796 ResultTy = VectorType::get(ResultTy, Record[0]); | 798 ResultTy = VectorType::get(ResultTy, Record[0]); |
| 797 else | 799 else |
| 798 return Error("Invalid ARRAY type element"); | 800 return Error("Invalid ARRAY type element"); |
| 799 break; | 801 break; |
| 800 } | 802 } |
| 801 | 803 |
| 802 if (NumRecords >= TypeList.size()) | 804 if (NumRecords >= TypeList.size()) |
| 803 return Error("invalid TYPE table"); | 805 return Error("invalid TYPE table"); |
| 804 assert(ResultTy && "Didn't read a type?"); | 806 assert(ResultTy && "Didn't read a type?"); |
| 805 assert(TypeList[NumRecords] == 0 && "Already read type?"); | 807 assert(TypeList[NumRecords] == 0 && "Already read type?"); |
| 806 TypeList[NumRecords++] = ResultTy; | 808 TypeList[NumRecords++] = ResultTy; |
| 807 } | 809 } |
| 808 } | 810 } |
| 809 | 811 |
| 810 bool BitcodeReader::ParseValueSymbolTable() { | 812 bool NaClBitcodeReader::ParseValueSymbolTable() { |
| 811 if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) | 813 if (Stream.EnterSubBlock(naclbitc::VALUE_SYMTAB_BLOCK_ID)) |
| 812 return Error("Malformed block record"); | 814 return Error("Malformed block record"); |
| 813 | 815 |
| 814 SmallVector<uint64_t, 64> Record; | 816 SmallVector<uint64_t, 64> Record; |
| 815 | 817 |
| 816 // Read all the records for this value table. | 818 // Read all the records for this value table. |
| 817 SmallString<128> ValueName; | 819 SmallString<128> ValueName; |
| 818 while (1) { | 820 while (1) { |
| 819 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 821 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 820 | 822 |
| 821 switch (Entry.Kind) { | 823 switch (Entry.Kind) { |
| 822 case BitstreamEntry::SubBlock: // Handled for us already. | 824 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 823 case BitstreamEntry::Error: | 825 case NaClBitstreamEntry::Error: |
| 824 return Error("malformed value symbol table block"); | 826 return Error("malformed value symbol table block"); |
| 825 case BitstreamEntry::EndBlock: | 827 case NaClBitstreamEntry::EndBlock: |
| 826 return false; | 828 return false; |
| 827 case BitstreamEntry::Record: | 829 case NaClBitstreamEntry::Record: |
| 828 // The interesting case. | 830 // The interesting case. |
| 829 break; | 831 break; |
| 830 } | 832 } |
| 831 | 833 |
| 832 // Read a record. | 834 // Read a record. |
| 833 Record.clear(); | 835 Record.clear(); |
| 834 switch (Stream.readRecord(Entry.ID, Record)) { | 836 switch (Stream.readRecord(Entry.ID, Record)) { |
| 835 default: // Default behavior: unknown type. | 837 default: // Default behavior: unknown type. |
| 836 break; | 838 break; |
| 837 case bitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] | 839 case naclbitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] |
| 838 if (ConvertToString(Record, 1, ValueName)) | 840 if (ConvertToString(Record, 1, ValueName)) |
| 839 return Error("Invalid VST_ENTRY record"); | 841 return Error("Invalid VST_ENTRY record"); |
| 840 unsigned ValueID = Record[0]; | 842 unsigned ValueID = Record[0]; |
| 841 if (ValueID >= ValueList.size()) | 843 if (ValueID >= ValueList.size()) |
| 842 return Error("Invalid Value ID in VST_ENTRY record"); | 844 return Error("Invalid Value ID in VST_ENTRY record"); |
| 843 Value *V = ValueList[ValueID]; | 845 Value *V = ValueList[ValueID]; |
| 844 | 846 |
| 845 V->setName(StringRef(ValueName.data(), ValueName.size())); | 847 V->setName(StringRef(ValueName.data(), ValueName.size())); |
| 846 ValueName.clear(); | 848 ValueName.clear(); |
| 847 break; | 849 break; |
| 848 } | 850 } |
| 849 case bitc::VST_CODE_BBENTRY: { | 851 case naclbitc::VST_CODE_BBENTRY: { |
| 850 if (ConvertToString(Record, 1, ValueName)) | 852 if (ConvertToString(Record, 1, ValueName)) |
| 851 return Error("Invalid VST_BBENTRY record"); | 853 return Error("Invalid VST_BBENTRY record"); |
| 852 BasicBlock *BB = getBasicBlock(Record[0]); | 854 BasicBlock *BB = getBasicBlock(Record[0]); |
| 853 if (BB == 0) | 855 if (BB == 0) |
| 854 return Error("Invalid BB ID in VST_BBENTRY record"); | 856 return Error("Invalid BB ID in VST_BBENTRY record"); |
| 855 | 857 |
| 856 BB->setName(StringRef(ValueName.data(), ValueName.size())); | 858 BB->setName(StringRef(ValueName.data(), ValueName.size())); |
| 857 ValueName.clear(); | 859 ValueName.clear(); |
| 858 break; | 860 break; |
| 859 } | 861 } |
| 860 } | 862 } |
| 861 } | 863 } |
| 862 } | 864 } |
| 863 | 865 |
| 864 bool BitcodeReader::ParseMetadata() { | 866 bool NaClBitcodeReader::ParseMetadata() { |
| 865 unsigned NextMDValueNo = MDValueList.size(); | 867 unsigned NextMDValueNo = MDValueList.size(); |
| 866 | 868 |
| 867 if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) | 869 if (Stream.EnterSubBlock(naclbitc::METADATA_BLOCK_ID)) |
| 868 return Error("Malformed block record"); | 870 return Error("Malformed block record"); |
| 869 | 871 |
| 870 SmallVector<uint64_t, 64> Record; | 872 SmallVector<uint64_t, 64> Record; |
| 871 | 873 |
| 872 // Read all the records. | 874 // Read all the records. |
| 873 while (1) { | 875 while (1) { |
| 874 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 876 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 875 | 877 |
| 876 switch (Entry.Kind) { | 878 switch (Entry.Kind) { |
| 877 case BitstreamEntry::SubBlock: // Handled for us already. | 879 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 878 case BitstreamEntry::Error: | 880 case NaClBitstreamEntry::Error: |
| 879 Error("malformed metadata block"); | 881 Error("malformed metadata block"); |
| 880 return true; | 882 return true; |
| 881 case BitstreamEntry::EndBlock: | 883 case NaClBitstreamEntry::EndBlock: |
| 882 return false; | 884 return false; |
| 883 case BitstreamEntry::Record: | 885 case NaClBitstreamEntry::Record: |
| 884 // The interesting case. | 886 // The interesting case. |
| 885 break; | 887 break; |
| 886 } | 888 } |
| 887 | 889 |
| 888 bool IsFunctionLocal = false; | 890 bool IsFunctionLocal = false; |
| 889 // Read a record. | 891 // Read a record. |
| 890 Record.clear(); | 892 Record.clear(); |
| 891 unsigned Code = Stream.readRecord(Entry.ID, Record); | 893 unsigned Code = Stream.readRecord(Entry.ID, Record); |
| 892 switch (Code) { | 894 switch (Code) { |
| 893 default: // Default behavior: ignore. | 895 default: // Default behavior: ignore. |
| 894 break; | 896 break; |
| 895 case bitc::METADATA_NAME: { | 897 case naclbitc::METADATA_NAME: { |
| 896 // Read name of the named metadata. | 898 // Read name of the named metadata. |
| 897 SmallString<8> Name(Record.begin(), Record.end()); | 899 SmallString<8> Name(Record.begin(), Record.end()); |
| 898 Record.clear(); | 900 Record.clear(); |
| 899 Code = Stream.ReadCode(); | 901 Code = Stream.ReadCode(); |
| 900 | 902 |
| 901 // METADATA_NAME is always followed by METADATA_NAMED_NODE. | 903 // METADATA_NAME is always followed by METADATA_NAMED_NODE. |
| 902 unsigned NextBitCode = Stream.readRecord(Code, Record); | 904 unsigned NextBitCode = Stream.readRecord(Code, Record); |
| 903 assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode; | 905 assert(NextBitCode == naclbitc::METADATA_NAMED_NODE); (void)NextBitCode; |
| 904 | 906 |
| 905 // Read named metadata elements. | 907 // Read named metadata elements. |
| 906 unsigned Size = Record.size(); | 908 unsigned Size = Record.size(); |
| 907 NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); | 909 NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); |
| 908 for (unsigned i = 0; i != Size; ++i) { | 910 for (unsigned i = 0; i != Size; ++i) { |
| 909 MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i])); | 911 MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i])); |
| 910 if (MD == 0) | 912 if (MD == 0) |
| 911 return Error("Malformed metadata record"); | 913 return Error("Malformed metadata record"); |
| 912 NMD->addOperand(MD); | 914 NMD->addOperand(MD); |
| 913 } | 915 } |
| 914 break; | 916 break; |
| 915 } | 917 } |
| 916 case bitc::METADATA_FN_NODE: | 918 case naclbitc::METADATA_FN_NODE: |
| 917 IsFunctionLocal = true; | 919 IsFunctionLocal = true; |
| 918 // fall-through | 920 // fall-through |
| 919 case bitc::METADATA_NODE: { | 921 case naclbitc::METADATA_NODE: { |
| 920 if (Record.size() % 2 == 1) | 922 if (Record.size() % 2 == 1) |
| 921 return Error("Invalid METADATA_NODE record"); | 923 return Error("Invalid METADATA_NODE record"); |
| 922 | 924 |
| 923 unsigned Size = Record.size(); | 925 unsigned Size = Record.size(); |
| 924 SmallVector<Value*, 8> Elts; | 926 SmallVector<Value*, 8> Elts; |
| 925 for (unsigned i = 0; i != Size; i += 2) { | 927 for (unsigned i = 0; i != Size; i += 2) { |
| 926 Type *Ty = getTypeByID(Record[i]); | 928 Type *Ty = getTypeByID(Record[i]); |
| 927 if (!Ty) return Error("Invalid METADATA_NODE record"); | 929 if (!Ty) return Error("Invalid METADATA_NODE record"); |
| 928 if (Ty->isMetadataTy()) | 930 if (Ty->isMetadataTy()) |
| 929 Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); | 931 Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); |
| 930 else if (!Ty->isVoidTy()) | 932 else if (!Ty->isVoidTy()) |
| 931 Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); | 933 Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); |
| 932 else | 934 else |
| 933 Elts.push_back(NULL); | 935 Elts.push_back(NULL); |
| 934 } | 936 } |
| 935 Value *V = MDNode::getWhenValsUnresolved(Context, Elts, IsFunctionLocal); | 937 Value *V = MDNode::getWhenValsUnresolved(Context, Elts, IsFunctionLocal); |
| 936 IsFunctionLocal = false; | 938 IsFunctionLocal = false; |
| 937 MDValueList.AssignValue(V, NextMDValueNo++); | 939 MDValueList.AssignValue(V, NextMDValueNo++); |
| 938 break; | 940 break; |
| 939 } | 941 } |
| 940 case bitc::METADATA_STRING: { | 942 case naclbitc::METADATA_STRING: { |
| 941 SmallString<8> String(Record.begin(), Record.end()); | 943 SmallString<8> String(Record.begin(), Record.end()); |
| 942 Value *V = MDString::get(Context, String); | 944 Value *V = MDString::get(Context, String); |
| 943 MDValueList.AssignValue(V, NextMDValueNo++); | 945 MDValueList.AssignValue(V, NextMDValueNo++); |
| 944 break; | 946 break; |
| 945 } | 947 } |
| 946 case bitc::METADATA_KIND: { | 948 case naclbitc::METADATA_KIND: { |
| 947 if (Record.size() < 2) | 949 if (Record.size() < 2) |
| 948 return Error("Invalid METADATA_KIND record"); | 950 return Error("Invalid METADATA_KIND record"); |
| 949 | 951 |
| 950 unsigned Kind = Record[0]; | 952 unsigned Kind = Record[0]; |
| 951 SmallString<8> Name(Record.begin()+1, Record.end()); | 953 SmallString<8> Name(Record.begin()+1, Record.end()); |
| 952 | 954 |
| 953 unsigned NewKind = TheModule->getMDKindID(Name.str()); | 955 unsigned NewKind = TheModule->getMDKindID(Name.str()); |
| 954 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) | 956 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) |
| 955 return Error("Conflicting METADATA_KIND records"); | 957 return Error("Conflicting METADATA_KIND records"); |
| 956 break; | 958 break; |
| 957 } | 959 } |
| 958 } | 960 } |
| 959 } | 961 } |
| 960 } | 962 } |
| 961 | 963 |
| 962 /// decodeSignRotatedValue - Decode a signed value stored with the sign bit in | 964 /// decodeSignRotatedValue - Decode a signed value stored with the sign bit in |
| 963 /// the LSB for dense VBR encoding. | 965 /// the LSB for dense VBR encoding. |
| 964 uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { | 966 uint64_t NaClBitcodeReader::decodeSignRotatedValue(uint64_t V) { |
| 965 if ((V & 1) == 0) | 967 if ((V & 1) == 0) |
| 966 return V >> 1; | 968 return V >> 1; |
| 967 if (V != 1) | 969 if (V != 1) |
| 968 return -(V >> 1); | 970 return -(V >> 1); |
| 969 // There is no such thing as -0 with integers. "-0" really means MININT. | 971 // There is no such thing as -0 with integers. "-0" really means MININT. |
| 970 return 1ULL << 63; | 972 return 1ULL << 63; |
| 971 } | 973 } |
| 972 | 974 |
| 973 /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global | 975 /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global |
| 974 /// values and aliases that we can. | 976 /// values and aliases that we can. |
| 975 bool BitcodeReader::ResolveGlobalAndAliasInits() { | 977 bool NaClBitcodeReader::ResolveGlobalAndAliasInits() { |
| 976 std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; | 978 std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; |
| 977 std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; | 979 std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; |
| 978 | 980 |
| 979 GlobalInitWorklist.swap(GlobalInits); | 981 GlobalInitWorklist.swap(GlobalInits); |
| 980 AliasInitWorklist.swap(AliasInits); | 982 AliasInitWorklist.swap(AliasInits); |
| 981 | 983 |
| 982 while (!GlobalInitWorklist.empty()) { | 984 while (!GlobalInitWorklist.empty()) { |
| 983 unsigned ValID = GlobalInitWorklist.back().second; | 985 unsigned ValID = GlobalInitWorklist.back().second; |
| 984 if (ValID >= ValueList.size()) { | 986 if (ValID >= ValueList.size()) { |
| 985 // Not ready to resolve this yet, it requires something later in the file. | 987 // Not ready to resolve this yet, it requires something later in the file. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1004 return Error("Alias initializer is not a constant!"); | 1006 return Error("Alias initializer is not a constant!"); |
| 1005 } | 1007 } |
| 1006 AliasInitWorklist.pop_back(); | 1008 AliasInitWorklist.pop_back(); |
| 1007 } | 1009 } |
| 1008 return false; | 1010 return false; |
| 1009 } | 1011 } |
| 1010 | 1012 |
| 1011 static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { | 1013 static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { |
| 1012 SmallVector<uint64_t, 8> Words(Vals.size()); | 1014 SmallVector<uint64_t, 8> Words(Vals.size()); |
| 1013 std::transform(Vals.begin(), Vals.end(), Words.begin(), | 1015 std::transform(Vals.begin(), Vals.end(), Words.begin(), |
| 1014 BitcodeReader::decodeSignRotatedValue); | 1016 NaClBitcodeReader::decodeSignRotatedValue); |
| 1015 | 1017 |
| 1016 return APInt(TypeBits, Words); | 1018 return APInt(TypeBits, Words); |
| 1017 } | 1019 } |
| 1018 | 1020 |
| 1019 bool BitcodeReader::ParseConstants() { | 1021 bool NaClBitcodeReader::ParseConstants() { |
| 1020 if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) | 1022 if (Stream.EnterSubBlock(naclbitc::CONSTANTS_BLOCK_ID)) |
| 1021 return Error("Malformed block record"); | 1023 return Error("Malformed block record"); |
| 1022 | 1024 |
| 1023 SmallVector<uint64_t, 64> Record; | 1025 SmallVector<uint64_t, 64> Record; |
| 1024 | 1026 |
| 1025 // Read all the records for this value table. | 1027 // Read all the records for this value table. |
| 1026 Type *CurTy = Type::getInt32Ty(Context); | 1028 Type *CurTy = Type::getInt32Ty(Context); |
| 1027 unsigned NextCstNo = ValueList.size(); | 1029 unsigned NextCstNo = ValueList.size(); |
| 1028 while (1) { | 1030 while (1) { |
| 1029 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 1031 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 1030 | 1032 |
| 1031 switch (Entry.Kind) { | 1033 switch (Entry.Kind) { |
| 1032 case BitstreamEntry::SubBlock: // Handled for us already. | 1034 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 1033 case BitstreamEntry::Error: | 1035 case NaClBitstreamEntry::Error: |
| 1034 return Error("malformed block record in AST file"); | 1036 return Error("malformed block record in AST file"); |
| 1035 case BitstreamEntry::EndBlock: | 1037 case NaClBitstreamEntry::EndBlock: |
| 1036 if (NextCstNo != ValueList.size()) | 1038 if (NextCstNo != ValueList.size()) |
| 1037 return Error("Invalid constant reference!"); | 1039 return Error("Invalid constant reference!"); |
| 1038 | 1040 |
| 1039 // Once all the constants have been read, go through and resolve forward | 1041 // Once all the constants have been read, go through and resolve forward |
| 1040 // references. | 1042 // references. |
| 1041 ValueList.ResolveConstantForwardRefs(); | 1043 ValueList.ResolveConstantForwardRefs(); |
| 1042 return false; | 1044 return false; |
| 1043 case BitstreamEntry::Record: | 1045 case NaClBitstreamEntry::Record: |
| 1044 // The interesting case. | 1046 // The interesting case. |
| 1045 break; | 1047 break; |
| 1046 } | 1048 } |
| 1047 | 1049 |
| 1048 // Read a record. | 1050 // Read a record. |
| 1049 Record.clear(); | 1051 Record.clear(); |
| 1050 Value *V = 0; | 1052 Value *V = 0; |
| 1051 unsigned BitCode = Stream.readRecord(Entry.ID, Record); | 1053 unsigned BitCode = Stream.readRecord(Entry.ID, Record); |
| 1052 switch (BitCode) { | 1054 switch (BitCode) { |
| 1053 default: // Default behavior: unknown constant | 1055 default: // Default behavior: unknown constant |
| 1054 case bitc::CST_CODE_UNDEF: // UNDEF | 1056 case naclbitc::CST_CODE_UNDEF: // UNDEF |
| 1055 V = UndefValue::get(CurTy); | 1057 V = UndefValue::get(CurTy); |
| 1056 break; | 1058 break; |
| 1057 case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] | 1059 case naclbitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] |
| 1058 if (Record.empty()) | 1060 if (Record.empty()) |
| 1059 return Error("Malformed CST_SETTYPE record"); | 1061 return Error("Malformed CST_SETTYPE record"); |
| 1060 if (Record[0] >= TypeList.size()) | 1062 if (Record[0] >= TypeList.size()) |
| 1061 return Error("Invalid Type ID in CST_SETTYPE record"); | 1063 return Error("Invalid Type ID in CST_SETTYPE record"); |
| 1062 CurTy = TypeList[Record[0]]; | 1064 CurTy = TypeList[Record[0]]; |
| 1063 continue; // Skip the ValueList manipulation. | 1065 continue; // Skip the ValueList manipulation. |
| 1064 case bitc::CST_CODE_NULL: // NULL | 1066 case naclbitc::CST_CODE_NULL: // NULL |
| 1065 V = Constant::getNullValue(CurTy); | 1067 V = Constant::getNullValue(CurTy); |
| 1066 break; | 1068 break; |
| 1067 case bitc::CST_CODE_INTEGER: // INTEGER: [intval] | 1069 case naclbitc::CST_CODE_INTEGER: // INTEGER: [intval] |
| 1068 if (!CurTy->isIntegerTy() || Record.empty()) | 1070 if (!CurTy->isIntegerTy() || Record.empty()) |
| 1069 return Error("Invalid CST_INTEGER record"); | 1071 return Error("Invalid CST_INTEGER record"); |
| 1070 V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); | 1072 V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); |
| 1071 break; | 1073 break; |
| 1072 case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] | 1074 case naclbitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] |
| 1073 if (!CurTy->isIntegerTy() || Record.empty()) | 1075 if (!CurTy->isIntegerTy() || Record.empty()) |
| 1074 return Error("Invalid WIDE_INTEGER record"); | 1076 return Error("Invalid WIDE_INTEGER record"); |
| 1075 | 1077 |
| 1076 APInt VInt = ReadWideAPInt(Record, | 1078 APInt VInt = ReadWideAPInt(Record, |
| 1077 cast<IntegerType>(CurTy)->getBitWidth()); | 1079 cast<IntegerType>(CurTy)->getBitWidth()); |
| 1078 V = ConstantInt::get(Context, VInt); | 1080 V = ConstantInt::get(Context, VInt); |
| 1079 | 1081 |
| 1080 break; | 1082 break; |
| 1081 } | 1083 } |
| 1082 case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] | 1084 case naclbitc::CST_CODE_FLOAT: { // FLOAT: [fpval] |
| 1083 if (Record.empty()) | 1085 if (Record.empty()) |
| 1084 return Error("Invalid FLOAT record"); | 1086 return Error("Invalid FLOAT record"); |
| 1085 if (CurTy->isHalfTy()) | 1087 if (CurTy->isHalfTy()) |
| 1086 V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, | 1088 V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, |
| 1087 APInt(16, (uint16_t)Record[0]))); | 1089 APInt(16, (uint16_t)Record[0]))); |
| 1088 else if (CurTy->isFloatTy()) | 1090 else if (CurTy->isFloatTy()) |
| 1089 V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, | 1091 V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, |
| 1090 APInt(32, (uint32_t)Record[0]))); | 1092 APInt(32, (uint32_t)Record[0]))); |
| 1091 else if (CurTy->isDoubleTy()) | 1093 else if (CurTy->isDoubleTy()) |
| 1092 V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, | 1094 V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, |
| 1093 APInt(64, Record[0]))); | 1095 APInt(64, Record[0]))); |
| 1094 else if (CurTy->isX86_FP80Ty()) { | 1096 else if (CurTy->isX86_FP80Ty()) { |
| 1095 // Bits are not stored the same way as a normal i80 APInt, compensate. | 1097 // Bits are not stored the same way as a normal i80 APInt, compensate. |
| 1096 uint64_t Rearrange[2]; | 1098 uint64_t Rearrange[2]; |
| 1097 Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); | 1099 Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); |
| 1098 Rearrange[1] = Record[0] >> 48; | 1100 Rearrange[1] = Record[0] >> 48; |
| 1099 V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, | 1101 V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, |
| 1100 APInt(80, Rearrange))); | 1102 APInt(80, Rearrange))); |
| 1101 } else if (CurTy->isFP128Ty()) | 1103 } else if (CurTy->isFP128Ty()) |
| 1102 V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, | 1104 V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, |
| 1103 APInt(128, Record))); | 1105 APInt(128, Record))); |
| 1104 else if (CurTy->isPPC_FP128Ty()) | 1106 else if (CurTy->isPPC_FP128Ty()) |
| 1105 V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, | 1107 V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, |
| 1106 APInt(128, Record))); | 1108 APInt(128, Record))); |
| 1107 else | 1109 else |
| 1108 V = UndefValue::get(CurTy); | 1110 V = UndefValue::get(CurTy); |
| 1109 break; | 1111 break; |
| 1110 } | 1112 } |
| 1111 | 1113 |
| 1112 case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] | 1114 case naclbitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] |
| 1113 if (Record.empty()) | 1115 if (Record.empty()) |
| 1114 return Error("Invalid CST_AGGREGATE record"); | 1116 return Error("Invalid CST_AGGREGATE record"); |
| 1115 | 1117 |
| 1116 unsigned Size = Record.size(); | 1118 unsigned Size = Record.size(); |
| 1117 SmallVector<Constant*, 16> Elts; | 1119 SmallVector<Constant*, 16> Elts; |
| 1118 | 1120 |
| 1119 if (StructType *STy = dyn_cast<StructType>(CurTy)) { | 1121 if (StructType *STy = dyn_cast<StructType>(CurTy)) { |
| 1120 for (unsigned i = 0; i != Size; ++i) | 1122 for (unsigned i = 0; i != Size; ++i) |
| 1121 Elts.push_back(ValueList.getConstantFwdRef(Record[i], | 1123 Elts.push_back(ValueList.getConstantFwdRef(Record[i], |
| 1122 STy->getElementType(i))); | 1124 STy->getElementType(i))); |
| 1123 V = ConstantStruct::get(STy, Elts); | 1125 V = ConstantStruct::get(STy, Elts); |
| 1124 } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { | 1126 } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { |
| 1125 Type *EltTy = ATy->getElementType(); | 1127 Type *EltTy = ATy->getElementType(); |
| 1126 for (unsigned i = 0; i != Size; ++i) | 1128 for (unsigned i = 0; i != Size; ++i) |
| 1127 Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); | 1129 Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); |
| 1128 V = ConstantArray::get(ATy, Elts); | 1130 V = ConstantArray::get(ATy, Elts); |
| 1129 } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { | 1131 } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { |
| 1130 Type *EltTy = VTy->getElementType(); | 1132 Type *EltTy = VTy->getElementType(); |
| 1131 for (unsigned i = 0; i != Size; ++i) | 1133 for (unsigned i = 0; i != Size; ++i) |
| 1132 Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); | 1134 Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); |
| 1133 V = ConstantVector::get(Elts); | 1135 V = ConstantVector::get(Elts); |
| 1134 } else { | 1136 } else { |
| 1135 V = UndefValue::get(CurTy); | 1137 V = UndefValue::get(CurTy); |
| 1136 } | 1138 } |
| 1137 break; | 1139 break; |
| 1138 } | 1140 } |
| 1139 case bitc::CST_CODE_STRING: // STRING: [values] | 1141 case naclbitc::CST_CODE_STRING: // STRING: [values] |
| 1140 case bitc::CST_CODE_CSTRING: { // CSTRING: [values] | 1142 case naclbitc::CST_CODE_CSTRING: { // CSTRING: [values] |
| 1141 if (Record.empty()) | 1143 if (Record.empty()) |
| 1142 return Error("Invalid CST_STRING record"); | 1144 return Error("Invalid CST_STRING record"); |
| 1143 | 1145 |
| 1144 SmallString<16> Elts(Record.begin(), Record.end()); | 1146 SmallString<16> Elts(Record.begin(), Record.end()); |
| 1145 V = ConstantDataArray::getString(Context, Elts, | 1147 V = ConstantDataArray::getString(Context, Elts, |
| 1146 BitCode == bitc::CST_CODE_CSTRING); | 1148 BitCode == naclbitc::CST_CODE_CSTRING); |
| 1147 break; | 1149 break; |
| 1148 } | 1150 } |
| 1149 case bitc::CST_CODE_DATA: {// DATA: [n x value] | 1151 case naclbitc::CST_CODE_DATA: {// DATA: [n x value] |
| 1150 if (Record.empty()) | 1152 if (Record.empty()) |
| 1151 return Error("Invalid CST_DATA record"); | 1153 return Error("Invalid CST_DATA record"); |
| 1152 | 1154 |
| 1153 Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); | 1155 Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); |
| 1154 unsigned Size = Record.size(); | 1156 unsigned Size = Record.size(); |
| 1155 | 1157 |
| 1156 if (EltTy->isIntegerTy(8)) { | 1158 if (EltTy->isIntegerTy(8)) { |
| 1157 SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); | 1159 SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); |
| 1158 if (isa<VectorType>(CurTy)) | 1160 if (isa<VectorType>(CurTy)) |
| 1159 V = ConstantDataVector::get(Context, Elts); | 1161 V = ConstantDataVector::get(Context, Elts); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 if (isa<VectorType>(CurTy)) | 1193 if (isa<VectorType>(CurTy)) |
| 1192 V = ConstantDataVector::get(Context, Elts); | 1194 V = ConstantDataVector::get(Context, Elts); |
| 1193 else | 1195 else |
| 1194 V = ConstantDataArray::get(Context, Elts); | 1196 V = ConstantDataArray::get(Context, Elts); |
| 1195 } else { | 1197 } else { |
| 1196 return Error("Unknown element type in CE_DATA"); | 1198 return Error("Unknown element type in CE_DATA"); |
| 1197 } | 1199 } |
| 1198 break; | 1200 break; |
| 1199 } | 1201 } |
| 1200 | 1202 |
| 1201 case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] | 1203 case naclbitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] |
| 1202 if (Record.size() < 3) return Error("Invalid CE_BINOP record"); | 1204 if (Record.size() < 3) return Error("Invalid CE_BINOP record"); |
| 1203 int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); | 1205 int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); |
| 1204 if (Opc < 0) { | 1206 if (Opc < 0) { |
| 1205 V = UndefValue::get(CurTy); // Unknown binop. | 1207 V = UndefValue::get(CurTy); // Unknown binop. |
| 1206 } else { | 1208 } else { |
| 1207 Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); | 1209 Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); |
| 1208 Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); | 1210 Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); |
| 1209 unsigned Flags = 0; | 1211 unsigned Flags = 0; |
| 1210 if (Record.size() >= 4) { | 1212 if (Record.size() >= 4) { |
| 1211 if (Opc == Instruction::Add || | 1213 if (Opc == Instruction::Add || |
| 1212 Opc == Instruction::Sub || | 1214 Opc == Instruction::Sub || |
| 1213 Opc == Instruction::Mul || | 1215 Opc == Instruction::Mul || |
| 1214 Opc == Instruction::Shl) { | 1216 Opc == Instruction::Shl) { |
| 1215 if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) | 1217 if (Record[3] & (1 << naclbitc::OBO_NO_SIGNED_WRAP)) |
| 1216 Flags |= OverflowingBinaryOperator::NoSignedWrap; | 1218 Flags |= OverflowingBinaryOperator::NoSignedWrap; |
| 1217 if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) | 1219 if (Record[3] & (1 << naclbitc::OBO_NO_UNSIGNED_WRAP)) |
| 1218 Flags |= OverflowingBinaryOperator::NoUnsignedWrap; | 1220 Flags |= OverflowingBinaryOperator::NoUnsignedWrap; |
| 1219 } else if (Opc == Instruction::SDiv || | 1221 } else if (Opc == Instruction::SDiv || |
| 1220 Opc == Instruction::UDiv || | 1222 Opc == Instruction::UDiv || |
| 1221 Opc == Instruction::LShr || | 1223 Opc == Instruction::LShr || |
| 1222 Opc == Instruction::AShr) { | 1224 Opc == Instruction::AShr) { |
| 1223 if (Record[3] & (1 << bitc::PEO_EXACT)) | 1225 if (Record[3] & (1 << naclbitc::PEO_EXACT)) |
| 1224 Flags |= SDivOperator::IsExact; | 1226 Flags |= SDivOperator::IsExact; |
| 1225 } | 1227 } |
| 1226 } | 1228 } |
| 1227 V = ConstantExpr::get(Opc, LHS, RHS, Flags); | 1229 V = ConstantExpr::get(Opc, LHS, RHS, Flags); |
| 1228 } | 1230 } |
| 1229 break; | 1231 break; |
| 1230 } | 1232 } |
| 1231 case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] | 1233 case naclbitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] |
| 1232 if (Record.size() < 3) return Error("Invalid CE_CAST record"); | 1234 if (Record.size() < 3) return Error("Invalid CE_CAST record"); |
| 1233 int Opc = GetDecodedCastOpcode(Record[0]); | 1235 int Opc = GetDecodedCastOpcode(Record[0]); |
| 1234 if (Opc < 0) { | 1236 if (Opc < 0) { |
| 1235 V = UndefValue::get(CurTy); // Unknown cast. | 1237 V = UndefValue::get(CurTy); // Unknown cast. |
| 1236 } else { | 1238 } else { |
| 1237 Type *OpTy = getTypeByID(Record[1]); | 1239 Type *OpTy = getTypeByID(Record[1]); |
| 1238 if (!OpTy) return Error("Invalid CE_CAST record"); | 1240 if (!OpTy) return Error("Invalid CE_CAST record"); |
| 1239 Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); | 1241 Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); |
| 1240 V = ConstantExpr::getCast(Opc, Op, CurTy); | 1242 V = ConstantExpr::getCast(Opc, Op, CurTy); |
| 1241 } | 1243 } |
| 1242 break; | 1244 break; |
| 1243 } | 1245 } |
| 1244 case bitc::CST_CODE_CE_INBOUNDS_GEP: | 1246 case naclbitc::CST_CODE_CE_INBOUNDS_GEP: |
| 1245 case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] | 1247 case naclbitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] |
| 1246 if (Record.size() & 1) return Error("Invalid CE_GEP record"); | 1248 if (Record.size() & 1) return Error("Invalid CE_GEP record"); |
| 1247 SmallVector<Constant*, 16> Elts; | 1249 SmallVector<Constant*, 16> Elts; |
| 1248 for (unsigned i = 0, e = Record.size(); i != e; i += 2) { | 1250 for (unsigned i = 0, e = Record.size(); i != e; i += 2) { |
| 1249 Type *ElTy = getTypeByID(Record[i]); | 1251 Type *ElTy = getTypeByID(Record[i]); |
| 1250 if (!ElTy) return Error("Invalid CE_GEP record"); | 1252 if (!ElTy) return Error("Invalid CE_GEP record"); |
| 1251 Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy)); | 1253 Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy)); |
| 1252 } | 1254 } |
| 1253 ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); | 1255 ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); |
| 1254 V = ConstantExpr::getGetElementPtr(Elts[0], Indices, | 1256 V = ConstantExpr::getGetElementPtr(Elts[0], Indices, |
| 1255 BitCode == | 1257 BitCode == |
| 1256 bitc::CST_CODE_CE_INBOUNDS_GEP); | 1258 naclbitc::CST_CODE_CE_INBOUNDS_GEP); |
| 1257 break; | 1259 break; |
| 1258 } | 1260 } |
| 1259 case bitc::CST_CODE_CE_SELECT: // CE_SELECT: [opval#, opval#, opval#] | 1261 case naclbitc::CST_CODE_CE_SELECT: // CE_SELECT: [opval#, opval#, opval#] |
| 1260 if (Record.size() < 3) return Error("Invalid CE_SELECT record"); | 1262 if (Record.size() < 3) return Error("Invalid CE_SELECT record"); |
| 1261 V = ConstantExpr::getSelect( | 1263 V = ConstantExpr::getSelect( |
| 1262 ValueList.getConstantFwdRef(Record[0], | 1264 ValueList.getConstantFwdRef(Record[0], |
| 1263 Type::getInt1Ty(Context)), | 1265 Type::getInt1Ty(Context)), |
| 1264 ValueList.getConstantFwdRef(Record[1],CurTy), | 1266 ValueList.getConstantFwdRef(Record[1],CurTy), |
| 1265 ValueList.getConstantFwdRef(Record[2],CurTy)); | 1267 ValueList.getConstantFwdRef(Record[2],CurTy)); |
| 1266 break; | 1268 break; |
| 1267 case bitc::CST_CODE_CE_EXTRACTELT: { // CE_EXTRACTELT: [opty, opval, opval] | 1269 case naclbitc::CST_CODE_CE_EXTRACTELT: { |
| 1270 // CE_EXTRACTELT: [opty, opval, opval] |
| 1268 if (Record.size() < 3) return Error("Invalid CE_EXTRACTELT record"); | 1271 if (Record.size() < 3) return Error("Invalid CE_EXTRACTELT record"); |
| 1269 VectorType *OpTy = | 1272 VectorType *OpTy = |
| 1270 dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); | 1273 dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); |
| 1271 if (OpTy == 0) return Error("Invalid CE_EXTRACTELT record"); | 1274 if (OpTy == 0) return Error("Invalid CE_EXTRACTELT record"); |
| 1272 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 1275 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); |
| 1273 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], | 1276 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], |
| 1274 Type::getInt32Ty(Context)); | 1277 Type::getInt32Ty(Context)); |
| 1275 V = ConstantExpr::getExtractElement(Op0, Op1); | 1278 V = ConstantExpr::getExtractElement(Op0, Op1); |
| 1276 break; | 1279 break; |
| 1277 } | 1280 } |
| 1278 case bitc::CST_CODE_CE_INSERTELT: { // CE_INSERTELT: [opval, opval, opval] | 1281 case naclbitc::CST_CODE_CE_INSERTELT: {// CE_INSERTELT: [opval, opval, opval
] |
| 1279 VectorType *OpTy = dyn_cast<VectorType>(CurTy); | 1282 VectorType *OpTy = dyn_cast<VectorType>(CurTy); |
| 1280 if (Record.size() < 3 || OpTy == 0) | 1283 if (Record.size() < 3 || OpTy == 0) |
| 1281 return Error("Invalid CE_INSERTELT record"); | 1284 return Error("Invalid CE_INSERTELT record"); |
| 1282 Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); | 1285 Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); |
| 1283 Constant *Op1 = ValueList.getConstantFwdRef(Record[1], | 1286 Constant *Op1 = ValueList.getConstantFwdRef(Record[1], |
| 1284 OpTy->getElementType()); | 1287 OpTy->getElementType()); |
| 1285 Constant *Op2 = ValueList.getConstantFwdRef(Record[2], | 1288 Constant *Op2 = ValueList.getConstantFwdRef(Record[2], |
| 1286 Type::getInt32Ty(Context)); | 1289 Type::getInt32Ty(Context)); |
| 1287 V = ConstantExpr::getInsertElement(Op0, Op1, Op2); | 1290 V = ConstantExpr::getInsertElement(Op0, Op1, Op2); |
| 1288 break; | 1291 break; |
| 1289 } | 1292 } |
| 1290 case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] | 1293 case naclbitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, op
val] |
| 1291 VectorType *OpTy = dyn_cast<VectorType>(CurTy); | 1294 VectorType *OpTy = dyn_cast<VectorType>(CurTy); |
| 1292 if (Record.size() < 3 || OpTy == 0) | 1295 if (Record.size() < 3 || OpTy == 0) |
| 1293 return Error("Invalid CE_SHUFFLEVEC record"); | 1296 return Error("Invalid CE_SHUFFLEVEC record"); |
| 1294 Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); | 1297 Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); |
| 1295 Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); | 1298 Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); |
| 1296 Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), | 1299 Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), |
| 1297 OpTy->getNumElements()); | 1300 OpTy->getNumElements()); |
| 1298 Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); | 1301 Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); |
| 1299 V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); | 1302 V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); |
| 1300 break; | 1303 break; |
| 1301 } | 1304 } |
| 1302 case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] | 1305 case naclbitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] |
| 1303 VectorType *RTy = dyn_cast<VectorType>(CurTy); | 1306 VectorType *RTy = dyn_cast<VectorType>(CurTy); |
| 1304 VectorType *OpTy = | 1307 VectorType *OpTy = |
| 1305 dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); | 1308 dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); |
| 1306 if (Record.size() < 4 || RTy == 0 || OpTy == 0) | 1309 if (Record.size() < 4 || RTy == 0 || OpTy == 0) |
| 1307 return Error("Invalid CE_SHUFVEC_EX record"); | 1310 return Error("Invalid CE_SHUFVEC_EX record"); |
| 1308 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 1311 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); |
| 1309 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); | 1312 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); |
| 1310 Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), | 1313 Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), |
| 1311 RTy->getNumElements()); | 1314 RTy->getNumElements()); |
| 1312 Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); | 1315 Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); |
| 1313 V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); | 1316 V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); |
| 1314 break; | 1317 break; |
| 1315 } | 1318 } |
| 1316 case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] | 1319 case naclbitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] |
| 1317 if (Record.size() < 4) return Error("Invalid CE_CMP record"); | 1320 if (Record.size() < 4) return Error("Invalid CE_CMP record"); |
| 1318 Type *OpTy = getTypeByID(Record[0]); | 1321 Type *OpTy = getTypeByID(Record[0]); |
| 1319 if (OpTy == 0) return Error("Invalid CE_CMP record"); | 1322 if (OpTy == 0) return Error("Invalid CE_CMP record"); |
| 1320 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); | 1323 Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); |
| 1321 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); | 1324 Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); |
| 1322 | 1325 |
| 1323 if (OpTy->isFPOrFPVectorTy()) | 1326 if (OpTy->isFPOrFPVectorTy()) |
| 1324 V = ConstantExpr::getFCmp(Record[3], Op0, Op1); | 1327 V = ConstantExpr::getFCmp(Record[3], Op0, Op1); |
| 1325 else | 1328 else |
| 1326 V = ConstantExpr::getICmp(Record[3], Op0, Op1); | 1329 V = ConstantExpr::getICmp(Record[3], Op0, Op1); |
| 1327 break; | 1330 break; |
| 1328 } | 1331 } |
| 1329 // This maintains backward compatibility, pre-asm dialect keywords. | 1332 // This maintains backward compatibility, pre-asm dialect keywords. |
| 1330 // FIXME: Remove with the 4.0 release. | 1333 // FIXME: Remove with the 4.0 release. |
| 1331 case bitc::CST_CODE_INLINEASM_OLD: { | 1334 case naclbitc::CST_CODE_INLINEASM_OLD: { |
| 1332 if (Record.size() < 2) return Error("Invalid INLINEASM record"); | 1335 if (Record.size() < 2) return Error("Invalid INLINEASM record"); |
| 1333 std::string AsmStr, ConstrStr; | 1336 std::string AsmStr, ConstrStr; |
| 1334 bool HasSideEffects = Record[0] & 1; | 1337 bool HasSideEffects = Record[0] & 1; |
| 1335 bool IsAlignStack = Record[0] >> 1; | 1338 bool IsAlignStack = Record[0] >> 1; |
| 1336 unsigned AsmStrSize = Record[1]; | 1339 unsigned AsmStrSize = Record[1]; |
| 1337 if (2+AsmStrSize >= Record.size()) | 1340 if (2+AsmStrSize >= Record.size()) |
| 1338 return Error("Invalid INLINEASM record"); | 1341 return Error("Invalid INLINEASM record"); |
| 1339 unsigned ConstStrSize = Record[2+AsmStrSize]; | 1342 unsigned ConstStrSize = Record[2+AsmStrSize]; |
| 1340 if (3+AsmStrSize+ConstStrSize > Record.size()) | 1343 if (3+AsmStrSize+ConstStrSize > Record.size()) |
| 1341 return Error("Invalid INLINEASM record"); | 1344 return Error("Invalid INLINEASM record"); |
| 1342 | 1345 |
| 1343 for (unsigned i = 0; i != AsmStrSize; ++i) | 1346 for (unsigned i = 0; i != AsmStrSize; ++i) |
| 1344 AsmStr += (char)Record[2+i]; | 1347 AsmStr += (char)Record[2+i]; |
| 1345 for (unsigned i = 0; i != ConstStrSize; ++i) | 1348 for (unsigned i = 0; i != ConstStrSize; ++i) |
| 1346 ConstrStr += (char)Record[3+AsmStrSize+i]; | 1349 ConstrStr += (char)Record[3+AsmStrSize+i]; |
| 1347 PointerType *PTy = cast<PointerType>(CurTy); | 1350 PointerType *PTy = cast<PointerType>(CurTy); |
| 1348 V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), | 1351 V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), |
| 1349 AsmStr, ConstrStr, HasSideEffects, IsAlignStack); | 1352 AsmStr, ConstrStr, HasSideEffects, IsAlignStack); |
| 1350 break; | 1353 break; |
| 1351 } | 1354 } |
| 1352 // This version adds support for the asm dialect keywords (e.g., | 1355 // This version adds support for the asm dialect keywords (e.g., |
| 1353 // inteldialect). | 1356 // inteldialect). |
| 1354 case bitc::CST_CODE_INLINEASM: { | 1357 case naclbitc::CST_CODE_INLINEASM: { |
| 1355 if (Record.size() < 2) return Error("Invalid INLINEASM record"); | 1358 if (Record.size() < 2) return Error("Invalid INLINEASM record"); |
| 1356 std::string AsmStr, ConstrStr; | 1359 std::string AsmStr, ConstrStr; |
| 1357 bool HasSideEffects = Record[0] & 1; | 1360 bool HasSideEffects = Record[0] & 1; |
| 1358 bool IsAlignStack = (Record[0] >> 1) & 1; | 1361 bool IsAlignStack = (Record[0] >> 1) & 1; |
| 1359 unsigned AsmDialect = Record[0] >> 2; | 1362 unsigned AsmDialect = Record[0] >> 2; |
| 1360 unsigned AsmStrSize = Record[1]; | 1363 unsigned AsmStrSize = Record[1]; |
| 1361 if (2+AsmStrSize >= Record.size()) | 1364 if (2+AsmStrSize >= Record.size()) |
| 1362 return Error("Invalid INLINEASM record"); | 1365 return Error("Invalid INLINEASM record"); |
| 1363 unsigned ConstStrSize = Record[2+AsmStrSize]; | 1366 unsigned ConstStrSize = Record[2+AsmStrSize]; |
| 1364 if (3+AsmStrSize+ConstStrSize > Record.size()) | 1367 if (3+AsmStrSize+ConstStrSize > Record.size()) |
| 1365 return Error("Invalid INLINEASM record"); | 1368 return Error("Invalid INLINEASM record"); |
| 1366 | 1369 |
| 1367 for (unsigned i = 0; i != AsmStrSize; ++i) | 1370 for (unsigned i = 0; i != AsmStrSize; ++i) |
| 1368 AsmStr += (char)Record[2+i]; | 1371 AsmStr += (char)Record[2+i]; |
| 1369 for (unsigned i = 0; i != ConstStrSize; ++i) | 1372 for (unsigned i = 0; i != ConstStrSize; ++i) |
| 1370 ConstrStr += (char)Record[3+AsmStrSize+i]; | 1373 ConstrStr += (char)Record[3+AsmStrSize+i]; |
| 1371 PointerType *PTy = cast<PointerType>(CurTy); | 1374 PointerType *PTy = cast<PointerType>(CurTy); |
| 1372 V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), | 1375 V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), |
| 1373 AsmStr, ConstrStr, HasSideEffects, IsAlignStack, | 1376 AsmStr, ConstrStr, HasSideEffects, IsAlignStack, |
| 1374 InlineAsm::AsmDialect(AsmDialect)); | 1377 InlineAsm::AsmDialect(AsmDialect)); |
| 1375 break; | 1378 break; |
| 1376 } | 1379 } |
| 1377 case bitc::CST_CODE_BLOCKADDRESS:{ | 1380 case naclbitc::CST_CODE_BLOCKADDRESS:{ |
| 1378 if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record"); | 1381 if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record"); |
| 1379 Type *FnTy = getTypeByID(Record[0]); | 1382 Type *FnTy = getTypeByID(Record[0]); |
| 1380 if (FnTy == 0) return Error("Invalid CE_BLOCKADDRESS record"); | 1383 if (FnTy == 0) return Error("Invalid CE_BLOCKADDRESS record"); |
| 1381 Function *Fn = | 1384 Function *Fn = |
| 1382 dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); | 1385 dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); |
| 1383 if (Fn == 0) return Error("Invalid CE_BLOCKADDRESS record"); | 1386 if (Fn == 0) return Error("Invalid CE_BLOCKADDRESS record"); |
| 1384 | 1387 |
| 1385 // If the function is already parsed we can insert the block address right | 1388 // If the function is already parsed we can insert the block address right |
| 1386 // away. | 1389 // away. |
| 1387 if (!Fn->empty()) { | 1390 if (!Fn->empty()) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1404 } | 1407 } |
| 1405 break; | 1408 break; |
| 1406 } | 1409 } |
| 1407 } | 1410 } |
| 1408 | 1411 |
| 1409 ValueList.AssignValue(V, NextCstNo); | 1412 ValueList.AssignValue(V, NextCstNo); |
| 1410 ++NextCstNo; | 1413 ++NextCstNo; |
| 1411 } | 1414 } |
| 1412 } | 1415 } |
| 1413 | 1416 |
| 1414 bool BitcodeReader::ParseUseLists() { | 1417 bool NaClBitcodeReader::ParseUseLists() { |
| 1415 if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) | 1418 if (Stream.EnterSubBlock(naclbitc::USELIST_BLOCK_ID)) |
| 1416 return Error("Malformed block record"); | 1419 return Error("Malformed block record"); |
| 1417 | 1420 |
| 1418 SmallVector<uint64_t, 64> Record; | 1421 SmallVector<uint64_t, 64> Record; |
| 1419 | 1422 |
| 1420 // Read all the records. | 1423 // Read all the records. |
| 1421 while (1) { | 1424 while (1) { |
| 1422 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 1425 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 1423 | 1426 |
| 1424 switch (Entry.Kind) { | 1427 switch (Entry.Kind) { |
| 1425 case BitstreamEntry::SubBlock: // Handled for us already. | 1428 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 1426 case BitstreamEntry::Error: | 1429 case NaClBitstreamEntry::Error: |
| 1427 return Error("malformed use list block"); | 1430 return Error("malformed use list block"); |
| 1428 case BitstreamEntry::EndBlock: | 1431 case NaClBitstreamEntry::EndBlock: |
| 1429 return false; | 1432 return false; |
| 1430 case BitstreamEntry::Record: | 1433 case NaClBitstreamEntry::Record: |
| 1431 // The interesting case. | 1434 // The interesting case. |
| 1432 break; | 1435 break; |
| 1433 } | 1436 } |
| 1434 | 1437 |
| 1435 // Read a use list record. | 1438 // Read a use list record. |
| 1436 Record.clear(); | 1439 Record.clear(); |
| 1437 switch (Stream.readRecord(Entry.ID, Record)) { | 1440 switch (Stream.readRecord(Entry.ID, Record)) { |
| 1438 default: // Default behavior: unknown type. | 1441 default: // Default behavior: unknown type. |
| 1439 break; | 1442 break; |
| 1440 case bitc::USELIST_CODE_ENTRY: { // USELIST_CODE_ENTRY: TBD. | 1443 case naclbitc::USELIST_CODE_ENTRY: { // USELIST_CODE_ENTRY: TBD. |
| 1441 unsigned RecordLength = Record.size(); | 1444 unsigned RecordLength = Record.size(); |
| 1442 if (RecordLength < 1) | 1445 if (RecordLength < 1) |
| 1443 return Error ("Invalid UseList reader!"); | 1446 return Error ("Invalid UseList reader!"); |
| 1444 UseListRecords.push_back(Record); | 1447 UseListRecords.push_back(Record); |
| 1445 break; | 1448 break; |
| 1446 } | 1449 } |
| 1447 } | 1450 } |
| 1448 } | 1451 } |
| 1449 } | 1452 } |
| 1450 | 1453 |
| 1451 /// RememberAndSkipFunctionBody - When we see the block for a function body, | 1454 /// RememberAndSkipFunctionBody - When we see the block for a function body, |
| 1452 /// remember where it is and then skip it. This lets us lazily deserialize the | 1455 /// remember where it is and then skip it. This lets us lazily deserialize the |
| 1453 /// functions. | 1456 /// functions. |
| 1454 bool BitcodeReader::RememberAndSkipFunctionBody() { | 1457 bool NaClBitcodeReader::RememberAndSkipFunctionBody() { |
| 1455 // Get the function we are talking about. | 1458 // Get the function we are talking about. |
| 1456 if (FunctionsWithBodies.empty()) | 1459 if (FunctionsWithBodies.empty()) |
| 1457 return Error("Insufficient function protos"); | 1460 return Error("Insufficient function protos"); |
| 1458 | 1461 |
| 1459 Function *Fn = FunctionsWithBodies.back(); | 1462 Function *Fn = FunctionsWithBodies.back(); |
| 1460 FunctionsWithBodies.pop_back(); | 1463 FunctionsWithBodies.pop_back(); |
| 1461 | 1464 |
| 1462 // Save the current stream state. | 1465 // Save the current stream state. |
| 1463 uint64_t CurBit = Stream.GetCurrentBitNo(); | 1466 uint64_t CurBit = Stream.GetCurrentBitNo(); |
| 1464 DeferredFunctionInfo[Fn] = CurBit; | 1467 DeferredFunctionInfo[Fn] = CurBit; |
| 1465 | 1468 |
| 1466 // Skip over the function block for now. | 1469 // Skip over the function block for now. |
| 1467 if (Stream.SkipBlock()) | 1470 if (Stream.SkipBlock()) |
| 1468 return Error("Malformed block record"); | 1471 return Error("Malformed block record"); |
| 1469 return false; | 1472 return false; |
| 1470 } | 1473 } |
| 1471 | 1474 |
| 1472 bool BitcodeReader::GlobalCleanup() { | 1475 bool NaClBitcodeReader::GlobalCleanup() { |
| 1473 // Patch the initializers for globals and aliases up. | 1476 // Patch the initializers for globals and aliases up. |
| 1474 ResolveGlobalAndAliasInits(); | 1477 ResolveGlobalAndAliasInits(); |
| 1475 if (!GlobalInits.empty() || !AliasInits.empty()) | 1478 if (!GlobalInits.empty() || !AliasInits.empty()) |
| 1476 return Error("Malformed global initializer set"); | 1479 return Error("Malformed global initializer set"); |
| 1477 | 1480 |
| 1478 // Look for intrinsic functions which need to be upgraded at some point | 1481 // Look for intrinsic functions which need to be upgraded at some point |
| 1479 for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); | 1482 for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); |
| 1480 FI != FE; ++FI) { | 1483 FI != FE; ++FI) { |
| 1481 Function *NewFn; | 1484 Function *NewFn; |
| 1482 if (UpgradeIntrinsicFunction(FI, NewFn)) | 1485 if (UpgradeIntrinsicFunction(FI, NewFn)) |
| 1483 UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); | 1486 UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); |
| 1484 } | 1487 } |
| 1485 | 1488 |
| 1486 // Look for global variables which need to be renamed. | 1489 // Look for global variables which need to be renamed. |
| 1487 for (Module::global_iterator | 1490 for (Module::global_iterator |
| 1488 GI = TheModule->global_begin(), GE = TheModule->global_end(); | 1491 GI = TheModule->global_begin(), GE = TheModule->global_end(); |
| 1489 GI != GE; ++GI) | 1492 GI != GE; ++GI) |
| 1490 UpgradeGlobalVariable(GI); | 1493 UpgradeGlobalVariable(GI); |
| 1491 // Force deallocation of memory for these vectors to favor the client that | 1494 // Force deallocation of memory for these vectors to favor the client that |
| 1492 // want lazy deserialization. | 1495 // want lazy deserialization. |
| 1493 std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); | 1496 std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); |
| 1494 std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); | 1497 std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); |
| 1495 return false; | 1498 return false; |
| 1496 } | 1499 } |
| 1497 | 1500 |
| 1498 bool BitcodeReader::ParseModule(bool Resume) { | 1501 bool NaClBitcodeReader::ParseModule(bool Resume) { |
| 1499 if (Resume) | 1502 if (Resume) |
| 1500 Stream.JumpToBit(NextUnreadBit); | 1503 Stream.JumpToBit(NextUnreadBit); |
| 1501 else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) | 1504 else if (Stream.EnterSubBlock(naclbitc::MODULE_BLOCK_ID)) |
| 1502 return Error("Malformed block record"); | 1505 return Error("Malformed block record"); |
| 1503 | 1506 |
| 1504 SmallVector<uint64_t, 64> Record; | 1507 SmallVector<uint64_t, 64> Record; |
| 1505 std::vector<std::string> SectionTable; | 1508 std::vector<std::string> SectionTable; |
| 1506 std::vector<std::string> GCTable; | 1509 std::vector<std::string> GCTable; |
| 1507 | 1510 |
| 1508 // Read all the records for this module. | 1511 // Read all the records for this module. |
| 1509 while (1) { | 1512 while (1) { |
| 1510 BitstreamEntry Entry = Stream.advance(); | 1513 NaClBitstreamEntry Entry = Stream.advance(); |
| 1511 | 1514 |
| 1512 switch (Entry.Kind) { | 1515 switch (Entry.Kind) { |
| 1513 case BitstreamEntry::Error: | 1516 case NaClBitstreamEntry::Error: |
| 1514 Error("malformed module block"); | 1517 Error("malformed module block"); |
| 1515 return true; | 1518 return true; |
| 1516 case BitstreamEntry::EndBlock: | 1519 case NaClBitstreamEntry::EndBlock: |
| 1517 return GlobalCleanup(); | 1520 return GlobalCleanup(); |
| 1518 | 1521 |
| 1519 case BitstreamEntry::SubBlock: | 1522 case NaClBitstreamEntry::SubBlock: |
| 1520 switch (Entry.ID) { | 1523 switch (Entry.ID) { |
| 1521 default: // Skip unknown content. | 1524 default: // Skip unknown content. |
| 1522 if (Stream.SkipBlock()) | 1525 if (Stream.SkipBlock()) |
| 1523 return Error("Malformed block record"); | 1526 return Error("Malformed block record"); |
| 1524 break; | 1527 break; |
| 1525 case bitc::BLOCKINFO_BLOCK_ID: | 1528 case bitc::BLOCKINFO_BLOCK_ID: |
| 1526 if (Stream.ReadBlockInfoBlock()) | 1529 if (Stream.ReadBlockInfoBlock()) |
| 1527 return Error("Malformed BlockInfoBlock"); | 1530 return Error("Malformed BlockInfoBlock"); |
| 1528 break; | 1531 break; |
| 1529 case bitc::PARAMATTR_BLOCK_ID: | 1532 case naclbitc::PARAMATTR_BLOCK_ID: |
| 1530 if (ParseAttributeBlock()) | 1533 if (ParseAttributeBlock()) |
| 1531 return true; | 1534 return true; |
| 1532 break; | 1535 break; |
| 1533 case bitc::PARAMATTR_GROUP_BLOCK_ID: | 1536 case naclbitc::PARAMATTR_GROUP_BLOCK_ID: |
| 1534 if (ParseAttributeGroupBlock()) | 1537 if (ParseAttributeGroupBlock()) |
| 1535 return true; | 1538 return true; |
| 1536 break; | 1539 break; |
| 1537 case bitc::TYPE_BLOCK_ID_NEW: | 1540 case naclbitc::TYPE_BLOCK_ID_NEW: |
| 1538 if (ParseTypeTable()) | 1541 if (ParseTypeTable()) |
| 1539 return true; | 1542 return true; |
| 1540 break; | 1543 break; |
| 1541 case bitc::VALUE_SYMTAB_BLOCK_ID: | 1544 case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
| 1542 if (ParseValueSymbolTable()) | 1545 if (ParseValueSymbolTable()) |
| 1543 return true; | 1546 return true; |
| 1544 SeenValueSymbolTable = true; | 1547 SeenValueSymbolTable = true; |
| 1545 break; | 1548 break; |
| 1546 case bitc::CONSTANTS_BLOCK_ID: | 1549 case naclbitc::CONSTANTS_BLOCK_ID: |
| 1547 if (ParseConstants() || ResolveGlobalAndAliasInits()) | 1550 if (ParseConstants() || ResolveGlobalAndAliasInits()) |
| 1548 return true; | 1551 return true; |
| 1549 break; | 1552 break; |
| 1550 case bitc::METADATA_BLOCK_ID: | 1553 case naclbitc::METADATA_BLOCK_ID: |
| 1551 if (ParseMetadata()) | 1554 if (ParseMetadata()) |
| 1552 return true; | 1555 return true; |
| 1553 break; | 1556 break; |
| 1554 case bitc::FUNCTION_BLOCK_ID: | 1557 case naclbitc::FUNCTION_BLOCK_ID: |
| 1555 // If this is the first function body we've seen, reverse the | 1558 // If this is the first function body we've seen, reverse the |
| 1556 // FunctionsWithBodies list. | 1559 // FunctionsWithBodies list. |
| 1557 if (!SeenFirstFunctionBody) { | 1560 if (!SeenFirstFunctionBody) { |
| 1558 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); | 1561 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); |
| 1559 if (GlobalCleanup()) | 1562 if (GlobalCleanup()) |
| 1560 return true; | 1563 return true; |
| 1561 SeenFirstFunctionBody = true; | 1564 SeenFirstFunctionBody = true; |
| 1562 } | 1565 } |
| 1563 | 1566 |
| 1564 if (RememberAndSkipFunctionBody()) | 1567 if (RememberAndSkipFunctionBody()) |
| 1565 return true; | 1568 return true; |
| 1566 // For streaming bitcode, suspend parsing when we reach the function | 1569 // For streaming bitcode, suspend parsing when we reach the function |
| 1567 // bodies. Subsequent materialization calls will resume it when | 1570 // bodies. Subsequent materialization calls will resume it when |
| 1568 // necessary. For streaming, the function bodies must be at the end of | 1571 // necessary. For streaming, the function bodies must be at the end of |
| 1569 // the bitcode. If the bitcode file is old, the symbol table will be | 1572 // the bitcode. If the bitcode file is old, the symbol table will be |
| 1570 // at the end instead and will not have been seen yet. In this case, | 1573 // at the end instead and will not have been seen yet. In this case, |
| 1571 // just finish the parse now. | 1574 // just finish the parse now. |
| 1572 if (LazyStreamer && SeenValueSymbolTable) { | 1575 if (LazyStreamer && SeenValueSymbolTable) { |
| 1573 NextUnreadBit = Stream.GetCurrentBitNo(); | 1576 NextUnreadBit = Stream.GetCurrentBitNo(); |
| 1574 return false; | 1577 return false; |
| 1575 } | 1578 } |
| 1576 break; | 1579 break; |
| 1577 case bitc::USELIST_BLOCK_ID: | 1580 case naclbitc::USELIST_BLOCK_ID: |
| 1578 if (ParseUseLists()) | 1581 if (ParseUseLists()) |
| 1579 return true; | 1582 return true; |
| 1580 break; | 1583 break; |
| 1581 } | 1584 } |
| 1582 continue; | 1585 continue; |
| 1583 | 1586 |
| 1584 case BitstreamEntry::Record: | 1587 case NaClBitstreamEntry::Record: |
| 1585 // The interesting case. | 1588 // The interesting case. |
| 1586 break; | 1589 break; |
| 1587 } | 1590 } |
| 1588 | 1591 |
| 1589 | 1592 |
| 1590 // Read a record. | 1593 // Read a record. |
| 1591 switch (Stream.readRecord(Entry.ID, Record)) { | 1594 switch (Stream.readRecord(Entry.ID, Record)) { |
| 1592 default: break; // Default behavior, ignore unknown content. | 1595 default: break; // Default behavior, ignore unknown content. |
| 1593 case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] | 1596 case naclbitc::MODULE_CODE_VERSION: { // VERSION: [version#] |
| 1594 if (Record.size() < 1) | 1597 if (Record.size() < 1) |
| 1595 return Error("Malformed MODULE_CODE_VERSION"); | 1598 return Error("Malformed MODULE_CODE_VERSION"); |
| 1596 // Only version #0 and #1 are supported so far. | 1599 // Only version #0 and #1 are supported so far. |
| 1597 unsigned module_version = Record[0]; | 1600 unsigned module_version = Record[0]; |
| 1598 switch (module_version) { | 1601 switch (module_version) { |
| 1599 default: return Error("Unknown bitstream version!"); | 1602 default: return Error("Unknown bitstream version!"); |
| 1600 case 0: | 1603 case 0: |
| 1601 UseRelativeIDs = false; | 1604 UseRelativeIDs = false; |
| 1602 break; | 1605 break; |
| 1603 case 1: | 1606 case 1: |
| 1604 UseRelativeIDs = true; | 1607 UseRelativeIDs = true; |
| 1605 break; | 1608 break; |
| 1606 } | 1609 } |
| 1607 break; | 1610 break; |
| 1608 } | 1611 } |
| 1609 case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] | 1612 case naclbitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] |
| 1610 std::string S; | 1613 std::string S; |
| 1611 if (ConvertToString(Record, 0, S)) | 1614 if (ConvertToString(Record, 0, S)) |
| 1612 return Error("Invalid MODULE_CODE_TRIPLE record"); | 1615 return Error("Invalid MODULE_CODE_TRIPLE record"); |
| 1613 | 1616 |
| 1614 // @LOCALMOD-BEGIN | 1617 // @LOCALMOD-BEGIN |
| 1615 // This hack is needed in order to get Clang compiled binaries | 1618 // This hack is needed in order to get Clang compiled binaries |
| 1616 // working with the Gold plugin, until PNaCl backend is introduced | 1619 // working with the Gold plugin, until PNaCl backend is introduced |
| 1617 // in lib/Target/PNaCl. | 1620 // in lib/Target/PNaCl. |
| 1618 if (S == "le32-unknown-nacl") | 1621 if (S == "le32-unknown-nacl") |
| 1619 S = "armv7-none-linux-gnueabi"; | 1622 S = "armv7-none-linux-gnueabi"; |
| 1620 // @LOCALMOD-END | 1623 // @LOCALMOD-END |
| 1621 TheModule->setTargetTriple(S); | 1624 TheModule->setTargetTriple(S); |
| 1622 break; | 1625 break; |
| 1623 } | 1626 } |
| 1624 case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] | 1627 case naclbitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] |
| 1625 std::string S; | 1628 std::string S; |
| 1626 if (ConvertToString(Record, 0, S)) | 1629 if (ConvertToString(Record, 0, S)) |
| 1627 return Error("Invalid MODULE_CODE_DATALAYOUT record"); | 1630 return Error("Invalid MODULE_CODE_DATALAYOUT record"); |
| 1628 TheModule->setDataLayout(S); | 1631 TheModule->setDataLayout(S); |
| 1629 break; | 1632 break; |
| 1630 } | 1633 } |
| 1631 case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] | 1634 case naclbitc::MODULE_CODE_ASM: { // ASM: [strchr x N] |
| 1632 std::string S; | 1635 std::string S; |
| 1633 if (ConvertToString(Record, 0, S)) | 1636 if (ConvertToString(Record, 0, S)) |
| 1634 return Error("Invalid MODULE_CODE_ASM record"); | 1637 return Error("Invalid MODULE_CODE_ASM record"); |
| 1635 TheModule->setModuleInlineAsm(S); | 1638 TheModule->setModuleInlineAsm(S); |
| 1636 break; | 1639 break; |
| 1637 } | 1640 } |
| 1638 case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] | 1641 case naclbitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] |
| 1639 // FIXME: Remove in 4.0. | 1642 // FIXME: Remove in 4.0. |
| 1640 std::string S; | 1643 std::string S; |
| 1641 if (ConvertToString(Record, 0, S)) | 1644 if (ConvertToString(Record, 0, S)) |
| 1642 return Error("Invalid MODULE_CODE_DEPLIB record"); | 1645 return Error("Invalid MODULE_CODE_DEPLIB record"); |
| 1643 // Ignore value. | 1646 // Ignore value. |
| 1644 break; | 1647 break; |
| 1645 } | 1648 } |
| 1646 case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] | 1649 case naclbitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] |
| 1647 std::string S; | 1650 std::string S; |
| 1648 if (ConvertToString(Record, 0, S)) | 1651 if (ConvertToString(Record, 0, S)) |
| 1649 return Error("Invalid MODULE_CODE_SECTIONNAME record"); | 1652 return Error("Invalid MODULE_CODE_SECTIONNAME record"); |
| 1650 SectionTable.push_back(S); | 1653 SectionTable.push_back(S); |
| 1651 break; | 1654 break; |
| 1652 } | 1655 } |
| 1653 case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] | 1656 case naclbitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] |
| 1654 std::string S; | 1657 std::string S; |
| 1655 if (ConvertToString(Record, 0, S)) | 1658 if (ConvertToString(Record, 0, S)) |
| 1656 return Error("Invalid MODULE_CODE_GCNAME record"); | 1659 return Error("Invalid MODULE_CODE_GCNAME record"); |
| 1657 GCTable.push_back(S); | 1660 GCTable.push_back(S); |
| 1658 break; | 1661 break; |
| 1659 } | 1662 } |
| 1660 // GLOBALVAR: [pointer type, isconst, initid, | 1663 // GLOBALVAR: [pointer type, isconst, initid, |
| 1661 // linkage, alignment, section, visibility, threadlocal, | 1664 // linkage, alignment, section, visibility, threadlocal, |
| 1662 // unnamed_addr] | 1665 // unnamed_addr] |
| 1663 case bitc::MODULE_CODE_GLOBALVAR: { | 1666 case naclbitc::MODULE_CODE_GLOBALVAR: { |
| 1664 if (Record.size() < 6) | 1667 if (Record.size() < 6) |
| 1665 return Error("Invalid MODULE_CODE_GLOBALVAR record"); | 1668 return Error("Invalid MODULE_CODE_GLOBALVAR record"); |
| 1666 Type *Ty = getTypeByID(Record[0]); | 1669 Type *Ty = getTypeByID(Record[0]); |
| 1667 if (!Ty) return Error("Invalid MODULE_CODE_GLOBALVAR record"); | 1670 if (!Ty) return Error("Invalid MODULE_CODE_GLOBALVAR record"); |
| 1668 if (!Ty->isPointerTy()) | 1671 if (!Ty->isPointerTy()) |
| 1669 return Error("Global not a pointer type!"); | 1672 return Error("Global not a pointer type!"); |
| 1670 unsigned AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); | 1673 unsigned AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); |
| 1671 Ty = cast<PointerType>(Ty)->getElementType(); | 1674 Ty = cast<PointerType>(Ty)->getElementType(); |
| 1672 | 1675 |
| 1673 bool isConstant = Record[1]; | 1676 bool isConstant = Record[1]; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1706 | 1709 |
| 1707 ValueList.push_back(NewGV); | 1710 ValueList.push_back(NewGV); |
| 1708 | 1711 |
| 1709 // Remember which value to use for the global initializer. | 1712 // Remember which value to use for the global initializer. |
| 1710 if (unsigned InitID = Record[2]) | 1713 if (unsigned InitID = Record[2]) |
| 1711 GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); | 1714 GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); |
| 1712 break; | 1715 break; |
| 1713 } | 1716 } |
| 1714 // FUNCTION: [type, callingconv, isproto, linkage, paramattr, | 1717 // FUNCTION: [type, callingconv, isproto, linkage, paramattr, |
| 1715 // alignment, section, visibility, gc, unnamed_addr] | 1718 // alignment, section, visibility, gc, unnamed_addr] |
| 1716 case bitc::MODULE_CODE_FUNCTION: { | 1719 case naclbitc::MODULE_CODE_FUNCTION: { |
| 1717 if (Record.size() < 8) | 1720 if (Record.size() < 8) |
| 1718 return Error("Invalid MODULE_CODE_FUNCTION record"); | 1721 return Error("Invalid MODULE_CODE_FUNCTION record"); |
| 1719 Type *Ty = getTypeByID(Record[0]); | 1722 Type *Ty = getTypeByID(Record[0]); |
| 1720 if (!Ty) return Error("Invalid MODULE_CODE_FUNCTION record"); | 1723 if (!Ty) return Error("Invalid MODULE_CODE_FUNCTION record"); |
| 1721 if (!Ty->isPointerTy()) | 1724 if (!Ty->isPointerTy()) |
| 1722 return Error("Function not a pointer type!"); | 1725 return Error("Function not a pointer type!"); |
| 1723 FunctionType *FTy = | 1726 FunctionType *FTy = |
| 1724 dyn_cast<FunctionType>(cast<PointerType>(Ty)->getElementType()); | 1727 dyn_cast<FunctionType>(cast<PointerType>(Ty)->getElementType()); |
| 1725 if (!FTy) | 1728 if (!FTy) |
| 1726 return Error("Function not a pointer to function type!"); | 1729 return Error("Function not a pointer to function type!"); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1754 // If this is a function with a body, remember the prototype we are | 1757 // If this is a function with a body, remember the prototype we are |
| 1755 // creating now, so that we can match up the body with them later. | 1758 // creating now, so that we can match up the body with them later. |
| 1756 if (!isProto) { | 1759 if (!isProto) { |
| 1757 FunctionsWithBodies.push_back(Func); | 1760 FunctionsWithBodies.push_back(Func); |
| 1758 if (LazyStreamer) DeferredFunctionInfo[Func] = 0; | 1761 if (LazyStreamer) DeferredFunctionInfo[Func] = 0; |
| 1759 } | 1762 } |
| 1760 break; | 1763 break; |
| 1761 } | 1764 } |
| 1762 // ALIAS: [alias type, aliasee val#, linkage] | 1765 // ALIAS: [alias type, aliasee val#, linkage] |
| 1763 // ALIAS: [alias type, aliasee val#, linkage, visibility] | 1766 // ALIAS: [alias type, aliasee val#, linkage, visibility] |
| 1764 case bitc::MODULE_CODE_ALIAS: { | 1767 case naclbitc::MODULE_CODE_ALIAS: { |
| 1765 if (Record.size() < 3) | 1768 if (Record.size() < 3) |
| 1766 return Error("Invalid MODULE_ALIAS record"); | 1769 return Error("Invalid MODULE_ALIAS record"); |
| 1767 Type *Ty = getTypeByID(Record[0]); | 1770 Type *Ty = getTypeByID(Record[0]); |
| 1768 if (!Ty) return Error("Invalid MODULE_ALIAS record"); | 1771 if (!Ty) return Error("Invalid MODULE_ALIAS record"); |
| 1769 if (!Ty->isPointerTy()) | 1772 if (!Ty->isPointerTy()) |
| 1770 return Error("Function not a pointer type!"); | 1773 return Error("Function not a pointer type!"); |
| 1771 | 1774 |
| 1772 GlobalAlias *NewGA = new GlobalAlias(Ty, GetDecodedLinkage(Record[2]), | 1775 GlobalAlias *NewGA = new GlobalAlias(Ty, GetDecodedLinkage(Record[2]), |
| 1773 "", 0, TheModule); | 1776 "", 0, TheModule); |
| 1774 // Old bitcode files didn't have visibility field. | 1777 // Old bitcode files didn't have visibility field. |
| 1775 if (Record.size() > 3) | 1778 if (Record.size() > 3) |
| 1776 NewGA->setVisibility(GetDecodedVisibility(Record[3])); | 1779 NewGA->setVisibility(GetDecodedVisibility(Record[3])); |
| 1777 ValueList.push_back(NewGA); | 1780 ValueList.push_back(NewGA); |
| 1778 AliasInits.push_back(std::make_pair(NewGA, Record[1])); | 1781 AliasInits.push_back(std::make_pair(NewGA, Record[1])); |
| 1779 break; | 1782 break; |
| 1780 } | 1783 } |
| 1781 /// MODULE_CODE_PURGEVALS: [numvals] | 1784 /// MODULE_CODE_PURGEVALS: [numvals] |
| 1782 case bitc::MODULE_CODE_PURGEVALS: | 1785 case naclbitc::MODULE_CODE_PURGEVALS: |
| 1783 // Trim down the value list to the specified size. | 1786 // Trim down the value list to the specified size. |
| 1784 if (Record.size() < 1 || Record[0] > ValueList.size()) | 1787 if (Record.size() < 1 || Record[0] > ValueList.size()) |
| 1785 return Error("Invalid MODULE_PURGEVALS record"); | 1788 return Error("Invalid MODULE_PURGEVALS record"); |
| 1786 ValueList.shrinkTo(Record[0]); | 1789 ValueList.shrinkTo(Record[0]); |
| 1787 break; | 1790 break; |
| 1788 } | 1791 } |
| 1789 Record.clear(); | 1792 Record.clear(); |
| 1790 } | 1793 } |
| 1791 } | 1794 } |
| 1792 | 1795 |
| 1793 bool BitcodeReader::ParseBitcodeInto(Module *M) { | 1796 bool NaClBitcodeReader::ParseBitcodeInto(Module *M) { |
| 1794 TheModule = 0; | 1797 TheModule = 0; |
| 1795 | 1798 |
| 1796 if (InitStream()) return true; | 1799 if (InitStream()) return true; |
| 1797 | 1800 |
| 1798 // Sniff for the signature. | 1801 // Sniff for the signature. |
| 1799 if (Stream.Read(8) != 'B' || | 1802 if (Stream.Read(8) != 'B' || |
| 1800 Stream.Read(8) != 'C' || | 1803 Stream.Read(8) != 'C' || |
| 1801 Stream.Read(4) != 0x0 || | 1804 Stream.Read(4) != 0x0 || |
| 1802 Stream.Read(4) != 0xC || | 1805 Stream.Read(4) != 0xC || |
| 1803 Stream.Read(4) != 0xE || | 1806 Stream.Read(4) != 0xE || |
| 1804 Stream.Read(4) != 0xD) | 1807 Stream.Read(4) != 0xD) |
| 1805 return Error("Invalid bitcode signature"); | 1808 return Error("Invalid bitcode signature"); |
| 1806 | 1809 |
| 1807 // We expect a number of well-defined blocks, though we don't necessarily | 1810 // We expect a number of well-defined blocks, though we don't necessarily |
| 1808 // need to understand them all. | 1811 // need to understand them all. |
| 1809 while (1) { | 1812 while (1) { |
| 1810 if (Stream.AtEndOfStream()) | 1813 if (Stream.AtEndOfStream()) |
| 1811 return false; | 1814 return false; |
| 1812 | 1815 |
| 1813 BitstreamEntry Entry = | 1816 NaClBitstreamEntry Entry = |
| 1814 Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); | 1817 Stream.advance(NaClBitstreamCursor::AF_DontAutoprocessAbbrevs); |
| 1815 | 1818 |
| 1816 switch (Entry.Kind) { | 1819 switch (Entry.Kind) { |
| 1817 case BitstreamEntry::Error: | 1820 case NaClBitstreamEntry::Error: |
| 1818 Error("malformed module file"); | 1821 Error("malformed module file"); |
| 1819 return true; | 1822 return true; |
| 1820 case BitstreamEntry::EndBlock: | 1823 case NaClBitstreamEntry::EndBlock: |
| 1821 return false; | 1824 return false; |
| 1822 | 1825 |
| 1823 case BitstreamEntry::SubBlock: | 1826 case NaClBitstreamEntry::SubBlock: |
| 1824 switch (Entry.ID) { | 1827 switch (Entry.ID) { |
| 1825 case bitc::BLOCKINFO_BLOCK_ID: | 1828 case bitc::BLOCKINFO_BLOCK_ID: |
| 1826 if (Stream.ReadBlockInfoBlock()) | 1829 if (Stream.ReadBlockInfoBlock()) |
| 1827 return Error("Malformed BlockInfoBlock"); | 1830 return Error("Malformed BlockInfoBlock"); |
| 1828 break; | 1831 break; |
| 1829 case bitc::MODULE_BLOCK_ID: | 1832 case naclbitc::MODULE_BLOCK_ID: |
| 1830 // Reject multiple MODULE_BLOCK's in a single bitstream. | 1833 // Reject multiple MODULE_BLOCK's in a single bitstream. |
| 1831 if (TheModule) | 1834 if (TheModule) |
| 1832 return Error("Multiple MODULE_BLOCKs in same stream"); | 1835 return Error("Multiple MODULE_BLOCKs in same stream"); |
| 1833 TheModule = M; | 1836 TheModule = M; |
| 1834 if (ParseModule(false)) | 1837 if (ParseModule(false)) |
| 1835 return true; | 1838 return true; |
| 1836 if (LazyStreamer) return false; | 1839 if (LazyStreamer) return false; |
| 1837 break; | 1840 break; |
| 1838 default: | 1841 default: |
| 1839 if (Stream.SkipBlock()) | 1842 if (Stream.SkipBlock()) |
| 1840 return Error("Malformed block record"); | 1843 return Error("Malformed block record"); |
| 1841 break; | 1844 break; |
| 1842 } | 1845 } |
| 1843 continue; | 1846 continue; |
| 1844 case BitstreamEntry::Record: | 1847 case NaClBitstreamEntry::Record: |
| 1845 // There should be no records in the top-level of blocks. | 1848 // There should be no records in the top-level of blocks. |
| 1846 | 1849 |
| 1847 // The ranlib in Xcode 4 will align archive members by appending newlines | 1850 // The ranlib in Xcode 4 will align archive members by appending newlines |
| 1848 // to the end of them. If this file size is a multiple of 4 but not 8, we | 1851 // to the end of them. If this file size is a multiple of 4 but not 8, we |
| 1849 // have to read and ignore these final 4 bytes :-( | 1852 // have to read and ignore these final 4 bytes :-( |
| 1850 if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 && | 1853 if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 && |
| 1851 Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a && | 1854 Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a && |
| 1852 Stream.AtEndOfStream()) | 1855 Stream.AtEndOfStream()) |
| 1853 return false; | 1856 return false; |
| 1854 | 1857 |
| 1855 return Error("Invalid record at top-level"); | 1858 return Error("Invalid record at top-level"); |
| 1856 } | 1859 } |
| 1857 } | 1860 } |
| 1858 } | 1861 } |
| 1859 | 1862 |
| 1860 bool BitcodeReader::ParseModuleTriple(std::string &Triple) { | 1863 bool NaClBitcodeReader::ParseModuleTriple(std::string &Triple) { |
| 1861 if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) | 1864 if (Stream.EnterSubBlock(naclbitc::MODULE_BLOCK_ID)) |
| 1862 return Error("Malformed block record"); | 1865 return Error("Malformed block record"); |
| 1863 | 1866 |
| 1864 SmallVector<uint64_t, 64> Record; | 1867 SmallVector<uint64_t, 64> Record; |
| 1865 | 1868 |
| 1866 // Read all the records for this module. | 1869 // Read all the records for this module. |
| 1867 while (1) { | 1870 while (1) { |
| 1868 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 1871 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 1869 | 1872 |
| 1870 switch (Entry.Kind) { | 1873 switch (Entry.Kind) { |
| 1871 case BitstreamEntry::SubBlock: // Handled for us already. | 1874 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 1872 case BitstreamEntry::Error: | 1875 case NaClBitstreamEntry::Error: |
| 1873 return Error("malformed module block"); | 1876 return Error("malformed module block"); |
| 1874 case BitstreamEntry::EndBlock: | 1877 case NaClBitstreamEntry::EndBlock: |
| 1875 return false; | 1878 return false; |
| 1876 case BitstreamEntry::Record: | 1879 case NaClBitstreamEntry::Record: |
| 1877 // The interesting case. | 1880 // The interesting case. |
| 1878 break; | 1881 break; |
| 1879 } | 1882 } |
| 1880 | 1883 |
| 1881 // Read a record. | 1884 // Read a record. |
| 1882 switch (Stream.readRecord(Entry.ID, Record)) { | 1885 switch (Stream.readRecord(Entry.ID, Record)) { |
| 1883 default: break; // Default behavior, ignore unknown content. | 1886 default: break; // Default behavior, ignore unknown content. |
| 1884 case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] | 1887 case naclbitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] |
| 1885 std::string S; | 1888 std::string S; |
| 1886 if (ConvertToString(Record, 0, S)) | 1889 if (ConvertToString(Record, 0, S)) |
| 1887 return Error("Invalid MODULE_CODE_TRIPLE record"); | 1890 return Error("Invalid MODULE_CODE_TRIPLE record"); |
| 1888 Triple = S; | 1891 Triple = S; |
| 1889 break; | 1892 break; |
| 1890 } | 1893 } |
| 1891 } | 1894 } |
| 1892 Record.clear(); | 1895 Record.clear(); |
| 1893 } | 1896 } |
| 1894 } | 1897 } |
| 1895 | 1898 |
| 1896 bool BitcodeReader::ParseTriple(std::string &Triple) { | 1899 bool NaClBitcodeReader::ParseTriple(std::string &Triple) { |
| 1897 if (InitStream()) return true; | 1900 if (InitStream()) return true; |
| 1898 | 1901 |
| 1899 // Sniff for the signature. | 1902 // Sniff for the signature. |
| 1900 if (Stream.Read(8) != 'B' || | 1903 if (Stream.Read(8) != 'B' || |
| 1901 Stream.Read(8) != 'C' || | 1904 Stream.Read(8) != 'C' || |
| 1902 Stream.Read(4) != 0x0 || | 1905 Stream.Read(4) != 0x0 || |
| 1903 Stream.Read(4) != 0xC || | 1906 Stream.Read(4) != 0xC || |
| 1904 Stream.Read(4) != 0xE || | 1907 Stream.Read(4) != 0xE || |
| 1905 Stream.Read(4) != 0xD) | 1908 Stream.Read(4) != 0xD) |
| 1906 return Error("Invalid bitcode signature"); | 1909 return Error("Invalid bitcode signature"); |
| 1907 | 1910 |
| 1908 // We expect a number of well-defined blocks, though we don't necessarily | 1911 // We expect a number of well-defined blocks, though we don't necessarily |
| 1909 // need to understand them all. | 1912 // need to understand them all. |
| 1910 while (1) { | 1913 while (1) { |
| 1911 BitstreamEntry Entry = Stream.advance(); | 1914 NaClBitstreamEntry Entry = Stream.advance(); |
| 1912 | 1915 |
| 1913 switch (Entry.Kind) { | 1916 switch (Entry.Kind) { |
| 1914 case BitstreamEntry::Error: | 1917 case NaClBitstreamEntry::Error: |
| 1915 Error("malformed module file"); | 1918 Error("malformed module file"); |
| 1916 return true; | 1919 return true; |
| 1917 case BitstreamEntry::EndBlock: | 1920 case NaClBitstreamEntry::EndBlock: |
| 1918 return false; | 1921 return false; |
| 1919 | 1922 |
| 1920 case BitstreamEntry::SubBlock: | 1923 case NaClBitstreamEntry::SubBlock: |
| 1921 if (Entry.ID == bitc::MODULE_BLOCK_ID) | 1924 if (Entry.ID == naclbitc::MODULE_BLOCK_ID) |
| 1922 return ParseModuleTriple(Triple); | 1925 return ParseModuleTriple(Triple); |
| 1923 | 1926 |
| 1924 // Ignore other sub-blocks. | 1927 // Ignore other sub-blocks. |
| 1925 if (Stream.SkipBlock()) { | 1928 if (Stream.SkipBlock()) { |
| 1926 Error("malformed block record in AST file"); | 1929 Error("malformed block record in AST file"); |
| 1927 return true; | 1930 return true; |
| 1928 } | 1931 } |
| 1929 continue; | 1932 continue; |
| 1930 | 1933 |
| 1931 case BitstreamEntry::Record: | 1934 case NaClBitstreamEntry::Record: |
| 1932 Stream.skipRecord(Entry.ID); | 1935 Stream.skipRecord(Entry.ID); |
| 1933 continue; | 1936 continue; |
| 1934 } | 1937 } |
| 1935 } | 1938 } |
| 1936 } | 1939 } |
| 1937 | 1940 |
| 1938 /// ParseMetadataAttachment - Parse metadata attachments. | 1941 /// ParseMetadataAttachment - Parse metadata attachments. |
| 1939 bool BitcodeReader::ParseMetadataAttachment() { | 1942 bool NaClBitcodeReader::ParseMetadataAttachment() { |
| 1940 if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) | 1943 if (Stream.EnterSubBlock(naclbitc::METADATA_ATTACHMENT_ID)) |
| 1941 return Error("Malformed block record"); | 1944 return Error("Malformed block record"); |
| 1942 | 1945 |
| 1943 SmallVector<uint64_t, 64> Record; | 1946 SmallVector<uint64_t, 64> Record; |
| 1944 while (1) { | 1947 while (1) { |
| 1945 BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 1948 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
| 1946 | 1949 |
| 1947 switch (Entry.Kind) { | 1950 switch (Entry.Kind) { |
| 1948 case BitstreamEntry::SubBlock: // Handled for us already. | 1951 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
| 1949 case BitstreamEntry::Error: | 1952 case NaClBitstreamEntry::Error: |
| 1950 return Error("malformed metadata block"); | 1953 return Error("malformed metadata block"); |
| 1951 case BitstreamEntry::EndBlock: | 1954 case NaClBitstreamEntry::EndBlock: |
| 1952 return false; | 1955 return false; |
| 1953 case BitstreamEntry::Record: | 1956 case NaClBitstreamEntry::Record: |
| 1954 // The interesting case. | 1957 // The interesting case. |
| 1955 break; | 1958 break; |
| 1956 } | 1959 } |
| 1957 | 1960 |
| 1958 // Read a metadata attachment record. | 1961 // Read a metadata attachment record. |
| 1959 Record.clear(); | 1962 Record.clear(); |
| 1960 switch (Stream.readRecord(Entry.ID, Record)) { | 1963 switch (Stream.readRecord(Entry.ID, Record)) { |
| 1961 default: // Default behavior: ignore. | 1964 default: // Default behavior: ignore. |
| 1962 break; | 1965 break; |
| 1963 case bitc::METADATA_ATTACHMENT: { | 1966 case naclbitc::METADATA_ATTACHMENT: { |
| 1964 unsigned RecordLength = Record.size(); | 1967 unsigned RecordLength = Record.size(); |
| 1965 if (Record.empty() || (RecordLength - 1) % 2 == 1) | 1968 if (Record.empty() || (RecordLength - 1) % 2 == 1) |
| 1966 return Error ("Invalid METADATA_ATTACHMENT reader!"); | 1969 return Error ("Invalid METADATA_ATTACHMENT reader!"); |
| 1967 Instruction *Inst = InstructionList[Record[0]]; | 1970 Instruction *Inst = InstructionList[Record[0]]; |
| 1968 for (unsigned i = 1; i != RecordLength; i = i+2) { | 1971 for (unsigned i = 1; i != RecordLength; i = i+2) { |
| 1969 unsigned Kind = Record[i]; | 1972 unsigned Kind = Record[i]; |
| 1970 DenseMap<unsigned, unsigned>::iterator I = | 1973 DenseMap<unsigned, unsigned>::iterator I = |
| 1971 MDKindMap.find(Kind); | 1974 MDKindMap.find(Kind); |
| 1972 if (I == MDKindMap.end()) | 1975 if (I == MDKindMap.end()) |
| 1973 return Error("Invalid metadata kind ID"); | 1976 return Error("Invalid metadata kind ID"); |
| 1974 Value *Node = MDValueList.getValueFwdRef(Record[i+1]); | 1977 Value *Node = MDValueList.getValueFwdRef(Record[i+1]); |
| 1975 Inst->setMetadata(I->second, cast<MDNode>(Node)); | 1978 Inst->setMetadata(I->second, cast<MDNode>(Node)); |
| 1976 } | 1979 } |
| 1977 break; | 1980 break; |
| 1978 } | 1981 } |
| 1979 } | 1982 } |
| 1980 } | 1983 } |
| 1981 } | 1984 } |
| 1982 | 1985 |
| 1983 /// ParseFunctionBody - Lazily parse the specified function body block. | 1986 /// ParseFunctionBody - Lazily parse the specified function body block. |
| 1984 bool BitcodeReader::ParseFunctionBody(Function *F) { | 1987 bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
| 1985 if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) | 1988 if (Stream.EnterSubBlock(naclbitc::FUNCTION_BLOCK_ID)) |
| 1986 return Error("Malformed block record"); | 1989 return Error("Malformed block record"); |
| 1987 | 1990 |
| 1988 InstructionList.clear(); | 1991 InstructionList.clear(); |
| 1989 unsigned ModuleValueListSize = ValueList.size(); | 1992 unsigned ModuleValueListSize = ValueList.size(); |
| 1990 unsigned ModuleMDValueListSize = MDValueList.size(); | 1993 unsigned ModuleMDValueListSize = MDValueList.size(); |
| 1991 | 1994 |
| 1992 // Add all the function arguments to the value table. | 1995 // Add all the function arguments to the value table. |
| 1993 for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 1996 for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) |
| 1994 ValueList.push_back(I); | 1997 ValueList.push_back(I); |
| 1995 | 1998 |
| 1996 unsigned NextValueNo = ValueList.size(); | 1999 unsigned NextValueNo = ValueList.size(); |
| 1997 BasicBlock *CurBB = 0; | 2000 BasicBlock *CurBB = 0; |
| 1998 unsigned CurBBNo = 0; | 2001 unsigned CurBBNo = 0; |
| 1999 | 2002 |
| 2000 DebugLoc LastLoc; | 2003 DebugLoc LastLoc; |
| 2001 | 2004 |
| 2002 // Read all the records. | 2005 // Read all the records. |
| 2003 SmallVector<uint64_t, 64> Record; | 2006 SmallVector<uint64_t, 64> Record; |
| 2004 while (1) { | 2007 while (1) { |
| 2005 BitstreamEntry Entry = Stream.advance(); | 2008 NaClBitstreamEntry Entry = Stream.advance(); |
| 2006 | 2009 |
| 2007 switch (Entry.Kind) { | 2010 switch (Entry.Kind) { |
| 2008 case BitstreamEntry::Error: | 2011 case NaClBitstreamEntry::Error: |
| 2009 return Error("Bitcode error in function block"); | 2012 return Error("Bitcode error in function block"); |
| 2010 case BitstreamEntry::EndBlock: | 2013 case NaClBitstreamEntry::EndBlock: |
| 2011 goto OutOfRecordLoop; | 2014 goto OutOfRecordLoop; |
| 2012 | 2015 |
| 2013 case BitstreamEntry::SubBlock: | 2016 case NaClBitstreamEntry::SubBlock: |
| 2014 switch (Entry.ID) { | 2017 switch (Entry.ID) { |
| 2015 default: // Skip unknown content. | 2018 default: // Skip unknown content. |
| 2016 if (Stream.SkipBlock()) | 2019 if (Stream.SkipBlock()) |
| 2017 return Error("Malformed block record"); | 2020 return Error("Malformed block record"); |
| 2018 break; | 2021 break; |
| 2019 case bitc::CONSTANTS_BLOCK_ID: | 2022 case naclbitc::CONSTANTS_BLOCK_ID: |
| 2020 if (ParseConstants()) return true; | 2023 if (ParseConstants()) return true; |
| 2021 NextValueNo = ValueList.size(); | 2024 NextValueNo = ValueList.size(); |
| 2022 break; | 2025 break; |
| 2023 case bitc::VALUE_SYMTAB_BLOCK_ID: | 2026 case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
| 2024 if (ParseValueSymbolTable()) return true; | 2027 if (ParseValueSymbolTable()) return true; |
| 2025 break; | 2028 break; |
| 2026 case bitc::METADATA_ATTACHMENT_ID: | 2029 case naclbitc::METADATA_ATTACHMENT_ID: |
| 2027 if (ParseMetadataAttachment()) return true; | 2030 if (ParseMetadataAttachment()) return true; |
| 2028 break; | 2031 break; |
| 2029 case bitc::METADATA_BLOCK_ID: | 2032 case naclbitc::METADATA_BLOCK_ID: |
| 2030 if (ParseMetadata()) return true; | 2033 if (ParseMetadata()) return true; |
| 2031 break; | 2034 break; |
| 2032 } | 2035 } |
| 2033 continue; | 2036 continue; |
| 2034 | 2037 |
| 2035 case BitstreamEntry::Record: | 2038 case NaClBitstreamEntry::Record: |
| 2036 // The interesting case. | 2039 // The interesting case. |
| 2037 break; | 2040 break; |
| 2038 } | 2041 } |
| 2039 | 2042 |
| 2040 // Read a record. | 2043 // Read a record. |
| 2041 Record.clear(); | 2044 Record.clear(); |
| 2042 Instruction *I = 0; | 2045 Instruction *I = 0; |
| 2043 unsigned BitCode = Stream.readRecord(Entry.ID, Record); | 2046 unsigned BitCode = Stream.readRecord(Entry.ID, Record); |
| 2044 switch (BitCode) { | 2047 switch (BitCode) { |
| 2045 default: // Default behavior: reject | 2048 default: // Default behavior: reject |
| 2046 return Error("Unknown instruction"); | 2049 return Error("Unknown instruction"); |
| 2047 case bitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] | 2050 case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] |
| 2048 if (Record.size() < 1 || Record[0] == 0) | 2051 if (Record.size() < 1 || Record[0] == 0) |
| 2049 return Error("Invalid DECLAREBLOCKS record"); | 2052 return Error("Invalid DECLAREBLOCKS record"); |
| 2050 // Create all the basic blocks for the function. | 2053 // Create all the basic blocks for the function. |
| 2051 FunctionBBs.resize(Record[0]); | 2054 FunctionBBs.resize(Record[0]); |
| 2052 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) | 2055 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) |
| 2053 FunctionBBs[i] = BasicBlock::Create(Context, "", F); | 2056 FunctionBBs[i] = BasicBlock::Create(Context, "", F); |
| 2054 CurBB = FunctionBBs[0]; | 2057 CurBB = FunctionBBs[0]; |
| 2055 continue; | 2058 continue; |
| 2056 | 2059 |
| 2057 case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN | 2060 case naclbitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN |
| 2058 // This record indicates that the last instruction is at the same | 2061 // This record indicates that the last instruction is at the same |
| 2059 // location as the previous instruction with a location. | 2062 // location as the previous instruction with a location. |
| 2060 I = 0; | 2063 I = 0; |
| 2061 | 2064 |
| 2062 // Get the last instruction emitted. | 2065 // Get the last instruction emitted. |
| 2063 if (CurBB && !CurBB->empty()) | 2066 if (CurBB && !CurBB->empty()) |
| 2064 I = &CurBB->back(); | 2067 I = &CurBB->back(); |
| 2065 else if (CurBBNo && FunctionBBs[CurBBNo-1] && | 2068 else if (CurBBNo && FunctionBBs[CurBBNo-1] && |
| 2066 !FunctionBBs[CurBBNo-1]->empty()) | 2069 !FunctionBBs[CurBBNo-1]->empty()) |
| 2067 I = &FunctionBBs[CurBBNo-1]->back(); | 2070 I = &FunctionBBs[CurBBNo-1]->back(); |
| 2068 | 2071 |
| 2069 if (I == 0) return Error("Invalid DEBUG_LOC_AGAIN record"); | 2072 if (I == 0) return Error("Invalid DEBUG_LOC_AGAIN record"); |
| 2070 I->setDebugLoc(LastLoc); | 2073 I->setDebugLoc(LastLoc); |
| 2071 I = 0; | 2074 I = 0; |
| 2072 continue; | 2075 continue; |
| 2073 | 2076 |
| 2074 case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] | 2077 case naclbitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope,
ia] |
| 2075 I = 0; // Get the last instruction emitted. | 2078 I = 0; // Get the last instruction emitted. |
| 2076 if (CurBB && !CurBB->empty()) | 2079 if (CurBB && !CurBB->empty()) |
| 2077 I = &CurBB->back(); | 2080 I = &CurBB->back(); |
| 2078 else if (CurBBNo && FunctionBBs[CurBBNo-1] && | 2081 else if (CurBBNo && FunctionBBs[CurBBNo-1] && |
| 2079 !FunctionBBs[CurBBNo-1]->empty()) | 2082 !FunctionBBs[CurBBNo-1]->empty()) |
| 2080 I = &FunctionBBs[CurBBNo-1]->back(); | 2083 I = &FunctionBBs[CurBBNo-1]->back(); |
| 2081 if (I == 0 || Record.size() < 4) | 2084 if (I == 0 || Record.size() < 4) |
| 2082 return Error("Invalid FUNC_CODE_DEBUG_LOC record"); | 2085 return Error("Invalid FUNC_CODE_DEBUG_LOC record"); |
| 2083 | 2086 |
| 2084 unsigned Line = Record[0], Col = Record[1]; | 2087 unsigned Line = Record[0], Col = Record[1]; |
| 2085 unsigned ScopeID = Record[2], IAID = Record[3]; | 2088 unsigned ScopeID = Record[2], IAID = Record[3]; |
| 2086 | 2089 |
| 2087 MDNode *Scope = 0, *IA = 0; | 2090 MDNode *Scope = 0, *IA = 0; |
| 2088 if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); | 2091 if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); |
| 2089 if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); | 2092 if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); |
| 2090 LastLoc = DebugLoc::get(Line, Col, Scope, IA); | 2093 LastLoc = DebugLoc::get(Line, Col, Scope, IA); |
| 2091 I->setDebugLoc(LastLoc); | 2094 I->setDebugLoc(LastLoc); |
| 2092 I = 0; | 2095 I = 0; |
| 2093 continue; | 2096 continue; |
| 2094 } | 2097 } |
| 2095 | 2098 |
| 2096 case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] | 2099 case naclbitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcod
e] |
| 2097 unsigned OpNum = 0; | 2100 unsigned OpNum = 0; |
| 2098 Value *LHS, *RHS; | 2101 Value *LHS, *RHS; |
| 2099 if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || | 2102 if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || |
| 2100 popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || | 2103 popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || |
| 2101 OpNum+1 > Record.size()) | 2104 OpNum+1 > Record.size()) |
| 2102 return Error("Invalid BINOP record"); | 2105 return Error("Invalid BINOP record"); |
| 2103 | 2106 |
| 2104 int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); | 2107 int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); |
| 2105 if (Opc == -1) return Error("Invalid BINOP record"); | 2108 if (Opc == -1) return Error("Invalid BINOP record"); |
| 2106 I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); | 2109 I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); |
| 2107 InstructionList.push_back(I); | 2110 InstructionList.push_back(I); |
| 2108 if (OpNum < Record.size()) { | 2111 if (OpNum < Record.size()) { |
| 2109 if (Opc == Instruction::Add || | 2112 if (Opc == Instruction::Add || |
| 2110 Opc == Instruction::Sub || | 2113 Opc == Instruction::Sub || |
| 2111 Opc == Instruction::Mul || | 2114 Opc == Instruction::Mul || |
| 2112 Opc == Instruction::Shl) { | 2115 Opc == Instruction::Shl) { |
| 2113 if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) | 2116 if (Record[OpNum] & (1 << naclbitc::OBO_NO_SIGNED_WRAP)) |
| 2114 cast<BinaryOperator>(I)->setHasNoSignedWrap(true); | 2117 cast<BinaryOperator>(I)->setHasNoSignedWrap(true); |
| 2115 if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) | 2118 if (Record[OpNum] & (1 << naclbitc::OBO_NO_UNSIGNED_WRAP)) |
| 2116 cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); | 2119 cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); |
| 2117 } else if (Opc == Instruction::SDiv || | 2120 } else if (Opc == Instruction::SDiv || |
| 2118 Opc == Instruction::UDiv || | 2121 Opc == Instruction::UDiv || |
| 2119 Opc == Instruction::LShr || | 2122 Opc == Instruction::LShr || |
| 2120 Opc == Instruction::AShr) { | 2123 Opc == Instruction::AShr) { |
| 2121 if (Record[OpNum] & (1 << bitc::PEO_EXACT)) | 2124 if (Record[OpNum] & (1 << naclbitc::PEO_EXACT)) |
| 2122 cast<BinaryOperator>(I)->setIsExact(true); | 2125 cast<BinaryOperator>(I)->setIsExact(true); |
| 2123 } else if (isa<FPMathOperator>(I)) { | 2126 } else if (isa<FPMathOperator>(I)) { |
| 2124 FastMathFlags FMF; | 2127 FastMathFlags FMF; |
| 2125 if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) | 2128 if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) |
| 2126 FMF.setUnsafeAlgebra(); | 2129 FMF.setUnsafeAlgebra(); |
| 2127 if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) | 2130 if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) |
| 2128 FMF.setNoNaNs(); | 2131 FMF.setNoNaNs(); |
| 2129 if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) | 2132 if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) |
| 2130 FMF.setNoInfs(); | 2133 FMF.setNoInfs(); |
| 2131 if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) | 2134 if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) |
| 2132 FMF.setNoSignedZeros(); | 2135 FMF.setNoSignedZeros(); |
| 2133 if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) | 2136 if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) |
| 2134 FMF.setAllowReciprocal(); | 2137 FMF.setAllowReciprocal(); |
| 2135 if (FMF.any()) | 2138 if (FMF.any()) |
| 2136 I->setFastMathFlags(FMF); | 2139 I->setFastMathFlags(FMF); |
| 2137 } | 2140 } |
| 2138 | 2141 |
| 2139 } | 2142 } |
| 2140 break; | 2143 break; |
| 2141 } | 2144 } |
| 2142 case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] | 2145 case naclbitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, cast
opc] |
| 2143 unsigned OpNum = 0; | 2146 unsigned OpNum = 0; |
| 2144 Value *Op; | 2147 Value *Op; |
| 2145 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 2148 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || |
| 2146 OpNum+2 != Record.size()) | 2149 OpNum+2 != Record.size()) |
| 2147 return Error("Invalid CAST record"); | 2150 return Error("Invalid CAST record"); |
| 2148 | 2151 |
| 2149 Type *ResTy = getTypeByID(Record[OpNum]); | 2152 Type *ResTy = getTypeByID(Record[OpNum]); |
| 2150 int Opc = GetDecodedCastOpcode(Record[OpNum+1]); | 2153 int Opc = GetDecodedCastOpcode(Record[OpNum+1]); |
| 2151 if (Opc == -1 || ResTy == 0) | 2154 if (Opc == -1 || ResTy == 0) |
| 2152 return Error("Invalid CAST record"); | 2155 return Error("Invalid CAST record"); |
| 2153 I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); | 2156 I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); |
| 2154 InstructionList.push_back(I); | 2157 InstructionList.push_back(I); |
| 2155 break; | 2158 break; |
| 2156 } | 2159 } |
| 2157 case bitc::FUNC_CODE_INST_INBOUNDS_GEP: | 2160 case naclbitc::FUNC_CODE_INST_INBOUNDS_GEP: |
| 2158 case bitc::FUNC_CODE_INST_GEP: { // GEP: [n x operands] | 2161 case naclbitc::FUNC_CODE_INST_GEP: { // GEP: [n x operands] |
| 2159 unsigned OpNum = 0; | 2162 unsigned OpNum = 0; |
| 2160 Value *BasePtr; | 2163 Value *BasePtr; |
| 2161 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) | 2164 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) |
| 2162 return Error("Invalid GEP record"); | 2165 return Error("Invalid GEP record"); |
| 2163 | 2166 |
| 2164 SmallVector<Value*, 16> GEPIdx; | 2167 SmallVector<Value*, 16> GEPIdx; |
| 2165 while (OpNum != Record.size()) { | 2168 while (OpNum != Record.size()) { |
| 2166 Value *Op; | 2169 Value *Op; |
| 2167 if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 2170 if (getValueTypePair(Record, OpNum, NextValueNo, Op)) |
| 2168 return Error("Invalid GEP record"); | 2171 return Error("Invalid GEP record"); |
| 2169 GEPIdx.push_back(Op); | 2172 GEPIdx.push_back(Op); |
| 2170 } | 2173 } |
| 2171 | 2174 |
| 2172 I = GetElementPtrInst::Create(BasePtr, GEPIdx); | 2175 I = GetElementPtrInst::Create(BasePtr, GEPIdx); |
| 2173 InstructionList.push_back(I); | 2176 InstructionList.push_back(I); |
| 2174 if (BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP) | 2177 if (BitCode == naclbitc::FUNC_CODE_INST_INBOUNDS_GEP) |
| 2175 cast<GetElementPtrInst>(I)->setIsInBounds(true); | 2178 cast<GetElementPtrInst>(I)->setIsInBounds(true); |
| 2176 break; | 2179 break; |
| 2177 } | 2180 } |
| 2178 | 2181 |
| 2179 case bitc::FUNC_CODE_INST_EXTRACTVAL: { | 2182 case naclbitc::FUNC_CODE_INST_EXTRACTVAL: { |
| 2180 // EXTRACTVAL: [opty, opval, n x indices] | 2183 // EXTRACTVAL: [opty, opval, n x indices] |
| 2181 unsigned OpNum = 0; | 2184 unsigned OpNum = 0; |
| 2182 Value *Agg; | 2185 Value *Agg; |
| 2183 if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) | 2186 if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) |
| 2184 return Error("Invalid EXTRACTVAL record"); | 2187 return Error("Invalid EXTRACTVAL record"); |
| 2185 | 2188 |
| 2186 SmallVector<unsigned, 4> EXTRACTVALIdx; | 2189 SmallVector<unsigned, 4> EXTRACTVALIdx; |
| 2187 for (unsigned RecSize = Record.size(); | 2190 for (unsigned RecSize = Record.size(); |
| 2188 OpNum != RecSize; ++OpNum) { | 2191 OpNum != RecSize; ++OpNum) { |
| 2189 uint64_t Index = Record[OpNum]; | 2192 uint64_t Index = Record[OpNum]; |
| 2190 if ((unsigned)Index != Index) | 2193 if ((unsigned)Index != Index) |
| 2191 return Error("Invalid EXTRACTVAL index"); | 2194 return Error("Invalid EXTRACTVAL index"); |
| 2192 EXTRACTVALIdx.push_back((unsigned)Index); | 2195 EXTRACTVALIdx.push_back((unsigned)Index); |
| 2193 } | 2196 } |
| 2194 | 2197 |
| 2195 I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); | 2198 I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); |
| 2196 InstructionList.push_back(I); | 2199 InstructionList.push_back(I); |
| 2197 break; | 2200 break; |
| 2198 } | 2201 } |
| 2199 | 2202 |
| 2200 case bitc::FUNC_CODE_INST_INSERTVAL: { | 2203 case naclbitc::FUNC_CODE_INST_INSERTVAL: { |
| 2201 // INSERTVAL: [opty, opval, opty, opval, n x indices] | 2204 // INSERTVAL: [opty, opval, opty, opval, n x indices] |
| 2202 unsigned OpNum = 0; | 2205 unsigned OpNum = 0; |
| 2203 Value *Agg; | 2206 Value *Agg; |
| 2204 if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) | 2207 if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) |
| 2205 return Error("Invalid INSERTVAL record"); | 2208 return Error("Invalid INSERTVAL record"); |
| 2206 Value *Val; | 2209 Value *Val; |
| 2207 if (getValueTypePair(Record, OpNum, NextValueNo, Val)) | 2210 if (getValueTypePair(Record, OpNum, NextValueNo, Val)) |
| 2208 return Error("Invalid INSERTVAL record"); | 2211 return Error("Invalid INSERTVAL record"); |
| 2209 | 2212 |
| 2210 SmallVector<unsigned, 4> INSERTVALIdx; | 2213 SmallVector<unsigned, 4> INSERTVALIdx; |
| 2211 for (unsigned RecSize = Record.size(); | 2214 for (unsigned RecSize = Record.size(); |
| 2212 OpNum != RecSize; ++OpNum) { | 2215 OpNum != RecSize; ++OpNum) { |
| 2213 uint64_t Index = Record[OpNum]; | 2216 uint64_t Index = Record[OpNum]; |
| 2214 if ((unsigned)Index != Index) | 2217 if ((unsigned)Index != Index) |
| 2215 return Error("Invalid INSERTVAL index"); | 2218 return Error("Invalid INSERTVAL index"); |
| 2216 INSERTVALIdx.push_back((unsigned)Index); | 2219 INSERTVALIdx.push_back((unsigned)Index); |
| 2217 } | 2220 } |
| 2218 | 2221 |
| 2219 I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); | 2222 I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); |
| 2220 InstructionList.push_back(I); | 2223 InstructionList.push_back(I); |
| 2221 break; | 2224 break; |
| 2222 } | 2225 } |
| 2223 | 2226 |
| 2224 case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] | 2227 case naclbitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] |
| 2225 // obsolete form of select | 2228 // obsolete form of select |
| 2226 // handles select i1 ... in old bitcode | 2229 // handles select i1 ... in old bitcode |
| 2227 unsigned OpNum = 0; | 2230 unsigned OpNum = 0; |
| 2228 Value *TrueVal, *FalseVal, *Cond; | 2231 Value *TrueVal, *FalseVal, *Cond; |
| 2229 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || | 2232 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || |
| 2230 popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || | 2233 popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || |
| 2231 popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) | 2234 popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) |
| 2232 return Error("Invalid SELECT record"); | 2235 return Error("Invalid SELECT record"); |
| 2233 | 2236 |
| 2234 I = SelectInst::Create(Cond, TrueVal, FalseVal); | 2237 I = SelectInst::Create(Cond, TrueVal, FalseVal); |
| 2235 InstructionList.push_back(I); | 2238 InstructionList.push_back(I); |
| 2236 break; | 2239 break; |
| 2237 } | 2240 } |
| 2238 | 2241 |
| 2239 case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] | 2242 case naclbitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,p
red] |
| 2240 // new form of select | 2243 // new form of select |
| 2241 // handles select i1 or select [N x i1] | 2244 // handles select i1 or select [N x i1] |
| 2242 unsigned OpNum = 0; | 2245 unsigned OpNum = 0; |
| 2243 Value *TrueVal, *FalseVal, *Cond; | 2246 Value *TrueVal, *FalseVal, *Cond; |
| 2244 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || | 2247 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || |
| 2245 popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || | 2248 popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || |
| 2246 getValueTypePair(Record, OpNum, NextValueNo, Cond)) | 2249 getValueTypePair(Record, OpNum, NextValueNo, Cond)) |
| 2247 return Error("Invalid SELECT record"); | 2250 return Error("Invalid SELECT record"); |
| 2248 | 2251 |
| 2249 // select condition can be either i1 or [N x i1] | 2252 // select condition can be either i1 or [N x i1] |
| 2250 if (VectorType* vector_type = | 2253 if (VectorType* vector_type = |
| 2251 dyn_cast<VectorType>(Cond->getType())) { | 2254 dyn_cast<VectorType>(Cond->getType())) { |
| 2252 // expect <n x i1> | 2255 // expect <n x i1> |
| 2253 if (vector_type->getElementType() != Type::getInt1Ty(Context)) | 2256 if (vector_type->getElementType() != Type::getInt1Ty(Context)) |
| 2254 return Error("Invalid SELECT condition type"); | 2257 return Error("Invalid SELECT condition type"); |
| 2255 } else { | 2258 } else { |
| 2256 // expect i1 | 2259 // expect i1 |
| 2257 if (Cond->getType() != Type::getInt1Ty(Context)) | 2260 if (Cond->getType() != Type::getInt1Ty(Context)) |
| 2258 return Error("Invalid SELECT condition type"); | 2261 return Error("Invalid SELECT condition type"); |
| 2259 } | 2262 } |
| 2260 | 2263 |
| 2261 I = SelectInst::Create(Cond, TrueVal, FalseVal); | 2264 I = SelectInst::Create(Cond, TrueVal, FalseVal); |
| 2262 InstructionList.push_back(I); | 2265 InstructionList.push_back(I); |
| 2263 break; | 2266 break; |
| 2264 } | 2267 } |
| 2265 | 2268 |
| 2266 case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] | 2269 case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opv
al] |
| 2267 unsigned OpNum = 0; | 2270 unsigned OpNum = 0; |
| 2268 Value *Vec, *Idx; | 2271 Value *Vec, *Idx; |
| 2269 if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || | 2272 if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || |
| 2270 popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) | 2273 popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) |
| 2271 return Error("Invalid EXTRACTELT record"); | 2274 return Error("Invalid EXTRACTELT record"); |
| 2272 I = ExtractElementInst::Create(Vec, Idx); | 2275 I = ExtractElementInst::Create(Vec, Idx); |
| 2273 InstructionList.push_back(I); | 2276 InstructionList.push_back(I); |
| 2274 break; | 2277 break; |
| 2275 } | 2278 } |
| 2276 | 2279 |
| 2277 case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] | 2280 case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,op
val] |
| 2278 unsigned OpNum = 0; | 2281 unsigned OpNum = 0; |
| 2279 Value *Vec, *Elt, *Idx; | 2282 Value *Vec, *Elt, *Idx; |
| 2280 if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || | 2283 if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || |
| 2281 popValue(Record, OpNum, NextValueNo, | 2284 popValue(Record, OpNum, NextValueNo, |
| 2282 cast<VectorType>(Vec->getType())->getElementType(), Elt) || | 2285 cast<VectorType>(Vec->getType())->getElementType(), Elt) || |
| 2283 popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) | 2286 popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) |
| 2284 return Error("Invalid INSERTELT record"); | 2287 return Error("Invalid INSERTELT record"); |
| 2285 I = InsertElementInst::Create(Vec, Elt, Idx); | 2288 I = InsertElementInst::Create(Vec, Elt, Idx); |
| 2286 InstructionList.push_back(I); | 2289 InstructionList.push_back(I); |
| 2287 break; | 2290 break; |
| 2288 } | 2291 } |
| 2289 | 2292 |
| 2290 case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] | 2293 case naclbitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,op
val] |
| 2291 unsigned OpNum = 0; | 2294 unsigned OpNum = 0; |
| 2292 Value *Vec1, *Vec2, *Mask; | 2295 Value *Vec1, *Vec2, *Mask; |
| 2293 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || | 2296 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || |
| 2294 popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) | 2297 popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) |
| 2295 return Error("Invalid SHUFFLEVEC record"); | 2298 return Error("Invalid SHUFFLEVEC record"); |
| 2296 | 2299 |
| 2297 if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) | 2300 if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) |
| 2298 return Error("Invalid SHUFFLEVEC record"); | 2301 return Error("Invalid SHUFFLEVEC record"); |
| 2299 I = new ShuffleVectorInst(Vec1, Vec2, Mask); | 2302 I = new ShuffleVectorInst(Vec1, Vec2, Mask); |
| 2300 InstructionList.push_back(I); | 2303 InstructionList.push_back(I); |
| 2301 break; | 2304 break; |
| 2302 } | 2305 } |
| 2303 | 2306 |
| 2304 case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] | 2307 case naclbitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] |
| 2305 // Old form of ICmp/FCmp returning bool | 2308 // Old form of ICmp/FCmp returning bool |
| 2306 // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were | 2309 // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were |
| 2307 // both legal on vectors but had different behaviour. | 2310 // both legal on vectors but had different behaviour. |
| 2308 case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] | 2311 case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] |
| 2309 // FCmp/ICmp returning bool or vector of bool | 2312 // FCmp/ICmp returning bool or vector of bool |
| 2310 | 2313 |
| 2311 unsigned OpNum = 0; | 2314 unsigned OpNum = 0; |
| 2312 Value *LHS, *RHS; | 2315 Value *LHS, *RHS; |
| 2313 if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || | 2316 if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || |
| 2314 popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || | 2317 popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || |
| 2315 OpNum+1 != Record.size()) | 2318 OpNum+1 != Record.size()) |
| 2316 return Error("Invalid CMP record"); | 2319 return Error("Invalid CMP record"); |
| 2317 | 2320 |
| 2318 if (LHS->getType()->isFPOrFPVectorTy()) | 2321 if (LHS->getType()->isFPOrFPVectorTy()) |
| 2319 I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); | 2322 I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); |
| 2320 else | 2323 else |
| 2321 I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); | 2324 I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); |
| 2322 InstructionList.push_back(I); | 2325 InstructionList.push_back(I); |
| 2323 break; | 2326 break; |
| 2324 } | 2327 } |
| 2325 | 2328 |
| 2326 case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] | 2329 case naclbitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] |
| 2327 { | 2330 { |
| 2328 unsigned Size = Record.size(); | 2331 unsigned Size = Record.size(); |
| 2329 if (Size == 0) { | 2332 if (Size == 0) { |
| 2330 I = ReturnInst::Create(Context); | 2333 I = ReturnInst::Create(Context); |
| 2331 InstructionList.push_back(I); | 2334 InstructionList.push_back(I); |
| 2332 break; | 2335 break; |
| 2333 } | 2336 } |
| 2334 | 2337 |
| 2335 unsigned OpNum = 0; | 2338 unsigned OpNum = 0; |
| 2336 Value *Op = NULL; | 2339 Value *Op = NULL; |
| 2337 if (getValueTypePair(Record, OpNum, NextValueNo, Op)) | 2340 if (getValueTypePair(Record, OpNum, NextValueNo, Op)) |
| 2338 return Error("Invalid RET record"); | 2341 return Error("Invalid RET record"); |
| 2339 if (OpNum != Record.size()) | 2342 if (OpNum != Record.size()) |
| 2340 return Error("Invalid RET record"); | 2343 return Error("Invalid RET record"); |
| 2341 | 2344 |
| 2342 I = ReturnInst::Create(Context, Op); | 2345 I = ReturnInst::Create(Context, Op); |
| 2343 InstructionList.push_back(I); | 2346 InstructionList.push_back(I); |
| 2344 break; | 2347 break; |
| 2345 } | 2348 } |
| 2346 case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] | 2349 case naclbitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] |
| 2347 if (Record.size() != 1 && Record.size() != 3) | 2350 if (Record.size() != 1 && Record.size() != 3) |
| 2348 return Error("Invalid BR record"); | 2351 return Error("Invalid BR record"); |
| 2349 BasicBlock *TrueDest = getBasicBlock(Record[0]); | 2352 BasicBlock *TrueDest = getBasicBlock(Record[0]); |
| 2350 if (TrueDest == 0) | 2353 if (TrueDest == 0) |
| 2351 return Error("Invalid BR record"); | 2354 return Error("Invalid BR record"); |
| 2352 | 2355 |
| 2353 if (Record.size() == 1) { | 2356 if (Record.size() == 1) { |
| 2354 I = BranchInst::Create(TrueDest); | 2357 I = BranchInst::Create(TrueDest); |
| 2355 InstructionList.push_back(I); | 2358 InstructionList.push_back(I); |
| 2356 } | 2359 } |
| 2357 else { | 2360 else { |
| 2358 BasicBlock *FalseDest = getBasicBlock(Record[1]); | 2361 BasicBlock *FalseDest = getBasicBlock(Record[1]); |
| 2359 Value *Cond = getValue(Record, 2, NextValueNo, | 2362 Value *Cond = getValue(Record, 2, NextValueNo, |
| 2360 Type::getInt1Ty(Context)); | 2363 Type::getInt1Ty(Context)); |
| 2361 if (FalseDest == 0 || Cond == 0) | 2364 if (FalseDest == 0 || Cond == 0) |
| 2362 return Error("Invalid BR record"); | 2365 return Error("Invalid BR record"); |
| 2363 I = BranchInst::Create(TrueDest, FalseDest, Cond); | 2366 I = BranchInst::Create(TrueDest, FalseDest, Cond); |
| 2364 InstructionList.push_back(I); | 2367 InstructionList.push_back(I); |
| 2365 } | 2368 } |
| 2366 break; | 2369 break; |
| 2367 } | 2370 } |
| 2368 case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] | 2371 case naclbitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] |
| 2369 // Check magic | 2372 // Check magic |
| 2370 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { | 2373 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { |
| 2371 // New SwitchInst format with case ranges. | 2374 // New SwitchInst format with case ranges. |
| 2372 | 2375 |
| 2373 Type *OpTy = getTypeByID(Record[1]); | 2376 Type *OpTy = getTypeByID(Record[1]); |
| 2374 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); | 2377 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); |
| 2375 | 2378 |
| 2376 Value *Cond = getValue(Record, 2, NextValueNo, OpTy); | 2379 Value *Cond = getValue(Record, 2, NextValueNo, OpTy); |
| 2377 BasicBlock *Default = getBasicBlock(Record[3]); | 2380 BasicBlock *Default = getBasicBlock(Record[3]); |
| 2378 if (OpTy == 0 || Cond == 0 || Default == 0) | 2381 if (OpTy == 0 || Cond == 0 || Default == 0) |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2441 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); | 2444 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); |
| 2442 if (CaseVal == 0 || DestBB == 0) { | 2445 if (CaseVal == 0 || DestBB == 0) { |
| 2443 delete SI; | 2446 delete SI; |
| 2444 return Error("Invalid SWITCH record!"); | 2447 return Error("Invalid SWITCH record!"); |
| 2445 } | 2448 } |
| 2446 SI->addCase(CaseVal, DestBB); | 2449 SI->addCase(CaseVal, DestBB); |
| 2447 } | 2450 } |
| 2448 I = SI; | 2451 I = SI; |
| 2449 break; | 2452 break; |
| 2450 } | 2453 } |
| 2451 case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] | 2454 case naclbitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1,
...] |
| 2452 if (Record.size() < 2) | 2455 if (Record.size() < 2) |
| 2453 return Error("Invalid INDIRECTBR record"); | 2456 return Error("Invalid INDIRECTBR record"); |
| 2454 Type *OpTy = getTypeByID(Record[0]); | 2457 Type *OpTy = getTypeByID(Record[0]); |
| 2455 Value *Address = getValue(Record, 1, NextValueNo, OpTy); | 2458 Value *Address = getValue(Record, 1, NextValueNo, OpTy); |
| 2456 if (OpTy == 0 || Address == 0) | 2459 if (OpTy == 0 || Address == 0) |
| 2457 return Error("Invalid INDIRECTBR record"); | 2460 return Error("Invalid INDIRECTBR record"); |
| 2458 unsigned NumDests = Record.size()-2; | 2461 unsigned NumDests = Record.size()-2; |
| 2459 IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); | 2462 IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); |
| 2460 InstructionList.push_back(IBI); | 2463 InstructionList.push_back(IBI); |
| 2461 for (unsigned i = 0, e = NumDests; i != e; ++i) { | 2464 for (unsigned i = 0, e = NumDests; i != e; ++i) { |
| 2462 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { | 2465 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { |
| 2463 IBI->addDestination(DestBB); | 2466 IBI->addDestination(DestBB); |
| 2464 } else { | 2467 } else { |
| 2465 delete IBI; | 2468 delete IBI; |
| 2466 return Error("Invalid INDIRECTBR record!"); | 2469 return Error("Invalid INDIRECTBR record!"); |
| 2467 } | 2470 } |
| 2468 } | 2471 } |
| 2469 I = IBI; | 2472 I = IBI; |
| 2470 break; | 2473 break; |
| 2471 } | 2474 } |
| 2472 | 2475 |
| 2473 case bitc::FUNC_CODE_INST_INVOKE: { | 2476 case naclbitc::FUNC_CODE_INST_INVOKE: { |
| 2474 // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] | 2477 // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] |
| 2475 if (Record.size() < 4) return Error("Invalid INVOKE record"); | 2478 if (Record.size() < 4) return Error("Invalid INVOKE record"); |
| 2476 AttributeSet PAL = getAttributes(Record[0]); | 2479 AttributeSet PAL = getAttributes(Record[0]); |
| 2477 unsigned CCInfo = Record[1]; | 2480 unsigned CCInfo = Record[1]; |
| 2478 BasicBlock *NormalBB = getBasicBlock(Record[2]); | 2481 BasicBlock *NormalBB = getBasicBlock(Record[2]); |
| 2479 BasicBlock *UnwindBB = getBasicBlock(Record[3]); | 2482 BasicBlock *UnwindBB = getBasicBlock(Record[3]); |
| 2480 | 2483 |
| 2481 unsigned OpNum = 4; | 2484 unsigned OpNum = 4; |
| 2482 Value *Callee; | 2485 Value *Callee; |
| 2483 if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) | 2486 if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2512 } | 2515 } |
| 2513 } | 2516 } |
| 2514 | 2517 |
| 2515 I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); | 2518 I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); |
| 2516 InstructionList.push_back(I); | 2519 InstructionList.push_back(I); |
| 2517 cast<InvokeInst>(I)->setCallingConv( | 2520 cast<InvokeInst>(I)->setCallingConv( |
| 2518 static_cast<CallingConv::ID>(CCInfo)); | 2521 static_cast<CallingConv::ID>(CCInfo)); |
| 2519 cast<InvokeInst>(I)->setAttributes(PAL); | 2522 cast<InvokeInst>(I)->setAttributes(PAL); |
| 2520 break; | 2523 break; |
| 2521 } | 2524 } |
| 2522 case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] | 2525 case naclbitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] |
| 2523 unsigned Idx = 0; | 2526 unsigned Idx = 0; |
| 2524 Value *Val = 0; | 2527 Value *Val = 0; |
| 2525 if (getValueTypePair(Record, Idx, NextValueNo, Val)) | 2528 if (getValueTypePair(Record, Idx, NextValueNo, Val)) |
| 2526 return Error("Invalid RESUME record"); | 2529 return Error("Invalid RESUME record"); |
| 2527 I = ResumeInst::Create(Val); | 2530 I = ResumeInst::Create(Val); |
| 2528 InstructionList.push_back(I); | 2531 InstructionList.push_back(I); |
| 2529 break; | 2532 break; |
| 2530 } | 2533 } |
| 2531 case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE | 2534 case naclbitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE |
| 2532 I = new UnreachableInst(Context); | 2535 I = new UnreachableInst(Context); |
| 2533 InstructionList.push_back(I); | 2536 InstructionList.push_back(I); |
| 2534 break; | 2537 break; |
| 2535 case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] | 2538 case naclbitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] |
| 2536 if (Record.size() < 1 || ((Record.size()-1)&1)) | 2539 if (Record.size() < 1 || ((Record.size()-1)&1)) |
| 2537 return Error("Invalid PHI record"); | 2540 return Error("Invalid PHI record"); |
| 2538 Type *Ty = getTypeByID(Record[0]); | 2541 Type *Ty = getTypeByID(Record[0]); |
| 2539 if (!Ty) return Error("Invalid PHI record"); | 2542 if (!Ty) return Error("Invalid PHI record"); |
| 2540 | 2543 |
| 2541 PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); | 2544 PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); |
| 2542 InstructionList.push_back(PN); | 2545 InstructionList.push_back(PN); |
| 2543 | 2546 |
| 2544 for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { | 2547 for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { |
| 2545 Value *V; | 2548 Value *V; |
| 2546 // With the new function encoding, it is possible that operands have | 2549 // With the new function encoding, it is possible that operands have |
| 2547 // negative IDs (for forward references). Use a signed VBR | 2550 // negative IDs (for forward references). Use a signed VBR |
| 2548 // representation to keep the encoding small. | 2551 // representation to keep the encoding small. |
| 2549 if (UseRelativeIDs) | 2552 if (UseRelativeIDs) |
| 2550 V = getValueSigned(Record, 1+i, NextValueNo, Ty); | 2553 V = getValueSigned(Record, 1+i, NextValueNo, Ty); |
| 2551 else | 2554 else |
| 2552 V = getValue(Record, 1+i, NextValueNo, Ty); | 2555 V = getValue(Record, 1+i, NextValueNo, Ty); |
| 2553 BasicBlock *BB = getBasicBlock(Record[2+i]); | 2556 BasicBlock *BB = getBasicBlock(Record[2+i]); |
| 2554 if (!V || !BB) return Error("Invalid PHI record"); | 2557 if (!V || !BB) return Error("Invalid PHI record"); |
| 2555 PN->addIncoming(V, BB); | 2558 PN->addIncoming(V, BB); |
| 2556 } | 2559 } |
| 2557 I = PN; | 2560 I = PN; |
| 2558 break; | 2561 break; |
| 2559 } | 2562 } |
| 2560 | 2563 |
| 2561 case bitc::FUNC_CODE_INST_LANDINGPAD: { | 2564 case naclbitc::FUNC_CODE_INST_LANDINGPAD: { |
| 2562 // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] | 2565 // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] |
| 2563 unsigned Idx = 0; | 2566 unsigned Idx = 0; |
| 2564 if (Record.size() < 4) | 2567 if (Record.size() < 4) |
| 2565 return Error("Invalid LANDINGPAD record"); | 2568 return Error("Invalid LANDINGPAD record"); |
| 2566 Type *Ty = getTypeByID(Record[Idx++]); | 2569 Type *Ty = getTypeByID(Record[Idx++]); |
| 2567 if (!Ty) return Error("Invalid LANDINGPAD record"); | 2570 if (!Ty) return Error("Invalid LANDINGPAD record"); |
| 2568 Value *PersFn = 0; | 2571 Value *PersFn = 0; |
| 2569 if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) | 2572 if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) |
| 2570 return Error("Invalid LANDINGPAD record"); | 2573 return Error("Invalid LANDINGPAD record"); |
| 2571 | 2574 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2590 isa<ArrayType>(Val->getType())) && | 2593 isa<ArrayType>(Val->getType())) && |
| 2591 "Filter clause has invalid type!"); | 2594 "Filter clause has invalid type!"); |
| 2592 LP->addClause(Val); | 2595 LP->addClause(Val); |
| 2593 } | 2596 } |
| 2594 | 2597 |
| 2595 I = LP; | 2598 I = LP; |
| 2596 InstructionList.push_back(I); | 2599 InstructionList.push_back(I); |
| 2597 break; | 2600 break; |
| 2598 } | 2601 } |
| 2599 | 2602 |
| 2600 case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] | 2603 case naclbitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] |
| 2601 if (Record.size() != 4) | 2604 if (Record.size() != 4) |
| 2602 return Error("Invalid ALLOCA record"); | 2605 return Error("Invalid ALLOCA record"); |
| 2603 PointerType *Ty = | 2606 PointerType *Ty = |
| 2604 dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); | 2607 dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); |
| 2605 Type *OpTy = getTypeByID(Record[1]); | 2608 Type *OpTy = getTypeByID(Record[1]); |
| 2606 Value *Size = getFnValueByID(Record[2], OpTy); | 2609 Value *Size = getFnValueByID(Record[2], OpTy); |
| 2607 unsigned Align = Record[3]; | 2610 unsigned Align = Record[3]; |
| 2608 if (!Ty || !Size) return Error("Invalid ALLOCA record"); | 2611 if (!Ty || !Size) return Error("Invalid ALLOCA record"); |
| 2609 I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); | 2612 I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); |
| 2610 InstructionList.push_back(I); | 2613 InstructionList.push_back(I); |
| 2611 break; | 2614 break; |
| 2612 } | 2615 } |
| 2613 case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] | 2616 case naclbitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] |
| 2614 unsigned OpNum = 0; | 2617 unsigned OpNum = 0; |
| 2615 Value *Op; | 2618 Value *Op; |
| 2616 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 2619 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || |
| 2617 OpNum+2 != Record.size()) | 2620 OpNum+2 != Record.size()) |
| 2618 return Error("Invalid LOAD record"); | 2621 return Error("Invalid LOAD record"); |
| 2619 | 2622 |
| 2620 I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1); | 2623 I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1); |
| 2621 InstructionList.push_back(I); | 2624 InstructionList.push_back(I); |
| 2622 break; | 2625 break; |
| 2623 } | 2626 } |
| 2624 case bitc::FUNC_CODE_INST_LOADATOMIC: { | 2627 case naclbitc::FUNC_CODE_INST_LOADATOMIC: { |
| 2625 // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] | 2628 // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] |
| 2626 unsigned OpNum = 0; | 2629 unsigned OpNum = 0; |
| 2627 Value *Op; | 2630 Value *Op; |
| 2628 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || | 2631 if (getValueTypePair(Record, OpNum, NextValueNo, Op) || |
| 2629 OpNum+4 != Record.size()) | 2632 OpNum+4 != Record.size()) |
| 2630 return Error("Invalid LOADATOMIC record"); | 2633 return Error("Invalid LOADATOMIC record"); |
| 2631 | 2634 |
| 2632 | 2635 |
| 2633 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); | 2636 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); |
| 2634 if (Ordering == NotAtomic || Ordering == Release || | 2637 if (Ordering == NotAtomic || Ordering == Release || |
| 2635 Ordering == AcquireRelease) | 2638 Ordering == AcquireRelease) |
| 2636 return Error("Invalid LOADATOMIC record"); | 2639 return Error("Invalid LOADATOMIC record"); |
| 2637 if (Ordering != NotAtomic && Record[OpNum] == 0) | 2640 if (Ordering != NotAtomic && Record[OpNum] == 0) |
| 2638 return Error("Invalid LOADATOMIC record"); | 2641 return Error("Invalid LOADATOMIC record"); |
| 2639 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); | 2642 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); |
| 2640 | 2643 |
| 2641 I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1, | 2644 I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1, |
| 2642 Ordering, SynchScope); | 2645 Ordering, SynchScope); |
| 2643 InstructionList.push_back(I); | 2646 InstructionList.push_back(I); |
| 2644 break; | 2647 break; |
| 2645 } | 2648 } |
| 2646 case bitc::FUNC_CODE_INST_STORE: { // STORE2:[ptrty, ptr, val, align, vol] | 2649 case naclbitc::FUNC_CODE_INST_STORE: { // STORE2:[ptrty, ptr, val, align, vo
l] |
| 2647 unsigned OpNum = 0; | 2650 unsigned OpNum = 0; |
| 2648 Value *Val, *Ptr; | 2651 Value *Val, *Ptr; |
| 2649 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || | 2652 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || |
| 2650 popValue(Record, OpNum, NextValueNo, | 2653 popValue(Record, OpNum, NextValueNo, |
| 2651 cast<PointerType>(Ptr->getType())->getElementType(), Val) || | 2654 cast<PointerType>(Ptr->getType())->getElementType(), Val) || |
| 2652 OpNum+2 != Record.size()) | 2655 OpNum+2 != Record.size()) |
| 2653 return Error("Invalid STORE record"); | 2656 return Error("Invalid STORE record"); |
| 2654 | 2657 |
| 2655 I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); | 2658 I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); |
| 2656 InstructionList.push_back(I); | 2659 InstructionList.push_back(I); |
| 2657 break; | 2660 break; |
| 2658 } | 2661 } |
| 2659 case bitc::FUNC_CODE_INST_STOREATOMIC: { | 2662 case naclbitc::FUNC_CODE_INST_STOREATOMIC: { |
| 2660 // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] | 2663 // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] |
| 2661 unsigned OpNum = 0; | 2664 unsigned OpNum = 0; |
| 2662 Value *Val, *Ptr; | 2665 Value *Val, *Ptr; |
| 2663 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || | 2666 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || |
| 2664 popValue(Record, OpNum, NextValueNo, | 2667 popValue(Record, OpNum, NextValueNo, |
| 2665 cast<PointerType>(Ptr->getType())->getElementType(), Val) || | 2668 cast<PointerType>(Ptr->getType())->getElementType(), Val) || |
| 2666 OpNum+4 != Record.size()) | 2669 OpNum+4 != Record.size()) |
| 2667 return Error("Invalid STOREATOMIC record"); | 2670 return Error("Invalid STOREATOMIC record"); |
| 2668 | 2671 |
| 2669 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); | 2672 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); |
| 2670 if (Ordering == NotAtomic || Ordering == Acquire || | 2673 if (Ordering == NotAtomic || Ordering == Acquire || |
| 2671 Ordering == AcquireRelease) | 2674 Ordering == AcquireRelease) |
| 2672 return Error("Invalid STOREATOMIC record"); | 2675 return Error("Invalid STOREATOMIC record"); |
| 2673 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); | 2676 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); |
| 2674 if (Ordering != NotAtomic && Record[OpNum] == 0) | 2677 if (Ordering != NotAtomic && Record[OpNum] == 0) |
| 2675 return Error("Invalid STOREATOMIC record"); | 2678 return Error("Invalid STOREATOMIC record"); |
| 2676 | 2679 |
| 2677 I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1, | 2680 I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1, |
| 2678 Ordering, SynchScope); | 2681 Ordering, SynchScope); |
| 2679 InstructionList.push_back(I); | 2682 InstructionList.push_back(I); |
| 2680 break; | 2683 break; |
| 2681 } | 2684 } |
| 2682 case bitc::FUNC_CODE_INST_CMPXCHG: { | 2685 case naclbitc::FUNC_CODE_INST_CMPXCHG: { |
| 2683 // CMPXCHG:[ptrty, ptr, cmp, new, vol, ordering, synchscope] | 2686 // CMPXCHG:[ptrty, ptr, cmp, new, vol, ordering, synchscope] |
| 2684 unsigned OpNum = 0; | 2687 unsigned OpNum = 0; |
| 2685 Value *Ptr, *Cmp, *New; | 2688 Value *Ptr, *Cmp, *New; |
| 2686 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || | 2689 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || |
| 2687 popValue(Record, OpNum, NextValueNo, | 2690 popValue(Record, OpNum, NextValueNo, |
| 2688 cast<PointerType>(Ptr->getType())->getElementType(), Cmp) || | 2691 cast<PointerType>(Ptr->getType())->getElementType(), Cmp) || |
| 2689 popValue(Record, OpNum, NextValueNo, | 2692 popValue(Record, OpNum, NextValueNo, |
| 2690 cast<PointerType>(Ptr->getType())->getElementType(), New) || | 2693 cast<PointerType>(Ptr->getType())->getElementType(), New) || |
| 2691 OpNum+3 != Record.size()) | 2694 OpNum+3 != Record.size()) |
| 2692 return Error("Invalid CMPXCHG record"); | 2695 return Error("Invalid CMPXCHG record"); |
| 2693 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+1]); | 2696 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+1]); |
| 2694 if (Ordering == NotAtomic || Ordering == Unordered) | 2697 if (Ordering == NotAtomic || Ordering == Unordered) |
| 2695 return Error("Invalid CMPXCHG record"); | 2698 return Error("Invalid CMPXCHG record"); |
| 2696 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); | 2699 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); |
| 2697 I = new AtomicCmpXchgInst(Ptr, Cmp, New, Ordering, SynchScope); | 2700 I = new AtomicCmpXchgInst(Ptr, Cmp, New, Ordering, SynchScope); |
| 2698 cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); | 2701 cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); |
| 2699 InstructionList.push_back(I); | 2702 InstructionList.push_back(I); |
| 2700 break; | 2703 break; |
| 2701 } | 2704 } |
| 2702 case bitc::FUNC_CODE_INST_ATOMICRMW: { | 2705 case naclbitc::FUNC_CODE_INST_ATOMICRMW: { |
| 2703 // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] | 2706 // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] |
| 2704 unsigned OpNum = 0; | 2707 unsigned OpNum = 0; |
| 2705 Value *Ptr, *Val; | 2708 Value *Ptr, *Val; |
| 2706 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || | 2709 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || |
| 2707 popValue(Record, OpNum, NextValueNo, | 2710 popValue(Record, OpNum, NextValueNo, |
| 2708 cast<PointerType>(Ptr->getType())->getElementType(), Val) || | 2711 cast<PointerType>(Ptr->getType())->getElementType(), Val) || |
| 2709 OpNum+4 != Record.size()) | 2712 OpNum+4 != Record.size()) |
| 2710 return Error("Invalid ATOMICRMW record"); | 2713 return Error("Invalid ATOMICRMW record"); |
| 2711 AtomicRMWInst::BinOp Operation = GetDecodedRMWOperation(Record[OpNum]); | 2714 AtomicRMWInst::BinOp Operation = GetDecodedRMWOperation(Record[OpNum]); |
| 2712 if (Operation < AtomicRMWInst::FIRST_BINOP || | 2715 if (Operation < AtomicRMWInst::FIRST_BINOP || |
| 2713 Operation > AtomicRMWInst::LAST_BINOP) | 2716 Operation > AtomicRMWInst::LAST_BINOP) |
| 2714 return Error("Invalid ATOMICRMW record"); | 2717 return Error("Invalid ATOMICRMW record"); |
| 2715 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); | 2718 AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); |
| 2716 if (Ordering == NotAtomic || Ordering == Unordered) | 2719 if (Ordering == NotAtomic || Ordering == Unordered) |
| 2717 return Error("Invalid ATOMICRMW record"); | 2720 return Error("Invalid ATOMICRMW record"); |
| 2718 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); | 2721 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); |
| 2719 I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); | 2722 I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); |
| 2720 cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); | 2723 cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); |
| 2721 InstructionList.push_back(I); | 2724 InstructionList.push_back(I); |
| 2722 break; | 2725 break; |
| 2723 } | 2726 } |
| 2724 case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] | 2727 case naclbitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] |
| 2725 if (2 != Record.size()) | 2728 if (2 != Record.size()) |
| 2726 return Error("Invalid FENCE record"); | 2729 return Error("Invalid FENCE record"); |
| 2727 AtomicOrdering Ordering = GetDecodedOrdering(Record[0]); | 2730 AtomicOrdering Ordering = GetDecodedOrdering(Record[0]); |
| 2728 if (Ordering == NotAtomic || Ordering == Unordered || | 2731 if (Ordering == NotAtomic || Ordering == Unordered || |
| 2729 Ordering == Monotonic) | 2732 Ordering == Monotonic) |
| 2730 return Error("Invalid FENCE record"); | 2733 return Error("Invalid FENCE record"); |
| 2731 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]); | 2734 SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]); |
| 2732 I = new FenceInst(Context, Ordering, SynchScope); | 2735 I = new FenceInst(Context, Ordering, SynchScope); |
| 2733 InstructionList.push_back(I); | 2736 InstructionList.push_back(I); |
| 2734 break; | 2737 break; |
| 2735 } | 2738 } |
| 2736 case bitc::FUNC_CODE_INST_CALL: { | 2739 case naclbitc::FUNC_CODE_INST_CALL: { |
| 2737 // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] | 2740 // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] |
| 2738 if (Record.size() < 3) | 2741 if (Record.size() < 3) |
| 2739 return Error("Invalid CALL record"); | 2742 return Error("Invalid CALL record"); |
| 2740 | 2743 |
| 2741 AttributeSet PAL = getAttributes(Record[0]); | 2744 AttributeSet PAL = getAttributes(Record[0]); |
| 2742 unsigned CCInfo = Record[1]; | 2745 unsigned CCInfo = Record[1]; |
| 2743 | 2746 |
| 2744 unsigned OpNum = 2; | 2747 unsigned OpNum = 2; |
| 2745 Value *Callee; | 2748 Value *Callee; |
| 2746 if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) | 2749 if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2777 } | 2780 } |
| 2778 | 2781 |
| 2779 I = CallInst::Create(Callee, Args); | 2782 I = CallInst::Create(Callee, Args); |
| 2780 InstructionList.push_back(I); | 2783 InstructionList.push_back(I); |
| 2781 cast<CallInst>(I)->setCallingConv( | 2784 cast<CallInst>(I)->setCallingConv( |
| 2782 static_cast<CallingConv::ID>(CCInfo>>1)); | 2785 static_cast<CallingConv::ID>(CCInfo>>1)); |
| 2783 cast<CallInst>(I)->setTailCall(CCInfo & 1); | 2786 cast<CallInst>(I)->setTailCall(CCInfo & 1); |
| 2784 cast<CallInst>(I)->setAttributes(PAL); | 2787 cast<CallInst>(I)->setAttributes(PAL); |
| 2785 break; | 2788 break; |
| 2786 } | 2789 } |
| 2787 case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] | 2790 case naclbitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] |
| 2788 if (Record.size() < 3) | 2791 if (Record.size() < 3) |
| 2789 return Error("Invalid VAARG record"); | 2792 return Error("Invalid VAARG record"); |
| 2790 Type *OpTy = getTypeByID(Record[0]); | 2793 Type *OpTy = getTypeByID(Record[0]); |
| 2791 Value *Op = getValue(Record, 1, NextValueNo, OpTy); | 2794 Value *Op = getValue(Record, 1, NextValueNo, OpTy); |
| 2792 Type *ResTy = getTypeByID(Record[2]); | 2795 Type *ResTy = getTypeByID(Record[2]); |
| 2793 if (!OpTy || !Op || !ResTy) | 2796 if (!OpTy || !Op || !ResTy) |
| 2794 return Error("Invalid VAARG record"); | 2797 return Error("Invalid VAARG record"); |
| 2795 I = new VAArgInst(Op, ResTy); | 2798 I = new VAArgInst(Op, ResTy); |
| 2796 InstructionList.push_back(I); | 2799 InstructionList.push_back(I); |
| 2797 break; | 2800 break; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2856 } | 2859 } |
| 2857 | 2860 |
| 2858 // Trim the value list down to the size it was before we parsed this function. | 2861 // Trim the value list down to the size it was before we parsed this function. |
| 2859 ValueList.shrinkTo(ModuleValueListSize); | 2862 ValueList.shrinkTo(ModuleValueListSize); |
| 2860 MDValueList.shrinkTo(ModuleMDValueListSize); | 2863 MDValueList.shrinkTo(ModuleMDValueListSize); |
| 2861 std::vector<BasicBlock*>().swap(FunctionBBs); | 2864 std::vector<BasicBlock*>().swap(FunctionBBs); |
| 2862 return false; | 2865 return false; |
| 2863 } | 2866 } |
| 2864 | 2867 |
| 2865 /// FindFunctionInStream - Find the function body in the bitcode stream | 2868 /// FindFunctionInStream - Find the function body in the bitcode stream |
| 2866 bool BitcodeReader::FindFunctionInStream(Function *F, | 2869 bool NaClBitcodeReader::FindFunctionInStream(Function *F, |
| 2867 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { | 2870 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { |
| 2868 while (DeferredFunctionInfoIterator->second == 0) { | 2871 while (DeferredFunctionInfoIterator->second == 0) { |
| 2869 if (Stream.AtEndOfStream()) | 2872 if (Stream.AtEndOfStream()) |
| 2870 return Error("Could not find Function in stream"); | 2873 return Error("Could not find Function in stream"); |
| 2871 // ParseModule will parse the next body in the stream and set its | 2874 // ParseModule will parse the next body in the stream and set its |
| 2872 // position in the DeferredFunctionInfo map. | 2875 // position in the DeferredFunctionInfo map. |
| 2873 if (ParseModule(true)) return true; | 2876 if (ParseModule(true)) return true; |
| 2874 } | 2877 } |
| 2875 return false; | 2878 return false; |
| 2876 } | 2879 } |
| 2877 | 2880 |
| 2878 //===----------------------------------------------------------------------===// | 2881 //===----------------------------------------------------------------------===// |
| 2879 // GVMaterializer implementation | 2882 // GVMaterializer implementation |
| 2880 //===----------------------------------------------------------------------===// | 2883 //===----------------------------------------------------------------------===// |
| 2881 | 2884 |
| 2882 | 2885 |
| 2883 bool BitcodeReader::isMaterializable(const GlobalValue *GV) const { | 2886 bool NaClBitcodeReader::isMaterializable(const GlobalValue *GV) const { |
| 2884 if (const Function *F = dyn_cast<Function>(GV)) { | 2887 if (const Function *F = dyn_cast<Function>(GV)) { |
| 2885 return F->isDeclaration() && | 2888 return F->isDeclaration() && |
| 2886 DeferredFunctionInfo.count(const_cast<Function*>(F)); | 2889 DeferredFunctionInfo.count(const_cast<Function*>(F)); |
| 2887 } | 2890 } |
| 2888 return false; | 2891 return false; |
| 2889 } | 2892 } |
| 2890 | 2893 |
| 2891 bool BitcodeReader::Materialize(GlobalValue *GV, std::string *ErrInfo) { | 2894 bool NaClBitcodeReader::Materialize(GlobalValue *GV, std::string *ErrInfo) { |
| 2892 Function *F = dyn_cast<Function>(GV); | 2895 Function *F = dyn_cast<Function>(GV); |
| 2893 // If it's not a function or is already material, ignore the request. | 2896 // If it's not a function or is already material, ignore the request. |
| 2894 if (!F || !F->isMaterializable()) return false; | 2897 if (!F || !F->isMaterializable()) return false; |
| 2895 | 2898 |
| 2896 DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); | 2899 DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); |
| 2897 assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); | 2900 assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); |
| 2898 // If its position is recorded as 0, its body is somewhere in the stream | 2901 // If its position is recorded as 0, its body is somewhere in the stream |
| 2899 // but we haven't seen it yet. | 2902 // but we haven't seen it yet. |
| 2900 if (DFII->second == 0) | 2903 if (DFII->second == 0) |
| 2901 if (LazyStreamer && FindFunctionInStream(F, DFII)) return true; | 2904 if (LazyStreamer && FindFunctionInStream(F, DFII)) return true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2916 UE = I->first->use_end(); UI != UE; ) { | 2919 UE = I->first->use_end(); UI != UE; ) { |
| 2917 if (CallInst* CI = dyn_cast<CallInst>(*UI++)) | 2920 if (CallInst* CI = dyn_cast<CallInst>(*UI++)) |
| 2918 UpgradeIntrinsicCall(CI, I->second); | 2921 UpgradeIntrinsicCall(CI, I->second); |
| 2919 } | 2922 } |
| 2920 } | 2923 } |
| 2921 } | 2924 } |
| 2922 | 2925 |
| 2923 return false; | 2926 return false; |
| 2924 } | 2927 } |
| 2925 | 2928 |
| 2926 bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { | 2929 bool NaClBitcodeReader::isDematerializable(const GlobalValue *GV) const { |
| 2927 const Function *F = dyn_cast<Function>(GV); | 2930 const Function *F = dyn_cast<Function>(GV); |
| 2928 if (!F || F->isDeclaration()) | 2931 if (!F || F->isDeclaration()) |
| 2929 return false; | 2932 return false; |
| 2930 // @LOCALMOD-START | 2933 // @LOCALMOD-START |
| 2931 // Don't dematerialize functions with BBs which have their address taken; | 2934 // Don't dematerialize functions with BBs which have their address taken; |
| 2932 // it will cause any referencing blockAddress constants to also be destroyed, | 2935 // it will cause any referencing blockAddress constants to also be destroyed, |
| 2933 // but because they are GVs, they need to stay around until PassManager | 2936 // but because they are GVs, they need to stay around until PassManager |
| 2934 // finalization. | 2937 // finalization. |
| 2935 for (Function::const_iterator BB = F->begin(); BB != F->end(); ++BB) { | 2938 for (Function::const_iterator BB = F->begin(); BB != F->end(); ++BB) { |
| 2936 if (BB->hasAddressTaken()) | 2939 if (BB->hasAddressTaken()) |
| 2937 return false; | 2940 return false; |
| 2938 } | 2941 } |
| 2939 // @LOCALMOD-END | 2942 // @LOCALMOD-END |
| 2940 return DeferredFunctionInfo.count(const_cast<Function*>(F)); | 2943 return DeferredFunctionInfo.count(const_cast<Function*>(F)); |
| 2941 } | 2944 } |
| 2942 | 2945 |
| 2943 void BitcodeReader::Dematerialize(GlobalValue *GV) { | 2946 void NaClBitcodeReader::Dematerialize(GlobalValue *GV) { |
| 2944 Function *F = dyn_cast<Function>(GV); | 2947 Function *F = dyn_cast<Function>(GV); |
| 2945 // If this function isn't dematerializable, this is a noop. | 2948 // If this function isn't dematerializable, this is a noop. |
| 2946 if (!F || !isDematerializable(F)) | 2949 if (!F || !isDematerializable(F)) |
| 2947 return; | 2950 return; |
| 2948 | 2951 |
| 2949 assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); | 2952 assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); |
| 2950 | 2953 |
| 2951 // Just forget the function body, we can remat it later. | 2954 // Just forget the function body, we can remat it later. |
| 2952 F->deleteBody(); | 2955 F->deleteBody(); |
| 2953 } | 2956 } |
| 2954 | 2957 |
| 2955 | 2958 |
| 2956 bool BitcodeReader::MaterializeModule(Module *M, std::string *ErrInfo) { | 2959 bool NaClBitcodeReader::MaterializeModule(Module *M, std::string *ErrInfo) { |
| 2957 assert(M == TheModule && | 2960 assert(M == TheModule && |
| 2958 "Can only Materialize the Module this BitcodeReader is attached to."); | 2961 "Can only Materialize the Module this NaClBitcodeReader is attached to.
"); |
| 2959 // Iterate over the module, deserializing any functions that are still on | 2962 // Iterate over the module, deserializing any functions that are still on |
| 2960 // disk. | 2963 // disk. |
| 2961 for (Module::iterator F = TheModule->begin(), E = TheModule->end(); | 2964 for (Module::iterator F = TheModule->begin(), E = TheModule->end(); |
| 2962 F != E; ++F) | 2965 F != E; ++F) |
| 2963 if (F->isMaterializable() && | 2966 if (F->isMaterializable() && |
| 2964 Materialize(F, ErrInfo)) | 2967 Materialize(F, ErrInfo)) |
| 2965 return true; | 2968 return true; |
| 2966 | 2969 |
| 2967 // At this point, if there are any function bodies, the current bit is | 2970 // At this point, if there are any function bodies, the current bit is |
| 2968 // pointing to the END_BLOCK record after them. Now make sure the rest | 2971 // pointing to the END_BLOCK record after them. Now make sure the rest |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2985 if (!I->first->use_empty()) | 2988 if (!I->first->use_empty()) |
| 2986 I->first->replaceAllUsesWith(I->second); | 2989 I->first->replaceAllUsesWith(I->second); |
| 2987 I->first->eraseFromParent(); | 2990 I->first->eraseFromParent(); |
| 2988 } | 2991 } |
| 2989 } | 2992 } |
| 2990 std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); | 2993 std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); |
| 2991 | 2994 |
| 2992 return false; | 2995 return false; |
| 2993 } | 2996 } |
| 2994 | 2997 |
| 2995 bool BitcodeReader::InitStream() { | 2998 bool NaClBitcodeReader::InitStream() { |
| 2996 if (LazyStreamer) return InitLazyStream(); | 2999 if (LazyStreamer) return InitLazyStream(); |
| 2997 return InitStreamFromBuffer(); | 3000 return InitStreamFromBuffer(); |
| 2998 } | 3001 } |
| 2999 | 3002 |
| 3000 bool BitcodeReader::InitStreamFromBuffer() { | 3003 bool NaClBitcodeReader::InitStreamFromBuffer() { |
| 3001 const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); | 3004 const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); |
| 3002 const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); | 3005 const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); |
| 3003 | 3006 |
| 3004 if (Buffer->getBufferSize() & 3) { | 3007 if (Buffer->getBufferSize() & 3) { |
| 3005 if (!isRawBitcode(BufPtr, BufEnd) && !isBitcodeWrapper(BufPtr, BufEnd)) | 3008 if (!isNaClRawBitcode(BufPtr, BufEnd) && |
| 3009 !isNaClBitcodeWrapper(BufPtr, BufEnd)) |
| 3006 return Error("Invalid bitcode signature"); | 3010 return Error("Invalid bitcode signature"); |
| 3007 else | 3011 else |
| 3008 return Error("Bitcode stream should be a multiple of 4 bytes in length"); | 3012 return Error("Bitcode stream should be a multiple of 4 bytes in length"); |
| 3009 } | 3013 } |
| 3010 | 3014 |
| 3011 // If we have a wrapper header, parse it and ignore the non-bc file contents. | 3015 // If we have a wrapper header, parse it and ignore the non-bc file contents. |
| 3012 // The magic number is 0x0B17C0DE stored in little endian. | 3016 // The magic number is 0x0B17C0DE stored in little endian. |
| 3013 if (isBitcodeWrapper(BufPtr, BufEnd)) | 3017 if (isNaClBitcodeWrapper(BufPtr, BufEnd)) |
| 3014 if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) | 3018 if (SkipNaClBitcodeWrapperHeader(BufPtr, BufEnd, true)) |
| 3015 return Error("Invalid bitcode wrapper header"); | 3019 return Error("Invalid bitcode wrapper header"); |
| 3016 | 3020 |
| 3017 StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); | 3021 StreamFile.reset(new NaClBitstreamReader(BufPtr, BufEnd)); |
| 3018 Stream.init(*StreamFile); | 3022 Stream.init(*StreamFile); |
| 3019 | 3023 |
| 3020 return false; | 3024 return false; |
| 3021 } | 3025 } |
| 3022 | 3026 |
| 3023 bool BitcodeReader::InitLazyStream() { | 3027 bool NaClBitcodeReader::InitLazyStream() { |
| 3024 // Check and strip off the bitcode wrapper; BitstreamReader expects never to | 3028 // Check and strip off the bitcode wrapper; NaClBitstreamReader expects |
| 3025 // see it. | 3029 // never to see it. |
| 3026 StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); | 3030 StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); |
| 3027 StreamFile.reset(new BitstreamReader(Bytes)); | 3031 StreamFile.reset(new NaClBitstreamReader(Bytes)); |
| 3028 Stream.init(*StreamFile); | 3032 Stream.init(*StreamFile); |
| 3029 | 3033 |
| 3030 unsigned char buf[16]; | 3034 unsigned char buf[16]; |
| 3031 if (Bytes->readBytes(0, 16, buf, NULL) == -1) | 3035 if (Bytes->readBytes(0, 16, buf, NULL) == -1) |
| 3032 return Error("Bitcode stream must be at least 16 bytes in length"); | 3036 return Error("Bitcode stream must be at least 16 bytes in length"); |
| 3033 | 3037 |
| 3034 if (!isBitcode(buf, buf + 16)) | 3038 if (!isNaClBitcode(buf, buf + 16)) |
| 3035 return Error("Invalid bitcode signature"); | 3039 return Error("Invalid bitcode signature"); |
| 3036 | 3040 |
| 3037 if (isBitcodeWrapper(buf, buf + 4)) { | 3041 if (isNaClBitcodeWrapper(buf, buf + 4)) { |
| 3038 const unsigned char *bitcodeStart = buf; | 3042 const unsigned char *bitcodeStart = buf; |
| 3039 const unsigned char *bitcodeEnd = buf + 16; | 3043 const unsigned char *bitcodeEnd = buf + 16; |
| 3040 SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); | 3044 SkipNaClBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); |
| 3041 Bytes->dropLeadingBytes(bitcodeStart - buf); | 3045 Bytes->dropLeadingBytes(bitcodeStart - buf); |
| 3042 Bytes->setKnownObjectSize(bitcodeEnd - bitcodeStart); | 3046 Bytes->setKnownObjectSize(bitcodeEnd - bitcodeStart); |
| 3043 } | 3047 } |
| 3044 return false; | 3048 return false; |
| 3045 } | 3049 } |
| 3046 | 3050 |
| 3047 //===----------------------------------------------------------------------===// | 3051 //===----------------------------------------------------------------------===// |
| 3048 // External interface | 3052 // External interface |
| 3049 //===----------------------------------------------------------------------===// | 3053 //===----------------------------------------------------------------------===// |
| 3050 | 3054 |
| 3051 /// getLazyBitcodeModule - lazy function-at-a-time loading from a file. | 3055 /// getNaClLazyBitcodeModule - lazy function-at-a-time loading from a file. |
| 3052 /// | 3056 /// |
| 3053 Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, | 3057 Module *llvm::getNaClLazyBitcodeModule(MemoryBuffer *Buffer, |
| 3054 LLVMContext& Context, | 3058 LLVMContext& Context, |
| 3055 std::string *ErrMsg) { | 3059 std::string *ErrMsg) { |
| 3056 Module *M = new Module(Buffer->getBufferIdentifier(), Context); | 3060 Module *M = new Module(Buffer->getBufferIdentifier(), Context); |
| 3057 BitcodeReader *R = new BitcodeReader(Buffer, Context); | 3061 NaClBitcodeReader *R = new NaClBitcodeReader(Buffer, Context); |
| 3058 M->setMaterializer(R); | 3062 M->setMaterializer(R); |
| 3059 if (R->ParseBitcodeInto(M)) { | 3063 if (R->ParseBitcodeInto(M)) { |
| 3060 if (ErrMsg) | 3064 if (ErrMsg) |
| 3061 *ErrMsg = R->getErrorString(); | 3065 *ErrMsg = R->getErrorString(); |
| 3062 | 3066 |
| 3063 delete M; // Also deletes R. | 3067 delete M; // Also deletes R. |
| 3064 return 0; | 3068 return 0; |
| 3065 } | 3069 } |
| 3066 // Have the BitcodeReader dtor delete 'Buffer'. | 3070 // Have the NaClBitcodeReader dtor delete 'Buffer'. |
| 3067 R->setBufferOwned(true); | 3071 R->setBufferOwned(true); |
| 3068 | 3072 |
| 3069 R->materializeForwardReferencedFunctions(); | 3073 R->materializeForwardReferencedFunctions(); |
| 3070 | 3074 |
| 3071 M->convertMetadataToLibraryList(); // @LOCALMOD | 3075 M->convertMetadataToLibraryList(); // @LOCALMOD |
| 3072 | 3076 |
| 3073 return M; | 3077 return M; |
| 3074 } | 3078 } |
| 3075 | 3079 |
| 3076 | 3080 |
| 3077 Module *llvm::getStreamedBitcodeModule(const std::string &name, | 3081 Module *llvm::getNaClStreamedBitcodeModule(const std::string &name, |
| 3078 DataStreamer *streamer, | 3082 DataStreamer *streamer, |
| 3079 LLVMContext &Context, | 3083 LLVMContext &Context, |
| 3080 std::string *ErrMsg) { | 3084 std::string *ErrMsg) { |
| 3081 Module *M = new Module(name, Context); | 3085 Module *M = new Module(name, Context); |
| 3082 BitcodeReader *R = new BitcodeReader(streamer, Context); | 3086 NaClBitcodeReader *R = new NaClBitcodeReader(streamer, Context); |
| 3083 M->setMaterializer(R); | 3087 M->setMaterializer(R); |
| 3084 if (R->ParseBitcodeInto(M)) { | 3088 if (R->ParseBitcodeInto(M)) { |
| 3085 if (ErrMsg) | 3089 if (ErrMsg) |
| 3086 *ErrMsg = R->getErrorString(); | 3090 *ErrMsg = R->getErrorString(); |
| 3087 delete M; // Also deletes R. | 3091 delete M; // Also deletes R. |
| 3088 return 0; | 3092 return 0; |
| 3089 } | 3093 } |
| 3090 R->setBufferOwned(false); // no buffer to delete | 3094 R->setBufferOwned(false); // no buffer to delete |
| 3091 | 3095 |
| 3092 R->materializeForwardReferencedFunctions(); | 3096 R->materializeForwardReferencedFunctions(); |
| 3093 | 3097 |
| 3094 M->convertMetadataToLibraryList(); // @LOCALMOD | 3098 M->convertMetadataToLibraryList(); // @LOCALMOD |
| 3095 | 3099 |
| 3096 return M; | 3100 return M; |
| 3097 } | 3101 } |
| 3098 | 3102 |
| 3099 /// ParseBitcodeFile - Read the specified bitcode file, returning the module. | 3103 /// NaClParseBitcodeFile - Read the specified bitcode file, returning the module
. |
| 3100 /// If an error occurs, return null and fill in *ErrMsg if non-null. | 3104 /// If an error occurs, return null and fill in *ErrMsg if non-null. |
| 3101 Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, | 3105 Module *llvm::NaClParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, |
| 3102 std::string *ErrMsg){ | 3106 std::string *ErrMsg){ |
| 3103 Module *M = getLazyBitcodeModule(Buffer, Context, ErrMsg); | 3107 Module *M = getNaClLazyBitcodeModule(Buffer, Context, ErrMsg); |
| 3104 if (!M) return 0; | 3108 if (!M) return 0; |
| 3105 | 3109 |
| 3106 // Don't let the BitcodeReader dtor delete 'Buffer', regardless of whether | 3110 // Don't let the NaClBitcodeReader dtor delete 'Buffer', regardless of whether |
| 3107 // there was an error. | 3111 // there was an error. |
| 3108 static_cast<BitcodeReader*>(M->getMaterializer())->setBufferOwned(false); | 3112 static_cast<NaClBitcodeReader*>(M->getMaterializer())->setBufferOwned(false); |
| 3109 | 3113 |
| 3110 // Read in the entire module, and destroy the BitcodeReader. | 3114 // Read in the entire module, and destroy the NaClBitcodeReader. |
| 3111 if (M->MaterializeAllPermanently(ErrMsg)) { | 3115 if (M->MaterializeAllPermanently(ErrMsg)) { |
| 3112 delete M; | 3116 delete M; |
| 3113 return 0; | 3117 return 0; |
| 3114 } | 3118 } |
| 3115 | 3119 |
| 3116 // TODO: Restore the use-lists to the in-memory state when the bitcode was | 3120 // TODO: Restore the use-lists to the in-memory state when the bitcode was |
| 3117 // written. We must defer until the Module has been fully materialized. | 3121 // written. We must defer until the Module has been fully materialized. |
| 3118 | 3122 |
| 3119 return M; | 3123 return M; |
| 3120 } | 3124 } |
| 3121 | |
| 3122 std::string llvm::getBitcodeTargetTriple(MemoryBuffer *Buffer, | |
| 3123 LLVMContext& Context, | |
| 3124 std::string *ErrMsg) { | |
| 3125 BitcodeReader *R = new BitcodeReader(Buffer, Context); | |
| 3126 // Don't let the BitcodeReader dtor delete 'Buffer'. | |
| 3127 R->setBufferOwned(false); | |
| 3128 | |
| 3129 std::string Triple(""); | |
| 3130 if (R->ParseTriple(Triple)) | |
| 3131 if (ErrMsg) | |
| 3132 *ErrMsg = R->getErrorString(); | |
| 3133 | |
| 3134 delete R; | |
| 3135 return Triple; | |
| 3136 } | |
| OLD | NEW |