diff options
Diffstat (limited to 'contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 571 | 
1 files changed, 350 insertions, 221 deletions
diff --git a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index bc995aec83ee..24c29941cf16 100644 --- a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -31,7 +31,7 @@ void BitcodeReader::FreeState() {    if (BufferOwned)      delete Buffer;    Buffer = 0; -  std::vector<PATypeHolder>().swap(TypeList); +  std::vector<Type*>().swap(TypeList);    ValueList.clear();    MDValueList.clear(); @@ -292,11 +292,9 @@ void BitcodeReaderValueList::ResolveConstantForwardRefs() {        // Make the new constant.        Constant *NewC;        if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { -        NewC = ConstantArray::get(UserCA->getType(), &NewOps[0], -                                        NewOps.size()); +        NewC = ConstantArray::get(UserCA->getType(), NewOps);        } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { -        NewC = ConstantStruct::get(Context, &NewOps[0], NewOps.size(), -                                         UserCS->getType()->isPacked()); +        NewC = ConstantStruct::get(UserCS->getType(), NewOps);        } else if (isa<ConstantVector>(UserC)) {          NewC = ConstantVector::get(NewOps);        } else { @@ -354,19 +352,28 @@ Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {    return V;  } -const Type *BitcodeReader::getTypeByID(unsigned ID, bool isTypeTable) { -  // If the TypeID is in range, return it. -  if (ID < TypeList.size()) -    return TypeList[ID].get(); -  if (!isTypeTable) return 0; - -  // The type table allows forward references.  Push as many Opaque types as -  // needed to get up to ID. -  while (TypeList.size() <= ID) -    TypeList.push_back(OpaqueType::get(Context)); -  return TypeList.back().get(); +Type *BitcodeReader::getTypeByID(unsigned ID) { +  // The type table size is always specified correctly. +  if (ID >= TypeList.size()) +    return 0; +   +  if (Type *Ty = TypeList[ID]) +    return Ty; + +  // If we have a forward reference, the only possible case is when it is to a +  // named struct.  Just create a placeholder for now. +  return TypeList[ID] = StructType::createNamed(Context, "");  } +/// FIXME: Remove in LLVM 3.1, only used by ParseOldTypeTable. +Type *BitcodeReader::getTypeByIDOrNull(unsigned ID) { +  if (ID >= TypeList.size()) +    TypeList.resize(ID+1); +   +  return TypeList[ID]; +} + +  //===----------------------------------------------------------------------===//  //  Functions for parsing blocks from the bitcode file  //===----------------------------------------------------------------------===// @@ -473,17 +480,22 @@ bool BitcodeReader::ParseAttributeBlock() {    }  } -  bool BitcodeReader::ParseTypeTable() { -  if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID)) +  if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW))      return Error("Malformed block record"); +   +  return ParseTypeTableBody(); +} +bool BitcodeReader::ParseTypeTableBody() {    if (!TypeList.empty())      return Error("Multiple TYPE_BLOCKs found!");    SmallVector<uint64_t, 64> Record;    unsigned NumRecords = 0; +  SmallString<64> TypeName; +      // Read all the records for this type table.    while (1) {      unsigned Code = Stream.ReadCode(); @@ -510,17 +522,15 @@ bool BitcodeReader::ParseTypeTable() {      // Read a record.      Record.clear(); -    const Type *ResultTy = 0; +    Type *ResultTy = 0;      switch (Stream.ReadRecord(Code, Record)) { -    default:  // Default behavior: unknown type. -      ResultTy = 0; -      break; +    default: return Error("unknown type in type table");      case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries]        // TYPE_CODE_NUMENTRY contains a count of the number of types in the        // type list.  This allows us to reserve space.        if (Record.size() < 1)          return Error("Invalid TYPE_CODE_NUMENTRY record"); -      TypeList.reserve(Record[0]); +      TypeList.resize(Record[0]);        continue;      case bitc::TYPE_CODE_VOID:      // VOID        ResultTy = Type::getVoidTy(Context); @@ -543,9 +553,6 @@ bool BitcodeReader::ParseTypeTable() {      case bitc::TYPE_CODE_LABEL:     // LABEL        ResultTy = Type::getLabelTy(Context);        break; -    case bitc::TYPE_CODE_OPAQUE:    // OPAQUE -      ResultTy = 0; -      break;      case bitc::TYPE_CODE_METADATA:  // METADATA        ResultTy = Type::getMetadataTy(Context);        break; @@ -565,8 +572,9 @@ bool BitcodeReader::ParseTypeTable() {        unsigned AddressSpace = 0;        if (Record.size() == 2)          AddressSpace = Record[1]; -      ResultTy = PointerType::get(getTypeByID(Record[0], true), -                                        AddressSpace); +      ResultTy = getTypeByID(Record[0]); +      if (ResultTy == 0) return Error("invalid element type in pointer type"); +      ResultTy = PointerType::get(ResultTy, AddressSpace);        break;      }      case bitc::TYPE_CODE_FUNCTION: { @@ -574,69 +582,306 @@ bool BitcodeReader::ParseTypeTable() {        // FUNCTION: [vararg, attrid, retty, paramty x N]        if (Record.size() < 3)          return Error("Invalid FUNCTION type record"); -      std::vector<const Type*> ArgTys; -      for (unsigned i = 3, e = Record.size(); i != e; ++i) -        ArgTys.push_back(getTypeByID(Record[i], true)); +      std::vector<Type*> ArgTys; +      for (unsigned i = 3, e = Record.size(); i != e; ++i) { +        if (Type *T = getTypeByID(Record[i])) +          ArgTys.push_back(T); +        else +          break; +      } +       +      ResultTy = getTypeByID(Record[2]); +      if (ResultTy == 0 || ArgTys.size() < Record.size()-3) +        return Error("invalid type in function type"); -      ResultTy = FunctionType::get(getTypeByID(Record[2], true), ArgTys, -                                   Record[0]); +      ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);        break;      } -    case bitc::TYPE_CODE_STRUCT: {  // STRUCT: [ispacked, eltty x N] +    case bitc::TYPE_CODE_STRUCT_ANON: {  // STRUCT: [ispacked, eltty x N]        if (Record.size() < 1)          return Error("Invalid STRUCT type record"); -      std::vector<const Type*> EltTys; -      for (unsigned i = 1, e = Record.size(); i != e; ++i) -        EltTys.push_back(getTypeByID(Record[i], true)); +      std::vector<Type*> EltTys; +      for (unsigned i = 1, e = Record.size(); i != e; ++i) { +        if (Type *T = getTypeByID(Record[i])) +          EltTys.push_back(T); +        else +          break; +      } +      if (EltTys.size() != Record.size()-1) +        return Error("invalid type in struct type");        ResultTy = StructType::get(Context, EltTys, Record[0]);        break;      } +    case bitc::TYPE_CODE_STRUCT_NAME:   // STRUCT_NAME: [strchr x N] +      if (ConvertToString(Record, 0, TypeName)) +        return Error("Invalid STRUCT_NAME record"); +      continue; + +    case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] +      if (Record.size() < 1) +        return Error("Invalid STRUCT type record"); +       +      if (NumRecords >= TypeList.size()) +        return Error("invalid TYPE table"); +       +      // Check to see if this was forward referenced, if so fill in the temp. +      StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); +      if (Res) { +        Res->setName(TypeName); +        TypeList[NumRecords] = 0; +      } else  // Otherwise, create a new struct. +        Res = StructType::createNamed(Context, TypeName); +      TypeName.clear(); +       +      SmallVector<Type*, 8> EltTys; +      for (unsigned i = 1, e = Record.size(); i != e; ++i) { +        if (Type *T = getTypeByID(Record[i])) +          EltTys.push_back(T); +        else +          break; +      } +      if (EltTys.size() != Record.size()-1) +        return Error("invalid STRUCT type record"); +      Res->setBody(EltTys, Record[0]); +      ResultTy = Res; +      break; +    } +    case bitc::TYPE_CODE_OPAQUE: {       // OPAQUE: [] +      if (Record.size() != 1) +        return Error("Invalid OPAQUE type record"); + +      if (NumRecords >= TypeList.size()) +        return Error("invalid TYPE table"); +       +      // Check to see if this was forward referenced, if so fill in the temp. +      StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); +      if (Res) { +        Res->setName(TypeName); +        TypeList[NumRecords] = 0; +      } else  // Otherwise, create a new struct with no body. +        Res = StructType::createNamed(Context, TypeName); +      TypeName.clear(); +      ResultTy = Res; +      break; +    }              case bitc::TYPE_CODE_ARRAY:     // ARRAY: [numelts, eltty]        if (Record.size() < 2)          return Error("Invalid ARRAY type record"); -      ResultTy = ArrayType::get(getTypeByID(Record[1], true), Record[0]); +      if ((ResultTy = getTypeByID(Record[1]))) +        ResultTy = ArrayType::get(ResultTy, Record[0]); +      else +        return Error("Invalid ARRAY type element");        break;      case bitc::TYPE_CODE_VECTOR:    // VECTOR: [numelts, eltty]        if (Record.size() < 2)          return Error("Invalid VECTOR type record"); -      ResultTy = VectorType::get(getTypeByID(Record[1], true), Record[0]); +      if ((ResultTy = getTypeByID(Record[1]))) +        ResultTy = VectorType::get(ResultTy, Record[0]); +      else +        return Error("Invalid ARRAY type element");        break;      } -    if (NumRecords == TypeList.size()) { -      // If this is a new type slot, just append it. -      TypeList.push_back(ResultTy ? ResultTy : OpaqueType::get(Context)); -      ++NumRecords; -    } else if (ResultTy == 0) { -      // Otherwise, this was forward referenced, so an opaque type was created, -      // but the result type is actually just an opaque.  Leave the one we -      // created previously. -      ++NumRecords; -    } else { -      // Otherwise, this was forward referenced, so an opaque type was created. -      // Resolve the opaque type to the real type now. -      assert(NumRecords < TypeList.size() && "Typelist imbalance"); -      const OpaqueType *OldTy = cast<OpaqueType>(TypeList[NumRecords++].get()); - -      // Don't directly push the new type on the Tab. Instead we want to replace -      // the opaque type we previously inserted with the new concrete value. The -      // refinement from the abstract (opaque) type to the new type causes all -      // uses of the abstract type to use the concrete type (NewTy). This will -      // also cause the opaque type to be deleted. -      const_cast<OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy); - -      // This should have replaced the old opaque type with the new type in the -      // value table... or with a preexisting type that was already in the -      // system.  Let's just make sure it did. -      assert(TypeList[NumRecords-1].get() != OldTy && -             "refineAbstractType didn't work!"); +    if (NumRecords >= TypeList.size()) +      return Error("invalid TYPE table"); +    assert(ResultTy && "Didn't read a type?"); +    assert(TypeList[NumRecords] == 0 && "Already read type?"); +    TypeList[NumRecords++] = ResultTy; +  } +} + +// FIXME: Remove in LLVM 3.1 +bool BitcodeReader::ParseOldTypeTable() { +  if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_OLD)) +    return Error("Malformed block record"); + +  if (!TypeList.empty()) +    return Error("Multiple TYPE_BLOCKs found!"); +   +   +  // While horrible, we have no good ordering of types in the bc file.  Just +  // iteratively parse types out of the bc file in multiple passes until we get +  // them all.  Do this by saving a cursor for the start of the type block. +  BitstreamCursor StartOfTypeBlockCursor(Stream); +   +  unsigned NumTypesRead = 0; +   +  SmallVector<uint64_t, 64> Record; +RestartScan: +  unsigned NextTypeID = 0; +  bool ReadAnyTypes = false; +   +  // Read all the records for this type table. +  while (1) { +    unsigned Code = Stream.ReadCode(); +    if (Code == bitc::END_BLOCK) { +      if (NextTypeID != TypeList.size()) +        return Error("Invalid type forward reference in TYPE_BLOCK_ID_OLD"); +       +      // If we haven't read all of the types yet, iterate again. +      if (NumTypesRead != TypeList.size()) { +        // If we didn't successfully read any types in this pass, then we must +        // have an unhandled forward reference. +        if (!ReadAnyTypes) +          return Error("Obsolete bitcode contains unhandled recursive type"); +         +        Stream = StartOfTypeBlockCursor; +        goto RestartScan; +      } +       +      if (Stream.ReadBlockEnd()) +        return Error("Error at end of type table block"); +      return false; +    } +     +    if (Code == bitc::ENTER_SUBBLOCK) { +      // No known subblocks, always skip them. +      Stream.ReadSubBlockID(); +      if (Stream.SkipBlock()) +        return Error("Malformed block record"); +      continue; +    } +     +    if (Code == bitc::DEFINE_ABBREV) { +      Stream.ReadAbbrevRecord(); +      continue;      } +     +    // Read a record. +    Record.clear(); +    Type *ResultTy = 0; +    switch (Stream.ReadRecord(Code, Record)) { +    default: return Error("unknown type in type table"); +    case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] +      // TYPE_CODE_NUMENTRY contains a count of the number of types in the +      // type list.  This allows us to reserve space. +      if (Record.size() < 1) +        return Error("Invalid TYPE_CODE_NUMENTRY record"); +      TypeList.resize(Record[0]); +      continue; +    case bitc::TYPE_CODE_VOID:      // VOID +      ResultTy = Type::getVoidTy(Context); +      break; +    case bitc::TYPE_CODE_FLOAT:     // FLOAT +      ResultTy = Type::getFloatTy(Context); +      break; +    case bitc::TYPE_CODE_DOUBLE:    // DOUBLE +      ResultTy = Type::getDoubleTy(Context); +      break; +    case bitc::TYPE_CODE_X86_FP80:  // X86_FP80 +      ResultTy = Type::getX86_FP80Ty(Context); +      break; +    case bitc::TYPE_CODE_FP128:     // FP128 +      ResultTy = Type::getFP128Ty(Context); +      break; +    case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 +      ResultTy = Type::getPPC_FP128Ty(Context); +      break; +    case bitc::TYPE_CODE_LABEL:     // LABEL +      ResultTy = Type::getLabelTy(Context); +      break; +    case bitc::TYPE_CODE_METADATA:  // METADATA +      ResultTy = Type::getMetadataTy(Context); +      break; +    case bitc::TYPE_CODE_X86_MMX:   // X86_MMX +      ResultTy = Type::getX86_MMXTy(Context); +      break; +    case bitc::TYPE_CODE_INTEGER:   // INTEGER: [width] +      if (Record.size() < 1) +        return Error("Invalid Integer type record"); +      ResultTy = IntegerType::get(Context, Record[0]); +      break; +    case bitc::TYPE_CODE_OPAQUE:    // OPAQUE +      if (NextTypeID < TypeList.size() && TypeList[NextTypeID] == 0) +        ResultTy = StructType::createNamed(Context, ""); +      break; +    case bitc::TYPE_CODE_STRUCT_OLD: {// STRUCT_OLD +      if (NextTypeID >= TypeList.size()) break; +      // If we already read it, don't reprocess. +      if (TypeList[NextTypeID] && +          !cast<StructType>(TypeList[NextTypeID])->isOpaque()) +        break; + +      // Set a type. +      if (TypeList[NextTypeID] == 0) +        TypeList[NextTypeID] = StructType::createNamed(Context, ""); + +      std::vector<Type*> EltTys; +      for (unsigned i = 1, e = Record.size(); i != e; ++i) { +        if (Type *Elt = getTypeByIDOrNull(Record[i])) +          EltTys.push_back(Elt); +        else +          break; +      } + +      if (EltTys.size() != Record.size()-1) +        break;      // Not all elements are ready. +       +      cast<StructType>(TypeList[NextTypeID])->setBody(EltTys, Record[0]); +      ResultTy = TypeList[NextTypeID]; +      TypeList[NextTypeID] = 0; +      break; +    } +    case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or +      //          [pointee type, address space] +      if (Record.size() < 1) +        return Error("Invalid POINTER type record"); +      unsigned AddressSpace = 0; +      if (Record.size() == 2) +        AddressSpace = Record[1]; +      if ((ResultTy = getTypeByIDOrNull(Record[0]))) +        ResultTy = PointerType::get(ResultTy, AddressSpace); +      break; +    } +    case bitc::TYPE_CODE_FUNCTION: { +      // FIXME: attrid is dead, remove it in LLVM 3.0 +      // FUNCTION: [vararg, attrid, retty, paramty x N] +      if (Record.size() < 3) +        return Error("Invalid FUNCTION type record"); +      std::vector<Type*> ArgTys; +      for (unsigned i = 3, e = Record.size(); i != e; ++i) { +        if (Type *Elt = getTypeByIDOrNull(Record[i])) +          ArgTys.push_back(Elt); +        else +          break; +      } +      if (ArgTys.size()+3 != Record.size()) +        break;  // Something was null. +      if ((ResultTy = getTypeByIDOrNull(Record[2]))) +        ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); +      break; +    } +    case bitc::TYPE_CODE_ARRAY:     // ARRAY: [numelts, eltty] +      if (Record.size() < 2) +        return Error("Invalid ARRAY type record"); +      if ((ResultTy = getTypeByIDOrNull(Record[1]))) +        ResultTy = ArrayType::get(ResultTy, Record[0]); +      break; +    case bitc::TYPE_CODE_VECTOR:    // VECTOR: [numelts, eltty] +      if (Record.size() < 2) +        return Error("Invalid VECTOR type record"); +      if ((ResultTy = getTypeByIDOrNull(Record[1]))) +        ResultTy = VectorType::get(ResultTy, Record[0]); +      break; +    } +     +    if (NextTypeID >= TypeList.size()) +      return Error("invalid TYPE table"); +     +    if (ResultTy && TypeList[NextTypeID] == 0) { +      ++NumTypesRead; +      ReadAnyTypes = true; +       +      TypeList[NextTypeID] = ResultTy; +    } +     +    ++NextTypeID;    }  } -bool BitcodeReader::ParseTypeSymbolTable() { -  if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID)) +bool BitcodeReader::ParseOldTypeSymbolTable() { +  if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID_OLD))      return Error("Malformed block record");    SmallVector<uint64_t, 64> Record; @@ -676,7 +921,10 @@ bool BitcodeReader::ParseTypeSymbolTable() {        if (TypeID >= TypeList.size())          return Error("Invalid Type ID in TST_ENTRY record"); -      TheModule->addTypeName(TypeName, TypeList[TypeID].get()); +      // Only apply the type name to a struct type with no name. +      if (StructType *STy = dyn_cast<StructType>(TypeList[TypeID])) +        if (!STy->isAnonymous() && !STy->hasName()) +          STy->setName(TypeName);        TypeName.clear();        break;      } @@ -790,13 +1038,9 @@ bool BitcodeReader::ParseMetadata() {        Record.clear();        Code = Stream.ReadCode(); -      // METADATA_NAME is always followed by METADATA_NAMED_NODE2. -      // Or METADATA_NAMED_NODE in LLVM 2.7. FIXME: Remove this in LLVM 3.0. +      // METADATA_NAME is always followed by METADATA_NAMED_NODE.        unsigned NextBitCode = Stream.ReadRecord(Code, Record); -      if (NextBitCode == bitc::METADATA_NAMED_NODE) { -        LLVM2_7MetadataDetected = true; -      } else if (NextBitCode != bitc::METADATA_NAMED_NODE2) -        assert ( 0 && "Invalid Named Metadata record"); +      assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode;        // Read named metadata elements.        unsigned Size = Record.size(); @@ -807,35 +1051,20 @@ bool BitcodeReader::ParseMetadata() {            return Error("Malformed metadata record");          NMD->addOperand(MD);        } -      // Backwards compatibility hack: NamedMDValues used to be Values, -      // and they got their own slots in the value numbering. They are no -      // longer Values, however we still need to account for them in the -      // numbering in order to be able to read old bitcode files. -      // FIXME: Remove this in LLVM 3.0. -      if (LLVM2_7MetadataDetected) -        MDValueList.AssignValue(0, NextMDValueNo++);        break;      } -    case bitc::METADATA_FN_NODE: // FIXME: Remove in LLVM 3.0. -    case bitc::METADATA_FN_NODE2: +    case bitc::METADATA_FN_NODE:        IsFunctionLocal = true;        // fall-through -    case bitc::METADATA_NODE:    // FIXME: Remove in LLVM 3.0. -    case bitc::METADATA_NODE2: { - -      // Detect 2.7-era metadata. -      // FIXME: Remove in LLVM 3.0. -      if (Code == bitc::METADATA_FN_NODE || Code == bitc::METADATA_NODE) -        LLVM2_7MetadataDetected = true; - +    case bitc::METADATA_NODE: {        if (Record.size() % 2 == 1) -        return Error("Invalid METADATA_NODE2 record"); +        return Error("Invalid METADATA_NODE record");        unsigned Size = Record.size();        SmallVector<Value*, 8> Elts;        for (unsigned i = 0; i != Size; i += 2) {          const Type *Ty = getTypeByID(Record[i]); -        if (!Ty) return Error("Invalid METADATA_NODE2 record"); +        if (!Ty) return Error("Invalid METADATA_NODE record");          if (Ty->isMetadataTy())            Elts.push_back(MDValueList.getValueFwdRef(Record[i+1]));          else if (!Ty->isVoidTy()) @@ -1331,12 +1560,16 @@ bool BitcodeReader::ParseModule() {          if (ParseAttributeBlock())            return true;          break; -      case bitc::TYPE_BLOCK_ID: +      case bitc::TYPE_BLOCK_ID_NEW:          if (ParseTypeTable())            return true;          break; -      case bitc::TYPE_SYMTAB_BLOCK_ID: -        if (ParseTypeSymbolTable()) +      case bitc::TYPE_BLOCK_ID_OLD: +        if (ParseOldTypeTable()) +          return true; +        break; +      case bitc::TYPE_SYMTAB_BLOCK_ID_OLD: +        if (ParseOldTypeSymbolTable())            return true;          break;        case bitc::VALUE_SYMTAB_BLOCK_ID: @@ -1755,10 +1988,7 @@ bool BitcodeReader::ParseMetadataAttachment() {      switch (Stream.ReadRecord(Code, Record)) {      default:  // Default behavior: ignore.        break; -    // FIXME: Remove in LLVM 3.0. -    case bitc::METADATA_ATTACHMENT: -      LLVM2_7MetadataDetected = true; -    case bitc::METADATA_ATTACHMENT2: { +    case bitc::METADATA_ATTACHMENT: {        unsigned RecordLength = Record.size();        if (Record.empty() || (RecordLength - 1) % 2 == 1)          return Error ("Invalid METADATA_ATTACHMENT reader!"); @@ -1870,10 +2100,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        I = 0;        continue; -    // FIXME: Remove this in LLVM 3.0. -    case bitc::FUNC_CODE_DEBUG_LOC: -      LLVM2_7MetadataDetected = true; -    case bitc::FUNC_CODE_DEBUG_LOC2: {      // DEBUG_LOC: [line, col, scope, ia] +    case bitc::FUNC_CODE_DEBUG_LOC: {      // DEBUG_LOC: [line, col, scope, ia]        I = 0;     // Get the last instruction emitted.        if (CurBB && !CurBB->empty())          I = &CurBB->back(); @@ -1979,8 +2206,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          EXTRACTVALIdx.push_back((unsigned)Index);        } -      I = ExtractValueInst::Create(Agg, -                                   EXTRACTVALIdx.begin(), EXTRACTVALIdx.end()); +      I = ExtractValueInst::Create(Agg, EXTRACTVALIdx);        InstructionList.push_back(I);        break;      } @@ -2004,8 +2230,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          INSERTVALIdx.push_back((unsigned)Index);        } -      I = InsertValueInst::Create(Agg, Val, -                                  INSERTVALIdx.begin(), INSERTVALIdx.end()); +      I = InsertValueInst::Create(Agg, Val, INSERTVALIdx);        InstructionList.push_back(I);        break;      } @@ -2112,18 +2337,6 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        break;      } -    case bitc::FUNC_CODE_INST_GETRESULT: { // GETRESULT: [ty, val, n] -      if (Record.size() != 2) -        return Error("Invalid GETRESULT record"); -      unsigned OpNum = 0; -      Value *Op; -      getValueTypePair(Record, OpNum, NextValueNo, Op); -      unsigned Index = Record[1]; -      I = ExtractValueInst::Create(Op, Index); -      InstructionList.push_back(I); -      break; -    } -      case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>]        {          unsigned Size = Record.size(); @@ -2134,33 +2347,13 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          }          unsigned OpNum = 0; -        SmallVector<Value *,4> Vs; -        do { -          Value *Op = NULL; -          if (getValueTypePair(Record, OpNum, NextValueNo, Op)) -            return Error("Invalid RET record"); -          Vs.push_back(Op); -        } while(OpNum != Record.size()); - -        const Type *ReturnType = F->getReturnType(); -        // Handle multiple return values. FIXME: Remove in LLVM 3.0. -        if (Vs.size() > 1 || -            (ReturnType->isStructTy() && -             (Vs.empty() || Vs[0]->getType() != ReturnType))) { -          Value *RV = UndefValue::get(ReturnType); -          for (unsigned i = 0, e = Vs.size(); i != e; ++i) { -            I = InsertValueInst::Create(RV, Vs[i], i, "mrv"); -            InstructionList.push_back(I); -            CurBB->getInstList().push_back(I); -            ValueList.AssignValue(I, NextValueNo++); -            RV = I; -          } -          I = ReturnInst::Create(Context, RV); -          InstructionList.push_back(I); -          break; -        } +        Value *Op = NULL; +        if (getValueTypePair(Record, OpNum, NextValueNo, Op)) +          return Error("Invalid RET record"); +        if (OpNum != Record.size()) +          return Error("Invalid RET record"); -        I = ReturnInst::Create(Context, Vs[0]); +        I = ReturnInst::Create(Context, Op);          InstructionList.push_back(I);          break;        } @@ -2272,8 +2465,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          }        } -      I = InvokeInst::Create(Callee, NormalBB, UnwindBB, -                             Ops.begin(), Ops.end()); +      I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops);        InstructionList.push_back(I);        cast<InvokeInst>(I)->setCallingConv(          static_cast<CallingConv::ID>(CCInfo)); @@ -2307,47 +2499,14 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        break;      } -    case bitc::FUNC_CODE_INST_MALLOC: { // MALLOC: [instty, op, align] -      // Autoupgrade malloc instruction to malloc call. -      // FIXME: Remove in LLVM 3.0. -      if (Record.size() < 3) -        return Error("Invalid MALLOC record"); -      const PointerType *Ty = -        dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); -      Value *Size = getFnValueByID(Record[1], Type::getInt32Ty(Context)); -      if (!Ty || !Size) return Error("Invalid MALLOC record"); -      if (!CurBB) return Error("Invalid malloc instruction with no BB"); -      const Type *Int32Ty = IntegerType::getInt32Ty(CurBB->getContext()); -      Constant *AllocSize = ConstantExpr::getSizeOf(Ty->getElementType()); -      AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, Int32Ty); -      I = CallInst::CreateMalloc(CurBB, Int32Ty, Ty->getElementType(), -                                 AllocSize, Size, NULL); -      InstructionList.push_back(I); -      break; -    } -    case bitc::FUNC_CODE_INST_FREE: { // FREE: [op, opty] -      unsigned OpNum = 0; -      Value *Op; -      if (getValueTypePair(Record, OpNum, NextValueNo, Op) || -          OpNum != Record.size()) -        return Error("Invalid FREE record"); -      if (!CurBB) return Error("Invalid free instruction with no BB"); -      I = CallInst::CreateFree(Op, CurBB); -      InstructionList.push_back(I); -      break; -    }      case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] -      // For backward compatibility, tolerate a lack of an opty, and use i32. -      // Remove this in LLVM 3.0. -      if (Record.size() < 3 || Record.size() > 4) +      if (Record.size() != 4)          return Error("Invalid ALLOCA record"); -      unsigned OpNum = 0;        const PointerType *Ty = -        dyn_cast_or_null<PointerType>(getTypeByID(Record[OpNum++])); -      const Type *OpTy = Record.size() == 4 ? getTypeByID(Record[OpNum++]) : -                                              Type::getInt32Ty(Context); -      Value *Size = getFnValueByID(Record[OpNum++], OpTy); -      unsigned Align = Record[OpNum++]; +        dyn_cast_or_null<PointerType>(getTypeByID(Record[0])); +      const Type *OpTy = getTypeByID(Record[1]); +      Value *Size = getFnValueByID(Record[2], OpTy); +      unsigned Align = Record[3];        if (!Ty || !Size) return Error("Invalid ALLOCA record");        I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1);        InstructionList.push_back(I); @@ -2364,7 +2523,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        InstructionList.push_back(I);        break;      } -    case bitc::FUNC_CODE_INST_STORE2: { // STORE2:[ptrty, ptr, val, align, vol] +    case bitc::FUNC_CODE_INST_STORE: { // STORE2:[ptrty, ptr, val, align, vol]        unsigned OpNum = 0;        Value *Val, *Ptr;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || @@ -2377,24 +2536,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        InstructionList.push_back(I);        break;      } -    case bitc::FUNC_CODE_INST_STORE: { // STORE:[val, valty, ptr, align, vol] -      // FIXME: Legacy form of store instruction. Should be removed in LLVM 3.0. -      unsigned OpNum = 0; -      Value *Val, *Ptr; -      if (getValueTypePair(Record, OpNum, NextValueNo, Val) || -          getValue(Record, OpNum, -                   PointerType::getUnqual(Val->getType()), Ptr)|| -          OpNum+2 != Record.size()) -        return Error("Invalid STORE record"); - -      I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1); -      InstructionList.push_back(I); -      break; -    } -    // FIXME: Remove this in LLVM 3.0. -    case bitc::FUNC_CODE_INST_CALL: -      LLVM2_7MetadataDetected = true; -    case bitc::FUNC_CODE_INST_CALL2: { +    case bitc::FUNC_CODE_INST_CALL: {        // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...]        if (Record.size() < 3)          return Error("Invalid CALL record"); @@ -2416,7 +2558,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        SmallVector<Value*, 16> Args;        // Read the fixed params.        for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { -        if (FTy->getParamType(i)->getTypeID()==Type::LabelTyID) +        if (FTy->getParamType(i)->isLabelTy())            Args.push_back(getBasicBlock(Record[OpNum]));          else            Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i))); @@ -2436,7 +2578,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          }        } -      I = CallInst::Create(Callee, Args.begin(), Args.end()); +      I = CallInst::Create(Callee, Args);        InstructionList.push_back(I);        cast<CallInst>(I)->setCallingConv(          static_cast<CallingConv::ID>(CCInfo>>1)); @@ -2513,23 +2655,10 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      BlockAddrFwdRefs.erase(BAFRI);    } -  // FIXME: Remove this in LLVM 3.0. -  unsigned NewMDValueListSize = MDValueList.size(); -    // Trim the value list down to the size it was before we parsed this function.    ValueList.shrinkTo(ModuleValueListSize);    MDValueList.shrinkTo(ModuleMDValueListSize); - -  // Backwards compatibility hack: Function-local metadata numbers -  // were previously not reset between functions. This is now fixed, -  // however we still need to understand the old numbering in order -  // to be able to read old bitcode files. -  // FIXME: Remove this in LLVM 3.0. -  if (LLVM2_7MetadataDetected) -    MDValueList.resize(NewMDValueListSize); -    std::vector<BasicBlock*>().swap(FunctionBBs); -    return false;  }  | 
