X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FBitcode%2FReader%2FBitcodeReader.cpp;h=9c6a3d33a9b95a66c6edaa85a3e7cfb8f7509c65;hb=97bbaa3227679815b63533f73f07be777e7cc24b;hp=cc6180693610236f509d758bc1a93850b925a825;hpb=dad20b2ae2544708d6a33abdb9bddd0a329f50e0;p=oota-llvm.git diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index cc618069361..9c6a3d33a9b 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -100,26 +100,41 @@ static bool ConvertToString(ArrayRef Record, unsigned Idx, return false; } -static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) { +static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val) { switch (Val) { default: // Map unknown/new linkages to external - case 0: return GlobalValue::ExternalLinkage; - case 1: return GlobalValue::WeakAnyLinkage; - case 2: return GlobalValue::AppendingLinkage; - case 3: return GlobalValue::InternalLinkage; - case 4: return GlobalValue::LinkOnceAnyLinkage; - 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 0: + return GlobalValue::ExternalLinkage; + case 1: + return GlobalValue::WeakAnyLinkage; + case 2: + return GlobalValue::AppendingLinkage; + case 3: + return GlobalValue::InternalLinkage; + case 4: + return GlobalValue::LinkOnceAnyLinkage; + 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::PrivateLinkage; // Obsolete LinkerPrivateLinkage case 14: return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateWeakLinkage + case 15: + return GlobalValue::ExternalLinkage; // Obsolete LinkOnceODRAutoHideLinkage } } @@ -1091,6 +1106,7 @@ std::error_code BitcodeReader::ParseMetadata() { // Read a record. Record.clear(); unsigned Code = Stream.readRecord(Entry.ID, Record); + bool IsDistinct = false; switch (Code) { default: // Default behavior: ignore. break; @@ -1115,7 +1131,8 @@ std::error_code BitcodeReader::ParseMetadata() { } break; } - case bitc::METADATA_FN_NODE: { + case bitc::METADATA_OLD_FN_NODE: { + // FIXME: Remove in 4.0. // This is a LocalAsMetadata record, the only type of function-local // metadata. if (Record.size() % 2 == 1) @@ -1142,7 +1159,8 @@ std::error_code BitcodeReader::ParseMetadata() { NextMDValueNo++); break; } - case bitc::METADATA_NODE: { + case bitc::METADATA_OLD_NODE: { + // FIXME: Remove in 4.0. if (Record.size() % 2 == 1) return Error(BitcodeError::InvalidRecord); @@ -1166,6 +1184,32 @@ std::error_code BitcodeReader::ParseMetadata() { MDValueList.AssignValue(MDNode::get(Context, Elts), NextMDValueNo++); break; } + case bitc::METADATA_VALUE: { + if (Record.size() != 2) + return Error(BitcodeError::InvalidRecord); + + Type *Ty = getTypeByID(Record[0]); + if (Ty->isMetadataTy() || Ty->isVoidTy()) + return Error(BitcodeError::InvalidRecord); + + MDValueList.AssignValue( + ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), + NextMDValueNo++); + break; + } + case bitc::METADATA_DISTINCT_NODE: + IsDistinct = true; + // fallthrough... + case bitc::METADATA_NODE: { + SmallVector Elts; + Elts.reserve(Record.size()); + for (unsigned ID : Record) + Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr); + MDValueList.AssignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) + : MDNode::get(Context, Elts), + NextMDValueNo++); + break; + } case bitc::METADATA_STRING: { std::string String(Record.begin(), Record.end()); llvm::UpgradeMDStringConstant(String); @@ -2025,7 +2069,7 @@ std::error_code BitcodeReader::ParseModule(bool Resume) { Ty = cast(Ty)->getElementType(); bool isConstant = Record[1]; - GlobalValue::LinkageTypes Linkage = GetDecodedLinkage(Record[3]); + GlobalValue::LinkageTypes Linkage = getDecodedLinkage(Record[3]); unsigned Alignment = (1 << Record[4]) >> 1; std::string Section; if (Record[5]) { @@ -2099,7 +2143,7 @@ std::error_code BitcodeReader::ParseModule(bool Resume) { Func->setCallingConv(static_cast(Record[1])); bool isProto = Record[2]; - Func->setLinkage(GetDecodedLinkage(Record[3])); + Func->setLinkage(getDecodedLinkage(Record[3])); Func->setAttributes(getAttributes(Record[4])); Func->setAlignment((1 << Record[5]) >> 1); @@ -2164,7 +2208,7 @@ std::error_code BitcodeReader::ParseModule(bool Resume) { auto *NewGA = GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(), - GetDecodedLinkage(Record[2]), "", TheModule); + getDecodedLinkage(Record[2]), "", TheModule); // Old bitcode files didn't have visibility field. // Local linkage must have default visibility. if (Record.size() > 3 && !NewGA->hasLocalLinkage()) @@ -2516,7 +2560,7 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { I = nullptr; continue; - case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] + case bitc::FUNC_CODE_DEBUG_LOC_OLD: { // DEBUG_LOC_OLD: [line,col,scope,ia] I = nullptr; // Get the last instruction emitted. if (CurBB && !CurBB->empty()) I = &CurBB->back(); @@ -3506,12 +3550,13 @@ std::error_code BitcodeReader::InitStreamFromBuffer() { std::error_code BitcodeReader::InitLazyStream() { // Check and strip off the bitcode wrapper; BitstreamReader expects never to // see it. - StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); - StreamFile.reset(new BitstreamReader(Bytes)); + auto OwnedBytes = llvm::make_unique(LazyStreamer); + StreamingMemoryObject &Bytes = *OwnedBytes; + StreamFile = llvm::make_unique(std::move(OwnedBytes)); Stream.init(&*StreamFile); unsigned char buf[16]; - if (Bytes->readBytes(buf, 16, 0) != 16) + if (Bytes.readBytes(buf, 16, 0) != 16) return Error(BitcodeError::InvalidBitcodeSignature); if (!isBitcode(buf, buf + 16)) @@ -3521,8 +3566,8 @@ std::error_code BitcodeReader::InitLazyStream() { const unsigned char *bitcodeStart = buf; const unsigned char *bitcodeEnd = buf + 16; SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); - Bytes->dropLeadingBytes(bitcodeStart - buf); - Bytes->setKnownObjectSize(bitcodeEnd - bitcodeStart); + Bytes.dropLeadingBytes(bitcodeStart - buf); + Bytes.setKnownObjectSize(bitcodeEnd - bitcodeStart); } return std::error_code(); } @@ -3628,20 +3673,15 @@ llvm::getLazyBitcodeModule(std::unique_ptr &&Buffer, return getLazyBitcodeModuleImpl(std::move(Buffer), Context, false); } -Module *llvm::getStreamedBitcodeModule(const std::string &name, - DataStreamer *streamer, - LLVMContext &Context, - std::string *ErrMsg) { - Module *M = new Module(name, Context); - BitcodeReader *R = new BitcodeReader(streamer, Context); +ErrorOr> +llvm::getStreamedBitcodeModule(StringRef Name, DataStreamer *Streamer, + LLVMContext &Context) { + std::unique_ptr M = make_unique(Name, Context); + BitcodeReader *R = new BitcodeReader(Streamer, Context); M->setMaterializer(R); - if (std::error_code EC = R->ParseBitcodeInto(M)) { - if (ErrMsg) - *ErrMsg = EC.message(); - delete M; // Also deletes R. - return nullptr; - } - return M; + if (std::error_code EC = R->ParseBitcodeInto(M.get())) + return EC; + return std::move(M); } ErrorOr llvm::parseBitcodeFile(MemoryBufferRef Buffer,