| 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 |