diff options
Diffstat (limited to 'contrib/llvm/lib/Bitcode')
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Reader/BitReader.cpp | 23 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 586 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h | 116 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Reader/BitstreamReader.cpp | 6 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Writer/BitWriter.cpp | 3 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 207 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp | 16 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp | 80 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h | 9 | ||||
| -rw-r--r-- | contrib/llvm/lib/Bitcode/module.modulemap | 1 | 
10 files changed, 625 insertions, 422 deletions
| diff --git a/contrib/llvm/lib/Bitcode/Reader/BitReader.cpp b/contrib/llvm/lib/Bitcode/Reader/BitReader.cpp index 23630e552541..b5886c16fa44 100644 --- a/contrib/llvm/lib/Bitcode/Reader/BitReader.cpp +++ b/contrib/llvm/lib/Bitcode/Reader/BitReader.cpp @@ -30,16 +30,16 @@ LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,                                     LLVMMemoryBufferRef MemBuf,                                     LLVMModuleRef *OutModule,                                     char **OutMessage) { -  std::string Message; - -  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), -                                     &Message)); -  if (!*OutModule) { +  ErrorOr<Module *> ModuleOrErr = +      parseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef)); +  if (std::error_code EC = ModuleOrErr.getError()) {      if (OutMessage) -      *OutMessage = strdup(Message.c_str()); +      *OutMessage = strdup(EC.message().c_str()); +    *OutModule = wrap((Module*)nullptr);      return 1;    } +  *OutModule = wrap(ModuleOrErr.get());    return 0;  } @@ -51,15 +51,18 @@ LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,                                         LLVMModuleRef *OutM,                                         char **OutMessage) {    std::string Message; +  ErrorOr<Module *> ModuleOrErr = +      getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef)); -  *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), -                                    &Message)); -  if (!*OutM) { +  if (std::error_code EC = ModuleOrErr.getError()) { +    *OutM = wrap((Module *)nullptr);      if (OutMessage) -      *OutMessage = strdup(Message.c_str()); +      *OutMessage = strdup(EC.message().c_str());      return 1;    } +  *OutM = wrap(ModuleOrErr.get()); +    return 0;  } diff --git a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index ce3b7d163e51..47a39539e20f 100644 --- a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -11,8 +11,8 @@  #include "BitcodeReader.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/SmallVector.h" -#include "llvm/AutoUpgrade.h"  #include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/IR/AutoUpgrade.h"  #include "llvm/IR/Constants.h"  #include "llvm/IR/DerivedTypes.h"  #include "llvm/IR/InlineAsm.h" @@ -39,12 +39,11 @@ void BitcodeReader::materializeForwardReferencedFunctions() {  }  void BitcodeReader::FreeState() { -  if (BufferOwned) -    delete Buffer; -  Buffer = 0; +  Buffer = nullptr;    std::vector<Type*>().swap(TypeList);    ValueList.clear();    MDValueList.clear(); +  std::vector<Comdat *>().swap(ComdatList);    std::vector<AttributeSet>().swap(MAttributes);    std::vector<BasicBlock*>().swap(FunctionBBs); @@ -80,16 +79,18 @@ static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {    case 2:  return GlobalValue::AppendingLinkage;    case 3:  return GlobalValue::InternalLinkage;    case 4:  return GlobalValue::LinkOnceAnyLinkage; -  case 5:  return GlobalValue::DLLImportLinkage; -  case 6:  return GlobalValue::DLLExportLinkage; +  case 5:  return GlobalValue::ExternalLinkage; // Obsolete DLLImportLinkage +  case 6:  return GlobalValue::ExternalLinkage; // Obsolete DLLExportLinkage    case 7:  return GlobalValue::ExternalWeakLinkage;    case 8:  return GlobalValue::CommonLinkage;    case 9:  return GlobalValue::PrivateLinkage;    case 10: return GlobalValue::WeakODRLinkage;    case 11: return GlobalValue::LinkOnceODRLinkage;    case 12: return GlobalValue::AvailableExternallyLinkage; -  case 13: return GlobalValue::LinkerPrivateLinkage; -  case 14: return GlobalValue::LinkerPrivateWeakLinkage; +  case 13: +    return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateLinkage +  case 14: +    return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateWeakLinkage    }  } @@ -102,6 +103,16 @@ static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) {    }  } +static GlobalValue::DLLStorageClassTypes +GetDecodedDLLStorageClass(unsigned Val) { +  switch (Val) { +  default: // Map unknown values to default. +  case 0: return GlobalValue::DefaultStorageClass; +  case 1: return GlobalValue::DLLImportStorageClass; +  case 2: return GlobalValue::DLLExportStorageClass; +  } +} +  static GlobalVariable::ThreadLocalMode GetDecodedThreadLocalMode(unsigned Val) {    switch (Val) {      case 0: return GlobalVariable::NotThreadLocal; @@ -193,6 +204,29 @@ static SynchronizationScope GetDecodedSynchScope(unsigned Val) {    }  } +static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) { +  switch (Val) { +  default: // Map unknown selection kinds to any. +  case bitc::COMDAT_SELECTION_KIND_ANY: +    return Comdat::Any; +  case bitc::COMDAT_SELECTION_KIND_EXACT_MATCH: +    return Comdat::ExactMatch; +  case bitc::COMDAT_SELECTION_KIND_LARGEST: +    return Comdat::Largest; +  case bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES: +    return Comdat::NoDuplicates; +  case bitc::COMDAT_SELECTION_KIND_SAME_SIZE: +    return Comdat::SameSize; +  } +} + +static void UpgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) { +  switch (Val) { +  case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; +  case 6: GV->setDLLStorageClass(GlobalValue::DLLExportStorageClass); break; +  } +} +  namespace llvm {  namespace {    /// @brief A class for maintaining the slot number definition @@ -239,7 +273,7 @@ void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) {      resize(Idx+1);    WeakVH &OldV = ValuePtrs[Idx]; -  if (OldV == 0) { +  if (!OldV) {      OldV = V;      return;    } @@ -279,12 +313,12 @@ Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) {      resize(Idx + 1);    if (Value *V = ValuePtrs[Idx]) { -    assert((Ty == 0 || Ty == V->getType()) && "Type mismatch in value table!"); +    assert((!Ty || Ty == V->getType()) && "Type mismatch in value table!");      return V;    }    // No type specified, must be invalid reference. -  if (Ty == 0) return 0; +  if (!Ty) return nullptr;    // Create and return a placeholder, which will later be RAUW'd.    Value *V = new Argument(Ty); @@ -315,7 +349,7 @@ void BitcodeReaderValueList::ResolveConstantForwardRefs() {      // new value.  If they reference more than one placeholder, update them all      // at once.      while (!Placeholder->use_empty()) { -      Value::use_iterator UI = Placeholder->use_begin(); +      auto UI = Placeholder->user_begin();        User *U = *UI;        // If the using object isn't uniqued, just update the operands.  This @@ -384,7 +418,7 @@ void BitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) {      resize(Idx+1);    WeakVH &OldV = MDValuePtrs[Idx]; -  if (OldV == 0) { +  if (!OldV) {      OldV = V;      return;    } @@ -416,7 +450,7 @@ Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {  Type *BitcodeReader::getTypeByID(unsigned ID) {    // The type table size is always specified correctly.    if (ID >= TypeList.size()) -    return 0; +    return nullptr;    if (Type *Ty = TypeList[ID])      return Ty; @@ -451,7 +485,7 @@ static void decodeLLVMAttributesForBitcode(AttrBuilder &B,                  (EncodedAttrs & 0xffff));  } -error_code BitcodeReader::ParseAttributeBlock() { +std::error_code BitcodeReader::ParseAttributeBlock() {    if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID))      return Error(InvalidRecord); @@ -471,7 +505,7 @@ error_code BitcodeReader::ParseAttributeBlock() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -522,12 +556,16 @@ static Attribute::AttrKind GetAttrFromCode(uint64_t Code) {      return Attribute::Builtin;    case bitc::ATTR_KIND_BY_VAL:      return Attribute::ByVal; +  case bitc::ATTR_KIND_IN_ALLOCA: +    return Attribute::InAlloca;    case bitc::ATTR_KIND_COLD:      return Attribute::Cold;    case bitc::ATTR_KIND_INLINE_HINT:      return Attribute::InlineHint;    case bitc::ATTR_KIND_IN_REG:      return Attribute::InReg; +  case bitc::ATTR_KIND_JUMP_TABLE: +    return Attribute::JumpTable;    case bitc::ATTR_KIND_MIN_SIZE:      return Attribute::MinSize;    case bitc::ATTR_KIND_NAKED: @@ -548,6 +586,10 @@ static Attribute::AttrKind GetAttrFromCode(uint64_t Code) {      return Attribute::NoInline;    case bitc::ATTR_KIND_NON_LAZY_BIND:      return Attribute::NonLazyBind; +  case bitc::ATTR_KIND_NON_NULL: +    return Attribute::NonNull; +  case bitc::ATTR_KIND_DEREFERENCEABLE: +    return Attribute::Dereferenceable;    case bitc::ATTR_KIND_NO_RED_ZONE:      return Attribute::NoRedZone;    case bitc::ATTR_KIND_NO_RETURN: @@ -591,15 +633,15 @@ static Attribute::AttrKind GetAttrFromCode(uint64_t Code) {    }  } -error_code BitcodeReader::ParseAttrKind(uint64_t Code, -                                        Attribute::AttrKind *Kind) { +std::error_code BitcodeReader::ParseAttrKind(uint64_t Code, +                                             Attribute::AttrKind *Kind) {    *Kind = GetAttrFromCode(Code);    if (*Kind == Attribute::None)      return Error(InvalidValue); -  return error_code::success(); +  return std::error_code();  } -error_code BitcodeReader::ParseAttributeGroupBlock() { +std::error_code BitcodeReader::ParseAttributeGroupBlock() {    if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID))      return Error(InvalidRecord); @@ -617,7 +659,7 @@ error_code BitcodeReader::ParseAttributeGroupBlock() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -639,18 +681,20 @@ error_code BitcodeReader::ParseAttributeGroupBlock() {        for (unsigned i = 2, e = Record.size(); i != e; ++i) {          if (Record[i] == 0) {        // Enum attribute            Attribute::AttrKind Kind; -          if (error_code EC = ParseAttrKind(Record[++i], &Kind)) +          if (std::error_code EC = ParseAttrKind(Record[++i], &Kind))              return EC;            B.addAttribute(Kind); -        } else if (Record[i] == 1) { // Align attribute +        } else if (Record[i] == 1) { // Integer attribute            Attribute::AttrKind Kind; -          if (error_code EC = ParseAttrKind(Record[++i], &Kind)) +          if (std::error_code EC = ParseAttrKind(Record[++i], &Kind))              return EC;            if (Kind == Attribute::Alignment)              B.addAlignmentAttr(Record[++i]); -          else +          else if (Kind == Attribute::StackAlignment)              B.addStackAlignmentAttr(Record[++i]); +          else if (Kind == Attribute::Dereferenceable) +            B.addDereferenceableAttr(Record[++i]);          } else {                     // String attribute            assert((Record[i] == 3 || Record[i] == 4) &&                   "Invalid attribute group entry"); @@ -681,14 +725,14 @@ error_code BitcodeReader::ParseAttributeGroupBlock() {    }  } -error_code BitcodeReader::ParseTypeTable() { +std::error_code BitcodeReader::ParseTypeTable() {    if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW))      return Error(InvalidRecord);    return ParseTypeTableBody();  } -error_code BitcodeReader::ParseTypeTableBody() { +std::error_code BitcodeReader::ParseTypeTableBody() {    if (!TypeList.empty())      return Error(InvalidMultipleBlocks); @@ -708,7 +752,7 @@ error_code BitcodeReader::ParseTypeTableBody() {      case BitstreamEntry::EndBlock:        if (NumRecords != TypeList.size())          return Error(MalformedBlock); -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -716,7 +760,7 @@ error_code BitcodeReader::ParseTypeTableBody() {      // Read a record.      Record.clear(); -    Type *ResultTy = 0; +    Type *ResultTy = nullptr;      switch (Stream.readRecord(Entry.ID, Record)) {      default:        return Error(InvalidValue); @@ -771,7 +815,7 @@ error_code BitcodeReader::ParseTypeTableBody() {        if (Record.size() == 2)          AddressSpace = Record[1];        ResultTy = getTypeByID(Record[0]); -      if (ResultTy == 0) +      if (!ResultTy)          return Error(InvalidType);        ResultTy = PointerType::get(ResultTy, AddressSpace);        break; @@ -790,7 +834,7 @@ error_code BitcodeReader::ParseTypeTableBody() {        }        ResultTy = getTypeByID(Record[2]); -      if (ResultTy == 0 || ArgTys.size() < Record.size()-3) +      if (!ResultTy || ArgTys.size() < Record.size()-3)          return Error(InvalidType);        ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); @@ -809,7 +853,7 @@ error_code BitcodeReader::ParseTypeTableBody() {        }        ResultTy = getTypeByID(Record[1]); -      if (ResultTy == 0 || ArgTys.size() < Record.size()-2) +      if (!ResultTy || ArgTys.size() < Record.size()-2)          return Error(InvalidType);        ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); @@ -846,7 +890,7 @@ error_code BitcodeReader::ParseTypeTableBody() {        StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);        if (Res) {          Res->setName(TypeName); -        TypeList[NumRecords] = 0; +        TypeList[NumRecords] = nullptr;        } else  // Otherwise, create a new struct.          Res = StructType::create(Context, TypeName);        TypeName.clear(); @@ -875,7 +919,7 @@ error_code BitcodeReader::ParseTypeTableBody() {        StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);        if (Res) {          Res->setName(TypeName); -        TypeList[NumRecords] = 0; +        TypeList[NumRecords] = nullptr;        } else  // Otherwise, create a new struct with no body.          Res = StructType::create(Context, TypeName);        TypeName.clear(); @@ -903,12 +947,12 @@ error_code BitcodeReader::ParseTypeTableBody() {      if (NumRecords >= TypeList.size())        return Error(InvalidTYPETable);      assert(ResultTy && "Didn't read a type?"); -    assert(TypeList[NumRecords] == 0 && "Already read type?"); +    assert(!TypeList[NumRecords] && "Already read type?");      TypeList[NumRecords++] = ResultTy;    }  } -error_code BitcodeReader::ParseValueSymbolTable() { +std::error_code BitcodeReader::ParseValueSymbolTable() {    if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID))      return Error(InvalidRecord); @@ -924,7 +968,7 @@ error_code BitcodeReader::ParseValueSymbolTable() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -939,7 +983,7 @@ error_code BitcodeReader::ParseValueSymbolTable() {        if (ConvertToString(Record, 1, ValueName))          return Error(InvalidRecord);        unsigned ValueID = Record[0]; -      if (ValueID >= ValueList.size()) +      if (ValueID >= ValueList.size() || !ValueList[ValueID])          return Error(InvalidRecord);        Value *V = ValueList[ValueID]; @@ -951,7 +995,7 @@ error_code BitcodeReader::ParseValueSymbolTable() {        if (ConvertToString(Record, 1, ValueName))          return Error(InvalidRecord);        BasicBlock *BB = getBasicBlock(Record[0]); -      if (BB == 0) +      if (!BB)          return Error(InvalidRecord);        BB->setName(StringRef(ValueName.data(), ValueName.size())); @@ -962,7 +1006,7 @@ error_code BitcodeReader::ParseValueSymbolTable() {    }  } -error_code BitcodeReader::ParseMetadata() { +std::error_code BitcodeReader::ParseMetadata() {    unsigned NextMDValueNo = MDValueList.size();    if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) @@ -979,7 +1023,7 @@ error_code BitcodeReader::ParseMetadata() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -1006,8 +1050,8 @@ error_code BitcodeReader::ParseMetadata() {        unsigned Size = Record.size();        NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name);        for (unsigned i = 0; i != Size; ++i) { -        MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i])); -        if (MD == 0) +        MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i])); +        if (!MD)            return Error(InvalidRecord);          NMD->addOperand(MD);        } @@ -1031,7 +1075,7 @@ error_code BitcodeReader::ParseMetadata() {          else if (!Ty->isVoidTy())            Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty));          else -          Elts.push_back(NULL); +          Elts.push_back(nullptr);        }        Value *V = MDNode::getWhenValsUnresolved(Context, Elts, IsFunctionLocal);        IsFunctionLocal = false; @@ -1039,7 +1083,8 @@ error_code BitcodeReader::ParseMetadata() {        break;      }      case bitc::METADATA_STRING: { -      SmallString<8> String(Record.begin(), Record.end()); +      std::string String(Record.begin(), Record.end()); +      llvm::UpgradeMDStringConstant(String);        Value *V = MDString::get(Context, String);        MDValueList.AssignValue(V, NextMDValueNo++);        break; @@ -1073,7 +1118,7 @@ uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {  /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global  /// values and aliases that we can. -error_code BitcodeReader::ResolveGlobalAndAliasInits() { +std::error_code BitcodeReader::ResolveGlobalAndAliasInits() {    std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist;    std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist;    std::vector<std::pair<Function*, unsigned> > FunctionPrefixWorklist; @@ -1088,7 +1133,7 @@ error_code BitcodeReader::ResolveGlobalAndAliasInits() {        // Not ready to resolve this yet, it requires something later in the file.        GlobalInits.push_back(GlobalInitWorklist.back());      } else { -      if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) +      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))          GlobalInitWorklist.back().first->setInitializer(C);        else          return Error(ExpectedConstant); @@ -1101,7 +1146,7 @@ error_code BitcodeReader::ResolveGlobalAndAliasInits() {      if (ValID >= ValueList.size()) {        AliasInits.push_back(AliasInitWorklist.back());      } else { -      if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) +      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))          AliasInitWorklist.back().first->setAliasee(C);        else          return Error(ExpectedConstant); @@ -1114,7 +1159,7 @@ error_code BitcodeReader::ResolveGlobalAndAliasInits() {      if (ValID >= ValueList.size()) {        FunctionPrefixes.push_back(FunctionPrefixWorklist.back());      } else { -      if (Constant *C = dyn_cast<Constant>(ValueList[ValID])) +      if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]))          FunctionPrefixWorklist.back().first->setPrefixData(C);        else          return Error(ExpectedConstant); @@ -1122,7 +1167,7 @@ error_code BitcodeReader::ResolveGlobalAndAliasInits() {      FunctionPrefixWorklist.pop_back();    } -  return error_code::success(); +  return std::error_code();  }  static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { @@ -1133,7 +1178,7 @@ static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) {    return APInt(TypeBits, Words);  } -error_code BitcodeReader::ParseConstants() { +std::error_code BitcodeReader::ParseConstants() {    if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID))      return Error(InvalidRecord); @@ -1156,7 +1201,7 @@ error_code BitcodeReader::ParseConstants() {        // Once all the constants have been read, go through and resolve forward        // references.        ValueList.ResolveConstantForwardRefs(); -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -1164,7 +1209,7 @@ error_code BitcodeReader::ParseConstants() {      // Read a record.      Record.clear(); -    Value *V = 0; +    Value *V = nullptr;      unsigned BitCode = Stream.readRecord(Entry.ID, Record);      switch (BitCode) {      default:  // Default behavior: unknown constant @@ -1174,7 +1219,7 @@ error_code BitcodeReader::ParseConstants() {      case bitc::CST_CODE_SETTYPE:   // SETTYPE: [typeid]        if (Record.empty())          return Error(InvalidRecord); -      if (Record[0] >= TypeList.size()) +      if (Record[0] >= TypeList.size() || !TypeList[Record[0]])          return Error(InvalidRecord);        CurTy = TypeList[Record[0]];        continue;  // Skip the ValueList manipulation. @@ -1397,34 +1442,52 @@ error_code BitcodeReader::ParseConstants() {                                    ValueList.getConstantFwdRef(Record[2],CurTy));        break;      } -    case bitc::CST_CODE_CE_EXTRACTELT: { // CE_EXTRACTELT: [opty, opval, opval] +    case bitc::CST_CODE_CE_EXTRACTELT +        : { // CE_EXTRACTELT: [opty, opval, opty, opval]        if (Record.size() < 3)          return Error(InvalidRecord);        VectorType *OpTy =          dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); -      if (OpTy == 0) +      if (!OpTy)          return Error(InvalidRecord);        Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); -      Constant *Op1 = ValueList.getConstantFwdRef(Record[2], -                                                  Type::getInt32Ty(Context)); +      Constant *Op1 = nullptr; +      if (Record.size() == 4) { +        Type *IdxTy = getTypeByID(Record[2]); +        if (!IdxTy) +          return Error(InvalidRecord); +        Op1 = ValueList.getConstantFwdRef(Record[3], IdxTy); +      } else // TODO: Remove with llvm 4.0 +        Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); +      if (!Op1) +        return Error(InvalidRecord);        V = ConstantExpr::getExtractElement(Op0, Op1);        break;      } -    case bitc::CST_CODE_CE_INSERTELT: { // CE_INSERTELT: [opval, opval, opval] +    case bitc::CST_CODE_CE_INSERTELT +        : { // CE_INSERTELT: [opval, opval, opty, opval]        VectorType *OpTy = dyn_cast<VectorType>(CurTy); -      if (Record.size() < 3 || OpTy == 0) +      if (Record.size() < 3 || !OpTy)          return Error(InvalidRecord);        Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy);        Constant *Op1 = ValueList.getConstantFwdRef(Record[1],                                                    OpTy->getElementType()); -      Constant *Op2 = ValueList.getConstantFwdRef(Record[2], -                                                  Type::getInt32Ty(Context)); +      Constant *Op2 = nullptr; +      if (Record.size() == 4) { +        Type *IdxTy = getTypeByID(Record[2]); +        if (!IdxTy) +          return Error(InvalidRecord); +        Op2 = ValueList.getConstantFwdRef(Record[3], IdxTy); +      } else // TODO: Remove with llvm 4.0 +        Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); +      if (!Op2) +        return Error(InvalidRecord);        V = ConstantExpr::getInsertElement(Op0, Op1, Op2);        break;      }      case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval]        VectorType *OpTy = dyn_cast<VectorType>(CurTy); -      if (Record.size() < 3 || OpTy == 0) +      if (Record.size() < 3 || !OpTy)          return Error(InvalidRecord);        Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy);        Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); @@ -1438,7 +1501,7 @@ error_code BitcodeReader::ParseConstants() {        VectorType *RTy = dyn_cast<VectorType>(CurTy);        VectorType *OpTy =          dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); -      if (Record.size() < 4 || RTy == 0 || OpTy == 0) +      if (Record.size() < 4 || !RTy || !OpTy)          return Error(InvalidRecord);        Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy);        Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); @@ -1452,7 +1515,7 @@ error_code BitcodeReader::ParseConstants() {        if (Record.size() < 4)          return Error(InvalidRecord);        Type *OpTy = getTypeByID(Record[0]); -      if (OpTy == 0) +      if (!OpTy)          return Error(InvalidRecord);        Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy);        Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); @@ -1517,11 +1580,11 @@ error_code BitcodeReader::ParseConstants() {        if (Record.size() < 3)          return Error(InvalidRecord);        Type *FnTy = getTypeByID(Record[0]); -      if (FnTy == 0) +      if (!FnTy)          return Error(InvalidRecord);        Function *Fn =          dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); -      if (Fn == 0) +      if (!Fn)          return Error(InvalidRecord);        // If the function is already parsed we can insert the block address right @@ -1540,7 +1603,7 @@ error_code BitcodeReader::ParseConstants() {          GlobalVariable *FwdRef = new GlobalVariable(*Fn->getParent(),                                                      Type::getInt8Ty(Context),                                              false, GlobalValue::InternalLinkage, -                                                    0, ""); +                                                    nullptr, "");          BlockAddrFwdRefs[Fn].push_back(std::make_pair(Record[2], FwdRef));          V = FwdRef;        } @@ -1553,7 +1616,7 @@ error_code BitcodeReader::ParseConstants() {    }  } -error_code BitcodeReader::ParseUseLists() { +std::error_code BitcodeReader::ParseUseLists() {    if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID))      return Error(InvalidRecord); @@ -1568,7 +1631,7 @@ error_code BitcodeReader::ParseUseLists() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -1593,7 +1656,7 @@ error_code BitcodeReader::ParseUseLists() {  /// RememberAndSkipFunctionBody - When we see the block for a function body,  /// remember where it is and then skip it.  This lets us lazily deserialize the  /// functions. -error_code BitcodeReader::RememberAndSkipFunctionBody() { +std::error_code BitcodeReader::RememberAndSkipFunctionBody() {    // Get the function we are talking about.    if (FunctionsWithBodies.empty())      return Error(InsufficientFunctionProtos); @@ -1608,10 +1671,10 @@ error_code BitcodeReader::RememberAndSkipFunctionBody() {    // Skip over the function block for now.    if (Stream.SkipBlock())      return Error(InvalidRecord); -  return error_code::success(); +  return std::error_code();  } -error_code BitcodeReader::GlobalCleanup() { +std::error_code BitcodeReader::GlobalCleanup() {    // Patch the initializers for globals and aliases up.    ResolveGlobalAndAliasInits();    if (!GlobalInits.empty() || !AliasInits.empty()) @@ -1628,16 +1691,19 @@ error_code BitcodeReader::GlobalCleanup() {    // Look for global variables which need to be renamed.    for (Module::global_iterator           GI = TheModule->global_begin(), GE = TheModule->global_end(); -       GI != GE; ++GI) -    UpgradeGlobalVariable(GI); +       GI != GE;) { +    GlobalVariable *GV = GI++; +    UpgradeGlobalVariable(GV); +  } +    // Force deallocation of memory for these vectors to favor the client that    // want lazy deserialization.    std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits);    std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); -  return error_code::success(); +  return std::error_code();  } -error_code BitcodeReader::ParseModule(bool Resume) { +std::error_code BitcodeReader::ParseModule(bool Resume) {    if (Resume)      Stream.JumpToBit(NextUnreadBit);    else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) @@ -1668,30 +1734,30 @@ error_code BitcodeReader::ParseModule(bool Resume) {            return Error(MalformedBlock);          break;        case bitc::PARAMATTR_BLOCK_ID: -        if (error_code EC = ParseAttributeBlock()) +        if (std::error_code EC = ParseAttributeBlock())            return EC;          break;        case bitc::PARAMATTR_GROUP_BLOCK_ID: -        if (error_code EC = ParseAttributeGroupBlock()) +        if (std::error_code EC = ParseAttributeGroupBlock())            return EC;          break;        case bitc::TYPE_BLOCK_ID_NEW: -        if (error_code EC = ParseTypeTable()) +        if (std::error_code EC = ParseTypeTable())            return EC;          break;        case bitc::VALUE_SYMTAB_BLOCK_ID: -        if (error_code EC = ParseValueSymbolTable()) +        if (std::error_code EC = ParseValueSymbolTable())            return EC;          SeenValueSymbolTable = true;          break;        case bitc::CONSTANTS_BLOCK_ID: -        if (error_code EC = ParseConstants()) +        if (std::error_code EC = ParseConstants())            return EC; -        if (error_code EC = ResolveGlobalAndAliasInits()) +        if (std::error_code EC = ResolveGlobalAndAliasInits())            return EC;          break;        case bitc::METADATA_BLOCK_ID: -        if (error_code EC = ParseMetadata()) +        if (std::error_code EC = ParseMetadata())            return EC;          break;        case bitc::FUNCTION_BLOCK_ID: @@ -1699,12 +1765,12 @@ error_code BitcodeReader::ParseModule(bool Resume) {          // FunctionsWithBodies list.          if (!SeenFirstFunctionBody) {            std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); -          if (error_code EC = GlobalCleanup()) +          if (std::error_code EC = GlobalCleanup())              return EC;            SeenFirstFunctionBody = true;          } -        if (error_code EC = RememberAndSkipFunctionBody()) +        if (std::error_code EC = RememberAndSkipFunctionBody())            return EC;          // For streaming bitcode, suspend parsing when we reach the function          // bodies. Subsequent materialization calls will resume it when @@ -1714,11 +1780,11 @@ error_code BitcodeReader::ParseModule(bool Resume) {          // just finish the parse now.          if (LazyStreamer && SeenValueSymbolTable) {            NextUnreadBit = Stream.GetCurrentBitNo(); -          return error_code::success(); +          return std::error_code();          }          break;        case bitc::USELIST_BLOCK_ID: -        if (error_code EC = ParseUseLists()) +        if (std::error_code EC = ParseUseLists())            return EC;          break;        } @@ -1793,9 +1859,23 @@ error_code BitcodeReader::ParseModule(bool Resume) {        GCTable.push_back(S);        break;      } +    case bitc::MODULE_CODE_COMDAT: { // COMDAT: [selection_kind, name] +      if (Record.size() < 2) +        return Error(InvalidRecord); +      Comdat::SelectionKind SK = getDecodedComdatSelectionKind(Record[0]); +      unsigned ComdatNameSize = Record[1]; +      std::string ComdatName; +      ComdatName.reserve(ComdatNameSize); +      for (unsigned i = 0; i != ComdatNameSize; ++i) +        ComdatName += (char)Record[2 + i]; +      Comdat *C = TheModule->getOrInsertComdat(ComdatName); +      C->setSelectionKind(SK); +      ComdatList.push_back(C); +      break; +    }      // GLOBALVAR: [pointer type, isconst, initid,      //             linkage, alignment, section, visibility, threadlocal, -    //             unnamed_addr] +    //             unnamed_addr, dllstorageclass]      case bitc::MODULE_CODE_GLOBALVAR: {        if (Record.size() < 6)          return Error(InvalidRecord); @@ -1817,7 +1897,9 @@ error_code BitcodeReader::ParseModule(bool Resume) {          Section = SectionTable[Record[5]-1];        }        GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; -      if (Record.size() > 6) +      // Local linkage must have default visibility. +      if (Record.size() > 6 && !GlobalValue::isLocalLinkage(Linkage)) +        // FIXME: Change to an error if non-default in 4.0.          Visibility = GetDecodedVisibility(Record[6]);        GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; @@ -1833,7 +1915,7 @@ error_code BitcodeReader::ParseModule(bool Resume) {          ExternallyInitialized = Record[9];        GlobalVariable *NewGV = -        new GlobalVariable(*TheModule, Ty, isConstant, Linkage, 0, "", 0, +        new GlobalVariable(*TheModule, Ty, isConstant, Linkage, nullptr, "", nullptr,                             TLM, AddressSpace, ExternallyInitialized);        NewGV->setAlignment(Alignment);        if (!Section.empty()) @@ -1841,15 +1923,27 @@ error_code BitcodeReader::ParseModule(bool Resume) {        NewGV->setVisibility(Visibility);        NewGV->setUnnamedAddr(UnnamedAddr); +      if (Record.size() > 10) +        NewGV->setDLLStorageClass(GetDecodedDLLStorageClass(Record[10])); +      else +        UpgradeDLLImportExportLinkage(NewGV, Record[3]); +        ValueList.push_back(NewGV);        // Remember which value to use for the global initializer.        if (unsigned InitID = Record[2])          GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); + +      if (Record.size() > 11) +        if (unsigned ComdatID = Record[11]) { +          assert(ComdatID <= ComdatList.size()); +          NewGV->setComdat(ComdatList[ComdatID - 1]); +        }        break;      }      // FUNCTION:  [type, callingconv, isproto, linkage, paramattr, -    //             alignment, section, visibility, gc, unnamed_addr] +    //             alignment, section, visibility, gc, unnamed_addr, +    //             dllstorageclass]      case bitc::MODULE_CODE_FUNCTION: {        if (Record.size() < 8)          return Error(InvalidRecord); @@ -1877,7 +1971,10 @@ error_code BitcodeReader::ParseModule(bool Resume) {            return Error(InvalidID);          Func->setSection(SectionTable[Record[6]-1]);        } -      Func->setVisibility(GetDecodedVisibility(Record[7])); +      // Local linkage must have default visibility. +      if (!Func->hasLocalLinkage()) +        // FIXME: Change to an error if non-default in 4.0. +        Func->setVisibility(GetDecodedVisibility(Record[7]));        if (Record.size() > 8 && Record[8]) {          if (Record[8]-1 > GCTable.size())            return Error(InvalidID); @@ -1889,6 +1986,18 @@ error_code BitcodeReader::ParseModule(bool Resume) {        Func->setUnnamedAddr(UnnamedAddr);        if (Record.size() > 10 && Record[10] != 0)          FunctionPrefixes.push_back(std::make_pair(Func, Record[10]-1)); + +      if (Record.size() > 11) +        Func->setDLLStorageClass(GetDecodedDLLStorageClass(Record[11])); +      else +        UpgradeDLLImportExportLinkage(Func, Record[3]); + +      if (Record.size() > 12) +        if (unsigned ComdatID = Record[12]) { +          assert(ComdatID <= ComdatList.size()); +          Func->setComdat(ComdatList[ComdatID - 1]); +        } +        ValueList.push_back(Func);        // If this is a function with a body, remember the prototype we are @@ -1900,21 +2009,33 @@ error_code BitcodeReader::ParseModule(bool Resume) {        break;      }      // ALIAS: [alias type, aliasee val#, linkage] -    // ALIAS: [alias type, aliasee val#, linkage, visibility] +    // ALIAS: [alias type, aliasee val#, linkage, visibility, dllstorageclass]      case bitc::MODULE_CODE_ALIAS: {        if (Record.size() < 3)          return Error(InvalidRecord);        Type *Ty = getTypeByID(Record[0]);        if (!Ty)          return Error(InvalidRecord); -      if (!Ty->isPointerTy()) +      auto *PTy = dyn_cast<PointerType>(Ty); +      if (!PTy)          return Error(InvalidTypeForValue); -      GlobalAlias *NewGA = new GlobalAlias(Ty, GetDecodedLinkage(Record[2]), -                                           "", 0, TheModule); +      auto *NewGA = +          GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(), +                              GetDecodedLinkage(Record[2]), "", TheModule);        // Old bitcode files didn't have visibility field. -      if (Record.size() > 3) +      // Local linkage must have default visibility. +      if (Record.size() > 3 && !NewGA->hasLocalLinkage()) +        // FIXME: Change to an error if non-default in 4.0.          NewGA->setVisibility(GetDecodedVisibility(Record[3])); +      if (Record.size() > 4) +        NewGA->setDLLStorageClass(GetDecodedDLLStorageClass(Record[4])); +      else +        UpgradeDLLImportExportLinkage(NewGA, Record[2]); +      if (Record.size() > 5) +	NewGA->setThreadLocalMode(GetDecodedThreadLocalMode(Record[5])); +      if (Record.size() > 6) +	NewGA->setUnnamedAddr(Record[6]);        ValueList.push_back(NewGA);        AliasInits.push_back(std::make_pair(NewGA, Record[1]));        break; @@ -1931,10 +2052,10 @@ error_code BitcodeReader::ParseModule(bool Resume) {    }  } -error_code BitcodeReader::ParseBitcodeInto(Module *M) { -  TheModule = 0; +std::error_code BitcodeReader::ParseBitcodeInto(Module *M) { +  TheModule = nullptr; -  if (error_code EC = InitStream()) +  if (std::error_code EC = InitStream())      return EC;    // Sniff for the signature. @@ -1950,7 +2071,7 @@ error_code BitcodeReader::ParseBitcodeInto(Module *M) {    // need to understand them all.    while (1) {      if (Stream.AtEndOfStream()) -      return error_code::success(); +      return std::error_code();      BitstreamEntry Entry =        Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); @@ -1959,7 +2080,7 @@ error_code BitcodeReader::ParseBitcodeInto(Module *M) {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::SubBlock:        switch (Entry.ID) { @@ -1972,10 +2093,10 @@ error_code BitcodeReader::ParseBitcodeInto(Module *M) {          if (TheModule)            return Error(InvalidMultipleBlocks);          TheModule = M; -        if (error_code EC = ParseModule(false)) +        if (std::error_code EC = ParseModule(false))            return EC;          if (LazyStreamer) -          return error_code::success(); +          return std::error_code();          break;        default:          if (Stream.SkipBlock()) @@ -1992,19 +2113,20 @@ error_code BitcodeReader::ParseBitcodeInto(Module *M) {        if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 &&            Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a &&            Stream.AtEndOfStream()) -        return error_code::success(); +        return std::error_code();        return Error(InvalidRecord);      }    }  } -error_code BitcodeReader::ParseModuleTriple(std::string &Triple) { +ErrorOr<std::string> BitcodeReader::parseModuleTriple() {    if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID))      return Error(InvalidRecord);    SmallVector<uint64_t, 64> Record; +  std::string Triple;    // Read all the records for this module.    while (1) {      BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); @@ -2014,7 +2136,7 @@ error_code BitcodeReader::ParseModuleTriple(std::string &Triple) {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return Triple;      case BitstreamEntry::Record:        // The interesting case.        break; @@ -2033,10 +2155,11 @@ error_code BitcodeReader::ParseModuleTriple(std::string &Triple) {      }      Record.clear();    } +  llvm_unreachable("Exit infinite loop");  } -error_code BitcodeReader::ParseTriple(std::string &Triple) { -  if (error_code EC = InitStream()) +ErrorOr<std::string> BitcodeReader::parseTriple() { +  if (std::error_code EC = InitStream())      return EC;    // Sniff for the signature. @@ -2057,11 +2180,11 @@ error_code BitcodeReader::ParseTriple(std::string &Triple) {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::SubBlock:        if (Entry.ID == bitc::MODULE_BLOCK_ID) -        return ParseModuleTriple(Triple); +        return parseModuleTriple();        // Ignore other sub-blocks.        if (Stream.SkipBlock()) @@ -2076,7 +2199,7 @@ error_code BitcodeReader::ParseTriple(std::string &Triple) {  }  /// ParseMetadataAttachment - Parse metadata attachments. -error_code BitcodeReader::ParseMetadataAttachment() { +std::error_code BitcodeReader::ParseMetadataAttachment() {    if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))      return Error(InvalidRecord); @@ -2089,7 +2212,7 @@ error_code BitcodeReader::ParseMetadataAttachment() {      case BitstreamEntry::Error:        return Error(MalformedBlock);      case BitstreamEntry::EndBlock: -      return error_code::success(); +      return std::error_code();      case BitstreamEntry::Record:        // The interesting case.        break; @@ -2123,7 +2246,7 @@ error_code BitcodeReader::ParseMetadataAttachment() {  }  /// ParseFunctionBody - Lazily parse the specified function body block. -error_code BitcodeReader::ParseFunctionBody(Function *F) { +std::error_code BitcodeReader::ParseFunctionBody(Function *F) {    if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID))      return Error(InvalidRecord); @@ -2136,7 +2259,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      ValueList.push_back(I);    unsigned NextValueNo = ValueList.size(); -  BasicBlock *CurBB = 0; +  BasicBlock *CurBB = nullptr;    unsigned CurBBNo = 0;    DebugLoc LastLoc; @@ -2159,20 +2282,20 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {            return Error(InvalidRecord);          break;        case bitc::CONSTANTS_BLOCK_ID: -        if (error_code EC = ParseConstants()) +        if (std::error_code EC = ParseConstants())            return EC;          NextValueNo = ValueList.size();          break;        case bitc::VALUE_SYMTAB_BLOCK_ID: -        if (error_code EC = ParseValueSymbolTable()) +        if (std::error_code EC = ParseValueSymbolTable())            return EC;          break;        case bitc::METADATA_ATTACHMENT_ID: -        if (error_code EC = ParseMetadataAttachment()) +        if (std::error_code EC = ParseMetadataAttachment())            return EC;          break;        case bitc::METADATA_BLOCK_ID: -        if (error_code EC = ParseMetadata()) +        if (std::error_code EC = ParseMetadata())            return EC;          break;        } @@ -2185,7 +2308,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      // Read a record.      Record.clear(); -    Instruction *I = 0; +    Instruction *I = nullptr;      unsigned BitCode = Stream.readRecord(Entry.ID, Record);      switch (BitCode) {      default: // Default behavior: reject @@ -2203,7 +2326,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      case bitc::FUNC_CODE_DEBUG_LOC_AGAIN:  // DEBUG_LOC_AGAIN        // This record indicates that the last instruction is at the same        // location as the previous instruction with a location. -      I = 0; +      I = nullptr;        // Get the last instruction emitted.        if (CurBB && !CurBB->empty()) @@ -2212,31 +2335,31 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {                 !FunctionBBs[CurBBNo-1]->empty())          I = &FunctionBBs[CurBBNo-1]->back(); -      if (I == 0) +      if (!I)          return Error(InvalidRecord);        I->setDebugLoc(LastLoc); -      I = 0; +      I = nullptr;        continue;      case bitc::FUNC_CODE_DEBUG_LOC: {      // DEBUG_LOC: [line, col, scope, ia] -      I = 0;     // Get the last instruction emitted. +      I = nullptr;     // Get the last instruction emitted.        if (CurBB && !CurBB->empty())          I = &CurBB->back();        else if (CurBBNo && FunctionBBs[CurBBNo-1] &&                 !FunctionBBs[CurBBNo-1]->empty())          I = &FunctionBBs[CurBBNo-1]->back(); -      if (I == 0 || Record.size() < 4) +      if (!I || Record.size() < 4)          return Error(InvalidRecord);        unsigned Line = Record[0], Col = Record[1];        unsigned ScopeID = Record[2], IAID = Record[3]; -      MDNode *Scope = 0, *IA = 0; +      MDNode *Scope = nullptr, *IA = nullptr;        if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1));        if (IAID)    IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1));        LastLoc = DebugLoc::get(Line, Col, Scope, IA);        I->setDebugLoc(LastLoc); -      I = 0; +      I = nullptr;        continue;      } @@ -2296,9 +2419,9 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        Type *ResTy = getTypeByID(Record[OpNum]);        int Opc = GetDecodedCastOpcode(Record[OpNum+1]); -      if (Opc == -1 || ResTy == 0) +      if (Opc == -1 || !ResTy)          return Error(InvalidRecord); -      Instruction *Temp = 0; +      Instruction *Temp = nullptr;        if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) {          if (Temp) {            InstructionList.push_back(Temp); @@ -2423,7 +2546,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Vec, *Idx;        if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || -          popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) +          getValueTypePair(Record, OpNum, NextValueNo, Idx))          return Error(InvalidRecord);        I = ExtractElementInst::Create(Vec, Idx);        InstructionList.push_back(I); @@ -2436,7 +2559,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        if (getValueTypePair(Record, OpNum, NextValueNo, Vec) ||            popValue(Record, OpNum, NextValueNo,                     cast<VectorType>(Vec->getType())->getElementType(), Elt) || -          popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx)) +          getValueTypePair(Record, OpNum, NextValueNo, Idx))          return Error(InvalidRecord);        I = InsertElementInst::Create(Vec, Elt, Idx);        InstructionList.push_back(I); @@ -2489,7 +2612,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          }          unsigned OpNum = 0; -        Value *Op = NULL; +        Value *Op = nullptr;          if (getValueTypePair(Record, OpNum, NextValueNo, Op))            return Error(InvalidRecord);          if (OpNum != Record.size()) @@ -2503,7 +2626,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        if (Record.size() != 1 && Record.size() != 3)          return Error(InvalidRecord);        BasicBlock *TrueDest = getBasicBlock(Record[0]); -      if (TrueDest == 0) +      if (!TrueDest)          return Error(InvalidRecord);        if (Record.size() == 1) { @@ -2514,7 +2637,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          BasicBlock *FalseDest = getBasicBlock(Record[1]);          Value *Cond = getValue(Record, 2, NextValueNo,                                 Type::getInt1Ty(Context)); -        if (FalseDest == 0 || Cond == 0) +        if (!FalseDest || !Cond)            return Error(InvalidRecord);          I = BranchInst::Create(TrueDest, FalseDest, Cond);          InstructionList.push_back(I); @@ -2534,7 +2657,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          Value *Cond = getValue(Record, 2, NextValueNo, OpTy);          BasicBlock *Default = getBasicBlock(Record[3]); -        if (OpTy == 0 || Cond == 0 || Default == 0) +        if (!OpTy || !Cond || !Default)            return Error(InvalidRecord);          unsigned NumCases = Record[4]; @@ -2591,7 +2714,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        Type *OpTy = getTypeByID(Record[0]);        Value *Cond = getValue(Record, 1, NextValueNo, OpTy);        BasicBlock *Default = getBasicBlock(Record[2]); -      if (OpTy == 0 || Cond == 0 || Default == 0) +      if (!OpTy || !Cond || !Default)          return Error(InvalidRecord);        unsigned NumCases = (Record.size()-3)/2;        SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); @@ -2600,7 +2723,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          ConstantInt *CaseVal =            dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy));          BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); -        if (CaseVal == 0 || DestBB == 0) { +        if (!CaseVal || !DestBB) {            delete SI;            return Error(InvalidRecord);          } @@ -2614,7 +2737,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          return Error(InvalidRecord);        Type *OpTy = getTypeByID(Record[0]);        Value *Address = getValue(Record, 1, NextValueNo, OpTy); -      if (OpTy == 0 || Address == 0) +      if (!OpTy || !Address)          return Error(InvalidRecord);        unsigned NumDests = Record.size()-2;        IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); @@ -2646,11 +2769,11 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          return Error(InvalidRecord);        PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); -      FunctionType *FTy = !CalleeTy ? 0 : +      FunctionType *FTy = !CalleeTy ? nullptr :          dyn_cast<FunctionType>(CalleeTy->getElementType());        // Check that the right number of fixed parameters are here. -      if (FTy == 0 || NormalBB == 0 || UnwindBB == 0 || +      if (!FTy || !NormalBB || !UnwindBB ||            Record.size() < OpNum+FTy->getNumParams())          return Error(InvalidRecord); @@ -2658,7 +2781,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {          Ops.push_back(getValue(Record, OpNum, NextValueNo,                                 FTy->getParamType(i))); -        if (Ops.back() == 0) +        if (!Ops.back())            return Error(InvalidRecord);        } @@ -2684,7 +2807,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      }      case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval]        unsigned Idx = 0; -      Value *Val = 0; +      Value *Val = nullptr;        if (getValueTypePair(Record, Idx, NextValueNo, Val))          return Error(InvalidRecord);        I = ResumeInst::Create(Val); @@ -2731,7 +2854,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        Type *Ty = getTypeByID(Record[Idx++]);        if (!Ty)          return Error(InvalidRecord); -      Value *PersFn = 0; +      Value *PersFn = nullptr;        if (getValueTypePair(Record, Idx, NextValueNo, PersFn))          return Error(InvalidRecord); @@ -2755,7 +2878,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          assert((CT != LandingPadInst::Filter ||                  isa<ArrayType>(Val->getType())) &&                 "Filter clause has invalid type!"); -        LP->addClause(Val); +        LP->addClause(cast<Constant>(Val));        }        I = LP; @@ -2770,10 +2893,14 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));        Type *OpTy = getTypeByID(Record[1]);        Value *Size = getFnValueByID(Record[2], OpTy); -      unsigned Align = Record[3]; +      unsigned AlignRecord = Record[3]; +      bool InAlloca = AlignRecord & (1 << 5); +      unsigned Align = AlignRecord & ((1 << 5) - 1);        if (!Ty || !Size)          return Error(InvalidRecord); -      I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); +      AllocaInst *AI = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1); +      AI->setUsedWithInAlloca(InAlloca); +      I = AI;        InstructionList.push_back(I);        break;      } @@ -2847,7 +2974,8 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        break;      }      case bitc::FUNC_CODE_INST_CMPXCHG: { -      // CMPXCHG:[ptrty, ptr, cmp, new, vol, ordering, synchscope] +      // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, +      //          failureordering?, isweak?]        unsigned OpNum = 0;        Value *Ptr, *Cmp, *New;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || @@ -2855,14 +2983,34 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {                      cast<PointerType>(Ptr->getType())->getElementType(), Cmp) ||            popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), New) || -          OpNum+3 != Record.size()) +          (Record.size() < OpNum + 3 || Record.size() > OpNum + 5))          return Error(InvalidRecord); -      AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+1]); -      if (Ordering == NotAtomic || Ordering == Unordered) +      AtomicOrdering SuccessOrdering = GetDecodedOrdering(Record[OpNum+1]); +      if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered)          return Error(InvalidRecord);        SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); -      I = new AtomicCmpXchgInst(Ptr, Cmp, New, Ordering, SynchScope); + +      AtomicOrdering FailureOrdering; +      if (Record.size() < 7) +        FailureOrdering = +            AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrdering); +      else +        FailureOrdering = GetDecodedOrdering(Record[OpNum+3]); + +      I = new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering, FailureOrdering, +                                SynchScope);        cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); + +      if (Record.size() < 8) { +        // Before weak cmpxchgs existed, the instruction simply returned the +        // value loaded from memory, so bitcode files from that era will be +        // expecting the first component of a modern cmpxchg. +        CurBB->getInstList().push_back(I); +        I = ExtractValueInst::Create(I, 0); +      } else { +        cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum+4]); +      } +        InstructionList.push_back(I);        break;      } @@ -2914,7 +3062,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          return Error(InvalidRecord);        PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); -      FunctionType *FTy = 0; +      FunctionType *FTy = nullptr;        if (OpTy) FTy = dyn_cast<FunctionType>(OpTy->getElementType());        if (!FTy || Record.size() < FTy->getNumParams()+OpNum)          return Error(InvalidRecord); @@ -2927,7 +3075,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {          else            Args.push_back(getValue(Record, OpNum, NextValueNo,                                    FTy->getParamType(i))); -        if (Args.back() == 0) +        if (!Args.back())            return Error(InvalidRecord);        } @@ -2947,8 +3095,13 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {        I = CallInst::Create(Callee, Args);        InstructionList.push_back(I);        cast<CallInst>(I)->setCallingConv( -        static_cast<CallingConv::ID>(CCInfo>>1)); -      cast<CallInst>(I)->setTailCall(CCInfo & 1); +          static_cast<CallingConv::ID>((~(1U << 14) & CCInfo) >> 1)); +      CallInst::TailCallKind TCK = CallInst::TCK_None; +      if (CCInfo & 1) +        TCK = CallInst::TCK_Tail; +      if (CCInfo & (1 << 14)) +        TCK = CallInst::TCK_MustTail; +      cast<CallInst>(I)->setTailCallKind(TCK);        cast<CallInst>(I)->setAttributes(PAL);        break;      } @@ -2968,7 +3121,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      // Add instruction to end of current BB.  If there is no current BB, reject      // this file. -    if (CurBB == 0) { +    if (!CurBB) {        delete I;        return Error(InvalidInstructionWithNoBB);      } @@ -2977,7 +3130,7 @@ error_code BitcodeReader::ParseFunctionBody(Function *F) {      // If this was a terminator instruction, move to the next block.      if (isa<TerminatorInst>(I)) {        ++CurBBNo; -      CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : 0; +      CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr;      }      // Non-void values get registered in the value table for future use. @@ -2989,10 +3142,10 @@ OutOfRecordLoop:    // Check the function list for unresolved values.    if (Argument *A = dyn_cast<Argument>(ValueList.back())) { -    if (A->getParent() == 0) { +    if (!A->getParent()) {        // We found at least one unresolved value.  Nuke them all to avoid leaks.        for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ -        if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) { +        if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && !A->getParent()) {            A->replaceAllUsesWith(UndefValue::get(A->getType()));            delete A;          } @@ -3027,27 +3180,29 @@ OutOfRecordLoop:    ValueList.shrinkTo(ModuleValueListSize);    MDValueList.shrinkTo(ModuleMDValueListSize);    std::vector<BasicBlock*>().swap(FunctionBBs); -  return error_code::success(); +  return std::error_code();  }  /// Find the function body in the bitcode stream -error_code BitcodeReader::FindFunctionInStream(Function *F, -       DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { +std::error_code BitcodeReader::FindFunctionInStream( +    Function *F, +    DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {    while (DeferredFunctionInfoIterator->second == 0) {      if (Stream.AtEndOfStream())        return Error(CouldNotFindFunctionInStream);      // ParseModule will parse the next body in the stream and set its      // position in the DeferredFunctionInfo map. -    if (error_code EC = ParseModule(true)) +    if (std::error_code EC = ParseModule(true))        return EC;    } -  return error_code::success(); +  return std::error_code();  }  //===----------------------------------------------------------------------===//  // GVMaterializer implementation  //===----------------------------------------------------------------------===// +void BitcodeReader::releaseBuffer() { Buffer.release(); }  bool BitcodeReader::isMaterializable(const GlobalValue *GV) const {    if (const Function *F = dyn_cast<Function>(GV)) { @@ -3057,39 +3212,39 @@ bool BitcodeReader::isMaterializable(const GlobalValue *GV) const {    return false;  } -error_code BitcodeReader::Materialize(GlobalValue *GV) { +std::error_code BitcodeReader::Materialize(GlobalValue *GV) {    Function *F = dyn_cast<Function>(GV);    // If it's not a function or is already material, ignore the request.    if (!F || !F->isMaterializable()) -    return error_code::success(); +    return std::error_code();    DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F);    assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!");    // If its position is recorded as 0, its body is somewhere in the stream    // but we haven't seen it yet.    if (DFII->second == 0 && LazyStreamer) -    if (error_code EC = FindFunctionInStream(F, DFII)) +    if (std::error_code EC = FindFunctionInStream(F, DFII))        return EC;    // Move the bit stream to the saved position of the deferred function body.    Stream.JumpToBit(DFII->second); -  if (error_code EC = ParseFunctionBody(F)) +  if (std::error_code EC = ParseFunctionBody(F))      return EC;    // Upgrade any old intrinsic calls in the function.    for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(),         E = UpgradedIntrinsics.end(); I != E; ++I) {      if (I->first != I->second) { -      for (Value::use_iterator UI = I->first->use_begin(), -           UE = I->first->use_end(); UI != UE; ) { +      for (auto UI = I->first->user_begin(), UE = I->first->user_end(); +           UI != UE;) {          if (CallInst* CI = dyn_cast<CallInst>(*UI++))            UpgradeIntrinsicCall(CI, I->second);        }      }    } -  return error_code::success(); +  return std::error_code();  }  bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { @@ -3111,8 +3266,7 @@ void BitcodeReader::Dematerialize(GlobalValue *GV) {    F->deleteBody();  } - -error_code BitcodeReader::MaterializeModule(Module *M) { +std::error_code BitcodeReader::MaterializeModule(Module *M) {    assert(M == TheModule &&           "Can only Materialize the Module this BitcodeReader is attached to.");    // Iterate over the module, deserializing any functions that are still on @@ -3120,7 +3274,7 @@ error_code BitcodeReader::MaterializeModule(Module *M) {    for (Module::iterator F = TheModule->begin(), E = TheModule->end();         F != E; ++F) {      if (F->isMaterializable()) { -      if (error_code EC = Materialize(F)) +      if (std::error_code EC = Materialize(F))          return EC;      }    } @@ -3137,8 +3291,8 @@ error_code BitcodeReader::MaterializeModule(Module *M) {    for (std::vector<std::pair<Function*, Function*> >::iterator I =         UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) {      if (I->first != I->second) { -      for (Value::use_iterator UI = I->first->use_begin(), -           UE = I->first->use_end(); UI != UE; ) { +      for (auto UI = I->first->user_begin(), UE = I->first->user_end(); +           UI != UE;) {          if (CallInst* CI = dyn_cast<CallInst>(*UI++))            UpgradeIntrinsicCall(CI, I->second);        } @@ -3153,16 +3307,16 @@ error_code BitcodeReader::MaterializeModule(Module *M) {      UpgradeInstWithTBAATag(InstsWithTBAATag[I]);    UpgradeDebugInfo(*M); -  return error_code::success(); +  return std::error_code();  } -error_code BitcodeReader::InitStream() { +std::error_code BitcodeReader::InitStream() {    if (LazyStreamer)      return InitLazyStream();    return InitStreamFromBuffer();  } -error_code BitcodeReader::InitStreamFromBuffer() { +std::error_code BitcodeReader::InitStreamFromBuffer() {    const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart();    const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); @@ -3182,10 +3336,10 @@ error_code BitcodeReader::InitStreamFromBuffer() {    StreamFile.reset(new BitstreamReader(BufPtr, BufEnd));    Stream.init(*StreamFile); -  return error_code::success(); +  return std::error_code();  } -error_code BitcodeReader::InitLazyStream() { +std::error_code BitcodeReader::InitLazyStream() {    // Check and strip off the bitcode wrapper; BitstreamReader expects never to    // see it.    StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); @@ -3206,15 +3360,15 @@ error_code BitcodeReader::InitLazyStream() {      Bytes->dropLeadingBytes(bitcodeStart - buf);      Bytes->setKnownObjectSize(bitcodeEnd - bitcodeStart);    } -  return error_code::success(); +  return std::error_code();  }  namespace { -class BitcodeErrorCategoryType : public _do_message { -  const char *name() const LLVM_OVERRIDE { +class BitcodeErrorCategoryType : public std::error_category { +  const char *name() const LLVM_NOEXCEPT override {      return "llvm.bitcode";    } -  std::string message(int IE) const LLVM_OVERRIDE { +  std::string message(int IE) const override {      BitcodeReader::ErrorType E = static_cast<BitcodeReader::ErrorType>(IE);      switch (E) {      case BitcodeReader::BitcodeStreamInvalidSize: @@ -3261,7 +3415,7 @@ class BitcodeErrorCategoryType : public _do_message {  };  } -const error_category &BitcodeReader::BitcodeErrorCategory() { +const std::error_category &BitcodeReader::BitcodeErrorCategory() {    static BitcodeErrorCategoryType O;    return O;  } @@ -3272,21 +3426,16 @@ const error_category &BitcodeReader::BitcodeErrorCategory() {  /// getLazyBitcodeModule - lazy function-at-a-time loading from a file.  /// -Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, -                                   LLVMContext& Context, -                                   std::string *ErrMsg) { +ErrorOr<Module *> llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, +                                             LLVMContext &Context) {    Module *M = new Module(Buffer->getBufferIdentifier(), Context);    BitcodeReader *R = new BitcodeReader(Buffer, Context);    M->setMaterializer(R); -  if (error_code EC = R->ParseBitcodeInto(M)) { -    if (ErrMsg) -      *ErrMsg = EC.message(); - +  if (std::error_code EC = R->ParseBitcodeInto(M)) { +    R->releaseBuffer(); // Never take ownership on error.      delete M;  // Also deletes R. -    return 0; +    return EC;    } -  // Have the BitcodeReader dtor delete 'Buffer'. -  R->setBufferOwned(true);    R->materializeForwardReferencedFunctions(); @@ -3301,31 +3450,25 @@ Module *llvm::getStreamedBitcodeModule(const std::string &name,    Module *M = new Module(name, Context);    BitcodeReader *R = new BitcodeReader(streamer, Context);    M->setMaterializer(R); -  if (error_code EC = R->ParseBitcodeInto(M)) { +  if (std::error_code EC = R->ParseBitcodeInto(M)) {      if (ErrMsg)        *ErrMsg = EC.message();      delete M;  // Also deletes R. -    return 0; +    return nullptr;    } -  R->setBufferOwned(false); // no buffer to delete    return M;  } -/// ParseBitcodeFile - Read the specified bitcode file, returning the module. -/// If an error occurs, return null and fill in *ErrMsg if non-null. -Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, -                               std::string *ErrMsg){ -  Module *M = getLazyBitcodeModule(Buffer, Context, ErrMsg); -  if (!M) return 0; - -  // Don't let the BitcodeReader dtor delete 'Buffer', regardless of whether -  // there was an error. -  static_cast<BitcodeReader*>(M->getMaterializer())->setBufferOwned(false); - +ErrorOr<Module *> llvm::parseBitcodeFile(MemoryBuffer *Buffer, +                                         LLVMContext &Context) { +  ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context); +  if (!ModuleOrErr) +    return ModuleOrErr; +  Module *M = ModuleOrErr.get();    // Read in the entire module, and destroy the BitcodeReader. -  if (M->MaterializeAllPermanently(ErrMsg)) { +  if (std::error_code EC = M->materializeAllPermanently(true)) {      delete M; -    return 0; +    return EC;    }    // TODO: Restore the use-lists to the in-memory state when the bitcode was @@ -3335,17 +3478,12 @@ Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context,  }  std::string llvm::getBitcodeTargetTriple(MemoryBuffer *Buffer, -                                         LLVMContext& Context, -                                         std::string *ErrMsg) { +                                         LLVMContext &Context) {    BitcodeReader *R = new BitcodeReader(Buffer, Context); -  // Don't let the BitcodeReader dtor delete 'Buffer'. -  R->setBufferOwned(false); - -  std::string Triple(""); -  if (error_code EC = R->ParseTriple(Triple)) -    if (ErrMsg) -      *ErrMsg = EC.message(); - +  ErrorOr<std::string> Triple = R->parseTriple(); +  R->releaseBuffer();    delete R; -  return Triple; +  if (Triple.getError()) +    return ""; +  return Triple.get();  } diff --git a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h index c5d345b697eb..1d4869a2d5a7 100644 --- a/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h +++ b/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.h @@ -17,15 +17,16 @@  #include "llvm/ADT/DenseMap.h"  #include "llvm/Bitcode/BitstreamReader.h"  #include "llvm/Bitcode/LLVMBitCodes.h" -#include "llvm/GVMaterializer.h"  #include "llvm/IR/Attributes.h" +#include "llvm/IR/GVMaterializer.h"  #include "llvm/IR/OperandTraits.h"  #include "llvm/IR/Type.h" -#include "llvm/Support/system_error.h" -#include "llvm/Support/ValueHandle.h" +#include "llvm/IR/ValueHandle.h" +#include <system_error>  #include <vector>  namespace llvm { +  class Comdat;    class MemoryBuffer;    class LLVMContext; @@ -125,9 +126,8 @@ public:  class BitcodeReader : public GVMaterializer {    LLVMContext &Context;    Module *TheModule; -  MemoryBuffer *Buffer; -  bool BufferOwned; -  OwningPtr<BitstreamReader> StreamFile; +  std::unique_ptr<MemoryBuffer> Buffer; +  std::unique_ptr<BitstreamReader> StreamFile;    BitstreamCursor Stream;    DataStreamer *LazyStreamer;    uint64_t NextUnreadBit; @@ -136,6 +136,7 @@ class BitcodeReader : public GVMaterializer {    std::vector<Type*> TypeList;    BitcodeReaderValueList ValueList;    BitcodeReaderMDValueList MDValueList; +  std::vector<Comdat *> ComdatList;    SmallVector<Instruction *, 64> InstructionList;    SmallVector<SmallVector<uint64_t, 64>, 64> UseListRecords; @@ -193,7 +194,7 @@ class BitcodeReader : public GVMaterializer {    /// not need this flag.    bool UseRelativeIDs; -  static const error_category &BitcodeErrorCategory(); +  static const std::error_category &BitcodeErrorCategory();  public:    enum ErrorType { @@ -219,47 +220,39 @@ public:      InvalidValue // Invalid version, inst number, attr number, etc    }; -  error_code Error(ErrorType E) { -    return error_code(E, BitcodeErrorCategory()); +  std::error_code Error(ErrorType E) { +    return std::error_code(E, BitcodeErrorCategory());    }    explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) -    : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), -      LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), -      ValueList(C), MDValueList(C), -      SeenFirstFunctionBody(false), UseRelativeIDs(false) { -  } +      : Context(C), TheModule(nullptr), Buffer(buffer), LazyStreamer(nullptr), +        NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), +        MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false) {}    explicit BitcodeReader(DataStreamer *streamer, LLVMContext &C) -    : Context(C), TheModule(0), Buffer(0), BufferOwned(false), -      LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false), -      ValueList(C), MDValueList(C), -      SeenFirstFunctionBody(false), UseRelativeIDs(false) { -  } -  ~BitcodeReader() { -    FreeState(); -  } +      : Context(C), TheModule(nullptr), Buffer(nullptr), LazyStreamer(streamer), +        NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), +        MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false) {} +  ~BitcodeReader() { FreeState(); }    void materializeForwardReferencedFunctions();    void FreeState(); -  /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer -  /// when the reader is destroyed. -  void setBufferOwned(bool Owned) { BufferOwned = Owned; } +  void releaseBuffer() override; -  virtual bool isMaterializable(const GlobalValue *GV) const; -  virtual bool isDematerializable(const GlobalValue *GV) const; -  virtual error_code Materialize(GlobalValue *GV); -  virtual error_code MaterializeModule(Module *M); -  virtual void Dematerialize(GlobalValue *GV); +  bool isMaterializable(const GlobalValue *GV) const override; +  bool isDematerializable(const GlobalValue *GV) const override; +  std::error_code Materialize(GlobalValue *GV) override; +  std::error_code MaterializeModule(Module *M) override; +  void Dematerialize(GlobalValue *GV) override;    /// @brief Main interface to parsing a bitcode buffer.    /// @returns true if an error occurred. -  error_code ParseBitcodeInto(Module *M); +  std::error_code ParseBitcodeInto(Module *M);    /// @brief Cheap mechanism to just extract module triple    /// @returns true if an error occurred. -  error_code ParseTriple(std::string &Triple); +  ErrorOr<std::string> parseTriple();    static uint64_t decodeSignRotatedValue(uint64_t V); @@ -271,7 +264,7 @@ private:      return ValueList.getValueFwdRef(ID, Ty);    }    BasicBlock *getBasicBlock(unsigned ID) const { -    if (ID >= FunctionBBs.size()) return 0; // Invalid ID +    if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID      return FunctionBBs[ID];    }    AttributeSet getAttributes(unsigned i) const { @@ -293,15 +286,15 @@ private:      if (ValNo < InstNum) {        // If this is not a forward reference, just return the value we already        // have. -      ResVal = getFnValueByID(ValNo, 0); -      return ResVal == 0; +      ResVal = getFnValueByID(ValNo, nullptr); +      return ResVal == nullptr;      } else if (Slot == Record.size()) {        return true;      }      unsigned TypeNo = (unsigned)Record[Slot++];      ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); -    return ResVal == 0; +    return ResVal == nullptr;    }    /// popValue - Read a value out of the specified record from slot 'Slot'. @@ -320,14 +313,14 @@ private:    bool getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot,                  unsigned InstNum, Type *Ty, Value *&ResVal) {      ResVal = getValue(Record, Slot, InstNum, Ty); -    return ResVal == 0; +    return ResVal == nullptr;    }    /// getValue -- Version of getValue that returns ResVal directly,    /// or 0 if there is an error.    Value *getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot,                    unsigned InstNum, Type *Ty) { -    if (Slot == Record.size()) return 0; +    if (Slot == Record.size()) return nullptr;      unsigned ValNo = (unsigned)Record[Slot];      // Adjust the ValNo, if it was encoded relative to the InstNum.      if (UseRelativeIDs) @@ -338,7 +331,7 @@ private:    /// getValueSigned -- Like getValue, but decodes signed VBRs.    Value *getValueSigned(SmallVectorImpl<uint64_t> &Record, unsigned Slot,                          unsigned InstNum, Type *Ty) { -    if (Slot == Record.size()) return 0; +    if (Slot == Record.size()) return nullptr;      unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);      // Adjust the ValNo, if it was encoded relative to the InstNum.      if (UseRelativeIDs) @@ -346,28 +339,29 @@ private:      return getFnValueByID(ValNo, Ty);    } -  error_code ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); -  error_code ParseModule(bool Resume); -  error_code ParseAttributeBlock(); -  error_code ParseAttributeGroupBlock(); -  error_code ParseTypeTable(); -  error_code ParseTypeTableBody(); - -  error_code ParseValueSymbolTable(); -  error_code ParseConstants(); -  error_code RememberAndSkipFunctionBody(); -  error_code ParseFunctionBody(Function *F); -  error_code GlobalCleanup(); -  error_code ResolveGlobalAndAliasInits(); -  error_code ParseMetadata(); -  error_code ParseMetadataAttachment(); -  error_code ParseModuleTriple(std::string &Triple); -  error_code ParseUseLists(); -  error_code InitStream(); -  error_code InitStreamFromBuffer(); -  error_code InitLazyStream(); -  error_code FindFunctionInStream(Function *F, -         DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator); +  std::error_code ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); +  std::error_code ParseModule(bool Resume); +  std::error_code ParseAttributeBlock(); +  std::error_code ParseAttributeGroupBlock(); +  std::error_code ParseTypeTable(); +  std::error_code ParseTypeTableBody(); + +  std::error_code ParseValueSymbolTable(); +  std::error_code ParseConstants(); +  std::error_code RememberAndSkipFunctionBody(); +  std::error_code ParseFunctionBody(Function *F); +  std::error_code GlobalCleanup(); +  std::error_code ResolveGlobalAndAliasInits(); +  std::error_code ParseMetadata(); +  std::error_code ParseMetadataAttachment(); +  ErrorOr<std::string> parseModuleTriple(); +  std::error_code ParseUseLists(); +  std::error_code InitStream(); +  std::error_code InitStreamFromBuffer(); +  std::error_code InitLazyStream(); +  std::error_code FindFunctionInStream( +      Function *F, +      DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);  };  } // End llvm namespace diff --git a/contrib/llvm/lib/Bitcode/Reader/BitstreamReader.cpp b/contrib/llvm/lib/Bitcode/Reader/BitstreamReader.cpp index 1fd9abd8b180..72451ec9500c 100644 --- a/contrib/llvm/lib/Bitcode/Reader/BitstreamReader.cpp +++ b/contrib/llvm/lib/Bitcode/Reader/BitstreamReader.cpp @@ -97,7 +97,7 @@ void BitstreamCursor::readAbbreviatedField(const BitCodeAbbrevOp &Op,    switch (Op.getEncoding()) {    case BitCodeAbbrevOp::Array:    case BitCodeAbbrevOp::Blob: -    assert(0 && "Should not reach here"); +    llvm_unreachable("Should not reach here");    case BitCodeAbbrevOp::Fixed:      Vals.push_back(Read((unsigned)Op.getEncodingData()));      break; @@ -117,7 +117,7 @@ void BitstreamCursor::skipAbbreviatedField(const BitCodeAbbrevOp &Op) {    switch (Op.getEncoding()) {    case BitCodeAbbrevOp::Array:    case BitCodeAbbrevOp::Blob: -    assert(0 && "Should not reach here"); +    llvm_unreachable("Should not reach here");    case BitCodeAbbrevOp::Fixed:      (void)Read((unsigned)Op.getEncodingData());      break; @@ -315,7 +315,7 @@ bool BitstreamCursor::ReadBlockInfoBlock() {    if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return true;    SmallVector<uint64_t, 64> Record; -  BitstreamReader::BlockInfo *CurBlockInfo = 0; +  BitstreamReader::BlockInfo *CurBlockInfo = nullptr;    // Read all the records for this module.    while (1) { diff --git a/contrib/llvm/lib/Bitcode/Writer/BitWriter.cpp b/contrib/llvm/lib/Bitcode/Writer/BitWriter.cpp index cd1ada22cfd6..3747122fc98f 100644 --- a/contrib/llvm/lib/Bitcode/Writer/BitWriter.cpp +++ b/contrib/llvm/lib/Bitcode/Writer/BitWriter.cpp @@ -10,6 +10,7 @@  #include "llvm-c/BitWriter.h"  #include "llvm/Bitcode/ReaderWriter.h"  #include "llvm/IR/Module.h" +#include "llvm/Support/FileSystem.h"  #include "llvm/Support/raw_ostream.h"  using namespace llvm; @@ -18,7 +19,7 @@ using namespace llvm;  int LLVMWriteBitcodeToFile(LLVMModuleRef M, const char *Path) {    std::string ErrorInfo; -  raw_fd_ostream OS(Path, ErrorInfo, sys::fs::F_Binary); +  raw_fd_ostream OS(Path, ErrorInfo, sys::fs::F_None);    if (!ErrorInfo.empty())      return -1; diff --git a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 4cfc6bde76ed..b2e49486d70f 100644 --- a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -169,12 +169,16 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {      return bitc::ATTR_KIND_BUILTIN;    case Attribute::ByVal:      return bitc::ATTR_KIND_BY_VAL; +  case Attribute::InAlloca: +    return bitc::ATTR_KIND_IN_ALLOCA;    case Attribute::Cold:      return bitc::ATTR_KIND_COLD;    case Attribute::InlineHint:      return bitc::ATTR_KIND_INLINE_HINT;    case Attribute::InReg:      return bitc::ATTR_KIND_IN_REG; +  case Attribute::JumpTable: +    return bitc::ATTR_KIND_JUMP_TABLE;    case Attribute::MinSize:      return bitc::ATTR_KIND_MIN_SIZE;    case Attribute::Naked: @@ -195,6 +199,10 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {      return bitc::ATTR_KIND_NO_INLINE;    case Attribute::NonLazyBind:      return bitc::ATTR_KIND_NON_LAZY_BIND; +  case Attribute::NonNull: +    return bitc::ATTR_KIND_NON_NULL; +  case Attribute::Dereferenceable: +    return bitc::ATTR_KIND_DEREFERENCEABLE;    case Attribute::NoRedZone:      return bitc::ATTR_KIND_NO_RED_ZONE;    case Attribute::NoReturn: @@ -266,7 +274,7 @@ static void WriteAttributeGroupTable(const ValueEnumerator &VE,          if (Attr.isEnumAttribute()) {            Record.push_back(0);            Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum())); -        } else if (Attr.isAlignAttribute()) { +        } else if (Attr.isIntAttribute()) {            Record.push_back(1);            Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));            Record.push_back(Attr.getValueAsInt()); @@ -382,7 +390,6 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {      unsigned Code = 0;      switch (T->getTypeID()) { -    default: llvm_unreachable("Unknown type!");      case Type::VoidTyID:      Code = bitc::TYPE_CODE_VOID;      break;      case Type::HalfTyID:      Code = bitc::TYPE_CODE_HALF;      break;      case Type::FloatTyID:     Code = bitc::TYPE_CODE_FLOAT;     break; @@ -473,29 +480,25 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {    Stream.ExitBlock();  } -static unsigned getEncodedLinkage(const GlobalValue *GV) { -  switch (GV->getLinkage()) { +static unsigned getEncodedLinkage(const GlobalValue &GV) { +  switch (GV.getLinkage()) {    case GlobalValue::ExternalLinkage:                 return 0;    case GlobalValue::WeakAnyLinkage:                  return 1;    case GlobalValue::AppendingLinkage:                return 2;    case GlobalValue::InternalLinkage:                 return 3;    case GlobalValue::LinkOnceAnyLinkage:              return 4; -  case GlobalValue::DLLImportLinkage:                return 5; -  case GlobalValue::DLLExportLinkage:                return 6;    case GlobalValue::ExternalWeakLinkage:             return 7;    case GlobalValue::CommonLinkage:                   return 8;    case GlobalValue::PrivateLinkage:                  return 9;    case GlobalValue::WeakODRLinkage:                  return 10;    case GlobalValue::LinkOnceODRLinkage:              return 11;    case GlobalValue::AvailableExternallyLinkage:      return 12; -  case GlobalValue::LinkerPrivateLinkage:            return 13; -  case GlobalValue::LinkerPrivateWeakLinkage:        return 14;    }    llvm_unreachable("Invalid linkage");  } -static unsigned getEncodedVisibility(const GlobalValue *GV) { -  switch (GV->getVisibility()) { +static unsigned getEncodedVisibility(const GlobalValue &GV) { +  switch (GV.getVisibility()) {    case GlobalValue::DefaultVisibility:   return 0;    case GlobalValue::HiddenVisibility:    return 1;    case GlobalValue::ProtectedVisibility: return 2; @@ -503,8 +506,17 @@ static unsigned getEncodedVisibility(const GlobalValue *GV) {    llvm_unreachable("Invalid visibility");  } -static unsigned getEncodedThreadLocalMode(const GlobalVariable *GV) { -  switch (GV->getThreadLocalMode()) { +static unsigned getEncodedDLLStorageClass(const GlobalValue &GV) { +  switch (GV.getDLLStorageClass()) { +  case GlobalValue::DefaultStorageClass:   return 0; +  case GlobalValue::DLLImportStorageClass: return 1; +  case GlobalValue::DLLExportStorageClass: return 2; +  } +  llvm_unreachable("Invalid DLL storage class"); +} + +static unsigned getEncodedThreadLocalMode(const GlobalValue &GV) { +  switch (GV.getThreadLocalMode()) {      case GlobalVariable::NotThreadLocal:         return 0;      case GlobalVariable::GeneralDynamicTLSModel: return 1;      case GlobalVariable::LocalDynamicTLSModel:   return 2; @@ -514,6 +526,35 @@ static unsigned getEncodedThreadLocalMode(const GlobalVariable *GV) {    llvm_unreachable("Invalid TLS model");  } +static unsigned getEncodedComdatSelectionKind(const Comdat &C) { +  switch (C.getSelectionKind()) { +  case Comdat::Any: +    return bitc::COMDAT_SELECTION_KIND_ANY; +  case Comdat::ExactMatch: +    return bitc::COMDAT_SELECTION_KIND_EXACT_MATCH; +  case Comdat::Largest: +    return bitc::COMDAT_SELECTION_KIND_LARGEST; +  case Comdat::NoDuplicates: +    return bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES; +  case Comdat::SameSize: +    return bitc::COMDAT_SELECTION_KIND_SAME_SIZE; +  } +  llvm_unreachable("Invalid selection kind"); +} + +static void writeComdats(const ValueEnumerator &VE, BitstreamWriter &Stream) { +  SmallVector<uint8_t, 64> Vals; +  for (const Comdat *C : VE.getComdats()) { +    // COMDAT: [selection_kind, name] +    Vals.push_back(getEncodedComdatSelectionKind(*C)); +    Vals.push_back(C->getName().size()); +    for (char Chr : C->getName()) +      Vals.push_back((unsigned char)Chr); +    Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0); +    Vals.clear(); +  } +} +  // Emit top-level description of module, including target triple, inline asm,  // descriptors for global variables, and function prototype info.  static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE, @@ -522,9 +563,9 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,    if (!M->getTargetTriple().empty())      WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(),                        0/*TODO*/, Stream); -  if (!M->getDataLayout().empty()) -    WriteStringRecord(bitc::MODULE_CODE_DATALAYOUT, M->getDataLayout(), -                      0/*TODO*/, Stream); +  const std::string &DL = M->getDataLayoutStr(); +  if (!DL.empty()) +    WriteStringRecord(bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/, Stream);    if (!M->getModuleInlineAsm().empty())      WriteStringRecord(bitc::MODULE_CODE_ASM, M->getModuleInlineAsm(),                        0/*TODO*/, Stream); @@ -535,36 +576,35 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,    std::map<std::string, unsigned> GCMap;    unsigned MaxAlignment = 0;    unsigned MaxGlobalType = 0; -  for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); -       GV != E; ++GV) { -    MaxAlignment = std::max(MaxAlignment, GV->getAlignment()); -    MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType())); -    if (GV->hasSection()) { +  for (const GlobalValue &GV : M->globals()) { +    MaxAlignment = std::max(MaxAlignment, GV.getAlignment()); +    MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getType())); +    if (GV.hasSection()) {        // Give section names unique ID's. -      unsigned &Entry = SectionMap[GV->getSection()]; +      unsigned &Entry = SectionMap[GV.getSection()];        if (!Entry) { -        WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV->getSection(), +        WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV.getSection(),                            0/*TODO*/, Stream);          Entry = SectionMap.size();        }      }    } -  for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { -    MaxAlignment = std::max(MaxAlignment, F->getAlignment()); -    if (F->hasSection()) { +  for (const Function &F : *M) { +    MaxAlignment = std::max(MaxAlignment, F.getAlignment()); +    if (F.hasSection()) {        // Give section names unique ID's. -      unsigned &Entry = SectionMap[F->getSection()]; +      unsigned &Entry = SectionMap[F.getSection()];        if (!Entry) { -        WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F->getSection(), +        WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F.getSection(),                            0/*TODO*/, Stream);          Entry = SectionMap.size();        }      } -    if (F->hasGC()) { +    if (F.hasGC()) {        // Same for GC names. -      unsigned &Entry = GCMap[F->getGC()]; +      unsigned &Entry = GCMap[F.getGC()];        if (!Entry) { -        WriteStringRecord(bitc::MODULE_CODE_GCNAME, F->getGC(), +        WriteStringRecord(bitc::MODULE_CODE_GCNAME, F.getGC(),                            0/*TODO*/, Stream);          Entry = GCMap.size();        } @@ -600,27 +640,30 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,    // Emit the global variable information.    SmallVector<unsigned, 64> Vals; -  for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); -       GV != E; ++GV) { +  for (const GlobalVariable &GV : M->globals()) {      unsigned AbbrevToUse = 0;      // GLOBALVAR: [type, isconst, initid,      //             linkage, alignment, section, visibility, threadlocal, -    //             unnamed_addr, externally_initialized] -    Vals.push_back(VE.getTypeID(GV->getType())); -    Vals.push_back(GV->isConstant()); -    Vals.push_back(GV->isDeclaration() ? 0 : -                   (VE.getValueID(GV->getInitializer()) + 1)); +    //             unnamed_addr, externally_initialized, dllstorageclass] +    Vals.push_back(VE.getTypeID(GV.getType())); +    Vals.push_back(GV.isConstant()); +    Vals.push_back(GV.isDeclaration() ? 0 : +                   (VE.getValueID(GV.getInitializer()) + 1));      Vals.push_back(getEncodedLinkage(GV)); -    Vals.push_back(Log2_32(GV->getAlignment())+1); -    Vals.push_back(GV->hasSection() ? SectionMap[GV->getSection()] : 0); -    if (GV->isThreadLocal() || -        GV->getVisibility() != GlobalValue::DefaultVisibility || -        GV->hasUnnamedAddr() || GV->isExternallyInitialized()) { +    Vals.push_back(Log2_32(GV.getAlignment())+1); +    Vals.push_back(GV.hasSection() ? SectionMap[GV.getSection()] : 0); +    if (GV.isThreadLocal() || +        GV.getVisibility() != GlobalValue::DefaultVisibility || +        GV.hasUnnamedAddr() || GV.isExternallyInitialized() || +        GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass || +        GV.hasComdat()) {        Vals.push_back(getEncodedVisibility(GV));        Vals.push_back(getEncodedThreadLocalMode(GV)); -      Vals.push_back(GV->hasUnnamedAddr()); -      Vals.push_back(GV->isExternallyInitialized()); +      Vals.push_back(GV.hasUnnamedAddr()); +      Vals.push_back(GV.isExternallyInitialized()); +      Vals.push_back(getEncodedDLLStorageClass(GV)); +      Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);      } else {        AbbrevToUse = SimpleGVarAbbrev;      } @@ -630,21 +673,23 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,    }    // Emit the function proto information. -  for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { +  for (const Function &F : *M) {      // FUNCTION:  [type, callingconv, isproto, linkage, paramattrs, alignment,      //             section, visibility, gc, unnamed_addr, prefix] -    Vals.push_back(VE.getTypeID(F->getType())); -    Vals.push_back(F->getCallingConv()); -    Vals.push_back(F->isDeclaration()); +    Vals.push_back(VE.getTypeID(F.getType())); +    Vals.push_back(F.getCallingConv()); +    Vals.push_back(F.isDeclaration());      Vals.push_back(getEncodedLinkage(F)); -    Vals.push_back(VE.getAttributeID(F->getAttributes())); -    Vals.push_back(Log2_32(F->getAlignment())+1); -    Vals.push_back(F->hasSection() ? SectionMap[F->getSection()] : 0); +    Vals.push_back(VE.getAttributeID(F.getAttributes())); +    Vals.push_back(Log2_32(F.getAlignment())+1); +    Vals.push_back(F.hasSection() ? SectionMap[F.getSection()] : 0);      Vals.push_back(getEncodedVisibility(F)); -    Vals.push_back(F->hasGC() ? GCMap[F->getGC()] : 0); -    Vals.push_back(F->hasUnnamedAddr()); -    Vals.push_back(F->hasPrefixData() ? (VE.getValueID(F->getPrefixData()) + 1) +    Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0); +    Vals.push_back(F.hasUnnamedAddr()); +    Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1)                                        : 0); +    Vals.push_back(getEncodedDLLStorageClass(F)); +    Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0);      unsigned AbbrevToUse = 0;      Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse); @@ -652,13 +697,15 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,    }    // Emit the alias information. -  for (Module::const_alias_iterator AI = M->alias_begin(), E = M->alias_end(); -       AI != E; ++AI) { +  for (const GlobalAlias &A : M->aliases()) {      // ALIAS: [alias type, aliasee val#, linkage, visibility] -    Vals.push_back(VE.getTypeID(AI->getType())); -    Vals.push_back(VE.getValueID(AI->getAliasee())); -    Vals.push_back(getEncodedLinkage(AI)); -    Vals.push_back(getEncodedVisibility(AI)); +    Vals.push_back(VE.getTypeID(A.getType())); +    Vals.push_back(VE.getValueID(A.getAliasee())); +    Vals.push_back(getEncodedLinkage(A)); +    Vals.push_back(getEncodedVisibility(A)); +    Vals.push_back(getEncodedDLLStorageClass(A)); +    Vals.push_back(getEncodedThreadLocalMode(A)); +    Vals.push_back(A.hasUnnamedAddr());      unsigned AbbrevToUse = 0;      Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse);      Vals.clear(); @@ -907,7 +954,7 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,    SmallVector<uint64_t, 64> Record;    const ValueEnumerator::ValueList &Vals = VE.getValues(); -  Type *LastTy = 0; +  Type *LastTy = nullptr;    for (unsigned i = FirstVal; i != LastVal; ++i) {      const Value *V = Vals[i].first;      // If we need to switch types, do so now. @@ -1077,12 +1124,14 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,          Code = bitc::CST_CODE_CE_EXTRACTELT;          Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));          Record.push_back(VE.getValueID(C->getOperand(0))); +        Record.push_back(VE.getTypeID(C->getOperand(1)->getType()));          Record.push_back(VE.getValueID(C->getOperand(1)));          break;        case Instruction::InsertElement:          Code = bitc::CST_CODE_CE_INSERTELT;          Record.push_back(VE.getValueID(C->getOperand(0)));          Record.push_back(VE.getValueID(C->getOperand(1))); +        Record.push_back(VE.getTypeID(C->getOperand(2)->getType()));          Record.push_back(VE.getValueID(C->getOperand(2)));          break;        case Instruction::ShuffleVector: @@ -1243,13 +1292,13 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,    case Instruction::ExtractElement:      Code = bitc::FUNC_CODE_INST_EXTRACTELT;      PushValueAndType(I.getOperand(0), InstID, Vals, VE); -    pushValue(I.getOperand(1), InstID, Vals, VE); +    PushValueAndType(I.getOperand(1), InstID, Vals, VE);      break;    case Instruction::InsertElement:      Code = bitc::FUNC_CODE_INST_INSERTELT;      PushValueAndType(I.getOperand(0), InstID, Vals, VE);      pushValue(I.getOperand(1), InstID, Vals, VE); -    pushValue(I.getOperand(2), InstID, Vals, VE); +    PushValueAndType(I.getOperand(2), InstID, Vals, VE);      break;    case Instruction::ShuffleVector:      Code = bitc::FUNC_CODE_INST_SHUFFLEVEC; @@ -1384,13 +1433,20 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,      break;    } -  case Instruction::Alloca: +  case Instruction::Alloca: {      Code = bitc::FUNC_CODE_INST_ALLOCA;      Vals.push_back(VE.getTypeID(I.getType()));      Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));      Vals.push_back(VE.getValueID(I.getOperand(0))); // size. -    Vals.push_back(Log2_32(cast<AllocaInst>(I).getAlignment())+1); +    const AllocaInst &AI = cast<AllocaInst>(I); +    unsigned AlignRecord = Log2_32(AI.getAlignment()) + 1; +    assert(Log2_32(Value::MaximumAlignment) + 1 < 1 << 5 && +           "not enough bits for maximum alignment"); +    assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64"); +    AlignRecord |= AI.isUsedWithInAlloca() << 5; +    Vals.push_back(AlignRecord);      break; +  }    case Instruction::Load:      if (cast<LoadInst>(I).isAtomic()) { @@ -1429,9 +1485,12 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,      pushValue(I.getOperand(2), InstID, Vals, VE);         // newval.      Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile());      Vals.push_back(GetEncodedOrdering( -                     cast<AtomicCmpXchgInst>(I).getOrdering())); +                     cast<AtomicCmpXchgInst>(I).getSuccessOrdering()));      Vals.push_back(GetEncodedSynchScope(                       cast<AtomicCmpXchgInst>(I).getSynchScope())); +    Vals.push_back(GetEncodedOrdering( +                     cast<AtomicCmpXchgInst>(I).getFailureOrdering())); +    Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak());      break;    case Instruction::AtomicRMW:      Code = bitc::FUNC_CODE_INST_ATOMICRMW; @@ -1457,7 +1516,8 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,      Code = bitc::FUNC_CODE_INST_CALL;      Vals.push_back(VE.getAttributeID(CI.getAttributes())); -    Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall())); +    Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()) | +                   unsigned(CI.isMustTailCall()) << 14);      PushValueAndType(CI.getCalledValue(), InstID, Vals, VE);  // Callee      // Emit value #'s for the fixed parameters. @@ -1795,17 +1855,10 @@ static void WriteUseList(const Value *V, const ValueEnumerator &VE,      return;    // Make a copy of the in-memory use-list for sorting. -  unsigned UseListSize = std::distance(V->use_begin(), V->use_end()); -  SmallVector<const User*, 8> UseList; -  UseList.reserve(UseListSize); -  for (Value::const_use_iterator I = V->use_begin(), E = V->use_end(); -       I != E; ++I) { -    const User *U = *I; -    UseList.push_back(U); -  } +  SmallVector<const User*, 8> UserList(V->user_begin(), V->user_end());    // Sort the copy based on the order read by the BitcodeReader. -  std::sort(UseList.begin(), UseList.end(), bitcodereader_order); +  std::sort(UserList.begin(), UserList.end(), bitcodereader_order);    // TODO: Generate a diff between the BitcodeWriter in-memory use-list and the    // sorted list (i.e., the expected BitcodeReader in-memory use-list). @@ -1903,6 +1956,8 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) {    // Emit information describing all of the types in the module.    WriteTypeTable(VE, Stream); +  writeComdats(VE, Stream); +    // Emit top-level description of module, including target triple, inline asm,    // descriptors for global variables, and function prototype info.    WriteModuleInfo(M, VE, Stream); diff --git a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp index e5e76e29bd2d..4167f6da509a 100644 --- a/contrib/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp +++ b/contrib/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp @@ -1,4 +1,4 @@ -//===--- Bitcode/Writer/BitcodeWriterPass.cpp - Bitcode Writer ------------===// +//===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -11,10 +11,18 @@  //  //===----------------------------------------------------------------------===// +#include "llvm/Bitcode/BitcodeWriterPass.h"  #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h"  #include "llvm/Pass.h"  using namespace llvm; +PreservedAnalyses BitcodeWriterPass::run(Module *M) { +  WriteBitcodeToFile(M, OS); +  return PreservedAnalyses::all(); +} +  namespace {    class WriteBitcodePass : public ModulePass {      raw_ostream &OS; // raw_ostream to print on @@ -23,9 +31,9 @@ namespace {      explicit WriteBitcodePass(raw_ostream &o)        : ModulePass(ID), OS(o) {} -    const char *getPassName() const { return "Bitcode Writer"; } +    const char *getPassName() const override { return "Bitcode Writer"; } -    bool runOnModule(Module &M) { +    bool runOnModule(Module &M) override {        WriteBitcodeToFile(&M, OS);        return false;      } @@ -34,8 +42,6 @@ namespace {  char WriteBitcodePass::ID = 0; -/// createBitcodeWriterPass - Create and return a pass that writes the module -/// to the specified ostream.  ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str) {    return new WriteBitcodePass(Str);  } diff --git a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp index a1641043b22a..15f8034a3691 100644 --- a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -73,37 +73,34 @@ ValueEnumerator::ValueEnumerator(const Module *M) {    SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;    // Enumerate types used by function bodies and argument lists. -  for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { - -    for (Function::const_arg_iterator I = F->arg_begin(), E = F->arg_end(); -         I != E; ++I) -      EnumerateType(I->getType()); - -    for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) -      for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E;++I){ -        for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); -             OI != E; ++OI) { -          if (MDNode *MD = dyn_cast<MDNode>(*OI)) +  for (const Function &F : *M) { +    for (const Argument &A : F.args()) +      EnumerateType(A.getType()); + +    for (const BasicBlock &BB : F) +      for (const Instruction &I : BB) { +        for (const Use &Op : I.operands()) { +          if (MDNode *MD = dyn_cast<MDNode>(&Op))              if (MD->isFunctionLocal() && MD->getFunction())                // These will get enumerated during function-incorporation.                continue; -          EnumerateOperandType(*OI); +          EnumerateOperandType(Op);          } -        EnumerateType(I->getType()); -        if (const CallInst *CI = dyn_cast<CallInst>(I)) +        EnumerateType(I.getType()); +        if (const CallInst *CI = dyn_cast<CallInst>(&I))            EnumerateAttributes(CI->getAttributes()); -        else if (const InvokeInst *II = dyn_cast<InvokeInst>(I)) +        else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I))            EnumerateAttributes(II->getAttributes());          // Enumerate metadata attached with this instruction.          MDs.clear(); -        I->getAllMetadataOtherThanDebugLoc(MDs); +        I.getAllMetadataOtherThanDebugLoc(MDs);          for (unsigned i = 0, e = MDs.size(); i != e; ++i)            EnumerateMetadata(MDs[i].second); -        if (!I->getDebugLoc().isUnknown()) { +        if (!I.getDebugLoc().isUnknown()) {            MDNode *Scope, *IA; -          I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext()); +          I.getDebugLoc().getScopeAndInlinedAt(Scope, IA, I.getContext());            if (Scope) EnumerateMetadata(Scope);            if (IA) EnumerateMetadata(IA);          } @@ -120,6 +117,12 @@ unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {    return I->second;  } +unsigned ValueEnumerator::getComdatID(const Comdat *C) const { +  unsigned ComdatID = Comdats.idFor(C); +  assert(ComdatID && "Comdat not found!"); +  return ComdatID; +} +  void ValueEnumerator::setInstructionID(const Instruction *I) {    InstructionMap[I] = InstructionCount++;  } @@ -159,12 +162,11 @@ void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map,      V->dump();      OS << " Uses(" << std::distance(V->use_begin(),V->use_end()) << "):"; -    for (Value::const_use_iterator UI = V->use_begin(), UE = V->use_end(); -         UI != UE; ++UI) { -      if (UI != V->use_begin()) +    for (const Use &U : V->uses()) { +      if (&U != &*V->use_begin())          OS << ","; -      if((*UI)->hasName()) -        OS << " " << (*UI)->getName(); +      if(U->hasName()) +        OS << " " << U->getName();        else          OS << " [null]"; @@ -173,29 +175,19 @@ void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map,    }  } -// Optimize constant ordering. -namespace { -  struct CstSortPredicate { -    ValueEnumerator &VE; -    explicit CstSortPredicate(ValueEnumerator &ve) : VE(ve) {} -    bool operator()(const std::pair<const Value*, unsigned> &LHS, -                    const std::pair<const Value*, unsigned> &RHS) { -      // Sort by plane. -      if (LHS.first->getType() != RHS.first->getType()) -        return VE.getTypeID(LHS.first->getType()) < -               VE.getTypeID(RHS.first->getType()); -      // Then by frequency. -      return LHS.second > RHS.second; -    } -  }; -} -  /// OptimizeConstants - Reorder constant pool for denser encoding.  void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {    if (CstStart == CstEnd || CstStart+1 == CstEnd) return; -  CstSortPredicate P(*this); -  std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd, P); +  std::stable_sort(Values.begin() + CstStart, Values.begin() + CstEnd, +                   [this](const std::pair<const Value *, unsigned> &LHS, +                          const std::pair<const Value *, unsigned> &RHS) { +    // Sort by plane. +    if (LHS.first->getType() != RHS.first->getType()) +      return getTypeID(LHS.first->getType()) < getTypeID(RHS.first->getType()); +    // Then by frequency. +    return LHS.second > RHS.second; +  });    // Ensure that integer and vector of integer constants are at the start of the    // constant pool.  This is important so that GEP structure indices come before @@ -321,6 +313,10 @@ void ValueEnumerator::EnumerateValue(const Value *V) {      return;    } +  if (auto *GO = dyn_cast<GlobalObject>(V)) +    if (const Comdat *C = GO->getComdat()) +      Comdats.insert(C); +    // Enumerate the type of this value.    EnumerateType(V->getType()); diff --git a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h index d1ca15f45d02..1c9f38e07b44 100644 --- a/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h +++ b/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h @@ -16,6 +16,7 @@  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/UniqueVector.h"  #include "llvm/IR/Attributes.h"  #include <vector> @@ -25,6 +26,7 @@ class Type;  class Value;  class Instruction;  class BasicBlock; +class Comdat;  class Function;  class Module;  class MDNode; @@ -48,6 +50,10 @@ private:    typedef DenseMap<const Value*, unsigned> ValueMapType;    ValueMapType ValueMap;    ValueList Values; + +  typedef UniqueVector<const Comdat *> ComdatSetType; +  ComdatSetType Comdats; +    ValueList MDValues;    SmallVector<const MDNode *, 8> FunctionLocalMDs;    ValueMapType MDValueMap; @@ -139,6 +145,9 @@ public:      return AttributeGroups;    } +  const ComdatSetType &getComdats() const { return Comdats; } +  unsigned getComdatID(const Comdat *C) const; +    /// getGlobalBasicBlockID - This returns the function-specific ID for the    /// specified basic block.  This is relatively expensive information, so it    /// should only be used by rare constructs such as address-of-label. diff --git a/contrib/llvm/lib/Bitcode/module.modulemap b/contrib/llvm/lib/Bitcode/module.modulemap new file mode 100644 index 000000000000..7df1a0a3c721 --- /dev/null +++ b/contrib/llvm/lib/Bitcode/module.modulemap @@ -0,0 +1 @@ +module Bitcode { requires cplusplus umbrella "." module * { export * } } | 
