1f22ef01cSRoman Divacky //===- BitcodeReader.cpp - Internal BitcodeReader implementation ----------===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky 10f22ef01cSRoman Divacky #include "llvm/Bitcode/ReaderWriter.h" 11ff0cc061SDimitry Andric #include "llvm/ADT/STLExtras.h" 12f22ef01cSRoman Divacky #include "llvm/ADT/SmallString.h" 13f22ef01cSRoman Divacky #include "llvm/ADT/SmallVector.h" 14ff0cc061SDimitry Andric #include "llvm/ADT/Triple.h" 15ff0cc061SDimitry Andric #include "llvm/Bitcode/BitstreamReader.h" 16f785676fSDimitry Andric #include "llvm/Bitcode/LLVMBitCodes.h" 1791bc56edSDimitry Andric #include "llvm/IR/AutoUpgrade.h" 18139f7f9bSDimitry Andric #include "llvm/IR/Constants.h" 19ff0cc061SDimitry Andric #include "llvm/IR/DebugInfo.h" 20ff0cc061SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 21139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h" 2239d628a0SDimitry Andric #include "llvm/IR/DiagnosticPrinter.h" 23ff0cc061SDimitry Andric #include "llvm/IR/GVMaterializer.h" 24139f7f9bSDimitry Andric #include "llvm/IR/InlineAsm.h" 25139f7f9bSDimitry Andric #include "llvm/IR/IntrinsicInst.h" 26f785676fSDimitry Andric #include "llvm/IR/LLVMContext.h" 27139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 28139f7f9bSDimitry Andric #include "llvm/IR/OperandTraits.h" 29139f7f9bSDimitry Andric #include "llvm/IR/Operator.h" 30ff0cc061SDimitry Andric #include "llvm/IR/ValueHandle.h" 31dff0c46cSDimitry Andric #include "llvm/Support/DataStream.h" 3239d628a0SDimitry Andric #include "llvm/Support/ManagedStatic.h" 33f22ef01cSRoman Divacky #include "llvm/Support/MathExtras.h" 34f22ef01cSRoman Divacky #include "llvm/Support/MemoryBuffer.h" 35f785676fSDimitry Andric #include "llvm/Support/raw_ostream.h" 36ff0cc061SDimitry Andric #include <deque> 37f22ef01cSRoman Divacky using namespace llvm; 38f22ef01cSRoman Divacky 39ff0cc061SDimitry Andric namespace { 407ae0e2c9SDimitry Andric enum { 417ae0e2c9SDimitry Andric SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex 427ae0e2c9SDimitry Andric }; 437ae0e2c9SDimitry Andric 44ff0cc061SDimitry Andric class BitcodeReaderValueList { 45ff0cc061SDimitry Andric std::vector<WeakVH> ValuePtrs; 46ff0cc061SDimitry Andric 47ff0cc061SDimitry Andric /// ResolveConstants - As we resolve forward-referenced constants, we add 48ff0cc061SDimitry Andric /// information about them to this vector. This allows us to resolve them in 49ff0cc061SDimitry Andric /// bulk instead of resolving each reference at a time. See the code in 50ff0cc061SDimitry Andric /// ResolveConstantForwardRefs for more information about this. 51ff0cc061SDimitry Andric /// 52ff0cc061SDimitry Andric /// The key of this vector is the placeholder constant, the value is the slot 53ff0cc061SDimitry Andric /// number that holds the resolved value. 54ff0cc061SDimitry Andric typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; 55ff0cc061SDimitry Andric ResolveConstantsTy ResolveConstants; 56ff0cc061SDimitry Andric LLVMContext &Context; 57ff0cc061SDimitry Andric public: 58ff0cc061SDimitry Andric BitcodeReaderValueList(LLVMContext &C) : Context(C) {} 59ff0cc061SDimitry Andric ~BitcodeReaderValueList() { 60ff0cc061SDimitry Andric assert(ResolveConstants.empty() && "Constants not resolved?"); 61ff0cc061SDimitry Andric } 62ff0cc061SDimitry Andric 63ff0cc061SDimitry Andric // vector compatibility methods 64ff0cc061SDimitry Andric unsigned size() const { return ValuePtrs.size(); } 65ff0cc061SDimitry Andric void resize(unsigned N) { ValuePtrs.resize(N); } 66ff0cc061SDimitry Andric void push_back(Value *V) { 67ff0cc061SDimitry Andric ValuePtrs.push_back(V); 68ff0cc061SDimitry Andric } 69ff0cc061SDimitry Andric 70ff0cc061SDimitry Andric void clear() { 71ff0cc061SDimitry Andric assert(ResolveConstants.empty() && "Constants not resolved?"); 72ff0cc061SDimitry Andric ValuePtrs.clear(); 73ff0cc061SDimitry Andric } 74ff0cc061SDimitry Andric 75ff0cc061SDimitry Andric Value *operator[](unsigned i) const { 76ff0cc061SDimitry Andric assert(i < ValuePtrs.size()); 77ff0cc061SDimitry Andric return ValuePtrs[i]; 78ff0cc061SDimitry Andric } 79ff0cc061SDimitry Andric 80ff0cc061SDimitry Andric Value *back() const { return ValuePtrs.back(); } 81ff0cc061SDimitry Andric void pop_back() { ValuePtrs.pop_back(); } 82ff0cc061SDimitry Andric bool empty() const { return ValuePtrs.empty(); } 83ff0cc061SDimitry Andric void shrinkTo(unsigned N) { 84ff0cc061SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!"); 85ff0cc061SDimitry Andric ValuePtrs.resize(N); 86ff0cc061SDimitry Andric } 87ff0cc061SDimitry Andric 88ff0cc061SDimitry Andric Constant *getConstantFwdRef(unsigned Idx, Type *Ty); 89ff0cc061SDimitry Andric Value *getValueFwdRef(unsigned Idx, Type *Ty); 90ff0cc061SDimitry Andric 91ff0cc061SDimitry Andric void AssignValue(Value *V, unsigned Idx); 92ff0cc061SDimitry Andric 93ff0cc061SDimitry Andric /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 94ff0cc061SDimitry Andric /// resolves any forward references. 95ff0cc061SDimitry Andric void ResolveConstantForwardRefs(); 96ff0cc061SDimitry Andric }; 97ff0cc061SDimitry Andric 98ff0cc061SDimitry Andric class BitcodeReaderMDValueList { 99ff0cc061SDimitry Andric unsigned NumFwdRefs; 100ff0cc061SDimitry Andric bool AnyFwdRefs; 101ff0cc061SDimitry Andric unsigned MinFwdRef; 102ff0cc061SDimitry Andric unsigned MaxFwdRef; 103ff0cc061SDimitry Andric std::vector<TrackingMDRef> MDValuePtrs; 104ff0cc061SDimitry Andric 105ff0cc061SDimitry Andric LLVMContext &Context; 106ff0cc061SDimitry Andric public: 107ff0cc061SDimitry Andric BitcodeReaderMDValueList(LLVMContext &C) 108ff0cc061SDimitry Andric : NumFwdRefs(0), AnyFwdRefs(false), Context(C) {} 109ff0cc061SDimitry Andric 110ff0cc061SDimitry Andric // vector compatibility methods 111ff0cc061SDimitry Andric unsigned size() const { return MDValuePtrs.size(); } 112ff0cc061SDimitry Andric void resize(unsigned N) { MDValuePtrs.resize(N); } 113ff0cc061SDimitry Andric void push_back(Metadata *MD) { MDValuePtrs.emplace_back(MD); } 114ff0cc061SDimitry Andric void clear() { MDValuePtrs.clear(); } 115ff0cc061SDimitry Andric Metadata *back() const { return MDValuePtrs.back(); } 116ff0cc061SDimitry Andric void pop_back() { MDValuePtrs.pop_back(); } 117ff0cc061SDimitry Andric bool empty() const { return MDValuePtrs.empty(); } 118ff0cc061SDimitry Andric 119ff0cc061SDimitry Andric Metadata *operator[](unsigned i) const { 120ff0cc061SDimitry Andric assert(i < MDValuePtrs.size()); 121ff0cc061SDimitry Andric return MDValuePtrs[i]; 122ff0cc061SDimitry Andric } 123ff0cc061SDimitry Andric 124ff0cc061SDimitry Andric void shrinkTo(unsigned N) { 125ff0cc061SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!"); 126ff0cc061SDimitry Andric MDValuePtrs.resize(N); 127ff0cc061SDimitry Andric } 128ff0cc061SDimitry Andric 129ff0cc061SDimitry Andric Metadata *getValueFwdRef(unsigned Idx); 130ff0cc061SDimitry Andric void AssignValue(Metadata *MD, unsigned Idx); 131ff0cc061SDimitry Andric void tryToResolveCycles(); 132ff0cc061SDimitry Andric }; 133ff0cc061SDimitry Andric 134ff0cc061SDimitry Andric class BitcodeReader : public GVMaterializer { 135ff0cc061SDimitry Andric LLVMContext &Context; 136ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler; 137ff0cc061SDimitry Andric Module *TheModule; 138ff0cc061SDimitry Andric std::unique_ptr<MemoryBuffer> Buffer; 139ff0cc061SDimitry Andric std::unique_ptr<BitstreamReader> StreamFile; 140ff0cc061SDimitry Andric BitstreamCursor Stream; 141ff0cc061SDimitry Andric DataStreamer *LazyStreamer; 142ff0cc061SDimitry Andric uint64_t NextUnreadBit; 143ff0cc061SDimitry Andric bool SeenValueSymbolTable; 144ff0cc061SDimitry Andric 145ff0cc061SDimitry Andric std::vector<Type*> TypeList; 146ff0cc061SDimitry Andric BitcodeReaderValueList ValueList; 147ff0cc061SDimitry Andric BitcodeReaderMDValueList MDValueList; 148ff0cc061SDimitry Andric std::vector<Comdat *> ComdatList; 149ff0cc061SDimitry Andric SmallVector<Instruction *, 64> InstructionList; 150ff0cc061SDimitry Andric 151ff0cc061SDimitry Andric std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 152ff0cc061SDimitry Andric std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 153ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixes; 154ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologues; 155ff0cc061SDimitry Andric 156ff0cc061SDimitry Andric SmallVector<Instruction*, 64> InstsWithTBAATag; 157ff0cc061SDimitry Andric 158ff0cc061SDimitry Andric /// MAttributes - The set of attributes by index. Index zero in the 159ff0cc061SDimitry Andric /// file is for null, and is thus not represented here. As such all indices 160ff0cc061SDimitry Andric /// are off by one. 161ff0cc061SDimitry Andric std::vector<AttributeSet> MAttributes; 162ff0cc061SDimitry Andric 163ff0cc061SDimitry Andric /// \brief The set of attribute groups. 164ff0cc061SDimitry Andric std::map<unsigned, AttributeSet> MAttributeGroups; 165ff0cc061SDimitry Andric 166ff0cc061SDimitry Andric /// FunctionBBs - While parsing a function body, this is a list of the basic 167ff0cc061SDimitry Andric /// blocks for the function. 168ff0cc061SDimitry Andric std::vector<BasicBlock*> FunctionBBs; 169ff0cc061SDimitry Andric 170ff0cc061SDimitry Andric // When reading the module header, this list is populated with functions that 171ff0cc061SDimitry Andric // have bodies later in the file. 172ff0cc061SDimitry Andric std::vector<Function*> FunctionsWithBodies; 173ff0cc061SDimitry Andric 174ff0cc061SDimitry Andric // When intrinsic functions are encountered which require upgrading they are 175ff0cc061SDimitry Andric // stored here with their replacement function. 176ff0cc061SDimitry Andric typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 177ff0cc061SDimitry Andric UpgradedIntrinsicMap UpgradedIntrinsics; 178ff0cc061SDimitry Andric 179ff0cc061SDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 180ff0cc061SDimitry Andric DenseMap<unsigned, unsigned> MDKindMap; 181ff0cc061SDimitry Andric 182ff0cc061SDimitry Andric // Several operations happen after the module header has been read, but 183ff0cc061SDimitry Andric // before function bodies are processed. This keeps track of whether 184ff0cc061SDimitry Andric // we've done this yet. 185ff0cc061SDimitry Andric bool SeenFirstFunctionBody; 186ff0cc061SDimitry Andric 187ff0cc061SDimitry Andric /// DeferredFunctionInfo - When function bodies are initially scanned, this 188ff0cc061SDimitry Andric /// map contains info about where to find deferred function body in the 189ff0cc061SDimitry Andric /// stream. 190ff0cc061SDimitry Andric DenseMap<Function*, uint64_t> DeferredFunctionInfo; 191ff0cc061SDimitry Andric 192ff0cc061SDimitry Andric /// When Metadata block is initially scanned when parsing the module, we may 193ff0cc061SDimitry Andric /// choose to defer parsing of the metadata. This vector contains info about 194ff0cc061SDimitry Andric /// which Metadata blocks are deferred. 195ff0cc061SDimitry Andric std::vector<uint64_t> DeferredMetadataInfo; 196ff0cc061SDimitry Andric 197ff0cc061SDimitry Andric /// These are basic blocks forward-referenced by block addresses. They are 198ff0cc061SDimitry Andric /// inserted lazily into functions when they're loaded. The basic block ID is 199ff0cc061SDimitry Andric /// its index into the vector. 200ff0cc061SDimitry Andric DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs; 201ff0cc061SDimitry Andric std::deque<Function *> BasicBlockFwdRefQueue; 202ff0cc061SDimitry Andric 203ff0cc061SDimitry Andric /// UseRelativeIDs - Indicates that we are using a new encoding for 204ff0cc061SDimitry Andric /// instruction operands where most operands in the current 205ff0cc061SDimitry Andric /// FUNCTION_BLOCK are encoded relative to the instruction number, 206ff0cc061SDimitry Andric /// for a more compact encoding. Some instruction operands are not 207ff0cc061SDimitry Andric /// relative to the instruction ID: basic block numbers, and types. 208ff0cc061SDimitry Andric /// Once the old style function blocks have been phased out, we would 209ff0cc061SDimitry Andric /// not need this flag. 210ff0cc061SDimitry Andric bool UseRelativeIDs; 211ff0cc061SDimitry Andric 212ff0cc061SDimitry Andric /// True if all functions will be materialized, negating the need to process 213ff0cc061SDimitry Andric /// (e.g.) blockaddress forward references. 214ff0cc061SDimitry Andric bool WillMaterializeAllForwardRefs; 215ff0cc061SDimitry Andric 216ff0cc061SDimitry Andric /// Functions that have block addresses taken. This is usually empty. 217ff0cc061SDimitry Andric SmallPtrSet<const Function *, 4> BlockAddressesTaken; 218ff0cc061SDimitry Andric 219ff0cc061SDimitry Andric /// True if any Metadata block has been materialized. 220ff0cc061SDimitry Andric bool IsMetadataMaterialized; 221ff0cc061SDimitry Andric 222ff0cc061SDimitry Andric bool StripDebugInfo = false; 223ff0cc061SDimitry Andric 224ff0cc061SDimitry Andric public: 225ff0cc061SDimitry Andric std::error_code Error(BitcodeError E, const Twine &Message); 226ff0cc061SDimitry Andric std::error_code Error(BitcodeError E); 227ff0cc061SDimitry Andric std::error_code Error(const Twine &Message); 228ff0cc061SDimitry Andric 229ff0cc061SDimitry Andric explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C, 230ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 231ff0cc061SDimitry Andric explicit BitcodeReader(DataStreamer *streamer, LLVMContext &C, 232ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 233ff0cc061SDimitry Andric ~BitcodeReader() override { FreeState(); } 234ff0cc061SDimitry Andric 235ff0cc061SDimitry Andric std::error_code materializeForwardReferencedFunctions(); 236ff0cc061SDimitry Andric 237ff0cc061SDimitry Andric void FreeState(); 238ff0cc061SDimitry Andric 239ff0cc061SDimitry Andric void releaseBuffer(); 240ff0cc061SDimitry Andric 241ff0cc061SDimitry Andric bool isDematerializable(const GlobalValue *GV) const override; 242ff0cc061SDimitry Andric std::error_code materialize(GlobalValue *GV) override; 243ff0cc061SDimitry Andric std::error_code materializeModule(Module *M) override; 244ff0cc061SDimitry Andric std::vector<StructType *> getIdentifiedStructTypes() const override; 245ff0cc061SDimitry Andric void dematerialize(GlobalValue *GV) override; 246ff0cc061SDimitry Andric 247ff0cc061SDimitry Andric /// @brief Main interface to parsing a bitcode buffer. 248ff0cc061SDimitry Andric /// @returns true if an error occurred. 249ff0cc061SDimitry Andric std::error_code ParseBitcodeInto(Module *M, 250ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false); 251ff0cc061SDimitry Andric 252ff0cc061SDimitry Andric /// @brief Cheap mechanism to just extract module triple 253ff0cc061SDimitry Andric /// @returns true if an error occurred. 254ff0cc061SDimitry Andric ErrorOr<std::string> parseTriple(); 255ff0cc061SDimitry Andric 256ff0cc061SDimitry Andric static uint64_t decodeSignRotatedValue(uint64_t V); 257ff0cc061SDimitry Andric 258ff0cc061SDimitry Andric /// Materialize any deferred Metadata block. 259ff0cc061SDimitry Andric std::error_code materializeMetadata() override; 260ff0cc061SDimitry Andric 261ff0cc061SDimitry Andric void setStripDebugInfo() override; 262ff0cc061SDimitry Andric 263ff0cc061SDimitry Andric private: 264ff0cc061SDimitry Andric std::vector<StructType *> IdentifiedStructTypes; 265ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name); 266ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context); 267ff0cc061SDimitry Andric 268ff0cc061SDimitry Andric Type *getTypeByID(unsigned ID); 269ff0cc061SDimitry Andric Value *getFnValueByID(unsigned ID, Type *Ty) { 270ff0cc061SDimitry Andric if (Ty && Ty->isMetadataTy()) 271ff0cc061SDimitry Andric return MetadataAsValue::get(Ty->getContext(), getFnMetadataByID(ID)); 272ff0cc061SDimitry Andric return ValueList.getValueFwdRef(ID, Ty); 273ff0cc061SDimitry Andric } 274ff0cc061SDimitry Andric Metadata *getFnMetadataByID(unsigned ID) { 275ff0cc061SDimitry Andric return MDValueList.getValueFwdRef(ID); 276ff0cc061SDimitry Andric } 277ff0cc061SDimitry Andric BasicBlock *getBasicBlock(unsigned ID) const { 278ff0cc061SDimitry Andric if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID 279ff0cc061SDimitry Andric return FunctionBBs[ID]; 280ff0cc061SDimitry Andric } 281ff0cc061SDimitry Andric AttributeSet getAttributes(unsigned i) const { 282ff0cc061SDimitry Andric if (i-1 < MAttributes.size()) 283ff0cc061SDimitry Andric return MAttributes[i-1]; 284ff0cc061SDimitry Andric return AttributeSet(); 285ff0cc061SDimitry Andric } 286ff0cc061SDimitry Andric 287ff0cc061SDimitry Andric /// getValueTypePair - Read a value/type pair out of the specified record from 288ff0cc061SDimitry Andric /// slot 'Slot'. Increment Slot past the number of slots used in the record. 289ff0cc061SDimitry Andric /// Return true on failure. 290ff0cc061SDimitry Andric bool getValueTypePair(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 291ff0cc061SDimitry Andric unsigned InstNum, Value *&ResVal) { 292ff0cc061SDimitry Andric if (Slot == Record.size()) return true; 293ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot++]; 294ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 295ff0cc061SDimitry Andric if (UseRelativeIDs) 296ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 297ff0cc061SDimitry Andric if (ValNo < InstNum) { 298ff0cc061SDimitry Andric // If this is not a forward reference, just return the value we already 299ff0cc061SDimitry Andric // have. 300ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, nullptr); 301ff0cc061SDimitry Andric return ResVal == nullptr; 302ff0cc061SDimitry Andric } 303ff0cc061SDimitry Andric if (Slot == Record.size()) 304ff0cc061SDimitry Andric return true; 305ff0cc061SDimitry Andric 306ff0cc061SDimitry Andric unsigned TypeNo = (unsigned)Record[Slot++]; 307ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 308ff0cc061SDimitry Andric return ResVal == nullptr; 309ff0cc061SDimitry Andric } 310ff0cc061SDimitry Andric 311ff0cc061SDimitry Andric /// popValue - Read a value out of the specified record from slot 'Slot'. 312ff0cc061SDimitry Andric /// Increment Slot past the number of slots used by the value in the record. 313ff0cc061SDimitry Andric /// Return true if there is an error. 314ff0cc061SDimitry Andric bool popValue(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 315ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 316ff0cc061SDimitry Andric if (getValue(Record, Slot, InstNum, Ty, ResVal)) 317ff0cc061SDimitry Andric return true; 318ff0cc061SDimitry Andric // All values currently take a single record slot. 319ff0cc061SDimitry Andric ++Slot; 320ff0cc061SDimitry Andric return false; 321ff0cc061SDimitry Andric } 322ff0cc061SDimitry Andric 323ff0cc061SDimitry Andric /// getValue -- Like popValue, but does not increment the Slot number. 324ff0cc061SDimitry Andric bool getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 325ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 326ff0cc061SDimitry Andric ResVal = getValue(Record, Slot, InstNum, Ty); 327ff0cc061SDimitry Andric return ResVal == nullptr; 328ff0cc061SDimitry Andric } 329ff0cc061SDimitry Andric 330ff0cc061SDimitry Andric /// getValue -- Version of getValue that returns ResVal directly, 331ff0cc061SDimitry Andric /// or 0 if there is an error. 332ff0cc061SDimitry Andric Value *getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 333ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 334ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 335ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot]; 336ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 337ff0cc061SDimitry Andric if (UseRelativeIDs) 338ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 339ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 340ff0cc061SDimitry Andric } 341ff0cc061SDimitry Andric 342ff0cc061SDimitry Andric /// getValueSigned -- Like getValue, but decodes signed VBRs. 343ff0cc061SDimitry Andric Value *getValueSigned(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 344ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 345ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 346ff0cc061SDimitry Andric unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]); 347ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 348ff0cc061SDimitry Andric if (UseRelativeIDs) 349ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 350ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 351ff0cc061SDimitry Andric } 352ff0cc061SDimitry Andric 353ff0cc061SDimitry Andric /// Converts alignment exponent (i.e. power of two (or zero)) to the 354ff0cc061SDimitry Andric /// corresponding alignment to use. If alignment is too large, returns 355ff0cc061SDimitry Andric /// a corresponding error code. 356ff0cc061SDimitry Andric std::error_code parseAlignmentValue(uint64_t Exponent, unsigned &Alignment); 357ff0cc061SDimitry Andric std::error_code ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); 358ff0cc061SDimitry Andric std::error_code ParseModule(bool Resume, bool ShouldLazyLoadMetadata = false); 359ff0cc061SDimitry Andric std::error_code ParseAttributeBlock(); 360ff0cc061SDimitry Andric std::error_code ParseAttributeGroupBlock(); 361ff0cc061SDimitry Andric std::error_code ParseTypeTable(); 362ff0cc061SDimitry Andric std::error_code ParseTypeTableBody(); 363ff0cc061SDimitry Andric 364ff0cc061SDimitry Andric std::error_code ParseValueSymbolTable(); 365ff0cc061SDimitry Andric std::error_code ParseConstants(); 366ff0cc061SDimitry Andric std::error_code RememberAndSkipFunctionBody(); 367ff0cc061SDimitry Andric /// Save the positions of the Metadata blocks and skip parsing the blocks. 368ff0cc061SDimitry Andric std::error_code rememberAndSkipMetadata(); 369ff0cc061SDimitry Andric std::error_code ParseFunctionBody(Function *F); 370ff0cc061SDimitry Andric std::error_code GlobalCleanup(); 371ff0cc061SDimitry Andric std::error_code ResolveGlobalAndAliasInits(); 372ff0cc061SDimitry Andric std::error_code ParseMetadata(); 373ff0cc061SDimitry Andric std::error_code ParseMetadataAttachment(Function &F); 374ff0cc061SDimitry Andric ErrorOr<std::string> parseModuleTriple(); 375ff0cc061SDimitry Andric std::error_code ParseUseLists(); 376ff0cc061SDimitry Andric std::error_code InitStream(); 377ff0cc061SDimitry Andric std::error_code InitStreamFromBuffer(); 378ff0cc061SDimitry Andric std::error_code InitLazyStream(); 379ff0cc061SDimitry Andric std::error_code FindFunctionInStream( 380ff0cc061SDimitry Andric Function *F, 381ff0cc061SDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator); 382ff0cc061SDimitry Andric }; 383ff0cc061SDimitry Andric } // namespace 384ff0cc061SDimitry Andric 38539d628a0SDimitry Andric BitcodeDiagnosticInfo::BitcodeDiagnosticInfo(std::error_code EC, 38639d628a0SDimitry Andric DiagnosticSeverity Severity, 38739d628a0SDimitry Andric const Twine &Msg) 38839d628a0SDimitry Andric : DiagnosticInfo(DK_Bitcode, Severity), Msg(Msg), EC(EC) {} 38939d628a0SDimitry Andric 39039d628a0SDimitry Andric void BitcodeDiagnosticInfo::print(DiagnosticPrinter &DP) const { DP << Msg; } 39139d628a0SDimitry Andric 39239d628a0SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 39339d628a0SDimitry Andric std::error_code EC, const Twine &Message) { 39439d628a0SDimitry Andric BitcodeDiagnosticInfo DI(EC, DS_Error, Message); 39539d628a0SDimitry Andric DiagnosticHandler(DI); 39639d628a0SDimitry Andric return EC; 397dff0c46cSDimitry Andric } 39839d628a0SDimitry Andric 39939d628a0SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 40039d628a0SDimitry Andric std::error_code EC) { 40139d628a0SDimitry Andric return Error(DiagnosticHandler, EC, EC.message()); 40239d628a0SDimitry Andric } 40339d628a0SDimitry Andric 404ff0cc061SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 405ff0cc061SDimitry Andric const Twine &Message) { 406ff0cc061SDimitry Andric return Error(DiagnosticHandler, 407ff0cc061SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 408ff0cc061SDimitry Andric } 409ff0cc061SDimitry Andric 41039d628a0SDimitry Andric std::error_code BitcodeReader::Error(BitcodeError E, const Twine &Message) { 41139d628a0SDimitry Andric return ::Error(DiagnosticHandler, make_error_code(E), Message); 41239d628a0SDimitry Andric } 41339d628a0SDimitry Andric 41439d628a0SDimitry Andric std::error_code BitcodeReader::Error(const Twine &Message) { 41539d628a0SDimitry Andric return ::Error(DiagnosticHandler, 41639d628a0SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 41739d628a0SDimitry Andric } 41839d628a0SDimitry Andric 41939d628a0SDimitry Andric std::error_code BitcodeReader::Error(BitcodeError E) { 42039d628a0SDimitry Andric return ::Error(DiagnosticHandler, make_error_code(E)); 42139d628a0SDimitry Andric } 42239d628a0SDimitry Andric 42339d628a0SDimitry Andric static DiagnosticHandlerFunction getDiagHandler(DiagnosticHandlerFunction F, 42439d628a0SDimitry Andric LLVMContext &C) { 42539d628a0SDimitry Andric if (F) 42639d628a0SDimitry Andric return F; 42739d628a0SDimitry Andric return [&C](const DiagnosticInfo &DI) { C.diagnose(DI); }; 42839d628a0SDimitry Andric } 42939d628a0SDimitry Andric 43039d628a0SDimitry Andric BitcodeReader::BitcodeReader(MemoryBuffer *buffer, LLVMContext &C, 43139d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 43239d628a0SDimitry Andric : Context(C), DiagnosticHandler(getDiagHandler(DiagnosticHandler, C)), 43339d628a0SDimitry Andric TheModule(nullptr), Buffer(buffer), LazyStreamer(nullptr), 43439d628a0SDimitry Andric NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), 43539d628a0SDimitry Andric MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false), 436ff0cc061SDimitry Andric WillMaterializeAllForwardRefs(false), IsMetadataMaterialized(false) {} 43739d628a0SDimitry Andric 43839d628a0SDimitry Andric BitcodeReader::BitcodeReader(DataStreamer *streamer, LLVMContext &C, 43939d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 44039d628a0SDimitry Andric : Context(C), DiagnosticHandler(getDiagHandler(DiagnosticHandler, C)), 44139d628a0SDimitry Andric TheModule(nullptr), Buffer(nullptr), LazyStreamer(streamer), 44239d628a0SDimitry Andric NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), 44339d628a0SDimitry Andric MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false), 444ff0cc061SDimitry Andric WillMaterializeAllForwardRefs(false), IsMetadataMaterialized(false) {} 44539d628a0SDimitry Andric 44639d628a0SDimitry Andric std::error_code BitcodeReader::materializeForwardReferencedFunctions() { 44739d628a0SDimitry Andric if (WillMaterializeAllForwardRefs) 44839d628a0SDimitry Andric return std::error_code(); 44939d628a0SDimitry Andric 45039d628a0SDimitry Andric // Prevent recursion. 45139d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 45239d628a0SDimitry Andric 45339d628a0SDimitry Andric while (!BasicBlockFwdRefQueue.empty()) { 45439d628a0SDimitry Andric Function *F = BasicBlockFwdRefQueue.front(); 45539d628a0SDimitry Andric BasicBlockFwdRefQueue.pop_front(); 45639d628a0SDimitry Andric assert(F && "Expected valid function"); 45739d628a0SDimitry Andric if (!BasicBlockFwdRefs.count(F)) 45839d628a0SDimitry Andric // Already materialized. 45939d628a0SDimitry Andric continue; 46039d628a0SDimitry Andric 46139d628a0SDimitry Andric // Check for a function that isn't materializable to prevent an infinite 46239d628a0SDimitry Andric // loop. When parsing a blockaddress stored in a global variable, there 46339d628a0SDimitry Andric // isn't a trivial way to check if a function will have a body without a 46439d628a0SDimitry Andric // linear search through FunctionsWithBodies, so just check it here. 46539d628a0SDimitry Andric if (!F->isMaterializable()) 46639d628a0SDimitry Andric return Error("Never resolved function from blockaddress"); 46739d628a0SDimitry Andric 46839d628a0SDimitry Andric // Try to materialize F. 46939d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 47039d628a0SDimitry Andric return EC; 47139d628a0SDimitry Andric } 47239d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Function missing from queue"); 47339d628a0SDimitry Andric 47439d628a0SDimitry Andric // Reset state. 47539d628a0SDimitry Andric WillMaterializeAllForwardRefs = false; 47639d628a0SDimitry Andric return std::error_code(); 477dff0c46cSDimitry Andric } 478dff0c46cSDimitry Andric 479f22ef01cSRoman Divacky void BitcodeReader::FreeState() { 48091bc56edSDimitry Andric Buffer = nullptr; 48117a519f9SDimitry Andric std::vector<Type*>().swap(TypeList); 482f22ef01cSRoman Divacky ValueList.clear(); 483f22ef01cSRoman Divacky MDValueList.clear(); 48491bc56edSDimitry Andric std::vector<Comdat *>().swap(ComdatList); 485f22ef01cSRoman Divacky 486139f7f9bSDimitry Andric std::vector<AttributeSet>().swap(MAttributes); 487f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 488f22ef01cSRoman Divacky std::vector<Function*>().swap(FunctionsWithBodies); 489f22ef01cSRoman Divacky DeferredFunctionInfo.clear(); 490ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 491e580952dSDimitry Andric MDKindMap.clear(); 4923861d79fSDimitry Andric 49339d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Unresolved blockaddress fwd references"); 49439d628a0SDimitry Andric BasicBlockFwdRefQueue.clear(); 495f22ef01cSRoman Divacky } 496f22ef01cSRoman Divacky 497f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 498f22ef01cSRoman Divacky // Helper functions to implement forward reference resolution, etc. 499f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 500f22ef01cSRoman Divacky 501f22ef01cSRoman Divacky /// ConvertToString - Convert a string from a record into an std::string, return 502f22ef01cSRoman Divacky /// true on failure. 503f22ef01cSRoman Divacky template<typename StrTy> 5047ae0e2c9SDimitry Andric static bool ConvertToString(ArrayRef<uint64_t> Record, unsigned Idx, 505f22ef01cSRoman Divacky StrTy &Result) { 506f22ef01cSRoman Divacky if (Idx > Record.size()) 507f22ef01cSRoman Divacky return true; 508f22ef01cSRoman Divacky 509f22ef01cSRoman Divacky for (unsigned i = Idx, e = Record.size(); i != e; ++i) 510f22ef01cSRoman Divacky Result += (char)Record[i]; 511f22ef01cSRoman Divacky return false; 512f22ef01cSRoman Divacky } 513f22ef01cSRoman Divacky 514ff0cc061SDimitry Andric static bool hasImplicitComdat(size_t Val) { 515ff0cc061SDimitry Andric switch (Val) { 516ff0cc061SDimitry Andric default: 517ff0cc061SDimitry Andric return false; 518ff0cc061SDimitry Andric case 1: // Old WeakAnyLinkage 519ff0cc061SDimitry Andric case 4: // Old LinkOnceAnyLinkage 520ff0cc061SDimitry Andric case 10: // Old WeakODRLinkage 521ff0cc061SDimitry Andric case 11: // Old LinkOnceODRLinkage 522ff0cc061SDimitry Andric return true; 523ff0cc061SDimitry Andric } 524ff0cc061SDimitry Andric } 525ff0cc061SDimitry Andric 52639d628a0SDimitry Andric static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val) { 527f22ef01cSRoman Divacky switch (Val) { 528f22ef01cSRoman Divacky default: // Map unknown/new linkages to external 52939d628a0SDimitry Andric case 0: 53039d628a0SDimitry Andric return GlobalValue::ExternalLinkage; 53139d628a0SDimitry Andric case 2: 53239d628a0SDimitry Andric return GlobalValue::AppendingLinkage; 53339d628a0SDimitry Andric case 3: 53439d628a0SDimitry Andric return GlobalValue::InternalLinkage; 53539d628a0SDimitry Andric case 5: 53639d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLImportLinkage 53739d628a0SDimitry Andric case 6: 53839d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLExportLinkage 53939d628a0SDimitry Andric case 7: 54039d628a0SDimitry Andric return GlobalValue::ExternalWeakLinkage; 54139d628a0SDimitry Andric case 8: 54239d628a0SDimitry Andric return GlobalValue::CommonLinkage; 54339d628a0SDimitry Andric case 9: 54439d628a0SDimitry Andric return GlobalValue::PrivateLinkage; 54539d628a0SDimitry Andric case 12: 54639d628a0SDimitry Andric return GlobalValue::AvailableExternallyLinkage; 54791bc56edSDimitry Andric case 13: 54891bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateLinkage 54991bc56edSDimitry Andric case 14: 55091bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateWeakLinkage 55139d628a0SDimitry Andric case 15: 55239d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete LinkOnceODRAutoHideLinkage 553ff0cc061SDimitry Andric case 1: // Old value with implicit comdat. 554ff0cc061SDimitry Andric case 16: 555ff0cc061SDimitry Andric return GlobalValue::WeakAnyLinkage; 556ff0cc061SDimitry Andric case 10: // Old value with implicit comdat. 557ff0cc061SDimitry Andric case 17: 558ff0cc061SDimitry Andric return GlobalValue::WeakODRLinkage; 559ff0cc061SDimitry Andric case 4: // Old value with implicit comdat. 560ff0cc061SDimitry Andric case 18: 561ff0cc061SDimitry Andric return GlobalValue::LinkOnceAnyLinkage; 562ff0cc061SDimitry Andric case 11: // Old value with implicit comdat. 563ff0cc061SDimitry Andric case 19: 564ff0cc061SDimitry Andric return GlobalValue::LinkOnceODRLinkage; 565f22ef01cSRoman Divacky } 566f22ef01cSRoman Divacky } 567f22ef01cSRoman Divacky 568f22ef01cSRoman Divacky static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) { 569f22ef01cSRoman Divacky switch (Val) { 570f22ef01cSRoman Divacky default: // Map unknown visibilities to default. 571f22ef01cSRoman Divacky case 0: return GlobalValue::DefaultVisibility; 572f22ef01cSRoman Divacky case 1: return GlobalValue::HiddenVisibility; 573f22ef01cSRoman Divacky case 2: return GlobalValue::ProtectedVisibility; 574f22ef01cSRoman Divacky } 575f22ef01cSRoman Divacky } 576f22ef01cSRoman Divacky 57791bc56edSDimitry Andric static GlobalValue::DLLStorageClassTypes 57891bc56edSDimitry Andric GetDecodedDLLStorageClass(unsigned Val) { 57991bc56edSDimitry Andric switch (Val) { 58091bc56edSDimitry Andric default: // Map unknown values to default. 58191bc56edSDimitry Andric case 0: return GlobalValue::DefaultStorageClass; 58291bc56edSDimitry Andric case 1: return GlobalValue::DLLImportStorageClass; 58391bc56edSDimitry Andric case 2: return GlobalValue::DLLExportStorageClass; 58491bc56edSDimitry Andric } 58591bc56edSDimitry Andric } 58691bc56edSDimitry Andric 5877ae0e2c9SDimitry Andric static GlobalVariable::ThreadLocalMode GetDecodedThreadLocalMode(unsigned Val) { 5887ae0e2c9SDimitry Andric switch (Val) { 5897ae0e2c9SDimitry Andric case 0: return GlobalVariable::NotThreadLocal; 5907ae0e2c9SDimitry Andric default: // Map unknown non-zero value to general dynamic. 5917ae0e2c9SDimitry Andric case 1: return GlobalVariable::GeneralDynamicTLSModel; 5927ae0e2c9SDimitry Andric case 2: return GlobalVariable::LocalDynamicTLSModel; 5937ae0e2c9SDimitry Andric case 3: return GlobalVariable::InitialExecTLSModel; 5947ae0e2c9SDimitry Andric case 4: return GlobalVariable::LocalExecTLSModel; 5957ae0e2c9SDimitry Andric } 5967ae0e2c9SDimitry Andric } 5977ae0e2c9SDimitry Andric 598f22ef01cSRoman Divacky static int GetDecodedCastOpcode(unsigned Val) { 599f22ef01cSRoman Divacky switch (Val) { 600f22ef01cSRoman Divacky default: return -1; 601f22ef01cSRoman Divacky case bitc::CAST_TRUNC : return Instruction::Trunc; 602f22ef01cSRoman Divacky case bitc::CAST_ZEXT : return Instruction::ZExt; 603f22ef01cSRoman Divacky case bitc::CAST_SEXT : return Instruction::SExt; 604f22ef01cSRoman Divacky case bitc::CAST_FPTOUI : return Instruction::FPToUI; 605f22ef01cSRoman Divacky case bitc::CAST_FPTOSI : return Instruction::FPToSI; 606f22ef01cSRoman Divacky case bitc::CAST_UITOFP : return Instruction::UIToFP; 607f22ef01cSRoman Divacky case bitc::CAST_SITOFP : return Instruction::SIToFP; 608f22ef01cSRoman Divacky case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; 609f22ef01cSRoman Divacky case bitc::CAST_FPEXT : return Instruction::FPExt; 610f22ef01cSRoman Divacky case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; 611f22ef01cSRoman Divacky case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; 612f22ef01cSRoman Divacky case bitc::CAST_BITCAST : return Instruction::BitCast; 613f785676fSDimitry Andric case bitc::CAST_ADDRSPACECAST: return Instruction::AddrSpaceCast; 614f22ef01cSRoman Divacky } 615f22ef01cSRoman Divacky } 616ff0cc061SDimitry Andric 6176122f3e6SDimitry Andric static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) { 618ff0cc061SDimitry Andric bool IsFP = Ty->isFPOrFPVectorTy(); 619ff0cc061SDimitry Andric // BinOps are only valid for int/fp or vector of int/fp types 620ff0cc061SDimitry Andric if (!IsFP && !Ty->isIntOrIntVectorTy()) 621ff0cc061SDimitry Andric return -1; 622ff0cc061SDimitry Andric 623f22ef01cSRoman Divacky switch (Val) { 624ff0cc061SDimitry Andric default: 625ff0cc061SDimitry Andric return -1; 626f22ef01cSRoman Divacky case bitc::BINOP_ADD: 627ff0cc061SDimitry Andric return IsFP ? Instruction::FAdd : Instruction::Add; 628f22ef01cSRoman Divacky case bitc::BINOP_SUB: 629ff0cc061SDimitry Andric return IsFP ? Instruction::FSub : Instruction::Sub; 630f22ef01cSRoman Divacky case bitc::BINOP_MUL: 631ff0cc061SDimitry Andric return IsFP ? Instruction::FMul : Instruction::Mul; 632ff0cc061SDimitry Andric case bitc::BINOP_UDIV: 633ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::UDiv; 634f22ef01cSRoman Divacky case bitc::BINOP_SDIV: 635ff0cc061SDimitry Andric return IsFP ? Instruction::FDiv : Instruction::SDiv; 636ff0cc061SDimitry Andric case bitc::BINOP_UREM: 637ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::URem; 638f22ef01cSRoman Divacky case bitc::BINOP_SREM: 639ff0cc061SDimitry Andric return IsFP ? Instruction::FRem : Instruction::SRem; 640ff0cc061SDimitry Andric case bitc::BINOP_SHL: 641ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Shl; 642ff0cc061SDimitry Andric case bitc::BINOP_LSHR: 643ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::LShr; 644ff0cc061SDimitry Andric case bitc::BINOP_ASHR: 645ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::AShr; 646ff0cc061SDimitry Andric case bitc::BINOP_AND: 647ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::And; 648ff0cc061SDimitry Andric case bitc::BINOP_OR: 649ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Or; 650ff0cc061SDimitry Andric case bitc::BINOP_XOR: 651ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Xor; 652f22ef01cSRoman Divacky } 653f22ef01cSRoman Divacky } 654f22ef01cSRoman Divacky 6556122f3e6SDimitry Andric static AtomicRMWInst::BinOp GetDecodedRMWOperation(unsigned Val) { 6566122f3e6SDimitry Andric switch (Val) { 6576122f3e6SDimitry Andric default: return AtomicRMWInst::BAD_BINOP; 6586122f3e6SDimitry Andric case bitc::RMW_XCHG: return AtomicRMWInst::Xchg; 6596122f3e6SDimitry Andric case bitc::RMW_ADD: return AtomicRMWInst::Add; 6606122f3e6SDimitry Andric case bitc::RMW_SUB: return AtomicRMWInst::Sub; 6616122f3e6SDimitry Andric case bitc::RMW_AND: return AtomicRMWInst::And; 6626122f3e6SDimitry Andric case bitc::RMW_NAND: return AtomicRMWInst::Nand; 6636122f3e6SDimitry Andric case bitc::RMW_OR: return AtomicRMWInst::Or; 6646122f3e6SDimitry Andric case bitc::RMW_XOR: return AtomicRMWInst::Xor; 6656122f3e6SDimitry Andric case bitc::RMW_MAX: return AtomicRMWInst::Max; 6666122f3e6SDimitry Andric case bitc::RMW_MIN: return AtomicRMWInst::Min; 6676122f3e6SDimitry Andric case bitc::RMW_UMAX: return AtomicRMWInst::UMax; 6686122f3e6SDimitry Andric case bitc::RMW_UMIN: return AtomicRMWInst::UMin; 6696122f3e6SDimitry Andric } 6706122f3e6SDimitry Andric } 6716122f3e6SDimitry Andric 6726122f3e6SDimitry Andric static AtomicOrdering GetDecodedOrdering(unsigned Val) { 6736122f3e6SDimitry Andric switch (Val) { 6746122f3e6SDimitry Andric case bitc::ORDERING_NOTATOMIC: return NotAtomic; 6756122f3e6SDimitry Andric case bitc::ORDERING_UNORDERED: return Unordered; 6766122f3e6SDimitry Andric case bitc::ORDERING_MONOTONIC: return Monotonic; 6776122f3e6SDimitry Andric case bitc::ORDERING_ACQUIRE: return Acquire; 6786122f3e6SDimitry Andric case bitc::ORDERING_RELEASE: return Release; 6796122f3e6SDimitry Andric case bitc::ORDERING_ACQREL: return AcquireRelease; 6806122f3e6SDimitry Andric default: // Map unknown orderings to sequentially-consistent. 6816122f3e6SDimitry Andric case bitc::ORDERING_SEQCST: return SequentiallyConsistent; 6826122f3e6SDimitry Andric } 6836122f3e6SDimitry Andric } 6846122f3e6SDimitry Andric 6856122f3e6SDimitry Andric static SynchronizationScope GetDecodedSynchScope(unsigned Val) { 6866122f3e6SDimitry Andric switch (Val) { 6876122f3e6SDimitry Andric case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; 6886122f3e6SDimitry Andric default: // Map unknown scopes to cross-thread. 6896122f3e6SDimitry Andric case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; 6906122f3e6SDimitry Andric } 6916122f3e6SDimitry Andric } 6926122f3e6SDimitry Andric 69391bc56edSDimitry Andric static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) { 69491bc56edSDimitry Andric switch (Val) { 69591bc56edSDimitry Andric default: // Map unknown selection kinds to any. 69691bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_ANY: 69791bc56edSDimitry Andric return Comdat::Any; 69891bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_EXACT_MATCH: 69991bc56edSDimitry Andric return Comdat::ExactMatch; 70091bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_LARGEST: 70191bc56edSDimitry Andric return Comdat::Largest; 70291bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES: 70391bc56edSDimitry Andric return Comdat::NoDuplicates; 70491bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_SAME_SIZE: 70591bc56edSDimitry Andric return Comdat::SameSize; 70691bc56edSDimitry Andric } 70791bc56edSDimitry Andric } 70891bc56edSDimitry Andric 70991bc56edSDimitry Andric static void UpgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) { 71091bc56edSDimitry Andric switch (Val) { 71191bc56edSDimitry Andric case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; 71291bc56edSDimitry Andric case 6: GV->setDLLStorageClass(GlobalValue::DLLExportStorageClass); break; 71391bc56edSDimitry Andric } 71491bc56edSDimitry Andric } 71591bc56edSDimitry Andric 716f22ef01cSRoman Divacky namespace llvm { 717f22ef01cSRoman Divacky namespace { 718f22ef01cSRoman Divacky /// @brief A class for maintaining the slot number definition 719f22ef01cSRoman Divacky /// as a placeholder for the actual definition for forward constants defs. 720f22ef01cSRoman Divacky class ConstantPlaceHolder : public ConstantExpr { 721ff0cc061SDimitry Andric void operator=(const ConstantPlaceHolder &) = delete; 722f22ef01cSRoman Divacky public: 723f22ef01cSRoman Divacky // allocate space for exactly one operand 724f22ef01cSRoman Divacky void *operator new(size_t s) { 725f22ef01cSRoman Divacky return User::operator new(s, 1); 726f22ef01cSRoman Divacky } 7276122f3e6SDimitry Andric explicit ConstantPlaceHolder(Type *Ty, LLVMContext& Context) 728f22ef01cSRoman Divacky : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { 729f22ef01cSRoman Divacky Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); 730f22ef01cSRoman Divacky } 731f22ef01cSRoman Divacky 732f22ef01cSRoman Divacky /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. 733f22ef01cSRoman Divacky static bool classof(const Value *V) { 734f22ef01cSRoman Divacky return isa<ConstantExpr>(V) && 735f22ef01cSRoman Divacky cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; 736f22ef01cSRoman Divacky } 737f22ef01cSRoman Divacky 738f22ef01cSRoman Divacky 739f22ef01cSRoman Divacky /// Provide fast operand accessors 74039d628a0SDimitry Andric DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 741f22ef01cSRoman Divacky }; 742f22ef01cSRoman Divacky } 743f22ef01cSRoman Divacky 744f22ef01cSRoman Divacky // FIXME: can we inherit this from ConstantExpr? 745f22ef01cSRoman Divacky template <> 7462754fe60SDimitry Andric struct OperandTraits<ConstantPlaceHolder> : 7472754fe60SDimitry Andric public FixedNumOperandTraits<ConstantPlaceHolder, 1> { 748f22ef01cSRoman Divacky }; 74939d628a0SDimitry Andric DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantPlaceHolder, Value) 750f22ef01cSRoman Divacky } 751f22ef01cSRoman Divacky 752f22ef01cSRoman Divacky 753f22ef01cSRoman Divacky void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { 754f22ef01cSRoman Divacky if (Idx == size()) { 755f22ef01cSRoman Divacky push_back(V); 756f22ef01cSRoman Divacky return; 757f22ef01cSRoman Divacky } 758f22ef01cSRoman Divacky 759f22ef01cSRoman Divacky if (Idx >= size()) 760f22ef01cSRoman Divacky resize(Idx+1); 761f22ef01cSRoman Divacky 762f22ef01cSRoman Divacky WeakVH &OldV = ValuePtrs[Idx]; 76391bc56edSDimitry Andric if (!OldV) { 764f22ef01cSRoman Divacky OldV = V; 765f22ef01cSRoman Divacky return; 766f22ef01cSRoman Divacky } 767f22ef01cSRoman Divacky 768f22ef01cSRoman Divacky // Handle constants and non-constants (e.g. instrs) differently for 769f22ef01cSRoman Divacky // efficiency. 770f22ef01cSRoman Divacky if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { 771f22ef01cSRoman Divacky ResolveConstants.push_back(std::make_pair(PHC, Idx)); 772f22ef01cSRoman Divacky OldV = V; 773f22ef01cSRoman Divacky } else { 774f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 775f22ef01cSRoman Divacky Value *PrevVal = OldV; 776f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 777f22ef01cSRoman Divacky delete PrevVal; 778f22ef01cSRoman Divacky } 779f22ef01cSRoman Divacky } 780f22ef01cSRoman Divacky 781f22ef01cSRoman Divacky 782f22ef01cSRoman Divacky Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, 7836122f3e6SDimitry Andric Type *Ty) { 784f22ef01cSRoman Divacky if (Idx >= size()) 785f22ef01cSRoman Divacky resize(Idx + 1); 786f22ef01cSRoman Divacky 787f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 788ff0cc061SDimitry Andric if (Ty != V->getType()) 789ff0cc061SDimitry Andric report_fatal_error("Type mismatch in constant table!"); 790f22ef01cSRoman Divacky return cast<Constant>(V); 791f22ef01cSRoman Divacky } 792f22ef01cSRoman Divacky 793f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 794f22ef01cSRoman Divacky Constant *C = new ConstantPlaceHolder(Ty, Context); 795f22ef01cSRoman Divacky ValuePtrs[Idx] = C; 796f22ef01cSRoman Divacky return C; 797f22ef01cSRoman Divacky } 798f22ef01cSRoman Divacky 7996122f3e6SDimitry Andric Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { 800ff0cc061SDimitry Andric // Bail out for a clearly invalid value. This would make us call resize(0) 801ff0cc061SDimitry Andric if (Idx == UINT_MAX) 802ff0cc061SDimitry Andric return nullptr; 803ff0cc061SDimitry Andric 804f22ef01cSRoman Divacky if (Idx >= size()) 805f22ef01cSRoman Divacky resize(Idx + 1); 806f22ef01cSRoman Divacky 807f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 808ff0cc061SDimitry Andric // If the types don't match, it's invalid. 809ff0cc061SDimitry Andric if (Ty && Ty != V->getType()) 810ff0cc061SDimitry Andric return nullptr; 811f22ef01cSRoman Divacky return V; 812f22ef01cSRoman Divacky } 813f22ef01cSRoman Divacky 814f22ef01cSRoman Divacky // No type specified, must be invalid reference. 81591bc56edSDimitry Andric if (!Ty) return nullptr; 816f22ef01cSRoman Divacky 817f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 818f22ef01cSRoman Divacky Value *V = new Argument(Ty); 819f22ef01cSRoman Divacky ValuePtrs[Idx] = V; 820f22ef01cSRoman Divacky return V; 821f22ef01cSRoman Divacky } 822f22ef01cSRoman Divacky 823f22ef01cSRoman Divacky /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 824f22ef01cSRoman Divacky /// resolves any forward references. The idea behind this is that we sometimes 825f22ef01cSRoman Divacky /// get constants (such as large arrays) which reference *many* forward ref 826f22ef01cSRoman Divacky /// constants. Replacing each of these causes a lot of thrashing when 827f22ef01cSRoman Divacky /// building/reuniquing the constant. Instead of doing this, we look at all the 828f22ef01cSRoman Divacky /// uses and rewrite all the place holders at once for any constant that uses 829f22ef01cSRoman Divacky /// a placeholder. 830f22ef01cSRoman Divacky void BitcodeReaderValueList::ResolveConstantForwardRefs() { 831f22ef01cSRoman Divacky // Sort the values by-pointer so that they are efficient to look up with a 832f22ef01cSRoman Divacky // binary search. 833f22ef01cSRoman Divacky std::sort(ResolveConstants.begin(), ResolveConstants.end()); 834f22ef01cSRoman Divacky 835f22ef01cSRoman Divacky SmallVector<Constant*, 64> NewOps; 836f22ef01cSRoman Divacky 837f22ef01cSRoman Divacky while (!ResolveConstants.empty()) { 838f22ef01cSRoman Divacky Value *RealVal = operator[](ResolveConstants.back().second); 839f22ef01cSRoman Divacky Constant *Placeholder = ResolveConstants.back().first; 840f22ef01cSRoman Divacky ResolveConstants.pop_back(); 841f22ef01cSRoman Divacky 842f22ef01cSRoman Divacky // Loop over all users of the placeholder, updating them to reference the 843f22ef01cSRoman Divacky // new value. If they reference more than one placeholder, update them all 844f22ef01cSRoman Divacky // at once. 845f22ef01cSRoman Divacky while (!Placeholder->use_empty()) { 84691bc56edSDimitry Andric auto UI = Placeholder->user_begin(); 847ffd1746dSEd Schouten User *U = *UI; 848f22ef01cSRoman Divacky 849f22ef01cSRoman Divacky // If the using object isn't uniqued, just update the operands. This 850f22ef01cSRoman Divacky // handles instructions and initializers for global variables. 851ffd1746dSEd Schouten if (!isa<Constant>(U) || isa<GlobalValue>(U)) { 852f22ef01cSRoman Divacky UI.getUse().set(RealVal); 853f22ef01cSRoman Divacky continue; 854f22ef01cSRoman Divacky } 855f22ef01cSRoman Divacky 856f22ef01cSRoman Divacky // Otherwise, we have a constant that uses the placeholder. Replace that 857f22ef01cSRoman Divacky // constant with a new constant that has *all* placeholder uses updated. 858ffd1746dSEd Schouten Constant *UserC = cast<Constant>(U); 859f22ef01cSRoman Divacky for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); 860f22ef01cSRoman Divacky I != E; ++I) { 861f22ef01cSRoman Divacky Value *NewOp; 862f22ef01cSRoman Divacky if (!isa<ConstantPlaceHolder>(*I)) { 863f22ef01cSRoman Divacky // Not a placeholder reference. 864f22ef01cSRoman Divacky NewOp = *I; 865f22ef01cSRoman Divacky } else if (*I == Placeholder) { 866f22ef01cSRoman Divacky // Common case is that it just references this one placeholder. 867f22ef01cSRoman Divacky NewOp = RealVal; 868f22ef01cSRoman Divacky } else { 869f22ef01cSRoman Divacky // Otherwise, look up the placeholder in ResolveConstants. 870f22ef01cSRoman Divacky ResolveConstantsTy::iterator It = 871f22ef01cSRoman Divacky std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), 872f22ef01cSRoman Divacky std::pair<Constant*, unsigned>(cast<Constant>(*I), 873f22ef01cSRoman Divacky 0)); 874f22ef01cSRoman Divacky assert(It != ResolveConstants.end() && It->first == *I); 875f22ef01cSRoman Divacky NewOp = operator[](It->second); 876f22ef01cSRoman Divacky } 877f22ef01cSRoman Divacky 878f22ef01cSRoman Divacky NewOps.push_back(cast<Constant>(NewOp)); 879f22ef01cSRoman Divacky } 880f22ef01cSRoman Divacky 881f22ef01cSRoman Divacky // Make the new constant. 882f22ef01cSRoman Divacky Constant *NewC; 883f22ef01cSRoman Divacky if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { 88417a519f9SDimitry Andric NewC = ConstantArray::get(UserCA->getType(), NewOps); 885f22ef01cSRoman Divacky } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { 88617a519f9SDimitry Andric NewC = ConstantStruct::get(UserCS->getType(), NewOps); 887f22ef01cSRoman Divacky } else if (isa<ConstantVector>(UserC)) { 8882754fe60SDimitry Andric NewC = ConstantVector::get(NewOps); 889f22ef01cSRoman Divacky } else { 890f22ef01cSRoman Divacky assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); 8913b0f4066SDimitry Andric NewC = cast<ConstantExpr>(UserC)->getWithOperands(NewOps); 892f22ef01cSRoman Divacky } 893f22ef01cSRoman Divacky 894f22ef01cSRoman Divacky UserC->replaceAllUsesWith(NewC); 895f22ef01cSRoman Divacky UserC->destroyConstant(); 896f22ef01cSRoman Divacky NewOps.clear(); 897f22ef01cSRoman Divacky } 898f22ef01cSRoman Divacky 899f22ef01cSRoman Divacky // Update all ValueHandles, they should be the only users at this point. 900f22ef01cSRoman Divacky Placeholder->replaceAllUsesWith(RealVal); 901f22ef01cSRoman Divacky delete Placeholder; 902f22ef01cSRoman Divacky } 903f22ef01cSRoman Divacky } 904f22ef01cSRoman Divacky 90539d628a0SDimitry Andric void BitcodeReaderMDValueList::AssignValue(Metadata *MD, unsigned Idx) { 906f22ef01cSRoman Divacky if (Idx == size()) { 90739d628a0SDimitry Andric push_back(MD); 908f22ef01cSRoman Divacky return; 909f22ef01cSRoman Divacky } 910f22ef01cSRoman Divacky 911f22ef01cSRoman Divacky if (Idx >= size()) 912f22ef01cSRoman Divacky resize(Idx+1); 913f22ef01cSRoman Divacky 91439d628a0SDimitry Andric TrackingMDRef &OldMD = MDValuePtrs[Idx]; 91539d628a0SDimitry Andric if (!OldMD) { 91639d628a0SDimitry Andric OldMD.reset(MD); 917f22ef01cSRoman Divacky return; 918f22ef01cSRoman Divacky } 919f22ef01cSRoman Divacky 920f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 921ff0cc061SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 92239d628a0SDimitry Andric PrevMD->replaceAllUsesWith(MD); 92339d628a0SDimitry Andric --NumFwdRefs; 924f22ef01cSRoman Divacky } 925f22ef01cSRoman Divacky 92639d628a0SDimitry Andric Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { 927f22ef01cSRoman Divacky if (Idx >= size()) 928f22ef01cSRoman Divacky resize(Idx + 1); 929f22ef01cSRoman Divacky 93039d628a0SDimitry Andric if (Metadata *MD = MDValuePtrs[Idx]) 93139d628a0SDimitry Andric return MD; 932f22ef01cSRoman Divacky 933b09980d1SDimitry Andric // Track forward refs to be resolved later. 934b09980d1SDimitry Andric if (AnyFwdRefs) { 935b09980d1SDimitry Andric MinFwdRef = std::min(MinFwdRef, Idx); 936b09980d1SDimitry Andric MaxFwdRef = std::max(MaxFwdRef, Idx); 937b09980d1SDimitry Andric } else { 93839d628a0SDimitry Andric AnyFwdRefs = true; 939b09980d1SDimitry Andric MinFwdRef = MaxFwdRef = Idx; 940b09980d1SDimitry Andric } 94139d628a0SDimitry Andric ++NumFwdRefs; 942b09980d1SDimitry Andric 943b09980d1SDimitry Andric // Create and return a placeholder, which will later be RAUW'd. 944ff0cc061SDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release(); 94539d628a0SDimitry Andric MDValuePtrs[Idx].reset(MD); 94639d628a0SDimitry Andric return MD; 94739d628a0SDimitry Andric } 94839d628a0SDimitry Andric 94939d628a0SDimitry Andric void BitcodeReaderMDValueList::tryToResolveCycles() { 95039d628a0SDimitry Andric if (!AnyFwdRefs) 95139d628a0SDimitry Andric // Nothing to do. 95239d628a0SDimitry Andric return; 95339d628a0SDimitry Andric 95439d628a0SDimitry Andric if (NumFwdRefs) 95539d628a0SDimitry Andric // Still forward references... can't resolve cycles. 95639d628a0SDimitry Andric return; 95739d628a0SDimitry Andric 95839d628a0SDimitry Andric // Resolve any cycles. 959b09980d1SDimitry Andric for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) { 960b09980d1SDimitry Andric auto &MD = MDValuePtrs[I]; 961ff0cc061SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 962ff0cc061SDimitry Andric if (!N) 963ff0cc061SDimitry Andric continue; 964ff0cc061SDimitry Andric 965ff0cc061SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference"); 96639d628a0SDimitry Andric N->resolveCycles(); 96739d628a0SDimitry Andric } 968b09980d1SDimitry Andric 969b09980d1SDimitry Andric // Make sure we return early again until there's another forward ref. 970b09980d1SDimitry Andric AnyFwdRefs = false; 971f22ef01cSRoman Divacky } 972f22ef01cSRoman Divacky 97317a519f9SDimitry Andric Type *BitcodeReader::getTypeByID(unsigned ID) { 97417a519f9SDimitry Andric // The type table size is always specified correctly. 97517a519f9SDimitry Andric if (ID >= TypeList.size()) 97691bc56edSDimitry Andric return nullptr; 977f22ef01cSRoman Divacky 97817a519f9SDimitry Andric if (Type *Ty = TypeList[ID]) 97917a519f9SDimitry Andric return Ty; 98017a519f9SDimitry Andric 98117a519f9SDimitry Andric // If we have a forward reference, the only possible case is when it is to a 98217a519f9SDimitry Andric // named struct. Just create a placeholder for now. 98339d628a0SDimitry Andric return TypeList[ID] = createIdentifiedStructType(Context); 98439d628a0SDimitry Andric } 98539d628a0SDimitry Andric 98639d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context, 98739d628a0SDimitry Andric StringRef Name) { 98839d628a0SDimitry Andric auto *Ret = StructType::create(Context, Name); 98939d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 99039d628a0SDimitry Andric return Ret; 99139d628a0SDimitry Andric } 99239d628a0SDimitry Andric 99339d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context) { 99439d628a0SDimitry Andric auto *Ret = StructType::create(Context); 99539d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 99639d628a0SDimitry Andric return Ret; 997f22ef01cSRoman Divacky } 998f22ef01cSRoman Divacky 99917a519f9SDimitry Andric 1000f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 1001f22ef01cSRoman Divacky // Functions for parsing blocks from the bitcode file 1002f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 1003f22ef01cSRoman Divacky 1004139f7f9bSDimitry Andric 1005139f7f9bSDimitry Andric /// \brief This fills an AttrBuilder object with the LLVM attributes that have 1006139f7f9bSDimitry Andric /// been decoded from the given integer. This function must stay in sync with 1007139f7f9bSDimitry Andric /// 'encodeLLVMAttributesForBitcode'. 1008139f7f9bSDimitry Andric static void decodeLLVMAttributesForBitcode(AttrBuilder &B, 1009139f7f9bSDimitry Andric uint64_t EncodedAttrs) { 1010139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1011139f7f9bSDimitry Andric 1012139f7f9bSDimitry Andric // The alignment is stored as a 16-bit raw value from bits 31--16. We shift 1013139f7f9bSDimitry Andric // the bits above 31 down by 11 bits. 1014139f7f9bSDimitry Andric unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; 1015139f7f9bSDimitry Andric assert((!Alignment || isPowerOf2_32(Alignment)) && 1016139f7f9bSDimitry Andric "Alignment must be a power of two."); 1017139f7f9bSDimitry Andric 1018139f7f9bSDimitry Andric if (Alignment) 1019139f7f9bSDimitry Andric B.addAlignmentAttr(Alignment); 1020139f7f9bSDimitry Andric B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | 1021139f7f9bSDimitry Andric (EncodedAttrs & 0xffff)); 1022139f7f9bSDimitry Andric } 1023139f7f9bSDimitry Andric 102491bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttributeBlock() { 1025f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) 102639d628a0SDimitry Andric return Error("Invalid record"); 1027f22ef01cSRoman Divacky 1028f22ef01cSRoman Divacky if (!MAttributes.empty()) 102939d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1030f22ef01cSRoman Divacky 1031f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1032f22ef01cSRoman Divacky 1033139f7f9bSDimitry Andric SmallVector<AttributeSet, 8> Attrs; 1034f22ef01cSRoman Divacky 1035f22ef01cSRoman Divacky // Read all the records. 1036f22ef01cSRoman Divacky while (1) { 1037139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1038139f7f9bSDimitry Andric 1039139f7f9bSDimitry Andric switch (Entry.Kind) { 1040139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1041139f7f9bSDimitry Andric case BitstreamEntry::Error: 104239d628a0SDimitry Andric return Error("Malformed block"); 1043139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 104491bc56edSDimitry Andric return std::error_code(); 1045139f7f9bSDimitry Andric case BitstreamEntry::Record: 1046139f7f9bSDimitry Andric // The interesting case. 1047139f7f9bSDimitry Andric break; 1048f22ef01cSRoman Divacky } 1049f22ef01cSRoman Divacky 1050f22ef01cSRoman Divacky // Read a record. 1051f22ef01cSRoman Divacky Record.clear(); 1052139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1053f22ef01cSRoman Divacky default: // Default behavior: ignore. 1054f22ef01cSRoman Divacky break; 1055139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] 1056139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1057f22ef01cSRoman Divacky if (Record.size() & 1) 105839d628a0SDimitry Andric return Error("Invalid record"); 1059f22ef01cSRoman Divacky 1060f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 1061139f7f9bSDimitry Andric AttrBuilder B; 1062139f7f9bSDimitry Andric decodeLLVMAttributesForBitcode(B, Record[i+1]); 1063139f7f9bSDimitry Andric Attrs.push_back(AttributeSet::get(Context, Record[i], B)); 1064f22ef01cSRoman Divacky } 1065f22ef01cSRoman Divacky 1066139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1067f22ef01cSRoman Divacky Attrs.clear(); 1068f22ef01cSRoman Divacky break; 1069f22ef01cSRoman Divacky } 1070139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] 1071139f7f9bSDimitry Andric for (unsigned i = 0, e = Record.size(); i != e; ++i) 1072139f7f9bSDimitry Andric Attrs.push_back(MAttributeGroups[Record[i]]); 1073139f7f9bSDimitry Andric 1074139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1075139f7f9bSDimitry Andric Attrs.clear(); 1076139f7f9bSDimitry Andric break; 1077139f7f9bSDimitry Andric } 1078139f7f9bSDimitry Andric } 1079139f7f9bSDimitry Andric } 1080139f7f9bSDimitry Andric } 1081139f7f9bSDimitry Andric 1082f785676fSDimitry Andric // Returns Attribute::None on unrecognized codes. 1083f785676fSDimitry Andric static Attribute::AttrKind GetAttrFromCode(uint64_t Code) { 1084f785676fSDimitry Andric switch (Code) { 1085f785676fSDimitry Andric default: 1086f785676fSDimitry Andric return Attribute::None; 1087f785676fSDimitry Andric case bitc::ATTR_KIND_ALIGNMENT: 1088f785676fSDimitry Andric return Attribute::Alignment; 1089f785676fSDimitry Andric case bitc::ATTR_KIND_ALWAYS_INLINE: 1090f785676fSDimitry Andric return Attribute::AlwaysInline; 1091f785676fSDimitry Andric case bitc::ATTR_KIND_BUILTIN: 1092f785676fSDimitry Andric return Attribute::Builtin; 1093f785676fSDimitry Andric case bitc::ATTR_KIND_BY_VAL: 1094f785676fSDimitry Andric return Attribute::ByVal; 109591bc56edSDimitry Andric case bitc::ATTR_KIND_IN_ALLOCA: 109691bc56edSDimitry Andric return Attribute::InAlloca; 1097f785676fSDimitry Andric case bitc::ATTR_KIND_COLD: 1098f785676fSDimitry Andric return Attribute::Cold; 1099ff0cc061SDimitry Andric case bitc::ATTR_KIND_CONVERGENT: 1100ff0cc061SDimitry Andric return Attribute::Convergent; 1101f785676fSDimitry Andric case bitc::ATTR_KIND_INLINE_HINT: 1102f785676fSDimitry Andric return Attribute::InlineHint; 1103f785676fSDimitry Andric case bitc::ATTR_KIND_IN_REG: 1104f785676fSDimitry Andric return Attribute::InReg; 110591bc56edSDimitry Andric case bitc::ATTR_KIND_JUMP_TABLE: 110691bc56edSDimitry Andric return Attribute::JumpTable; 1107f785676fSDimitry Andric case bitc::ATTR_KIND_MIN_SIZE: 1108f785676fSDimitry Andric return Attribute::MinSize; 1109f785676fSDimitry Andric case bitc::ATTR_KIND_NAKED: 1110f785676fSDimitry Andric return Attribute::Naked; 1111f785676fSDimitry Andric case bitc::ATTR_KIND_NEST: 1112f785676fSDimitry Andric return Attribute::Nest; 1113f785676fSDimitry Andric case bitc::ATTR_KIND_NO_ALIAS: 1114f785676fSDimitry Andric return Attribute::NoAlias; 1115f785676fSDimitry Andric case bitc::ATTR_KIND_NO_BUILTIN: 1116f785676fSDimitry Andric return Attribute::NoBuiltin; 1117f785676fSDimitry Andric case bitc::ATTR_KIND_NO_CAPTURE: 1118f785676fSDimitry Andric return Attribute::NoCapture; 1119f785676fSDimitry Andric case bitc::ATTR_KIND_NO_DUPLICATE: 1120f785676fSDimitry Andric return Attribute::NoDuplicate; 1121f785676fSDimitry Andric case bitc::ATTR_KIND_NO_IMPLICIT_FLOAT: 1122f785676fSDimitry Andric return Attribute::NoImplicitFloat; 1123f785676fSDimitry Andric case bitc::ATTR_KIND_NO_INLINE: 1124f785676fSDimitry Andric return Attribute::NoInline; 1125f785676fSDimitry Andric case bitc::ATTR_KIND_NON_LAZY_BIND: 1126f785676fSDimitry Andric return Attribute::NonLazyBind; 112791bc56edSDimitry Andric case bitc::ATTR_KIND_NON_NULL: 112891bc56edSDimitry Andric return Attribute::NonNull; 112991bc56edSDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE: 113091bc56edSDimitry Andric return Attribute::Dereferenceable; 1131ff0cc061SDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL: 1132ff0cc061SDimitry Andric return Attribute::DereferenceableOrNull; 1133f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RED_ZONE: 1134f785676fSDimitry Andric return Attribute::NoRedZone; 1135f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RETURN: 1136f785676fSDimitry Andric return Attribute::NoReturn; 1137f785676fSDimitry Andric case bitc::ATTR_KIND_NO_UNWIND: 1138f785676fSDimitry Andric return Attribute::NoUnwind; 1139f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: 1140f785676fSDimitry Andric return Attribute::OptimizeForSize; 1141f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_NONE: 1142f785676fSDimitry Andric return Attribute::OptimizeNone; 1143f785676fSDimitry Andric case bitc::ATTR_KIND_READ_NONE: 1144f785676fSDimitry Andric return Attribute::ReadNone; 1145f785676fSDimitry Andric case bitc::ATTR_KIND_READ_ONLY: 1146f785676fSDimitry Andric return Attribute::ReadOnly; 1147f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNED: 1148f785676fSDimitry Andric return Attribute::Returned; 1149f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNS_TWICE: 1150f785676fSDimitry Andric return Attribute::ReturnsTwice; 1151f785676fSDimitry Andric case bitc::ATTR_KIND_S_EXT: 1152f785676fSDimitry Andric return Attribute::SExt; 1153f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_ALIGNMENT: 1154f785676fSDimitry Andric return Attribute::StackAlignment; 1155f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT: 1156f785676fSDimitry Andric return Attribute::StackProtect; 1157f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_REQ: 1158f785676fSDimitry Andric return Attribute::StackProtectReq; 1159f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_STRONG: 1160f785676fSDimitry Andric return Attribute::StackProtectStrong; 1161f785676fSDimitry Andric case bitc::ATTR_KIND_STRUCT_RET: 1162f785676fSDimitry Andric return Attribute::StructRet; 1163f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_ADDRESS: 1164f785676fSDimitry Andric return Attribute::SanitizeAddress; 1165f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_THREAD: 1166f785676fSDimitry Andric return Attribute::SanitizeThread; 1167f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_MEMORY: 1168f785676fSDimitry Andric return Attribute::SanitizeMemory; 1169f785676fSDimitry Andric case bitc::ATTR_KIND_UW_TABLE: 1170f785676fSDimitry Andric return Attribute::UWTable; 1171f785676fSDimitry Andric case bitc::ATTR_KIND_Z_EXT: 1172f785676fSDimitry Andric return Attribute::ZExt; 1173f785676fSDimitry Andric } 1174f785676fSDimitry Andric } 1175f785676fSDimitry Andric 1176ff0cc061SDimitry Andric std::error_code BitcodeReader::parseAlignmentValue(uint64_t Exponent, 1177ff0cc061SDimitry Andric unsigned &Alignment) { 1178ff0cc061SDimitry Andric // Note: Alignment in bitcode files is incremented by 1, so that zero 1179ff0cc061SDimitry Andric // can be used for default alignment. 1180ff0cc061SDimitry Andric if (Exponent > Value::MaxAlignmentExponent + 1) 1181ff0cc061SDimitry Andric return Error("Invalid alignment value"); 1182ff0cc061SDimitry Andric Alignment = (1 << static_cast<unsigned>(Exponent)) >> 1; 1183ff0cc061SDimitry Andric return std::error_code(); 1184ff0cc061SDimitry Andric } 1185ff0cc061SDimitry Andric 118691bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttrKind(uint64_t Code, 1187f785676fSDimitry Andric Attribute::AttrKind *Kind) { 1188f785676fSDimitry Andric *Kind = GetAttrFromCode(Code); 1189f785676fSDimitry Andric if (*Kind == Attribute::None) 119039d628a0SDimitry Andric return Error(BitcodeError::CorruptedBitcode, 119139d628a0SDimitry Andric "Unknown attribute kind (" + Twine(Code) + ")"); 119291bc56edSDimitry Andric return std::error_code(); 1193f785676fSDimitry Andric } 1194f785676fSDimitry Andric 119591bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttributeGroupBlock() { 1196139f7f9bSDimitry Andric if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) 119739d628a0SDimitry Andric return Error("Invalid record"); 1198139f7f9bSDimitry Andric 1199139f7f9bSDimitry Andric if (!MAttributeGroups.empty()) 120039d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1201139f7f9bSDimitry Andric 1202139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 1203139f7f9bSDimitry Andric 1204139f7f9bSDimitry Andric // Read all the records. 1205139f7f9bSDimitry Andric while (1) { 1206139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1207139f7f9bSDimitry Andric 1208139f7f9bSDimitry Andric switch (Entry.Kind) { 1209139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1210139f7f9bSDimitry Andric case BitstreamEntry::Error: 121139d628a0SDimitry Andric return Error("Malformed block"); 1212139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 121391bc56edSDimitry Andric return std::error_code(); 1214139f7f9bSDimitry Andric case BitstreamEntry::Record: 1215139f7f9bSDimitry Andric // The interesting case. 1216139f7f9bSDimitry Andric break; 1217139f7f9bSDimitry Andric } 1218139f7f9bSDimitry Andric 1219139f7f9bSDimitry Andric // Read a record. 1220139f7f9bSDimitry Andric Record.clear(); 1221139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1222139f7f9bSDimitry Andric default: // Default behavior: ignore. 1223139f7f9bSDimitry Andric break; 1224139f7f9bSDimitry Andric case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] 1225139f7f9bSDimitry Andric if (Record.size() < 3) 122639d628a0SDimitry Andric return Error("Invalid record"); 1227139f7f9bSDimitry Andric 1228139f7f9bSDimitry Andric uint64_t GrpID = Record[0]; 1229139f7f9bSDimitry Andric uint64_t Idx = Record[1]; // Index of the object this attribute refers to. 1230139f7f9bSDimitry Andric 1231139f7f9bSDimitry Andric AttrBuilder B; 1232139f7f9bSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1233139f7f9bSDimitry Andric if (Record[i] == 0) { // Enum attribute 1234f785676fSDimitry Andric Attribute::AttrKind Kind; 123591bc56edSDimitry Andric if (std::error_code EC = ParseAttrKind(Record[++i], &Kind)) 1236f785676fSDimitry Andric return EC; 1237f785676fSDimitry Andric 1238f785676fSDimitry Andric B.addAttribute(Kind); 123991bc56edSDimitry Andric } else if (Record[i] == 1) { // Integer attribute 1240f785676fSDimitry Andric Attribute::AttrKind Kind; 124191bc56edSDimitry Andric if (std::error_code EC = ParseAttrKind(Record[++i], &Kind)) 1242f785676fSDimitry Andric return EC; 1243f785676fSDimitry Andric if (Kind == Attribute::Alignment) 1244139f7f9bSDimitry Andric B.addAlignmentAttr(Record[++i]); 124591bc56edSDimitry Andric else if (Kind == Attribute::StackAlignment) 1246139f7f9bSDimitry Andric B.addStackAlignmentAttr(Record[++i]); 124791bc56edSDimitry Andric else if (Kind == Attribute::Dereferenceable) 124891bc56edSDimitry Andric B.addDereferenceableAttr(Record[++i]); 1249ff0cc061SDimitry Andric else if (Kind == Attribute::DereferenceableOrNull) 1250ff0cc061SDimitry Andric B.addDereferenceableOrNullAttr(Record[++i]); 1251139f7f9bSDimitry Andric } else { // String attribute 1252139f7f9bSDimitry Andric assert((Record[i] == 3 || Record[i] == 4) && 1253139f7f9bSDimitry Andric "Invalid attribute group entry"); 1254139f7f9bSDimitry Andric bool HasValue = (Record[i++] == 4); 1255139f7f9bSDimitry Andric SmallString<64> KindStr; 1256139f7f9bSDimitry Andric SmallString<64> ValStr; 1257139f7f9bSDimitry Andric 1258139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1259139f7f9bSDimitry Andric KindStr += Record[i++]; 1260139f7f9bSDimitry Andric assert(Record[i] == 0 && "Kind string not null terminated"); 1261139f7f9bSDimitry Andric 1262139f7f9bSDimitry Andric if (HasValue) { 1263139f7f9bSDimitry Andric // Has a value associated with it. 1264139f7f9bSDimitry Andric ++i; // Skip the '0' that terminates the "kind" string. 1265139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1266139f7f9bSDimitry Andric ValStr += Record[i++]; 1267139f7f9bSDimitry Andric assert(Record[i] == 0 && "Value string not null terminated"); 1268139f7f9bSDimitry Andric } 1269139f7f9bSDimitry Andric 1270139f7f9bSDimitry Andric B.addAttribute(KindStr.str(), ValStr.str()); 1271139f7f9bSDimitry Andric } 1272139f7f9bSDimitry Andric } 1273139f7f9bSDimitry Andric 1274139f7f9bSDimitry Andric MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); 1275139f7f9bSDimitry Andric break; 1276139f7f9bSDimitry Andric } 1277f22ef01cSRoman Divacky } 1278f22ef01cSRoman Divacky } 1279f22ef01cSRoman Divacky } 1280f22ef01cSRoman Divacky 128191bc56edSDimitry Andric std::error_code BitcodeReader::ParseTypeTable() { 128217a519f9SDimitry Andric if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) 128339d628a0SDimitry Andric return Error("Invalid record"); 1284f22ef01cSRoman Divacky 128517a519f9SDimitry Andric return ParseTypeTableBody(); 128617a519f9SDimitry Andric } 128717a519f9SDimitry Andric 128891bc56edSDimitry Andric std::error_code BitcodeReader::ParseTypeTableBody() { 1289f22ef01cSRoman Divacky if (!TypeList.empty()) 129039d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1291f22ef01cSRoman Divacky 1292f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1293f22ef01cSRoman Divacky unsigned NumRecords = 0; 1294f22ef01cSRoman Divacky 129517a519f9SDimitry Andric SmallString<64> TypeName; 129617a519f9SDimitry Andric 1297f22ef01cSRoman Divacky // Read all the records for this type table. 1298f22ef01cSRoman Divacky while (1) { 1299139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1300139f7f9bSDimitry Andric 1301139f7f9bSDimitry Andric switch (Entry.Kind) { 1302139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1303139f7f9bSDimitry Andric case BitstreamEntry::Error: 130439d628a0SDimitry Andric return Error("Malformed block"); 1305139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1306f22ef01cSRoman Divacky if (NumRecords != TypeList.size()) 130739d628a0SDimitry Andric return Error("Malformed block"); 130891bc56edSDimitry Andric return std::error_code(); 1309139f7f9bSDimitry Andric case BitstreamEntry::Record: 1310139f7f9bSDimitry Andric // The interesting case. 1311139f7f9bSDimitry Andric break; 1312f22ef01cSRoman Divacky } 1313f22ef01cSRoman Divacky 1314f22ef01cSRoman Divacky // Read a record. 1315f22ef01cSRoman Divacky Record.clear(); 131691bc56edSDimitry Andric Type *ResultTy = nullptr; 1317139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1318f785676fSDimitry Andric default: 131939d628a0SDimitry Andric return Error("Invalid value"); 1320f22ef01cSRoman Divacky case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] 1321f22ef01cSRoman Divacky // TYPE_CODE_NUMENTRY contains a count of the number of types in the 1322f22ef01cSRoman Divacky // type list. This allows us to reserve space. 1323f22ef01cSRoman Divacky if (Record.size() < 1) 132439d628a0SDimitry Andric return Error("Invalid record"); 132517a519f9SDimitry Andric TypeList.resize(Record[0]); 1326f22ef01cSRoman Divacky continue; 1327f22ef01cSRoman Divacky case bitc::TYPE_CODE_VOID: // VOID 1328f22ef01cSRoman Divacky ResultTy = Type::getVoidTy(Context); 1329f22ef01cSRoman Divacky break; 1330dff0c46cSDimitry Andric case bitc::TYPE_CODE_HALF: // HALF 1331dff0c46cSDimitry Andric ResultTy = Type::getHalfTy(Context); 1332dff0c46cSDimitry Andric break; 1333f22ef01cSRoman Divacky case bitc::TYPE_CODE_FLOAT: // FLOAT 1334f22ef01cSRoman Divacky ResultTy = Type::getFloatTy(Context); 1335f22ef01cSRoman Divacky break; 1336f22ef01cSRoman Divacky case bitc::TYPE_CODE_DOUBLE: // DOUBLE 1337f22ef01cSRoman Divacky ResultTy = Type::getDoubleTy(Context); 1338f22ef01cSRoman Divacky break; 1339f22ef01cSRoman Divacky case bitc::TYPE_CODE_X86_FP80: // X86_FP80 1340f22ef01cSRoman Divacky ResultTy = Type::getX86_FP80Ty(Context); 1341f22ef01cSRoman Divacky break; 1342f22ef01cSRoman Divacky case bitc::TYPE_CODE_FP128: // FP128 1343f22ef01cSRoman Divacky ResultTy = Type::getFP128Ty(Context); 1344f22ef01cSRoman Divacky break; 1345f22ef01cSRoman Divacky case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 1346f22ef01cSRoman Divacky ResultTy = Type::getPPC_FP128Ty(Context); 1347f22ef01cSRoman Divacky break; 1348f22ef01cSRoman Divacky case bitc::TYPE_CODE_LABEL: // LABEL 1349f22ef01cSRoman Divacky ResultTy = Type::getLabelTy(Context); 1350f22ef01cSRoman Divacky break; 1351f22ef01cSRoman Divacky case bitc::TYPE_CODE_METADATA: // METADATA 1352f22ef01cSRoman Divacky ResultTy = Type::getMetadataTy(Context); 1353f22ef01cSRoman Divacky break; 13542754fe60SDimitry Andric case bitc::TYPE_CODE_X86_MMX: // X86_MMX 13552754fe60SDimitry Andric ResultTy = Type::getX86_MMXTy(Context); 13562754fe60SDimitry Andric break; 1357ff0cc061SDimitry Andric case bitc::TYPE_CODE_INTEGER: { // INTEGER: [width] 1358f22ef01cSRoman Divacky if (Record.size() < 1) 135939d628a0SDimitry Andric return Error("Invalid record"); 1360f22ef01cSRoman Divacky 1361ff0cc061SDimitry Andric uint64_t NumBits = Record[0]; 1362ff0cc061SDimitry Andric if (NumBits < IntegerType::MIN_INT_BITS || 1363ff0cc061SDimitry Andric NumBits > IntegerType::MAX_INT_BITS) 1364ff0cc061SDimitry Andric return Error("Bitwidth for integer type out of range"); 1365ff0cc061SDimitry Andric ResultTy = IntegerType::get(Context, NumBits); 1366f22ef01cSRoman Divacky break; 1367ff0cc061SDimitry Andric } 1368f22ef01cSRoman Divacky case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or 1369f22ef01cSRoman Divacky // [pointee type, address space] 1370f22ef01cSRoman Divacky if (Record.size() < 1) 137139d628a0SDimitry Andric return Error("Invalid record"); 1372f22ef01cSRoman Divacky unsigned AddressSpace = 0; 1373f22ef01cSRoman Divacky if (Record.size() == 2) 1374f22ef01cSRoman Divacky AddressSpace = Record[1]; 137517a519f9SDimitry Andric ResultTy = getTypeByID(Record[0]); 1376ff0cc061SDimitry Andric if (!ResultTy || 1377ff0cc061SDimitry Andric !PointerType::isValidElementType(ResultTy)) 137839d628a0SDimitry Andric return Error("Invalid type"); 137917a519f9SDimitry Andric ResultTy = PointerType::get(ResultTy, AddressSpace); 1380f22ef01cSRoman Divacky break; 1381f22ef01cSRoman Divacky } 1382dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION_OLD: { 13837ae0e2c9SDimitry Andric // FIXME: attrid is dead, remove it in LLVM 4.0 1384f22ef01cSRoman Divacky // FUNCTION: [vararg, attrid, retty, paramty x N] 1385f22ef01cSRoman Divacky if (Record.size() < 3) 138639d628a0SDimitry Andric return Error("Invalid record"); 1387dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 138817a519f9SDimitry Andric for (unsigned i = 3, e = Record.size(); i != e; ++i) { 138917a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 139017a519f9SDimitry Andric ArgTys.push_back(T); 139117a519f9SDimitry Andric else 1392f22ef01cSRoman Divacky break; 1393f22ef01cSRoman Divacky } 139417a519f9SDimitry Andric 139517a519f9SDimitry Andric ResultTy = getTypeByID(Record[2]); 139691bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-3) 139739d628a0SDimitry Andric return Error("Invalid type"); 139817a519f9SDimitry Andric 139917a519f9SDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 140017a519f9SDimitry Andric break; 140117a519f9SDimitry Andric } 1402dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION: { 1403dff0c46cSDimitry Andric // FUNCTION: [vararg, retty, paramty x N] 1404dff0c46cSDimitry Andric if (Record.size() < 2) 140539d628a0SDimitry Andric return Error("Invalid record"); 1406dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 1407dff0c46cSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1408ff0cc061SDimitry Andric if (Type *T = getTypeByID(Record[i])) { 1409ff0cc061SDimitry Andric if (!FunctionType::isValidArgumentType(T)) 1410ff0cc061SDimitry Andric return Error("Invalid function argument type"); 1411dff0c46cSDimitry Andric ArgTys.push_back(T); 1412ff0cc061SDimitry Andric } 1413dff0c46cSDimitry Andric else 1414dff0c46cSDimitry Andric break; 1415dff0c46cSDimitry Andric } 1416dff0c46cSDimitry Andric 1417dff0c46cSDimitry Andric ResultTy = getTypeByID(Record[1]); 141891bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-2) 141939d628a0SDimitry Andric return Error("Invalid type"); 1420dff0c46cSDimitry Andric 1421dff0c46cSDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 1422dff0c46cSDimitry Andric break; 1423dff0c46cSDimitry Andric } 142417a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] 1425f22ef01cSRoman Divacky if (Record.size() < 1) 142639d628a0SDimitry Andric return Error("Invalid record"); 1427dff0c46cSDimitry Andric SmallVector<Type*, 8> EltTys; 142817a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 142917a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 143017a519f9SDimitry Andric EltTys.push_back(T); 143117a519f9SDimitry Andric else 143217a519f9SDimitry Andric break; 143317a519f9SDimitry Andric } 143417a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 143539d628a0SDimitry Andric return Error("Invalid type"); 1436f22ef01cSRoman Divacky ResultTy = StructType::get(Context, EltTys, Record[0]); 1437f22ef01cSRoman Divacky break; 1438f22ef01cSRoman Divacky } 143917a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] 144017a519f9SDimitry Andric if (ConvertToString(Record, 0, TypeName)) 144139d628a0SDimitry Andric return Error("Invalid record"); 144217a519f9SDimitry Andric continue; 144317a519f9SDimitry Andric 144417a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] 144517a519f9SDimitry Andric if (Record.size() < 1) 144639d628a0SDimitry Andric return Error("Invalid record"); 144717a519f9SDimitry Andric 144817a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 144939d628a0SDimitry Andric return Error("Invalid TYPE table"); 145017a519f9SDimitry Andric 145117a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 145217a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 145317a519f9SDimitry Andric if (Res) { 145417a519f9SDimitry Andric Res->setName(TypeName); 145591bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 145617a519f9SDimitry Andric } else // Otherwise, create a new struct. 145739d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 145817a519f9SDimitry Andric TypeName.clear(); 145917a519f9SDimitry Andric 146017a519f9SDimitry Andric SmallVector<Type*, 8> EltTys; 146117a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 146217a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 146317a519f9SDimitry Andric EltTys.push_back(T); 146417a519f9SDimitry Andric else 146517a519f9SDimitry Andric break; 146617a519f9SDimitry Andric } 146717a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 146839d628a0SDimitry Andric return Error("Invalid record"); 146917a519f9SDimitry Andric Res->setBody(EltTys, Record[0]); 147017a519f9SDimitry Andric ResultTy = Res; 147117a519f9SDimitry Andric break; 147217a519f9SDimitry Andric } 147317a519f9SDimitry Andric case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] 147417a519f9SDimitry Andric if (Record.size() != 1) 147539d628a0SDimitry Andric return Error("Invalid record"); 147617a519f9SDimitry Andric 147717a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 147839d628a0SDimitry Andric return Error("Invalid TYPE table"); 147917a519f9SDimitry Andric 148017a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 148117a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 148217a519f9SDimitry Andric if (Res) { 148317a519f9SDimitry Andric Res->setName(TypeName); 148491bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 148517a519f9SDimitry Andric } else // Otherwise, create a new struct with no body. 148639d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 148717a519f9SDimitry Andric TypeName.clear(); 148817a519f9SDimitry Andric ResultTy = Res; 148917a519f9SDimitry Andric break; 149017a519f9SDimitry Andric } 1491f22ef01cSRoman Divacky case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] 1492f22ef01cSRoman Divacky if (Record.size() < 2) 149339d628a0SDimitry Andric return Error("Invalid record"); 1494ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1495ff0cc061SDimitry Andric if (!ResultTy || !ArrayType::isValidElementType(ResultTy)) 149639d628a0SDimitry Andric return Error("Invalid type"); 1497ff0cc061SDimitry Andric ResultTy = ArrayType::get(ResultTy, Record[0]); 1498f22ef01cSRoman Divacky break; 1499f22ef01cSRoman Divacky case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] 1500f22ef01cSRoman Divacky if (Record.size() < 2) 150139d628a0SDimitry Andric return Error("Invalid record"); 1502ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1503ff0cc061SDimitry Andric if (!ResultTy || !StructType::isValidElementType(ResultTy)) 150439d628a0SDimitry Andric return Error("Invalid type"); 1505ff0cc061SDimitry Andric ResultTy = VectorType::get(ResultTy, Record[0]); 1506f22ef01cSRoman Divacky break; 1507f22ef01cSRoman Divacky } 1508f22ef01cSRoman Divacky 150917a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 151039d628a0SDimitry Andric return Error("Invalid TYPE table"); 1511ff0cc061SDimitry Andric if (TypeList[NumRecords]) 1512ff0cc061SDimitry Andric return Error( 1513ff0cc061SDimitry Andric "Invalid TYPE table: Only named structs can be forward referenced"); 151417a519f9SDimitry Andric assert(ResultTy && "Didn't read a type?"); 151517a519f9SDimitry Andric TypeList[NumRecords++] = ResultTy; 1516f22ef01cSRoman Divacky } 1517f22ef01cSRoman Divacky } 151817a519f9SDimitry Andric 151991bc56edSDimitry Andric std::error_code BitcodeReader::ParseValueSymbolTable() { 1520f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) 152139d628a0SDimitry Andric return Error("Invalid record"); 1522f22ef01cSRoman Divacky 1523f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1524f22ef01cSRoman Divacky 1525ff0cc061SDimitry Andric Triple TT(TheModule->getTargetTriple()); 1526ff0cc061SDimitry Andric 1527f22ef01cSRoman Divacky // Read all the records for this value table. 1528f22ef01cSRoman Divacky SmallString<128> ValueName; 1529f22ef01cSRoman Divacky while (1) { 1530139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1531f22ef01cSRoman Divacky 1532139f7f9bSDimitry Andric switch (Entry.Kind) { 1533139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1534139f7f9bSDimitry Andric case BitstreamEntry::Error: 153539d628a0SDimitry Andric return Error("Malformed block"); 1536139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 153791bc56edSDimitry Andric return std::error_code(); 1538139f7f9bSDimitry Andric case BitstreamEntry::Record: 1539139f7f9bSDimitry Andric // The interesting case. 1540139f7f9bSDimitry Andric break; 1541f22ef01cSRoman Divacky } 1542f22ef01cSRoman Divacky 1543f22ef01cSRoman Divacky // Read a record. 1544f22ef01cSRoman Divacky Record.clear(); 1545139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1546f22ef01cSRoman Divacky default: // Default behavior: unknown type. 1547f22ef01cSRoman Divacky break; 1548f22ef01cSRoman Divacky case bitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] 1549f22ef01cSRoman Divacky if (ConvertToString(Record, 1, ValueName)) 155039d628a0SDimitry Andric return Error("Invalid record"); 1551f22ef01cSRoman Divacky unsigned ValueID = Record[0]; 155291bc56edSDimitry Andric if (ValueID >= ValueList.size() || !ValueList[ValueID]) 155339d628a0SDimitry Andric return Error("Invalid record"); 1554f22ef01cSRoman Divacky Value *V = ValueList[ValueID]; 1555f22ef01cSRoman Divacky 1556f22ef01cSRoman Divacky V->setName(StringRef(ValueName.data(), ValueName.size())); 1557ff0cc061SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(V)) { 1558ff0cc061SDimitry Andric if (GO->getComdat() == reinterpret_cast<Comdat *>(1)) { 1559ff0cc061SDimitry Andric if (TT.isOSBinFormatMachO()) 1560ff0cc061SDimitry Andric GO->setComdat(nullptr); 1561ff0cc061SDimitry Andric else 1562ff0cc061SDimitry Andric GO->setComdat(TheModule->getOrInsertComdat(V->getName())); 1563ff0cc061SDimitry Andric } 1564ff0cc061SDimitry Andric } 1565f22ef01cSRoman Divacky ValueName.clear(); 1566f22ef01cSRoman Divacky break; 1567f22ef01cSRoman Divacky } 1568f22ef01cSRoman Divacky case bitc::VST_CODE_BBENTRY: { 1569f22ef01cSRoman Divacky if (ConvertToString(Record, 1, ValueName)) 157039d628a0SDimitry Andric return Error("Invalid record"); 1571f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[0]); 157291bc56edSDimitry Andric if (!BB) 157339d628a0SDimitry Andric return Error("Invalid record"); 1574f22ef01cSRoman Divacky 1575f22ef01cSRoman Divacky BB->setName(StringRef(ValueName.data(), ValueName.size())); 1576f22ef01cSRoman Divacky ValueName.clear(); 1577f22ef01cSRoman Divacky break; 1578f22ef01cSRoman Divacky } 1579f22ef01cSRoman Divacky } 1580f22ef01cSRoman Divacky } 1581f22ef01cSRoman Divacky } 1582f22ef01cSRoman Divacky 1583ff0cc061SDimitry Andric static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; } 1584ff0cc061SDimitry Andric 158591bc56edSDimitry Andric std::error_code BitcodeReader::ParseMetadata() { 1586ff0cc061SDimitry Andric IsMetadataMaterialized = true; 1587f22ef01cSRoman Divacky unsigned NextMDValueNo = MDValueList.size(); 1588f22ef01cSRoman Divacky 1589f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 159039d628a0SDimitry Andric return Error("Invalid record"); 1591f22ef01cSRoman Divacky 1592f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1593f22ef01cSRoman Divacky 1594ff0cc061SDimitry Andric auto getMD = 1595ff0cc061SDimitry Andric [&](unsigned ID) -> Metadata *{ return MDValueList.getValueFwdRef(ID); }; 1596ff0cc061SDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata *{ 1597ff0cc061SDimitry Andric if (ID) 1598ff0cc061SDimitry Andric return getMD(ID - 1); 1599ff0cc061SDimitry Andric return nullptr; 1600ff0cc061SDimitry Andric }; 1601ff0cc061SDimitry Andric auto getMDString = [&](unsigned ID) -> MDString *{ 1602ff0cc061SDimitry Andric // This requires that the ID is not really a forward reference. In 1603ff0cc061SDimitry Andric // particular, the MDString must already have been resolved. 1604ff0cc061SDimitry Andric return cast_or_null<MDString>(getMDOrNull(ID)); 1605ff0cc061SDimitry Andric }; 1606ff0cc061SDimitry Andric 1607ff0cc061SDimitry Andric #define GET_OR_DISTINCT(CLASS, DISTINCT, ARGS) \ 1608ff0cc061SDimitry Andric (DISTINCT ? CLASS::getDistinct ARGS : CLASS::get ARGS) 1609ff0cc061SDimitry Andric 1610f22ef01cSRoman Divacky // Read all the records. 1611f22ef01cSRoman Divacky while (1) { 1612139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1613139f7f9bSDimitry Andric 1614139f7f9bSDimitry Andric switch (Entry.Kind) { 1615139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1616139f7f9bSDimitry Andric case BitstreamEntry::Error: 161739d628a0SDimitry Andric return Error("Malformed block"); 1618139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 161939d628a0SDimitry Andric MDValueList.tryToResolveCycles(); 162091bc56edSDimitry Andric return std::error_code(); 1621139f7f9bSDimitry Andric case BitstreamEntry::Record: 1622139f7f9bSDimitry Andric // The interesting case. 1623139f7f9bSDimitry Andric break; 1624f22ef01cSRoman Divacky } 1625f22ef01cSRoman Divacky 1626f22ef01cSRoman Divacky // Read a record. 1627f22ef01cSRoman Divacky Record.clear(); 1628139f7f9bSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record); 162939d628a0SDimitry Andric bool IsDistinct = false; 1630e580952dSDimitry Andric switch (Code) { 1631f22ef01cSRoman Divacky default: // Default behavior: ignore. 1632f22ef01cSRoman Divacky break; 1633f22ef01cSRoman Divacky case bitc::METADATA_NAME: { 1634139f7f9bSDimitry Andric // Read name of the named metadata. 16357ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 1636f22ef01cSRoman Divacky Record.clear(); 1637f22ef01cSRoman Divacky Code = Stream.ReadCode(); 1638f22ef01cSRoman Divacky 163917a519f9SDimitry Andric // METADATA_NAME is always followed by METADATA_NAMED_NODE. 1640139f7f9bSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record); 164117a519f9SDimitry Andric assert(NextBitCode == bitc::METADATA_NAMED_NODE); (void)NextBitCode; 1642f22ef01cSRoman Divacky 1643f22ef01cSRoman Divacky // Read named metadata elements. 1644f22ef01cSRoman Divacky unsigned Size = Record.size(); 1645e580952dSDimitry Andric NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); 1646f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) { 164791bc56edSDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i])); 164891bc56edSDimitry Andric if (!MD) 164939d628a0SDimitry Andric return Error("Invalid record"); 1650e580952dSDimitry Andric NMD->addOperand(MD); 1651f22ef01cSRoman Divacky } 1652f22ef01cSRoman Divacky break; 1653f22ef01cSRoman Divacky } 165439d628a0SDimitry Andric case bitc::METADATA_OLD_FN_NODE: { 165539d628a0SDimitry Andric // FIXME: Remove in 4.0. 165639d628a0SDimitry Andric // This is a LocalAsMetadata record, the only type of function-local 165739d628a0SDimitry Andric // metadata. 1658ffd1746dSEd Schouten if (Record.size() % 2 == 1) 165939d628a0SDimitry Andric return Error("Invalid record"); 166039d628a0SDimitry Andric 166139d628a0SDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used 166239d628a0SDimitry Andric // to be legal, but there's no upgrade path. 166339d628a0SDimitry Andric auto dropRecord = [&] { 166439d628a0SDimitry Andric MDValueList.AssignValue(MDNode::get(Context, None), NextMDValueNo++); 166539d628a0SDimitry Andric }; 166639d628a0SDimitry Andric if (Record.size() != 2) { 166739d628a0SDimitry Andric dropRecord(); 166839d628a0SDimitry Andric break; 166939d628a0SDimitry Andric } 167039d628a0SDimitry Andric 167139d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 167239d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) { 167339d628a0SDimitry Andric dropRecord(); 167439d628a0SDimitry Andric break; 167539d628a0SDimitry Andric } 167639d628a0SDimitry Andric 167739d628a0SDimitry Andric MDValueList.AssignValue( 167839d628a0SDimitry Andric LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 167939d628a0SDimitry Andric NextMDValueNo++); 168039d628a0SDimitry Andric break; 168139d628a0SDimitry Andric } 168239d628a0SDimitry Andric case bitc::METADATA_OLD_NODE: { 168339d628a0SDimitry Andric // FIXME: Remove in 4.0. 168439d628a0SDimitry Andric if (Record.size() % 2 == 1) 168539d628a0SDimitry Andric return Error("Invalid record"); 1686f22ef01cSRoman Divacky 1687f22ef01cSRoman Divacky unsigned Size = Record.size(); 168839d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 1689f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; i += 2) { 16906122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[i]); 1691f785676fSDimitry Andric if (!Ty) 169239d628a0SDimitry Andric return Error("Invalid record"); 1693f22ef01cSRoman Divacky if (Ty->isMetadataTy()) 1694f22ef01cSRoman Divacky Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); 169539d628a0SDimitry Andric else if (!Ty->isVoidTy()) { 169639d628a0SDimitry Andric auto *MD = 169739d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty)); 169839d628a0SDimitry Andric assert(isa<ConstantAsMetadata>(MD) && 169939d628a0SDimitry Andric "Expected non-function-local metadata"); 170039d628a0SDimitry Andric Elts.push_back(MD); 170139d628a0SDimitry Andric } else 170291bc56edSDimitry Andric Elts.push_back(nullptr); 1703f22ef01cSRoman Divacky } 170439d628a0SDimitry Andric MDValueList.AssignValue(MDNode::get(Context, Elts), NextMDValueNo++); 170539d628a0SDimitry Andric break; 170639d628a0SDimitry Andric } 170739d628a0SDimitry Andric case bitc::METADATA_VALUE: { 170839d628a0SDimitry Andric if (Record.size() != 2) 170939d628a0SDimitry Andric return Error("Invalid record"); 171039d628a0SDimitry Andric 171139d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 171239d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) 171339d628a0SDimitry Andric return Error("Invalid record"); 171439d628a0SDimitry Andric 171539d628a0SDimitry Andric MDValueList.AssignValue( 171639d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 171739d628a0SDimitry Andric NextMDValueNo++); 171839d628a0SDimitry Andric break; 171939d628a0SDimitry Andric } 172039d628a0SDimitry Andric case bitc::METADATA_DISTINCT_NODE: 172139d628a0SDimitry Andric IsDistinct = true; 172239d628a0SDimitry Andric // fallthrough... 172339d628a0SDimitry Andric case bitc::METADATA_NODE: { 172439d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 172539d628a0SDimitry Andric Elts.reserve(Record.size()); 172639d628a0SDimitry Andric for (unsigned ID : Record) 172739d628a0SDimitry Andric Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr); 172839d628a0SDimitry Andric MDValueList.AssignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 172939d628a0SDimitry Andric : MDNode::get(Context, Elts), 173039d628a0SDimitry Andric NextMDValueNo++); 173139d628a0SDimitry Andric break; 173239d628a0SDimitry Andric } 173339d628a0SDimitry Andric case bitc::METADATA_LOCATION: { 173439d628a0SDimitry Andric if (Record.size() != 5) 173539d628a0SDimitry Andric return Error("Invalid record"); 173639d628a0SDimitry Andric 173739d628a0SDimitry Andric unsigned Line = Record[1]; 173839d628a0SDimitry Andric unsigned Column = Record[2]; 173939d628a0SDimitry Andric MDNode *Scope = cast<MDNode>(MDValueList.getValueFwdRef(Record[3])); 174039d628a0SDimitry Andric Metadata *InlinedAt = 174139d628a0SDimitry Andric Record[4] ? MDValueList.getValueFwdRef(Record[4] - 1) : nullptr; 1742ff0cc061SDimitry Andric MDValueList.AssignValue( 1743ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocation, Record[0], 1744ff0cc061SDimitry Andric (Context, Line, Column, Scope, InlinedAt)), 1745ff0cc061SDimitry Andric NextMDValueNo++); 1746ff0cc061SDimitry Andric break; 1747ff0cc061SDimitry Andric } 1748ff0cc061SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: { 1749ff0cc061SDimitry Andric if (Record.size() < 4) 1750ff0cc061SDimitry Andric return Error("Invalid record"); 1751ff0cc061SDimitry Andric 1752ff0cc061SDimitry Andric unsigned Tag = Record[1]; 1753ff0cc061SDimitry Andric unsigned Version = Record[2]; 1754ff0cc061SDimitry Andric 1755ff0cc061SDimitry Andric if (Tag >= 1u << 16 || Version != 0) 1756ff0cc061SDimitry Andric return Error("Invalid record"); 1757ff0cc061SDimitry Andric 1758ff0cc061SDimitry Andric auto *Header = getMDString(Record[3]); 1759ff0cc061SDimitry Andric SmallVector<Metadata *, 8> DwarfOps; 1760ff0cc061SDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I) 1761ff0cc061SDimitry Andric DwarfOps.push_back(Record[I] ? MDValueList.getValueFwdRef(Record[I] - 1) 1762ff0cc061SDimitry Andric : nullptr); 1763ff0cc061SDimitry Andric MDValueList.AssignValue(GET_OR_DISTINCT(GenericDINode, Record[0], 1764ff0cc061SDimitry Andric (Context, Tag, Header, DwarfOps)), 1765ff0cc061SDimitry Andric NextMDValueNo++); 1766ff0cc061SDimitry Andric break; 1767ff0cc061SDimitry Andric } 1768ff0cc061SDimitry Andric case bitc::METADATA_SUBRANGE: { 1769ff0cc061SDimitry Andric if (Record.size() != 3) 1770ff0cc061SDimitry Andric return Error("Invalid record"); 1771ff0cc061SDimitry Andric 1772ff0cc061SDimitry Andric MDValueList.AssignValue( 1773ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubrange, Record[0], 1774ff0cc061SDimitry Andric (Context, Record[1], unrotateSign(Record[2]))), 1775ff0cc061SDimitry Andric NextMDValueNo++); 1776ff0cc061SDimitry Andric break; 1777ff0cc061SDimitry Andric } 1778ff0cc061SDimitry Andric case bitc::METADATA_ENUMERATOR: { 1779ff0cc061SDimitry Andric if (Record.size() != 3) 1780ff0cc061SDimitry Andric return Error("Invalid record"); 1781ff0cc061SDimitry Andric 1782ff0cc061SDimitry Andric MDValueList.AssignValue(GET_OR_DISTINCT(DIEnumerator, Record[0], 1783ff0cc061SDimitry Andric (Context, unrotateSign(Record[1]), 1784ff0cc061SDimitry Andric getMDString(Record[2]))), 1785ff0cc061SDimitry Andric NextMDValueNo++); 1786ff0cc061SDimitry Andric break; 1787ff0cc061SDimitry Andric } 1788ff0cc061SDimitry Andric case bitc::METADATA_BASIC_TYPE: { 1789ff0cc061SDimitry Andric if (Record.size() != 6) 1790ff0cc061SDimitry Andric return Error("Invalid record"); 1791ff0cc061SDimitry Andric 1792ff0cc061SDimitry Andric MDValueList.AssignValue( 1793ff0cc061SDimitry Andric GET_OR_DISTINCT(DIBasicType, Record[0], 1794ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1795ff0cc061SDimitry Andric Record[3], Record[4], Record[5])), 1796ff0cc061SDimitry Andric NextMDValueNo++); 1797ff0cc061SDimitry Andric break; 1798ff0cc061SDimitry Andric } 1799ff0cc061SDimitry Andric case bitc::METADATA_DERIVED_TYPE: { 1800ff0cc061SDimitry Andric if (Record.size() != 12) 1801ff0cc061SDimitry Andric return Error("Invalid record"); 1802ff0cc061SDimitry Andric 1803ff0cc061SDimitry Andric MDValueList.AssignValue( 1804ff0cc061SDimitry Andric GET_OR_DISTINCT(DIDerivedType, Record[0], 1805ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1806ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1807ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1808ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1809ff0cc061SDimitry Andric getMDOrNull(Record[11]))), 1810ff0cc061SDimitry Andric NextMDValueNo++); 1811ff0cc061SDimitry Andric break; 1812ff0cc061SDimitry Andric } 1813ff0cc061SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: { 1814ff0cc061SDimitry Andric if (Record.size() != 16) 1815ff0cc061SDimitry Andric return Error("Invalid record"); 1816ff0cc061SDimitry Andric 1817ff0cc061SDimitry Andric MDValueList.AssignValue( 1818ff0cc061SDimitry Andric GET_OR_DISTINCT(DICompositeType, Record[0], 1819ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1820ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1821ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1822ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1823ff0cc061SDimitry Andric getMDOrNull(Record[11]), Record[12], 1824ff0cc061SDimitry Andric getMDOrNull(Record[13]), getMDOrNull(Record[14]), 1825ff0cc061SDimitry Andric getMDString(Record[15]))), 1826ff0cc061SDimitry Andric NextMDValueNo++); 1827ff0cc061SDimitry Andric break; 1828ff0cc061SDimitry Andric } 1829ff0cc061SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: { 1830ff0cc061SDimitry Andric if (Record.size() != 3) 1831ff0cc061SDimitry Andric return Error("Invalid record"); 1832ff0cc061SDimitry Andric 1833ff0cc061SDimitry Andric MDValueList.AssignValue( 1834ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubroutineType, Record[0], 1835ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]))), 1836ff0cc061SDimitry Andric NextMDValueNo++); 1837ff0cc061SDimitry Andric break; 1838ff0cc061SDimitry Andric } 1839ff0cc061SDimitry Andric case bitc::METADATA_FILE: { 1840ff0cc061SDimitry Andric if (Record.size() != 3) 1841ff0cc061SDimitry Andric return Error("Invalid record"); 1842ff0cc061SDimitry Andric 1843ff0cc061SDimitry Andric MDValueList.AssignValue( 1844ff0cc061SDimitry Andric GET_OR_DISTINCT(DIFile, Record[0], (Context, getMDString(Record[1]), 1845ff0cc061SDimitry Andric getMDString(Record[2]))), 1846ff0cc061SDimitry Andric NextMDValueNo++); 1847ff0cc061SDimitry Andric break; 1848ff0cc061SDimitry Andric } 1849ff0cc061SDimitry Andric case bitc::METADATA_COMPILE_UNIT: { 1850ff0cc061SDimitry Andric if (Record.size() < 14 || Record.size() > 15) 1851ff0cc061SDimitry Andric return Error("Invalid record"); 1852ff0cc061SDimitry Andric 1853ff0cc061SDimitry Andric MDValueList.AssignValue( 1854ff0cc061SDimitry Andric GET_OR_DISTINCT(DICompileUnit, Record[0], 1855ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 1856ff0cc061SDimitry Andric getMDString(Record[3]), Record[4], 1857ff0cc061SDimitry Andric getMDString(Record[5]), Record[6], 1858ff0cc061SDimitry Andric getMDString(Record[7]), Record[8], 1859ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1860ff0cc061SDimitry Andric getMDOrNull(Record[11]), getMDOrNull(Record[12]), 1861ff0cc061SDimitry Andric getMDOrNull(Record[13]), 1862ff0cc061SDimitry Andric Record.size() == 14 ? 0 : Record[14])), 1863ff0cc061SDimitry Andric NextMDValueNo++); 1864ff0cc061SDimitry Andric break; 1865ff0cc061SDimitry Andric } 1866ff0cc061SDimitry Andric case bitc::METADATA_SUBPROGRAM: { 1867ff0cc061SDimitry Andric if (Record.size() != 19) 1868ff0cc061SDimitry Andric return Error("Invalid record"); 1869ff0cc061SDimitry Andric 1870ff0cc061SDimitry Andric MDValueList.AssignValue( 1871ff0cc061SDimitry Andric GET_OR_DISTINCT( 1872ff0cc061SDimitry Andric DISubprogram, Record[0], 1873ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1874ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1875ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], Record[9], 1876ff0cc061SDimitry Andric getMDOrNull(Record[10]), Record[11], Record[12], Record[13], 1877ff0cc061SDimitry Andric Record[14], getMDOrNull(Record[15]), getMDOrNull(Record[16]), 1878ff0cc061SDimitry Andric getMDOrNull(Record[17]), getMDOrNull(Record[18]))), 1879ff0cc061SDimitry Andric NextMDValueNo++); 1880ff0cc061SDimitry Andric break; 1881ff0cc061SDimitry Andric } 1882ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: { 1883ff0cc061SDimitry Andric if (Record.size() != 5) 1884ff0cc061SDimitry Andric return Error("Invalid record"); 1885ff0cc061SDimitry Andric 1886ff0cc061SDimitry Andric MDValueList.AssignValue( 1887ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlock, Record[0], 1888ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1889ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])), 1890ff0cc061SDimitry Andric NextMDValueNo++); 1891ff0cc061SDimitry Andric break; 1892ff0cc061SDimitry Andric } 1893ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: { 1894ff0cc061SDimitry Andric if (Record.size() != 4) 1895ff0cc061SDimitry Andric return Error("Invalid record"); 1896ff0cc061SDimitry Andric 1897ff0cc061SDimitry Andric MDValueList.AssignValue( 1898ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile, Record[0], 1899ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1900ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3])), 1901ff0cc061SDimitry Andric NextMDValueNo++); 1902ff0cc061SDimitry Andric break; 1903ff0cc061SDimitry Andric } 1904ff0cc061SDimitry Andric case bitc::METADATA_NAMESPACE: { 1905ff0cc061SDimitry Andric if (Record.size() != 5) 1906ff0cc061SDimitry Andric return Error("Invalid record"); 1907ff0cc061SDimitry Andric 1908ff0cc061SDimitry Andric MDValueList.AssignValue( 1909ff0cc061SDimitry Andric GET_OR_DISTINCT(DINamespace, Record[0], 1910ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1911ff0cc061SDimitry Andric getMDOrNull(Record[2]), getMDString(Record[3]), 1912ff0cc061SDimitry Andric Record[4])), 1913ff0cc061SDimitry Andric NextMDValueNo++); 1914ff0cc061SDimitry Andric break; 1915ff0cc061SDimitry Andric } 1916ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: { 1917ff0cc061SDimitry Andric if (Record.size() != 3) 1918ff0cc061SDimitry Andric return Error("Invalid record"); 1919ff0cc061SDimitry Andric 1920ff0cc061SDimitry Andric MDValueList.AssignValue(GET_OR_DISTINCT(DITemplateTypeParameter, 1921ff0cc061SDimitry Andric Record[0], 1922ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 1923ff0cc061SDimitry Andric getMDOrNull(Record[2]))), 1924ff0cc061SDimitry Andric NextMDValueNo++); 1925ff0cc061SDimitry Andric break; 1926ff0cc061SDimitry Andric } 1927ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: { 1928ff0cc061SDimitry Andric if (Record.size() != 5) 1929ff0cc061SDimitry Andric return Error("Invalid record"); 1930ff0cc061SDimitry Andric 1931ff0cc061SDimitry Andric MDValueList.AssignValue( 1932ff0cc061SDimitry Andric GET_OR_DISTINCT(DITemplateValueParameter, Record[0], 1933ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1934ff0cc061SDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]))), 1935ff0cc061SDimitry Andric NextMDValueNo++); 1936ff0cc061SDimitry Andric break; 1937ff0cc061SDimitry Andric } 1938ff0cc061SDimitry Andric case bitc::METADATA_GLOBAL_VAR: { 1939ff0cc061SDimitry Andric if (Record.size() != 11) 1940ff0cc061SDimitry Andric return Error("Invalid record"); 1941ff0cc061SDimitry Andric 1942ff0cc061SDimitry Andric MDValueList.AssignValue( 1943ff0cc061SDimitry Andric GET_OR_DISTINCT(DIGlobalVariable, Record[0], 1944ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1945ff0cc061SDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 1946ff0cc061SDimitry Andric getMDOrNull(Record[4]), Record[5], 1947ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], 1948ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]))), 1949ff0cc061SDimitry Andric NextMDValueNo++); 1950ff0cc061SDimitry Andric break; 1951ff0cc061SDimitry Andric } 1952ff0cc061SDimitry Andric case bitc::METADATA_LOCAL_VAR: { 1953ff0cc061SDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field. 1954ff0cc061SDimitry Andric if (Record.size() != 9 && Record.size() != 10) 1955ff0cc061SDimitry Andric return Error("Invalid record"); 1956ff0cc061SDimitry Andric 1957ff0cc061SDimitry Andric MDValueList.AssignValue( 1958ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocalVariable, Record[0], 1959ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 1960ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), 1961ff0cc061SDimitry Andric Record[5], getMDOrNull(Record[6]), Record[7], 1962ff0cc061SDimitry Andric Record[8])), 1963ff0cc061SDimitry Andric NextMDValueNo++); 1964ff0cc061SDimitry Andric break; 1965ff0cc061SDimitry Andric } 1966ff0cc061SDimitry Andric case bitc::METADATA_EXPRESSION: { 1967ff0cc061SDimitry Andric if (Record.size() < 1) 1968ff0cc061SDimitry Andric return Error("Invalid record"); 1969ff0cc061SDimitry Andric 1970ff0cc061SDimitry Andric MDValueList.AssignValue( 1971ff0cc061SDimitry Andric GET_OR_DISTINCT(DIExpression, Record[0], 1972ff0cc061SDimitry Andric (Context, makeArrayRef(Record).slice(1))), 1973ff0cc061SDimitry Andric NextMDValueNo++); 1974ff0cc061SDimitry Andric break; 1975ff0cc061SDimitry Andric } 1976ff0cc061SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: { 1977ff0cc061SDimitry Andric if (Record.size() != 8) 1978ff0cc061SDimitry Andric return Error("Invalid record"); 1979ff0cc061SDimitry Andric 1980ff0cc061SDimitry Andric MDValueList.AssignValue( 1981ff0cc061SDimitry Andric GET_OR_DISTINCT(DIObjCProperty, Record[0], 1982ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 1983ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], 1984ff0cc061SDimitry Andric getMDString(Record[4]), getMDString(Record[5]), 1985ff0cc061SDimitry Andric Record[6], getMDOrNull(Record[7]))), 1986ff0cc061SDimitry Andric NextMDValueNo++); 1987ff0cc061SDimitry Andric break; 1988ff0cc061SDimitry Andric } 1989ff0cc061SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: { 1990ff0cc061SDimitry Andric if (Record.size() != 6) 1991ff0cc061SDimitry Andric return Error("Invalid record"); 1992ff0cc061SDimitry Andric 1993ff0cc061SDimitry Andric MDValueList.AssignValue( 1994ff0cc061SDimitry Andric GET_OR_DISTINCT(DIImportedEntity, Record[0], 1995ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 1996ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1997ff0cc061SDimitry Andric getMDString(Record[5]))), 199839d628a0SDimitry Andric NextMDValueNo++); 1999f22ef01cSRoman Divacky break; 2000f22ef01cSRoman Divacky } 2001f22ef01cSRoman Divacky case bitc::METADATA_STRING: { 200291bc56edSDimitry Andric std::string String(Record.begin(), Record.end()); 200391bc56edSDimitry Andric llvm::UpgradeMDStringConstant(String); 200439d628a0SDimitry Andric Metadata *MD = MDString::get(Context, String); 200539d628a0SDimitry Andric MDValueList.AssignValue(MD, NextMDValueNo++); 2006f22ef01cSRoman Divacky break; 2007f22ef01cSRoman Divacky } 2008f22ef01cSRoman Divacky case bitc::METADATA_KIND: { 20097ae0e2c9SDimitry Andric if (Record.size() < 2) 201039d628a0SDimitry Andric return Error("Invalid record"); 20117ae0e2c9SDimitry Andric 2012f22ef01cSRoman Divacky unsigned Kind = Record[0]; 20137ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin()+1, Record.end()); 2014f22ef01cSRoman Divacky 2015f22ef01cSRoman Divacky unsigned NewKind = TheModule->getMDKindID(Name.str()); 2016e580952dSDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 201739d628a0SDimitry Andric return Error("Conflicting METADATA_KIND records"); 2018f22ef01cSRoman Divacky break; 2019f22ef01cSRoman Divacky } 2020f22ef01cSRoman Divacky } 2021f22ef01cSRoman Divacky } 2022ff0cc061SDimitry Andric #undef GET_OR_DISTINCT 2023f22ef01cSRoman Divacky } 2024f22ef01cSRoman Divacky 20253861d79fSDimitry Andric /// decodeSignRotatedValue - Decode a signed value stored with the sign bit in 2026f22ef01cSRoman Divacky /// the LSB for dense VBR encoding. 20273861d79fSDimitry Andric uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { 2028f22ef01cSRoman Divacky if ((V & 1) == 0) 2029f22ef01cSRoman Divacky return V >> 1; 2030f22ef01cSRoman Divacky if (V != 1) 2031f22ef01cSRoman Divacky return -(V >> 1); 2032f22ef01cSRoman Divacky // There is no such thing as -0 with integers. "-0" really means MININT. 2033f22ef01cSRoman Divacky return 1ULL << 63; 2034f22ef01cSRoman Divacky } 2035f22ef01cSRoman Divacky 2036f22ef01cSRoman Divacky /// ResolveGlobalAndAliasInits - Resolve all of the initializers for global 2037f22ef01cSRoman Divacky /// values and aliases that we can. 203891bc56edSDimitry Andric std::error_code BitcodeReader::ResolveGlobalAndAliasInits() { 2039f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; 2040f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; 2041f785676fSDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixWorklist; 204239d628a0SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologueWorklist; 2043f22ef01cSRoman Divacky 2044f22ef01cSRoman Divacky GlobalInitWorklist.swap(GlobalInits); 2045f22ef01cSRoman Divacky AliasInitWorklist.swap(AliasInits); 2046f785676fSDimitry Andric FunctionPrefixWorklist.swap(FunctionPrefixes); 204739d628a0SDimitry Andric FunctionPrologueWorklist.swap(FunctionPrologues); 2048f22ef01cSRoman Divacky 2049f22ef01cSRoman Divacky while (!GlobalInitWorklist.empty()) { 2050f22ef01cSRoman Divacky unsigned ValID = GlobalInitWorklist.back().second; 2051f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2052f22ef01cSRoman Divacky // Not ready to resolve this yet, it requires something later in the file. 2053f22ef01cSRoman Divacky GlobalInits.push_back(GlobalInitWorklist.back()); 2054f22ef01cSRoman Divacky } else { 205591bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2056f22ef01cSRoman Divacky GlobalInitWorklist.back().first->setInitializer(C); 2057f22ef01cSRoman Divacky else 205839d628a0SDimitry Andric return Error("Expected a constant"); 2059f22ef01cSRoman Divacky } 2060f22ef01cSRoman Divacky GlobalInitWorklist.pop_back(); 2061f22ef01cSRoman Divacky } 2062f22ef01cSRoman Divacky 2063f22ef01cSRoman Divacky while (!AliasInitWorklist.empty()) { 2064f22ef01cSRoman Divacky unsigned ValID = AliasInitWorklist.back().second; 2065f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2066f22ef01cSRoman Divacky AliasInits.push_back(AliasInitWorklist.back()); 2067f22ef01cSRoman Divacky } else { 206891bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2069f22ef01cSRoman Divacky AliasInitWorklist.back().first->setAliasee(C); 2070f22ef01cSRoman Divacky else 207139d628a0SDimitry Andric return Error("Expected a constant"); 2072f22ef01cSRoman Divacky } 2073f22ef01cSRoman Divacky AliasInitWorklist.pop_back(); 2074f22ef01cSRoman Divacky } 2075f785676fSDimitry Andric 2076f785676fSDimitry Andric while (!FunctionPrefixWorklist.empty()) { 2077f785676fSDimitry Andric unsigned ValID = FunctionPrefixWorklist.back().second; 2078f785676fSDimitry Andric if (ValID >= ValueList.size()) { 2079f785676fSDimitry Andric FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); 2080f785676fSDimitry Andric } else { 208191bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2082f785676fSDimitry Andric FunctionPrefixWorklist.back().first->setPrefixData(C); 2083f785676fSDimitry Andric else 208439d628a0SDimitry Andric return Error("Expected a constant"); 2085f785676fSDimitry Andric } 2086f785676fSDimitry Andric FunctionPrefixWorklist.pop_back(); 2087f785676fSDimitry Andric } 2088f785676fSDimitry Andric 208939d628a0SDimitry Andric while (!FunctionPrologueWorklist.empty()) { 209039d628a0SDimitry Andric unsigned ValID = FunctionPrologueWorklist.back().second; 209139d628a0SDimitry Andric if (ValID >= ValueList.size()) { 209239d628a0SDimitry Andric FunctionPrologues.push_back(FunctionPrologueWorklist.back()); 209339d628a0SDimitry Andric } else { 209439d628a0SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 209539d628a0SDimitry Andric FunctionPrologueWorklist.back().first->setPrologueData(C); 209639d628a0SDimitry Andric else 209739d628a0SDimitry Andric return Error("Expected a constant"); 209839d628a0SDimitry Andric } 209939d628a0SDimitry Andric FunctionPrologueWorklist.pop_back(); 210039d628a0SDimitry Andric } 210139d628a0SDimitry Andric 210291bc56edSDimitry Andric return std::error_code(); 2103f22ef01cSRoman Divacky } 2104f22ef01cSRoman Divacky 21057ae0e2c9SDimitry Andric static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { 21067ae0e2c9SDimitry Andric SmallVector<uint64_t, 8> Words(Vals.size()); 21077ae0e2c9SDimitry Andric std::transform(Vals.begin(), Vals.end(), Words.begin(), 21083861d79fSDimitry Andric BitcodeReader::decodeSignRotatedValue); 21097ae0e2c9SDimitry Andric 21107ae0e2c9SDimitry Andric return APInt(TypeBits, Words); 21117ae0e2c9SDimitry Andric } 21127ae0e2c9SDimitry Andric 211391bc56edSDimitry Andric std::error_code BitcodeReader::ParseConstants() { 2114f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) 211539d628a0SDimitry Andric return Error("Invalid record"); 2116f22ef01cSRoman Divacky 2117f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2118f22ef01cSRoman Divacky 2119f22ef01cSRoman Divacky // Read all the records for this value table. 21206122f3e6SDimitry Andric Type *CurTy = Type::getInt32Ty(Context); 2121f22ef01cSRoman Divacky unsigned NextCstNo = ValueList.size(); 2122f22ef01cSRoman Divacky while (1) { 2123139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2124139f7f9bSDimitry Andric 2125139f7f9bSDimitry Andric switch (Entry.Kind) { 2126139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2127139f7f9bSDimitry Andric case BitstreamEntry::Error: 212839d628a0SDimitry Andric return Error("Malformed block"); 2129139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2130139f7f9bSDimitry Andric if (NextCstNo != ValueList.size()) 213139d628a0SDimitry Andric return Error("Invalid ronstant reference"); 2132139f7f9bSDimitry Andric 2133139f7f9bSDimitry Andric // Once all the constants have been read, go through and resolve forward 2134139f7f9bSDimitry Andric // references. 2135139f7f9bSDimitry Andric ValueList.ResolveConstantForwardRefs(); 213691bc56edSDimitry Andric return std::error_code(); 2137139f7f9bSDimitry Andric case BitstreamEntry::Record: 2138139f7f9bSDimitry Andric // The interesting case. 2139f22ef01cSRoman Divacky break; 2140f22ef01cSRoman Divacky } 2141f22ef01cSRoman Divacky 2142f22ef01cSRoman Divacky // Read a record. 2143f22ef01cSRoman Divacky Record.clear(); 214491bc56edSDimitry Andric Value *V = nullptr; 2145139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 2146f22ef01cSRoman Divacky switch (BitCode) { 2147f22ef01cSRoman Divacky default: // Default behavior: unknown constant 2148f22ef01cSRoman Divacky case bitc::CST_CODE_UNDEF: // UNDEF 2149f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2150f22ef01cSRoman Divacky break; 2151f22ef01cSRoman Divacky case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] 2152f22ef01cSRoman Divacky if (Record.empty()) 215339d628a0SDimitry Andric return Error("Invalid record"); 215491bc56edSDimitry Andric if (Record[0] >= TypeList.size() || !TypeList[Record[0]]) 215539d628a0SDimitry Andric return Error("Invalid record"); 2156f22ef01cSRoman Divacky CurTy = TypeList[Record[0]]; 2157f22ef01cSRoman Divacky continue; // Skip the ValueList manipulation. 2158f22ef01cSRoman Divacky case bitc::CST_CODE_NULL: // NULL 2159f22ef01cSRoman Divacky V = Constant::getNullValue(CurTy); 2160f22ef01cSRoman Divacky break; 2161f22ef01cSRoman Divacky case bitc::CST_CODE_INTEGER: // INTEGER: [intval] 2162f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 216339d628a0SDimitry Andric return Error("Invalid record"); 21643861d79fSDimitry Andric V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); 2165f22ef01cSRoman Divacky break; 2166f22ef01cSRoman Divacky case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] 2167f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 216839d628a0SDimitry Andric return Error("Invalid record"); 2169f22ef01cSRoman Divacky 21707ae0e2c9SDimitry Andric APInt VInt = ReadWideAPInt(Record, 21717ae0e2c9SDimitry Andric cast<IntegerType>(CurTy)->getBitWidth()); 21727ae0e2c9SDimitry Andric V = ConstantInt::get(Context, VInt); 21737ae0e2c9SDimitry Andric 2174f22ef01cSRoman Divacky break; 2175f22ef01cSRoman Divacky } 2176f22ef01cSRoman Divacky case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] 2177f22ef01cSRoman Divacky if (Record.empty()) 217839d628a0SDimitry Andric return Error("Invalid record"); 2179dff0c46cSDimitry Andric if (CurTy->isHalfTy()) 2180139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, 2181139f7f9bSDimitry Andric APInt(16, (uint16_t)Record[0]))); 2182dff0c46cSDimitry Andric else if (CurTy->isFloatTy()) 2183139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, 2184139f7f9bSDimitry Andric APInt(32, (uint32_t)Record[0]))); 2185f22ef01cSRoman Divacky else if (CurTy->isDoubleTy()) 2186139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, 2187139f7f9bSDimitry Andric APInt(64, Record[0]))); 2188f22ef01cSRoman Divacky else if (CurTy->isX86_FP80Ty()) { 2189f22ef01cSRoman Divacky // Bits are not stored the same way as a normal i80 APInt, compensate. 2190f22ef01cSRoman Divacky uint64_t Rearrange[2]; 2191f22ef01cSRoman Divacky Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); 2192f22ef01cSRoman Divacky Rearrange[1] = Record[0] >> 48; 2193139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, 2194139f7f9bSDimitry Andric APInt(80, Rearrange))); 2195f22ef01cSRoman Divacky } else if (CurTy->isFP128Ty()) 2196139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, 2197139f7f9bSDimitry Andric APInt(128, Record))); 2198f22ef01cSRoman Divacky else if (CurTy->isPPC_FP128Ty()) 2199139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, 2200139f7f9bSDimitry Andric APInt(128, Record))); 2201f22ef01cSRoman Divacky else 2202f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2203f22ef01cSRoman Divacky break; 2204f22ef01cSRoman Divacky } 2205f22ef01cSRoman Divacky 2206f22ef01cSRoman Divacky case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] 2207f22ef01cSRoman Divacky if (Record.empty()) 220839d628a0SDimitry Andric return Error("Invalid record"); 2209f22ef01cSRoman Divacky 2210f22ef01cSRoman Divacky unsigned Size = Record.size(); 2211dff0c46cSDimitry Andric SmallVector<Constant*, 16> Elts; 2212f22ef01cSRoman Divacky 22136122f3e6SDimitry Andric if (StructType *STy = dyn_cast<StructType>(CurTy)) { 2214f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2215f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], 2216f22ef01cSRoman Divacky STy->getElementType(i))); 2217f22ef01cSRoman Divacky V = ConstantStruct::get(STy, Elts); 22186122f3e6SDimitry Andric } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { 22196122f3e6SDimitry Andric Type *EltTy = ATy->getElementType(); 2220f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2221f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2222f22ef01cSRoman Divacky V = ConstantArray::get(ATy, Elts); 22236122f3e6SDimitry Andric } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { 22246122f3e6SDimitry Andric Type *EltTy = VTy->getElementType(); 2225f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2226f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2227f22ef01cSRoman Divacky V = ConstantVector::get(Elts); 2228f22ef01cSRoman Divacky } else { 2229f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2230f22ef01cSRoman Divacky } 2231f22ef01cSRoman Divacky break; 2232f22ef01cSRoman Divacky } 2233dff0c46cSDimitry Andric case bitc::CST_CODE_STRING: // STRING: [values] 2234f22ef01cSRoman Divacky case bitc::CST_CODE_CSTRING: { // CSTRING: [values] 2235f22ef01cSRoman Divacky if (Record.empty()) 223639d628a0SDimitry Andric return Error("Invalid record"); 2237f22ef01cSRoman Divacky 22387ae0e2c9SDimitry Andric SmallString<16> Elts(Record.begin(), Record.end()); 2239dff0c46cSDimitry Andric V = ConstantDataArray::getString(Context, Elts, 2240dff0c46cSDimitry Andric BitCode == bitc::CST_CODE_CSTRING); 2241f22ef01cSRoman Divacky break; 2242f22ef01cSRoman Divacky } 2243dff0c46cSDimitry Andric case bitc::CST_CODE_DATA: {// DATA: [n x value] 2244dff0c46cSDimitry Andric if (Record.empty()) 224539d628a0SDimitry Andric return Error("Invalid record"); 2246dff0c46cSDimitry Andric 2247dff0c46cSDimitry Andric Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); 2248dff0c46cSDimitry Andric unsigned Size = Record.size(); 2249dff0c46cSDimitry Andric 2250dff0c46cSDimitry Andric if (EltTy->isIntegerTy(8)) { 2251dff0c46cSDimitry Andric SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); 2252dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2253dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2254dff0c46cSDimitry Andric else 2255dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2256dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(16)) { 2257dff0c46cSDimitry Andric SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end()); 2258dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2259dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2260dff0c46cSDimitry Andric else 2261dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2262dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(32)) { 2263dff0c46cSDimitry Andric SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end()); 2264dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2265dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2266dff0c46cSDimitry Andric else 2267dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2268dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(64)) { 2269dff0c46cSDimitry Andric SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end()); 2270dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2271dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2272dff0c46cSDimitry Andric else 2273dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2274dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 22757ae0e2c9SDimitry Andric SmallVector<float, 16> Elts(Size); 22767ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), BitsToFloat); 2277dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2278dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2279dff0c46cSDimitry Andric else 2280dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2281dff0c46cSDimitry Andric } else if (EltTy->isDoubleTy()) { 22827ae0e2c9SDimitry Andric SmallVector<double, 16> Elts(Size); 22837ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), 22847ae0e2c9SDimitry Andric BitsToDouble); 2285dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2286dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2287dff0c46cSDimitry Andric else 2288dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2289dff0c46cSDimitry Andric } else { 229039d628a0SDimitry Andric return Error("Invalid type for value"); 2291dff0c46cSDimitry Andric } 2292dff0c46cSDimitry Andric break; 2293dff0c46cSDimitry Andric } 2294dff0c46cSDimitry Andric 2295f22ef01cSRoman Divacky case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] 2296f785676fSDimitry Andric if (Record.size() < 3) 229739d628a0SDimitry Andric return Error("Invalid record"); 2298f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); 2299f22ef01cSRoman Divacky if (Opc < 0) { 2300f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown binop. 2301f22ef01cSRoman Divacky } else { 2302f22ef01cSRoman Divacky Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); 2303f22ef01cSRoman Divacky Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); 2304f22ef01cSRoman Divacky unsigned Flags = 0; 2305f22ef01cSRoman Divacky if (Record.size() >= 4) { 2306f22ef01cSRoman Divacky if (Opc == Instruction::Add || 2307f22ef01cSRoman Divacky Opc == Instruction::Sub || 23082754fe60SDimitry Andric Opc == Instruction::Mul || 23092754fe60SDimitry Andric Opc == Instruction::Shl) { 2310f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 2311f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoSignedWrap; 2312f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 2313f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoUnsignedWrap; 23142754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 23152754fe60SDimitry Andric Opc == Instruction::UDiv || 23162754fe60SDimitry Andric Opc == Instruction::LShr || 23172754fe60SDimitry Andric Opc == Instruction::AShr) { 23182754fe60SDimitry Andric if (Record[3] & (1 << bitc::PEO_EXACT)) 2319f22ef01cSRoman Divacky Flags |= SDivOperator::IsExact; 2320f22ef01cSRoman Divacky } 2321f22ef01cSRoman Divacky } 2322f22ef01cSRoman Divacky V = ConstantExpr::get(Opc, LHS, RHS, Flags); 2323f22ef01cSRoman Divacky } 2324f22ef01cSRoman Divacky break; 2325f22ef01cSRoman Divacky } 2326f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] 2327f785676fSDimitry Andric if (Record.size() < 3) 232839d628a0SDimitry Andric return Error("Invalid record"); 2329f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[0]); 2330f22ef01cSRoman Divacky if (Opc < 0) { 2331f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown cast. 2332f22ef01cSRoman Divacky } else { 23336122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 2334f785676fSDimitry Andric if (!OpTy) 233539d628a0SDimitry Andric return Error("Invalid record"); 2336f22ef01cSRoman Divacky Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); 2337f785676fSDimitry Andric V = UpgradeBitCastExpr(Opc, Op, CurTy); 2338f785676fSDimitry Andric if (!V) V = ConstantExpr::getCast(Opc, Op, CurTy); 2339f22ef01cSRoman Divacky } 2340f22ef01cSRoman Divacky break; 2341f22ef01cSRoman Divacky } 2342f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INBOUNDS_GEP: 2343f22ef01cSRoman Divacky case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] 2344ff0cc061SDimitry Andric unsigned OpNum = 0; 2345ff0cc061SDimitry Andric Type *PointeeType = nullptr; 2346ff0cc061SDimitry Andric if (Record.size() % 2) 2347ff0cc061SDimitry Andric PointeeType = getTypeByID(Record[OpNum++]); 2348f22ef01cSRoman Divacky SmallVector<Constant*, 16> Elts; 2349ff0cc061SDimitry Andric while (OpNum != Record.size()) { 2350ff0cc061SDimitry Andric Type *ElTy = getTypeByID(Record[OpNum++]); 2351f785676fSDimitry Andric if (!ElTy) 235239d628a0SDimitry Andric return Error("Invalid record"); 2353ff0cc061SDimitry Andric Elts.push_back(ValueList.getConstantFwdRef(Record[OpNum++], ElTy)); 2354f22ef01cSRoman Divacky } 2355ff0cc061SDimitry Andric 2356ff0cc061SDimitry Andric if (PointeeType && 2357ff0cc061SDimitry Andric PointeeType != 2358ff0cc061SDimitry Andric cast<SequentialType>(Elts[0]->getType()->getScalarType()) 2359ff0cc061SDimitry Andric ->getElementType()) 2360ff0cc061SDimitry Andric return Error("Explicit gep operator type does not match pointee type " 2361ff0cc061SDimitry Andric "of pointer operand"); 2362ff0cc061SDimitry Andric 23636122f3e6SDimitry Andric ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); 2364ff0cc061SDimitry Andric V = ConstantExpr::getGetElementPtr(PointeeType, Elts[0], Indices, 23656122f3e6SDimitry Andric BitCode == 23666122f3e6SDimitry Andric bitc::CST_CODE_CE_INBOUNDS_GEP); 2367f22ef01cSRoman Divacky break; 2368f22ef01cSRoman Divacky } 2369f785676fSDimitry Andric case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#] 2370f785676fSDimitry Andric if (Record.size() < 3) 237139d628a0SDimitry Andric return Error("Invalid record"); 2372f785676fSDimitry Andric 2373f785676fSDimitry Andric Type *SelectorTy = Type::getInt1Ty(Context); 2374f785676fSDimitry Andric 2375f785676fSDimitry Andric // If CurTy is a vector of length n, then Record[0] must be a <n x i1> 2376f785676fSDimitry Andric // vector. Otherwise, it must be a single bit. 2377f785676fSDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) 2378f785676fSDimitry Andric SelectorTy = VectorType::get(Type::getInt1Ty(Context), 2379f785676fSDimitry Andric VTy->getNumElements()); 2380f785676fSDimitry Andric 2381f785676fSDimitry Andric V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], 2382f785676fSDimitry Andric SelectorTy), 2383f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[1],CurTy), 2384f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[2],CurTy)); 2385f22ef01cSRoman Divacky break; 2386f785676fSDimitry Andric } 238791bc56edSDimitry Andric case bitc::CST_CODE_CE_EXTRACTELT 238891bc56edSDimitry Andric : { // CE_EXTRACTELT: [opty, opval, opty, opval] 2389f785676fSDimitry Andric if (Record.size() < 3) 239039d628a0SDimitry Andric return Error("Invalid record"); 23916122f3e6SDimitry Andric VectorType *OpTy = 2392f22ef01cSRoman Divacky dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 239391bc56edSDimitry Andric if (!OpTy) 239439d628a0SDimitry Andric return Error("Invalid record"); 2395f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 239691bc56edSDimitry Andric Constant *Op1 = nullptr; 239791bc56edSDimitry Andric if (Record.size() == 4) { 239891bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 239991bc56edSDimitry Andric if (!IdxTy) 240039d628a0SDimitry Andric return Error("Invalid record"); 240191bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[3], IdxTy); 240291bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 240391bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 240491bc56edSDimitry Andric if (!Op1) 240539d628a0SDimitry Andric return Error("Invalid record"); 2406f22ef01cSRoman Divacky V = ConstantExpr::getExtractElement(Op0, Op1); 2407f22ef01cSRoman Divacky break; 2408f22ef01cSRoman Divacky } 240991bc56edSDimitry Andric case bitc::CST_CODE_CE_INSERTELT 241091bc56edSDimitry Andric : { // CE_INSERTELT: [opval, opval, opty, opval] 24116122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 241291bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 241339d628a0SDimitry Andric return Error("Invalid record"); 2414f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2415f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], 2416f22ef01cSRoman Divacky OpTy->getElementType()); 241791bc56edSDimitry Andric Constant *Op2 = nullptr; 241891bc56edSDimitry Andric if (Record.size() == 4) { 241991bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 242091bc56edSDimitry Andric if (!IdxTy) 242139d628a0SDimitry Andric return Error("Invalid record"); 242291bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[3], IdxTy); 242391bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 242491bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 242591bc56edSDimitry Andric if (!Op2) 242639d628a0SDimitry Andric return Error("Invalid record"); 2427f22ef01cSRoman Divacky V = ConstantExpr::getInsertElement(Op0, Op1, Op2); 2428f22ef01cSRoman Divacky break; 2429f22ef01cSRoman Divacky } 2430f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] 24316122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 243291bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 243339d628a0SDimitry Andric return Error("Invalid record"); 2434f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2435f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); 24366122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2437f22ef01cSRoman Divacky OpTy->getNumElements()); 2438f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); 2439f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2440f22ef01cSRoman Divacky break; 2441f22ef01cSRoman Divacky } 2442f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] 24436122f3e6SDimitry Andric VectorType *RTy = dyn_cast<VectorType>(CurTy); 24446122f3e6SDimitry Andric VectorType *OpTy = 24452754fe60SDimitry Andric dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 244691bc56edSDimitry Andric if (Record.size() < 4 || !RTy || !OpTy) 244739d628a0SDimitry Andric return Error("Invalid record"); 2448f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2449f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 24506122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2451f22ef01cSRoman Divacky RTy->getNumElements()); 2452f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); 2453f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2454f22ef01cSRoman Divacky break; 2455f22ef01cSRoman Divacky } 2456f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] 2457f785676fSDimitry Andric if (Record.size() < 4) 245839d628a0SDimitry Andric return Error("Invalid record"); 24596122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 246091bc56edSDimitry Andric if (!OpTy) 246139d628a0SDimitry Andric return Error("Invalid record"); 2462f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2463f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 2464f22ef01cSRoman Divacky 2465f22ef01cSRoman Divacky if (OpTy->isFPOrFPVectorTy()) 2466f22ef01cSRoman Divacky V = ConstantExpr::getFCmp(Record[3], Op0, Op1); 2467f22ef01cSRoman Divacky else 2468f22ef01cSRoman Divacky V = ConstantExpr::getICmp(Record[3], Op0, Op1); 2469f22ef01cSRoman Divacky break; 2470f22ef01cSRoman Divacky } 24713861d79fSDimitry Andric // This maintains backward compatibility, pre-asm dialect keywords. 24723861d79fSDimitry Andric // FIXME: Remove with the 4.0 release. 24733861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM_OLD: { 2474f785676fSDimitry Andric if (Record.size() < 2) 247539d628a0SDimitry Andric return Error("Invalid record"); 2476f22ef01cSRoman Divacky std::string AsmStr, ConstrStr; 2477f22ef01cSRoman Divacky bool HasSideEffects = Record[0] & 1; 2478f22ef01cSRoman Divacky bool IsAlignStack = Record[0] >> 1; 2479f22ef01cSRoman Divacky unsigned AsmStrSize = Record[1]; 2480f22ef01cSRoman Divacky if (2+AsmStrSize >= Record.size()) 248139d628a0SDimitry Andric return Error("Invalid record"); 2482f22ef01cSRoman Divacky unsigned ConstStrSize = Record[2+AsmStrSize]; 2483f22ef01cSRoman Divacky if (3+AsmStrSize+ConstStrSize > Record.size()) 248439d628a0SDimitry Andric return Error("Invalid record"); 2485f22ef01cSRoman Divacky 2486f22ef01cSRoman Divacky for (unsigned i = 0; i != AsmStrSize; ++i) 2487f22ef01cSRoman Divacky AsmStr += (char)Record[2+i]; 2488f22ef01cSRoman Divacky for (unsigned i = 0; i != ConstStrSize; ++i) 2489f22ef01cSRoman Divacky ConstrStr += (char)Record[3+AsmStrSize+i]; 24906122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 2491f22ef01cSRoman Divacky V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 2492f22ef01cSRoman Divacky AsmStr, ConstrStr, HasSideEffects, IsAlignStack); 2493f22ef01cSRoman Divacky break; 2494f22ef01cSRoman Divacky } 24953861d79fSDimitry Andric // This version adds support for the asm dialect keywords (e.g., 24963861d79fSDimitry Andric // inteldialect). 24973861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM: { 2498f785676fSDimitry Andric if (Record.size() < 2) 249939d628a0SDimitry Andric return Error("Invalid record"); 25003861d79fSDimitry Andric std::string AsmStr, ConstrStr; 25013861d79fSDimitry Andric bool HasSideEffects = Record[0] & 1; 25023861d79fSDimitry Andric bool IsAlignStack = (Record[0] >> 1) & 1; 25033861d79fSDimitry Andric unsigned AsmDialect = Record[0] >> 2; 25043861d79fSDimitry Andric unsigned AsmStrSize = Record[1]; 25053861d79fSDimitry Andric if (2+AsmStrSize >= Record.size()) 250639d628a0SDimitry Andric return Error("Invalid record"); 25073861d79fSDimitry Andric unsigned ConstStrSize = Record[2+AsmStrSize]; 25083861d79fSDimitry Andric if (3+AsmStrSize+ConstStrSize > Record.size()) 250939d628a0SDimitry Andric return Error("Invalid record"); 25103861d79fSDimitry Andric 25113861d79fSDimitry Andric for (unsigned i = 0; i != AsmStrSize; ++i) 25123861d79fSDimitry Andric AsmStr += (char)Record[2+i]; 25133861d79fSDimitry Andric for (unsigned i = 0; i != ConstStrSize; ++i) 25143861d79fSDimitry Andric ConstrStr += (char)Record[3+AsmStrSize+i]; 25153861d79fSDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 25163861d79fSDimitry Andric V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 25173861d79fSDimitry Andric AsmStr, ConstrStr, HasSideEffects, IsAlignStack, 25183861d79fSDimitry Andric InlineAsm::AsmDialect(AsmDialect)); 25193861d79fSDimitry Andric break; 25203861d79fSDimitry Andric } 2521f22ef01cSRoman Divacky case bitc::CST_CODE_BLOCKADDRESS:{ 2522f785676fSDimitry Andric if (Record.size() < 3) 252339d628a0SDimitry Andric return Error("Invalid record"); 25246122f3e6SDimitry Andric Type *FnTy = getTypeByID(Record[0]); 252591bc56edSDimitry Andric if (!FnTy) 252639d628a0SDimitry Andric return Error("Invalid record"); 2527f22ef01cSRoman Divacky Function *Fn = 2528f22ef01cSRoman Divacky dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); 252991bc56edSDimitry Andric if (!Fn) 253039d628a0SDimitry Andric return Error("Invalid record"); 253139d628a0SDimitry Andric 253239d628a0SDimitry Andric // Don't let Fn get dematerialized. 253339d628a0SDimitry Andric BlockAddressesTaken.insert(Fn); 2534f22ef01cSRoman Divacky 25353861d79fSDimitry Andric // If the function is already parsed we can insert the block address right 25363861d79fSDimitry Andric // away. 253739d628a0SDimitry Andric BasicBlock *BB; 253839d628a0SDimitry Andric unsigned BBID = Record[2]; 253939d628a0SDimitry Andric if (!BBID) 254039d628a0SDimitry Andric // Invalid reference to entry block. 254139d628a0SDimitry Andric return Error("Invalid ID"); 25423861d79fSDimitry Andric if (!Fn->empty()) { 25433861d79fSDimitry Andric Function::iterator BBI = Fn->begin(), BBE = Fn->end(); 254439d628a0SDimitry Andric for (size_t I = 0, E = BBID; I != E; ++I) { 25453861d79fSDimitry Andric if (BBI == BBE) 254639d628a0SDimitry Andric return Error("Invalid ID"); 25473861d79fSDimitry Andric ++BBI; 25483861d79fSDimitry Andric } 254939d628a0SDimitry Andric BB = BBI; 25503861d79fSDimitry Andric } else { 25513861d79fSDimitry Andric // Otherwise insert a placeholder and remember it so it can be inserted 25523861d79fSDimitry Andric // when the function is parsed. 255339d628a0SDimitry Andric auto &FwdBBs = BasicBlockFwdRefs[Fn]; 255439d628a0SDimitry Andric if (FwdBBs.empty()) 255539d628a0SDimitry Andric BasicBlockFwdRefQueue.push_back(Fn); 255639d628a0SDimitry Andric if (FwdBBs.size() < BBID + 1) 255739d628a0SDimitry Andric FwdBBs.resize(BBID + 1); 255839d628a0SDimitry Andric if (!FwdBBs[BBID]) 255939d628a0SDimitry Andric FwdBBs[BBID] = BasicBlock::Create(Context); 256039d628a0SDimitry Andric BB = FwdBBs[BBID]; 25613861d79fSDimitry Andric } 256239d628a0SDimitry Andric V = BlockAddress::get(Fn, BB); 2563f22ef01cSRoman Divacky break; 2564f22ef01cSRoman Divacky } 2565f22ef01cSRoman Divacky } 2566f22ef01cSRoman Divacky 2567f22ef01cSRoman Divacky ValueList.AssignValue(V, NextCstNo); 2568f22ef01cSRoman Divacky ++NextCstNo; 2569f22ef01cSRoman Divacky } 2570f22ef01cSRoman Divacky } 2571f22ef01cSRoman Divacky 257291bc56edSDimitry Andric std::error_code BitcodeReader::ParseUseLists() { 2573dff0c46cSDimitry Andric if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) 257439d628a0SDimitry Andric return Error("Invalid record"); 2575dff0c46cSDimitry Andric 2576dff0c46cSDimitry Andric // Read all the records. 257739d628a0SDimitry Andric SmallVector<uint64_t, 64> Record; 2578dff0c46cSDimitry Andric while (1) { 2579139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2580139f7f9bSDimitry Andric 2581139f7f9bSDimitry Andric switch (Entry.Kind) { 2582139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2583139f7f9bSDimitry Andric case BitstreamEntry::Error: 258439d628a0SDimitry Andric return Error("Malformed block"); 2585139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 258691bc56edSDimitry Andric return std::error_code(); 2587139f7f9bSDimitry Andric case BitstreamEntry::Record: 2588139f7f9bSDimitry Andric // The interesting case. 2589139f7f9bSDimitry Andric break; 2590dff0c46cSDimitry Andric } 2591dff0c46cSDimitry Andric 2592dff0c46cSDimitry Andric // Read a use list record. 2593dff0c46cSDimitry Andric Record.clear(); 259439d628a0SDimitry Andric bool IsBB = false; 2595139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2596dff0c46cSDimitry Andric default: // Default behavior: unknown type. 2597dff0c46cSDimitry Andric break; 259839d628a0SDimitry Andric case bitc::USELIST_CODE_BB: 259939d628a0SDimitry Andric IsBB = true; 260039d628a0SDimitry Andric // fallthrough 260139d628a0SDimitry Andric case bitc::USELIST_CODE_DEFAULT: { 2602dff0c46cSDimitry Andric unsigned RecordLength = Record.size(); 260339d628a0SDimitry Andric if (RecordLength < 3) 260439d628a0SDimitry Andric // Records should have at least an ID and two indexes. 260539d628a0SDimitry Andric return Error("Invalid record"); 260639d628a0SDimitry Andric unsigned ID = Record.back(); 260739d628a0SDimitry Andric Record.pop_back(); 260839d628a0SDimitry Andric 260939d628a0SDimitry Andric Value *V; 261039d628a0SDimitry Andric if (IsBB) { 261139d628a0SDimitry Andric assert(ID < FunctionBBs.size() && "Basic block not found"); 261239d628a0SDimitry Andric V = FunctionBBs[ID]; 261339d628a0SDimitry Andric } else 261439d628a0SDimitry Andric V = ValueList[ID]; 261539d628a0SDimitry Andric unsigned NumUses = 0; 261639d628a0SDimitry Andric SmallDenseMap<const Use *, unsigned, 16> Order; 261739d628a0SDimitry Andric for (const Use &U : V->uses()) { 261839d628a0SDimitry Andric if (++NumUses > Record.size()) 261939d628a0SDimitry Andric break; 262039d628a0SDimitry Andric Order[&U] = Record[NumUses - 1]; 262139d628a0SDimitry Andric } 262239d628a0SDimitry Andric if (Order.size() != Record.size() || NumUses > Record.size()) 262339d628a0SDimitry Andric // Mismatches can happen if the functions are being materialized lazily 262439d628a0SDimitry Andric // (out-of-order), or a value has been upgraded. 262539d628a0SDimitry Andric break; 262639d628a0SDimitry Andric 262739d628a0SDimitry Andric V->sortUseList([&](const Use &L, const Use &R) { 262839d628a0SDimitry Andric return Order.lookup(&L) < Order.lookup(&R); 262939d628a0SDimitry Andric }); 2630dff0c46cSDimitry Andric break; 2631dff0c46cSDimitry Andric } 2632dff0c46cSDimitry Andric } 2633dff0c46cSDimitry Andric } 2634dff0c46cSDimitry Andric } 2635dff0c46cSDimitry Andric 2636ff0cc061SDimitry Andric /// When we see the block for metadata, remember where it is and then skip it. 2637ff0cc061SDimitry Andric /// This lets us lazily deserialize the metadata. 2638ff0cc061SDimitry Andric std::error_code BitcodeReader::rememberAndSkipMetadata() { 2639ff0cc061SDimitry Andric // Save the current stream state. 2640ff0cc061SDimitry Andric uint64_t CurBit = Stream.GetCurrentBitNo(); 2641ff0cc061SDimitry Andric DeferredMetadataInfo.push_back(CurBit); 2642ff0cc061SDimitry Andric 2643ff0cc061SDimitry Andric // Skip over the block for now. 2644ff0cc061SDimitry Andric if (Stream.SkipBlock()) 2645ff0cc061SDimitry Andric return Error("Invalid record"); 2646ff0cc061SDimitry Andric return std::error_code(); 2647ff0cc061SDimitry Andric } 2648ff0cc061SDimitry Andric 2649ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeMetadata() { 2650ff0cc061SDimitry Andric for (uint64_t BitPos : DeferredMetadataInfo) { 2651ff0cc061SDimitry Andric // Move the bit stream to the saved position. 2652ff0cc061SDimitry Andric Stream.JumpToBit(BitPos); 2653ff0cc061SDimitry Andric if (std::error_code EC = ParseMetadata()) 2654ff0cc061SDimitry Andric return EC; 2655ff0cc061SDimitry Andric } 2656ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 2657ff0cc061SDimitry Andric return std::error_code(); 2658ff0cc061SDimitry Andric } 2659ff0cc061SDimitry Andric 2660ff0cc061SDimitry Andric void BitcodeReader::setStripDebugInfo() { StripDebugInfo = true; } 2661ff0cc061SDimitry Andric 2662f22ef01cSRoman Divacky /// RememberAndSkipFunctionBody - When we see the block for a function body, 2663f22ef01cSRoman Divacky /// remember where it is and then skip it. This lets us lazily deserialize the 2664f22ef01cSRoman Divacky /// functions. 266591bc56edSDimitry Andric std::error_code BitcodeReader::RememberAndSkipFunctionBody() { 2666f22ef01cSRoman Divacky // Get the function we are talking about. 2667f22ef01cSRoman Divacky if (FunctionsWithBodies.empty()) 266839d628a0SDimitry Andric return Error("Insufficient function protos"); 2669f22ef01cSRoman Divacky 2670f22ef01cSRoman Divacky Function *Fn = FunctionsWithBodies.back(); 2671f22ef01cSRoman Divacky FunctionsWithBodies.pop_back(); 2672f22ef01cSRoman Divacky 2673f22ef01cSRoman Divacky // Save the current stream state. 2674f22ef01cSRoman Divacky uint64_t CurBit = Stream.GetCurrentBitNo(); 2675f22ef01cSRoman Divacky DeferredFunctionInfo[Fn] = CurBit; 2676f22ef01cSRoman Divacky 2677f22ef01cSRoman Divacky // Skip over the function block for now. 2678f22ef01cSRoman Divacky if (Stream.SkipBlock()) 267939d628a0SDimitry Andric return Error("Invalid record"); 268091bc56edSDimitry Andric return std::error_code(); 2681f22ef01cSRoman Divacky } 2682f22ef01cSRoman Divacky 268391bc56edSDimitry Andric std::error_code BitcodeReader::GlobalCleanup() { 2684f22ef01cSRoman Divacky // Patch the initializers for globals and aliases up. 2685f22ef01cSRoman Divacky ResolveGlobalAndAliasInits(); 2686f22ef01cSRoman Divacky if (!GlobalInits.empty() || !AliasInits.empty()) 268739d628a0SDimitry Andric return Error("Malformed global initializer set"); 2688f22ef01cSRoman Divacky 2689f22ef01cSRoman Divacky // Look for intrinsic functions which need to be upgraded at some point 2690f22ef01cSRoman Divacky for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); 2691f22ef01cSRoman Divacky FI != FE; ++FI) { 2692f22ef01cSRoman Divacky Function *NewFn; 2693f22ef01cSRoman Divacky if (UpgradeIntrinsicFunction(FI, NewFn)) 2694f22ef01cSRoman Divacky UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); 2695f22ef01cSRoman Divacky } 2696f22ef01cSRoman Divacky 2697e580952dSDimitry Andric // Look for global variables which need to be renamed. 2698e580952dSDimitry Andric for (Module::global_iterator 2699e580952dSDimitry Andric GI = TheModule->global_begin(), GE = TheModule->global_end(); 270091bc56edSDimitry Andric GI != GE;) { 270191bc56edSDimitry Andric GlobalVariable *GV = GI++; 270291bc56edSDimitry Andric UpgradeGlobalVariable(GV); 270391bc56edSDimitry Andric } 270491bc56edSDimitry Andric 2705f22ef01cSRoman Divacky // Force deallocation of memory for these vectors to favor the client that 2706f22ef01cSRoman Divacky // want lazy deserialization. 2707f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); 2708f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); 270991bc56edSDimitry Andric return std::error_code(); 2710f22ef01cSRoman Divacky } 2711f22ef01cSRoman Divacky 2712ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseModule(bool Resume, 2713ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 2714dff0c46cSDimitry Andric if (Resume) 2715dff0c46cSDimitry Andric Stream.JumpToBit(NextUnreadBit); 2716dff0c46cSDimitry Andric else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 271739d628a0SDimitry Andric return Error("Invalid record"); 2718dff0c46cSDimitry Andric 2719dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 2720dff0c46cSDimitry Andric std::vector<std::string> SectionTable; 2721dff0c46cSDimitry Andric std::vector<std::string> GCTable; 2722dff0c46cSDimitry Andric 2723dff0c46cSDimitry Andric // Read all the records for this module. 2724139f7f9bSDimitry Andric while (1) { 2725139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 2726dff0c46cSDimitry Andric 2727139f7f9bSDimitry Andric switch (Entry.Kind) { 2728139f7f9bSDimitry Andric case BitstreamEntry::Error: 272939d628a0SDimitry Andric return Error("Malformed block"); 2730139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2731dff0c46cSDimitry Andric return GlobalCleanup(); 2732dff0c46cSDimitry Andric 2733139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2734139f7f9bSDimitry Andric switch (Entry.ID) { 2735f22ef01cSRoman Divacky default: // Skip unknown content. 2736f22ef01cSRoman Divacky if (Stream.SkipBlock()) 273739d628a0SDimitry Andric return Error("Invalid record"); 2738f22ef01cSRoman Divacky break; 2739f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 2740f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 274139d628a0SDimitry Andric return Error("Malformed block"); 2742f22ef01cSRoman Divacky break; 2743f22ef01cSRoman Divacky case bitc::PARAMATTR_BLOCK_ID: 274491bc56edSDimitry Andric if (std::error_code EC = ParseAttributeBlock()) 2745f785676fSDimitry Andric return EC; 2746f22ef01cSRoman Divacky break; 2747139f7f9bSDimitry Andric case bitc::PARAMATTR_GROUP_BLOCK_ID: 274891bc56edSDimitry Andric if (std::error_code EC = ParseAttributeGroupBlock()) 2749f785676fSDimitry Andric return EC; 2750139f7f9bSDimitry Andric break; 275117a519f9SDimitry Andric case bitc::TYPE_BLOCK_ID_NEW: 275291bc56edSDimitry Andric if (std::error_code EC = ParseTypeTable()) 2753f785676fSDimitry Andric return EC; 2754f22ef01cSRoman Divacky break; 2755f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 275691bc56edSDimitry Andric if (std::error_code EC = ParseValueSymbolTable()) 2757f785676fSDimitry Andric return EC; 2758dff0c46cSDimitry Andric SeenValueSymbolTable = true; 2759f22ef01cSRoman Divacky break; 2760f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 276191bc56edSDimitry Andric if (std::error_code EC = ParseConstants()) 2762f785676fSDimitry Andric return EC; 276391bc56edSDimitry Andric if (std::error_code EC = ResolveGlobalAndAliasInits()) 2764f785676fSDimitry Andric return EC; 2765f22ef01cSRoman Divacky break; 2766f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 2767ff0cc061SDimitry Andric if (ShouldLazyLoadMetadata && !IsMetadataMaterialized) { 2768ff0cc061SDimitry Andric if (std::error_code EC = rememberAndSkipMetadata()) 2769ff0cc061SDimitry Andric return EC; 2770ff0cc061SDimitry Andric break; 2771ff0cc061SDimitry Andric } 2772ff0cc061SDimitry Andric assert(DeferredMetadataInfo.empty() && "Unexpected deferred metadata"); 277391bc56edSDimitry Andric if (std::error_code EC = ParseMetadata()) 2774f785676fSDimitry Andric return EC; 2775f22ef01cSRoman Divacky break; 2776f22ef01cSRoman Divacky case bitc::FUNCTION_BLOCK_ID: 2777f22ef01cSRoman Divacky // If this is the first function body we've seen, reverse the 2778f22ef01cSRoman Divacky // FunctionsWithBodies list. 2779dff0c46cSDimitry Andric if (!SeenFirstFunctionBody) { 2780f22ef01cSRoman Divacky std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); 278191bc56edSDimitry Andric if (std::error_code EC = GlobalCleanup()) 2782f785676fSDimitry Andric return EC; 2783dff0c46cSDimitry Andric SeenFirstFunctionBody = true; 2784f22ef01cSRoman Divacky } 2785f22ef01cSRoman Divacky 278691bc56edSDimitry Andric if (std::error_code EC = RememberAndSkipFunctionBody()) 2787f785676fSDimitry Andric return EC; 2788dff0c46cSDimitry Andric // For streaming bitcode, suspend parsing when we reach the function 2789dff0c46cSDimitry Andric // bodies. Subsequent materialization calls will resume it when 2790dff0c46cSDimitry Andric // necessary. For streaming, the function bodies must be at the end of 2791dff0c46cSDimitry Andric // the bitcode. If the bitcode file is old, the symbol table will be 2792dff0c46cSDimitry Andric // at the end instead and will not have been seen yet. In this case, 2793dff0c46cSDimitry Andric // just finish the parse now. 2794dff0c46cSDimitry Andric if (LazyStreamer && SeenValueSymbolTable) { 2795dff0c46cSDimitry Andric NextUnreadBit = Stream.GetCurrentBitNo(); 279691bc56edSDimitry Andric return std::error_code(); 2797dff0c46cSDimitry Andric } 2798dff0c46cSDimitry Andric break; 2799dff0c46cSDimitry Andric case bitc::USELIST_BLOCK_ID: 280091bc56edSDimitry Andric if (std::error_code EC = ParseUseLists()) 2801f785676fSDimitry Andric return EC; 2802f22ef01cSRoman Divacky break; 2803f22ef01cSRoman Divacky } 2804f22ef01cSRoman Divacky continue; 2805139f7f9bSDimitry Andric 2806139f7f9bSDimitry Andric case BitstreamEntry::Record: 2807139f7f9bSDimitry Andric // The interesting case. 2808139f7f9bSDimitry Andric break; 2809f22ef01cSRoman Divacky } 2810f22ef01cSRoman Divacky 2811f22ef01cSRoman Divacky 2812f22ef01cSRoman Divacky // Read a record. 2813139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2814f22ef01cSRoman Divacky default: break; // Default behavior, ignore unknown content. 28153861d79fSDimitry Andric case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] 2816f22ef01cSRoman Divacky if (Record.size() < 1) 281739d628a0SDimitry Andric return Error("Invalid record"); 28183861d79fSDimitry Andric // Only version #0 and #1 are supported so far. 28193861d79fSDimitry Andric unsigned module_version = Record[0]; 28203861d79fSDimitry Andric switch (module_version) { 2821f785676fSDimitry Andric default: 282239d628a0SDimitry Andric return Error("Invalid value"); 28233861d79fSDimitry Andric case 0: 28243861d79fSDimitry Andric UseRelativeIDs = false; 2825f22ef01cSRoman Divacky break; 28263861d79fSDimitry Andric case 1: 28273861d79fSDimitry Andric UseRelativeIDs = true; 28283861d79fSDimitry Andric break; 28293861d79fSDimitry Andric } 28303861d79fSDimitry Andric break; 28313861d79fSDimitry Andric } 2832f22ef01cSRoman Divacky case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 2833f22ef01cSRoman Divacky std::string S; 2834f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 283539d628a0SDimitry Andric return Error("Invalid record"); 2836f22ef01cSRoman Divacky TheModule->setTargetTriple(S); 2837f22ef01cSRoman Divacky break; 2838f22ef01cSRoman Divacky } 2839f22ef01cSRoman Divacky case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] 2840f22ef01cSRoman Divacky std::string S; 2841f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 284239d628a0SDimitry Andric return Error("Invalid record"); 2843f22ef01cSRoman Divacky TheModule->setDataLayout(S); 2844f22ef01cSRoman Divacky break; 2845f22ef01cSRoman Divacky } 2846f22ef01cSRoman Divacky case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] 2847f22ef01cSRoman Divacky std::string S; 2848f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 284939d628a0SDimitry Andric return Error("Invalid record"); 2850f22ef01cSRoman Divacky TheModule->setModuleInlineAsm(S); 2851f22ef01cSRoman Divacky break; 2852f22ef01cSRoman Divacky } 2853f22ef01cSRoman Divacky case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] 2854139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 2855f22ef01cSRoman Divacky std::string S; 2856f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 285739d628a0SDimitry Andric return Error("Invalid record"); 2858139f7f9bSDimitry Andric // Ignore value. 2859f22ef01cSRoman Divacky break; 2860f22ef01cSRoman Divacky } 2861f22ef01cSRoman Divacky case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] 2862f22ef01cSRoman Divacky std::string S; 2863f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 286439d628a0SDimitry Andric return Error("Invalid record"); 2865f22ef01cSRoman Divacky SectionTable.push_back(S); 2866f22ef01cSRoman Divacky break; 2867f22ef01cSRoman Divacky } 2868f22ef01cSRoman Divacky case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] 2869f22ef01cSRoman Divacky std::string S; 2870f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 287139d628a0SDimitry Andric return Error("Invalid record"); 2872f22ef01cSRoman Divacky GCTable.push_back(S); 2873f22ef01cSRoman Divacky break; 2874f22ef01cSRoman Divacky } 287591bc56edSDimitry Andric case bitc::MODULE_CODE_COMDAT: { // COMDAT: [selection_kind, name] 287691bc56edSDimitry Andric if (Record.size() < 2) 287739d628a0SDimitry Andric return Error("Invalid record"); 287891bc56edSDimitry Andric Comdat::SelectionKind SK = getDecodedComdatSelectionKind(Record[0]); 287991bc56edSDimitry Andric unsigned ComdatNameSize = Record[1]; 288091bc56edSDimitry Andric std::string ComdatName; 288191bc56edSDimitry Andric ComdatName.reserve(ComdatNameSize); 288291bc56edSDimitry Andric for (unsigned i = 0; i != ComdatNameSize; ++i) 288391bc56edSDimitry Andric ComdatName += (char)Record[2 + i]; 288491bc56edSDimitry Andric Comdat *C = TheModule->getOrInsertComdat(ComdatName); 288591bc56edSDimitry Andric C->setSelectionKind(SK); 288691bc56edSDimitry Andric ComdatList.push_back(C); 288791bc56edSDimitry Andric break; 288891bc56edSDimitry Andric } 2889f22ef01cSRoman Divacky // GLOBALVAR: [pointer type, isconst, initid, 28902754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 2891ff0cc061SDimitry Andric // unnamed_addr, externally_initialized, dllstorageclass, 2892ff0cc061SDimitry Andric // comdat] 2893f22ef01cSRoman Divacky case bitc::MODULE_CODE_GLOBALVAR: { 2894f22ef01cSRoman Divacky if (Record.size() < 6) 289539d628a0SDimitry Andric return Error("Invalid record"); 28966122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2897f785676fSDimitry Andric if (!Ty) 289839d628a0SDimitry Andric return Error("Invalid record"); 2899ff0cc061SDimitry Andric bool isConstant = Record[1] & 1; 2900ff0cc061SDimitry Andric bool explicitType = Record[1] & 2; 2901ff0cc061SDimitry Andric unsigned AddressSpace; 2902ff0cc061SDimitry Andric if (explicitType) { 2903ff0cc061SDimitry Andric AddressSpace = Record[1] >> 2; 2904ff0cc061SDimitry Andric } else { 2905f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 290639d628a0SDimitry Andric return Error("Invalid type for value"); 2907ff0cc061SDimitry Andric AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); 2908f22ef01cSRoman Divacky Ty = cast<PointerType>(Ty)->getElementType(); 2909ff0cc061SDimitry Andric } 2910f22ef01cSRoman Divacky 2911ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2912ff0cc061SDimitry Andric GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); 2913ff0cc061SDimitry Andric unsigned Alignment; 2914ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[4], Alignment)) 2915ff0cc061SDimitry Andric return EC; 2916f22ef01cSRoman Divacky std::string Section; 2917f22ef01cSRoman Divacky if (Record[5]) { 2918f22ef01cSRoman Divacky if (Record[5]-1 >= SectionTable.size()) 291939d628a0SDimitry Andric return Error("Invalid ID"); 2920f22ef01cSRoman Divacky Section = SectionTable[Record[5]-1]; 2921f22ef01cSRoman Divacky } 2922f22ef01cSRoman Divacky GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 292391bc56edSDimitry Andric // Local linkage must have default visibility. 292491bc56edSDimitry Andric if (Record.size() > 6 && !GlobalValue::isLocalLinkage(Linkage)) 292591bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 2926f22ef01cSRoman Divacky Visibility = GetDecodedVisibility(Record[6]); 29277ae0e2c9SDimitry Andric 29287ae0e2c9SDimitry Andric GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; 2929f22ef01cSRoman Divacky if (Record.size() > 7) 29307ae0e2c9SDimitry Andric TLM = GetDecodedThreadLocalMode(Record[7]); 2931f22ef01cSRoman Divacky 29322754fe60SDimitry Andric bool UnnamedAddr = false; 29332754fe60SDimitry Andric if (Record.size() > 8) 29342754fe60SDimitry Andric UnnamedAddr = Record[8]; 29352754fe60SDimitry Andric 2936139f7f9bSDimitry Andric bool ExternallyInitialized = false; 2937139f7f9bSDimitry Andric if (Record.size() > 9) 2938139f7f9bSDimitry Andric ExternallyInitialized = Record[9]; 2939139f7f9bSDimitry Andric 2940f22ef01cSRoman Divacky GlobalVariable *NewGV = 294191bc56edSDimitry Andric new GlobalVariable(*TheModule, Ty, isConstant, Linkage, nullptr, "", nullptr, 2942139f7f9bSDimitry Andric TLM, AddressSpace, ExternallyInitialized); 2943f22ef01cSRoman Divacky NewGV->setAlignment(Alignment); 2944f22ef01cSRoman Divacky if (!Section.empty()) 2945f22ef01cSRoman Divacky NewGV->setSection(Section); 2946f22ef01cSRoman Divacky NewGV->setVisibility(Visibility); 29472754fe60SDimitry Andric NewGV->setUnnamedAddr(UnnamedAddr); 2948f22ef01cSRoman Divacky 294991bc56edSDimitry Andric if (Record.size() > 10) 295091bc56edSDimitry Andric NewGV->setDLLStorageClass(GetDecodedDLLStorageClass(Record[10])); 295191bc56edSDimitry Andric else 2952ff0cc061SDimitry Andric UpgradeDLLImportExportLinkage(NewGV, RawLinkage); 295391bc56edSDimitry Andric 2954f22ef01cSRoman Divacky ValueList.push_back(NewGV); 2955f22ef01cSRoman Divacky 2956f22ef01cSRoman Divacky // Remember which value to use for the global initializer. 2957f22ef01cSRoman Divacky if (unsigned InitID = Record[2]) 2958f22ef01cSRoman Divacky GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); 295991bc56edSDimitry Andric 2960ff0cc061SDimitry Andric if (Record.size() > 11) { 296191bc56edSDimitry Andric if (unsigned ComdatID = Record[11]) { 2962ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 2963ff0cc061SDimitry Andric return Error("Invalid global variable comdat ID"); 296491bc56edSDimitry Andric NewGV->setComdat(ComdatList[ComdatID - 1]); 296591bc56edSDimitry Andric } 2966ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 2967ff0cc061SDimitry Andric NewGV->setComdat(reinterpret_cast<Comdat *>(1)); 2968ff0cc061SDimitry Andric } 2969f22ef01cSRoman Divacky break; 2970f22ef01cSRoman Divacky } 2971f22ef01cSRoman Divacky // FUNCTION: [type, callingconv, isproto, linkage, paramattr, 297291bc56edSDimitry Andric // alignment, section, visibility, gc, unnamed_addr, 297339d628a0SDimitry Andric // prologuedata, dllstorageclass, comdat, prefixdata] 2974f22ef01cSRoman Divacky case bitc::MODULE_CODE_FUNCTION: { 2975f22ef01cSRoman Divacky if (Record.size() < 8) 297639d628a0SDimitry Andric return Error("Invalid record"); 29776122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2978f785676fSDimitry Andric if (!Ty) 297939d628a0SDimitry Andric return Error("Invalid record"); 2980ff0cc061SDimitry Andric if (auto *PTy = dyn_cast<PointerType>(Ty)) 2981ff0cc061SDimitry Andric Ty = PTy->getElementType(); 2982ff0cc061SDimitry Andric auto *FTy = dyn_cast<FunctionType>(Ty); 2983f22ef01cSRoman Divacky if (!FTy) 298439d628a0SDimitry Andric return Error("Invalid type for value"); 2985f22ef01cSRoman Divacky 2986f22ef01cSRoman Divacky Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, 2987f22ef01cSRoman Divacky "", TheModule); 2988f22ef01cSRoman Divacky 2989f22ef01cSRoman Divacky Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); 2990f22ef01cSRoman Divacky bool isProto = Record[2]; 2991ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2992ff0cc061SDimitry Andric Func->setLinkage(getDecodedLinkage(RawLinkage)); 2993f22ef01cSRoman Divacky Func->setAttributes(getAttributes(Record[4])); 2994f22ef01cSRoman Divacky 2995ff0cc061SDimitry Andric unsigned Alignment; 2996ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[5], Alignment)) 2997ff0cc061SDimitry Andric return EC; 2998ff0cc061SDimitry Andric Func->setAlignment(Alignment); 2999f22ef01cSRoman Divacky if (Record[6]) { 3000f22ef01cSRoman Divacky if (Record[6]-1 >= SectionTable.size()) 300139d628a0SDimitry Andric return Error("Invalid ID"); 3002f22ef01cSRoman Divacky Func->setSection(SectionTable[Record[6]-1]); 3003f22ef01cSRoman Divacky } 300491bc56edSDimitry Andric // Local linkage must have default visibility. 300591bc56edSDimitry Andric if (!Func->hasLocalLinkage()) 300691bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 3007f22ef01cSRoman Divacky Func->setVisibility(GetDecodedVisibility(Record[7])); 3008f22ef01cSRoman Divacky if (Record.size() > 8 && Record[8]) { 3009ff0cc061SDimitry Andric if (Record[8]-1 >= GCTable.size()) 301039d628a0SDimitry Andric return Error("Invalid ID"); 3011f22ef01cSRoman Divacky Func->setGC(GCTable[Record[8]-1].c_str()); 3012f22ef01cSRoman Divacky } 30132754fe60SDimitry Andric bool UnnamedAddr = false; 30142754fe60SDimitry Andric if (Record.size() > 9) 30152754fe60SDimitry Andric UnnamedAddr = Record[9]; 30162754fe60SDimitry Andric Func->setUnnamedAddr(UnnamedAddr); 3017f785676fSDimitry Andric if (Record.size() > 10 && Record[10] != 0) 301839d628a0SDimitry Andric FunctionPrologues.push_back(std::make_pair(Func, Record[10]-1)); 301991bc56edSDimitry Andric 302091bc56edSDimitry Andric if (Record.size() > 11) 302191bc56edSDimitry Andric Func->setDLLStorageClass(GetDecodedDLLStorageClass(Record[11])); 302291bc56edSDimitry Andric else 3023ff0cc061SDimitry Andric UpgradeDLLImportExportLinkage(Func, RawLinkage); 302491bc56edSDimitry Andric 3025ff0cc061SDimitry Andric if (Record.size() > 12) { 302691bc56edSDimitry Andric if (unsigned ComdatID = Record[12]) { 3027ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 3028ff0cc061SDimitry Andric return Error("Invalid function comdat ID"); 302991bc56edSDimitry Andric Func->setComdat(ComdatList[ComdatID - 1]); 303091bc56edSDimitry Andric } 3031ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 3032ff0cc061SDimitry Andric Func->setComdat(reinterpret_cast<Comdat *>(1)); 3033ff0cc061SDimitry Andric } 303491bc56edSDimitry Andric 303539d628a0SDimitry Andric if (Record.size() > 13 && Record[13] != 0) 303639d628a0SDimitry Andric FunctionPrefixes.push_back(std::make_pair(Func, Record[13]-1)); 303739d628a0SDimitry Andric 3038f22ef01cSRoman Divacky ValueList.push_back(Func); 3039f22ef01cSRoman Divacky 3040f22ef01cSRoman Divacky // If this is a function with a body, remember the prototype we are 3041f22ef01cSRoman Divacky // creating now, so that we can match up the body with them later. 3042dff0c46cSDimitry Andric if (!isProto) { 304339d628a0SDimitry Andric Func->setIsMaterializable(true); 3044f22ef01cSRoman Divacky FunctionsWithBodies.push_back(Func); 304539d628a0SDimitry Andric if (LazyStreamer) 304639d628a0SDimitry Andric DeferredFunctionInfo[Func] = 0; 3047dff0c46cSDimitry Andric } 3048f22ef01cSRoman Divacky break; 3049f22ef01cSRoman Divacky } 3050f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage] 305191bc56edSDimitry Andric // ALIAS: [alias type, aliasee val#, linkage, visibility, dllstorageclass] 3052f22ef01cSRoman Divacky case bitc::MODULE_CODE_ALIAS: { 3053f22ef01cSRoman Divacky if (Record.size() < 3) 305439d628a0SDimitry Andric return Error("Invalid record"); 30556122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3056f785676fSDimitry Andric if (!Ty) 305739d628a0SDimitry Andric return Error("Invalid record"); 305891bc56edSDimitry Andric auto *PTy = dyn_cast<PointerType>(Ty); 305991bc56edSDimitry Andric if (!PTy) 306039d628a0SDimitry Andric return Error("Invalid type for value"); 3061f22ef01cSRoman Divacky 306291bc56edSDimitry Andric auto *NewGA = 3063ff0cc061SDimitry Andric GlobalAlias::create(PTy, getDecodedLinkage(Record[2]), "", TheModule); 3064f22ef01cSRoman Divacky // Old bitcode files didn't have visibility field. 306591bc56edSDimitry Andric // Local linkage must have default visibility. 306691bc56edSDimitry Andric if (Record.size() > 3 && !NewGA->hasLocalLinkage()) 306791bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 3068f22ef01cSRoman Divacky NewGA->setVisibility(GetDecodedVisibility(Record[3])); 306991bc56edSDimitry Andric if (Record.size() > 4) 307091bc56edSDimitry Andric NewGA->setDLLStorageClass(GetDecodedDLLStorageClass(Record[4])); 307191bc56edSDimitry Andric else 307291bc56edSDimitry Andric UpgradeDLLImportExportLinkage(NewGA, Record[2]); 307391bc56edSDimitry Andric if (Record.size() > 5) 307491bc56edSDimitry Andric NewGA->setThreadLocalMode(GetDecodedThreadLocalMode(Record[5])); 307591bc56edSDimitry Andric if (Record.size() > 6) 307691bc56edSDimitry Andric NewGA->setUnnamedAddr(Record[6]); 3077f22ef01cSRoman Divacky ValueList.push_back(NewGA); 3078f22ef01cSRoman Divacky AliasInits.push_back(std::make_pair(NewGA, Record[1])); 3079f22ef01cSRoman Divacky break; 3080f22ef01cSRoman Divacky } 3081f22ef01cSRoman Divacky /// MODULE_CODE_PURGEVALS: [numvals] 3082f22ef01cSRoman Divacky case bitc::MODULE_CODE_PURGEVALS: 3083f22ef01cSRoman Divacky // Trim down the value list to the specified size. 3084f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] > ValueList.size()) 308539d628a0SDimitry Andric return Error("Invalid record"); 3086f22ef01cSRoman Divacky ValueList.shrinkTo(Record[0]); 3087f22ef01cSRoman Divacky break; 3088f22ef01cSRoman Divacky } 3089f22ef01cSRoman Divacky Record.clear(); 3090f22ef01cSRoman Divacky } 3091f22ef01cSRoman Divacky } 3092f22ef01cSRoman Divacky 3093ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseBitcodeInto(Module *M, 3094ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 309591bc56edSDimitry Andric TheModule = nullptr; 3096f22ef01cSRoman Divacky 309791bc56edSDimitry Andric if (std::error_code EC = InitStream()) 3098f785676fSDimitry Andric return EC; 3099f22ef01cSRoman Divacky 3100f22ef01cSRoman Divacky // Sniff for the signature. 3101f22ef01cSRoman Divacky if (Stream.Read(8) != 'B' || 3102f22ef01cSRoman Divacky Stream.Read(8) != 'C' || 3103f22ef01cSRoman Divacky Stream.Read(4) != 0x0 || 3104f22ef01cSRoman Divacky Stream.Read(4) != 0xC || 3105f22ef01cSRoman Divacky Stream.Read(4) != 0xE || 3106f22ef01cSRoman Divacky Stream.Read(4) != 0xD) 310739d628a0SDimitry Andric return Error("Invalid bitcode signature"); 3108f22ef01cSRoman Divacky 3109f22ef01cSRoman Divacky // We expect a number of well-defined blocks, though we don't necessarily 3110f22ef01cSRoman Divacky // need to understand them all. 3111139f7f9bSDimitry Andric while (1) { 3112ff0cc061SDimitry Andric if (Stream.AtEndOfStream()) { 3113ff0cc061SDimitry Andric if (TheModule) 311491bc56edSDimitry Andric return std::error_code(); 3115ff0cc061SDimitry Andric // We didn't really read a proper Module. 3116ff0cc061SDimitry Andric return Error("Malformed IR file"); 3117ff0cc061SDimitry Andric } 3118bd5abe19SDimitry Andric 3119139f7f9bSDimitry Andric BitstreamEntry Entry = 3120139f7f9bSDimitry Andric Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); 3121f22ef01cSRoman Divacky 3122139f7f9bSDimitry Andric switch (Entry.Kind) { 3123139f7f9bSDimitry Andric case BitstreamEntry::Error: 312439d628a0SDimitry Andric return Error("Malformed block"); 3125139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 312691bc56edSDimitry Andric return std::error_code(); 3127f22ef01cSRoman Divacky 3128139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3129139f7f9bSDimitry Andric switch (Entry.ID) { 3130f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 3131f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 313239d628a0SDimitry Andric return Error("Malformed block"); 3133f22ef01cSRoman Divacky break; 3134f22ef01cSRoman Divacky case bitc::MODULE_BLOCK_ID: 3135f22ef01cSRoman Divacky // Reject multiple MODULE_BLOCK's in a single bitstream. 3136f22ef01cSRoman Divacky if (TheModule) 313739d628a0SDimitry Andric return Error("Invalid multiple blocks"); 3138f22ef01cSRoman Divacky TheModule = M; 3139ff0cc061SDimitry Andric if (std::error_code EC = ParseModule(false, ShouldLazyLoadMetadata)) 3140f785676fSDimitry Andric return EC; 3141f785676fSDimitry Andric if (LazyStreamer) 314291bc56edSDimitry Andric return std::error_code(); 3143f22ef01cSRoman Divacky break; 3144f22ef01cSRoman Divacky default: 3145f22ef01cSRoman Divacky if (Stream.SkipBlock()) 314639d628a0SDimitry Andric return Error("Invalid record"); 3147f22ef01cSRoman Divacky break; 3148f22ef01cSRoman Divacky } 3149139f7f9bSDimitry Andric continue; 3150139f7f9bSDimitry Andric case BitstreamEntry::Record: 3151139f7f9bSDimitry Andric // There should be no records in the top-level of blocks. 3152f22ef01cSRoman Divacky 3153139f7f9bSDimitry Andric // The ranlib in Xcode 4 will align archive members by appending newlines 3154139f7f9bSDimitry Andric // to the end of them. If this file size is a multiple of 4 but not 8, we 3155139f7f9bSDimitry Andric // have to read and ignore these final 4 bytes :-( 3156139f7f9bSDimitry Andric if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 && 3157139f7f9bSDimitry Andric Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a && 3158139f7f9bSDimitry Andric Stream.AtEndOfStream()) 315991bc56edSDimitry Andric return std::error_code(); 3160139f7f9bSDimitry Andric 316139d628a0SDimitry Andric return Error("Invalid record"); 3162139f7f9bSDimitry Andric } 3163139f7f9bSDimitry Andric } 3164f22ef01cSRoman Divacky } 3165f22ef01cSRoman Divacky 316691bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseModuleTriple() { 31672754fe60SDimitry Andric if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 316839d628a0SDimitry Andric return Error("Invalid record"); 31692754fe60SDimitry Andric 31702754fe60SDimitry Andric SmallVector<uint64_t, 64> Record; 31712754fe60SDimitry Andric 317291bc56edSDimitry Andric std::string Triple; 31732754fe60SDimitry Andric // Read all the records for this module. 3174139f7f9bSDimitry Andric while (1) { 3175139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 31762754fe60SDimitry Andric 3177139f7f9bSDimitry Andric switch (Entry.Kind) { 3178139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3179139f7f9bSDimitry Andric case BitstreamEntry::Error: 318039d628a0SDimitry Andric return Error("Malformed block"); 3181139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 318291bc56edSDimitry Andric return Triple; 3183139f7f9bSDimitry Andric case BitstreamEntry::Record: 3184139f7f9bSDimitry Andric // The interesting case. 31852754fe60SDimitry Andric break; 31862754fe60SDimitry Andric } 31872754fe60SDimitry Andric 31882754fe60SDimitry Andric // Read a record. 3189139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 31902754fe60SDimitry Andric default: break; // Default behavior, ignore unknown content. 31912754fe60SDimitry Andric case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 31922754fe60SDimitry Andric std::string S; 31932754fe60SDimitry Andric if (ConvertToString(Record, 0, S)) 319439d628a0SDimitry Andric return Error("Invalid record"); 31952754fe60SDimitry Andric Triple = S; 31962754fe60SDimitry Andric break; 31972754fe60SDimitry Andric } 31982754fe60SDimitry Andric } 31992754fe60SDimitry Andric Record.clear(); 32002754fe60SDimitry Andric } 320191bc56edSDimitry Andric llvm_unreachable("Exit infinite loop"); 32022754fe60SDimitry Andric } 32032754fe60SDimitry Andric 320491bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseTriple() { 320591bc56edSDimitry Andric if (std::error_code EC = InitStream()) 3206f785676fSDimitry Andric return EC; 32072754fe60SDimitry Andric 32082754fe60SDimitry Andric // Sniff for the signature. 32092754fe60SDimitry Andric if (Stream.Read(8) != 'B' || 32102754fe60SDimitry Andric Stream.Read(8) != 'C' || 32112754fe60SDimitry Andric Stream.Read(4) != 0x0 || 32122754fe60SDimitry Andric Stream.Read(4) != 0xC || 32132754fe60SDimitry Andric Stream.Read(4) != 0xE || 32142754fe60SDimitry Andric Stream.Read(4) != 0xD) 321539d628a0SDimitry Andric return Error("Invalid bitcode signature"); 32162754fe60SDimitry Andric 32172754fe60SDimitry Andric // We expect a number of well-defined blocks, though we don't necessarily 32182754fe60SDimitry Andric // need to understand them all. 3219139f7f9bSDimitry Andric while (1) { 3220139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 32212754fe60SDimitry Andric 3222139f7f9bSDimitry Andric switch (Entry.Kind) { 3223139f7f9bSDimitry Andric case BitstreamEntry::Error: 322439d628a0SDimitry Andric return Error("Malformed block"); 3225139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 322691bc56edSDimitry Andric return std::error_code(); 3227139f7f9bSDimitry Andric 3228139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3229139f7f9bSDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 323091bc56edSDimitry Andric return parseModuleTriple(); 3231139f7f9bSDimitry Andric 3232139f7f9bSDimitry Andric // Ignore other sub-blocks. 3233f785676fSDimitry Andric if (Stream.SkipBlock()) 323439d628a0SDimitry Andric return Error("Malformed block"); 3235139f7f9bSDimitry Andric continue; 3236139f7f9bSDimitry Andric 3237139f7f9bSDimitry Andric case BitstreamEntry::Record: 3238139f7f9bSDimitry Andric Stream.skipRecord(Entry.ID); 3239139f7f9bSDimitry Andric continue; 3240139f7f9bSDimitry Andric } 3241139f7f9bSDimitry Andric } 32422754fe60SDimitry Andric } 32432754fe60SDimitry Andric 3244f22ef01cSRoman Divacky /// ParseMetadataAttachment - Parse metadata attachments. 3245ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseMetadataAttachment(Function &F) { 3246f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 324739d628a0SDimitry Andric return Error("Invalid record"); 3248f22ef01cSRoman Divacky 3249f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3250f22ef01cSRoman Divacky while (1) { 3251139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3252139f7f9bSDimitry Andric 3253139f7f9bSDimitry Andric switch (Entry.Kind) { 3254139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3255139f7f9bSDimitry Andric case BitstreamEntry::Error: 325639d628a0SDimitry Andric return Error("Malformed block"); 3257139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 325891bc56edSDimitry Andric return std::error_code(); 3259139f7f9bSDimitry Andric case BitstreamEntry::Record: 3260139f7f9bSDimitry Andric // The interesting case. 3261f22ef01cSRoman Divacky break; 3262f22ef01cSRoman Divacky } 3263139f7f9bSDimitry Andric 3264f22ef01cSRoman Divacky // Read a metadata attachment record. 3265f22ef01cSRoman Divacky Record.clear(); 3266139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 3267f22ef01cSRoman Divacky default: // Default behavior: ignore. 3268f22ef01cSRoman Divacky break; 326917a519f9SDimitry Andric case bitc::METADATA_ATTACHMENT: { 3270f22ef01cSRoman Divacky unsigned RecordLength = Record.size(); 3271ff0cc061SDimitry Andric if (Record.empty()) 327239d628a0SDimitry Andric return Error("Invalid record"); 3273ff0cc061SDimitry Andric if (RecordLength % 2 == 0) { 3274ff0cc061SDimitry Andric // A function attachment. 3275ff0cc061SDimitry Andric for (unsigned I = 0; I != RecordLength; I += 2) { 3276ff0cc061SDimitry Andric auto K = MDKindMap.find(Record[I]); 3277ff0cc061SDimitry Andric if (K == MDKindMap.end()) 3278ff0cc061SDimitry Andric return Error("Invalid ID"); 3279ff0cc061SDimitry Andric Metadata *MD = MDValueList.getValueFwdRef(Record[I + 1]); 3280ff0cc061SDimitry Andric F.setMetadata(K->second, cast<MDNode>(MD)); 3281ff0cc061SDimitry Andric } 3282ff0cc061SDimitry Andric continue; 3283ff0cc061SDimitry Andric } 3284ff0cc061SDimitry Andric 3285ff0cc061SDimitry Andric // An instruction attachment. 3286f22ef01cSRoman Divacky Instruction *Inst = InstructionList[Record[0]]; 3287f22ef01cSRoman Divacky for (unsigned i = 1; i != RecordLength; i = i+2) { 3288f22ef01cSRoman Divacky unsigned Kind = Record[i]; 3289e580952dSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = 3290e580952dSDimitry Andric MDKindMap.find(Kind); 3291e580952dSDimitry Andric if (I == MDKindMap.end()) 329239d628a0SDimitry Andric return Error("Invalid ID"); 329339d628a0SDimitry Andric Metadata *Node = MDValueList.getValueFwdRef(Record[i + 1]); 329439d628a0SDimitry Andric if (isa<LocalAsMetadata>(Node)) 329539d628a0SDimitry Andric // Drop the attachment. This used to be legal, but there's no 329639d628a0SDimitry Andric // upgrade path. 329739d628a0SDimitry Andric break; 3298e580952dSDimitry Andric Inst->setMetadata(I->second, cast<MDNode>(Node)); 3299f785676fSDimitry Andric if (I->second == LLVMContext::MD_tbaa) 3300f785676fSDimitry Andric InstsWithTBAATag.push_back(Inst); 3301f22ef01cSRoman Divacky } 3302f22ef01cSRoman Divacky break; 3303f22ef01cSRoman Divacky } 3304f22ef01cSRoman Divacky } 3305f22ef01cSRoman Divacky } 3306f22ef01cSRoman Divacky } 3307f22ef01cSRoman Divacky 3308ff0cc061SDimitry Andric static std::error_code TypeCheckLoadStoreInst(DiagnosticHandlerFunction DH, 3309ff0cc061SDimitry Andric Type *ValType, Type *PtrType) { 3310ff0cc061SDimitry Andric if (!isa<PointerType>(PtrType)) 3311ff0cc061SDimitry Andric return Error(DH, "Load/Store operand is not a pointer type"); 3312ff0cc061SDimitry Andric Type *ElemType = cast<PointerType>(PtrType)->getElementType(); 3313ff0cc061SDimitry Andric 3314ff0cc061SDimitry Andric if (ValType && ValType != ElemType) 3315ff0cc061SDimitry Andric return Error(DH, "Explicit load/store type does not match pointee type of " 3316ff0cc061SDimitry Andric "pointer operand"); 3317ff0cc061SDimitry Andric if (!PointerType::isLoadableOrStorableType(ElemType)) 3318ff0cc061SDimitry Andric return Error(DH, "Cannot load/store from pointer"); 3319ff0cc061SDimitry Andric return std::error_code(); 3320ff0cc061SDimitry Andric } 3321ff0cc061SDimitry Andric 3322f22ef01cSRoman Divacky /// ParseFunctionBody - Lazily parse the specified function body block. 332391bc56edSDimitry Andric std::error_code BitcodeReader::ParseFunctionBody(Function *F) { 3324f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) 332539d628a0SDimitry Andric return Error("Invalid record"); 3326f22ef01cSRoman Divacky 3327f22ef01cSRoman Divacky InstructionList.clear(); 3328f22ef01cSRoman Divacky unsigned ModuleValueListSize = ValueList.size(); 3329e580952dSDimitry Andric unsigned ModuleMDValueListSize = MDValueList.size(); 3330f22ef01cSRoman Divacky 3331f22ef01cSRoman Divacky // Add all the function arguments to the value table. 3332f22ef01cSRoman Divacky for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) 3333f22ef01cSRoman Divacky ValueList.push_back(I); 3334f22ef01cSRoman Divacky 3335f22ef01cSRoman Divacky unsigned NextValueNo = ValueList.size(); 333691bc56edSDimitry Andric BasicBlock *CurBB = nullptr; 3337f22ef01cSRoman Divacky unsigned CurBBNo = 0; 3338f22ef01cSRoman Divacky 3339f22ef01cSRoman Divacky DebugLoc LastLoc; 334039d628a0SDimitry Andric auto getLastInstruction = [&]() -> Instruction * { 334139d628a0SDimitry Andric if (CurBB && !CurBB->empty()) 334239d628a0SDimitry Andric return &CurBB->back(); 334339d628a0SDimitry Andric else if (CurBBNo && FunctionBBs[CurBBNo - 1] && 334439d628a0SDimitry Andric !FunctionBBs[CurBBNo - 1]->empty()) 334539d628a0SDimitry Andric return &FunctionBBs[CurBBNo - 1]->back(); 334639d628a0SDimitry Andric return nullptr; 334739d628a0SDimitry Andric }; 3348f22ef01cSRoman Divacky 3349f22ef01cSRoman Divacky // Read all the records. 3350f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3351f22ef01cSRoman Divacky while (1) { 3352139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 3353f22ef01cSRoman Divacky 3354139f7f9bSDimitry Andric switch (Entry.Kind) { 3355139f7f9bSDimitry Andric case BitstreamEntry::Error: 335639d628a0SDimitry Andric return Error("Malformed block"); 3357139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 3358139f7f9bSDimitry Andric goto OutOfRecordLoop; 3359139f7f9bSDimitry Andric 3360139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3361139f7f9bSDimitry Andric switch (Entry.ID) { 3362f22ef01cSRoman Divacky default: // Skip unknown content. 3363f22ef01cSRoman Divacky if (Stream.SkipBlock()) 336439d628a0SDimitry Andric return Error("Invalid record"); 3365f22ef01cSRoman Divacky break; 3366f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 336791bc56edSDimitry Andric if (std::error_code EC = ParseConstants()) 3368f785676fSDimitry Andric return EC; 3369f22ef01cSRoman Divacky NextValueNo = ValueList.size(); 3370f22ef01cSRoman Divacky break; 3371f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 337291bc56edSDimitry Andric if (std::error_code EC = ParseValueSymbolTable()) 3373f785676fSDimitry Andric return EC; 3374f22ef01cSRoman Divacky break; 3375f22ef01cSRoman Divacky case bitc::METADATA_ATTACHMENT_ID: 3376ff0cc061SDimitry Andric if (std::error_code EC = ParseMetadataAttachment(*F)) 3377f785676fSDimitry Andric return EC; 3378f22ef01cSRoman Divacky break; 3379f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 338091bc56edSDimitry Andric if (std::error_code EC = ParseMetadata()) 3381f785676fSDimitry Andric return EC; 3382f22ef01cSRoman Divacky break; 338339d628a0SDimitry Andric case bitc::USELIST_BLOCK_ID: 338439d628a0SDimitry Andric if (std::error_code EC = ParseUseLists()) 338539d628a0SDimitry Andric return EC; 338639d628a0SDimitry Andric break; 3387f22ef01cSRoman Divacky } 3388f22ef01cSRoman Divacky continue; 3389f22ef01cSRoman Divacky 3390139f7f9bSDimitry Andric case BitstreamEntry::Record: 3391139f7f9bSDimitry Andric // The interesting case. 3392139f7f9bSDimitry Andric break; 3393f22ef01cSRoman Divacky } 3394f22ef01cSRoman Divacky 3395f22ef01cSRoman Divacky // Read a record. 3396f22ef01cSRoman Divacky Record.clear(); 339791bc56edSDimitry Andric Instruction *I = nullptr; 3398139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 3399f22ef01cSRoman Divacky switch (BitCode) { 3400f22ef01cSRoman Divacky default: // Default behavior: reject 340139d628a0SDimitry Andric return Error("Invalid value"); 340239d628a0SDimitry Andric case bitc::FUNC_CODE_DECLAREBLOCKS: { // DECLAREBLOCKS: [nblocks] 3403f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] == 0) 340439d628a0SDimitry Andric return Error("Invalid record"); 3405f22ef01cSRoman Divacky // Create all the basic blocks for the function. 3406f22ef01cSRoman Divacky FunctionBBs.resize(Record[0]); 340739d628a0SDimitry Andric 340839d628a0SDimitry Andric // See if anything took the address of blocks in this function. 340939d628a0SDimitry Andric auto BBFRI = BasicBlockFwdRefs.find(F); 341039d628a0SDimitry Andric if (BBFRI == BasicBlockFwdRefs.end()) { 3411f22ef01cSRoman Divacky for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) 3412f22ef01cSRoman Divacky FunctionBBs[i] = BasicBlock::Create(Context, "", F); 341339d628a0SDimitry Andric } else { 341439d628a0SDimitry Andric auto &BBRefs = BBFRI->second; 341539d628a0SDimitry Andric // Check for invalid basic block references. 341639d628a0SDimitry Andric if (BBRefs.size() > FunctionBBs.size()) 341739d628a0SDimitry Andric return Error("Invalid ID"); 341839d628a0SDimitry Andric assert(!BBRefs.empty() && "Unexpected empty array"); 341939d628a0SDimitry Andric assert(!BBRefs.front() && "Invalid reference to entry block"); 342039d628a0SDimitry Andric for (unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size(); I != E; 342139d628a0SDimitry Andric ++I) 342239d628a0SDimitry Andric if (I < RE && BBRefs[I]) { 342339d628a0SDimitry Andric BBRefs[I]->insertInto(F); 342439d628a0SDimitry Andric FunctionBBs[I] = BBRefs[I]; 342539d628a0SDimitry Andric } else { 342639d628a0SDimitry Andric FunctionBBs[I] = BasicBlock::Create(Context, "", F); 342739d628a0SDimitry Andric } 342839d628a0SDimitry Andric 342939d628a0SDimitry Andric // Erase from the table. 343039d628a0SDimitry Andric BasicBlockFwdRefs.erase(BBFRI); 343139d628a0SDimitry Andric } 343239d628a0SDimitry Andric 3433f22ef01cSRoman Divacky CurBB = FunctionBBs[0]; 3434f22ef01cSRoman Divacky continue; 343539d628a0SDimitry Andric } 3436f22ef01cSRoman Divacky 3437f22ef01cSRoman Divacky case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN 3438f22ef01cSRoman Divacky // This record indicates that the last instruction is at the same 3439f22ef01cSRoman Divacky // location as the previous instruction with a location. 344039d628a0SDimitry Andric I = getLastInstruction(); 3441f22ef01cSRoman Divacky 344291bc56edSDimitry Andric if (!I) 344339d628a0SDimitry Andric return Error("Invalid record"); 3444f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 344591bc56edSDimitry Andric I = nullptr; 3446f22ef01cSRoman Divacky continue; 3447f22ef01cSRoman Divacky 344817a519f9SDimitry Andric case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] 344939d628a0SDimitry Andric I = getLastInstruction(); 345091bc56edSDimitry Andric if (!I || Record.size() < 4) 345139d628a0SDimitry Andric return Error("Invalid record"); 3452f22ef01cSRoman Divacky 3453f22ef01cSRoman Divacky unsigned Line = Record[0], Col = Record[1]; 3454f22ef01cSRoman Divacky unsigned ScopeID = Record[2], IAID = Record[3]; 3455f22ef01cSRoman Divacky 345691bc56edSDimitry Andric MDNode *Scope = nullptr, *IA = nullptr; 3457f22ef01cSRoman Divacky if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); 3458f22ef01cSRoman Divacky if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); 3459f22ef01cSRoman Divacky LastLoc = DebugLoc::get(Line, Col, Scope, IA); 3460f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 346191bc56edSDimitry Andric I = nullptr; 3462f22ef01cSRoman Divacky continue; 3463f22ef01cSRoman Divacky } 3464f22ef01cSRoman Divacky 3465f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] 3466f22ef01cSRoman Divacky unsigned OpNum = 0; 3467f22ef01cSRoman Divacky Value *LHS, *RHS; 3468f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 34693861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3470f22ef01cSRoman Divacky OpNum+1 > Record.size()) 347139d628a0SDimitry Andric return Error("Invalid record"); 3472f22ef01cSRoman Divacky 3473f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); 3474f785676fSDimitry Andric if (Opc == -1) 347539d628a0SDimitry Andric return Error("Invalid record"); 3476f22ef01cSRoman Divacky I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); 3477f22ef01cSRoman Divacky InstructionList.push_back(I); 3478f22ef01cSRoman Divacky if (OpNum < Record.size()) { 3479f22ef01cSRoman Divacky if (Opc == Instruction::Add || 3480f22ef01cSRoman Divacky Opc == Instruction::Sub || 34812754fe60SDimitry Andric Opc == Instruction::Mul || 34822754fe60SDimitry Andric Opc == Instruction::Shl) { 3483f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 3484f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoSignedWrap(true); 3485f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 3486f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); 34872754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 34882754fe60SDimitry Andric Opc == Instruction::UDiv || 34892754fe60SDimitry Andric Opc == Instruction::LShr || 34902754fe60SDimitry Andric Opc == Instruction::AShr) { 34912754fe60SDimitry Andric if (Record[OpNum] & (1 << bitc::PEO_EXACT)) 3492f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setIsExact(true); 3493139f7f9bSDimitry Andric } else if (isa<FPMathOperator>(I)) { 3494139f7f9bSDimitry Andric FastMathFlags FMF; 3495139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) 3496139f7f9bSDimitry Andric FMF.setUnsafeAlgebra(); 3497139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) 3498139f7f9bSDimitry Andric FMF.setNoNaNs(); 3499139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) 3500139f7f9bSDimitry Andric FMF.setNoInfs(); 3501139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) 3502139f7f9bSDimitry Andric FMF.setNoSignedZeros(); 3503139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) 3504139f7f9bSDimitry Andric FMF.setAllowReciprocal(); 3505139f7f9bSDimitry Andric if (FMF.any()) 3506139f7f9bSDimitry Andric I->setFastMathFlags(FMF); 3507f22ef01cSRoman Divacky } 3508139f7f9bSDimitry Andric 3509f22ef01cSRoman Divacky } 3510f22ef01cSRoman Divacky break; 3511f22ef01cSRoman Divacky } 3512f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] 3513f22ef01cSRoman Divacky unsigned OpNum = 0; 3514f22ef01cSRoman Divacky Value *Op; 3515f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 3516f22ef01cSRoman Divacky OpNum+2 != Record.size()) 351739d628a0SDimitry Andric return Error("Invalid record"); 3518f22ef01cSRoman Divacky 35196122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[OpNum]); 3520f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[OpNum+1]); 352191bc56edSDimitry Andric if (Opc == -1 || !ResTy) 352239d628a0SDimitry Andric return Error("Invalid record"); 352391bc56edSDimitry Andric Instruction *Temp = nullptr; 3524f785676fSDimitry Andric if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) { 3525f785676fSDimitry Andric if (Temp) { 3526f785676fSDimitry Andric InstructionList.push_back(Temp); 3527f785676fSDimitry Andric CurBB->getInstList().push_back(Temp); 3528f785676fSDimitry Andric } 3529f785676fSDimitry Andric } else { 3530f22ef01cSRoman Divacky I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); 3531f785676fSDimitry Andric } 3532f22ef01cSRoman Divacky InstructionList.push_back(I); 3533f22ef01cSRoman Divacky break; 3534f22ef01cSRoman Divacky } 3535ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD: 3536ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP_OLD: 3537ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP: { // GEP: type, [n x operands] 3538f22ef01cSRoman Divacky unsigned OpNum = 0; 3539ff0cc061SDimitry Andric 3540ff0cc061SDimitry Andric Type *Ty; 3541ff0cc061SDimitry Andric bool InBounds; 3542ff0cc061SDimitry Andric 3543ff0cc061SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_GEP) { 3544ff0cc061SDimitry Andric InBounds = Record[OpNum++]; 3545ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 3546ff0cc061SDimitry Andric } else { 3547ff0cc061SDimitry Andric InBounds = BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD; 3548ff0cc061SDimitry Andric Ty = nullptr; 3549ff0cc061SDimitry Andric } 3550ff0cc061SDimitry Andric 3551f22ef01cSRoman Divacky Value *BasePtr; 3552f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) 355339d628a0SDimitry Andric return Error("Invalid record"); 3554f22ef01cSRoman Divacky 3555ff0cc061SDimitry Andric if (!Ty) 3556ff0cc061SDimitry Andric Ty = cast<SequentialType>(BasePtr->getType()->getScalarType()) 3557ff0cc061SDimitry Andric ->getElementType(); 3558ff0cc061SDimitry Andric else if (Ty != 3559ff0cc061SDimitry Andric cast<SequentialType>(BasePtr->getType()->getScalarType()) 3560ff0cc061SDimitry Andric ->getElementType()) 3561ff0cc061SDimitry Andric return Error( 3562ff0cc061SDimitry Andric "Explicit gep type does not match pointee type of pointer operand"); 3563ff0cc061SDimitry Andric 3564f22ef01cSRoman Divacky SmallVector<Value*, 16> GEPIdx; 3565f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3566f22ef01cSRoman Divacky Value *Op; 3567f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 356839d628a0SDimitry Andric return Error("Invalid record"); 3569f22ef01cSRoman Divacky GEPIdx.push_back(Op); 3570f22ef01cSRoman Divacky } 3571f22ef01cSRoman Divacky 3572ff0cc061SDimitry Andric I = GetElementPtrInst::Create(Ty, BasePtr, GEPIdx); 3573ff0cc061SDimitry Andric 3574f22ef01cSRoman Divacky InstructionList.push_back(I); 3575ff0cc061SDimitry Andric if (InBounds) 3576f22ef01cSRoman Divacky cast<GetElementPtrInst>(I)->setIsInBounds(true); 3577f22ef01cSRoman Divacky break; 3578f22ef01cSRoman Divacky } 3579f22ef01cSRoman Divacky 3580f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTVAL: { 3581f22ef01cSRoman Divacky // EXTRACTVAL: [opty, opval, n x indices] 3582f22ef01cSRoman Divacky unsigned OpNum = 0; 3583f22ef01cSRoman Divacky Value *Agg; 3584f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 358539d628a0SDimitry Andric return Error("Invalid record"); 3586f22ef01cSRoman Divacky 3587ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3588ff0cc061SDimitry Andric if (OpNum == RecSize) 3589ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid instruction with 0 indices"); 3590ff0cc061SDimitry Andric 3591f22ef01cSRoman Divacky SmallVector<unsigned, 4> EXTRACTVALIdx; 3592ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3593ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3594ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3595ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3596f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3597ff0cc061SDimitry Andric 3598ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 3599ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid type"); 3600f22ef01cSRoman Divacky if ((unsigned)Index != Index) 360139d628a0SDimitry Andric return Error("Invalid value"); 3602ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 3603ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid struct index"); 3604ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 3605ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid array index"); 3606f22ef01cSRoman Divacky EXTRACTVALIdx.push_back((unsigned)Index); 3607ff0cc061SDimitry Andric 3608ff0cc061SDimitry Andric if (IsStruct) 3609ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3610ff0cc061SDimitry Andric else 3611ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3612f22ef01cSRoman Divacky } 3613f22ef01cSRoman Divacky 361417a519f9SDimitry Andric I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); 3615f22ef01cSRoman Divacky InstructionList.push_back(I); 3616f22ef01cSRoman Divacky break; 3617f22ef01cSRoman Divacky } 3618f22ef01cSRoman Divacky 3619f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTVAL: { 3620f22ef01cSRoman Divacky // INSERTVAL: [opty, opval, opty, opval, n x indices] 3621f22ef01cSRoman Divacky unsigned OpNum = 0; 3622f22ef01cSRoman Divacky Value *Agg; 3623f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 362439d628a0SDimitry Andric return Error("Invalid record"); 3625f22ef01cSRoman Divacky Value *Val; 3626f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Val)) 362739d628a0SDimitry Andric return Error("Invalid record"); 3628f22ef01cSRoman Divacky 3629ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3630ff0cc061SDimitry Andric if (OpNum == RecSize) 3631ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid instruction with 0 indices"); 3632ff0cc061SDimitry Andric 3633f22ef01cSRoman Divacky SmallVector<unsigned, 4> INSERTVALIdx; 3634ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3635ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3636ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3637ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3638f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3639ff0cc061SDimitry Andric 3640ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 3641ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid type"); 3642f22ef01cSRoman Divacky if ((unsigned)Index != Index) 364339d628a0SDimitry Andric return Error("Invalid value"); 3644ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 3645ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid struct index"); 3646ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 3647ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid array index"); 3648ff0cc061SDimitry Andric 3649f22ef01cSRoman Divacky INSERTVALIdx.push_back((unsigned)Index); 3650ff0cc061SDimitry Andric if (IsStruct) 3651ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3652ff0cc061SDimitry Andric else 3653ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3654f22ef01cSRoman Divacky } 3655f22ef01cSRoman Divacky 3656ff0cc061SDimitry Andric if (CurTy != Val->getType()) 3657ff0cc061SDimitry Andric return Error("Inserted value type doesn't match aggregate type"); 3658ff0cc061SDimitry Andric 365917a519f9SDimitry Andric I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); 3660f22ef01cSRoman Divacky InstructionList.push_back(I); 3661f22ef01cSRoman Divacky break; 3662f22ef01cSRoman Divacky } 3663f22ef01cSRoman Divacky 3664f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] 3665f22ef01cSRoman Divacky // obsolete form of select 3666f22ef01cSRoman Divacky // handles select i1 ... in old bitcode 3667f22ef01cSRoman Divacky unsigned OpNum = 0; 3668f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3669f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36703861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 36713861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) 367239d628a0SDimitry Andric return Error("Invalid record"); 3673f22ef01cSRoman Divacky 3674f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3675f22ef01cSRoman Divacky InstructionList.push_back(I); 3676f22ef01cSRoman Divacky break; 3677f22ef01cSRoman Divacky } 3678f22ef01cSRoman Divacky 3679f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] 3680f22ef01cSRoman Divacky // new form of select 3681f22ef01cSRoman Divacky // handles select i1 or select [N x i1] 3682f22ef01cSRoman Divacky unsigned OpNum = 0; 3683f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3684f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36853861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 3686f22ef01cSRoman Divacky getValueTypePair(Record, OpNum, NextValueNo, Cond)) 368739d628a0SDimitry Andric return Error("Invalid record"); 3688f22ef01cSRoman Divacky 3689f22ef01cSRoman Divacky // select condition can be either i1 or [N x i1] 36906122f3e6SDimitry Andric if (VectorType* vector_type = 36916122f3e6SDimitry Andric dyn_cast<VectorType>(Cond->getType())) { 3692f22ef01cSRoman Divacky // expect <n x i1> 3693f22ef01cSRoman Divacky if (vector_type->getElementType() != Type::getInt1Ty(Context)) 369439d628a0SDimitry Andric return Error("Invalid type for value"); 3695f22ef01cSRoman Divacky } else { 3696f22ef01cSRoman Divacky // expect i1 3697f22ef01cSRoman Divacky if (Cond->getType() != Type::getInt1Ty(Context)) 369839d628a0SDimitry Andric return Error("Invalid type for value"); 3699f22ef01cSRoman Divacky } 3700f22ef01cSRoman Divacky 3701f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3702f22ef01cSRoman Divacky InstructionList.push_back(I); 3703f22ef01cSRoman Divacky break; 3704f22ef01cSRoman Divacky } 3705f22ef01cSRoman Divacky 3706f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] 3707f22ef01cSRoman Divacky unsigned OpNum = 0; 3708f22ef01cSRoman Divacky Value *Vec, *Idx; 3709f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 371091bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 371139d628a0SDimitry Andric return Error("Invalid record"); 3712ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 3713ff0cc061SDimitry Andric return Error("Invalid type for value"); 3714f22ef01cSRoman Divacky I = ExtractElementInst::Create(Vec, Idx); 3715f22ef01cSRoman Divacky InstructionList.push_back(I); 3716f22ef01cSRoman Divacky break; 3717f22ef01cSRoman Divacky } 3718f22ef01cSRoman Divacky 3719f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] 3720f22ef01cSRoman Divacky unsigned OpNum = 0; 3721f22ef01cSRoman Divacky Value *Vec, *Elt, *Idx; 3722ff0cc061SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Vec)) 3723ff0cc061SDimitry Andric return Error("Invalid record"); 3724ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 3725ff0cc061SDimitry Andric return Error("Invalid type for value"); 3726ff0cc061SDimitry Andric if (popValue(Record, OpNum, NextValueNo, 3727f22ef01cSRoman Divacky cast<VectorType>(Vec->getType())->getElementType(), Elt) || 372891bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 372939d628a0SDimitry Andric return Error("Invalid record"); 3730f22ef01cSRoman Divacky I = InsertElementInst::Create(Vec, Elt, Idx); 3731f22ef01cSRoman Divacky InstructionList.push_back(I); 3732f22ef01cSRoman Divacky break; 3733f22ef01cSRoman Divacky } 3734f22ef01cSRoman Divacky 3735f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] 3736f22ef01cSRoman Divacky unsigned OpNum = 0; 3737f22ef01cSRoman Divacky Value *Vec1, *Vec2, *Mask; 3738f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || 37393861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) 374039d628a0SDimitry Andric return Error("Invalid record"); 3741f22ef01cSRoman Divacky 3742f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) 374339d628a0SDimitry Andric return Error("Invalid record"); 3744ff0cc061SDimitry Andric if (!Vec1->getType()->isVectorTy() || !Vec2->getType()->isVectorTy()) 3745ff0cc061SDimitry Andric return Error("Invalid type for value"); 3746f22ef01cSRoman Divacky I = new ShuffleVectorInst(Vec1, Vec2, Mask); 3747f22ef01cSRoman Divacky InstructionList.push_back(I); 3748f22ef01cSRoman Divacky break; 3749f22ef01cSRoman Divacky } 3750f22ef01cSRoman Divacky 3751f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] 3752f22ef01cSRoman Divacky // Old form of ICmp/FCmp returning bool 3753f22ef01cSRoman Divacky // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were 3754f22ef01cSRoman Divacky // both legal on vectors but had different behaviour. 3755f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] 3756f22ef01cSRoman Divacky // FCmp/ICmp returning bool or vector of bool 3757f22ef01cSRoman Divacky 3758f22ef01cSRoman Divacky unsigned OpNum = 0; 3759f22ef01cSRoman Divacky Value *LHS, *RHS; 3760f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 37613861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3762f22ef01cSRoman Divacky OpNum+1 != Record.size()) 376339d628a0SDimitry Andric return Error("Invalid record"); 3764f22ef01cSRoman Divacky 3765f22ef01cSRoman Divacky if (LHS->getType()->isFPOrFPVectorTy()) 3766f22ef01cSRoman Divacky I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); 3767f22ef01cSRoman Divacky else 3768f22ef01cSRoman Divacky I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); 3769f22ef01cSRoman Divacky InstructionList.push_back(I); 3770f22ef01cSRoman Divacky break; 3771f22ef01cSRoman Divacky } 3772f22ef01cSRoman Divacky 3773f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] 3774f22ef01cSRoman Divacky { 3775f22ef01cSRoman Divacky unsigned Size = Record.size(); 3776f22ef01cSRoman Divacky if (Size == 0) { 3777f22ef01cSRoman Divacky I = ReturnInst::Create(Context); 3778f22ef01cSRoman Divacky InstructionList.push_back(I); 3779f22ef01cSRoman Divacky break; 3780f22ef01cSRoman Divacky } 3781f22ef01cSRoman Divacky 3782f22ef01cSRoman Divacky unsigned OpNum = 0; 378391bc56edSDimitry Andric Value *Op = nullptr; 3784f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 378539d628a0SDimitry Andric return Error("Invalid record"); 378617a519f9SDimitry Andric if (OpNum != Record.size()) 378739d628a0SDimitry Andric return Error("Invalid record"); 3788f22ef01cSRoman Divacky 378917a519f9SDimitry Andric I = ReturnInst::Create(Context, Op); 3790f22ef01cSRoman Divacky InstructionList.push_back(I); 3791f22ef01cSRoman Divacky break; 3792f22ef01cSRoman Divacky } 3793f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] 3794f22ef01cSRoman Divacky if (Record.size() != 1 && Record.size() != 3) 379539d628a0SDimitry Andric return Error("Invalid record"); 3796f22ef01cSRoman Divacky BasicBlock *TrueDest = getBasicBlock(Record[0]); 379791bc56edSDimitry Andric if (!TrueDest) 379839d628a0SDimitry Andric return Error("Invalid record"); 3799f22ef01cSRoman Divacky 3800f22ef01cSRoman Divacky if (Record.size() == 1) { 3801f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest); 3802f22ef01cSRoman Divacky InstructionList.push_back(I); 3803f22ef01cSRoman Divacky } 3804f22ef01cSRoman Divacky else { 3805f22ef01cSRoman Divacky BasicBlock *FalseDest = getBasicBlock(Record[1]); 38063861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, 38073861d79fSDimitry Andric Type::getInt1Ty(Context)); 380891bc56edSDimitry Andric if (!FalseDest || !Cond) 380939d628a0SDimitry Andric return Error("Invalid record"); 3810f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest, FalseDest, Cond); 3811f22ef01cSRoman Divacky InstructionList.push_back(I); 3812f22ef01cSRoman Divacky } 3813f22ef01cSRoman Divacky break; 3814f22ef01cSRoman Divacky } 3815f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] 38167ae0e2c9SDimitry Andric // Check magic 38177ae0e2c9SDimitry Andric if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { 3818f785676fSDimitry Andric // "New" SwitchInst format with case ranges. The changes to write this 3819f785676fSDimitry Andric // format were reverted but we still recognize bitcode that uses it. 3820f785676fSDimitry Andric // Hopefully someday we will have support for case ranges and can use 3821f785676fSDimitry Andric // this format again. 38227ae0e2c9SDimitry Andric 38237ae0e2c9SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 38247ae0e2c9SDimitry Andric unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); 38257ae0e2c9SDimitry Andric 38263861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, OpTy); 38277ae0e2c9SDimitry Andric BasicBlock *Default = getBasicBlock(Record[3]); 382891bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 382939d628a0SDimitry Andric return Error("Invalid record"); 38307ae0e2c9SDimitry Andric 38317ae0e2c9SDimitry Andric unsigned NumCases = Record[4]; 38327ae0e2c9SDimitry Andric 38337ae0e2c9SDimitry Andric SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 38347ae0e2c9SDimitry Andric InstructionList.push_back(SI); 38357ae0e2c9SDimitry Andric 38367ae0e2c9SDimitry Andric unsigned CurIdx = 5; 38377ae0e2c9SDimitry Andric for (unsigned i = 0; i != NumCases; ++i) { 3838f785676fSDimitry Andric SmallVector<ConstantInt*, 1> CaseVals; 38397ae0e2c9SDimitry Andric unsigned NumItems = Record[CurIdx++]; 38407ae0e2c9SDimitry Andric for (unsigned ci = 0; ci != NumItems; ++ci) { 38417ae0e2c9SDimitry Andric bool isSingleNumber = Record[CurIdx++]; 38427ae0e2c9SDimitry Andric 38437ae0e2c9SDimitry Andric APInt Low; 38447ae0e2c9SDimitry Andric unsigned ActiveWords = 1; 38457ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38467ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38477ae0e2c9SDimitry Andric Low = ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38487ae0e2c9SDimitry Andric ValueBitWidth); 38497ae0e2c9SDimitry Andric CurIdx += ActiveWords; 38507ae0e2c9SDimitry Andric 38517ae0e2c9SDimitry Andric if (!isSingleNumber) { 38527ae0e2c9SDimitry Andric ActiveWords = 1; 38537ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38547ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38557ae0e2c9SDimitry Andric APInt High = 38567ae0e2c9SDimitry Andric ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38577ae0e2c9SDimitry Andric ValueBitWidth); 38587ae0e2c9SDimitry Andric CurIdx += ActiveWords; 3859f785676fSDimitry Andric 3860f785676fSDimitry Andric // FIXME: It is not clear whether values in the range should be 3861f785676fSDimitry Andric // compared as signed or unsigned values. The partially 3862f785676fSDimitry Andric // implemented changes that used this format in the past used 3863f785676fSDimitry Andric // unsigned comparisons. 3864f785676fSDimitry Andric for ( ; Low.ule(High); ++Low) 3865f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38667ae0e2c9SDimitry Andric } else 3867f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38687ae0e2c9SDimitry Andric } 38697ae0e2c9SDimitry Andric BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); 3870f785676fSDimitry Andric for (SmallVector<ConstantInt*, 1>::iterator cvi = CaseVals.begin(), 3871f785676fSDimitry Andric cve = CaseVals.end(); cvi != cve; ++cvi) 3872f785676fSDimitry Andric SI->addCase(*cvi, DestBB); 38737ae0e2c9SDimitry Andric } 38747ae0e2c9SDimitry Andric I = SI; 38757ae0e2c9SDimitry Andric break; 38767ae0e2c9SDimitry Andric } 38777ae0e2c9SDimitry Andric 38787ae0e2c9SDimitry Andric // Old SwitchInst format without case ranges. 38797ae0e2c9SDimitry Andric 3880f22ef01cSRoman Divacky if (Record.size() < 3 || (Record.size() & 1) == 0) 388139d628a0SDimitry Andric return Error("Invalid record"); 38826122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 38833861d79fSDimitry Andric Value *Cond = getValue(Record, 1, NextValueNo, OpTy); 3884f22ef01cSRoman Divacky BasicBlock *Default = getBasicBlock(Record[2]); 388591bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 388639d628a0SDimitry Andric return Error("Invalid record"); 3887f22ef01cSRoman Divacky unsigned NumCases = (Record.size()-3)/2; 3888f22ef01cSRoman Divacky SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 3889f22ef01cSRoman Divacky InstructionList.push_back(SI); 3890f22ef01cSRoman Divacky for (unsigned i = 0, e = NumCases; i != e; ++i) { 3891f22ef01cSRoman Divacky ConstantInt *CaseVal = 3892f22ef01cSRoman Divacky dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); 3893f22ef01cSRoman Divacky BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); 389491bc56edSDimitry Andric if (!CaseVal || !DestBB) { 3895f22ef01cSRoman Divacky delete SI; 389639d628a0SDimitry Andric return Error("Invalid record"); 3897f22ef01cSRoman Divacky } 3898f22ef01cSRoman Divacky SI->addCase(CaseVal, DestBB); 3899f22ef01cSRoman Divacky } 3900f22ef01cSRoman Divacky I = SI; 3901f22ef01cSRoman Divacky break; 3902f22ef01cSRoman Divacky } 3903f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] 3904f22ef01cSRoman Divacky if (Record.size() < 2) 390539d628a0SDimitry Andric return Error("Invalid record"); 39066122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 39073861d79fSDimitry Andric Value *Address = getValue(Record, 1, NextValueNo, OpTy); 390891bc56edSDimitry Andric if (!OpTy || !Address) 390939d628a0SDimitry Andric return Error("Invalid record"); 3910f22ef01cSRoman Divacky unsigned NumDests = Record.size()-2; 3911f22ef01cSRoman Divacky IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); 3912f22ef01cSRoman Divacky InstructionList.push_back(IBI); 3913f22ef01cSRoman Divacky for (unsigned i = 0, e = NumDests; i != e; ++i) { 3914f22ef01cSRoman Divacky if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { 3915f22ef01cSRoman Divacky IBI->addDestination(DestBB); 3916f22ef01cSRoman Divacky } else { 3917f22ef01cSRoman Divacky delete IBI; 391839d628a0SDimitry Andric return Error("Invalid record"); 3919f22ef01cSRoman Divacky } 3920f22ef01cSRoman Divacky } 3921f22ef01cSRoman Divacky I = IBI; 3922f22ef01cSRoman Divacky break; 3923f22ef01cSRoman Divacky } 3924f22ef01cSRoman Divacky 3925f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INVOKE: { 3926f22ef01cSRoman Divacky // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] 3927f785676fSDimitry Andric if (Record.size() < 4) 392839d628a0SDimitry Andric return Error("Invalid record"); 3929ff0cc061SDimitry Andric unsigned OpNum = 0; 3930ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 3931ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 3932ff0cc061SDimitry Andric BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]); 3933ff0cc061SDimitry Andric BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]); 3934f22ef01cSRoman Divacky 3935ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 3936ff0cc061SDimitry Andric if (CCInfo >> 13 & 1 && 3937ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 3938ff0cc061SDimitry Andric return Error("Explicit invoke type is not a function type"); 3939ff0cc061SDimitry Andric 3940f22ef01cSRoman Divacky Value *Callee; 3941f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 394239d628a0SDimitry Andric return Error("Invalid record"); 3943f22ef01cSRoman Divacky 39446122f3e6SDimitry Andric PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); 3945ff0cc061SDimitry Andric if (!CalleeTy) 3946ff0cc061SDimitry Andric return Error("Callee is not a pointer"); 3947ff0cc061SDimitry Andric if (!FTy) { 3948ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(CalleeTy->getElementType()); 3949ff0cc061SDimitry Andric if (!FTy) 3950ff0cc061SDimitry Andric return Error("Callee is not of pointer to function type"); 3951ff0cc061SDimitry Andric } else if (CalleeTy->getElementType() != FTy) 3952ff0cc061SDimitry Andric return Error("Explicit invoke type does not match pointee type of " 3953ff0cc061SDimitry Andric "callee operand"); 3954ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 3955ff0cc061SDimitry Andric return Error("Insufficient operands to call"); 3956f22ef01cSRoman Divacky 3957f22ef01cSRoman Divacky SmallVector<Value*, 16> Ops; 3958f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 39593861d79fSDimitry Andric Ops.push_back(getValue(Record, OpNum, NextValueNo, 39603861d79fSDimitry Andric FTy->getParamType(i))); 396191bc56edSDimitry Andric if (!Ops.back()) 396239d628a0SDimitry Andric return Error("Invalid record"); 3963f22ef01cSRoman Divacky } 3964f22ef01cSRoman Divacky 3965f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 3966f22ef01cSRoman Divacky if (Record.size() != OpNum) 396739d628a0SDimitry Andric return Error("Invalid record"); 3968f22ef01cSRoman Divacky } else { 3969f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 3970f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3971f22ef01cSRoman Divacky Value *Op; 3972f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 397339d628a0SDimitry Andric return Error("Invalid record"); 3974f22ef01cSRoman Divacky Ops.push_back(Op); 3975f22ef01cSRoman Divacky } 3976f22ef01cSRoman Divacky } 3977f22ef01cSRoman Divacky 397817a519f9SDimitry Andric I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); 3979f22ef01cSRoman Divacky InstructionList.push_back(I); 3980ff0cc061SDimitry Andric cast<InvokeInst>(I) 3981ff0cc061SDimitry Andric ->setCallingConv(static_cast<CallingConv::ID>(~(1U << 13) & CCInfo)); 3982f22ef01cSRoman Divacky cast<InvokeInst>(I)->setAttributes(PAL); 3983f22ef01cSRoman Divacky break; 3984f22ef01cSRoman Divacky } 39856122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] 39866122f3e6SDimitry Andric unsigned Idx = 0; 398791bc56edSDimitry Andric Value *Val = nullptr; 39886122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) 398939d628a0SDimitry Andric return Error("Invalid record"); 39906122f3e6SDimitry Andric I = ResumeInst::Create(Val); 39916122f3e6SDimitry Andric InstructionList.push_back(I); 39926122f3e6SDimitry Andric break; 39936122f3e6SDimitry Andric } 3994f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE 3995f22ef01cSRoman Divacky I = new UnreachableInst(Context); 3996f22ef01cSRoman Divacky InstructionList.push_back(I); 3997f22ef01cSRoman Divacky break; 3998f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] 3999f22ef01cSRoman Divacky if (Record.size() < 1 || ((Record.size()-1)&1)) 400039d628a0SDimitry Andric return Error("Invalid record"); 40016122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4002f785676fSDimitry Andric if (!Ty) 400339d628a0SDimitry Andric return Error("Invalid record"); 4004f22ef01cSRoman Divacky 40053b0f4066SDimitry Andric PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); 4006f22ef01cSRoman Divacky InstructionList.push_back(PN); 4007f22ef01cSRoman Divacky 4008f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { 40093861d79fSDimitry Andric Value *V; 40103861d79fSDimitry Andric // With the new function encoding, it is possible that operands have 40113861d79fSDimitry Andric // negative IDs (for forward references). Use a signed VBR 40123861d79fSDimitry Andric // representation to keep the encoding small. 40133861d79fSDimitry Andric if (UseRelativeIDs) 40143861d79fSDimitry Andric V = getValueSigned(Record, 1+i, NextValueNo, Ty); 40153861d79fSDimitry Andric else 40163861d79fSDimitry Andric V = getValue(Record, 1+i, NextValueNo, Ty); 4017f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[2+i]); 4018f785676fSDimitry Andric if (!V || !BB) 401939d628a0SDimitry Andric return Error("Invalid record"); 4020f22ef01cSRoman Divacky PN->addIncoming(V, BB); 4021f22ef01cSRoman Divacky } 4022f22ef01cSRoman Divacky I = PN; 4023f22ef01cSRoman Divacky break; 4024f22ef01cSRoman Divacky } 4025f22ef01cSRoman Divacky 40266122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD: { 40276122f3e6SDimitry Andric // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] 40286122f3e6SDimitry Andric unsigned Idx = 0; 40296122f3e6SDimitry Andric if (Record.size() < 4) 403039d628a0SDimitry Andric return Error("Invalid record"); 40316122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[Idx++]); 4032f785676fSDimitry Andric if (!Ty) 403339d628a0SDimitry Andric return Error("Invalid record"); 403491bc56edSDimitry Andric Value *PersFn = nullptr; 40356122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) 403639d628a0SDimitry Andric return Error("Invalid record"); 40376122f3e6SDimitry Andric 40386122f3e6SDimitry Andric bool IsCleanup = !!Record[Idx++]; 40396122f3e6SDimitry Andric unsigned NumClauses = Record[Idx++]; 40406122f3e6SDimitry Andric LandingPadInst *LP = LandingPadInst::Create(Ty, PersFn, NumClauses); 40416122f3e6SDimitry Andric LP->setCleanup(IsCleanup); 40426122f3e6SDimitry Andric for (unsigned J = 0; J != NumClauses; ++J) { 40436122f3e6SDimitry Andric LandingPadInst::ClauseType CT = 40446122f3e6SDimitry Andric LandingPadInst::ClauseType(Record[Idx++]); (void)CT; 40456122f3e6SDimitry Andric Value *Val; 40466122f3e6SDimitry Andric 40476122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) { 40486122f3e6SDimitry Andric delete LP; 404939d628a0SDimitry Andric return Error("Invalid record"); 40506122f3e6SDimitry Andric } 40516122f3e6SDimitry Andric 40526122f3e6SDimitry Andric assert((CT != LandingPadInst::Catch || 40536122f3e6SDimitry Andric !isa<ArrayType>(Val->getType())) && 40546122f3e6SDimitry Andric "Catch clause has a invalid type!"); 40556122f3e6SDimitry Andric assert((CT != LandingPadInst::Filter || 40566122f3e6SDimitry Andric isa<ArrayType>(Val->getType())) && 40576122f3e6SDimitry Andric "Filter clause has invalid type!"); 405891bc56edSDimitry Andric LP->addClause(cast<Constant>(Val)); 40596122f3e6SDimitry Andric } 40606122f3e6SDimitry Andric 40616122f3e6SDimitry Andric I = LP; 40626122f3e6SDimitry Andric InstructionList.push_back(I); 40636122f3e6SDimitry Andric break; 40646122f3e6SDimitry Andric } 40656122f3e6SDimitry Andric 406617a519f9SDimitry Andric case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] 406717a519f9SDimitry Andric if (Record.size() != 4) 406839d628a0SDimitry Andric return Error("Invalid record"); 4069ff0cc061SDimitry Andric uint64_t AlignRecord = Record[3]; 4070ff0cc061SDimitry Andric const uint64_t InAllocaMask = uint64_t(1) << 5; 4071ff0cc061SDimitry Andric const uint64_t ExplicitTypeMask = uint64_t(1) << 6; 4072ff0cc061SDimitry Andric const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask; 4073ff0cc061SDimitry Andric bool InAlloca = AlignRecord & InAllocaMask; 4074ff0cc061SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4075ff0cc061SDimitry Andric if ((AlignRecord & ExplicitTypeMask) == 0) { 4076ff0cc061SDimitry Andric auto *PTy = dyn_cast_or_null<PointerType>(Ty); 4077ff0cc061SDimitry Andric if (!PTy) 4078ff0cc061SDimitry Andric return Error("Old-style alloca with a non-pointer type"); 4079ff0cc061SDimitry Andric Ty = PTy->getElementType(); 4080ff0cc061SDimitry Andric } 40816122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 408217a519f9SDimitry Andric Value *Size = getFnValueByID(Record[2], OpTy); 4083ff0cc061SDimitry Andric unsigned Align; 4084ff0cc061SDimitry Andric if (std::error_code EC = 4085ff0cc061SDimitry Andric parseAlignmentValue(AlignRecord & ~FlagMask, Align)) { 4086ff0cc061SDimitry Andric return EC; 4087ff0cc061SDimitry Andric } 4088f785676fSDimitry Andric if (!Ty || !Size) 408939d628a0SDimitry Andric return Error("Invalid record"); 4090ff0cc061SDimitry Andric AllocaInst *AI = new AllocaInst(Ty, Size, Align); 409191bc56edSDimitry Andric AI->setUsedWithInAlloca(InAlloca); 409291bc56edSDimitry Andric I = AI; 4093f22ef01cSRoman Divacky InstructionList.push_back(I); 4094f22ef01cSRoman Divacky break; 4095f22ef01cSRoman Divacky } 4096f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] 4097f22ef01cSRoman Divacky unsigned OpNum = 0; 4098f22ef01cSRoman Divacky Value *Op; 4099f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4100ff0cc061SDimitry Andric (OpNum + 2 != Record.size() && OpNum + 3 != Record.size())) 410139d628a0SDimitry Andric return Error("Invalid record"); 4102f22ef01cSRoman Divacky 4103ff0cc061SDimitry Andric Type *Ty = nullptr; 4104ff0cc061SDimitry Andric if (OpNum + 3 == Record.size()) 4105ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4106ff0cc061SDimitry Andric if (std::error_code EC = 4107ff0cc061SDimitry Andric TypeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4108ff0cc061SDimitry Andric return EC; 4109ff0cc061SDimitry Andric if (!Ty) 4110ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4111ff0cc061SDimitry Andric 4112ff0cc061SDimitry Andric unsigned Align; 4113ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4114ff0cc061SDimitry Andric return EC; 4115ff0cc061SDimitry Andric I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align); 4116ff0cc061SDimitry Andric 4117f22ef01cSRoman Divacky InstructionList.push_back(I); 4118f22ef01cSRoman Divacky break; 4119f22ef01cSRoman Divacky } 41206122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LOADATOMIC: { 41216122f3e6SDimitry Andric // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] 41226122f3e6SDimitry Andric unsigned OpNum = 0; 41236122f3e6SDimitry Andric Value *Op; 41246122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4125ff0cc061SDimitry Andric (OpNum + 4 != Record.size() && OpNum + 5 != Record.size())) 412639d628a0SDimitry Andric return Error("Invalid record"); 41276122f3e6SDimitry Andric 4128ff0cc061SDimitry Andric Type *Ty = nullptr; 4129ff0cc061SDimitry Andric if (OpNum + 5 == Record.size()) 4130ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4131ff0cc061SDimitry Andric if (std::error_code EC = 4132ff0cc061SDimitry Andric TypeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4133ff0cc061SDimitry Andric return EC; 4134ff0cc061SDimitry Andric if (!Ty) 4135ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4136ff0cc061SDimitry Andric 41376122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 41386122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Release || 41396122f3e6SDimitry Andric Ordering == AcquireRelease) 414039d628a0SDimitry Andric return Error("Invalid record"); 41416122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 414239d628a0SDimitry Andric return Error("Invalid record"); 41436122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 41446122f3e6SDimitry Andric 4145ff0cc061SDimitry Andric unsigned Align; 4146ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4147ff0cc061SDimitry Andric return EC; 4148ff0cc061SDimitry Andric I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope); 4149ff0cc061SDimitry Andric 41506122f3e6SDimitry Andric InstructionList.push_back(I); 41516122f3e6SDimitry Andric break; 41526122f3e6SDimitry Andric } 4153ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE: 4154ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE_OLD: { // STORE2:[ptrty, ptr, val, align, vol] 4155f22ef01cSRoman Divacky unsigned OpNum = 0; 4156f22ef01cSRoman Divacky Value *Val, *Ptr; 4157f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4158ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STORE 4159ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4160ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4161ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4162ff0cc061SDimitry Andric Val)) || 4163f22ef01cSRoman Divacky OpNum + 2 != Record.size()) 416439d628a0SDimitry Andric return Error("Invalid record"); 4165f22ef01cSRoman Divacky 4166ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4167ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4168ff0cc061SDimitry Andric return EC; 4169ff0cc061SDimitry Andric unsigned Align; 4170ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4171ff0cc061SDimitry Andric return EC; 4172ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align); 4173f22ef01cSRoman Divacky InstructionList.push_back(I); 4174f22ef01cSRoman Divacky break; 4175f22ef01cSRoman Divacky } 4176ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC: 4177ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC_OLD: { 41786122f3e6SDimitry Andric // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] 41796122f3e6SDimitry Andric unsigned OpNum = 0; 41806122f3e6SDimitry Andric Value *Val, *Ptr; 41816122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4182ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STOREATOMIC 4183ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4184ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4185ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4186ff0cc061SDimitry Andric Val)) || 41876122f3e6SDimitry Andric OpNum + 4 != Record.size()) 418839d628a0SDimitry Andric return Error("Invalid record"); 41896122f3e6SDimitry Andric 4190ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4191ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4192ff0cc061SDimitry Andric return EC; 41936122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 41946122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Acquire || 41956122f3e6SDimitry Andric Ordering == AcquireRelease) 419639d628a0SDimitry Andric return Error("Invalid record"); 41976122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 41986122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 419939d628a0SDimitry Andric return Error("Invalid record"); 42006122f3e6SDimitry Andric 4201ff0cc061SDimitry Andric unsigned Align; 4202ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4203ff0cc061SDimitry Andric return EC; 4204ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SynchScope); 42056122f3e6SDimitry Andric InstructionList.push_back(I); 42066122f3e6SDimitry Andric break; 42076122f3e6SDimitry Andric } 4208ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG_OLD: 42096122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG: { 421091bc56edSDimitry Andric // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, 421191bc56edSDimitry Andric // failureordering?, isweak?] 42126122f3e6SDimitry Andric unsigned OpNum = 0; 42136122f3e6SDimitry Andric Value *Ptr, *Cmp, *New; 42146122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4215ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_CMPXCHG 4216ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Cmp) 4217ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4218ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4219ff0cc061SDimitry Andric Cmp)) || 4220ff0cc061SDimitry Andric popValue(Record, OpNum, NextValueNo, Cmp->getType(), New) || 4221ff0cc061SDimitry Andric Record.size() < OpNum + 3 || Record.size() > OpNum + 5) 422239d628a0SDimitry Andric return Error("Invalid record"); 422391bc56edSDimitry Andric AtomicOrdering SuccessOrdering = GetDecodedOrdering(Record[OpNum+1]); 422491bc56edSDimitry Andric if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered) 422539d628a0SDimitry Andric return Error("Invalid record"); 42266122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); 422791bc56edSDimitry Andric 4228ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4229ff0cc061SDimitry Andric DiagnosticHandler, Cmp->getType(), Ptr->getType())) 4230ff0cc061SDimitry Andric return EC; 423191bc56edSDimitry Andric AtomicOrdering FailureOrdering; 423291bc56edSDimitry Andric if (Record.size() < 7) 423391bc56edSDimitry Andric FailureOrdering = 423491bc56edSDimitry Andric AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrdering); 423591bc56edSDimitry Andric else 423691bc56edSDimitry Andric FailureOrdering = GetDecodedOrdering(Record[OpNum+3]); 423791bc56edSDimitry Andric 423891bc56edSDimitry Andric I = new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering, FailureOrdering, 423991bc56edSDimitry Andric SynchScope); 42406122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); 424191bc56edSDimitry Andric 424291bc56edSDimitry Andric if (Record.size() < 8) { 424391bc56edSDimitry Andric // Before weak cmpxchgs existed, the instruction simply returned the 424491bc56edSDimitry Andric // value loaded from memory, so bitcode files from that era will be 424591bc56edSDimitry Andric // expecting the first component of a modern cmpxchg. 424691bc56edSDimitry Andric CurBB->getInstList().push_back(I); 424791bc56edSDimitry Andric I = ExtractValueInst::Create(I, 0); 424891bc56edSDimitry Andric } else { 424991bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum+4]); 425091bc56edSDimitry Andric } 425191bc56edSDimitry Andric 42526122f3e6SDimitry Andric InstructionList.push_back(I); 42536122f3e6SDimitry Andric break; 42546122f3e6SDimitry Andric } 42556122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_ATOMICRMW: { 42566122f3e6SDimitry Andric // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] 42576122f3e6SDimitry Andric unsigned OpNum = 0; 42586122f3e6SDimitry Andric Value *Ptr, *Val; 42596122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 42603861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 42616122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 42626122f3e6SDimitry Andric OpNum+4 != Record.size()) 426339d628a0SDimitry Andric return Error("Invalid record"); 42646122f3e6SDimitry Andric AtomicRMWInst::BinOp Operation = GetDecodedRMWOperation(Record[OpNum]); 42656122f3e6SDimitry Andric if (Operation < AtomicRMWInst::FIRST_BINOP || 42666122f3e6SDimitry Andric Operation > AtomicRMWInst::LAST_BINOP) 426739d628a0SDimitry Andric return Error("Invalid record"); 42686122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 42696122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 427039d628a0SDimitry Andric return Error("Invalid record"); 42716122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 42726122f3e6SDimitry Andric I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); 42736122f3e6SDimitry Andric cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); 42746122f3e6SDimitry Andric InstructionList.push_back(I); 42756122f3e6SDimitry Andric break; 42766122f3e6SDimitry Andric } 42776122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] 42786122f3e6SDimitry Andric if (2 != Record.size()) 427939d628a0SDimitry Andric return Error("Invalid record"); 42806122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[0]); 42816122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered || 42826122f3e6SDimitry Andric Ordering == Monotonic) 428339d628a0SDimitry Andric return Error("Invalid record"); 42846122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]); 42856122f3e6SDimitry Andric I = new FenceInst(Context, Ordering, SynchScope); 42866122f3e6SDimitry Andric InstructionList.push_back(I); 42876122f3e6SDimitry Andric break; 42886122f3e6SDimitry Andric } 428917a519f9SDimitry Andric case bitc::FUNC_CODE_INST_CALL: { 4290f22ef01cSRoman Divacky // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] 4291f22ef01cSRoman Divacky if (Record.size() < 3) 429239d628a0SDimitry Andric return Error("Invalid record"); 4293f22ef01cSRoman Divacky 4294ff0cc061SDimitry Andric unsigned OpNum = 0; 4295ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 4296ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 4297f22ef01cSRoman Divacky 4298ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 4299ff0cc061SDimitry Andric if (CCInfo >> 15 & 1 && 4300ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 4301ff0cc061SDimitry Andric return Error("Explicit call type is not a function type"); 4302ff0cc061SDimitry Andric 4303f22ef01cSRoman Divacky Value *Callee; 4304f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 430539d628a0SDimitry Andric return Error("Invalid record"); 4306f22ef01cSRoman Divacky 43076122f3e6SDimitry Andric PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); 4308ff0cc061SDimitry Andric if (!OpTy) 4309ff0cc061SDimitry Andric return Error("Callee is not a pointer type"); 4310ff0cc061SDimitry Andric if (!FTy) { 4311ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(OpTy->getElementType()); 4312ff0cc061SDimitry Andric if (!FTy) 4313ff0cc061SDimitry Andric return Error("Callee is not of pointer to function type"); 4314ff0cc061SDimitry Andric } else if (OpTy->getElementType() != FTy) 4315ff0cc061SDimitry Andric return Error("Explicit call type does not match pointee type of " 4316ff0cc061SDimitry Andric "callee operand"); 4317ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 4318ff0cc061SDimitry Andric return Error("Insufficient operands to call"); 4319f22ef01cSRoman Divacky 4320f22ef01cSRoman Divacky SmallVector<Value*, 16> Args; 4321f22ef01cSRoman Divacky // Read the fixed params. 4322f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 432317a519f9SDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 4324f22ef01cSRoman Divacky Args.push_back(getBasicBlock(Record[OpNum])); 4325f22ef01cSRoman Divacky else 43263861d79fSDimitry Andric Args.push_back(getValue(Record, OpNum, NextValueNo, 43273861d79fSDimitry Andric FTy->getParamType(i))); 432891bc56edSDimitry Andric if (!Args.back()) 432939d628a0SDimitry Andric return Error("Invalid record"); 4330f22ef01cSRoman Divacky } 4331f22ef01cSRoman Divacky 4332f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 4333f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 4334f22ef01cSRoman Divacky if (OpNum != Record.size()) 433539d628a0SDimitry Andric return Error("Invalid record"); 4336f22ef01cSRoman Divacky } else { 4337f22ef01cSRoman Divacky while (OpNum != Record.size()) { 4338f22ef01cSRoman Divacky Value *Op; 4339f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 434039d628a0SDimitry Andric return Error("Invalid record"); 4341f22ef01cSRoman Divacky Args.push_back(Op); 4342f22ef01cSRoman Divacky } 4343f22ef01cSRoman Divacky } 4344f22ef01cSRoman Divacky 4345ff0cc061SDimitry Andric I = CallInst::Create(FTy, Callee, Args); 4346f22ef01cSRoman Divacky InstructionList.push_back(I); 4347f22ef01cSRoman Divacky cast<CallInst>(I)->setCallingConv( 434891bc56edSDimitry Andric static_cast<CallingConv::ID>((~(1U << 14) & CCInfo) >> 1)); 434991bc56edSDimitry Andric CallInst::TailCallKind TCK = CallInst::TCK_None; 435091bc56edSDimitry Andric if (CCInfo & 1) 435191bc56edSDimitry Andric TCK = CallInst::TCK_Tail; 435291bc56edSDimitry Andric if (CCInfo & (1 << 14)) 435391bc56edSDimitry Andric TCK = CallInst::TCK_MustTail; 435491bc56edSDimitry Andric cast<CallInst>(I)->setTailCallKind(TCK); 4355f22ef01cSRoman Divacky cast<CallInst>(I)->setAttributes(PAL); 4356f22ef01cSRoman Divacky break; 4357f22ef01cSRoman Divacky } 4358f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] 4359f22ef01cSRoman Divacky if (Record.size() < 3) 436039d628a0SDimitry Andric return Error("Invalid record"); 43616122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 43623861d79fSDimitry Andric Value *Op = getValue(Record, 1, NextValueNo, OpTy); 43636122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[2]); 4364f22ef01cSRoman Divacky if (!OpTy || !Op || !ResTy) 436539d628a0SDimitry Andric return Error("Invalid record"); 4366f22ef01cSRoman Divacky I = new VAArgInst(Op, ResTy); 4367f22ef01cSRoman Divacky InstructionList.push_back(I); 4368f22ef01cSRoman Divacky break; 4369f22ef01cSRoman Divacky } 4370f22ef01cSRoman Divacky } 4371f22ef01cSRoman Divacky 4372f22ef01cSRoman Divacky // Add instruction to end of current BB. If there is no current BB, reject 4373f22ef01cSRoman Divacky // this file. 437491bc56edSDimitry Andric if (!CurBB) { 4375f22ef01cSRoman Divacky delete I; 437639d628a0SDimitry Andric return Error("Invalid instruction with no BB"); 4377f22ef01cSRoman Divacky } 4378f22ef01cSRoman Divacky CurBB->getInstList().push_back(I); 4379f22ef01cSRoman Divacky 4380f22ef01cSRoman Divacky // If this was a terminator instruction, move to the next block. 4381f22ef01cSRoman Divacky if (isa<TerminatorInst>(I)) { 4382f22ef01cSRoman Divacky ++CurBBNo; 438391bc56edSDimitry Andric CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr; 4384f22ef01cSRoman Divacky } 4385f22ef01cSRoman Divacky 4386f22ef01cSRoman Divacky // Non-void values get registered in the value table for future use. 4387f22ef01cSRoman Divacky if (I && !I->getType()->isVoidTy()) 4388f22ef01cSRoman Divacky ValueList.AssignValue(I, NextValueNo++); 4389f22ef01cSRoman Divacky } 4390f22ef01cSRoman Divacky 4391139f7f9bSDimitry Andric OutOfRecordLoop: 4392139f7f9bSDimitry Andric 4393f22ef01cSRoman Divacky // Check the function list for unresolved values. 4394f22ef01cSRoman Divacky if (Argument *A = dyn_cast<Argument>(ValueList.back())) { 439591bc56edSDimitry Andric if (!A->getParent()) { 4396f22ef01cSRoman Divacky // We found at least one unresolved value. Nuke them all to avoid leaks. 4397f22ef01cSRoman Divacky for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ 439891bc56edSDimitry Andric if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && !A->getParent()) { 4399f22ef01cSRoman Divacky A->replaceAllUsesWith(UndefValue::get(A->getType())); 4400f22ef01cSRoman Divacky delete A; 4401f22ef01cSRoman Divacky } 4402f22ef01cSRoman Divacky } 440339d628a0SDimitry Andric return Error("Never resolved value found in function"); 4404f22ef01cSRoman Divacky } 4405f22ef01cSRoman Divacky } 4406f22ef01cSRoman Divacky 4407e580952dSDimitry Andric // FIXME: Check for unresolved forward-declared metadata references 4408e580952dSDimitry Andric // and clean up leaks. 4409e580952dSDimitry Andric 4410f22ef01cSRoman Divacky // Trim the value list down to the size it was before we parsed this function. 4411f22ef01cSRoman Divacky ValueList.shrinkTo(ModuleValueListSize); 4412e580952dSDimitry Andric MDValueList.shrinkTo(ModuleMDValueListSize); 4413f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 441491bc56edSDimitry Andric return std::error_code(); 4415f22ef01cSRoman Divacky } 4416f22ef01cSRoman Divacky 4417f785676fSDimitry Andric /// Find the function body in the bitcode stream 441891bc56edSDimitry Andric std::error_code BitcodeReader::FindFunctionInStream( 441991bc56edSDimitry Andric Function *F, 4420dff0c46cSDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) { 4421dff0c46cSDimitry Andric while (DeferredFunctionInfoIterator->second == 0) { 4422dff0c46cSDimitry Andric if (Stream.AtEndOfStream()) 442339d628a0SDimitry Andric return Error("Could not find function in stream"); 4424dff0c46cSDimitry Andric // ParseModule will parse the next body in the stream and set its 4425dff0c46cSDimitry Andric // position in the DeferredFunctionInfo map. 442691bc56edSDimitry Andric if (std::error_code EC = ParseModule(true)) 4427f785676fSDimitry Andric return EC; 4428dff0c46cSDimitry Andric } 442991bc56edSDimitry Andric return std::error_code(); 4430dff0c46cSDimitry Andric } 4431dff0c46cSDimitry Andric 4432f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4433f22ef01cSRoman Divacky // GVMaterializer implementation 4434f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4435f22ef01cSRoman Divacky 443691bc56edSDimitry Andric void BitcodeReader::releaseBuffer() { Buffer.release(); } 4437f22ef01cSRoman Divacky 443839d628a0SDimitry Andric std::error_code BitcodeReader::materialize(GlobalValue *GV) { 4439ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4440ff0cc061SDimitry Andric return EC; 4441ff0cc061SDimitry Andric 4442f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4443f22ef01cSRoman Divacky // If it's not a function or is already material, ignore the request. 4444f785676fSDimitry Andric if (!F || !F->isMaterializable()) 444591bc56edSDimitry Andric return std::error_code(); 4446f22ef01cSRoman Divacky 4447f22ef01cSRoman Divacky DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); 4448f22ef01cSRoman Divacky assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); 4449dff0c46cSDimitry Andric // If its position is recorded as 0, its body is somewhere in the stream 4450dff0c46cSDimitry Andric // but we haven't seen it yet. 4451f785676fSDimitry Andric if (DFII->second == 0 && LazyStreamer) 445291bc56edSDimitry Andric if (std::error_code EC = FindFunctionInStream(F, DFII)) 4453f785676fSDimitry Andric return EC; 4454f22ef01cSRoman Divacky 4455f22ef01cSRoman Divacky // Move the bit stream to the saved position of the deferred function body. 4456f22ef01cSRoman Divacky Stream.JumpToBit(DFII->second); 4457f22ef01cSRoman Divacky 445891bc56edSDimitry Andric if (std::error_code EC = ParseFunctionBody(F)) 4459f785676fSDimitry Andric return EC; 446039d628a0SDimitry Andric F->setIsMaterializable(false); 4461f22ef01cSRoman Divacky 4462ff0cc061SDimitry Andric if (StripDebugInfo) 4463ff0cc061SDimitry Andric stripDebugInfo(*F); 4464ff0cc061SDimitry Andric 4465f22ef01cSRoman Divacky // Upgrade any old intrinsic calls in the function. 4466f22ef01cSRoman Divacky for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), 4467f22ef01cSRoman Divacky E = UpgradedIntrinsics.end(); I != E; ++I) { 4468f22ef01cSRoman Divacky if (I->first != I->second) { 446991bc56edSDimitry Andric for (auto UI = I->first->user_begin(), UE = I->first->user_end(); 447091bc56edSDimitry Andric UI != UE;) { 4471f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 4472f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 4473f22ef01cSRoman Divacky } 4474f22ef01cSRoman Divacky } 4475f22ef01cSRoman Divacky } 4476f22ef01cSRoman Divacky 447739d628a0SDimitry Andric // Bring in any functions that this function forward-referenced via 447839d628a0SDimitry Andric // blockaddresses. 447939d628a0SDimitry Andric return materializeForwardReferencedFunctions(); 4480f22ef01cSRoman Divacky } 4481f22ef01cSRoman Divacky 4482f22ef01cSRoman Divacky bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { 4483f22ef01cSRoman Divacky const Function *F = dyn_cast<Function>(GV); 4484f22ef01cSRoman Divacky if (!F || F->isDeclaration()) 4485f22ef01cSRoman Divacky return false; 448639d628a0SDimitry Andric 448739d628a0SDimitry Andric // Dematerializing F would leave dangling references that wouldn't be 448839d628a0SDimitry Andric // reconnected on re-materialization. 448939d628a0SDimitry Andric if (BlockAddressesTaken.count(F)) 449039d628a0SDimitry Andric return false; 449139d628a0SDimitry Andric 4492f22ef01cSRoman Divacky return DeferredFunctionInfo.count(const_cast<Function*>(F)); 4493f22ef01cSRoman Divacky } 4494f22ef01cSRoman Divacky 4495ff0cc061SDimitry Andric void BitcodeReader::dematerialize(GlobalValue *GV) { 4496f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4497f22ef01cSRoman Divacky // If this function isn't dematerializable, this is a noop. 4498f22ef01cSRoman Divacky if (!F || !isDematerializable(F)) 4499f22ef01cSRoman Divacky return; 4500f22ef01cSRoman Divacky 4501f22ef01cSRoman Divacky assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); 4502f22ef01cSRoman Divacky 4503f22ef01cSRoman Divacky // Just forget the function body, we can remat it later. 450439d628a0SDimitry Andric F->dropAllReferences(); 450539d628a0SDimitry Andric F->setIsMaterializable(true); 4506f22ef01cSRoman Divacky } 4507f22ef01cSRoman Divacky 4508ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeModule(Module *M) { 4509f22ef01cSRoman Divacky assert(M == TheModule && 4510f22ef01cSRoman Divacky "Can only Materialize the Module this BitcodeReader is attached to."); 451139d628a0SDimitry Andric 4512ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4513ff0cc061SDimitry Andric return EC; 4514ff0cc061SDimitry Andric 451539d628a0SDimitry Andric // Promise to materialize all forward references. 451639d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 451739d628a0SDimitry Andric 4518f22ef01cSRoman Divacky // Iterate over the module, deserializing any functions that are still on 4519f22ef01cSRoman Divacky // disk. 4520f22ef01cSRoman Divacky for (Module::iterator F = TheModule->begin(), E = TheModule->end(); 4521f785676fSDimitry Andric F != E; ++F) { 452239d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 4523f785676fSDimitry Andric return EC; 4524f785676fSDimitry Andric } 4525dff0c46cSDimitry Andric // At this point, if there are any function bodies, the current bit is 4526dff0c46cSDimitry Andric // pointing to the END_BLOCK record after them. Now make sure the rest 4527dff0c46cSDimitry Andric // of the bits in the module have been read. 4528dff0c46cSDimitry Andric if (NextUnreadBit) 4529dff0c46cSDimitry Andric ParseModule(true); 4530dff0c46cSDimitry Andric 453139d628a0SDimitry Andric // Check that all block address forward references got resolved (as we 453239d628a0SDimitry Andric // promised above). 453339d628a0SDimitry Andric if (!BasicBlockFwdRefs.empty()) 453439d628a0SDimitry Andric return Error("Never resolved function from blockaddress"); 453539d628a0SDimitry Andric 4536f22ef01cSRoman Divacky // Upgrade any intrinsic calls that slipped through (should not happen!) and 4537f22ef01cSRoman Divacky // delete the old functions to clean up. We can't do this unless the entire 4538f22ef01cSRoman Divacky // module is materialized because there could always be another function body 4539f22ef01cSRoman Divacky // with calls to the old function. 4540f22ef01cSRoman Divacky for (std::vector<std::pair<Function*, Function*> >::iterator I = 4541f22ef01cSRoman Divacky UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) { 4542f22ef01cSRoman Divacky if (I->first != I->second) { 454391bc56edSDimitry Andric for (auto UI = I->first->user_begin(), UE = I->first->user_end(); 454491bc56edSDimitry Andric UI != UE;) { 4545f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 4546f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 4547f22ef01cSRoman Divacky } 4548f22ef01cSRoman Divacky if (!I->first->use_empty()) 4549f22ef01cSRoman Divacky I->first->replaceAllUsesWith(I->second); 4550f22ef01cSRoman Divacky I->first->eraseFromParent(); 4551f22ef01cSRoman Divacky } 4552f22ef01cSRoman Divacky } 4553f22ef01cSRoman Divacky std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); 4554f22ef01cSRoman Divacky 4555f785676fSDimitry Andric for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) 4556f785676fSDimitry Andric UpgradeInstWithTBAATag(InstsWithTBAATag[I]); 4557f785676fSDimitry Andric 4558f785676fSDimitry Andric UpgradeDebugInfo(*M); 455991bc56edSDimitry Andric return std::error_code(); 4560dff0c46cSDimitry Andric } 45616122f3e6SDimitry Andric 456239d628a0SDimitry Andric std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes() const { 456339d628a0SDimitry Andric return IdentifiedStructTypes; 456439d628a0SDimitry Andric } 456539d628a0SDimitry Andric 456691bc56edSDimitry Andric std::error_code BitcodeReader::InitStream() { 4567f785676fSDimitry Andric if (LazyStreamer) 4568f785676fSDimitry Andric return InitLazyStream(); 4569dff0c46cSDimitry Andric return InitStreamFromBuffer(); 4570dff0c46cSDimitry Andric } 4571dff0c46cSDimitry Andric 457291bc56edSDimitry Andric std::error_code BitcodeReader::InitStreamFromBuffer() { 45733861d79fSDimitry Andric const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); 4574dff0c46cSDimitry Andric const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); 4575dff0c46cSDimitry Andric 457639d628a0SDimitry Andric if (Buffer->getBufferSize() & 3) 457739d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4578dff0c46cSDimitry Andric 4579dff0c46cSDimitry Andric // If we have a wrapper header, parse it and ignore the non-bc file contents. 4580dff0c46cSDimitry Andric // The magic number is 0x0B17C0DE stored in little endian. 4581dff0c46cSDimitry Andric if (isBitcodeWrapper(BufPtr, BufEnd)) 4582dff0c46cSDimitry Andric if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) 458339d628a0SDimitry Andric return Error("Invalid bitcode wrapper header"); 4584dff0c46cSDimitry Andric 4585dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); 458639d628a0SDimitry Andric Stream.init(&*StreamFile); 4587f22ef01cSRoman Divacky 458891bc56edSDimitry Andric return std::error_code(); 4589f22ef01cSRoman Divacky } 4590f22ef01cSRoman Divacky 459191bc56edSDimitry Andric std::error_code BitcodeReader::InitLazyStream() { 4592dff0c46cSDimitry Andric // Check and strip off the bitcode wrapper; BitstreamReader expects never to 4593dff0c46cSDimitry Andric // see it. 459439d628a0SDimitry Andric auto OwnedBytes = llvm::make_unique<StreamingMemoryObject>(LazyStreamer); 459539d628a0SDimitry Andric StreamingMemoryObject &Bytes = *OwnedBytes; 459639d628a0SDimitry Andric StreamFile = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes)); 459739d628a0SDimitry Andric Stream.init(&*StreamFile); 4598dff0c46cSDimitry Andric 4599dff0c46cSDimitry Andric unsigned char buf[16]; 460039d628a0SDimitry Andric if (Bytes.readBytes(buf, 16, 0) != 16) 460139d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4602dff0c46cSDimitry Andric 4603dff0c46cSDimitry Andric if (!isBitcode(buf, buf + 16)) 460439d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4605dff0c46cSDimitry Andric 4606dff0c46cSDimitry Andric if (isBitcodeWrapper(buf, buf + 4)) { 4607dff0c46cSDimitry Andric const unsigned char *bitcodeStart = buf; 4608dff0c46cSDimitry Andric const unsigned char *bitcodeEnd = buf + 16; 4609dff0c46cSDimitry Andric SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); 461039d628a0SDimitry Andric Bytes.dropLeadingBytes(bitcodeStart - buf); 461139d628a0SDimitry Andric Bytes.setKnownObjectSize(bitcodeEnd - bitcodeStart); 4612dff0c46cSDimitry Andric } 461391bc56edSDimitry Andric return std::error_code(); 4614f785676fSDimitry Andric } 4615f785676fSDimitry Andric 4616f785676fSDimitry Andric namespace { 461791bc56edSDimitry Andric class BitcodeErrorCategoryType : public std::error_category { 461891bc56edSDimitry Andric const char *name() const LLVM_NOEXCEPT override { 4619f785676fSDimitry Andric return "llvm.bitcode"; 4620f785676fSDimitry Andric } 462191bc56edSDimitry Andric std::string message(int IE) const override { 462239d628a0SDimitry Andric BitcodeError E = static_cast<BitcodeError>(IE); 4623f785676fSDimitry Andric switch (E) { 462439d628a0SDimitry Andric case BitcodeError::InvalidBitcodeSignature: 4625f785676fSDimitry Andric return "Invalid bitcode signature"; 462639d628a0SDimitry Andric case BitcodeError::CorruptedBitcode: 462739d628a0SDimitry Andric return "Corrupted bitcode"; 4628f785676fSDimitry Andric } 4629f785676fSDimitry Andric llvm_unreachable("Unknown error type!"); 4630f785676fSDimitry Andric } 4631f785676fSDimitry Andric }; 4632f785676fSDimitry Andric } 4633f785676fSDimitry Andric 463439d628a0SDimitry Andric static ManagedStatic<BitcodeErrorCategoryType> ErrorCategory; 463539d628a0SDimitry Andric 463639d628a0SDimitry Andric const std::error_category &llvm::BitcodeErrorCategory() { 463739d628a0SDimitry Andric return *ErrorCategory; 4638dff0c46cSDimitry Andric } 4639f22ef01cSRoman Divacky 4640f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4641f22ef01cSRoman Divacky // External interface 4642f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4643f22ef01cSRoman Divacky 464439d628a0SDimitry Andric /// \brief Get a lazy one-at-time loading module from bitcode. 4645f22ef01cSRoman Divacky /// 464639d628a0SDimitry Andric /// This isn't always used in a lazy context. In particular, it's also used by 464739d628a0SDimitry Andric /// \a parseBitcodeFile(). If this is truly lazy, then we need to eagerly pull 464839d628a0SDimitry Andric /// in forward-referenced functions from block address references. 464939d628a0SDimitry Andric /// 465039d628a0SDimitry Andric /// \param[in] WillMaterializeAll Set to \c true if the caller promises to 465139d628a0SDimitry Andric /// materialize everything -- in particular, if this isn't truly lazy. 465239d628a0SDimitry Andric static ErrorOr<Module *> 465339d628a0SDimitry Andric getLazyBitcodeModuleImpl(std::unique_ptr<MemoryBuffer> &&Buffer, 465439d628a0SDimitry Andric LLVMContext &Context, bool WillMaterializeAll, 4655ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4656ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false) { 4657f22ef01cSRoman Divacky Module *M = new Module(Buffer->getBufferIdentifier(), Context); 465839d628a0SDimitry Andric BitcodeReader *R = 465939d628a0SDimitry Andric new BitcodeReader(Buffer.get(), Context, DiagnosticHandler); 4660f22ef01cSRoman Divacky M->setMaterializer(R); 466139d628a0SDimitry Andric 466239d628a0SDimitry Andric auto cleanupOnError = [&](std::error_code EC) { 466391bc56edSDimitry Andric R->releaseBuffer(); // Never take ownership on error. 4664f22ef01cSRoman Divacky delete M; // Also deletes R. 466591bc56edSDimitry Andric return EC; 466639d628a0SDimitry Andric }; 4667dff0c46cSDimitry Andric 4668ff0cc061SDimitry Andric // Delay parsing Metadata if ShouldLazyLoadMetadata is true. 4669ff0cc061SDimitry Andric if (std::error_code EC = R->ParseBitcodeInto(M, ShouldLazyLoadMetadata)) 467039d628a0SDimitry Andric return cleanupOnError(EC); 4671dff0c46cSDimitry Andric 467239d628a0SDimitry Andric if (!WillMaterializeAll) 467339d628a0SDimitry Andric // Resolve forward references from blockaddresses. 467439d628a0SDimitry Andric if (std::error_code EC = R->materializeForwardReferencedFunctions()) 467539d628a0SDimitry Andric return cleanupOnError(EC); 467639d628a0SDimitry Andric 467739d628a0SDimitry Andric Buffer.release(); // The BitcodeReader owns it now. 4678dff0c46cSDimitry Andric return M; 4679dff0c46cSDimitry Andric } 4680dff0c46cSDimitry Andric 468139d628a0SDimitry Andric ErrorOr<Module *> 468239d628a0SDimitry Andric llvm::getLazyBitcodeModule(std::unique_ptr<MemoryBuffer> &&Buffer, 4683dff0c46cSDimitry Andric LLVMContext &Context, 4684ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4685ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 468639d628a0SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buffer), Context, false, 4687ff0cc061SDimitry Andric DiagnosticHandler, ShouldLazyLoadMetadata); 4688f22ef01cSRoman Divacky } 4689f22ef01cSRoman Divacky 469039d628a0SDimitry Andric ErrorOr<std::unique_ptr<Module>> 469139d628a0SDimitry Andric llvm::getStreamedBitcodeModule(StringRef Name, DataStreamer *Streamer, 469239d628a0SDimitry Andric LLVMContext &Context, 469339d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 469439d628a0SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 469539d628a0SDimitry Andric BitcodeReader *R = new BitcodeReader(Streamer, Context, DiagnosticHandler); 469639d628a0SDimitry Andric M->setMaterializer(R); 469739d628a0SDimitry Andric if (std::error_code EC = R->ParseBitcodeInto(M.get())) 469839d628a0SDimitry Andric return EC; 469939d628a0SDimitry Andric return std::move(M); 470039d628a0SDimitry Andric } 470139d628a0SDimitry Andric 470239d628a0SDimitry Andric ErrorOr<Module *> 470339d628a0SDimitry Andric llvm::parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, 470439d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 470539d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 470639d628a0SDimitry Andric ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModuleImpl( 470739d628a0SDimitry Andric std::move(Buf), Context, true, DiagnosticHandler); 470891bc56edSDimitry Andric if (!ModuleOrErr) 470991bc56edSDimitry Andric return ModuleOrErr; 471091bc56edSDimitry Andric Module *M = ModuleOrErr.get(); 4711f22ef01cSRoman Divacky // Read in the entire module, and destroy the BitcodeReader. 471239d628a0SDimitry Andric if (std::error_code EC = M->materializeAllPermanently()) { 4713f22ef01cSRoman Divacky delete M; 471491bc56edSDimitry Andric return EC; 4715f22ef01cSRoman Divacky } 47162754fe60SDimitry Andric 4717dff0c46cSDimitry Andric // TODO: Restore the use-lists to the in-memory state when the bitcode was 4718dff0c46cSDimitry Andric // written. We must defer until the Module has been fully materialized. 4719dff0c46cSDimitry Andric 4720f22ef01cSRoman Divacky return M; 4721f22ef01cSRoman Divacky } 47222754fe60SDimitry Andric 472339d628a0SDimitry Andric std::string 472439d628a0SDimitry Andric llvm::getBitcodeTargetTriple(MemoryBufferRef Buffer, LLVMContext &Context, 472539d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 472639d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 472739d628a0SDimitry Andric auto R = llvm::make_unique<BitcodeReader>(Buf.release(), Context, 472839d628a0SDimitry Andric DiagnosticHandler); 472991bc56edSDimitry Andric ErrorOr<std::string> Triple = R->parseTriple(); 473091bc56edSDimitry Andric if (Triple.getError()) 473191bc56edSDimitry Andric return ""; 473291bc56edSDimitry Andric return Triple.get(); 47332754fe60SDimitry Andric } 4734