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); } 6697bc6c73SDimitry Andric void push_back(Value *V) { ValuePtrs.emplace_back(V); } 67ff0cc061SDimitry Andric 68ff0cc061SDimitry Andric void clear() { 69ff0cc061SDimitry Andric assert(ResolveConstants.empty() && "Constants not resolved?"); 70ff0cc061SDimitry Andric ValuePtrs.clear(); 71ff0cc061SDimitry Andric } 72ff0cc061SDimitry Andric 73ff0cc061SDimitry Andric Value *operator[](unsigned i) const { 74ff0cc061SDimitry Andric assert(i < ValuePtrs.size()); 75ff0cc061SDimitry Andric return ValuePtrs[i]; 76ff0cc061SDimitry Andric } 77ff0cc061SDimitry Andric 78ff0cc061SDimitry Andric Value *back() const { return ValuePtrs.back(); } 79ff0cc061SDimitry Andric void pop_back() { ValuePtrs.pop_back(); } 80ff0cc061SDimitry Andric bool empty() const { return ValuePtrs.empty(); } 81ff0cc061SDimitry Andric void shrinkTo(unsigned N) { 82ff0cc061SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!"); 83ff0cc061SDimitry Andric ValuePtrs.resize(N); 84ff0cc061SDimitry Andric } 85ff0cc061SDimitry Andric 86ff0cc061SDimitry Andric Constant *getConstantFwdRef(unsigned Idx, Type *Ty); 87ff0cc061SDimitry Andric Value *getValueFwdRef(unsigned Idx, Type *Ty); 88ff0cc061SDimitry Andric 89ff0cc061SDimitry Andric void AssignValue(Value *V, unsigned Idx); 90ff0cc061SDimitry Andric 91ff0cc061SDimitry Andric /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 92ff0cc061SDimitry Andric /// resolves any forward references. 93ff0cc061SDimitry Andric void ResolveConstantForwardRefs(); 94ff0cc061SDimitry Andric }; 95ff0cc061SDimitry Andric 96ff0cc061SDimitry Andric class BitcodeReaderMDValueList { 97ff0cc061SDimitry Andric unsigned NumFwdRefs; 98ff0cc061SDimitry Andric bool AnyFwdRefs; 99ff0cc061SDimitry Andric unsigned MinFwdRef; 100ff0cc061SDimitry Andric unsigned MaxFwdRef; 101ff0cc061SDimitry Andric std::vector<TrackingMDRef> MDValuePtrs; 102ff0cc061SDimitry Andric 103ff0cc061SDimitry Andric LLVMContext &Context; 104ff0cc061SDimitry Andric public: 105ff0cc061SDimitry Andric BitcodeReaderMDValueList(LLVMContext &C) 106ff0cc061SDimitry Andric : NumFwdRefs(0), AnyFwdRefs(false), Context(C) {} 107ff0cc061SDimitry Andric 108ff0cc061SDimitry Andric // vector compatibility methods 109ff0cc061SDimitry Andric unsigned size() const { return MDValuePtrs.size(); } 110ff0cc061SDimitry Andric void resize(unsigned N) { MDValuePtrs.resize(N); } 111ff0cc061SDimitry Andric void push_back(Metadata *MD) { MDValuePtrs.emplace_back(MD); } 112ff0cc061SDimitry Andric void clear() { MDValuePtrs.clear(); } 113ff0cc061SDimitry Andric Metadata *back() const { return MDValuePtrs.back(); } 114ff0cc061SDimitry Andric void pop_back() { MDValuePtrs.pop_back(); } 115ff0cc061SDimitry Andric bool empty() const { return MDValuePtrs.empty(); } 116ff0cc061SDimitry Andric 117ff0cc061SDimitry Andric Metadata *operator[](unsigned i) const { 118ff0cc061SDimitry Andric assert(i < MDValuePtrs.size()); 119ff0cc061SDimitry Andric return MDValuePtrs[i]; 120ff0cc061SDimitry Andric } 121ff0cc061SDimitry Andric 122ff0cc061SDimitry Andric void shrinkTo(unsigned N) { 123ff0cc061SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!"); 124ff0cc061SDimitry Andric MDValuePtrs.resize(N); 125ff0cc061SDimitry Andric } 126ff0cc061SDimitry Andric 127ff0cc061SDimitry Andric Metadata *getValueFwdRef(unsigned Idx); 128ff0cc061SDimitry Andric void AssignValue(Metadata *MD, unsigned Idx); 129ff0cc061SDimitry Andric void tryToResolveCycles(); 130ff0cc061SDimitry Andric }; 131ff0cc061SDimitry Andric 132ff0cc061SDimitry Andric class BitcodeReader : public GVMaterializer { 133ff0cc061SDimitry Andric LLVMContext &Context; 134ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler; 135ff0cc061SDimitry Andric Module *TheModule; 136ff0cc061SDimitry Andric std::unique_ptr<MemoryBuffer> Buffer; 137ff0cc061SDimitry Andric std::unique_ptr<BitstreamReader> StreamFile; 138ff0cc061SDimitry Andric BitstreamCursor Stream; 139ff0cc061SDimitry Andric DataStreamer *LazyStreamer; 140ff0cc061SDimitry Andric uint64_t NextUnreadBit; 141ff0cc061SDimitry Andric bool SeenValueSymbolTable; 142ff0cc061SDimitry Andric 143ff0cc061SDimitry Andric std::vector<Type*> TypeList; 144ff0cc061SDimitry Andric BitcodeReaderValueList ValueList; 145ff0cc061SDimitry Andric BitcodeReaderMDValueList MDValueList; 146ff0cc061SDimitry Andric std::vector<Comdat *> ComdatList; 147ff0cc061SDimitry Andric SmallVector<Instruction *, 64> InstructionList; 148ff0cc061SDimitry Andric 149ff0cc061SDimitry Andric std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 150ff0cc061SDimitry Andric std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 151ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixes; 152ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologues; 153ff0cc061SDimitry Andric 154ff0cc061SDimitry Andric SmallVector<Instruction*, 64> InstsWithTBAATag; 155ff0cc061SDimitry Andric 156ff0cc061SDimitry Andric /// MAttributes - The set of attributes by index. Index zero in the 157ff0cc061SDimitry Andric /// file is for null, and is thus not represented here. As such all indices 158ff0cc061SDimitry Andric /// are off by one. 159ff0cc061SDimitry Andric std::vector<AttributeSet> MAttributes; 160ff0cc061SDimitry Andric 161ff0cc061SDimitry Andric /// \brief The set of attribute groups. 162ff0cc061SDimitry Andric std::map<unsigned, AttributeSet> MAttributeGroups; 163ff0cc061SDimitry Andric 164ff0cc061SDimitry Andric /// FunctionBBs - While parsing a function body, this is a list of the basic 165ff0cc061SDimitry Andric /// blocks for the function. 166ff0cc061SDimitry Andric std::vector<BasicBlock*> FunctionBBs; 167ff0cc061SDimitry Andric 168ff0cc061SDimitry Andric // When reading the module header, this list is populated with functions that 169ff0cc061SDimitry Andric // have bodies later in the file. 170ff0cc061SDimitry Andric std::vector<Function*> FunctionsWithBodies; 171ff0cc061SDimitry Andric 172ff0cc061SDimitry Andric // When intrinsic functions are encountered which require upgrading they are 173ff0cc061SDimitry Andric // stored here with their replacement function. 174ff0cc061SDimitry Andric typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 175ff0cc061SDimitry Andric UpgradedIntrinsicMap UpgradedIntrinsics; 176ff0cc061SDimitry Andric 177ff0cc061SDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 178ff0cc061SDimitry Andric DenseMap<unsigned, unsigned> MDKindMap; 179ff0cc061SDimitry Andric 180ff0cc061SDimitry Andric // Several operations happen after the module header has been read, but 181ff0cc061SDimitry Andric // before function bodies are processed. This keeps track of whether 182ff0cc061SDimitry Andric // we've done this yet. 183ff0cc061SDimitry Andric bool SeenFirstFunctionBody; 184ff0cc061SDimitry Andric 185ff0cc061SDimitry Andric /// DeferredFunctionInfo - When function bodies are initially scanned, this 186ff0cc061SDimitry Andric /// map contains info about where to find deferred function body in the 187ff0cc061SDimitry Andric /// stream. 188ff0cc061SDimitry Andric DenseMap<Function*, uint64_t> DeferredFunctionInfo; 189ff0cc061SDimitry Andric 190ff0cc061SDimitry Andric /// When Metadata block is initially scanned when parsing the module, we may 191ff0cc061SDimitry Andric /// choose to defer parsing of the metadata. This vector contains info about 192ff0cc061SDimitry Andric /// which Metadata blocks are deferred. 193ff0cc061SDimitry Andric std::vector<uint64_t> DeferredMetadataInfo; 194ff0cc061SDimitry Andric 195ff0cc061SDimitry Andric /// These are basic blocks forward-referenced by block addresses. They are 196ff0cc061SDimitry Andric /// inserted lazily into functions when they're loaded. The basic block ID is 197ff0cc061SDimitry Andric /// its index into the vector. 198ff0cc061SDimitry Andric DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs; 199ff0cc061SDimitry Andric std::deque<Function *> BasicBlockFwdRefQueue; 200ff0cc061SDimitry Andric 201ff0cc061SDimitry Andric /// UseRelativeIDs - Indicates that we are using a new encoding for 202ff0cc061SDimitry Andric /// instruction operands where most operands in the current 203ff0cc061SDimitry Andric /// FUNCTION_BLOCK are encoded relative to the instruction number, 204ff0cc061SDimitry Andric /// for a more compact encoding. Some instruction operands are not 205ff0cc061SDimitry Andric /// relative to the instruction ID: basic block numbers, and types. 206ff0cc061SDimitry Andric /// Once the old style function blocks have been phased out, we would 207ff0cc061SDimitry Andric /// not need this flag. 208ff0cc061SDimitry Andric bool UseRelativeIDs; 209ff0cc061SDimitry Andric 210ff0cc061SDimitry Andric /// True if all functions will be materialized, negating the need to process 211ff0cc061SDimitry Andric /// (e.g.) blockaddress forward references. 212ff0cc061SDimitry Andric bool WillMaterializeAllForwardRefs; 213ff0cc061SDimitry Andric 214ff0cc061SDimitry Andric /// Functions that have block addresses taken. This is usually empty. 215ff0cc061SDimitry Andric SmallPtrSet<const Function *, 4> BlockAddressesTaken; 216ff0cc061SDimitry Andric 217ff0cc061SDimitry Andric /// True if any Metadata block has been materialized. 218ff0cc061SDimitry Andric bool IsMetadataMaterialized; 219ff0cc061SDimitry Andric 220ff0cc061SDimitry Andric bool StripDebugInfo = false; 221ff0cc061SDimitry Andric 222ff0cc061SDimitry Andric public: 223ff0cc061SDimitry Andric std::error_code Error(BitcodeError E, const Twine &Message); 224ff0cc061SDimitry Andric std::error_code Error(BitcodeError E); 225ff0cc061SDimitry Andric std::error_code Error(const Twine &Message); 226ff0cc061SDimitry Andric 227ff0cc061SDimitry Andric explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C, 228ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 229ff0cc061SDimitry Andric explicit BitcodeReader(DataStreamer *streamer, LLVMContext &C, 230ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 231ff0cc061SDimitry Andric ~BitcodeReader() override { FreeState(); } 232ff0cc061SDimitry Andric 233ff0cc061SDimitry Andric std::error_code materializeForwardReferencedFunctions(); 234ff0cc061SDimitry Andric 235ff0cc061SDimitry Andric void FreeState(); 236ff0cc061SDimitry Andric 237ff0cc061SDimitry Andric void releaseBuffer(); 238ff0cc061SDimitry Andric 239ff0cc061SDimitry Andric bool isDematerializable(const GlobalValue *GV) const override; 240ff0cc061SDimitry Andric std::error_code materialize(GlobalValue *GV) override; 241ff0cc061SDimitry Andric std::error_code materializeModule(Module *M) override; 242ff0cc061SDimitry Andric std::vector<StructType *> getIdentifiedStructTypes() const override; 243ff0cc061SDimitry Andric void dematerialize(GlobalValue *GV) override; 244ff0cc061SDimitry Andric 245ff0cc061SDimitry Andric /// @brief Main interface to parsing a bitcode buffer. 246ff0cc061SDimitry Andric /// @returns true if an error occurred. 247ff0cc061SDimitry Andric std::error_code ParseBitcodeInto(Module *M, 248ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false); 249ff0cc061SDimitry Andric 250ff0cc061SDimitry Andric /// @brief Cheap mechanism to just extract module triple 251ff0cc061SDimitry Andric /// @returns true if an error occurred. 252ff0cc061SDimitry Andric ErrorOr<std::string> parseTriple(); 253ff0cc061SDimitry Andric 254ff0cc061SDimitry Andric static uint64_t decodeSignRotatedValue(uint64_t V); 255ff0cc061SDimitry Andric 256ff0cc061SDimitry Andric /// Materialize any deferred Metadata block. 257ff0cc061SDimitry Andric std::error_code materializeMetadata() override; 258ff0cc061SDimitry Andric 259ff0cc061SDimitry Andric void setStripDebugInfo() override; 260ff0cc061SDimitry Andric 261ff0cc061SDimitry Andric private: 262ff0cc061SDimitry Andric std::vector<StructType *> IdentifiedStructTypes; 263ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name); 264ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context); 265ff0cc061SDimitry Andric 266ff0cc061SDimitry Andric Type *getTypeByID(unsigned ID); 267ff0cc061SDimitry Andric Value *getFnValueByID(unsigned ID, Type *Ty) { 268ff0cc061SDimitry Andric if (Ty && Ty->isMetadataTy()) 269ff0cc061SDimitry Andric return MetadataAsValue::get(Ty->getContext(), getFnMetadataByID(ID)); 270ff0cc061SDimitry Andric return ValueList.getValueFwdRef(ID, Ty); 271ff0cc061SDimitry Andric } 272ff0cc061SDimitry Andric Metadata *getFnMetadataByID(unsigned ID) { 273ff0cc061SDimitry Andric return MDValueList.getValueFwdRef(ID); 274ff0cc061SDimitry Andric } 275ff0cc061SDimitry Andric BasicBlock *getBasicBlock(unsigned ID) const { 276ff0cc061SDimitry Andric if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID 277ff0cc061SDimitry Andric return FunctionBBs[ID]; 278ff0cc061SDimitry Andric } 279ff0cc061SDimitry Andric AttributeSet getAttributes(unsigned i) const { 280ff0cc061SDimitry Andric if (i-1 < MAttributes.size()) 281ff0cc061SDimitry Andric return MAttributes[i-1]; 282ff0cc061SDimitry Andric return AttributeSet(); 283ff0cc061SDimitry Andric } 284ff0cc061SDimitry Andric 285ff0cc061SDimitry Andric /// getValueTypePair - Read a value/type pair out of the specified record from 286ff0cc061SDimitry Andric /// slot 'Slot'. Increment Slot past the number of slots used in the record. 287ff0cc061SDimitry Andric /// Return true on failure. 288ff0cc061SDimitry Andric bool getValueTypePair(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 289ff0cc061SDimitry Andric unsigned InstNum, Value *&ResVal) { 290ff0cc061SDimitry Andric if (Slot == Record.size()) return true; 291ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot++]; 292ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 293ff0cc061SDimitry Andric if (UseRelativeIDs) 294ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 295ff0cc061SDimitry Andric if (ValNo < InstNum) { 296ff0cc061SDimitry Andric // If this is not a forward reference, just return the value we already 297ff0cc061SDimitry Andric // have. 298ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, nullptr); 299ff0cc061SDimitry Andric return ResVal == nullptr; 300ff0cc061SDimitry Andric } 301ff0cc061SDimitry Andric if (Slot == Record.size()) 302ff0cc061SDimitry Andric return true; 303ff0cc061SDimitry Andric 304ff0cc061SDimitry Andric unsigned TypeNo = (unsigned)Record[Slot++]; 305ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 306ff0cc061SDimitry Andric return ResVal == nullptr; 307ff0cc061SDimitry Andric } 308ff0cc061SDimitry Andric 309ff0cc061SDimitry Andric /// popValue - Read a value out of the specified record from slot 'Slot'. 310ff0cc061SDimitry Andric /// Increment Slot past the number of slots used by the value in the record. 311ff0cc061SDimitry Andric /// Return true if there is an error. 312ff0cc061SDimitry Andric bool popValue(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 313ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 314ff0cc061SDimitry Andric if (getValue(Record, Slot, InstNum, Ty, ResVal)) 315ff0cc061SDimitry Andric return true; 316ff0cc061SDimitry Andric // All values currently take a single record slot. 317ff0cc061SDimitry Andric ++Slot; 318ff0cc061SDimitry Andric return false; 319ff0cc061SDimitry Andric } 320ff0cc061SDimitry Andric 321ff0cc061SDimitry Andric /// getValue -- Like popValue, but does not increment the Slot number. 322ff0cc061SDimitry Andric bool getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 323ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 324ff0cc061SDimitry Andric ResVal = getValue(Record, Slot, InstNum, Ty); 325ff0cc061SDimitry Andric return ResVal == nullptr; 326ff0cc061SDimitry Andric } 327ff0cc061SDimitry Andric 328ff0cc061SDimitry Andric /// getValue -- Version of getValue that returns ResVal directly, 329ff0cc061SDimitry Andric /// or 0 if there is an error. 330ff0cc061SDimitry Andric Value *getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 331ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 332ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 333ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot]; 334ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 335ff0cc061SDimitry Andric if (UseRelativeIDs) 336ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 337ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 338ff0cc061SDimitry Andric } 339ff0cc061SDimitry Andric 340ff0cc061SDimitry Andric /// getValueSigned -- Like getValue, but decodes signed VBRs. 341ff0cc061SDimitry Andric Value *getValueSigned(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 342ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 343ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 344ff0cc061SDimitry Andric unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]); 345ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 346ff0cc061SDimitry Andric if (UseRelativeIDs) 347ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 348ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 349ff0cc061SDimitry Andric } 350ff0cc061SDimitry Andric 351ff0cc061SDimitry Andric /// Converts alignment exponent (i.e. power of two (or zero)) to the 352ff0cc061SDimitry Andric /// corresponding alignment to use. If alignment is too large, returns 353ff0cc061SDimitry Andric /// a corresponding error code. 354ff0cc061SDimitry Andric std::error_code parseAlignmentValue(uint64_t Exponent, unsigned &Alignment); 355ff0cc061SDimitry Andric std::error_code ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); 356ff0cc061SDimitry Andric std::error_code ParseModule(bool Resume, bool ShouldLazyLoadMetadata = false); 357ff0cc061SDimitry Andric std::error_code ParseAttributeBlock(); 358ff0cc061SDimitry Andric std::error_code ParseAttributeGroupBlock(); 359ff0cc061SDimitry Andric std::error_code ParseTypeTable(); 360ff0cc061SDimitry Andric std::error_code ParseTypeTableBody(); 361ff0cc061SDimitry Andric 362ff0cc061SDimitry Andric std::error_code ParseValueSymbolTable(); 363ff0cc061SDimitry Andric std::error_code ParseConstants(); 364ff0cc061SDimitry Andric std::error_code RememberAndSkipFunctionBody(); 365ff0cc061SDimitry Andric /// Save the positions of the Metadata blocks and skip parsing the blocks. 366ff0cc061SDimitry Andric std::error_code rememberAndSkipMetadata(); 367ff0cc061SDimitry Andric std::error_code ParseFunctionBody(Function *F); 368ff0cc061SDimitry Andric std::error_code GlobalCleanup(); 369ff0cc061SDimitry Andric std::error_code ResolveGlobalAndAliasInits(); 370ff0cc061SDimitry Andric std::error_code ParseMetadata(); 371ff0cc061SDimitry Andric std::error_code ParseMetadataAttachment(Function &F); 372ff0cc061SDimitry Andric ErrorOr<std::string> parseModuleTriple(); 373ff0cc061SDimitry Andric std::error_code ParseUseLists(); 374ff0cc061SDimitry Andric std::error_code InitStream(); 375ff0cc061SDimitry Andric std::error_code InitStreamFromBuffer(); 376ff0cc061SDimitry Andric std::error_code InitLazyStream(); 377ff0cc061SDimitry Andric std::error_code FindFunctionInStream( 378ff0cc061SDimitry Andric Function *F, 379ff0cc061SDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator); 380ff0cc061SDimitry Andric }; 381ff0cc061SDimitry Andric } // namespace 382ff0cc061SDimitry Andric 38339d628a0SDimitry Andric BitcodeDiagnosticInfo::BitcodeDiagnosticInfo(std::error_code EC, 38439d628a0SDimitry Andric DiagnosticSeverity Severity, 38539d628a0SDimitry Andric const Twine &Msg) 38639d628a0SDimitry Andric : DiagnosticInfo(DK_Bitcode, Severity), Msg(Msg), EC(EC) {} 38739d628a0SDimitry Andric 38839d628a0SDimitry Andric void BitcodeDiagnosticInfo::print(DiagnosticPrinter &DP) const { DP << Msg; } 38939d628a0SDimitry Andric 39039d628a0SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 39139d628a0SDimitry Andric std::error_code EC, const Twine &Message) { 39239d628a0SDimitry Andric BitcodeDiagnosticInfo DI(EC, DS_Error, Message); 39339d628a0SDimitry Andric DiagnosticHandler(DI); 39439d628a0SDimitry Andric return EC; 395dff0c46cSDimitry Andric } 39639d628a0SDimitry Andric 39739d628a0SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 39839d628a0SDimitry Andric std::error_code EC) { 39939d628a0SDimitry Andric return Error(DiagnosticHandler, EC, EC.message()); 40039d628a0SDimitry Andric } 40139d628a0SDimitry Andric 402ff0cc061SDimitry Andric static std::error_code Error(DiagnosticHandlerFunction DiagnosticHandler, 403ff0cc061SDimitry Andric const Twine &Message) { 404ff0cc061SDimitry Andric return Error(DiagnosticHandler, 405ff0cc061SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 406ff0cc061SDimitry Andric } 407ff0cc061SDimitry Andric 40839d628a0SDimitry Andric std::error_code BitcodeReader::Error(BitcodeError E, const Twine &Message) { 40939d628a0SDimitry Andric return ::Error(DiagnosticHandler, make_error_code(E), Message); 41039d628a0SDimitry Andric } 41139d628a0SDimitry Andric 41239d628a0SDimitry Andric std::error_code BitcodeReader::Error(const Twine &Message) { 41339d628a0SDimitry Andric return ::Error(DiagnosticHandler, 41439d628a0SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 41539d628a0SDimitry Andric } 41639d628a0SDimitry Andric 41739d628a0SDimitry Andric std::error_code BitcodeReader::Error(BitcodeError E) { 41839d628a0SDimitry Andric return ::Error(DiagnosticHandler, make_error_code(E)); 41939d628a0SDimitry Andric } 42039d628a0SDimitry Andric 42139d628a0SDimitry Andric static DiagnosticHandlerFunction getDiagHandler(DiagnosticHandlerFunction F, 42239d628a0SDimitry Andric LLVMContext &C) { 42339d628a0SDimitry Andric if (F) 42439d628a0SDimitry Andric return F; 42539d628a0SDimitry Andric return [&C](const DiagnosticInfo &DI) { C.diagnose(DI); }; 42639d628a0SDimitry Andric } 42739d628a0SDimitry Andric 42839d628a0SDimitry Andric BitcodeReader::BitcodeReader(MemoryBuffer *buffer, LLVMContext &C, 42939d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 43039d628a0SDimitry Andric : Context(C), DiagnosticHandler(getDiagHandler(DiagnosticHandler, C)), 43139d628a0SDimitry Andric TheModule(nullptr), Buffer(buffer), LazyStreamer(nullptr), 43239d628a0SDimitry Andric NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), 43339d628a0SDimitry Andric MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false), 434ff0cc061SDimitry Andric WillMaterializeAllForwardRefs(false), IsMetadataMaterialized(false) {} 43539d628a0SDimitry Andric 43639d628a0SDimitry Andric BitcodeReader::BitcodeReader(DataStreamer *streamer, LLVMContext &C, 43739d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 43839d628a0SDimitry Andric : Context(C), DiagnosticHandler(getDiagHandler(DiagnosticHandler, C)), 43939d628a0SDimitry Andric TheModule(nullptr), Buffer(nullptr), LazyStreamer(streamer), 44039d628a0SDimitry Andric NextUnreadBit(0), SeenValueSymbolTable(false), ValueList(C), 44139d628a0SDimitry Andric MDValueList(C), SeenFirstFunctionBody(false), UseRelativeIDs(false), 442ff0cc061SDimitry Andric WillMaterializeAllForwardRefs(false), IsMetadataMaterialized(false) {} 44339d628a0SDimitry Andric 44439d628a0SDimitry Andric std::error_code BitcodeReader::materializeForwardReferencedFunctions() { 44539d628a0SDimitry Andric if (WillMaterializeAllForwardRefs) 44639d628a0SDimitry Andric return std::error_code(); 44739d628a0SDimitry Andric 44839d628a0SDimitry Andric // Prevent recursion. 44939d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 45039d628a0SDimitry Andric 45139d628a0SDimitry Andric while (!BasicBlockFwdRefQueue.empty()) { 45239d628a0SDimitry Andric Function *F = BasicBlockFwdRefQueue.front(); 45339d628a0SDimitry Andric BasicBlockFwdRefQueue.pop_front(); 45439d628a0SDimitry Andric assert(F && "Expected valid function"); 45539d628a0SDimitry Andric if (!BasicBlockFwdRefs.count(F)) 45639d628a0SDimitry Andric // Already materialized. 45739d628a0SDimitry Andric continue; 45839d628a0SDimitry Andric 45939d628a0SDimitry Andric // Check for a function that isn't materializable to prevent an infinite 46039d628a0SDimitry Andric // loop. When parsing a blockaddress stored in a global variable, there 46139d628a0SDimitry Andric // isn't a trivial way to check if a function will have a body without a 46239d628a0SDimitry Andric // linear search through FunctionsWithBodies, so just check it here. 46339d628a0SDimitry Andric if (!F->isMaterializable()) 46439d628a0SDimitry Andric return Error("Never resolved function from blockaddress"); 46539d628a0SDimitry Andric 46639d628a0SDimitry Andric // Try to materialize F. 46739d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 46839d628a0SDimitry Andric return EC; 46939d628a0SDimitry Andric } 47039d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Function missing from queue"); 47139d628a0SDimitry Andric 47239d628a0SDimitry Andric // Reset state. 47339d628a0SDimitry Andric WillMaterializeAllForwardRefs = false; 47439d628a0SDimitry Andric return std::error_code(); 475dff0c46cSDimitry Andric } 476dff0c46cSDimitry Andric 477f22ef01cSRoman Divacky void BitcodeReader::FreeState() { 47891bc56edSDimitry Andric Buffer = nullptr; 47917a519f9SDimitry Andric std::vector<Type*>().swap(TypeList); 480f22ef01cSRoman Divacky ValueList.clear(); 481f22ef01cSRoman Divacky MDValueList.clear(); 48291bc56edSDimitry Andric std::vector<Comdat *>().swap(ComdatList); 483f22ef01cSRoman Divacky 484139f7f9bSDimitry Andric std::vector<AttributeSet>().swap(MAttributes); 485f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 486f22ef01cSRoman Divacky std::vector<Function*>().swap(FunctionsWithBodies); 487f22ef01cSRoman Divacky DeferredFunctionInfo.clear(); 488ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 489e580952dSDimitry Andric MDKindMap.clear(); 4903861d79fSDimitry Andric 49139d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Unresolved blockaddress fwd references"); 49239d628a0SDimitry Andric BasicBlockFwdRefQueue.clear(); 493f22ef01cSRoman Divacky } 494f22ef01cSRoman Divacky 495f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 496f22ef01cSRoman Divacky // Helper functions to implement forward reference resolution, etc. 497f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 498f22ef01cSRoman Divacky 499f22ef01cSRoman Divacky /// ConvertToString - Convert a string from a record into an std::string, return 500f22ef01cSRoman Divacky /// true on failure. 501f22ef01cSRoman Divacky template<typename StrTy> 5027ae0e2c9SDimitry Andric static bool ConvertToString(ArrayRef<uint64_t> Record, unsigned Idx, 503f22ef01cSRoman Divacky StrTy &Result) { 504f22ef01cSRoman Divacky if (Idx > Record.size()) 505f22ef01cSRoman Divacky return true; 506f22ef01cSRoman Divacky 507f22ef01cSRoman Divacky for (unsigned i = Idx, e = Record.size(); i != e; ++i) 508f22ef01cSRoman Divacky Result += (char)Record[i]; 509f22ef01cSRoman Divacky return false; 510f22ef01cSRoman Divacky } 511f22ef01cSRoman Divacky 512ff0cc061SDimitry Andric static bool hasImplicitComdat(size_t Val) { 513ff0cc061SDimitry Andric switch (Val) { 514ff0cc061SDimitry Andric default: 515ff0cc061SDimitry Andric return false; 516ff0cc061SDimitry Andric case 1: // Old WeakAnyLinkage 517ff0cc061SDimitry Andric case 4: // Old LinkOnceAnyLinkage 518ff0cc061SDimitry Andric case 10: // Old WeakODRLinkage 519ff0cc061SDimitry Andric case 11: // Old LinkOnceODRLinkage 520ff0cc061SDimitry Andric return true; 521ff0cc061SDimitry Andric } 522ff0cc061SDimitry Andric } 523ff0cc061SDimitry Andric 52439d628a0SDimitry Andric static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val) { 525f22ef01cSRoman Divacky switch (Val) { 526f22ef01cSRoman Divacky default: // Map unknown/new linkages to external 52739d628a0SDimitry Andric case 0: 52839d628a0SDimitry Andric return GlobalValue::ExternalLinkage; 52939d628a0SDimitry Andric case 2: 53039d628a0SDimitry Andric return GlobalValue::AppendingLinkage; 53139d628a0SDimitry Andric case 3: 53239d628a0SDimitry Andric return GlobalValue::InternalLinkage; 53339d628a0SDimitry Andric case 5: 53439d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLImportLinkage 53539d628a0SDimitry Andric case 6: 53639d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLExportLinkage 53739d628a0SDimitry Andric case 7: 53839d628a0SDimitry Andric return GlobalValue::ExternalWeakLinkage; 53939d628a0SDimitry Andric case 8: 54039d628a0SDimitry Andric return GlobalValue::CommonLinkage; 54139d628a0SDimitry Andric case 9: 54239d628a0SDimitry Andric return GlobalValue::PrivateLinkage; 54339d628a0SDimitry Andric case 12: 54439d628a0SDimitry Andric return GlobalValue::AvailableExternallyLinkage; 54591bc56edSDimitry Andric case 13: 54691bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateLinkage 54791bc56edSDimitry Andric case 14: 54891bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateWeakLinkage 54939d628a0SDimitry Andric case 15: 55039d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete LinkOnceODRAutoHideLinkage 551ff0cc061SDimitry Andric case 1: // Old value with implicit comdat. 552ff0cc061SDimitry Andric case 16: 553ff0cc061SDimitry Andric return GlobalValue::WeakAnyLinkage; 554ff0cc061SDimitry Andric case 10: // Old value with implicit comdat. 555ff0cc061SDimitry Andric case 17: 556ff0cc061SDimitry Andric return GlobalValue::WeakODRLinkage; 557ff0cc061SDimitry Andric case 4: // Old value with implicit comdat. 558ff0cc061SDimitry Andric case 18: 559ff0cc061SDimitry Andric return GlobalValue::LinkOnceAnyLinkage; 560ff0cc061SDimitry Andric case 11: // Old value with implicit comdat. 561ff0cc061SDimitry Andric case 19: 562ff0cc061SDimitry Andric return GlobalValue::LinkOnceODRLinkage; 563f22ef01cSRoman Divacky } 564f22ef01cSRoman Divacky } 565f22ef01cSRoman Divacky 566f22ef01cSRoman Divacky static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) { 567f22ef01cSRoman Divacky switch (Val) { 568f22ef01cSRoman Divacky default: // Map unknown visibilities to default. 569f22ef01cSRoman Divacky case 0: return GlobalValue::DefaultVisibility; 570f22ef01cSRoman Divacky case 1: return GlobalValue::HiddenVisibility; 571f22ef01cSRoman Divacky case 2: return GlobalValue::ProtectedVisibility; 572f22ef01cSRoman Divacky } 573f22ef01cSRoman Divacky } 574f22ef01cSRoman Divacky 57591bc56edSDimitry Andric static GlobalValue::DLLStorageClassTypes 57691bc56edSDimitry Andric GetDecodedDLLStorageClass(unsigned Val) { 57791bc56edSDimitry Andric switch (Val) { 57891bc56edSDimitry Andric default: // Map unknown values to default. 57991bc56edSDimitry Andric case 0: return GlobalValue::DefaultStorageClass; 58091bc56edSDimitry Andric case 1: return GlobalValue::DLLImportStorageClass; 58191bc56edSDimitry Andric case 2: return GlobalValue::DLLExportStorageClass; 58291bc56edSDimitry Andric } 58391bc56edSDimitry Andric } 58491bc56edSDimitry Andric 5857ae0e2c9SDimitry Andric static GlobalVariable::ThreadLocalMode GetDecodedThreadLocalMode(unsigned Val) { 5867ae0e2c9SDimitry Andric switch (Val) { 5877ae0e2c9SDimitry Andric case 0: return GlobalVariable::NotThreadLocal; 5887ae0e2c9SDimitry Andric default: // Map unknown non-zero value to general dynamic. 5897ae0e2c9SDimitry Andric case 1: return GlobalVariable::GeneralDynamicTLSModel; 5907ae0e2c9SDimitry Andric case 2: return GlobalVariable::LocalDynamicTLSModel; 5917ae0e2c9SDimitry Andric case 3: return GlobalVariable::InitialExecTLSModel; 5927ae0e2c9SDimitry Andric case 4: return GlobalVariable::LocalExecTLSModel; 5937ae0e2c9SDimitry Andric } 5947ae0e2c9SDimitry Andric } 5957ae0e2c9SDimitry Andric 596f22ef01cSRoman Divacky static int GetDecodedCastOpcode(unsigned Val) { 597f22ef01cSRoman Divacky switch (Val) { 598f22ef01cSRoman Divacky default: return -1; 599f22ef01cSRoman Divacky case bitc::CAST_TRUNC : return Instruction::Trunc; 600f22ef01cSRoman Divacky case bitc::CAST_ZEXT : return Instruction::ZExt; 601f22ef01cSRoman Divacky case bitc::CAST_SEXT : return Instruction::SExt; 602f22ef01cSRoman Divacky case bitc::CAST_FPTOUI : return Instruction::FPToUI; 603f22ef01cSRoman Divacky case bitc::CAST_FPTOSI : return Instruction::FPToSI; 604f22ef01cSRoman Divacky case bitc::CAST_UITOFP : return Instruction::UIToFP; 605f22ef01cSRoman Divacky case bitc::CAST_SITOFP : return Instruction::SIToFP; 606f22ef01cSRoman Divacky case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; 607f22ef01cSRoman Divacky case bitc::CAST_FPEXT : return Instruction::FPExt; 608f22ef01cSRoman Divacky case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; 609f22ef01cSRoman Divacky case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; 610f22ef01cSRoman Divacky case bitc::CAST_BITCAST : return Instruction::BitCast; 611f785676fSDimitry Andric case bitc::CAST_ADDRSPACECAST: return Instruction::AddrSpaceCast; 612f22ef01cSRoman Divacky } 613f22ef01cSRoman Divacky } 614ff0cc061SDimitry Andric 6156122f3e6SDimitry Andric static int GetDecodedBinaryOpcode(unsigned Val, Type *Ty) { 616ff0cc061SDimitry Andric bool IsFP = Ty->isFPOrFPVectorTy(); 617ff0cc061SDimitry Andric // BinOps are only valid for int/fp or vector of int/fp types 618ff0cc061SDimitry Andric if (!IsFP && !Ty->isIntOrIntVectorTy()) 619ff0cc061SDimitry Andric return -1; 620ff0cc061SDimitry Andric 621f22ef01cSRoman Divacky switch (Val) { 622ff0cc061SDimitry Andric default: 623ff0cc061SDimitry Andric return -1; 624f22ef01cSRoman Divacky case bitc::BINOP_ADD: 625ff0cc061SDimitry Andric return IsFP ? Instruction::FAdd : Instruction::Add; 626f22ef01cSRoman Divacky case bitc::BINOP_SUB: 627ff0cc061SDimitry Andric return IsFP ? Instruction::FSub : Instruction::Sub; 628f22ef01cSRoman Divacky case bitc::BINOP_MUL: 629ff0cc061SDimitry Andric return IsFP ? Instruction::FMul : Instruction::Mul; 630ff0cc061SDimitry Andric case bitc::BINOP_UDIV: 631ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::UDiv; 632f22ef01cSRoman Divacky case bitc::BINOP_SDIV: 633ff0cc061SDimitry Andric return IsFP ? Instruction::FDiv : Instruction::SDiv; 634ff0cc061SDimitry Andric case bitc::BINOP_UREM: 635ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::URem; 636f22ef01cSRoman Divacky case bitc::BINOP_SREM: 637ff0cc061SDimitry Andric return IsFP ? Instruction::FRem : Instruction::SRem; 638ff0cc061SDimitry Andric case bitc::BINOP_SHL: 639ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Shl; 640ff0cc061SDimitry Andric case bitc::BINOP_LSHR: 641ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::LShr; 642ff0cc061SDimitry Andric case bitc::BINOP_ASHR: 643ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::AShr; 644ff0cc061SDimitry Andric case bitc::BINOP_AND: 645ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::And; 646ff0cc061SDimitry Andric case bitc::BINOP_OR: 647ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Or; 648ff0cc061SDimitry Andric case bitc::BINOP_XOR: 649ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Xor; 650f22ef01cSRoman Divacky } 651f22ef01cSRoman Divacky } 652f22ef01cSRoman Divacky 6536122f3e6SDimitry Andric static AtomicRMWInst::BinOp GetDecodedRMWOperation(unsigned Val) { 6546122f3e6SDimitry Andric switch (Val) { 6556122f3e6SDimitry Andric default: return AtomicRMWInst::BAD_BINOP; 6566122f3e6SDimitry Andric case bitc::RMW_XCHG: return AtomicRMWInst::Xchg; 6576122f3e6SDimitry Andric case bitc::RMW_ADD: return AtomicRMWInst::Add; 6586122f3e6SDimitry Andric case bitc::RMW_SUB: return AtomicRMWInst::Sub; 6596122f3e6SDimitry Andric case bitc::RMW_AND: return AtomicRMWInst::And; 6606122f3e6SDimitry Andric case bitc::RMW_NAND: return AtomicRMWInst::Nand; 6616122f3e6SDimitry Andric case bitc::RMW_OR: return AtomicRMWInst::Or; 6626122f3e6SDimitry Andric case bitc::RMW_XOR: return AtomicRMWInst::Xor; 6636122f3e6SDimitry Andric case bitc::RMW_MAX: return AtomicRMWInst::Max; 6646122f3e6SDimitry Andric case bitc::RMW_MIN: return AtomicRMWInst::Min; 6656122f3e6SDimitry Andric case bitc::RMW_UMAX: return AtomicRMWInst::UMax; 6666122f3e6SDimitry Andric case bitc::RMW_UMIN: return AtomicRMWInst::UMin; 6676122f3e6SDimitry Andric } 6686122f3e6SDimitry Andric } 6696122f3e6SDimitry Andric 6706122f3e6SDimitry Andric static AtomicOrdering GetDecodedOrdering(unsigned Val) { 6716122f3e6SDimitry Andric switch (Val) { 6726122f3e6SDimitry Andric case bitc::ORDERING_NOTATOMIC: return NotAtomic; 6736122f3e6SDimitry Andric case bitc::ORDERING_UNORDERED: return Unordered; 6746122f3e6SDimitry Andric case bitc::ORDERING_MONOTONIC: return Monotonic; 6756122f3e6SDimitry Andric case bitc::ORDERING_ACQUIRE: return Acquire; 6766122f3e6SDimitry Andric case bitc::ORDERING_RELEASE: return Release; 6776122f3e6SDimitry Andric case bitc::ORDERING_ACQREL: return AcquireRelease; 6786122f3e6SDimitry Andric default: // Map unknown orderings to sequentially-consistent. 6796122f3e6SDimitry Andric case bitc::ORDERING_SEQCST: return SequentiallyConsistent; 6806122f3e6SDimitry Andric } 6816122f3e6SDimitry Andric } 6826122f3e6SDimitry Andric 6836122f3e6SDimitry Andric static SynchronizationScope GetDecodedSynchScope(unsigned Val) { 6846122f3e6SDimitry Andric switch (Val) { 6856122f3e6SDimitry Andric case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; 6866122f3e6SDimitry Andric default: // Map unknown scopes to cross-thread. 6876122f3e6SDimitry Andric case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; 6886122f3e6SDimitry Andric } 6896122f3e6SDimitry Andric } 6906122f3e6SDimitry Andric 69191bc56edSDimitry Andric static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) { 69291bc56edSDimitry Andric switch (Val) { 69391bc56edSDimitry Andric default: // Map unknown selection kinds to any. 69491bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_ANY: 69591bc56edSDimitry Andric return Comdat::Any; 69691bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_EXACT_MATCH: 69791bc56edSDimitry Andric return Comdat::ExactMatch; 69891bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_LARGEST: 69991bc56edSDimitry Andric return Comdat::Largest; 70091bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES: 70191bc56edSDimitry Andric return Comdat::NoDuplicates; 70291bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_SAME_SIZE: 70391bc56edSDimitry Andric return Comdat::SameSize; 70491bc56edSDimitry Andric } 70591bc56edSDimitry Andric } 70691bc56edSDimitry Andric 70791bc56edSDimitry Andric static void UpgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) { 70891bc56edSDimitry Andric switch (Val) { 70991bc56edSDimitry Andric case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; 71091bc56edSDimitry Andric case 6: GV->setDLLStorageClass(GlobalValue::DLLExportStorageClass); break; 71191bc56edSDimitry Andric } 71291bc56edSDimitry Andric } 71391bc56edSDimitry Andric 714f22ef01cSRoman Divacky namespace llvm { 715f22ef01cSRoman Divacky namespace { 716f22ef01cSRoman Divacky /// @brief A class for maintaining the slot number definition 717f22ef01cSRoman Divacky /// as a placeholder for the actual definition for forward constants defs. 718f22ef01cSRoman Divacky class ConstantPlaceHolder : public ConstantExpr { 719ff0cc061SDimitry Andric void operator=(const ConstantPlaceHolder &) = delete; 720f22ef01cSRoman Divacky public: 721f22ef01cSRoman Divacky // allocate space for exactly one operand 722f22ef01cSRoman Divacky void *operator new(size_t s) { 723f22ef01cSRoman Divacky return User::operator new(s, 1); 724f22ef01cSRoman Divacky } 7256122f3e6SDimitry Andric explicit ConstantPlaceHolder(Type *Ty, LLVMContext& Context) 726f22ef01cSRoman Divacky : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { 727f22ef01cSRoman Divacky Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); 728f22ef01cSRoman Divacky } 729f22ef01cSRoman Divacky 730f22ef01cSRoman Divacky /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. 731f22ef01cSRoman Divacky static bool classof(const Value *V) { 732f22ef01cSRoman Divacky return isa<ConstantExpr>(V) && 733f22ef01cSRoman Divacky cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; 734f22ef01cSRoman Divacky } 735f22ef01cSRoman Divacky 736f22ef01cSRoman Divacky 737f22ef01cSRoman Divacky /// Provide fast operand accessors 73839d628a0SDimitry Andric DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 739f22ef01cSRoman Divacky }; 740f22ef01cSRoman Divacky } 741f22ef01cSRoman Divacky 742f22ef01cSRoman Divacky // FIXME: can we inherit this from ConstantExpr? 743f22ef01cSRoman Divacky template <> 7442754fe60SDimitry Andric struct OperandTraits<ConstantPlaceHolder> : 7452754fe60SDimitry Andric public FixedNumOperandTraits<ConstantPlaceHolder, 1> { 746f22ef01cSRoman Divacky }; 74739d628a0SDimitry Andric DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantPlaceHolder, Value) 748f22ef01cSRoman Divacky } 749f22ef01cSRoman Divacky 750f22ef01cSRoman Divacky 751f22ef01cSRoman Divacky void BitcodeReaderValueList::AssignValue(Value *V, unsigned Idx) { 752f22ef01cSRoman Divacky if (Idx == size()) { 753f22ef01cSRoman Divacky push_back(V); 754f22ef01cSRoman Divacky return; 755f22ef01cSRoman Divacky } 756f22ef01cSRoman Divacky 757f22ef01cSRoman Divacky if (Idx >= size()) 758f22ef01cSRoman Divacky resize(Idx+1); 759f22ef01cSRoman Divacky 760f22ef01cSRoman Divacky WeakVH &OldV = ValuePtrs[Idx]; 76191bc56edSDimitry Andric if (!OldV) { 762f22ef01cSRoman Divacky OldV = V; 763f22ef01cSRoman Divacky return; 764f22ef01cSRoman Divacky } 765f22ef01cSRoman Divacky 766f22ef01cSRoman Divacky // Handle constants and non-constants (e.g. instrs) differently for 767f22ef01cSRoman Divacky // efficiency. 768f22ef01cSRoman Divacky if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { 769f22ef01cSRoman Divacky ResolveConstants.push_back(std::make_pair(PHC, Idx)); 770f22ef01cSRoman Divacky OldV = V; 771f22ef01cSRoman Divacky } else { 772f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 773f22ef01cSRoman Divacky Value *PrevVal = OldV; 774f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 775f22ef01cSRoman Divacky delete PrevVal; 776f22ef01cSRoman Divacky } 777f22ef01cSRoman Divacky } 778f22ef01cSRoman Divacky 779f22ef01cSRoman Divacky 780f22ef01cSRoman Divacky Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, 7816122f3e6SDimitry Andric Type *Ty) { 782f22ef01cSRoman Divacky if (Idx >= size()) 783f22ef01cSRoman Divacky resize(Idx + 1); 784f22ef01cSRoman Divacky 785f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 786ff0cc061SDimitry Andric if (Ty != V->getType()) 787ff0cc061SDimitry Andric report_fatal_error("Type mismatch in constant table!"); 788f22ef01cSRoman Divacky return cast<Constant>(V); 789f22ef01cSRoman Divacky } 790f22ef01cSRoman Divacky 791f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 792f22ef01cSRoman Divacky Constant *C = new ConstantPlaceHolder(Ty, Context); 793f22ef01cSRoman Divacky ValuePtrs[Idx] = C; 794f22ef01cSRoman Divacky return C; 795f22ef01cSRoman Divacky } 796f22ef01cSRoman Divacky 7976122f3e6SDimitry Andric Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { 798ff0cc061SDimitry Andric // Bail out for a clearly invalid value. This would make us call resize(0) 799ff0cc061SDimitry Andric if (Idx == UINT_MAX) 800ff0cc061SDimitry Andric return nullptr; 801ff0cc061SDimitry Andric 802f22ef01cSRoman Divacky if (Idx >= size()) 803f22ef01cSRoman Divacky resize(Idx + 1); 804f22ef01cSRoman Divacky 805f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 806ff0cc061SDimitry Andric // If the types don't match, it's invalid. 807ff0cc061SDimitry Andric if (Ty && Ty != V->getType()) 808ff0cc061SDimitry Andric return nullptr; 809f22ef01cSRoman Divacky return V; 810f22ef01cSRoman Divacky } 811f22ef01cSRoman Divacky 812f22ef01cSRoman Divacky // No type specified, must be invalid reference. 81391bc56edSDimitry Andric if (!Ty) return nullptr; 814f22ef01cSRoman Divacky 815f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 816f22ef01cSRoman Divacky Value *V = new Argument(Ty); 817f22ef01cSRoman Divacky ValuePtrs[Idx] = V; 818f22ef01cSRoman Divacky return V; 819f22ef01cSRoman Divacky } 820f22ef01cSRoman Divacky 821f22ef01cSRoman Divacky /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 822f22ef01cSRoman Divacky /// resolves any forward references. The idea behind this is that we sometimes 823f22ef01cSRoman Divacky /// get constants (such as large arrays) which reference *many* forward ref 824f22ef01cSRoman Divacky /// constants. Replacing each of these causes a lot of thrashing when 825f22ef01cSRoman Divacky /// building/reuniquing the constant. Instead of doing this, we look at all the 826f22ef01cSRoman Divacky /// uses and rewrite all the place holders at once for any constant that uses 827f22ef01cSRoman Divacky /// a placeholder. 828f22ef01cSRoman Divacky void BitcodeReaderValueList::ResolveConstantForwardRefs() { 829f22ef01cSRoman Divacky // Sort the values by-pointer so that they are efficient to look up with a 830f22ef01cSRoman Divacky // binary search. 831f22ef01cSRoman Divacky std::sort(ResolveConstants.begin(), ResolveConstants.end()); 832f22ef01cSRoman Divacky 833f22ef01cSRoman Divacky SmallVector<Constant*, 64> NewOps; 834f22ef01cSRoman Divacky 835f22ef01cSRoman Divacky while (!ResolveConstants.empty()) { 836f22ef01cSRoman Divacky Value *RealVal = operator[](ResolveConstants.back().second); 837f22ef01cSRoman Divacky Constant *Placeholder = ResolveConstants.back().first; 838f22ef01cSRoman Divacky ResolveConstants.pop_back(); 839f22ef01cSRoman Divacky 840f22ef01cSRoman Divacky // Loop over all users of the placeholder, updating them to reference the 841f22ef01cSRoman Divacky // new value. If they reference more than one placeholder, update them all 842f22ef01cSRoman Divacky // at once. 843f22ef01cSRoman Divacky while (!Placeholder->use_empty()) { 84491bc56edSDimitry Andric auto UI = Placeholder->user_begin(); 845ffd1746dSEd Schouten User *U = *UI; 846f22ef01cSRoman Divacky 847f22ef01cSRoman Divacky // If the using object isn't uniqued, just update the operands. This 848f22ef01cSRoman Divacky // handles instructions and initializers for global variables. 849ffd1746dSEd Schouten if (!isa<Constant>(U) || isa<GlobalValue>(U)) { 850f22ef01cSRoman Divacky UI.getUse().set(RealVal); 851f22ef01cSRoman Divacky continue; 852f22ef01cSRoman Divacky } 853f22ef01cSRoman Divacky 854f22ef01cSRoman Divacky // Otherwise, we have a constant that uses the placeholder. Replace that 855f22ef01cSRoman Divacky // constant with a new constant that has *all* placeholder uses updated. 856ffd1746dSEd Schouten Constant *UserC = cast<Constant>(U); 857f22ef01cSRoman Divacky for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); 858f22ef01cSRoman Divacky I != E; ++I) { 859f22ef01cSRoman Divacky Value *NewOp; 860f22ef01cSRoman Divacky if (!isa<ConstantPlaceHolder>(*I)) { 861f22ef01cSRoman Divacky // Not a placeholder reference. 862f22ef01cSRoman Divacky NewOp = *I; 863f22ef01cSRoman Divacky } else if (*I == Placeholder) { 864f22ef01cSRoman Divacky // Common case is that it just references this one placeholder. 865f22ef01cSRoman Divacky NewOp = RealVal; 866f22ef01cSRoman Divacky } else { 867f22ef01cSRoman Divacky // Otherwise, look up the placeholder in ResolveConstants. 868f22ef01cSRoman Divacky ResolveConstantsTy::iterator It = 869f22ef01cSRoman Divacky std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), 870f22ef01cSRoman Divacky std::pair<Constant*, unsigned>(cast<Constant>(*I), 871f22ef01cSRoman Divacky 0)); 872f22ef01cSRoman Divacky assert(It != ResolveConstants.end() && It->first == *I); 873f22ef01cSRoman Divacky NewOp = operator[](It->second); 874f22ef01cSRoman Divacky } 875f22ef01cSRoman Divacky 876f22ef01cSRoman Divacky NewOps.push_back(cast<Constant>(NewOp)); 877f22ef01cSRoman Divacky } 878f22ef01cSRoman Divacky 879f22ef01cSRoman Divacky // Make the new constant. 880f22ef01cSRoman Divacky Constant *NewC; 881f22ef01cSRoman Divacky if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { 88217a519f9SDimitry Andric NewC = ConstantArray::get(UserCA->getType(), NewOps); 883f22ef01cSRoman Divacky } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { 88417a519f9SDimitry Andric NewC = ConstantStruct::get(UserCS->getType(), NewOps); 885f22ef01cSRoman Divacky } else if (isa<ConstantVector>(UserC)) { 8862754fe60SDimitry Andric NewC = ConstantVector::get(NewOps); 887f22ef01cSRoman Divacky } else { 888f22ef01cSRoman Divacky assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); 8893b0f4066SDimitry Andric NewC = cast<ConstantExpr>(UserC)->getWithOperands(NewOps); 890f22ef01cSRoman Divacky } 891f22ef01cSRoman Divacky 892f22ef01cSRoman Divacky UserC->replaceAllUsesWith(NewC); 893f22ef01cSRoman Divacky UserC->destroyConstant(); 894f22ef01cSRoman Divacky NewOps.clear(); 895f22ef01cSRoman Divacky } 896f22ef01cSRoman Divacky 897f22ef01cSRoman Divacky // Update all ValueHandles, they should be the only users at this point. 898f22ef01cSRoman Divacky Placeholder->replaceAllUsesWith(RealVal); 899f22ef01cSRoman Divacky delete Placeholder; 900f22ef01cSRoman Divacky } 901f22ef01cSRoman Divacky } 902f22ef01cSRoman Divacky 90339d628a0SDimitry Andric void BitcodeReaderMDValueList::AssignValue(Metadata *MD, unsigned Idx) { 904f22ef01cSRoman Divacky if (Idx == size()) { 90539d628a0SDimitry Andric push_back(MD); 906f22ef01cSRoman Divacky return; 907f22ef01cSRoman Divacky } 908f22ef01cSRoman Divacky 909f22ef01cSRoman Divacky if (Idx >= size()) 910f22ef01cSRoman Divacky resize(Idx+1); 911f22ef01cSRoman Divacky 91239d628a0SDimitry Andric TrackingMDRef &OldMD = MDValuePtrs[Idx]; 91339d628a0SDimitry Andric if (!OldMD) { 91439d628a0SDimitry Andric OldMD.reset(MD); 915f22ef01cSRoman Divacky return; 916f22ef01cSRoman Divacky } 917f22ef01cSRoman Divacky 918f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 919ff0cc061SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 92039d628a0SDimitry Andric PrevMD->replaceAllUsesWith(MD); 92139d628a0SDimitry Andric --NumFwdRefs; 922f22ef01cSRoman Divacky } 923f22ef01cSRoman Divacky 92439d628a0SDimitry Andric Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { 925f22ef01cSRoman Divacky if (Idx >= size()) 926f22ef01cSRoman Divacky resize(Idx + 1); 927f22ef01cSRoman Divacky 92839d628a0SDimitry Andric if (Metadata *MD = MDValuePtrs[Idx]) 92939d628a0SDimitry Andric return MD; 930f22ef01cSRoman Divacky 931b09980d1SDimitry Andric // Track forward refs to be resolved later. 932b09980d1SDimitry Andric if (AnyFwdRefs) { 933b09980d1SDimitry Andric MinFwdRef = std::min(MinFwdRef, Idx); 934b09980d1SDimitry Andric MaxFwdRef = std::max(MaxFwdRef, Idx); 935b09980d1SDimitry Andric } else { 93639d628a0SDimitry Andric AnyFwdRefs = true; 937b09980d1SDimitry Andric MinFwdRef = MaxFwdRef = Idx; 938b09980d1SDimitry Andric } 93939d628a0SDimitry Andric ++NumFwdRefs; 940b09980d1SDimitry Andric 941b09980d1SDimitry Andric // Create and return a placeholder, which will later be RAUW'd. 942ff0cc061SDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release(); 94339d628a0SDimitry Andric MDValuePtrs[Idx].reset(MD); 94439d628a0SDimitry Andric return MD; 94539d628a0SDimitry Andric } 94639d628a0SDimitry Andric 94739d628a0SDimitry Andric void BitcodeReaderMDValueList::tryToResolveCycles() { 94839d628a0SDimitry Andric if (!AnyFwdRefs) 94939d628a0SDimitry Andric // Nothing to do. 95039d628a0SDimitry Andric return; 95139d628a0SDimitry Andric 95239d628a0SDimitry Andric if (NumFwdRefs) 95339d628a0SDimitry Andric // Still forward references... can't resolve cycles. 95439d628a0SDimitry Andric return; 95539d628a0SDimitry Andric 95639d628a0SDimitry Andric // Resolve any cycles. 957b09980d1SDimitry Andric for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) { 958b09980d1SDimitry Andric auto &MD = MDValuePtrs[I]; 959ff0cc061SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 960ff0cc061SDimitry Andric if (!N) 961ff0cc061SDimitry Andric continue; 962ff0cc061SDimitry Andric 963ff0cc061SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference"); 96439d628a0SDimitry Andric N->resolveCycles(); 96539d628a0SDimitry Andric } 966b09980d1SDimitry Andric 967b09980d1SDimitry Andric // Make sure we return early again until there's another forward ref. 968b09980d1SDimitry Andric AnyFwdRefs = false; 969f22ef01cSRoman Divacky } 970f22ef01cSRoman Divacky 97117a519f9SDimitry Andric Type *BitcodeReader::getTypeByID(unsigned ID) { 97217a519f9SDimitry Andric // The type table size is always specified correctly. 97317a519f9SDimitry Andric if (ID >= TypeList.size()) 97491bc56edSDimitry Andric return nullptr; 975f22ef01cSRoman Divacky 97617a519f9SDimitry Andric if (Type *Ty = TypeList[ID]) 97717a519f9SDimitry Andric return Ty; 97817a519f9SDimitry Andric 97917a519f9SDimitry Andric // If we have a forward reference, the only possible case is when it is to a 98017a519f9SDimitry Andric // named struct. Just create a placeholder for now. 98139d628a0SDimitry Andric return TypeList[ID] = createIdentifiedStructType(Context); 98239d628a0SDimitry Andric } 98339d628a0SDimitry Andric 98439d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context, 98539d628a0SDimitry Andric StringRef Name) { 98639d628a0SDimitry Andric auto *Ret = StructType::create(Context, Name); 98739d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 98839d628a0SDimitry Andric return Ret; 98939d628a0SDimitry Andric } 99039d628a0SDimitry Andric 99139d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context) { 99239d628a0SDimitry Andric auto *Ret = StructType::create(Context); 99339d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 99439d628a0SDimitry Andric return Ret; 995f22ef01cSRoman Divacky } 996f22ef01cSRoman Divacky 99717a519f9SDimitry Andric 998f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 999f22ef01cSRoman Divacky // Functions for parsing blocks from the bitcode file 1000f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 1001f22ef01cSRoman Divacky 1002139f7f9bSDimitry Andric 1003139f7f9bSDimitry Andric /// \brief This fills an AttrBuilder object with the LLVM attributes that have 1004139f7f9bSDimitry Andric /// been decoded from the given integer. This function must stay in sync with 1005139f7f9bSDimitry Andric /// 'encodeLLVMAttributesForBitcode'. 1006139f7f9bSDimitry Andric static void decodeLLVMAttributesForBitcode(AttrBuilder &B, 1007139f7f9bSDimitry Andric uint64_t EncodedAttrs) { 1008139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1009139f7f9bSDimitry Andric 1010139f7f9bSDimitry Andric // The alignment is stored as a 16-bit raw value from bits 31--16. We shift 1011139f7f9bSDimitry Andric // the bits above 31 down by 11 bits. 1012139f7f9bSDimitry Andric unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; 1013139f7f9bSDimitry Andric assert((!Alignment || isPowerOf2_32(Alignment)) && 1014139f7f9bSDimitry Andric "Alignment must be a power of two."); 1015139f7f9bSDimitry Andric 1016139f7f9bSDimitry Andric if (Alignment) 1017139f7f9bSDimitry Andric B.addAlignmentAttr(Alignment); 1018139f7f9bSDimitry Andric B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | 1019139f7f9bSDimitry Andric (EncodedAttrs & 0xffff)); 1020139f7f9bSDimitry Andric } 1021139f7f9bSDimitry Andric 102291bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttributeBlock() { 1023f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) 102439d628a0SDimitry Andric return Error("Invalid record"); 1025f22ef01cSRoman Divacky 1026f22ef01cSRoman Divacky if (!MAttributes.empty()) 102739d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1028f22ef01cSRoman Divacky 1029f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1030f22ef01cSRoman Divacky 1031139f7f9bSDimitry Andric SmallVector<AttributeSet, 8> Attrs; 1032f22ef01cSRoman Divacky 1033f22ef01cSRoman Divacky // Read all the records. 1034f22ef01cSRoman Divacky while (1) { 1035139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1036139f7f9bSDimitry Andric 1037139f7f9bSDimitry Andric switch (Entry.Kind) { 1038139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1039139f7f9bSDimitry Andric case BitstreamEntry::Error: 104039d628a0SDimitry Andric return Error("Malformed block"); 1041139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 104291bc56edSDimitry Andric return std::error_code(); 1043139f7f9bSDimitry Andric case BitstreamEntry::Record: 1044139f7f9bSDimitry Andric // The interesting case. 1045139f7f9bSDimitry Andric break; 1046f22ef01cSRoman Divacky } 1047f22ef01cSRoman Divacky 1048f22ef01cSRoman Divacky // Read a record. 1049f22ef01cSRoman Divacky Record.clear(); 1050139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1051f22ef01cSRoman Divacky default: // Default behavior: ignore. 1052f22ef01cSRoman Divacky break; 1053139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] 1054139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1055f22ef01cSRoman Divacky if (Record.size() & 1) 105639d628a0SDimitry Andric return Error("Invalid record"); 1057f22ef01cSRoman Divacky 1058f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 1059139f7f9bSDimitry Andric AttrBuilder B; 1060139f7f9bSDimitry Andric decodeLLVMAttributesForBitcode(B, Record[i+1]); 1061139f7f9bSDimitry Andric Attrs.push_back(AttributeSet::get(Context, Record[i], B)); 1062f22ef01cSRoman Divacky } 1063f22ef01cSRoman Divacky 1064139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1065f22ef01cSRoman Divacky Attrs.clear(); 1066f22ef01cSRoman Divacky break; 1067f22ef01cSRoman Divacky } 1068139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] 1069139f7f9bSDimitry Andric for (unsigned i = 0, e = Record.size(); i != e; ++i) 1070139f7f9bSDimitry Andric Attrs.push_back(MAttributeGroups[Record[i]]); 1071139f7f9bSDimitry Andric 1072139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1073139f7f9bSDimitry Andric Attrs.clear(); 1074139f7f9bSDimitry Andric break; 1075139f7f9bSDimitry Andric } 1076139f7f9bSDimitry Andric } 1077139f7f9bSDimitry Andric } 1078139f7f9bSDimitry Andric } 1079139f7f9bSDimitry Andric 1080f785676fSDimitry Andric // Returns Attribute::None on unrecognized codes. 1081f785676fSDimitry Andric static Attribute::AttrKind GetAttrFromCode(uint64_t Code) { 1082f785676fSDimitry Andric switch (Code) { 1083f785676fSDimitry Andric default: 1084f785676fSDimitry Andric return Attribute::None; 1085f785676fSDimitry Andric case bitc::ATTR_KIND_ALIGNMENT: 1086f785676fSDimitry Andric return Attribute::Alignment; 1087f785676fSDimitry Andric case bitc::ATTR_KIND_ALWAYS_INLINE: 1088f785676fSDimitry Andric return Attribute::AlwaysInline; 1089f785676fSDimitry Andric case bitc::ATTR_KIND_BUILTIN: 1090f785676fSDimitry Andric return Attribute::Builtin; 1091f785676fSDimitry Andric case bitc::ATTR_KIND_BY_VAL: 1092f785676fSDimitry Andric return Attribute::ByVal; 109391bc56edSDimitry Andric case bitc::ATTR_KIND_IN_ALLOCA: 109491bc56edSDimitry Andric return Attribute::InAlloca; 1095f785676fSDimitry Andric case bitc::ATTR_KIND_COLD: 1096f785676fSDimitry Andric return Attribute::Cold; 1097ff0cc061SDimitry Andric case bitc::ATTR_KIND_CONVERGENT: 1098ff0cc061SDimitry Andric return Attribute::Convergent; 1099f785676fSDimitry Andric case bitc::ATTR_KIND_INLINE_HINT: 1100f785676fSDimitry Andric return Attribute::InlineHint; 1101f785676fSDimitry Andric case bitc::ATTR_KIND_IN_REG: 1102f785676fSDimitry Andric return Attribute::InReg; 110391bc56edSDimitry Andric case bitc::ATTR_KIND_JUMP_TABLE: 110491bc56edSDimitry Andric return Attribute::JumpTable; 1105f785676fSDimitry Andric case bitc::ATTR_KIND_MIN_SIZE: 1106f785676fSDimitry Andric return Attribute::MinSize; 1107f785676fSDimitry Andric case bitc::ATTR_KIND_NAKED: 1108f785676fSDimitry Andric return Attribute::Naked; 1109f785676fSDimitry Andric case bitc::ATTR_KIND_NEST: 1110f785676fSDimitry Andric return Attribute::Nest; 1111f785676fSDimitry Andric case bitc::ATTR_KIND_NO_ALIAS: 1112f785676fSDimitry Andric return Attribute::NoAlias; 1113f785676fSDimitry Andric case bitc::ATTR_KIND_NO_BUILTIN: 1114f785676fSDimitry Andric return Attribute::NoBuiltin; 1115f785676fSDimitry Andric case bitc::ATTR_KIND_NO_CAPTURE: 1116f785676fSDimitry Andric return Attribute::NoCapture; 1117f785676fSDimitry Andric case bitc::ATTR_KIND_NO_DUPLICATE: 1118f785676fSDimitry Andric return Attribute::NoDuplicate; 1119f785676fSDimitry Andric case bitc::ATTR_KIND_NO_IMPLICIT_FLOAT: 1120f785676fSDimitry Andric return Attribute::NoImplicitFloat; 1121f785676fSDimitry Andric case bitc::ATTR_KIND_NO_INLINE: 1122f785676fSDimitry Andric return Attribute::NoInline; 1123f785676fSDimitry Andric case bitc::ATTR_KIND_NON_LAZY_BIND: 1124f785676fSDimitry Andric return Attribute::NonLazyBind; 112591bc56edSDimitry Andric case bitc::ATTR_KIND_NON_NULL: 112691bc56edSDimitry Andric return Attribute::NonNull; 112791bc56edSDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE: 112891bc56edSDimitry Andric return Attribute::Dereferenceable; 1129ff0cc061SDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL: 1130ff0cc061SDimitry Andric return Attribute::DereferenceableOrNull; 1131f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RED_ZONE: 1132f785676fSDimitry Andric return Attribute::NoRedZone; 1133f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RETURN: 1134f785676fSDimitry Andric return Attribute::NoReturn; 1135f785676fSDimitry Andric case bitc::ATTR_KIND_NO_UNWIND: 1136f785676fSDimitry Andric return Attribute::NoUnwind; 1137f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: 1138f785676fSDimitry Andric return Attribute::OptimizeForSize; 1139f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_NONE: 1140f785676fSDimitry Andric return Attribute::OptimizeNone; 1141f785676fSDimitry Andric case bitc::ATTR_KIND_READ_NONE: 1142f785676fSDimitry Andric return Attribute::ReadNone; 1143f785676fSDimitry Andric case bitc::ATTR_KIND_READ_ONLY: 1144f785676fSDimitry Andric return Attribute::ReadOnly; 1145f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNED: 1146f785676fSDimitry Andric return Attribute::Returned; 1147f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNS_TWICE: 1148f785676fSDimitry Andric return Attribute::ReturnsTwice; 1149f785676fSDimitry Andric case bitc::ATTR_KIND_S_EXT: 1150f785676fSDimitry Andric return Attribute::SExt; 1151f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_ALIGNMENT: 1152f785676fSDimitry Andric return Attribute::StackAlignment; 1153f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT: 1154f785676fSDimitry Andric return Attribute::StackProtect; 1155f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_REQ: 1156f785676fSDimitry Andric return Attribute::StackProtectReq; 1157f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_STRONG: 1158f785676fSDimitry Andric return Attribute::StackProtectStrong; 1159f785676fSDimitry Andric case bitc::ATTR_KIND_STRUCT_RET: 1160f785676fSDimitry Andric return Attribute::StructRet; 1161f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_ADDRESS: 1162f785676fSDimitry Andric return Attribute::SanitizeAddress; 1163f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_THREAD: 1164f785676fSDimitry Andric return Attribute::SanitizeThread; 1165f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_MEMORY: 1166f785676fSDimitry Andric return Attribute::SanitizeMemory; 1167f785676fSDimitry Andric case bitc::ATTR_KIND_UW_TABLE: 1168f785676fSDimitry Andric return Attribute::UWTable; 1169f785676fSDimitry Andric case bitc::ATTR_KIND_Z_EXT: 1170f785676fSDimitry Andric return Attribute::ZExt; 1171f785676fSDimitry Andric } 1172f785676fSDimitry Andric } 1173f785676fSDimitry Andric 1174ff0cc061SDimitry Andric std::error_code BitcodeReader::parseAlignmentValue(uint64_t Exponent, 1175ff0cc061SDimitry Andric unsigned &Alignment) { 1176ff0cc061SDimitry Andric // Note: Alignment in bitcode files is incremented by 1, so that zero 1177ff0cc061SDimitry Andric // can be used for default alignment. 1178ff0cc061SDimitry Andric if (Exponent > Value::MaxAlignmentExponent + 1) 1179ff0cc061SDimitry Andric return Error("Invalid alignment value"); 1180ff0cc061SDimitry Andric Alignment = (1 << static_cast<unsigned>(Exponent)) >> 1; 1181ff0cc061SDimitry Andric return std::error_code(); 1182ff0cc061SDimitry Andric } 1183ff0cc061SDimitry Andric 118491bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttrKind(uint64_t Code, 1185f785676fSDimitry Andric Attribute::AttrKind *Kind) { 1186f785676fSDimitry Andric *Kind = GetAttrFromCode(Code); 1187f785676fSDimitry Andric if (*Kind == Attribute::None) 118839d628a0SDimitry Andric return Error(BitcodeError::CorruptedBitcode, 118939d628a0SDimitry Andric "Unknown attribute kind (" + Twine(Code) + ")"); 119091bc56edSDimitry Andric return std::error_code(); 1191f785676fSDimitry Andric } 1192f785676fSDimitry Andric 119391bc56edSDimitry Andric std::error_code BitcodeReader::ParseAttributeGroupBlock() { 1194139f7f9bSDimitry Andric if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) 119539d628a0SDimitry Andric return Error("Invalid record"); 1196139f7f9bSDimitry Andric 1197139f7f9bSDimitry Andric if (!MAttributeGroups.empty()) 119839d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1199139f7f9bSDimitry Andric 1200139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 1201139f7f9bSDimitry Andric 1202139f7f9bSDimitry Andric // Read all the records. 1203139f7f9bSDimitry Andric while (1) { 1204139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1205139f7f9bSDimitry Andric 1206139f7f9bSDimitry Andric switch (Entry.Kind) { 1207139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1208139f7f9bSDimitry Andric case BitstreamEntry::Error: 120939d628a0SDimitry Andric return Error("Malformed block"); 1210139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 121191bc56edSDimitry Andric return std::error_code(); 1212139f7f9bSDimitry Andric case BitstreamEntry::Record: 1213139f7f9bSDimitry Andric // The interesting case. 1214139f7f9bSDimitry Andric break; 1215139f7f9bSDimitry Andric } 1216139f7f9bSDimitry Andric 1217139f7f9bSDimitry Andric // Read a record. 1218139f7f9bSDimitry Andric Record.clear(); 1219139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1220139f7f9bSDimitry Andric default: // Default behavior: ignore. 1221139f7f9bSDimitry Andric break; 1222139f7f9bSDimitry Andric case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] 1223139f7f9bSDimitry Andric if (Record.size() < 3) 122439d628a0SDimitry Andric return Error("Invalid record"); 1225139f7f9bSDimitry Andric 1226139f7f9bSDimitry Andric uint64_t GrpID = Record[0]; 1227139f7f9bSDimitry Andric uint64_t Idx = Record[1]; // Index of the object this attribute refers to. 1228139f7f9bSDimitry Andric 1229139f7f9bSDimitry Andric AttrBuilder B; 1230139f7f9bSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1231139f7f9bSDimitry Andric if (Record[i] == 0) { // Enum attribute 1232f785676fSDimitry Andric Attribute::AttrKind Kind; 123391bc56edSDimitry Andric if (std::error_code EC = ParseAttrKind(Record[++i], &Kind)) 1234f785676fSDimitry Andric return EC; 1235f785676fSDimitry Andric 1236f785676fSDimitry Andric B.addAttribute(Kind); 123791bc56edSDimitry Andric } else if (Record[i] == 1) { // Integer attribute 1238f785676fSDimitry Andric Attribute::AttrKind Kind; 123991bc56edSDimitry Andric if (std::error_code EC = ParseAttrKind(Record[++i], &Kind)) 1240f785676fSDimitry Andric return EC; 1241f785676fSDimitry Andric if (Kind == Attribute::Alignment) 1242139f7f9bSDimitry Andric B.addAlignmentAttr(Record[++i]); 124391bc56edSDimitry Andric else if (Kind == Attribute::StackAlignment) 1244139f7f9bSDimitry Andric B.addStackAlignmentAttr(Record[++i]); 124591bc56edSDimitry Andric else if (Kind == Attribute::Dereferenceable) 124691bc56edSDimitry Andric B.addDereferenceableAttr(Record[++i]); 1247ff0cc061SDimitry Andric else if (Kind == Attribute::DereferenceableOrNull) 1248ff0cc061SDimitry Andric B.addDereferenceableOrNullAttr(Record[++i]); 1249139f7f9bSDimitry Andric } else { // String attribute 1250139f7f9bSDimitry Andric assert((Record[i] == 3 || Record[i] == 4) && 1251139f7f9bSDimitry Andric "Invalid attribute group entry"); 1252139f7f9bSDimitry Andric bool HasValue = (Record[i++] == 4); 1253139f7f9bSDimitry Andric SmallString<64> KindStr; 1254139f7f9bSDimitry Andric SmallString<64> ValStr; 1255139f7f9bSDimitry Andric 1256139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1257139f7f9bSDimitry Andric KindStr += Record[i++]; 1258139f7f9bSDimitry Andric assert(Record[i] == 0 && "Kind string not null terminated"); 1259139f7f9bSDimitry Andric 1260139f7f9bSDimitry Andric if (HasValue) { 1261139f7f9bSDimitry Andric // Has a value associated with it. 1262139f7f9bSDimitry Andric ++i; // Skip the '0' that terminates the "kind" string. 1263139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1264139f7f9bSDimitry Andric ValStr += Record[i++]; 1265139f7f9bSDimitry Andric assert(Record[i] == 0 && "Value string not null terminated"); 1266139f7f9bSDimitry Andric } 1267139f7f9bSDimitry Andric 1268139f7f9bSDimitry Andric B.addAttribute(KindStr.str(), ValStr.str()); 1269139f7f9bSDimitry Andric } 1270139f7f9bSDimitry Andric } 1271139f7f9bSDimitry Andric 1272139f7f9bSDimitry Andric MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); 1273139f7f9bSDimitry Andric break; 1274139f7f9bSDimitry Andric } 1275f22ef01cSRoman Divacky } 1276f22ef01cSRoman Divacky } 1277f22ef01cSRoman Divacky } 1278f22ef01cSRoman Divacky 127991bc56edSDimitry Andric std::error_code BitcodeReader::ParseTypeTable() { 128017a519f9SDimitry Andric if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) 128139d628a0SDimitry Andric return Error("Invalid record"); 1282f22ef01cSRoman Divacky 128317a519f9SDimitry Andric return ParseTypeTableBody(); 128417a519f9SDimitry Andric } 128517a519f9SDimitry Andric 128691bc56edSDimitry Andric std::error_code BitcodeReader::ParseTypeTableBody() { 1287f22ef01cSRoman Divacky if (!TypeList.empty()) 128839d628a0SDimitry Andric return Error("Invalid multiple blocks"); 1289f22ef01cSRoman Divacky 1290f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1291f22ef01cSRoman Divacky unsigned NumRecords = 0; 1292f22ef01cSRoman Divacky 129317a519f9SDimitry Andric SmallString<64> TypeName; 129417a519f9SDimitry Andric 1295f22ef01cSRoman Divacky // Read all the records for this type table. 1296f22ef01cSRoman Divacky while (1) { 1297139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1298139f7f9bSDimitry Andric 1299139f7f9bSDimitry Andric switch (Entry.Kind) { 1300139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1301139f7f9bSDimitry Andric case BitstreamEntry::Error: 130239d628a0SDimitry Andric return Error("Malformed block"); 1303139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1304f22ef01cSRoman Divacky if (NumRecords != TypeList.size()) 130539d628a0SDimitry Andric return Error("Malformed block"); 130691bc56edSDimitry Andric return std::error_code(); 1307139f7f9bSDimitry Andric case BitstreamEntry::Record: 1308139f7f9bSDimitry Andric // The interesting case. 1309139f7f9bSDimitry Andric break; 1310f22ef01cSRoman Divacky } 1311f22ef01cSRoman Divacky 1312f22ef01cSRoman Divacky // Read a record. 1313f22ef01cSRoman Divacky Record.clear(); 131491bc56edSDimitry Andric Type *ResultTy = nullptr; 1315139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1316f785676fSDimitry Andric default: 131739d628a0SDimitry Andric return Error("Invalid value"); 1318f22ef01cSRoman Divacky case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] 1319f22ef01cSRoman Divacky // TYPE_CODE_NUMENTRY contains a count of the number of types in the 1320f22ef01cSRoman Divacky // type list. This allows us to reserve space. 1321f22ef01cSRoman Divacky if (Record.size() < 1) 132239d628a0SDimitry Andric return Error("Invalid record"); 132317a519f9SDimitry Andric TypeList.resize(Record[0]); 1324f22ef01cSRoman Divacky continue; 1325f22ef01cSRoman Divacky case bitc::TYPE_CODE_VOID: // VOID 1326f22ef01cSRoman Divacky ResultTy = Type::getVoidTy(Context); 1327f22ef01cSRoman Divacky break; 1328dff0c46cSDimitry Andric case bitc::TYPE_CODE_HALF: // HALF 1329dff0c46cSDimitry Andric ResultTy = Type::getHalfTy(Context); 1330dff0c46cSDimitry Andric break; 1331f22ef01cSRoman Divacky case bitc::TYPE_CODE_FLOAT: // FLOAT 1332f22ef01cSRoman Divacky ResultTy = Type::getFloatTy(Context); 1333f22ef01cSRoman Divacky break; 1334f22ef01cSRoman Divacky case bitc::TYPE_CODE_DOUBLE: // DOUBLE 1335f22ef01cSRoman Divacky ResultTy = Type::getDoubleTy(Context); 1336f22ef01cSRoman Divacky break; 1337f22ef01cSRoman Divacky case bitc::TYPE_CODE_X86_FP80: // X86_FP80 1338f22ef01cSRoman Divacky ResultTy = Type::getX86_FP80Ty(Context); 1339f22ef01cSRoman Divacky break; 1340f22ef01cSRoman Divacky case bitc::TYPE_CODE_FP128: // FP128 1341f22ef01cSRoman Divacky ResultTy = Type::getFP128Ty(Context); 1342f22ef01cSRoman Divacky break; 1343f22ef01cSRoman Divacky case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 1344f22ef01cSRoman Divacky ResultTy = Type::getPPC_FP128Ty(Context); 1345f22ef01cSRoman Divacky break; 1346f22ef01cSRoman Divacky case bitc::TYPE_CODE_LABEL: // LABEL 1347f22ef01cSRoman Divacky ResultTy = Type::getLabelTy(Context); 1348f22ef01cSRoman Divacky break; 1349f22ef01cSRoman Divacky case bitc::TYPE_CODE_METADATA: // METADATA 1350f22ef01cSRoman Divacky ResultTy = Type::getMetadataTy(Context); 1351f22ef01cSRoman Divacky break; 13522754fe60SDimitry Andric case bitc::TYPE_CODE_X86_MMX: // X86_MMX 13532754fe60SDimitry Andric ResultTy = Type::getX86_MMXTy(Context); 13542754fe60SDimitry Andric break; 1355ff0cc061SDimitry Andric case bitc::TYPE_CODE_INTEGER: { // INTEGER: [width] 1356f22ef01cSRoman Divacky if (Record.size() < 1) 135739d628a0SDimitry Andric return Error("Invalid record"); 1358f22ef01cSRoman Divacky 1359ff0cc061SDimitry Andric uint64_t NumBits = Record[0]; 1360ff0cc061SDimitry Andric if (NumBits < IntegerType::MIN_INT_BITS || 1361ff0cc061SDimitry Andric NumBits > IntegerType::MAX_INT_BITS) 1362ff0cc061SDimitry Andric return Error("Bitwidth for integer type out of range"); 1363ff0cc061SDimitry Andric ResultTy = IntegerType::get(Context, NumBits); 1364f22ef01cSRoman Divacky break; 1365ff0cc061SDimitry Andric } 1366f22ef01cSRoman Divacky case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or 1367f22ef01cSRoman Divacky // [pointee type, address space] 1368f22ef01cSRoman Divacky if (Record.size() < 1) 136939d628a0SDimitry Andric return Error("Invalid record"); 1370f22ef01cSRoman Divacky unsigned AddressSpace = 0; 1371f22ef01cSRoman Divacky if (Record.size() == 2) 1372f22ef01cSRoman Divacky AddressSpace = Record[1]; 137317a519f9SDimitry Andric ResultTy = getTypeByID(Record[0]); 1374ff0cc061SDimitry Andric if (!ResultTy || 1375ff0cc061SDimitry Andric !PointerType::isValidElementType(ResultTy)) 137639d628a0SDimitry Andric return Error("Invalid type"); 137717a519f9SDimitry Andric ResultTy = PointerType::get(ResultTy, AddressSpace); 1378f22ef01cSRoman Divacky break; 1379f22ef01cSRoman Divacky } 1380dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION_OLD: { 13817ae0e2c9SDimitry Andric // FIXME: attrid is dead, remove it in LLVM 4.0 1382f22ef01cSRoman Divacky // FUNCTION: [vararg, attrid, retty, paramty x N] 1383f22ef01cSRoman Divacky if (Record.size() < 3) 138439d628a0SDimitry Andric return Error("Invalid record"); 1385dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 138617a519f9SDimitry Andric for (unsigned i = 3, e = Record.size(); i != e; ++i) { 138717a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 138817a519f9SDimitry Andric ArgTys.push_back(T); 138917a519f9SDimitry Andric else 1390f22ef01cSRoman Divacky break; 1391f22ef01cSRoman Divacky } 139217a519f9SDimitry Andric 139317a519f9SDimitry Andric ResultTy = getTypeByID(Record[2]); 139491bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-3) 139539d628a0SDimitry Andric return Error("Invalid type"); 139617a519f9SDimitry Andric 139717a519f9SDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 139817a519f9SDimitry Andric break; 139917a519f9SDimitry Andric } 1400dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION: { 1401dff0c46cSDimitry Andric // FUNCTION: [vararg, retty, paramty x N] 1402dff0c46cSDimitry Andric if (Record.size() < 2) 140339d628a0SDimitry Andric return Error("Invalid record"); 1404dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 1405dff0c46cSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1406ff0cc061SDimitry Andric if (Type *T = getTypeByID(Record[i])) { 1407ff0cc061SDimitry Andric if (!FunctionType::isValidArgumentType(T)) 1408ff0cc061SDimitry Andric return Error("Invalid function argument type"); 1409dff0c46cSDimitry Andric ArgTys.push_back(T); 1410ff0cc061SDimitry Andric } 1411dff0c46cSDimitry Andric else 1412dff0c46cSDimitry Andric break; 1413dff0c46cSDimitry Andric } 1414dff0c46cSDimitry Andric 1415dff0c46cSDimitry Andric ResultTy = getTypeByID(Record[1]); 141691bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-2) 141739d628a0SDimitry Andric return Error("Invalid type"); 1418dff0c46cSDimitry Andric 1419dff0c46cSDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 1420dff0c46cSDimitry Andric break; 1421dff0c46cSDimitry Andric } 142217a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] 1423f22ef01cSRoman Divacky if (Record.size() < 1) 142439d628a0SDimitry Andric return Error("Invalid record"); 1425dff0c46cSDimitry Andric SmallVector<Type*, 8> EltTys; 142617a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 142717a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 142817a519f9SDimitry Andric EltTys.push_back(T); 142917a519f9SDimitry Andric else 143017a519f9SDimitry Andric break; 143117a519f9SDimitry Andric } 143217a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 143339d628a0SDimitry Andric return Error("Invalid type"); 1434f22ef01cSRoman Divacky ResultTy = StructType::get(Context, EltTys, Record[0]); 1435f22ef01cSRoman Divacky break; 1436f22ef01cSRoman Divacky } 143717a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] 143817a519f9SDimitry Andric if (ConvertToString(Record, 0, TypeName)) 143939d628a0SDimitry Andric return Error("Invalid record"); 144017a519f9SDimitry Andric continue; 144117a519f9SDimitry Andric 144217a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] 144317a519f9SDimitry Andric if (Record.size() < 1) 144439d628a0SDimitry Andric return Error("Invalid record"); 144517a519f9SDimitry Andric 144617a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 144739d628a0SDimitry Andric return Error("Invalid TYPE table"); 144817a519f9SDimitry Andric 144917a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 145017a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 145117a519f9SDimitry Andric if (Res) { 145217a519f9SDimitry Andric Res->setName(TypeName); 145391bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 145417a519f9SDimitry Andric } else // Otherwise, create a new struct. 145539d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 145617a519f9SDimitry Andric TypeName.clear(); 145717a519f9SDimitry Andric 145817a519f9SDimitry Andric SmallVector<Type*, 8> EltTys; 145917a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 146017a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 146117a519f9SDimitry Andric EltTys.push_back(T); 146217a519f9SDimitry Andric else 146317a519f9SDimitry Andric break; 146417a519f9SDimitry Andric } 146517a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 146639d628a0SDimitry Andric return Error("Invalid record"); 146717a519f9SDimitry Andric Res->setBody(EltTys, Record[0]); 146817a519f9SDimitry Andric ResultTy = Res; 146917a519f9SDimitry Andric break; 147017a519f9SDimitry Andric } 147117a519f9SDimitry Andric case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] 147217a519f9SDimitry Andric if (Record.size() != 1) 147339d628a0SDimitry Andric return Error("Invalid record"); 147417a519f9SDimitry Andric 147517a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 147639d628a0SDimitry Andric return Error("Invalid TYPE table"); 147717a519f9SDimitry Andric 147817a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 147917a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 148017a519f9SDimitry Andric if (Res) { 148117a519f9SDimitry Andric Res->setName(TypeName); 148291bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 148317a519f9SDimitry Andric } else // Otherwise, create a new struct with no body. 148439d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 148517a519f9SDimitry Andric TypeName.clear(); 148617a519f9SDimitry Andric ResultTy = Res; 148717a519f9SDimitry Andric break; 148817a519f9SDimitry Andric } 1489f22ef01cSRoman Divacky case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] 1490f22ef01cSRoman Divacky if (Record.size() < 2) 149139d628a0SDimitry Andric return Error("Invalid record"); 1492ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1493ff0cc061SDimitry Andric if (!ResultTy || !ArrayType::isValidElementType(ResultTy)) 149439d628a0SDimitry Andric return Error("Invalid type"); 1495ff0cc061SDimitry Andric ResultTy = ArrayType::get(ResultTy, Record[0]); 1496f22ef01cSRoman Divacky break; 1497f22ef01cSRoman Divacky case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] 1498f22ef01cSRoman Divacky if (Record.size() < 2) 149939d628a0SDimitry Andric return Error("Invalid record"); 150097bc6c73SDimitry Andric if (Record[0] == 0) 150197bc6c73SDimitry Andric return Error("Invalid vector length"); 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 1639139f7f9bSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record); 164097bc6c73SDimitry Andric if (NextBitCode != bitc::METADATA_NAMED_NODE) 164197bc6c73SDimitry Andric return Error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 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 { 206897bc6c73SDimitry Andric Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]); 206997bc6c73SDimitry Andric if (!C) 207039d628a0SDimitry Andric return Error("Expected a constant"); 207197bc6c73SDimitry Andric GlobalAlias *Alias = AliasInitWorklist.back().first; 207297bc6c73SDimitry Andric if (C->getType() != Alias->getType()) 207397bc6c73SDimitry Andric return Error("Alias and aliasee types don't match"); 207497bc6c73SDimitry Andric Alias->setAliasee(C); 2075f22ef01cSRoman Divacky } 2076f22ef01cSRoman Divacky AliasInitWorklist.pop_back(); 2077f22ef01cSRoman Divacky } 2078f785676fSDimitry Andric 2079f785676fSDimitry Andric while (!FunctionPrefixWorklist.empty()) { 2080f785676fSDimitry Andric unsigned ValID = FunctionPrefixWorklist.back().second; 2081f785676fSDimitry Andric if (ValID >= ValueList.size()) { 2082f785676fSDimitry Andric FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); 2083f785676fSDimitry Andric } else { 208491bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2085f785676fSDimitry Andric FunctionPrefixWorklist.back().first->setPrefixData(C); 2086f785676fSDimitry Andric else 208739d628a0SDimitry Andric return Error("Expected a constant"); 2088f785676fSDimitry Andric } 2089f785676fSDimitry Andric FunctionPrefixWorklist.pop_back(); 2090f785676fSDimitry Andric } 2091f785676fSDimitry Andric 209239d628a0SDimitry Andric while (!FunctionPrologueWorklist.empty()) { 209339d628a0SDimitry Andric unsigned ValID = FunctionPrologueWorklist.back().second; 209439d628a0SDimitry Andric if (ValID >= ValueList.size()) { 209539d628a0SDimitry Andric FunctionPrologues.push_back(FunctionPrologueWorklist.back()); 209639d628a0SDimitry Andric } else { 209739d628a0SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 209839d628a0SDimitry Andric FunctionPrologueWorklist.back().first->setPrologueData(C); 209939d628a0SDimitry Andric else 210039d628a0SDimitry Andric return Error("Expected a constant"); 210139d628a0SDimitry Andric } 210239d628a0SDimitry Andric FunctionPrologueWorklist.pop_back(); 210339d628a0SDimitry Andric } 210439d628a0SDimitry Andric 210591bc56edSDimitry Andric return std::error_code(); 2106f22ef01cSRoman Divacky } 2107f22ef01cSRoman Divacky 21087ae0e2c9SDimitry Andric static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { 21097ae0e2c9SDimitry Andric SmallVector<uint64_t, 8> Words(Vals.size()); 21107ae0e2c9SDimitry Andric std::transform(Vals.begin(), Vals.end(), Words.begin(), 21113861d79fSDimitry Andric BitcodeReader::decodeSignRotatedValue); 21127ae0e2c9SDimitry Andric 21137ae0e2c9SDimitry Andric return APInt(TypeBits, Words); 21147ae0e2c9SDimitry Andric } 21157ae0e2c9SDimitry Andric 211691bc56edSDimitry Andric std::error_code BitcodeReader::ParseConstants() { 2117f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) 211839d628a0SDimitry Andric return Error("Invalid record"); 2119f22ef01cSRoman Divacky 2120f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2121f22ef01cSRoman Divacky 2122f22ef01cSRoman Divacky // Read all the records for this value table. 21236122f3e6SDimitry Andric Type *CurTy = Type::getInt32Ty(Context); 2124f22ef01cSRoman Divacky unsigned NextCstNo = ValueList.size(); 2125f22ef01cSRoman Divacky while (1) { 2126139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2127139f7f9bSDimitry Andric 2128139f7f9bSDimitry Andric switch (Entry.Kind) { 2129139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2130139f7f9bSDimitry Andric case BitstreamEntry::Error: 213139d628a0SDimitry Andric return Error("Malformed block"); 2132139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2133139f7f9bSDimitry Andric if (NextCstNo != ValueList.size()) 213439d628a0SDimitry Andric return Error("Invalid ronstant reference"); 2135139f7f9bSDimitry Andric 2136139f7f9bSDimitry Andric // Once all the constants have been read, go through and resolve forward 2137139f7f9bSDimitry Andric // references. 2138139f7f9bSDimitry Andric ValueList.ResolveConstantForwardRefs(); 213991bc56edSDimitry Andric return std::error_code(); 2140139f7f9bSDimitry Andric case BitstreamEntry::Record: 2141139f7f9bSDimitry Andric // The interesting case. 2142f22ef01cSRoman Divacky break; 2143f22ef01cSRoman Divacky } 2144f22ef01cSRoman Divacky 2145f22ef01cSRoman Divacky // Read a record. 2146f22ef01cSRoman Divacky Record.clear(); 214791bc56edSDimitry Andric Value *V = nullptr; 2148139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 2149f22ef01cSRoman Divacky switch (BitCode) { 2150f22ef01cSRoman Divacky default: // Default behavior: unknown constant 2151f22ef01cSRoman Divacky case bitc::CST_CODE_UNDEF: // UNDEF 2152f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2153f22ef01cSRoman Divacky break; 2154f22ef01cSRoman Divacky case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] 2155f22ef01cSRoman Divacky if (Record.empty()) 215639d628a0SDimitry Andric return Error("Invalid record"); 215791bc56edSDimitry Andric if (Record[0] >= TypeList.size() || !TypeList[Record[0]]) 215839d628a0SDimitry Andric return Error("Invalid record"); 2159f22ef01cSRoman Divacky CurTy = TypeList[Record[0]]; 2160f22ef01cSRoman Divacky continue; // Skip the ValueList manipulation. 2161f22ef01cSRoman Divacky case bitc::CST_CODE_NULL: // NULL 2162f22ef01cSRoman Divacky V = Constant::getNullValue(CurTy); 2163f22ef01cSRoman Divacky break; 2164f22ef01cSRoman Divacky case bitc::CST_CODE_INTEGER: // INTEGER: [intval] 2165f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 216639d628a0SDimitry Andric return Error("Invalid record"); 21673861d79fSDimitry Andric V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); 2168f22ef01cSRoman Divacky break; 2169f22ef01cSRoman Divacky case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] 2170f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 217139d628a0SDimitry Andric return Error("Invalid record"); 2172f22ef01cSRoman Divacky 21737ae0e2c9SDimitry Andric APInt VInt = ReadWideAPInt(Record, 21747ae0e2c9SDimitry Andric cast<IntegerType>(CurTy)->getBitWidth()); 21757ae0e2c9SDimitry Andric V = ConstantInt::get(Context, VInt); 21767ae0e2c9SDimitry Andric 2177f22ef01cSRoman Divacky break; 2178f22ef01cSRoman Divacky } 2179f22ef01cSRoman Divacky case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] 2180f22ef01cSRoman Divacky if (Record.empty()) 218139d628a0SDimitry Andric return Error("Invalid record"); 2182dff0c46cSDimitry Andric if (CurTy->isHalfTy()) 2183139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, 2184139f7f9bSDimitry Andric APInt(16, (uint16_t)Record[0]))); 2185dff0c46cSDimitry Andric else if (CurTy->isFloatTy()) 2186139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, 2187139f7f9bSDimitry Andric APInt(32, (uint32_t)Record[0]))); 2188f22ef01cSRoman Divacky else if (CurTy->isDoubleTy()) 2189139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, 2190139f7f9bSDimitry Andric APInt(64, Record[0]))); 2191f22ef01cSRoman Divacky else if (CurTy->isX86_FP80Ty()) { 2192f22ef01cSRoman Divacky // Bits are not stored the same way as a normal i80 APInt, compensate. 2193f22ef01cSRoman Divacky uint64_t Rearrange[2]; 2194f22ef01cSRoman Divacky Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); 2195f22ef01cSRoman Divacky Rearrange[1] = Record[0] >> 48; 2196139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, 2197139f7f9bSDimitry Andric APInt(80, Rearrange))); 2198f22ef01cSRoman Divacky } else if (CurTy->isFP128Ty()) 2199139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, 2200139f7f9bSDimitry Andric APInt(128, Record))); 2201f22ef01cSRoman Divacky else if (CurTy->isPPC_FP128Ty()) 2202139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, 2203139f7f9bSDimitry Andric APInt(128, Record))); 2204f22ef01cSRoman Divacky else 2205f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2206f22ef01cSRoman Divacky break; 2207f22ef01cSRoman Divacky } 2208f22ef01cSRoman Divacky 2209f22ef01cSRoman Divacky case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] 2210f22ef01cSRoman Divacky if (Record.empty()) 221139d628a0SDimitry Andric return Error("Invalid record"); 2212f22ef01cSRoman Divacky 2213f22ef01cSRoman Divacky unsigned Size = Record.size(); 2214dff0c46cSDimitry Andric SmallVector<Constant*, 16> Elts; 2215f22ef01cSRoman Divacky 22166122f3e6SDimitry Andric if (StructType *STy = dyn_cast<StructType>(CurTy)) { 2217f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2218f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], 2219f22ef01cSRoman Divacky STy->getElementType(i))); 2220f22ef01cSRoman Divacky V = ConstantStruct::get(STy, Elts); 22216122f3e6SDimitry Andric } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { 22226122f3e6SDimitry Andric Type *EltTy = ATy->getElementType(); 2223f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2224f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2225f22ef01cSRoman Divacky V = ConstantArray::get(ATy, Elts); 22266122f3e6SDimitry Andric } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { 22276122f3e6SDimitry Andric Type *EltTy = VTy->getElementType(); 2228f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2229f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2230f22ef01cSRoman Divacky V = ConstantVector::get(Elts); 2231f22ef01cSRoman Divacky } else { 2232f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2233f22ef01cSRoman Divacky } 2234f22ef01cSRoman Divacky break; 2235f22ef01cSRoman Divacky } 2236dff0c46cSDimitry Andric case bitc::CST_CODE_STRING: // STRING: [values] 2237f22ef01cSRoman Divacky case bitc::CST_CODE_CSTRING: { // CSTRING: [values] 2238f22ef01cSRoman Divacky if (Record.empty()) 223939d628a0SDimitry Andric return Error("Invalid record"); 2240f22ef01cSRoman Divacky 22417ae0e2c9SDimitry Andric SmallString<16> Elts(Record.begin(), Record.end()); 2242dff0c46cSDimitry Andric V = ConstantDataArray::getString(Context, Elts, 2243dff0c46cSDimitry Andric BitCode == bitc::CST_CODE_CSTRING); 2244f22ef01cSRoman Divacky break; 2245f22ef01cSRoman Divacky } 2246dff0c46cSDimitry Andric case bitc::CST_CODE_DATA: {// DATA: [n x value] 2247dff0c46cSDimitry Andric if (Record.empty()) 224839d628a0SDimitry Andric return Error("Invalid record"); 2249dff0c46cSDimitry Andric 2250dff0c46cSDimitry Andric Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); 2251dff0c46cSDimitry Andric unsigned Size = Record.size(); 2252dff0c46cSDimitry Andric 2253dff0c46cSDimitry Andric if (EltTy->isIntegerTy(8)) { 2254dff0c46cSDimitry Andric SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); 2255dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2256dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2257dff0c46cSDimitry Andric else 2258dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2259dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(16)) { 2260dff0c46cSDimitry Andric SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end()); 2261dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2262dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2263dff0c46cSDimitry Andric else 2264dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2265dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(32)) { 2266dff0c46cSDimitry Andric SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end()); 2267dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2268dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2269dff0c46cSDimitry Andric else 2270dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2271dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(64)) { 2272dff0c46cSDimitry Andric SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end()); 2273dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2274dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2275dff0c46cSDimitry Andric else 2276dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2277dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 22787ae0e2c9SDimitry Andric SmallVector<float, 16> Elts(Size); 22797ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), BitsToFloat); 2280dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2281dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2282dff0c46cSDimitry Andric else 2283dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2284dff0c46cSDimitry Andric } else if (EltTy->isDoubleTy()) { 22857ae0e2c9SDimitry Andric SmallVector<double, 16> Elts(Size); 22867ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), 22877ae0e2c9SDimitry Andric BitsToDouble); 2288dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2289dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2290dff0c46cSDimitry Andric else 2291dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2292dff0c46cSDimitry Andric } else { 229339d628a0SDimitry Andric return Error("Invalid type for value"); 2294dff0c46cSDimitry Andric } 2295dff0c46cSDimitry Andric break; 2296dff0c46cSDimitry Andric } 2297dff0c46cSDimitry Andric 2298f22ef01cSRoman Divacky case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] 2299f785676fSDimitry Andric if (Record.size() < 3) 230039d628a0SDimitry Andric return Error("Invalid record"); 2301f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); 2302f22ef01cSRoman Divacky if (Opc < 0) { 2303f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown binop. 2304f22ef01cSRoman Divacky } else { 2305f22ef01cSRoman Divacky Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); 2306f22ef01cSRoman Divacky Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); 2307f22ef01cSRoman Divacky unsigned Flags = 0; 2308f22ef01cSRoman Divacky if (Record.size() >= 4) { 2309f22ef01cSRoman Divacky if (Opc == Instruction::Add || 2310f22ef01cSRoman Divacky Opc == Instruction::Sub || 23112754fe60SDimitry Andric Opc == Instruction::Mul || 23122754fe60SDimitry Andric Opc == Instruction::Shl) { 2313f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 2314f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoSignedWrap; 2315f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 2316f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoUnsignedWrap; 23172754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 23182754fe60SDimitry Andric Opc == Instruction::UDiv || 23192754fe60SDimitry Andric Opc == Instruction::LShr || 23202754fe60SDimitry Andric Opc == Instruction::AShr) { 23212754fe60SDimitry Andric if (Record[3] & (1 << bitc::PEO_EXACT)) 2322f22ef01cSRoman Divacky Flags |= SDivOperator::IsExact; 2323f22ef01cSRoman Divacky } 2324f22ef01cSRoman Divacky } 2325f22ef01cSRoman Divacky V = ConstantExpr::get(Opc, LHS, RHS, Flags); 2326f22ef01cSRoman Divacky } 2327f22ef01cSRoman Divacky break; 2328f22ef01cSRoman Divacky } 2329f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] 2330f785676fSDimitry Andric if (Record.size() < 3) 233139d628a0SDimitry Andric return Error("Invalid record"); 2332f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[0]); 2333f22ef01cSRoman Divacky if (Opc < 0) { 2334f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown cast. 2335f22ef01cSRoman Divacky } else { 23366122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 2337f785676fSDimitry Andric if (!OpTy) 233839d628a0SDimitry Andric return Error("Invalid record"); 2339f22ef01cSRoman Divacky Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); 2340f785676fSDimitry Andric V = UpgradeBitCastExpr(Opc, Op, CurTy); 2341f785676fSDimitry Andric if (!V) V = ConstantExpr::getCast(Opc, Op, CurTy); 2342f22ef01cSRoman Divacky } 2343f22ef01cSRoman Divacky break; 2344f22ef01cSRoman Divacky } 2345f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INBOUNDS_GEP: 2346f22ef01cSRoman Divacky case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] 2347ff0cc061SDimitry Andric unsigned OpNum = 0; 2348ff0cc061SDimitry Andric Type *PointeeType = nullptr; 2349ff0cc061SDimitry Andric if (Record.size() % 2) 2350ff0cc061SDimitry Andric PointeeType = getTypeByID(Record[OpNum++]); 2351f22ef01cSRoman Divacky SmallVector<Constant*, 16> Elts; 2352ff0cc061SDimitry Andric while (OpNum != Record.size()) { 2353ff0cc061SDimitry Andric Type *ElTy = getTypeByID(Record[OpNum++]); 2354f785676fSDimitry Andric if (!ElTy) 235539d628a0SDimitry Andric return Error("Invalid record"); 2356ff0cc061SDimitry Andric Elts.push_back(ValueList.getConstantFwdRef(Record[OpNum++], ElTy)); 2357f22ef01cSRoman Divacky } 2358ff0cc061SDimitry Andric 2359ff0cc061SDimitry Andric if (PointeeType && 2360ff0cc061SDimitry Andric PointeeType != 2361ff0cc061SDimitry Andric cast<SequentialType>(Elts[0]->getType()->getScalarType()) 2362ff0cc061SDimitry Andric ->getElementType()) 2363ff0cc061SDimitry Andric return Error("Explicit gep operator type does not match pointee type " 2364ff0cc061SDimitry Andric "of pointer operand"); 2365ff0cc061SDimitry Andric 23666122f3e6SDimitry Andric ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); 2367ff0cc061SDimitry Andric V = ConstantExpr::getGetElementPtr(PointeeType, Elts[0], Indices, 23686122f3e6SDimitry Andric BitCode == 23696122f3e6SDimitry Andric bitc::CST_CODE_CE_INBOUNDS_GEP); 2370f22ef01cSRoman Divacky break; 2371f22ef01cSRoman Divacky } 2372f785676fSDimitry Andric case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#] 2373f785676fSDimitry Andric if (Record.size() < 3) 237439d628a0SDimitry Andric return Error("Invalid record"); 2375f785676fSDimitry Andric 2376f785676fSDimitry Andric Type *SelectorTy = Type::getInt1Ty(Context); 2377f785676fSDimitry Andric 2378f785676fSDimitry Andric // If CurTy is a vector of length n, then Record[0] must be a <n x i1> 2379f785676fSDimitry Andric // vector. Otherwise, it must be a single bit. 2380f785676fSDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) 2381f785676fSDimitry Andric SelectorTy = VectorType::get(Type::getInt1Ty(Context), 2382f785676fSDimitry Andric VTy->getNumElements()); 2383f785676fSDimitry Andric 2384f785676fSDimitry Andric V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], 2385f785676fSDimitry Andric SelectorTy), 2386f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[1],CurTy), 2387f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[2],CurTy)); 2388f22ef01cSRoman Divacky break; 2389f785676fSDimitry Andric } 239091bc56edSDimitry Andric case bitc::CST_CODE_CE_EXTRACTELT 239191bc56edSDimitry Andric : { // CE_EXTRACTELT: [opty, opval, opty, opval] 2392f785676fSDimitry Andric if (Record.size() < 3) 239339d628a0SDimitry Andric return Error("Invalid record"); 23946122f3e6SDimitry Andric VectorType *OpTy = 2395f22ef01cSRoman Divacky dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 239691bc56edSDimitry Andric if (!OpTy) 239739d628a0SDimitry Andric return Error("Invalid record"); 2398f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 239991bc56edSDimitry Andric Constant *Op1 = nullptr; 240091bc56edSDimitry Andric if (Record.size() == 4) { 240191bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 240291bc56edSDimitry Andric if (!IdxTy) 240339d628a0SDimitry Andric return Error("Invalid record"); 240491bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[3], IdxTy); 240591bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 240691bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 240791bc56edSDimitry Andric if (!Op1) 240839d628a0SDimitry Andric return Error("Invalid record"); 2409f22ef01cSRoman Divacky V = ConstantExpr::getExtractElement(Op0, Op1); 2410f22ef01cSRoman Divacky break; 2411f22ef01cSRoman Divacky } 241291bc56edSDimitry Andric case bitc::CST_CODE_CE_INSERTELT 241391bc56edSDimitry Andric : { // CE_INSERTELT: [opval, opval, opty, opval] 24146122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 241591bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 241639d628a0SDimitry Andric return Error("Invalid record"); 2417f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2418f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], 2419f22ef01cSRoman Divacky OpTy->getElementType()); 242091bc56edSDimitry Andric Constant *Op2 = nullptr; 242191bc56edSDimitry Andric if (Record.size() == 4) { 242291bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 242391bc56edSDimitry Andric if (!IdxTy) 242439d628a0SDimitry Andric return Error("Invalid record"); 242591bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[3], IdxTy); 242691bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 242791bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 242891bc56edSDimitry Andric if (!Op2) 242939d628a0SDimitry Andric return Error("Invalid record"); 2430f22ef01cSRoman Divacky V = ConstantExpr::getInsertElement(Op0, Op1, Op2); 2431f22ef01cSRoman Divacky break; 2432f22ef01cSRoman Divacky } 2433f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] 24346122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 243591bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 243639d628a0SDimitry Andric return Error("Invalid record"); 2437f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2438f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); 24396122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2440f22ef01cSRoman Divacky OpTy->getNumElements()); 2441f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); 2442f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2443f22ef01cSRoman Divacky break; 2444f22ef01cSRoman Divacky } 2445f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] 24466122f3e6SDimitry Andric VectorType *RTy = dyn_cast<VectorType>(CurTy); 24476122f3e6SDimitry Andric VectorType *OpTy = 24482754fe60SDimitry Andric dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 244991bc56edSDimitry Andric if (Record.size() < 4 || !RTy || !OpTy) 245039d628a0SDimitry Andric return Error("Invalid record"); 2451f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2452f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 24536122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2454f22ef01cSRoman Divacky RTy->getNumElements()); 2455f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); 2456f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2457f22ef01cSRoman Divacky break; 2458f22ef01cSRoman Divacky } 2459f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] 2460f785676fSDimitry Andric if (Record.size() < 4) 246139d628a0SDimitry Andric return Error("Invalid record"); 24626122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 246391bc56edSDimitry Andric if (!OpTy) 246439d628a0SDimitry Andric return Error("Invalid record"); 2465f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2466f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 2467f22ef01cSRoman Divacky 2468f22ef01cSRoman Divacky if (OpTy->isFPOrFPVectorTy()) 2469f22ef01cSRoman Divacky V = ConstantExpr::getFCmp(Record[3], Op0, Op1); 2470f22ef01cSRoman Divacky else 2471f22ef01cSRoman Divacky V = ConstantExpr::getICmp(Record[3], Op0, Op1); 2472f22ef01cSRoman Divacky break; 2473f22ef01cSRoman Divacky } 24743861d79fSDimitry Andric // This maintains backward compatibility, pre-asm dialect keywords. 24753861d79fSDimitry Andric // FIXME: Remove with the 4.0 release. 24763861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM_OLD: { 2477f785676fSDimitry Andric if (Record.size() < 2) 247839d628a0SDimitry Andric return Error("Invalid record"); 2479f22ef01cSRoman Divacky std::string AsmStr, ConstrStr; 2480f22ef01cSRoman Divacky bool HasSideEffects = Record[0] & 1; 2481f22ef01cSRoman Divacky bool IsAlignStack = Record[0] >> 1; 2482f22ef01cSRoman Divacky unsigned AsmStrSize = Record[1]; 2483f22ef01cSRoman Divacky if (2+AsmStrSize >= Record.size()) 248439d628a0SDimitry Andric return Error("Invalid record"); 2485f22ef01cSRoman Divacky unsigned ConstStrSize = Record[2+AsmStrSize]; 2486f22ef01cSRoman Divacky if (3+AsmStrSize+ConstStrSize > Record.size()) 248739d628a0SDimitry Andric return Error("Invalid record"); 2488f22ef01cSRoman Divacky 2489f22ef01cSRoman Divacky for (unsigned i = 0; i != AsmStrSize; ++i) 2490f22ef01cSRoman Divacky AsmStr += (char)Record[2+i]; 2491f22ef01cSRoman Divacky for (unsigned i = 0; i != ConstStrSize; ++i) 2492f22ef01cSRoman Divacky ConstrStr += (char)Record[3+AsmStrSize+i]; 24936122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 2494f22ef01cSRoman Divacky V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 2495f22ef01cSRoman Divacky AsmStr, ConstrStr, HasSideEffects, IsAlignStack); 2496f22ef01cSRoman Divacky break; 2497f22ef01cSRoman Divacky } 24983861d79fSDimitry Andric // This version adds support for the asm dialect keywords (e.g., 24993861d79fSDimitry Andric // inteldialect). 25003861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM: { 2501f785676fSDimitry Andric if (Record.size() < 2) 250239d628a0SDimitry Andric return Error("Invalid record"); 25033861d79fSDimitry Andric std::string AsmStr, ConstrStr; 25043861d79fSDimitry Andric bool HasSideEffects = Record[0] & 1; 25053861d79fSDimitry Andric bool IsAlignStack = (Record[0] >> 1) & 1; 25063861d79fSDimitry Andric unsigned AsmDialect = Record[0] >> 2; 25073861d79fSDimitry Andric unsigned AsmStrSize = Record[1]; 25083861d79fSDimitry Andric if (2+AsmStrSize >= Record.size()) 250939d628a0SDimitry Andric return Error("Invalid record"); 25103861d79fSDimitry Andric unsigned ConstStrSize = Record[2+AsmStrSize]; 25113861d79fSDimitry Andric if (3+AsmStrSize+ConstStrSize > Record.size()) 251239d628a0SDimitry Andric return Error("Invalid record"); 25133861d79fSDimitry Andric 25143861d79fSDimitry Andric for (unsigned i = 0; i != AsmStrSize; ++i) 25153861d79fSDimitry Andric AsmStr += (char)Record[2+i]; 25163861d79fSDimitry Andric for (unsigned i = 0; i != ConstStrSize; ++i) 25173861d79fSDimitry Andric ConstrStr += (char)Record[3+AsmStrSize+i]; 25183861d79fSDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 25193861d79fSDimitry Andric V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 25203861d79fSDimitry Andric AsmStr, ConstrStr, HasSideEffects, IsAlignStack, 25213861d79fSDimitry Andric InlineAsm::AsmDialect(AsmDialect)); 25223861d79fSDimitry Andric break; 25233861d79fSDimitry Andric } 2524f22ef01cSRoman Divacky case bitc::CST_CODE_BLOCKADDRESS:{ 2525f785676fSDimitry Andric if (Record.size() < 3) 252639d628a0SDimitry Andric return Error("Invalid record"); 25276122f3e6SDimitry Andric Type *FnTy = getTypeByID(Record[0]); 252891bc56edSDimitry Andric if (!FnTy) 252939d628a0SDimitry Andric return Error("Invalid record"); 2530f22ef01cSRoman Divacky Function *Fn = 2531f22ef01cSRoman Divacky dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); 253291bc56edSDimitry Andric if (!Fn) 253339d628a0SDimitry Andric return Error("Invalid record"); 253439d628a0SDimitry Andric 253539d628a0SDimitry Andric // Don't let Fn get dematerialized. 253639d628a0SDimitry Andric BlockAddressesTaken.insert(Fn); 2537f22ef01cSRoman Divacky 25383861d79fSDimitry Andric // If the function is already parsed we can insert the block address right 25393861d79fSDimitry Andric // away. 254039d628a0SDimitry Andric BasicBlock *BB; 254139d628a0SDimitry Andric unsigned BBID = Record[2]; 254239d628a0SDimitry Andric if (!BBID) 254339d628a0SDimitry Andric // Invalid reference to entry block. 254439d628a0SDimitry Andric return Error("Invalid ID"); 25453861d79fSDimitry Andric if (!Fn->empty()) { 25463861d79fSDimitry Andric Function::iterator BBI = Fn->begin(), BBE = Fn->end(); 254739d628a0SDimitry Andric for (size_t I = 0, E = BBID; I != E; ++I) { 25483861d79fSDimitry Andric if (BBI == BBE) 254939d628a0SDimitry Andric return Error("Invalid ID"); 25503861d79fSDimitry Andric ++BBI; 25513861d79fSDimitry Andric } 255239d628a0SDimitry Andric BB = BBI; 25533861d79fSDimitry Andric } else { 25543861d79fSDimitry Andric // Otherwise insert a placeholder and remember it so it can be inserted 25553861d79fSDimitry Andric // when the function is parsed. 255639d628a0SDimitry Andric auto &FwdBBs = BasicBlockFwdRefs[Fn]; 255739d628a0SDimitry Andric if (FwdBBs.empty()) 255839d628a0SDimitry Andric BasicBlockFwdRefQueue.push_back(Fn); 255939d628a0SDimitry Andric if (FwdBBs.size() < BBID + 1) 256039d628a0SDimitry Andric FwdBBs.resize(BBID + 1); 256139d628a0SDimitry Andric if (!FwdBBs[BBID]) 256239d628a0SDimitry Andric FwdBBs[BBID] = BasicBlock::Create(Context); 256339d628a0SDimitry Andric BB = FwdBBs[BBID]; 25643861d79fSDimitry Andric } 256539d628a0SDimitry Andric V = BlockAddress::get(Fn, BB); 2566f22ef01cSRoman Divacky break; 2567f22ef01cSRoman Divacky } 2568f22ef01cSRoman Divacky } 2569f22ef01cSRoman Divacky 2570f22ef01cSRoman Divacky ValueList.AssignValue(V, NextCstNo); 2571f22ef01cSRoman Divacky ++NextCstNo; 2572f22ef01cSRoman Divacky } 2573f22ef01cSRoman Divacky } 2574f22ef01cSRoman Divacky 257591bc56edSDimitry Andric std::error_code BitcodeReader::ParseUseLists() { 2576dff0c46cSDimitry Andric if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) 257739d628a0SDimitry Andric return Error("Invalid record"); 2578dff0c46cSDimitry Andric 2579dff0c46cSDimitry Andric // Read all the records. 258039d628a0SDimitry Andric SmallVector<uint64_t, 64> Record; 2581dff0c46cSDimitry Andric while (1) { 2582139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2583139f7f9bSDimitry Andric 2584139f7f9bSDimitry Andric switch (Entry.Kind) { 2585139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2586139f7f9bSDimitry Andric case BitstreamEntry::Error: 258739d628a0SDimitry Andric return Error("Malformed block"); 2588139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 258991bc56edSDimitry Andric return std::error_code(); 2590139f7f9bSDimitry Andric case BitstreamEntry::Record: 2591139f7f9bSDimitry Andric // The interesting case. 2592139f7f9bSDimitry Andric break; 2593dff0c46cSDimitry Andric } 2594dff0c46cSDimitry Andric 2595dff0c46cSDimitry Andric // Read a use list record. 2596dff0c46cSDimitry Andric Record.clear(); 259739d628a0SDimitry Andric bool IsBB = false; 2598139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2599dff0c46cSDimitry Andric default: // Default behavior: unknown type. 2600dff0c46cSDimitry Andric break; 260139d628a0SDimitry Andric case bitc::USELIST_CODE_BB: 260239d628a0SDimitry Andric IsBB = true; 260339d628a0SDimitry Andric // fallthrough 260439d628a0SDimitry Andric case bitc::USELIST_CODE_DEFAULT: { 2605dff0c46cSDimitry Andric unsigned RecordLength = Record.size(); 260639d628a0SDimitry Andric if (RecordLength < 3) 260739d628a0SDimitry Andric // Records should have at least an ID and two indexes. 260839d628a0SDimitry Andric return Error("Invalid record"); 260939d628a0SDimitry Andric unsigned ID = Record.back(); 261039d628a0SDimitry Andric Record.pop_back(); 261139d628a0SDimitry Andric 261239d628a0SDimitry Andric Value *V; 261339d628a0SDimitry Andric if (IsBB) { 261439d628a0SDimitry Andric assert(ID < FunctionBBs.size() && "Basic block not found"); 261539d628a0SDimitry Andric V = FunctionBBs[ID]; 261639d628a0SDimitry Andric } else 261739d628a0SDimitry Andric V = ValueList[ID]; 261839d628a0SDimitry Andric unsigned NumUses = 0; 261939d628a0SDimitry Andric SmallDenseMap<const Use *, unsigned, 16> Order; 262039d628a0SDimitry Andric for (const Use &U : V->uses()) { 262139d628a0SDimitry Andric if (++NumUses > Record.size()) 262239d628a0SDimitry Andric break; 262339d628a0SDimitry Andric Order[&U] = Record[NumUses - 1]; 262439d628a0SDimitry Andric } 262539d628a0SDimitry Andric if (Order.size() != Record.size() || NumUses > Record.size()) 262639d628a0SDimitry Andric // Mismatches can happen if the functions are being materialized lazily 262739d628a0SDimitry Andric // (out-of-order), or a value has been upgraded. 262839d628a0SDimitry Andric break; 262939d628a0SDimitry Andric 263039d628a0SDimitry Andric V->sortUseList([&](const Use &L, const Use &R) { 263139d628a0SDimitry Andric return Order.lookup(&L) < Order.lookup(&R); 263239d628a0SDimitry Andric }); 2633dff0c46cSDimitry Andric break; 2634dff0c46cSDimitry Andric } 2635dff0c46cSDimitry Andric } 2636dff0c46cSDimitry Andric } 2637dff0c46cSDimitry Andric } 2638dff0c46cSDimitry Andric 2639ff0cc061SDimitry Andric /// When we see the block for metadata, remember where it is and then skip it. 2640ff0cc061SDimitry Andric /// This lets us lazily deserialize the metadata. 2641ff0cc061SDimitry Andric std::error_code BitcodeReader::rememberAndSkipMetadata() { 2642ff0cc061SDimitry Andric // Save the current stream state. 2643ff0cc061SDimitry Andric uint64_t CurBit = Stream.GetCurrentBitNo(); 2644ff0cc061SDimitry Andric DeferredMetadataInfo.push_back(CurBit); 2645ff0cc061SDimitry Andric 2646ff0cc061SDimitry Andric // Skip over the block for now. 2647ff0cc061SDimitry Andric if (Stream.SkipBlock()) 2648ff0cc061SDimitry Andric return Error("Invalid record"); 2649ff0cc061SDimitry Andric return std::error_code(); 2650ff0cc061SDimitry Andric } 2651ff0cc061SDimitry Andric 2652ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeMetadata() { 2653ff0cc061SDimitry Andric for (uint64_t BitPos : DeferredMetadataInfo) { 2654ff0cc061SDimitry Andric // Move the bit stream to the saved position. 2655ff0cc061SDimitry Andric Stream.JumpToBit(BitPos); 2656ff0cc061SDimitry Andric if (std::error_code EC = ParseMetadata()) 2657ff0cc061SDimitry Andric return EC; 2658ff0cc061SDimitry Andric } 2659ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 2660ff0cc061SDimitry Andric return std::error_code(); 2661ff0cc061SDimitry Andric } 2662ff0cc061SDimitry Andric 2663ff0cc061SDimitry Andric void BitcodeReader::setStripDebugInfo() { StripDebugInfo = true; } 2664ff0cc061SDimitry Andric 2665f22ef01cSRoman Divacky /// RememberAndSkipFunctionBody - When we see the block for a function body, 2666f22ef01cSRoman Divacky /// remember where it is and then skip it. This lets us lazily deserialize the 2667f22ef01cSRoman Divacky /// functions. 266891bc56edSDimitry Andric std::error_code BitcodeReader::RememberAndSkipFunctionBody() { 2669f22ef01cSRoman Divacky // Get the function we are talking about. 2670f22ef01cSRoman Divacky if (FunctionsWithBodies.empty()) 267139d628a0SDimitry Andric return Error("Insufficient function protos"); 2672f22ef01cSRoman Divacky 2673f22ef01cSRoman Divacky Function *Fn = FunctionsWithBodies.back(); 2674f22ef01cSRoman Divacky FunctionsWithBodies.pop_back(); 2675f22ef01cSRoman Divacky 2676f22ef01cSRoman Divacky // Save the current stream state. 2677f22ef01cSRoman Divacky uint64_t CurBit = Stream.GetCurrentBitNo(); 2678f22ef01cSRoman Divacky DeferredFunctionInfo[Fn] = CurBit; 2679f22ef01cSRoman Divacky 2680f22ef01cSRoman Divacky // Skip over the function block for now. 2681f22ef01cSRoman Divacky if (Stream.SkipBlock()) 268239d628a0SDimitry Andric return Error("Invalid record"); 268391bc56edSDimitry Andric return std::error_code(); 2684f22ef01cSRoman Divacky } 2685f22ef01cSRoman Divacky 268691bc56edSDimitry Andric std::error_code BitcodeReader::GlobalCleanup() { 2687f22ef01cSRoman Divacky // Patch the initializers for globals and aliases up. 2688f22ef01cSRoman Divacky ResolveGlobalAndAliasInits(); 2689f22ef01cSRoman Divacky if (!GlobalInits.empty() || !AliasInits.empty()) 269039d628a0SDimitry Andric return Error("Malformed global initializer set"); 2691f22ef01cSRoman Divacky 2692f22ef01cSRoman Divacky // Look for intrinsic functions which need to be upgraded at some point 2693f22ef01cSRoman Divacky for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); 2694f22ef01cSRoman Divacky FI != FE; ++FI) { 2695f22ef01cSRoman Divacky Function *NewFn; 2696f22ef01cSRoman Divacky if (UpgradeIntrinsicFunction(FI, NewFn)) 2697f22ef01cSRoman Divacky UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); 2698f22ef01cSRoman Divacky } 2699f22ef01cSRoman Divacky 2700e580952dSDimitry Andric // Look for global variables which need to be renamed. 2701e580952dSDimitry Andric for (Module::global_iterator 2702e580952dSDimitry Andric GI = TheModule->global_begin(), GE = TheModule->global_end(); 270391bc56edSDimitry Andric GI != GE;) { 270491bc56edSDimitry Andric GlobalVariable *GV = GI++; 270591bc56edSDimitry Andric UpgradeGlobalVariable(GV); 270691bc56edSDimitry Andric } 270791bc56edSDimitry Andric 2708f22ef01cSRoman Divacky // Force deallocation of memory for these vectors to favor the client that 2709f22ef01cSRoman Divacky // want lazy deserialization. 2710f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); 2711f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); 271291bc56edSDimitry Andric return std::error_code(); 2713f22ef01cSRoman Divacky } 2714f22ef01cSRoman Divacky 2715ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseModule(bool Resume, 2716ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 2717dff0c46cSDimitry Andric if (Resume) 2718dff0c46cSDimitry Andric Stream.JumpToBit(NextUnreadBit); 2719dff0c46cSDimitry Andric else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 272039d628a0SDimitry Andric return Error("Invalid record"); 2721dff0c46cSDimitry Andric 2722dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 2723dff0c46cSDimitry Andric std::vector<std::string> SectionTable; 2724dff0c46cSDimitry Andric std::vector<std::string> GCTable; 2725dff0c46cSDimitry Andric 2726dff0c46cSDimitry Andric // Read all the records for this module. 2727139f7f9bSDimitry Andric while (1) { 2728139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 2729dff0c46cSDimitry Andric 2730139f7f9bSDimitry Andric switch (Entry.Kind) { 2731139f7f9bSDimitry Andric case BitstreamEntry::Error: 273239d628a0SDimitry Andric return Error("Malformed block"); 2733139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2734dff0c46cSDimitry Andric return GlobalCleanup(); 2735dff0c46cSDimitry Andric 2736139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2737139f7f9bSDimitry Andric switch (Entry.ID) { 2738f22ef01cSRoman Divacky default: // Skip unknown content. 2739f22ef01cSRoman Divacky if (Stream.SkipBlock()) 274039d628a0SDimitry Andric return Error("Invalid record"); 2741f22ef01cSRoman Divacky break; 2742f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 2743f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 274439d628a0SDimitry Andric return Error("Malformed block"); 2745f22ef01cSRoman Divacky break; 2746f22ef01cSRoman Divacky case bitc::PARAMATTR_BLOCK_ID: 274791bc56edSDimitry Andric if (std::error_code EC = ParseAttributeBlock()) 2748f785676fSDimitry Andric return EC; 2749f22ef01cSRoman Divacky break; 2750139f7f9bSDimitry Andric case bitc::PARAMATTR_GROUP_BLOCK_ID: 275191bc56edSDimitry Andric if (std::error_code EC = ParseAttributeGroupBlock()) 2752f785676fSDimitry Andric return EC; 2753139f7f9bSDimitry Andric break; 275417a519f9SDimitry Andric case bitc::TYPE_BLOCK_ID_NEW: 275591bc56edSDimitry Andric if (std::error_code EC = ParseTypeTable()) 2756f785676fSDimitry Andric return EC; 2757f22ef01cSRoman Divacky break; 2758f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 275991bc56edSDimitry Andric if (std::error_code EC = ParseValueSymbolTable()) 2760f785676fSDimitry Andric return EC; 2761dff0c46cSDimitry Andric SeenValueSymbolTable = true; 2762f22ef01cSRoman Divacky break; 2763f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 276491bc56edSDimitry Andric if (std::error_code EC = ParseConstants()) 2765f785676fSDimitry Andric return EC; 276691bc56edSDimitry Andric if (std::error_code EC = ResolveGlobalAndAliasInits()) 2767f785676fSDimitry Andric return EC; 2768f22ef01cSRoman Divacky break; 2769f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 2770ff0cc061SDimitry Andric if (ShouldLazyLoadMetadata && !IsMetadataMaterialized) { 2771ff0cc061SDimitry Andric if (std::error_code EC = rememberAndSkipMetadata()) 2772ff0cc061SDimitry Andric return EC; 2773ff0cc061SDimitry Andric break; 2774ff0cc061SDimitry Andric } 2775ff0cc061SDimitry Andric assert(DeferredMetadataInfo.empty() && "Unexpected deferred metadata"); 277691bc56edSDimitry Andric if (std::error_code EC = ParseMetadata()) 2777f785676fSDimitry Andric return EC; 2778f22ef01cSRoman Divacky break; 2779f22ef01cSRoman Divacky case bitc::FUNCTION_BLOCK_ID: 2780f22ef01cSRoman Divacky // If this is the first function body we've seen, reverse the 2781f22ef01cSRoman Divacky // FunctionsWithBodies list. 2782dff0c46cSDimitry Andric if (!SeenFirstFunctionBody) { 2783f22ef01cSRoman Divacky std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); 278491bc56edSDimitry Andric if (std::error_code EC = GlobalCleanup()) 2785f785676fSDimitry Andric return EC; 2786dff0c46cSDimitry Andric SeenFirstFunctionBody = true; 2787f22ef01cSRoman Divacky } 2788f22ef01cSRoman Divacky 278991bc56edSDimitry Andric if (std::error_code EC = RememberAndSkipFunctionBody()) 2790f785676fSDimitry Andric return EC; 2791dff0c46cSDimitry Andric // For streaming bitcode, suspend parsing when we reach the function 2792dff0c46cSDimitry Andric // bodies. Subsequent materialization calls will resume it when 2793dff0c46cSDimitry Andric // necessary. For streaming, the function bodies must be at the end of 2794dff0c46cSDimitry Andric // the bitcode. If the bitcode file is old, the symbol table will be 2795dff0c46cSDimitry Andric // at the end instead and will not have been seen yet. In this case, 2796dff0c46cSDimitry Andric // just finish the parse now. 2797dff0c46cSDimitry Andric if (LazyStreamer && SeenValueSymbolTable) { 2798dff0c46cSDimitry Andric NextUnreadBit = Stream.GetCurrentBitNo(); 279991bc56edSDimitry Andric return std::error_code(); 2800dff0c46cSDimitry Andric } 2801dff0c46cSDimitry Andric break; 2802dff0c46cSDimitry Andric case bitc::USELIST_BLOCK_ID: 280391bc56edSDimitry Andric if (std::error_code EC = ParseUseLists()) 2804f785676fSDimitry Andric return EC; 2805f22ef01cSRoman Divacky break; 2806f22ef01cSRoman Divacky } 2807f22ef01cSRoman Divacky continue; 2808139f7f9bSDimitry Andric 2809139f7f9bSDimitry Andric case BitstreamEntry::Record: 2810139f7f9bSDimitry Andric // The interesting case. 2811139f7f9bSDimitry Andric break; 2812f22ef01cSRoman Divacky } 2813f22ef01cSRoman Divacky 2814f22ef01cSRoman Divacky 2815f22ef01cSRoman Divacky // Read a record. 2816139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2817f22ef01cSRoman Divacky default: break; // Default behavior, ignore unknown content. 28183861d79fSDimitry Andric case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] 2819f22ef01cSRoman Divacky if (Record.size() < 1) 282039d628a0SDimitry Andric return Error("Invalid record"); 28213861d79fSDimitry Andric // Only version #0 and #1 are supported so far. 28223861d79fSDimitry Andric unsigned module_version = Record[0]; 28233861d79fSDimitry Andric switch (module_version) { 2824f785676fSDimitry Andric default: 282539d628a0SDimitry Andric return Error("Invalid value"); 28263861d79fSDimitry Andric case 0: 28273861d79fSDimitry Andric UseRelativeIDs = false; 2828f22ef01cSRoman Divacky break; 28293861d79fSDimitry Andric case 1: 28303861d79fSDimitry Andric UseRelativeIDs = true; 28313861d79fSDimitry Andric break; 28323861d79fSDimitry Andric } 28333861d79fSDimitry Andric break; 28343861d79fSDimitry Andric } 2835f22ef01cSRoman Divacky case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 2836f22ef01cSRoman Divacky std::string S; 2837f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 283839d628a0SDimitry Andric return Error("Invalid record"); 2839f22ef01cSRoman Divacky TheModule->setTargetTriple(S); 2840f22ef01cSRoman Divacky break; 2841f22ef01cSRoman Divacky } 2842f22ef01cSRoman Divacky case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] 2843f22ef01cSRoman Divacky std::string S; 2844f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 284539d628a0SDimitry Andric return Error("Invalid record"); 2846f22ef01cSRoman Divacky TheModule->setDataLayout(S); 2847f22ef01cSRoman Divacky break; 2848f22ef01cSRoman Divacky } 2849f22ef01cSRoman Divacky case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] 2850f22ef01cSRoman Divacky std::string S; 2851f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 285239d628a0SDimitry Andric return Error("Invalid record"); 2853f22ef01cSRoman Divacky TheModule->setModuleInlineAsm(S); 2854f22ef01cSRoman Divacky break; 2855f22ef01cSRoman Divacky } 2856f22ef01cSRoman Divacky case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] 2857139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 2858f22ef01cSRoman Divacky std::string S; 2859f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 286039d628a0SDimitry Andric return Error("Invalid record"); 2861139f7f9bSDimitry Andric // Ignore value. 2862f22ef01cSRoman Divacky break; 2863f22ef01cSRoman Divacky } 2864f22ef01cSRoman Divacky case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] 2865f22ef01cSRoman Divacky std::string S; 2866f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 286739d628a0SDimitry Andric return Error("Invalid record"); 2868f22ef01cSRoman Divacky SectionTable.push_back(S); 2869f22ef01cSRoman Divacky break; 2870f22ef01cSRoman Divacky } 2871f22ef01cSRoman Divacky case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] 2872f22ef01cSRoman Divacky std::string S; 2873f22ef01cSRoman Divacky if (ConvertToString(Record, 0, S)) 287439d628a0SDimitry Andric return Error("Invalid record"); 2875f22ef01cSRoman Divacky GCTable.push_back(S); 2876f22ef01cSRoman Divacky break; 2877f22ef01cSRoman Divacky } 287891bc56edSDimitry Andric case bitc::MODULE_CODE_COMDAT: { // COMDAT: [selection_kind, name] 287991bc56edSDimitry Andric if (Record.size() < 2) 288039d628a0SDimitry Andric return Error("Invalid record"); 288191bc56edSDimitry Andric Comdat::SelectionKind SK = getDecodedComdatSelectionKind(Record[0]); 288291bc56edSDimitry Andric unsigned ComdatNameSize = Record[1]; 288391bc56edSDimitry Andric std::string ComdatName; 288491bc56edSDimitry Andric ComdatName.reserve(ComdatNameSize); 288591bc56edSDimitry Andric for (unsigned i = 0; i != ComdatNameSize; ++i) 288691bc56edSDimitry Andric ComdatName += (char)Record[2 + i]; 288791bc56edSDimitry Andric Comdat *C = TheModule->getOrInsertComdat(ComdatName); 288891bc56edSDimitry Andric C->setSelectionKind(SK); 288991bc56edSDimitry Andric ComdatList.push_back(C); 289091bc56edSDimitry Andric break; 289191bc56edSDimitry Andric } 2892f22ef01cSRoman Divacky // GLOBALVAR: [pointer type, isconst, initid, 28932754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 2894ff0cc061SDimitry Andric // unnamed_addr, externally_initialized, dllstorageclass, 2895ff0cc061SDimitry Andric // comdat] 2896f22ef01cSRoman Divacky case bitc::MODULE_CODE_GLOBALVAR: { 2897f22ef01cSRoman Divacky if (Record.size() < 6) 289839d628a0SDimitry Andric return Error("Invalid record"); 28996122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2900f785676fSDimitry Andric if (!Ty) 290139d628a0SDimitry Andric return Error("Invalid record"); 2902ff0cc061SDimitry Andric bool isConstant = Record[1] & 1; 2903ff0cc061SDimitry Andric bool explicitType = Record[1] & 2; 2904ff0cc061SDimitry Andric unsigned AddressSpace; 2905ff0cc061SDimitry Andric if (explicitType) { 2906ff0cc061SDimitry Andric AddressSpace = Record[1] >> 2; 2907ff0cc061SDimitry Andric } else { 2908f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 290939d628a0SDimitry Andric return Error("Invalid type for value"); 2910ff0cc061SDimitry Andric AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); 2911f22ef01cSRoman Divacky Ty = cast<PointerType>(Ty)->getElementType(); 2912ff0cc061SDimitry Andric } 2913f22ef01cSRoman Divacky 2914ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2915ff0cc061SDimitry Andric GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); 2916ff0cc061SDimitry Andric unsigned Alignment; 2917ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[4], Alignment)) 2918ff0cc061SDimitry Andric return EC; 2919f22ef01cSRoman Divacky std::string Section; 2920f22ef01cSRoman Divacky if (Record[5]) { 2921f22ef01cSRoman Divacky if (Record[5]-1 >= SectionTable.size()) 292239d628a0SDimitry Andric return Error("Invalid ID"); 2923f22ef01cSRoman Divacky Section = SectionTable[Record[5]-1]; 2924f22ef01cSRoman Divacky } 2925f22ef01cSRoman Divacky GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 292691bc56edSDimitry Andric // Local linkage must have default visibility. 292791bc56edSDimitry Andric if (Record.size() > 6 && !GlobalValue::isLocalLinkage(Linkage)) 292891bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 2929f22ef01cSRoman Divacky Visibility = GetDecodedVisibility(Record[6]); 29307ae0e2c9SDimitry Andric 29317ae0e2c9SDimitry Andric GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; 2932f22ef01cSRoman Divacky if (Record.size() > 7) 29337ae0e2c9SDimitry Andric TLM = GetDecodedThreadLocalMode(Record[7]); 2934f22ef01cSRoman Divacky 29352754fe60SDimitry Andric bool UnnamedAddr = false; 29362754fe60SDimitry Andric if (Record.size() > 8) 29372754fe60SDimitry Andric UnnamedAddr = Record[8]; 29382754fe60SDimitry Andric 2939139f7f9bSDimitry Andric bool ExternallyInitialized = false; 2940139f7f9bSDimitry Andric if (Record.size() > 9) 2941139f7f9bSDimitry Andric ExternallyInitialized = Record[9]; 2942139f7f9bSDimitry Andric 2943f22ef01cSRoman Divacky GlobalVariable *NewGV = 294491bc56edSDimitry Andric new GlobalVariable(*TheModule, Ty, isConstant, Linkage, nullptr, "", nullptr, 2945139f7f9bSDimitry Andric TLM, AddressSpace, ExternallyInitialized); 2946f22ef01cSRoman Divacky NewGV->setAlignment(Alignment); 2947f22ef01cSRoman Divacky if (!Section.empty()) 2948f22ef01cSRoman Divacky NewGV->setSection(Section); 2949f22ef01cSRoman Divacky NewGV->setVisibility(Visibility); 29502754fe60SDimitry Andric NewGV->setUnnamedAddr(UnnamedAddr); 2951f22ef01cSRoman Divacky 295291bc56edSDimitry Andric if (Record.size() > 10) 295391bc56edSDimitry Andric NewGV->setDLLStorageClass(GetDecodedDLLStorageClass(Record[10])); 295491bc56edSDimitry Andric else 2955ff0cc061SDimitry Andric UpgradeDLLImportExportLinkage(NewGV, RawLinkage); 295691bc56edSDimitry Andric 2957f22ef01cSRoman Divacky ValueList.push_back(NewGV); 2958f22ef01cSRoman Divacky 2959f22ef01cSRoman Divacky // Remember which value to use for the global initializer. 2960f22ef01cSRoman Divacky if (unsigned InitID = Record[2]) 2961f22ef01cSRoman Divacky GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); 296291bc56edSDimitry Andric 2963ff0cc061SDimitry Andric if (Record.size() > 11) { 296491bc56edSDimitry Andric if (unsigned ComdatID = Record[11]) { 2965ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 2966ff0cc061SDimitry Andric return Error("Invalid global variable comdat ID"); 296791bc56edSDimitry Andric NewGV->setComdat(ComdatList[ComdatID - 1]); 296891bc56edSDimitry Andric } 2969ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 2970ff0cc061SDimitry Andric NewGV->setComdat(reinterpret_cast<Comdat *>(1)); 2971ff0cc061SDimitry Andric } 2972f22ef01cSRoman Divacky break; 2973f22ef01cSRoman Divacky } 2974f22ef01cSRoman Divacky // FUNCTION: [type, callingconv, isproto, linkage, paramattr, 297591bc56edSDimitry Andric // alignment, section, visibility, gc, unnamed_addr, 297639d628a0SDimitry Andric // prologuedata, dllstorageclass, comdat, prefixdata] 2977f22ef01cSRoman Divacky case bitc::MODULE_CODE_FUNCTION: { 2978f22ef01cSRoman Divacky if (Record.size() < 8) 297939d628a0SDimitry Andric return Error("Invalid record"); 29806122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2981f785676fSDimitry Andric if (!Ty) 298239d628a0SDimitry Andric return Error("Invalid record"); 2983ff0cc061SDimitry Andric if (auto *PTy = dyn_cast<PointerType>(Ty)) 2984ff0cc061SDimitry Andric Ty = PTy->getElementType(); 2985ff0cc061SDimitry Andric auto *FTy = dyn_cast<FunctionType>(Ty); 2986f22ef01cSRoman Divacky if (!FTy) 298739d628a0SDimitry Andric return Error("Invalid type for value"); 2988f22ef01cSRoman Divacky 2989f22ef01cSRoman Divacky Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, 2990f22ef01cSRoman Divacky "", TheModule); 2991f22ef01cSRoman Divacky 2992f22ef01cSRoman Divacky Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); 2993f22ef01cSRoman Divacky bool isProto = Record[2]; 2994ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2995ff0cc061SDimitry Andric Func->setLinkage(getDecodedLinkage(RawLinkage)); 2996f22ef01cSRoman Divacky Func->setAttributes(getAttributes(Record[4])); 2997f22ef01cSRoman Divacky 2998ff0cc061SDimitry Andric unsigned Alignment; 2999ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[5], Alignment)) 3000ff0cc061SDimitry Andric return EC; 3001ff0cc061SDimitry Andric Func->setAlignment(Alignment); 3002f22ef01cSRoman Divacky if (Record[6]) { 3003f22ef01cSRoman Divacky if (Record[6]-1 >= SectionTable.size()) 300439d628a0SDimitry Andric return Error("Invalid ID"); 3005f22ef01cSRoman Divacky Func->setSection(SectionTable[Record[6]-1]); 3006f22ef01cSRoman Divacky } 300791bc56edSDimitry Andric // Local linkage must have default visibility. 300891bc56edSDimitry Andric if (!Func->hasLocalLinkage()) 300991bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 3010f22ef01cSRoman Divacky Func->setVisibility(GetDecodedVisibility(Record[7])); 3011f22ef01cSRoman Divacky if (Record.size() > 8 && Record[8]) { 3012ff0cc061SDimitry Andric if (Record[8]-1 >= GCTable.size()) 301339d628a0SDimitry Andric return Error("Invalid ID"); 3014f22ef01cSRoman Divacky Func->setGC(GCTable[Record[8]-1].c_str()); 3015f22ef01cSRoman Divacky } 30162754fe60SDimitry Andric bool UnnamedAddr = false; 30172754fe60SDimitry Andric if (Record.size() > 9) 30182754fe60SDimitry Andric UnnamedAddr = Record[9]; 30192754fe60SDimitry Andric Func->setUnnamedAddr(UnnamedAddr); 3020f785676fSDimitry Andric if (Record.size() > 10 && Record[10] != 0) 302139d628a0SDimitry Andric FunctionPrologues.push_back(std::make_pair(Func, Record[10]-1)); 302291bc56edSDimitry Andric 302391bc56edSDimitry Andric if (Record.size() > 11) 302491bc56edSDimitry Andric Func->setDLLStorageClass(GetDecodedDLLStorageClass(Record[11])); 302591bc56edSDimitry Andric else 3026ff0cc061SDimitry Andric UpgradeDLLImportExportLinkage(Func, RawLinkage); 302791bc56edSDimitry Andric 3028ff0cc061SDimitry Andric if (Record.size() > 12) { 302991bc56edSDimitry Andric if (unsigned ComdatID = Record[12]) { 3030ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 3031ff0cc061SDimitry Andric return Error("Invalid function comdat ID"); 303291bc56edSDimitry Andric Func->setComdat(ComdatList[ComdatID - 1]); 303391bc56edSDimitry Andric } 3034ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 3035ff0cc061SDimitry Andric Func->setComdat(reinterpret_cast<Comdat *>(1)); 3036ff0cc061SDimitry Andric } 303791bc56edSDimitry Andric 303839d628a0SDimitry Andric if (Record.size() > 13 && Record[13] != 0) 303939d628a0SDimitry Andric FunctionPrefixes.push_back(std::make_pair(Func, Record[13]-1)); 304039d628a0SDimitry Andric 3041f22ef01cSRoman Divacky ValueList.push_back(Func); 3042f22ef01cSRoman Divacky 3043f22ef01cSRoman Divacky // If this is a function with a body, remember the prototype we are 3044f22ef01cSRoman Divacky // creating now, so that we can match up the body with them later. 3045dff0c46cSDimitry Andric if (!isProto) { 304639d628a0SDimitry Andric Func->setIsMaterializable(true); 3047f22ef01cSRoman Divacky FunctionsWithBodies.push_back(Func); 304839d628a0SDimitry Andric if (LazyStreamer) 304939d628a0SDimitry Andric DeferredFunctionInfo[Func] = 0; 3050dff0c46cSDimitry Andric } 3051f22ef01cSRoman Divacky break; 3052f22ef01cSRoman Divacky } 3053f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage] 305491bc56edSDimitry Andric // ALIAS: [alias type, aliasee val#, linkage, visibility, dllstorageclass] 3055f22ef01cSRoman Divacky case bitc::MODULE_CODE_ALIAS: { 3056f22ef01cSRoman Divacky if (Record.size() < 3) 305739d628a0SDimitry Andric return Error("Invalid record"); 30586122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3059f785676fSDimitry Andric if (!Ty) 306039d628a0SDimitry Andric return Error("Invalid record"); 306191bc56edSDimitry Andric auto *PTy = dyn_cast<PointerType>(Ty); 306291bc56edSDimitry Andric if (!PTy) 306339d628a0SDimitry Andric return Error("Invalid type for value"); 3064f22ef01cSRoman Divacky 306591bc56edSDimitry Andric auto *NewGA = 3066ff0cc061SDimitry Andric GlobalAlias::create(PTy, getDecodedLinkage(Record[2]), "", TheModule); 3067f22ef01cSRoman Divacky // Old bitcode files didn't have visibility field. 306891bc56edSDimitry Andric // Local linkage must have default visibility. 306991bc56edSDimitry Andric if (Record.size() > 3 && !NewGA->hasLocalLinkage()) 307091bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 3071f22ef01cSRoman Divacky NewGA->setVisibility(GetDecodedVisibility(Record[3])); 307291bc56edSDimitry Andric if (Record.size() > 4) 307391bc56edSDimitry Andric NewGA->setDLLStorageClass(GetDecodedDLLStorageClass(Record[4])); 307491bc56edSDimitry Andric else 307591bc56edSDimitry Andric UpgradeDLLImportExportLinkage(NewGA, Record[2]); 307691bc56edSDimitry Andric if (Record.size() > 5) 307791bc56edSDimitry Andric NewGA->setThreadLocalMode(GetDecodedThreadLocalMode(Record[5])); 307891bc56edSDimitry Andric if (Record.size() > 6) 307991bc56edSDimitry Andric NewGA->setUnnamedAddr(Record[6]); 3080f22ef01cSRoman Divacky ValueList.push_back(NewGA); 3081f22ef01cSRoman Divacky AliasInits.push_back(std::make_pair(NewGA, Record[1])); 3082f22ef01cSRoman Divacky break; 3083f22ef01cSRoman Divacky } 3084f22ef01cSRoman Divacky /// MODULE_CODE_PURGEVALS: [numvals] 3085f22ef01cSRoman Divacky case bitc::MODULE_CODE_PURGEVALS: 3086f22ef01cSRoman Divacky // Trim down the value list to the specified size. 3087f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] > ValueList.size()) 308839d628a0SDimitry Andric return Error("Invalid record"); 3089f22ef01cSRoman Divacky ValueList.shrinkTo(Record[0]); 3090f22ef01cSRoman Divacky break; 3091f22ef01cSRoman Divacky } 3092f22ef01cSRoman Divacky Record.clear(); 3093f22ef01cSRoman Divacky } 3094f22ef01cSRoman Divacky } 3095f22ef01cSRoman Divacky 3096ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseBitcodeInto(Module *M, 3097ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 309891bc56edSDimitry Andric TheModule = nullptr; 3099f22ef01cSRoman Divacky 310091bc56edSDimitry Andric if (std::error_code EC = InitStream()) 3101f785676fSDimitry Andric return EC; 3102f22ef01cSRoman Divacky 3103f22ef01cSRoman Divacky // Sniff for the signature. 3104f22ef01cSRoman Divacky if (Stream.Read(8) != 'B' || 3105f22ef01cSRoman Divacky Stream.Read(8) != 'C' || 3106f22ef01cSRoman Divacky Stream.Read(4) != 0x0 || 3107f22ef01cSRoman Divacky Stream.Read(4) != 0xC || 3108f22ef01cSRoman Divacky Stream.Read(4) != 0xE || 3109f22ef01cSRoman Divacky Stream.Read(4) != 0xD) 311039d628a0SDimitry Andric return Error("Invalid bitcode signature"); 3111f22ef01cSRoman Divacky 3112f22ef01cSRoman Divacky // We expect a number of well-defined blocks, though we don't necessarily 3113f22ef01cSRoman Divacky // need to understand them all. 3114139f7f9bSDimitry Andric while (1) { 3115ff0cc061SDimitry Andric if (Stream.AtEndOfStream()) { 3116ff0cc061SDimitry Andric if (TheModule) 311791bc56edSDimitry Andric return std::error_code(); 3118ff0cc061SDimitry Andric // We didn't really read a proper Module. 3119ff0cc061SDimitry Andric return Error("Malformed IR file"); 3120ff0cc061SDimitry Andric } 3121bd5abe19SDimitry Andric 3122139f7f9bSDimitry Andric BitstreamEntry Entry = 3123139f7f9bSDimitry Andric Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); 3124f22ef01cSRoman Divacky 3125139f7f9bSDimitry Andric switch (Entry.Kind) { 3126139f7f9bSDimitry Andric case BitstreamEntry::Error: 312739d628a0SDimitry Andric return Error("Malformed block"); 3128139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 312991bc56edSDimitry Andric return std::error_code(); 3130f22ef01cSRoman Divacky 3131139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3132139f7f9bSDimitry Andric switch (Entry.ID) { 3133f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 3134f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 313539d628a0SDimitry Andric return Error("Malformed block"); 3136f22ef01cSRoman Divacky break; 3137f22ef01cSRoman Divacky case bitc::MODULE_BLOCK_ID: 3138f22ef01cSRoman Divacky // Reject multiple MODULE_BLOCK's in a single bitstream. 3139f22ef01cSRoman Divacky if (TheModule) 314039d628a0SDimitry Andric return Error("Invalid multiple blocks"); 3141f22ef01cSRoman Divacky TheModule = M; 3142ff0cc061SDimitry Andric if (std::error_code EC = ParseModule(false, ShouldLazyLoadMetadata)) 3143f785676fSDimitry Andric return EC; 3144f785676fSDimitry Andric if (LazyStreamer) 314591bc56edSDimitry Andric return std::error_code(); 3146f22ef01cSRoman Divacky break; 3147f22ef01cSRoman Divacky default: 3148f22ef01cSRoman Divacky if (Stream.SkipBlock()) 314939d628a0SDimitry Andric return Error("Invalid record"); 3150f22ef01cSRoman Divacky break; 3151f22ef01cSRoman Divacky } 3152139f7f9bSDimitry Andric continue; 3153139f7f9bSDimitry Andric case BitstreamEntry::Record: 3154139f7f9bSDimitry Andric // There should be no records in the top-level of blocks. 3155f22ef01cSRoman Divacky 3156139f7f9bSDimitry Andric // The ranlib in Xcode 4 will align archive members by appending newlines 3157139f7f9bSDimitry Andric // to the end of them. If this file size is a multiple of 4 but not 8, we 3158139f7f9bSDimitry Andric // have to read and ignore these final 4 bytes :-( 3159139f7f9bSDimitry Andric if (Stream.getAbbrevIDWidth() == 2 && Entry.ID == 2 && 3160139f7f9bSDimitry Andric Stream.Read(6) == 2 && Stream.Read(24) == 0xa0a0a && 3161139f7f9bSDimitry Andric Stream.AtEndOfStream()) 316291bc56edSDimitry Andric return std::error_code(); 3163139f7f9bSDimitry Andric 316439d628a0SDimitry Andric return Error("Invalid record"); 3165139f7f9bSDimitry Andric } 3166139f7f9bSDimitry Andric } 3167f22ef01cSRoman Divacky } 3168f22ef01cSRoman Divacky 316991bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseModuleTriple() { 31702754fe60SDimitry Andric if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 317139d628a0SDimitry Andric return Error("Invalid record"); 31722754fe60SDimitry Andric 31732754fe60SDimitry Andric SmallVector<uint64_t, 64> Record; 31742754fe60SDimitry Andric 317591bc56edSDimitry Andric std::string Triple; 31762754fe60SDimitry Andric // Read all the records for this module. 3177139f7f9bSDimitry Andric while (1) { 3178139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 31792754fe60SDimitry Andric 3180139f7f9bSDimitry Andric switch (Entry.Kind) { 3181139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3182139f7f9bSDimitry Andric case BitstreamEntry::Error: 318339d628a0SDimitry Andric return Error("Malformed block"); 3184139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 318591bc56edSDimitry Andric return Triple; 3186139f7f9bSDimitry Andric case BitstreamEntry::Record: 3187139f7f9bSDimitry Andric // The interesting case. 31882754fe60SDimitry Andric break; 31892754fe60SDimitry Andric } 31902754fe60SDimitry Andric 31912754fe60SDimitry Andric // Read a record. 3192139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 31932754fe60SDimitry Andric default: break; // Default behavior, ignore unknown content. 31942754fe60SDimitry Andric case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 31952754fe60SDimitry Andric std::string S; 31962754fe60SDimitry Andric if (ConvertToString(Record, 0, S)) 319739d628a0SDimitry Andric return Error("Invalid record"); 31982754fe60SDimitry Andric Triple = S; 31992754fe60SDimitry Andric break; 32002754fe60SDimitry Andric } 32012754fe60SDimitry Andric } 32022754fe60SDimitry Andric Record.clear(); 32032754fe60SDimitry Andric } 320491bc56edSDimitry Andric llvm_unreachable("Exit infinite loop"); 32052754fe60SDimitry Andric } 32062754fe60SDimitry Andric 320791bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseTriple() { 320891bc56edSDimitry Andric if (std::error_code EC = InitStream()) 3209f785676fSDimitry Andric return EC; 32102754fe60SDimitry Andric 32112754fe60SDimitry Andric // Sniff for the signature. 32122754fe60SDimitry Andric if (Stream.Read(8) != 'B' || 32132754fe60SDimitry Andric Stream.Read(8) != 'C' || 32142754fe60SDimitry Andric Stream.Read(4) != 0x0 || 32152754fe60SDimitry Andric Stream.Read(4) != 0xC || 32162754fe60SDimitry Andric Stream.Read(4) != 0xE || 32172754fe60SDimitry Andric Stream.Read(4) != 0xD) 321839d628a0SDimitry Andric return Error("Invalid bitcode signature"); 32192754fe60SDimitry Andric 32202754fe60SDimitry Andric // We expect a number of well-defined blocks, though we don't necessarily 32212754fe60SDimitry Andric // need to understand them all. 3222139f7f9bSDimitry Andric while (1) { 3223139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 32242754fe60SDimitry Andric 3225139f7f9bSDimitry Andric switch (Entry.Kind) { 3226139f7f9bSDimitry Andric case BitstreamEntry::Error: 322739d628a0SDimitry Andric return Error("Malformed block"); 3228139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 322991bc56edSDimitry Andric return std::error_code(); 3230139f7f9bSDimitry Andric 3231139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3232139f7f9bSDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 323391bc56edSDimitry Andric return parseModuleTriple(); 3234139f7f9bSDimitry Andric 3235139f7f9bSDimitry Andric // Ignore other sub-blocks. 3236f785676fSDimitry Andric if (Stream.SkipBlock()) 323739d628a0SDimitry Andric return Error("Malformed block"); 3238139f7f9bSDimitry Andric continue; 3239139f7f9bSDimitry Andric 3240139f7f9bSDimitry Andric case BitstreamEntry::Record: 3241139f7f9bSDimitry Andric Stream.skipRecord(Entry.ID); 3242139f7f9bSDimitry Andric continue; 3243139f7f9bSDimitry Andric } 3244139f7f9bSDimitry Andric } 32452754fe60SDimitry Andric } 32462754fe60SDimitry Andric 3247f22ef01cSRoman Divacky /// ParseMetadataAttachment - Parse metadata attachments. 3248ff0cc061SDimitry Andric std::error_code BitcodeReader::ParseMetadataAttachment(Function &F) { 3249f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 325039d628a0SDimitry Andric return Error("Invalid record"); 3251f22ef01cSRoman Divacky 3252f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3253f22ef01cSRoman Divacky while (1) { 3254139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3255139f7f9bSDimitry Andric 3256139f7f9bSDimitry Andric switch (Entry.Kind) { 3257139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3258139f7f9bSDimitry Andric case BitstreamEntry::Error: 325939d628a0SDimitry Andric return Error("Malformed block"); 3260139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 326191bc56edSDimitry Andric return std::error_code(); 3262139f7f9bSDimitry Andric case BitstreamEntry::Record: 3263139f7f9bSDimitry Andric // The interesting case. 3264f22ef01cSRoman Divacky break; 3265f22ef01cSRoman Divacky } 3266139f7f9bSDimitry Andric 3267f22ef01cSRoman Divacky // Read a metadata attachment record. 3268f22ef01cSRoman Divacky Record.clear(); 3269139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 3270f22ef01cSRoman Divacky default: // Default behavior: ignore. 3271f22ef01cSRoman Divacky break; 327217a519f9SDimitry Andric case bitc::METADATA_ATTACHMENT: { 3273f22ef01cSRoman Divacky unsigned RecordLength = Record.size(); 3274ff0cc061SDimitry Andric if (Record.empty()) 327539d628a0SDimitry Andric return Error("Invalid record"); 3276ff0cc061SDimitry Andric if (RecordLength % 2 == 0) { 3277ff0cc061SDimitry Andric // A function attachment. 3278ff0cc061SDimitry Andric for (unsigned I = 0; I != RecordLength; I += 2) { 3279ff0cc061SDimitry Andric auto K = MDKindMap.find(Record[I]); 3280ff0cc061SDimitry Andric if (K == MDKindMap.end()) 3281ff0cc061SDimitry Andric return Error("Invalid ID"); 3282ff0cc061SDimitry Andric Metadata *MD = MDValueList.getValueFwdRef(Record[I + 1]); 3283ff0cc061SDimitry Andric F.setMetadata(K->second, cast<MDNode>(MD)); 3284ff0cc061SDimitry Andric } 3285ff0cc061SDimitry Andric continue; 3286ff0cc061SDimitry Andric } 3287ff0cc061SDimitry Andric 3288ff0cc061SDimitry Andric // An instruction attachment. 3289f22ef01cSRoman Divacky Instruction *Inst = InstructionList[Record[0]]; 3290f22ef01cSRoman Divacky for (unsigned i = 1; i != RecordLength; i = i+2) { 3291f22ef01cSRoman Divacky unsigned Kind = Record[i]; 3292e580952dSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = 3293e580952dSDimitry Andric MDKindMap.find(Kind); 3294e580952dSDimitry Andric if (I == MDKindMap.end()) 329539d628a0SDimitry Andric return Error("Invalid ID"); 329639d628a0SDimitry Andric Metadata *Node = MDValueList.getValueFwdRef(Record[i + 1]); 329739d628a0SDimitry Andric if (isa<LocalAsMetadata>(Node)) 329839d628a0SDimitry Andric // Drop the attachment. This used to be legal, but there's no 329939d628a0SDimitry Andric // upgrade path. 330039d628a0SDimitry Andric break; 3301e580952dSDimitry Andric Inst->setMetadata(I->second, cast<MDNode>(Node)); 3302f785676fSDimitry Andric if (I->second == LLVMContext::MD_tbaa) 3303f785676fSDimitry Andric InstsWithTBAATag.push_back(Inst); 3304f22ef01cSRoman Divacky } 3305f22ef01cSRoman Divacky break; 3306f22ef01cSRoman Divacky } 3307f22ef01cSRoman Divacky } 3308f22ef01cSRoman Divacky } 3309f22ef01cSRoman Divacky } 3310f22ef01cSRoman Divacky 3311ff0cc061SDimitry Andric static std::error_code TypeCheckLoadStoreInst(DiagnosticHandlerFunction DH, 3312ff0cc061SDimitry Andric Type *ValType, Type *PtrType) { 3313ff0cc061SDimitry Andric if (!isa<PointerType>(PtrType)) 3314ff0cc061SDimitry Andric return Error(DH, "Load/Store operand is not a pointer type"); 3315ff0cc061SDimitry Andric Type *ElemType = cast<PointerType>(PtrType)->getElementType(); 3316ff0cc061SDimitry Andric 3317ff0cc061SDimitry Andric if (ValType && ValType != ElemType) 3318ff0cc061SDimitry Andric return Error(DH, "Explicit load/store type does not match pointee type of " 3319ff0cc061SDimitry Andric "pointer operand"); 3320ff0cc061SDimitry Andric if (!PointerType::isLoadableOrStorableType(ElemType)) 3321ff0cc061SDimitry Andric return Error(DH, "Cannot load/store from pointer"); 3322ff0cc061SDimitry Andric return std::error_code(); 3323ff0cc061SDimitry Andric } 3324ff0cc061SDimitry Andric 3325f22ef01cSRoman Divacky /// ParseFunctionBody - Lazily parse the specified function body block. 332691bc56edSDimitry Andric std::error_code BitcodeReader::ParseFunctionBody(Function *F) { 3327f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) 332839d628a0SDimitry Andric return Error("Invalid record"); 3329f22ef01cSRoman Divacky 3330f22ef01cSRoman Divacky InstructionList.clear(); 3331f22ef01cSRoman Divacky unsigned ModuleValueListSize = ValueList.size(); 3332e580952dSDimitry Andric unsigned ModuleMDValueListSize = MDValueList.size(); 3333f22ef01cSRoman Divacky 3334f22ef01cSRoman Divacky // Add all the function arguments to the value table. 3335f22ef01cSRoman Divacky for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) 3336f22ef01cSRoman Divacky ValueList.push_back(I); 3337f22ef01cSRoman Divacky 3338f22ef01cSRoman Divacky unsigned NextValueNo = ValueList.size(); 333991bc56edSDimitry Andric BasicBlock *CurBB = nullptr; 3340f22ef01cSRoman Divacky unsigned CurBBNo = 0; 3341f22ef01cSRoman Divacky 3342f22ef01cSRoman Divacky DebugLoc LastLoc; 334339d628a0SDimitry Andric auto getLastInstruction = [&]() -> Instruction * { 334439d628a0SDimitry Andric if (CurBB && !CurBB->empty()) 334539d628a0SDimitry Andric return &CurBB->back(); 334639d628a0SDimitry Andric else if (CurBBNo && FunctionBBs[CurBBNo - 1] && 334739d628a0SDimitry Andric !FunctionBBs[CurBBNo - 1]->empty()) 334839d628a0SDimitry Andric return &FunctionBBs[CurBBNo - 1]->back(); 334939d628a0SDimitry Andric return nullptr; 335039d628a0SDimitry Andric }; 3351f22ef01cSRoman Divacky 3352f22ef01cSRoman Divacky // Read all the records. 3353f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3354f22ef01cSRoman Divacky while (1) { 3355139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 3356f22ef01cSRoman Divacky 3357139f7f9bSDimitry Andric switch (Entry.Kind) { 3358139f7f9bSDimitry Andric case BitstreamEntry::Error: 335939d628a0SDimitry Andric return Error("Malformed block"); 3360139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 3361139f7f9bSDimitry Andric goto OutOfRecordLoop; 3362139f7f9bSDimitry Andric 3363139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3364139f7f9bSDimitry Andric switch (Entry.ID) { 3365f22ef01cSRoman Divacky default: // Skip unknown content. 3366f22ef01cSRoman Divacky if (Stream.SkipBlock()) 336739d628a0SDimitry Andric return Error("Invalid record"); 3368f22ef01cSRoman Divacky break; 3369f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 337091bc56edSDimitry Andric if (std::error_code EC = ParseConstants()) 3371f785676fSDimitry Andric return EC; 3372f22ef01cSRoman Divacky NextValueNo = ValueList.size(); 3373f22ef01cSRoman Divacky break; 3374f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 337591bc56edSDimitry Andric if (std::error_code EC = ParseValueSymbolTable()) 3376f785676fSDimitry Andric return EC; 3377f22ef01cSRoman Divacky break; 3378f22ef01cSRoman Divacky case bitc::METADATA_ATTACHMENT_ID: 3379ff0cc061SDimitry Andric if (std::error_code EC = ParseMetadataAttachment(*F)) 3380f785676fSDimitry Andric return EC; 3381f22ef01cSRoman Divacky break; 3382f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 338391bc56edSDimitry Andric if (std::error_code EC = ParseMetadata()) 3384f785676fSDimitry Andric return EC; 3385f22ef01cSRoman Divacky break; 338639d628a0SDimitry Andric case bitc::USELIST_BLOCK_ID: 338739d628a0SDimitry Andric if (std::error_code EC = ParseUseLists()) 338839d628a0SDimitry Andric return EC; 338939d628a0SDimitry Andric break; 3390f22ef01cSRoman Divacky } 3391f22ef01cSRoman Divacky continue; 3392f22ef01cSRoman Divacky 3393139f7f9bSDimitry Andric case BitstreamEntry::Record: 3394139f7f9bSDimitry Andric // The interesting case. 3395139f7f9bSDimitry Andric break; 3396f22ef01cSRoman Divacky } 3397f22ef01cSRoman Divacky 3398f22ef01cSRoman Divacky // Read a record. 3399f22ef01cSRoman Divacky Record.clear(); 340091bc56edSDimitry Andric Instruction *I = nullptr; 3401139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 3402f22ef01cSRoman Divacky switch (BitCode) { 3403f22ef01cSRoman Divacky default: // Default behavior: reject 340439d628a0SDimitry Andric return Error("Invalid value"); 340539d628a0SDimitry Andric case bitc::FUNC_CODE_DECLAREBLOCKS: { // DECLAREBLOCKS: [nblocks] 3406f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] == 0) 340739d628a0SDimitry Andric return Error("Invalid record"); 3408f22ef01cSRoman Divacky // Create all the basic blocks for the function. 3409f22ef01cSRoman Divacky FunctionBBs.resize(Record[0]); 341039d628a0SDimitry Andric 341139d628a0SDimitry Andric // See if anything took the address of blocks in this function. 341239d628a0SDimitry Andric auto BBFRI = BasicBlockFwdRefs.find(F); 341339d628a0SDimitry Andric if (BBFRI == BasicBlockFwdRefs.end()) { 3414f22ef01cSRoman Divacky for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) 3415f22ef01cSRoman Divacky FunctionBBs[i] = BasicBlock::Create(Context, "", F); 341639d628a0SDimitry Andric } else { 341739d628a0SDimitry Andric auto &BBRefs = BBFRI->second; 341839d628a0SDimitry Andric // Check for invalid basic block references. 341939d628a0SDimitry Andric if (BBRefs.size() > FunctionBBs.size()) 342039d628a0SDimitry Andric return Error("Invalid ID"); 342139d628a0SDimitry Andric assert(!BBRefs.empty() && "Unexpected empty array"); 342239d628a0SDimitry Andric assert(!BBRefs.front() && "Invalid reference to entry block"); 342339d628a0SDimitry Andric for (unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size(); I != E; 342439d628a0SDimitry Andric ++I) 342539d628a0SDimitry Andric if (I < RE && BBRefs[I]) { 342639d628a0SDimitry Andric BBRefs[I]->insertInto(F); 342739d628a0SDimitry Andric FunctionBBs[I] = BBRefs[I]; 342839d628a0SDimitry Andric } else { 342939d628a0SDimitry Andric FunctionBBs[I] = BasicBlock::Create(Context, "", F); 343039d628a0SDimitry Andric } 343139d628a0SDimitry Andric 343239d628a0SDimitry Andric // Erase from the table. 343339d628a0SDimitry Andric BasicBlockFwdRefs.erase(BBFRI); 343439d628a0SDimitry Andric } 343539d628a0SDimitry Andric 3436f22ef01cSRoman Divacky CurBB = FunctionBBs[0]; 3437f22ef01cSRoman Divacky continue; 343839d628a0SDimitry Andric } 3439f22ef01cSRoman Divacky 3440f22ef01cSRoman Divacky case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN 3441f22ef01cSRoman Divacky // This record indicates that the last instruction is at the same 3442f22ef01cSRoman Divacky // location as the previous instruction with a location. 344339d628a0SDimitry Andric I = getLastInstruction(); 3444f22ef01cSRoman Divacky 344591bc56edSDimitry Andric if (!I) 344639d628a0SDimitry Andric return Error("Invalid record"); 3447f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 344891bc56edSDimitry Andric I = nullptr; 3449f22ef01cSRoman Divacky continue; 3450f22ef01cSRoman Divacky 345117a519f9SDimitry Andric case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] 345239d628a0SDimitry Andric I = getLastInstruction(); 345391bc56edSDimitry Andric if (!I || Record.size() < 4) 345439d628a0SDimitry Andric return Error("Invalid record"); 3455f22ef01cSRoman Divacky 3456f22ef01cSRoman Divacky unsigned Line = Record[0], Col = Record[1]; 3457f22ef01cSRoman Divacky unsigned ScopeID = Record[2], IAID = Record[3]; 3458f22ef01cSRoman Divacky 345991bc56edSDimitry Andric MDNode *Scope = nullptr, *IA = nullptr; 3460f22ef01cSRoman Divacky if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); 3461f22ef01cSRoman Divacky if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); 3462f22ef01cSRoman Divacky LastLoc = DebugLoc::get(Line, Col, Scope, IA); 3463f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 346491bc56edSDimitry Andric I = nullptr; 3465f22ef01cSRoman Divacky continue; 3466f22ef01cSRoman Divacky } 3467f22ef01cSRoman Divacky 3468f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] 3469f22ef01cSRoman Divacky unsigned OpNum = 0; 3470f22ef01cSRoman Divacky Value *LHS, *RHS; 3471f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 34723861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3473f22ef01cSRoman Divacky OpNum+1 > Record.size()) 347439d628a0SDimitry Andric return Error("Invalid record"); 3475f22ef01cSRoman Divacky 3476f22ef01cSRoman Divacky int Opc = GetDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); 3477f785676fSDimitry Andric if (Opc == -1) 347839d628a0SDimitry Andric return Error("Invalid record"); 3479f22ef01cSRoman Divacky I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); 3480f22ef01cSRoman Divacky InstructionList.push_back(I); 3481f22ef01cSRoman Divacky if (OpNum < Record.size()) { 3482f22ef01cSRoman Divacky if (Opc == Instruction::Add || 3483f22ef01cSRoman Divacky Opc == Instruction::Sub || 34842754fe60SDimitry Andric Opc == Instruction::Mul || 34852754fe60SDimitry Andric Opc == Instruction::Shl) { 3486f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 3487f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoSignedWrap(true); 3488f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 3489f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); 34902754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 34912754fe60SDimitry Andric Opc == Instruction::UDiv || 34922754fe60SDimitry Andric Opc == Instruction::LShr || 34932754fe60SDimitry Andric Opc == Instruction::AShr) { 34942754fe60SDimitry Andric if (Record[OpNum] & (1 << bitc::PEO_EXACT)) 3495f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setIsExact(true); 3496139f7f9bSDimitry Andric } else if (isa<FPMathOperator>(I)) { 3497139f7f9bSDimitry Andric FastMathFlags FMF; 3498139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) 3499139f7f9bSDimitry Andric FMF.setUnsafeAlgebra(); 3500139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) 3501139f7f9bSDimitry Andric FMF.setNoNaNs(); 3502139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) 3503139f7f9bSDimitry Andric FMF.setNoInfs(); 3504139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) 3505139f7f9bSDimitry Andric FMF.setNoSignedZeros(); 3506139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) 3507139f7f9bSDimitry Andric FMF.setAllowReciprocal(); 3508139f7f9bSDimitry Andric if (FMF.any()) 3509139f7f9bSDimitry Andric I->setFastMathFlags(FMF); 3510f22ef01cSRoman Divacky } 3511139f7f9bSDimitry Andric 3512f22ef01cSRoman Divacky } 3513f22ef01cSRoman Divacky break; 3514f22ef01cSRoman Divacky } 3515f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] 3516f22ef01cSRoman Divacky unsigned OpNum = 0; 3517f22ef01cSRoman Divacky Value *Op; 3518f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 3519f22ef01cSRoman Divacky OpNum+2 != Record.size()) 352039d628a0SDimitry Andric return Error("Invalid record"); 3521f22ef01cSRoman Divacky 35226122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[OpNum]); 3523f22ef01cSRoman Divacky int Opc = GetDecodedCastOpcode(Record[OpNum+1]); 352491bc56edSDimitry Andric if (Opc == -1 || !ResTy) 352539d628a0SDimitry Andric return Error("Invalid record"); 352691bc56edSDimitry Andric Instruction *Temp = nullptr; 3527f785676fSDimitry Andric if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) { 3528f785676fSDimitry Andric if (Temp) { 3529f785676fSDimitry Andric InstructionList.push_back(Temp); 3530f785676fSDimitry Andric CurBB->getInstList().push_back(Temp); 3531f785676fSDimitry Andric } 3532f785676fSDimitry Andric } else { 3533f22ef01cSRoman Divacky I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); 3534f785676fSDimitry Andric } 3535f22ef01cSRoman Divacky InstructionList.push_back(I); 3536f22ef01cSRoman Divacky break; 3537f22ef01cSRoman Divacky } 3538ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD: 3539ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP_OLD: 3540ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP: { // GEP: type, [n x operands] 3541f22ef01cSRoman Divacky unsigned OpNum = 0; 3542ff0cc061SDimitry Andric 3543ff0cc061SDimitry Andric Type *Ty; 3544ff0cc061SDimitry Andric bool InBounds; 3545ff0cc061SDimitry Andric 3546ff0cc061SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_GEP) { 3547ff0cc061SDimitry Andric InBounds = Record[OpNum++]; 3548ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 3549ff0cc061SDimitry Andric } else { 3550ff0cc061SDimitry Andric InBounds = BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD; 3551ff0cc061SDimitry Andric Ty = nullptr; 3552ff0cc061SDimitry Andric } 3553ff0cc061SDimitry Andric 3554f22ef01cSRoman Divacky Value *BasePtr; 3555f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) 355639d628a0SDimitry Andric return Error("Invalid record"); 3557f22ef01cSRoman Divacky 3558ff0cc061SDimitry Andric if (!Ty) 3559ff0cc061SDimitry Andric Ty = cast<SequentialType>(BasePtr->getType()->getScalarType()) 3560ff0cc061SDimitry Andric ->getElementType(); 3561ff0cc061SDimitry Andric else if (Ty != 3562ff0cc061SDimitry Andric cast<SequentialType>(BasePtr->getType()->getScalarType()) 3563ff0cc061SDimitry Andric ->getElementType()) 3564ff0cc061SDimitry Andric return Error( 3565ff0cc061SDimitry Andric "Explicit gep type does not match pointee type of pointer operand"); 3566ff0cc061SDimitry Andric 3567f22ef01cSRoman Divacky SmallVector<Value*, 16> GEPIdx; 3568f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3569f22ef01cSRoman Divacky Value *Op; 3570f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 357139d628a0SDimitry Andric return Error("Invalid record"); 3572f22ef01cSRoman Divacky GEPIdx.push_back(Op); 3573f22ef01cSRoman Divacky } 3574f22ef01cSRoman Divacky 3575ff0cc061SDimitry Andric I = GetElementPtrInst::Create(Ty, BasePtr, GEPIdx); 3576ff0cc061SDimitry Andric 3577f22ef01cSRoman Divacky InstructionList.push_back(I); 3578ff0cc061SDimitry Andric if (InBounds) 3579f22ef01cSRoman Divacky cast<GetElementPtrInst>(I)->setIsInBounds(true); 3580f22ef01cSRoman Divacky break; 3581f22ef01cSRoman Divacky } 3582f22ef01cSRoman Divacky 3583f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTVAL: { 3584f22ef01cSRoman Divacky // EXTRACTVAL: [opty, opval, n x indices] 3585f22ef01cSRoman Divacky unsigned OpNum = 0; 3586f22ef01cSRoman Divacky Value *Agg; 3587f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 358839d628a0SDimitry Andric return Error("Invalid record"); 3589f22ef01cSRoman Divacky 3590ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3591ff0cc061SDimitry Andric if (OpNum == RecSize) 3592ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid instruction with 0 indices"); 3593ff0cc061SDimitry Andric 3594f22ef01cSRoman Divacky SmallVector<unsigned, 4> EXTRACTVALIdx; 3595ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3596ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3597ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3598ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3599f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3600ff0cc061SDimitry Andric 3601ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 3602ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid type"); 3603f22ef01cSRoman Divacky if ((unsigned)Index != Index) 360439d628a0SDimitry Andric return Error("Invalid value"); 3605ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 3606ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid struct index"); 3607ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 3608ff0cc061SDimitry Andric return Error("EXTRACTVAL: Invalid array index"); 3609f22ef01cSRoman Divacky EXTRACTVALIdx.push_back((unsigned)Index); 3610ff0cc061SDimitry Andric 3611ff0cc061SDimitry Andric if (IsStruct) 3612ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3613ff0cc061SDimitry Andric else 3614ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3615f22ef01cSRoman Divacky } 3616f22ef01cSRoman Divacky 361717a519f9SDimitry Andric I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); 3618f22ef01cSRoman Divacky InstructionList.push_back(I); 3619f22ef01cSRoman Divacky break; 3620f22ef01cSRoman Divacky } 3621f22ef01cSRoman Divacky 3622f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTVAL: { 3623f22ef01cSRoman Divacky // INSERTVAL: [opty, opval, opty, opval, n x indices] 3624f22ef01cSRoman Divacky unsigned OpNum = 0; 3625f22ef01cSRoman Divacky Value *Agg; 3626f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 362739d628a0SDimitry Andric return Error("Invalid record"); 3628f22ef01cSRoman Divacky Value *Val; 3629f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Val)) 363039d628a0SDimitry Andric return Error("Invalid record"); 3631f22ef01cSRoman Divacky 3632ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3633ff0cc061SDimitry Andric if (OpNum == RecSize) 3634ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid instruction with 0 indices"); 3635ff0cc061SDimitry Andric 3636f22ef01cSRoman Divacky SmallVector<unsigned, 4> INSERTVALIdx; 3637ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3638ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3639ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3640ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3641f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3642ff0cc061SDimitry Andric 3643ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 3644ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid type"); 3645f22ef01cSRoman Divacky if ((unsigned)Index != Index) 364639d628a0SDimitry Andric return Error("Invalid value"); 3647ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 3648ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid struct index"); 3649ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 3650ff0cc061SDimitry Andric return Error("INSERTVAL: Invalid array index"); 3651ff0cc061SDimitry Andric 3652f22ef01cSRoman Divacky INSERTVALIdx.push_back((unsigned)Index); 3653ff0cc061SDimitry Andric if (IsStruct) 3654ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3655ff0cc061SDimitry Andric else 3656ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3657f22ef01cSRoman Divacky } 3658f22ef01cSRoman Divacky 3659ff0cc061SDimitry Andric if (CurTy != Val->getType()) 3660ff0cc061SDimitry Andric return Error("Inserted value type doesn't match aggregate type"); 3661ff0cc061SDimitry Andric 366217a519f9SDimitry Andric I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); 3663f22ef01cSRoman Divacky InstructionList.push_back(I); 3664f22ef01cSRoman Divacky break; 3665f22ef01cSRoman Divacky } 3666f22ef01cSRoman Divacky 3667f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] 3668f22ef01cSRoman Divacky // obsolete form of select 3669f22ef01cSRoman Divacky // handles select i1 ... in old bitcode 3670f22ef01cSRoman Divacky unsigned OpNum = 0; 3671f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3672f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36733861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 36743861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) 367539d628a0SDimitry Andric return Error("Invalid record"); 3676f22ef01cSRoman Divacky 3677f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3678f22ef01cSRoman Divacky InstructionList.push_back(I); 3679f22ef01cSRoman Divacky break; 3680f22ef01cSRoman Divacky } 3681f22ef01cSRoman Divacky 3682f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] 3683f22ef01cSRoman Divacky // new form of select 3684f22ef01cSRoman Divacky // handles select i1 or select [N x i1] 3685f22ef01cSRoman Divacky unsigned OpNum = 0; 3686f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3687f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36883861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 3689f22ef01cSRoman Divacky getValueTypePair(Record, OpNum, NextValueNo, Cond)) 369039d628a0SDimitry Andric return Error("Invalid record"); 3691f22ef01cSRoman Divacky 3692f22ef01cSRoman Divacky // select condition can be either i1 or [N x i1] 36936122f3e6SDimitry Andric if (VectorType* vector_type = 36946122f3e6SDimitry Andric dyn_cast<VectorType>(Cond->getType())) { 3695f22ef01cSRoman Divacky // expect <n x i1> 3696f22ef01cSRoman Divacky if (vector_type->getElementType() != Type::getInt1Ty(Context)) 369739d628a0SDimitry Andric return Error("Invalid type for value"); 3698f22ef01cSRoman Divacky } else { 3699f22ef01cSRoman Divacky // expect i1 3700f22ef01cSRoman Divacky if (Cond->getType() != Type::getInt1Ty(Context)) 370139d628a0SDimitry Andric return Error("Invalid type for value"); 3702f22ef01cSRoman Divacky } 3703f22ef01cSRoman Divacky 3704f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3705f22ef01cSRoman Divacky InstructionList.push_back(I); 3706f22ef01cSRoman Divacky break; 3707f22ef01cSRoman Divacky } 3708f22ef01cSRoman Divacky 3709f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] 3710f22ef01cSRoman Divacky unsigned OpNum = 0; 3711f22ef01cSRoman Divacky Value *Vec, *Idx; 3712f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 371391bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 371439d628a0SDimitry Andric return Error("Invalid record"); 3715ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 3716ff0cc061SDimitry Andric return Error("Invalid type for value"); 3717f22ef01cSRoman Divacky I = ExtractElementInst::Create(Vec, Idx); 3718f22ef01cSRoman Divacky InstructionList.push_back(I); 3719f22ef01cSRoman Divacky break; 3720f22ef01cSRoman Divacky } 3721f22ef01cSRoman Divacky 3722f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] 3723f22ef01cSRoman Divacky unsigned OpNum = 0; 3724f22ef01cSRoman Divacky Value *Vec, *Elt, *Idx; 3725ff0cc061SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Vec)) 3726ff0cc061SDimitry Andric return Error("Invalid record"); 3727ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 3728ff0cc061SDimitry Andric return Error("Invalid type for value"); 3729ff0cc061SDimitry Andric if (popValue(Record, OpNum, NextValueNo, 3730f22ef01cSRoman Divacky cast<VectorType>(Vec->getType())->getElementType(), Elt) || 373191bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 373239d628a0SDimitry Andric return Error("Invalid record"); 3733f22ef01cSRoman Divacky I = InsertElementInst::Create(Vec, Elt, Idx); 3734f22ef01cSRoman Divacky InstructionList.push_back(I); 3735f22ef01cSRoman Divacky break; 3736f22ef01cSRoman Divacky } 3737f22ef01cSRoman Divacky 3738f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] 3739f22ef01cSRoman Divacky unsigned OpNum = 0; 3740f22ef01cSRoman Divacky Value *Vec1, *Vec2, *Mask; 3741f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || 37423861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) 374339d628a0SDimitry Andric return Error("Invalid record"); 3744f22ef01cSRoman Divacky 3745f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) 374639d628a0SDimitry Andric return Error("Invalid record"); 3747ff0cc061SDimitry Andric if (!Vec1->getType()->isVectorTy() || !Vec2->getType()->isVectorTy()) 3748ff0cc061SDimitry Andric return Error("Invalid type for value"); 3749f22ef01cSRoman Divacky I = new ShuffleVectorInst(Vec1, Vec2, Mask); 3750f22ef01cSRoman Divacky InstructionList.push_back(I); 3751f22ef01cSRoman Divacky break; 3752f22ef01cSRoman Divacky } 3753f22ef01cSRoman Divacky 3754f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] 3755f22ef01cSRoman Divacky // Old form of ICmp/FCmp returning bool 3756f22ef01cSRoman Divacky // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were 3757f22ef01cSRoman Divacky // both legal on vectors but had different behaviour. 3758f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] 3759f22ef01cSRoman Divacky // FCmp/ICmp returning bool or vector of bool 3760f22ef01cSRoman Divacky 3761f22ef01cSRoman Divacky unsigned OpNum = 0; 3762f22ef01cSRoman Divacky Value *LHS, *RHS; 3763f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 37643861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3765f22ef01cSRoman Divacky OpNum+1 != Record.size()) 376639d628a0SDimitry Andric return Error("Invalid record"); 3767f22ef01cSRoman Divacky 3768f22ef01cSRoman Divacky if (LHS->getType()->isFPOrFPVectorTy()) 3769f22ef01cSRoman Divacky I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); 3770f22ef01cSRoman Divacky else 3771f22ef01cSRoman Divacky I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); 3772f22ef01cSRoman Divacky InstructionList.push_back(I); 3773f22ef01cSRoman Divacky break; 3774f22ef01cSRoman Divacky } 3775f22ef01cSRoman Divacky 3776f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] 3777f22ef01cSRoman Divacky { 3778f22ef01cSRoman Divacky unsigned Size = Record.size(); 3779f22ef01cSRoman Divacky if (Size == 0) { 3780f22ef01cSRoman Divacky I = ReturnInst::Create(Context); 3781f22ef01cSRoman Divacky InstructionList.push_back(I); 3782f22ef01cSRoman Divacky break; 3783f22ef01cSRoman Divacky } 3784f22ef01cSRoman Divacky 3785f22ef01cSRoman Divacky unsigned OpNum = 0; 378691bc56edSDimitry Andric Value *Op = nullptr; 3787f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 378839d628a0SDimitry Andric return Error("Invalid record"); 378917a519f9SDimitry Andric if (OpNum != Record.size()) 379039d628a0SDimitry Andric return Error("Invalid record"); 3791f22ef01cSRoman Divacky 379217a519f9SDimitry Andric I = ReturnInst::Create(Context, Op); 3793f22ef01cSRoman Divacky InstructionList.push_back(I); 3794f22ef01cSRoman Divacky break; 3795f22ef01cSRoman Divacky } 3796f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] 3797f22ef01cSRoman Divacky if (Record.size() != 1 && Record.size() != 3) 379839d628a0SDimitry Andric return Error("Invalid record"); 3799f22ef01cSRoman Divacky BasicBlock *TrueDest = getBasicBlock(Record[0]); 380091bc56edSDimitry Andric if (!TrueDest) 380139d628a0SDimitry Andric return Error("Invalid record"); 3802f22ef01cSRoman Divacky 3803f22ef01cSRoman Divacky if (Record.size() == 1) { 3804f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest); 3805f22ef01cSRoman Divacky InstructionList.push_back(I); 3806f22ef01cSRoman Divacky } 3807f22ef01cSRoman Divacky else { 3808f22ef01cSRoman Divacky BasicBlock *FalseDest = getBasicBlock(Record[1]); 38093861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, 38103861d79fSDimitry Andric Type::getInt1Ty(Context)); 381191bc56edSDimitry Andric if (!FalseDest || !Cond) 381239d628a0SDimitry Andric return Error("Invalid record"); 3813f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest, FalseDest, Cond); 3814f22ef01cSRoman Divacky InstructionList.push_back(I); 3815f22ef01cSRoman Divacky } 3816f22ef01cSRoman Divacky break; 3817f22ef01cSRoman Divacky } 3818f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] 38197ae0e2c9SDimitry Andric // Check magic 38207ae0e2c9SDimitry Andric if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { 3821f785676fSDimitry Andric // "New" SwitchInst format with case ranges. The changes to write this 3822f785676fSDimitry Andric // format were reverted but we still recognize bitcode that uses it. 3823f785676fSDimitry Andric // Hopefully someday we will have support for case ranges and can use 3824f785676fSDimitry Andric // this format again. 38257ae0e2c9SDimitry Andric 38267ae0e2c9SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 38277ae0e2c9SDimitry Andric unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); 38287ae0e2c9SDimitry Andric 38293861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, OpTy); 38307ae0e2c9SDimitry Andric BasicBlock *Default = getBasicBlock(Record[3]); 383191bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 383239d628a0SDimitry Andric return Error("Invalid record"); 38337ae0e2c9SDimitry Andric 38347ae0e2c9SDimitry Andric unsigned NumCases = Record[4]; 38357ae0e2c9SDimitry Andric 38367ae0e2c9SDimitry Andric SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 38377ae0e2c9SDimitry Andric InstructionList.push_back(SI); 38387ae0e2c9SDimitry Andric 38397ae0e2c9SDimitry Andric unsigned CurIdx = 5; 38407ae0e2c9SDimitry Andric for (unsigned i = 0; i != NumCases; ++i) { 3841f785676fSDimitry Andric SmallVector<ConstantInt*, 1> CaseVals; 38427ae0e2c9SDimitry Andric unsigned NumItems = Record[CurIdx++]; 38437ae0e2c9SDimitry Andric for (unsigned ci = 0; ci != NumItems; ++ci) { 38447ae0e2c9SDimitry Andric bool isSingleNumber = Record[CurIdx++]; 38457ae0e2c9SDimitry Andric 38467ae0e2c9SDimitry Andric APInt Low; 38477ae0e2c9SDimitry Andric unsigned ActiveWords = 1; 38487ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38497ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38507ae0e2c9SDimitry Andric Low = ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38517ae0e2c9SDimitry Andric ValueBitWidth); 38527ae0e2c9SDimitry Andric CurIdx += ActiveWords; 38537ae0e2c9SDimitry Andric 38547ae0e2c9SDimitry Andric if (!isSingleNumber) { 38557ae0e2c9SDimitry Andric ActiveWords = 1; 38567ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38577ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38587ae0e2c9SDimitry Andric APInt High = 38597ae0e2c9SDimitry Andric ReadWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38607ae0e2c9SDimitry Andric ValueBitWidth); 38617ae0e2c9SDimitry Andric CurIdx += ActiveWords; 3862f785676fSDimitry Andric 3863f785676fSDimitry Andric // FIXME: It is not clear whether values in the range should be 3864f785676fSDimitry Andric // compared as signed or unsigned values. The partially 3865f785676fSDimitry Andric // implemented changes that used this format in the past used 3866f785676fSDimitry Andric // unsigned comparisons. 3867f785676fSDimitry Andric for ( ; Low.ule(High); ++Low) 3868f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38697ae0e2c9SDimitry Andric } else 3870f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38717ae0e2c9SDimitry Andric } 38727ae0e2c9SDimitry Andric BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); 3873f785676fSDimitry Andric for (SmallVector<ConstantInt*, 1>::iterator cvi = CaseVals.begin(), 3874f785676fSDimitry Andric cve = CaseVals.end(); cvi != cve; ++cvi) 3875f785676fSDimitry Andric SI->addCase(*cvi, DestBB); 38767ae0e2c9SDimitry Andric } 38777ae0e2c9SDimitry Andric I = SI; 38787ae0e2c9SDimitry Andric break; 38797ae0e2c9SDimitry Andric } 38807ae0e2c9SDimitry Andric 38817ae0e2c9SDimitry Andric // Old SwitchInst format without case ranges. 38827ae0e2c9SDimitry Andric 3883f22ef01cSRoman Divacky if (Record.size() < 3 || (Record.size() & 1) == 0) 388439d628a0SDimitry Andric return Error("Invalid record"); 38856122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 38863861d79fSDimitry Andric Value *Cond = getValue(Record, 1, NextValueNo, OpTy); 3887f22ef01cSRoman Divacky BasicBlock *Default = getBasicBlock(Record[2]); 388891bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 388939d628a0SDimitry Andric return Error("Invalid record"); 3890f22ef01cSRoman Divacky unsigned NumCases = (Record.size()-3)/2; 3891f22ef01cSRoman Divacky SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 3892f22ef01cSRoman Divacky InstructionList.push_back(SI); 3893f22ef01cSRoman Divacky for (unsigned i = 0, e = NumCases; i != e; ++i) { 3894f22ef01cSRoman Divacky ConstantInt *CaseVal = 3895f22ef01cSRoman Divacky dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); 3896f22ef01cSRoman Divacky BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); 389791bc56edSDimitry Andric if (!CaseVal || !DestBB) { 3898f22ef01cSRoman Divacky delete SI; 389939d628a0SDimitry Andric return Error("Invalid record"); 3900f22ef01cSRoman Divacky } 3901f22ef01cSRoman Divacky SI->addCase(CaseVal, DestBB); 3902f22ef01cSRoman Divacky } 3903f22ef01cSRoman Divacky I = SI; 3904f22ef01cSRoman Divacky break; 3905f22ef01cSRoman Divacky } 3906f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] 3907f22ef01cSRoman Divacky if (Record.size() < 2) 390839d628a0SDimitry Andric return Error("Invalid record"); 39096122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 39103861d79fSDimitry Andric Value *Address = getValue(Record, 1, NextValueNo, OpTy); 391191bc56edSDimitry Andric if (!OpTy || !Address) 391239d628a0SDimitry Andric return Error("Invalid record"); 3913f22ef01cSRoman Divacky unsigned NumDests = Record.size()-2; 3914f22ef01cSRoman Divacky IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); 3915f22ef01cSRoman Divacky InstructionList.push_back(IBI); 3916f22ef01cSRoman Divacky for (unsigned i = 0, e = NumDests; i != e; ++i) { 3917f22ef01cSRoman Divacky if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { 3918f22ef01cSRoman Divacky IBI->addDestination(DestBB); 3919f22ef01cSRoman Divacky } else { 3920f22ef01cSRoman Divacky delete IBI; 392139d628a0SDimitry Andric return Error("Invalid record"); 3922f22ef01cSRoman Divacky } 3923f22ef01cSRoman Divacky } 3924f22ef01cSRoman Divacky I = IBI; 3925f22ef01cSRoman Divacky break; 3926f22ef01cSRoman Divacky } 3927f22ef01cSRoman Divacky 3928f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INVOKE: { 3929f22ef01cSRoman Divacky // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] 3930f785676fSDimitry Andric if (Record.size() < 4) 393139d628a0SDimitry Andric return Error("Invalid record"); 3932ff0cc061SDimitry Andric unsigned OpNum = 0; 3933ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 3934ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 3935ff0cc061SDimitry Andric BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]); 3936ff0cc061SDimitry Andric BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]); 3937f22ef01cSRoman Divacky 3938ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 3939ff0cc061SDimitry Andric if (CCInfo >> 13 & 1 && 3940ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 3941ff0cc061SDimitry Andric return Error("Explicit invoke type is not a function type"); 3942ff0cc061SDimitry Andric 3943f22ef01cSRoman Divacky Value *Callee; 3944f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 394539d628a0SDimitry Andric return Error("Invalid record"); 3946f22ef01cSRoman Divacky 39476122f3e6SDimitry Andric PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); 3948ff0cc061SDimitry Andric if (!CalleeTy) 3949ff0cc061SDimitry Andric return Error("Callee is not a pointer"); 3950ff0cc061SDimitry Andric if (!FTy) { 3951ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(CalleeTy->getElementType()); 3952ff0cc061SDimitry Andric if (!FTy) 3953ff0cc061SDimitry Andric return Error("Callee is not of pointer to function type"); 3954ff0cc061SDimitry Andric } else if (CalleeTy->getElementType() != FTy) 3955ff0cc061SDimitry Andric return Error("Explicit invoke type does not match pointee type of " 3956ff0cc061SDimitry Andric "callee operand"); 3957ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 3958ff0cc061SDimitry Andric return Error("Insufficient operands to call"); 3959f22ef01cSRoman Divacky 3960f22ef01cSRoman Divacky SmallVector<Value*, 16> Ops; 3961f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 39623861d79fSDimitry Andric Ops.push_back(getValue(Record, OpNum, NextValueNo, 39633861d79fSDimitry Andric FTy->getParamType(i))); 396491bc56edSDimitry Andric if (!Ops.back()) 396539d628a0SDimitry Andric return Error("Invalid record"); 3966f22ef01cSRoman Divacky } 3967f22ef01cSRoman Divacky 3968f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 3969f22ef01cSRoman Divacky if (Record.size() != OpNum) 397039d628a0SDimitry Andric return Error("Invalid record"); 3971f22ef01cSRoman Divacky } else { 3972f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 3973f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3974f22ef01cSRoman Divacky Value *Op; 3975f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 397639d628a0SDimitry Andric return Error("Invalid record"); 3977f22ef01cSRoman Divacky Ops.push_back(Op); 3978f22ef01cSRoman Divacky } 3979f22ef01cSRoman Divacky } 3980f22ef01cSRoman Divacky 398117a519f9SDimitry Andric I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); 3982f22ef01cSRoman Divacky InstructionList.push_back(I); 3983ff0cc061SDimitry Andric cast<InvokeInst>(I) 3984ff0cc061SDimitry Andric ->setCallingConv(static_cast<CallingConv::ID>(~(1U << 13) & CCInfo)); 3985f22ef01cSRoman Divacky cast<InvokeInst>(I)->setAttributes(PAL); 3986f22ef01cSRoman Divacky break; 3987f22ef01cSRoman Divacky } 39886122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] 39896122f3e6SDimitry Andric unsigned Idx = 0; 399091bc56edSDimitry Andric Value *Val = nullptr; 39916122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) 399239d628a0SDimitry Andric return Error("Invalid record"); 39936122f3e6SDimitry Andric I = ResumeInst::Create(Val); 39946122f3e6SDimitry Andric InstructionList.push_back(I); 39956122f3e6SDimitry Andric break; 39966122f3e6SDimitry Andric } 3997f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE 3998f22ef01cSRoman Divacky I = new UnreachableInst(Context); 3999f22ef01cSRoman Divacky InstructionList.push_back(I); 4000f22ef01cSRoman Divacky break; 4001f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] 4002f22ef01cSRoman Divacky if (Record.size() < 1 || ((Record.size()-1)&1)) 400339d628a0SDimitry Andric return Error("Invalid record"); 40046122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4005f785676fSDimitry Andric if (!Ty) 400639d628a0SDimitry Andric return Error("Invalid record"); 4007f22ef01cSRoman Divacky 40083b0f4066SDimitry Andric PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); 4009f22ef01cSRoman Divacky InstructionList.push_back(PN); 4010f22ef01cSRoman Divacky 4011f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { 40123861d79fSDimitry Andric Value *V; 40133861d79fSDimitry Andric // With the new function encoding, it is possible that operands have 40143861d79fSDimitry Andric // negative IDs (for forward references). Use a signed VBR 40153861d79fSDimitry Andric // representation to keep the encoding small. 40163861d79fSDimitry Andric if (UseRelativeIDs) 40173861d79fSDimitry Andric V = getValueSigned(Record, 1+i, NextValueNo, Ty); 40183861d79fSDimitry Andric else 40193861d79fSDimitry Andric V = getValue(Record, 1+i, NextValueNo, Ty); 4020f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[2+i]); 4021f785676fSDimitry Andric if (!V || !BB) 402239d628a0SDimitry Andric return Error("Invalid record"); 4023f22ef01cSRoman Divacky PN->addIncoming(V, BB); 4024f22ef01cSRoman Divacky } 4025f22ef01cSRoman Divacky I = PN; 4026f22ef01cSRoman Divacky break; 4027f22ef01cSRoman Divacky } 4028f22ef01cSRoman Divacky 40296122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD: { 40306122f3e6SDimitry Andric // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] 40316122f3e6SDimitry Andric unsigned Idx = 0; 40326122f3e6SDimitry Andric if (Record.size() < 4) 403339d628a0SDimitry Andric return Error("Invalid record"); 40346122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[Idx++]); 4035f785676fSDimitry Andric if (!Ty) 403639d628a0SDimitry Andric return Error("Invalid record"); 403791bc56edSDimitry Andric Value *PersFn = nullptr; 40386122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) 403939d628a0SDimitry Andric return Error("Invalid record"); 40406122f3e6SDimitry Andric 40416122f3e6SDimitry Andric bool IsCleanup = !!Record[Idx++]; 40426122f3e6SDimitry Andric unsigned NumClauses = Record[Idx++]; 40436122f3e6SDimitry Andric LandingPadInst *LP = LandingPadInst::Create(Ty, PersFn, NumClauses); 40446122f3e6SDimitry Andric LP->setCleanup(IsCleanup); 40456122f3e6SDimitry Andric for (unsigned J = 0; J != NumClauses; ++J) { 40466122f3e6SDimitry Andric LandingPadInst::ClauseType CT = 40476122f3e6SDimitry Andric LandingPadInst::ClauseType(Record[Idx++]); (void)CT; 40486122f3e6SDimitry Andric Value *Val; 40496122f3e6SDimitry Andric 40506122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) { 40516122f3e6SDimitry Andric delete LP; 405239d628a0SDimitry Andric return Error("Invalid record"); 40536122f3e6SDimitry Andric } 40546122f3e6SDimitry Andric 40556122f3e6SDimitry Andric assert((CT != LandingPadInst::Catch || 40566122f3e6SDimitry Andric !isa<ArrayType>(Val->getType())) && 40576122f3e6SDimitry Andric "Catch clause has a invalid type!"); 40586122f3e6SDimitry Andric assert((CT != LandingPadInst::Filter || 40596122f3e6SDimitry Andric isa<ArrayType>(Val->getType())) && 40606122f3e6SDimitry Andric "Filter clause has invalid type!"); 406191bc56edSDimitry Andric LP->addClause(cast<Constant>(Val)); 40626122f3e6SDimitry Andric } 40636122f3e6SDimitry Andric 40646122f3e6SDimitry Andric I = LP; 40656122f3e6SDimitry Andric InstructionList.push_back(I); 40666122f3e6SDimitry Andric break; 40676122f3e6SDimitry Andric } 40686122f3e6SDimitry Andric 406917a519f9SDimitry Andric case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] 407017a519f9SDimitry Andric if (Record.size() != 4) 407139d628a0SDimitry Andric return Error("Invalid record"); 4072ff0cc061SDimitry Andric uint64_t AlignRecord = Record[3]; 4073ff0cc061SDimitry Andric const uint64_t InAllocaMask = uint64_t(1) << 5; 4074ff0cc061SDimitry Andric const uint64_t ExplicitTypeMask = uint64_t(1) << 6; 4075ff0cc061SDimitry Andric const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask; 4076ff0cc061SDimitry Andric bool InAlloca = AlignRecord & InAllocaMask; 4077ff0cc061SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4078ff0cc061SDimitry Andric if ((AlignRecord & ExplicitTypeMask) == 0) { 4079ff0cc061SDimitry Andric auto *PTy = dyn_cast_or_null<PointerType>(Ty); 4080ff0cc061SDimitry Andric if (!PTy) 4081ff0cc061SDimitry Andric return Error("Old-style alloca with a non-pointer type"); 4082ff0cc061SDimitry Andric Ty = PTy->getElementType(); 4083ff0cc061SDimitry Andric } 40846122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 408517a519f9SDimitry Andric Value *Size = getFnValueByID(Record[2], OpTy); 4086ff0cc061SDimitry Andric unsigned Align; 4087ff0cc061SDimitry Andric if (std::error_code EC = 4088ff0cc061SDimitry Andric parseAlignmentValue(AlignRecord & ~FlagMask, Align)) { 4089ff0cc061SDimitry Andric return EC; 4090ff0cc061SDimitry Andric } 4091f785676fSDimitry Andric if (!Ty || !Size) 409239d628a0SDimitry Andric return Error("Invalid record"); 4093ff0cc061SDimitry Andric AllocaInst *AI = new AllocaInst(Ty, Size, Align); 409491bc56edSDimitry Andric AI->setUsedWithInAlloca(InAlloca); 409591bc56edSDimitry Andric I = AI; 4096f22ef01cSRoman Divacky InstructionList.push_back(I); 4097f22ef01cSRoman Divacky break; 4098f22ef01cSRoman Divacky } 4099f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] 4100f22ef01cSRoman Divacky unsigned OpNum = 0; 4101f22ef01cSRoman Divacky Value *Op; 4102f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4103ff0cc061SDimitry Andric (OpNum + 2 != Record.size() && OpNum + 3 != Record.size())) 410439d628a0SDimitry Andric return Error("Invalid record"); 4105f22ef01cSRoman Divacky 4106ff0cc061SDimitry Andric Type *Ty = nullptr; 4107ff0cc061SDimitry Andric if (OpNum + 3 == Record.size()) 4108ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4109ff0cc061SDimitry Andric if (std::error_code EC = 4110ff0cc061SDimitry Andric TypeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4111ff0cc061SDimitry Andric return EC; 4112ff0cc061SDimitry Andric if (!Ty) 4113ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4114ff0cc061SDimitry Andric 4115ff0cc061SDimitry Andric unsigned Align; 4116ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4117ff0cc061SDimitry Andric return EC; 4118ff0cc061SDimitry Andric I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align); 4119ff0cc061SDimitry Andric 4120f22ef01cSRoman Divacky InstructionList.push_back(I); 4121f22ef01cSRoman Divacky break; 4122f22ef01cSRoman Divacky } 41236122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LOADATOMIC: { 41246122f3e6SDimitry Andric // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] 41256122f3e6SDimitry Andric unsigned OpNum = 0; 41266122f3e6SDimitry Andric Value *Op; 41276122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4128ff0cc061SDimitry Andric (OpNum + 4 != Record.size() && OpNum + 5 != Record.size())) 412939d628a0SDimitry Andric return Error("Invalid record"); 41306122f3e6SDimitry Andric 4131ff0cc061SDimitry Andric Type *Ty = nullptr; 4132ff0cc061SDimitry Andric if (OpNum + 5 == Record.size()) 4133ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4134ff0cc061SDimitry Andric if (std::error_code EC = 4135ff0cc061SDimitry Andric TypeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4136ff0cc061SDimitry Andric return EC; 4137ff0cc061SDimitry Andric if (!Ty) 4138ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4139ff0cc061SDimitry Andric 41406122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 41416122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Release || 41426122f3e6SDimitry Andric Ordering == AcquireRelease) 414339d628a0SDimitry Andric return Error("Invalid record"); 41446122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 414539d628a0SDimitry Andric return Error("Invalid record"); 41466122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 41476122f3e6SDimitry Andric 4148ff0cc061SDimitry Andric unsigned Align; 4149ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4150ff0cc061SDimitry Andric return EC; 4151ff0cc061SDimitry Andric I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope); 4152ff0cc061SDimitry Andric 41536122f3e6SDimitry Andric InstructionList.push_back(I); 41546122f3e6SDimitry Andric break; 41556122f3e6SDimitry Andric } 4156ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE: 4157ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE_OLD: { // STORE2:[ptrty, ptr, val, align, vol] 4158f22ef01cSRoman Divacky unsigned OpNum = 0; 4159f22ef01cSRoman Divacky Value *Val, *Ptr; 4160f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4161ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STORE 4162ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4163ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4164ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4165ff0cc061SDimitry Andric Val)) || 4166f22ef01cSRoman Divacky OpNum + 2 != Record.size()) 416739d628a0SDimitry Andric return Error("Invalid record"); 4168f22ef01cSRoman Divacky 4169ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4170ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4171ff0cc061SDimitry Andric return EC; 4172ff0cc061SDimitry Andric unsigned Align; 4173ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4174ff0cc061SDimitry Andric return EC; 4175ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align); 4176f22ef01cSRoman Divacky InstructionList.push_back(I); 4177f22ef01cSRoman Divacky break; 4178f22ef01cSRoman Divacky } 4179ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC: 4180ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC_OLD: { 41816122f3e6SDimitry Andric // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] 41826122f3e6SDimitry Andric unsigned OpNum = 0; 41836122f3e6SDimitry Andric Value *Val, *Ptr; 41846122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4185ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STOREATOMIC 4186ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4187ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4188ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4189ff0cc061SDimitry Andric Val)) || 41906122f3e6SDimitry Andric OpNum + 4 != Record.size()) 419139d628a0SDimitry Andric return Error("Invalid record"); 41926122f3e6SDimitry Andric 4193ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4194ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4195ff0cc061SDimitry Andric return EC; 41966122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 41976122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Acquire || 41986122f3e6SDimitry Andric Ordering == AcquireRelease) 419939d628a0SDimitry Andric return Error("Invalid record"); 42006122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 42016122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 420239d628a0SDimitry Andric return Error("Invalid record"); 42036122f3e6SDimitry Andric 4204ff0cc061SDimitry Andric unsigned Align; 4205ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4206ff0cc061SDimitry Andric return EC; 4207ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SynchScope); 42086122f3e6SDimitry Andric InstructionList.push_back(I); 42096122f3e6SDimitry Andric break; 42106122f3e6SDimitry Andric } 4211ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG_OLD: 42126122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG: { 421391bc56edSDimitry Andric // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, 421491bc56edSDimitry Andric // failureordering?, isweak?] 42156122f3e6SDimitry Andric unsigned OpNum = 0; 42166122f3e6SDimitry Andric Value *Ptr, *Cmp, *New; 42176122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4218ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_CMPXCHG 4219ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Cmp) 4220ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4221ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4222ff0cc061SDimitry Andric Cmp)) || 4223ff0cc061SDimitry Andric popValue(Record, OpNum, NextValueNo, Cmp->getType(), New) || 4224ff0cc061SDimitry Andric Record.size() < OpNum + 3 || Record.size() > OpNum + 5) 422539d628a0SDimitry Andric return Error("Invalid record"); 422691bc56edSDimitry Andric AtomicOrdering SuccessOrdering = GetDecodedOrdering(Record[OpNum+1]); 422791bc56edSDimitry Andric if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered) 422839d628a0SDimitry Andric return Error("Invalid record"); 42296122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+2]); 423091bc56edSDimitry Andric 4231ff0cc061SDimitry Andric if (std::error_code EC = TypeCheckLoadStoreInst( 4232ff0cc061SDimitry Andric DiagnosticHandler, Cmp->getType(), Ptr->getType())) 4233ff0cc061SDimitry Andric return EC; 423491bc56edSDimitry Andric AtomicOrdering FailureOrdering; 423591bc56edSDimitry Andric if (Record.size() < 7) 423691bc56edSDimitry Andric FailureOrdering = 423791bc56edSDimitry Andric AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrdering); 423891bc56edSDimitry Andric else 423991bc56edSDimitry Andric FailureOrdering = GetDecodedOrdering(Record[OpNum+3]); 424091bc56edSDimitry Andric 424191bc56edSDimitry Andric I = new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering, FailureOrdering, 424291bc56edSDimitry Andric SynchScope); 42436122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); 424491bc56edSDimitry Andric 424591bc56edSDimitry Andric if (Record.size() < 8) { 424691bc56edSDimitry Andric // Before weak cmpxchgs existed, the instruction simply returned the 424791bc56edSDimitry Andric // value loaded from memory, so bitcode files from that era will be 424891bc56edSDimitry Andric // expecting the first component of a modern cmpxchg. 424991bc56edSDimitry Andric CurBB->getInstList().push_back(I); 425091bc56edSDimitry Andric I = ExtractValueInst::Create(I, 0); 425191bc56edSDimitry Andric } else { 425291bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum+4]); 425391bc56edSDimitry Andric } 425491bc56edSDimitry Andric 42556122f3e6SDimitry Andric InstructionList.push_back(I); 42566122f3e6SDimitry Andric break; 42576122f3e6SDimitry Andric } 42586122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_ATOMICRMW: { 42596122f3e6SDimitry Andric // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] 42606122f3e6SDimitry Andric unsigned OpNum = 0; 42616122f3e6SDimitry Andric Value *Ptr, *Val; 42626122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 42633861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 42646122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 42656122f3e6SDimitry Andric OpNum+4 != Record.size()) 426639d628a0SDimitry Andric return Error("Invalid record"); 42676122f3e6SDimitry Andric AtomicRMWInst::BinOp Operation = GetDecodedRMWOperation(Record[OpNum]); 42686122f3e6SDimitry Andric if (Operation < AtomicRMWInst::FIRST_BINOP || 42696122f3e6SDimitry Andric Operation > AtomicRMWInst::LAST_BINOP) 427039d628a0SDimitry Andric return Error("Invalid record"); 42716122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); 42726122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 427339d628a0SDimitry Andric return Error("Invalid record"); 42746122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[OpNum+3]); 42756122f3e6SDimitry Andric I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); 42766122f3e6SDimitry Andric cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); 42776122f3e6SDimitry Andric InstructionList.push_back(I); 42786122f3e6SDimitry Andric break; 42796122f3e6SDimitry Andric } 42806122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] 42816122f3e6SDimitry Andric if (2 != Record.size()) 428239d628a0SDimitry Andric return Error("Invalid record"); 42836122f3e6SDimitry Andric AtomicOrdering Ordering = GetDecodedOrdering(Record[0]); 42846122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered || 42856122f3e6SDimitry Andric Ordering == Monotonic) 428639d628a0SDimitry Andric return Error("Invalid record"); 42876122f3e6SDimitry Andric SynchronizationScope SynchScope = GetDecodedSynchScope(Record[1]); 42886122f3e6SDimitry Andric I = new FenceInst(Context, Ordering, SynchScope); 42896122f3e6SDimitry Andric InstructionList.push_back(I); 42906122f3e6SDimitry Andric break; 42916122f3e6SDimitry Andric } 429217a519f9SDimitry Andric case bitc::FUNC_CODE_INST_CALL: { 4293f22ef01cSRoman Divacky // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] 4294f22ef01cSRoman Divacky if (Record.size() < 3) 429539d628a0SDimitry Andric return Error("Invalid record"); 4296f22ef01cSRoman Divacky 4297ff0cc061SDimitry Andric unsigned OpNum = 0; 4298ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 4299ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 4300f22ef01cSRoman Divacky 4301ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 4302ff0cc061SDimitry Andric if (CCInfo >> 15 & 1 && 4303ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 4304ff0cc061SDimitry Andric return Error("Explicit call type is not a function type"); 4305ff0cc061SDimitry Andric 4306f22ef01cSRoman Divacky Value *Callee; 4307f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 430839d628a0SDimitry Andric return Error("Invalid record"); 4309f22ef01cSRoman Divacky 43106122f3e6SDimitry Andric PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); 4311ff0cc061SDimitry Andric if (!OpTy) 4312ff0cc061SDimitry Andric return Error("Callee is not a pointer type"); 4313ff0cc061SDimitry Andric if (!FTy) { 4314ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(OpTy->getElementType()); 4315ff0cc061SDimitry Andric if (!FTy) 4316ff0cc061SDimitry Andric return Error("Callee is not of pointer to function type"); 4317ff0cc061SDimitry Andric } else if (OpTy->getElementType() != FTy) 4318ff0cc061SDimitry Andric return Error("Explicit call type does not match pointee type of " 4319ff0cc061SDimitry Andric "callee operand"); 4320ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 4321ff0cc061SDimitry Andric return Error("Insufficient operands to call"); 4322f22ef01cSRoman Divacky 4323f22ef01cSRoman Divacky SmallVector<Value*, 16> Args; 4324f22ef01cSRoman Divacky // Read the fixed params. 4325f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 432617a519f9SDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 4327f22ef01cSRoman Divacky Args.push_back(getBasicBlock(Record[OpNum])); 4328f22ef01cSRoman Divacky else 43293861d79fSDimitry Andric Args.push_back(getValue(Record, OpNum, NextValueNo, 43303861d79fSDimitry Andric FTy->getParamType(i))); 433191bc56edSDimitry Andric if (!Args.back()) 433239d628a0SDimitry Andric return Error("Invalid record"); 4333f22ef01cSRoman Divacky } 4334f22ef01cSRoman Divacky 4335f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 4336f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 4337f22ef01cSRoman Divacky if (OpNum != Record.size()) 433839d628a0SDimitry Andric return Error("Invalid record"); 4339f22ef01cSRoman Divacky } else { 4340f22ef01cSRoman Divacky while (OpNum != Record.size()) { 4341f22ef01cSRoman Divacky Value *Op; 4342f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 434339d628a0SDimitry Andric return Error("Invalid record"); 4344f22ef01cSRoman Divacky Args.push_back(Op); 4345f22ef01cSRoman Divacky } 4346f22ef01cSRoman Divacky } 4347f22ef01cSRoman Divacky 4348ff0cc061SDimitry Andric I = CallInst::Create(FTy, Callee, Args); 4349f22ef01cSRoman Divacky InstructionList.push_back(I); 4350f22ef01cSRoman Divacky cast<CallInst>(I)->setCallingConv( 435191bc56edSDimitry Andric static_cast<CallingConv::ID>((~(1U << 14) & CCInfo) >> 1)); 435291bc56edSDimitry Andric CallInst::TailCallKind TCK = CallInst::TCK_None; 435391bc56edSDimitry Andric if (CCInfo & 1) 435491bc56edSDimitry Andric TCK = CallInst::TCK_Tail; 435591bc56edSDimitry Andric if (CCInfo & (1 << 14)) 435691bc56edSDimitry Andric TCK = CallInst::TCK_MustTail; 435791bc56edSDimitry Andric cast<CallInst>(I)->setTailCallKind(TCK); 4358f22ef01cSRoman Divacky cast<CallInst>(I)->setAttributes(PAL); 4359f22ef01cSRoman Divacky break; 4360f22ef01cSRoman Divacky } 4361f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] 4362f22ef01cSRoman Divacky if (Record.size() < 3) 436339d628a0SDimitry Andric return Error("Invalid record"); 43646122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 43653861d79fSDimitry Andric Value *Op = getValue(Record, 1, NextValueNo, OpTy); 43666122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[2]); 4367f22ef01cSRoman Divacky if (!OpTy || !Op || !ResTy) 436839d628a0SDimitry Andric return Error("Invalid record"); 4369f22ef01cSRoman Divacky I = new VAArgInst(Op, ResTy); 4370f22ef01cSRoman Divacky InstructionList.push_back(I); 4371f22ef01cSRoman Divacky break; 4372f22ef01cSRoman Divacky } 4373f22ef01cSRoman Divacky } 4374f22ef01cSRoman Divacky 4375f22ef01cSRoman Divacky // Add instruction to end of current BB. If there is no current BB, reject 4376f22ef01cSRoman Divacky // this file. 437791bc56edSDimitry Andric if (!CurBB) { 4378f22ef01cSRoman Divacky delete I; 437939d628a0SDimitry Andric return Error("Invalid instruction with no BB"); 4380f22ef01cSRoman Divacky } 4381f22ef01cSRoman Divacky CurBB->getInstList().push_back(I); 4382f22ef01cSRoman Divacky 4383f22ef01cSRoman Divacky // If this was a terminator instruction, move to the next block. 4384f22ef01cSRoman Divacky if (isa<TerminatorInst>(I)) { 4385f22ef01cSRoman Divacky ++CurBBNo; 438691bc56edSDimitry Andric CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr; 4387f22ef01cSRoman Divacky } 4388f22ef01cSRoman Divacky 4389f22ef01cSRoman Divacky // Non-void values get registered in the value table for future use. 4390f22ef01cSRoman Divacky if (I && !I->getType()->isVoidTy()) 4391f22ef01cSRoman Divacky ValueList.AssignValue(I, NextValueNo++); 4392f22ef01cSRoman Divacky } 4393f22ef01cSRoman Divacky 4394139f7f9bSDimitry Andric OutOfRecordLoop: 4395139f7f9bSDimitry Andric 4396f22ef01cSRoman Divacky // Check the function list for unresolved values. 4397f22ef01cSRoman Divacky if (Argument *A = dyn_cast<Argument>(ValueList.back())) { 439891bc56edSDimitry Andric if (!A->getParent()) { 4399f22ef01cSRoman Divacky // We found at least one unresolved value. Nuke them all to avoid leaks. 4400f22ef01cSRoman Divacky for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ 440191bc56edSDimitry Andric if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && !A->getParent()) { 4402f22ef01cSRoman Divacky A->replaceAllUsesWith(UndefValue::get(A->getType())); 4403f22ef01cSRoman Divacky delete A; 4404f22ef01cSRoman Divacky } 4405f22ef01cSRoman Divacky } 440639d628a0SDimitry Andric return Error("Never resolved value found in function"); 4407f22ef01cSRoman Divacky } 4408f22ef01cSRoman Divacky } 4409f22ef01cSRoman Divacky 4410e580952dSDimitry Andric // FIXME: Check for unresolved forward-declared metadata references 4411e580952dSDimitry Andric // and clean up leaks. 4412e580952dSDimitry Andric 4413f22ef01cSRoman Divacky // Trim the value list down to the size it was before we parsed this function. 4414f22ef01cSRoman Divacky ValueList.shrinkTo(ModuleValueListSize); 4415e580952dSDimitry Andric MDValueList.shrinkTo(ModuleMDValueListSize); 4416f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 441791bc56edSDimitry Andric return std::error_code(); 4418f22ef01cSRoman Divacky } 4419f22ef01cSRoman Divacky 4420f785676fSDimitry Andric /// Find the function body in the bitcode stream 442191bc56edSDimitry Andric std::error_code BitcodeReader::FindFunctionInStream( 442291bc56edSDimitry Andric Function *F, 4423dff0c46cSDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) { 4424dff0c46cSDimitry Andric while (DeferredFunctionInfoIterator->second == 0) { 4425dff0c46cSDimitry Andric if (Stream.AtEndOfStream()) 442639d628a0SDimitry Andric return Error("Could not find function in stream"); 4427dff0c46cSDimitry Andric // ParseModule will parse the next body in the stream and set its 4428dff0c46cSDimitry Andric // position in the DeferredFunctionInfo map. 442991bc56edSDimitry Andric if (std::error_code EC = ParseModule(true)) 4430f785676fSDimitry Andric return EC; 4431dff0c46cSDimitry Andric } 443291bc56edSDimitry Andric return std::error_code(); 4433dff0c46cSDimitry Andric } 4434dff0c46cSDimitry Andric 4435f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4436f22ef01cSRoman Divacky // GVMaterializer implementation 4437f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4438f22ef01cSRoman Divacky 443991bc56edSDimitry Andric void BitcodeReader::releaseBuffer() { Buffer.release(); } 4440f22ef01cSRoman Divacky 444139d628a0SDimitry Andric std::error_code BitcodeReader::materialize(GlobalValue *GV) { 4442ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4443ff0cc061SDimitry Andric return EC; 4444ff0cc061SDimitry Andric 4445f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4446f22ef01cSRoman Divacky // If it's not a function or is already material, ignore the request. 4447f785676fSDimitry Andric if (!F || !F->isMaterializable()) 444891bc56edSDimitry Andric return std::error_code(); 4449f22ef01cSRoman Divacky 4450f22ef01cSRoman Divacky DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); 4451f22ef01cSRoman Divacky assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); 4452dff0c46cSDimitry Andric // If its position is recorded as 0, its body is somewhere in the stream 4453dff0c46cSDimitry Andric // but we haven't seen it yet. 4454f785676fSDimitry Andric if (DFII->second == 0 && LazyStreamer) 445591bc56edSDimitry Andric if (std::error_code EC = FindFunctionInStream(F, DFII)) 4456f785676fSDimitry Andric return EC; 4457f22ef01cSRoman Divacky 4458f22ef01cSRoman Divacky // Move the bit stream to the saved position of the deferred function body. 4459f22ef01cSRoman Divacky Stream.JumpToBit(DFII->second); 4460f22ef01cSRoman Divacky 446191bc56edSDimitry Andric if (std::error_code EC = ParseFunctionBody(F)) 4462f785676fSDimitry Andric return EC; 446339d628a0SDimitry Andric F->setIsMaterializable(false); 4464f22ef01cSRoman Divacky 4465ff0cc061SDimitry Andric if (StripDebugInfo) 4466ff0cc061SDimitry Andric stripDebugInfo(*F); 4467ff0cc061SDimitry Andric 4468f22ef01cSRoman Divacky // Upgrade any old intrinsic calls in the function. 4469f22ef01cSRoman Divacky for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), 4470f22ef01cSRoman Divacky E = UpgradedIntrinsics.end(); I != E; ++I) { 4471f22ef01cSRoman Divacky if (I->first != I->second) { 447291bc56edSDimitry Andric for (auto UI = I->first->user_begin(), UE = I->first->user_end(); 447391bc56edSDimitry Andric UI != UE;) { 4474f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 4475f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 4476f22ef01cSRoman Divacky } 4477f22ef01cSRoman Divacky } 4478f22ef01cSRoman Divacky } 4479f22ef01cSRoman Divacky 448039d628a0SDimitry Andric // Bring in any functions that this function forward-referenced via 448139d628a0SDimitry Andric // blockaddresses. 448239d628a0SDimitry Andric return materializeForwardReferencedFunctions(); 4483f22ef01cSRoman Divacky } 4484f22ef01cSRoman Divacky 4485f22ef01cSRoman Divacky bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { 4486f22ef01cSRoman Divacky const Function *F = dyn_cast<Function>(GV); 4487f22ef01cSRoman Divacky if (!F || F->isDeclaration()) 4488f22ef01cSRoman Divacky return false; 448939d628a0SDimitry Andric 449039d628a0SDimitry Andric // Dematerializing F would leave dangling references that wouldn't be 449139d628a0SDimitry Andric // reconnected on re-materialization. 449239d628a0SDimitry Andric if (BlockAddressesTaken.count(F)) 449339d628a0SDimitry Andric return false; 449439d628a0SDimitry Andric 4495f22ef01cSRoman Divacky return DeferredFunctionInfo.count(const_cast<Function*>(F)); 4496f22ef01cSRoman Divacky } 4497f22ef01cSRoman Divacky 4498ff0cc061SDimitry Andric void BitcodeReader::dematerialize(GlobalValue *GV) { 4499f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4500f22ef01cSRoman Divacky // If this function isn't dematerializable, this is a noop. 4501f22ef01cSRoman Divacky if (!F || !isDematerializable(F)) 4502f22ef01cSRoman Divacky return; 4503f22ef01cSRoman Divacky 4504f22ef01cSRoman Divacky assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); 4505f22ef01cSRoman Divacky 4506f22ef01cSRoman Divacky // Just forget the function body, we can remat it later. 450739d628a0SDimitry Andric F->dropAllReferences(); 450839d628a0SDimitry Andric F->setIsMaterializable(true); 4509f22ef01cSRoman Divacky } 4510f22ef01cSRoman Divacky 4511ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeModule(Module *M) { 4512f22ef01cSRoman Divacky assert(M == TheModule && 4513f22ef01cSRoman Divacky "Can only Materialize the Module this BitcodeReader is attached to."); 451439d628a0SDimitry Andric 4515ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4516ff0cc061SDimitry Andric return EC; 4517ff0cc061SDimitry Andric 451839d628a0SDimitry Andric // Promise to materialize all forward references. 451939d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 452039d628a0SDimitry Andric 4521f22ef01cSRoman Divacky // Iterate over the module, deserializing any functions that are still on 4522f22ef01cSRoman Divacky // disk. 4523f22ef01cSRoman Divacky for (Module::iterator F = TheModule->begin(), E = TheModule->end(); 4524f785676fSDimitry Andric F != E; ++F) { 452539d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 4526f785676fSDimitry Andric return EC; 4527f785676fSDimitry Andric } 4528dff0c46cSDimitry Andric // At this point, if there are any function bodies, the current bit is 4529dff0c46cSDimitry Andric // pointing to the END_BLOCK record after them. Now make sure the rest 4530dff0c46cSDimitry Andric // of the bits in the module have been read. 4531dff0c46cSDimitry Andric if (NextUnreadBit) 4532dff0c46cSDimitry Andric ParseModule(true); 4533dff0c46cSDimitry Andric 453439d628a0SDimitry Andric // Check that all block address forward references got resolved (as we 453539d628a0SDimitry Andric // promised above). 453639d628a0SDimitry Andric if (!BasicBlockFwdRefs.empty()) 453739d628a0SDimitry Andric return Error("Never resolved function from blockaddress"); 453839d628a0SDimitry Andric 4539f22ef01cSRoman Divacky // Upgrade any intrinsic calls that slipped through (should not happen!) and 4540f22ef01cSRoman Divacky // delete the old functions to clean up. We can't do this unless the entire 4541f22ef01cSRoman Divacky // module is materialized because there could always be another function body 4542f22ef01cSRoman Divacky // with calls to the old function. 4543f22ef01cSRoman Divacky for (std::vector<std::pair<Function*, Function*> >::iterator I = 4544f22ef01cSRoman Divacky UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) { 4545f22ef01cSRoman Divacky if (I->first != I->second) { 454691bc56edSDimitry Andric for (auto UI = I->first->user_begin(), UE = I->first->user_end(); 454791bc56edSDimitry Andric UI != UE;) { 4548f22ef01cSRoman Divacky if (CallInst* CI = dyn_cast<CallInst>(*UI++)) 4549f22ef01cSRoman Divacky UpgradeIntrinsicCall(CI, I->second); 4550f22ef01cSRoman Divacky } 4551f22ef01cSRoman Divacky if (!I->first->use_empty()) 4552f22ef01cSRoman Divacky I->first->replaceAllUsesWith(I->second); 4553f22ef01cSRoman Divacky I->first->eraseFromParent(); 4554f22ef01cSRoman Divacky } 4555f22ef01cSRoman Divacky } 4556f22ef01cSRoman Divacky std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); 4557f22ef01cSRoman Divacky 4558f785676fSDimitry Andric for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) 4559f785676fSDimitry Andric UpgradeInstWithTBAATag(InstsWithTBAATag[I]); 4560f785676fSDimitry Andric 4561f785676fSDimitry Andric UpgradeDebugInfo(*M); 456291bc56edSDimitry Andric return std::error_code(); 4563dff0c46cSDimitry Andric } 45646122f3e6SDimitry Andric 456539d628a0SDimitry Andric std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes() const { 456639d628a0SDimitry Andric return IdentifiedStructTypes; 456739d628a0SDimitry Andric } 456839d628a0SDimitry Andric 456991bc56edSDimitry Andric std::error_code BitcodeReader::InitStream() { 4570f785676fSDimitry Andric if (LazyStreamer) 4571f785676fSDimitry Andric return InitLazyStream(); 4572dff0c46cSDimitry Andric return InitStreamFromBuffer(); 4573dff0c46cSDimitry Andric } 4574dff0c46cSDimitry Andric 457591bc56edSDimitry Andric std::error_code BitcodeReader::InitStreamFromBuffer() { 45763861d79fSDimitry Andric const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); 4577dff0c46cSDimitry Andric const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); 4578dff0c46cSDimitry Andric 457939d628a0SDimitry Andric if (Buffer->getBufferSize() & 3) 458039d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4581dff0c46cSDimitry Andric 4582dff0c46cSDimitry Andric // If we have a wrapper header, parse it and ignore the non-bc file contents. 4583dff0c46cSDimitry Andric // The magic number is 0x0B17C0DE stored in little endian. 4584dff0c46cSDimitry Andric if (isBitcodeWrapper(BufPtr, BufEnd)) 4585dff0c46cSDimitry Andric if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) 458639d628a0SDimitry Andric return Error("Invalid bitcode wrapper header"); 4587dff0c46cSDimitry Andric 4588dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); 458939d628a0SDimitry Andric Stream.init(&*StreamFile); 4590f22ef01cSRoman Divacky 459191bc56edSDimitry Andric return std::error_code(); 4592f22ef01cSRoman Divacky } 4593f22ef01cSRoman Divacky 459491bc56edSDimitry Andric std::error_code BitcodeReader::InitLazyStream() { 4595dff0c46cSDimitry Andric // Check and strip off the bitcode wrapper; BitstreamReader expects never to 4596dff0c46cSDimitry Andric // see it. 459739d628a0SDimitry Andric auto OwnedBytes = llvm::make_unique<StreamingMemoryObject>(LazyStreamer); 459839d628a0SDimitry Andric StreamingMemoryObject &Bytes = *OwnedBytes; 459939d628a0SDimitry Andric StreamFile = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes)); 460039d628a0SDimitry Andric Stream.init(&*StreamFile); 4601dff0c46cSDimitry Andric 4602dff0c46cSDimitry Andric unsigned char buf[16]; 460339d628a0SDimitry Andric if (Bytes.readBytes(buf, 16, 0) != 16) 460439d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4605dff0c46cSDimitry Andric 4606dff0c46cSDimitry Andric if (!isBitcode(buf, buf + 16)) 460739d628a0SDimitry Andric return Error("Invalid bitcode signature"); 4608dff0c46cSDimitry Andric 4609dff0c46cSDimitry Andric if (isBitcodeWrapper(buf, buf + 4)) { 4610dff0c46cSDimitry Andric const unsigned char *bitcodeStart = buf; 4611dff0c46cSDimitry Andric const unsigned char *bitcodeEnd = buf + 16; 4612dff0c46cSDimitry Andric SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); 461339d628a0SDimitry Andric Bytes.dropLeadingBytes(bitcodeStart - buf); 461439d628a0SDimitry Andric Bytes.setKnownObjectSize(bitcodeEnd - bitcodeStart); 4615dff0c46cSDimitry Andric } 461691bc56edSDimitry Andric return std::error_code(); 4617f785676fSDimitry Andric } 4618f785676fSDimitry Andric 4619f785676fSDimitry Andric namespace { 462091bc56edSDimitry Andric class BitcodeErrorCategoryType : public std::error_category { 462191bc56edSDimitry Andric const char *name() const LLVM_NOEXCEPT override { 4622f785676fSDimitry Andric return "llvm.bitcode"; 4623f785676fSDimitry Andric } 462491bc56edSDimitry Andric std::string message(int IE) const override { 462539d628a0SDimitry Andric BitcodeError E = static_cast<BitcodeError>(IE); 4626f785676fSDimitry Andric switch (E) { 462739d628a0SDimitry Andric case BitcodeError::InvalidBitcodeSignature: 4628f785676fSDimitry Andric return "Invalid bitcode signature"; 462939d628a0SDimitry Andric case BitcodeError::CorruptedBitcode: 463039d628a0SDimitry Andric return "Corrupted bitcode"; 4631f785676fSDimitry Andric } 4632f785676fSDimitry Andric llvm_unreachable("Unknown error type!"); 4633f785676fSDimitry Andric } 4634f785676fSDimitry Andric }; 4635f785676fSDimitry Andric } 4636f785676fSDimitry Andric 463739d628a0SDimitry Andric static ManagedStatic<BitcodeErrorCategoryType> ErrorCategory; 463839d628a0SDimitry Andric 463939d628a0SDimitry Andric const std::error_category &llvm::BitcodeErrorCategory() { 464039d628a0SDimitry Andric return *ErrorCategory; 4641dff0c46cSDimitry Andric } 4642f22ef01cSRoman Divacky 4643f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4644f22ef01cSRoman Divacky // External interface 4645f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4646f22ef01cSRoman Divacky 464739d628a0SDimitry Andric /// \brief Get a lazy one-at-time loading module from bitcode. 4648f22ef01cSRoman Divacky /// 464939d628a0SDimitry Andric /// This isn't always used in a lazy context. In particular, it's also used by 465039d628a0SDimitry Andric /// \a parseBitcodeFile(). If this is truly lazy, then we need to eagerly pull 465139d628a0SDimitry Andric /// in forward-referenced functions from block address references. 465239d628a0SDimitry Andric /// 465339d628a0SDimitry Andric /// \param[in] WillMaterializeAll Set to \c true if the caller promises to 465439d628a0SDimitry Andric /// materialize everything -- in particular, if this isn't truly lazy. 465539d628a0SDimitry Andric static ErrorOr<Module *> 465639d628a0SDimitry Andric getLazyBitcodeModuleImpl(std::unique_ptr<MemoryBuffer> &&Buffer, 465739d628a0SDimitry Andric LLVMContext &Context, bool WillMaterializeAll, 4658ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4659ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false) { 4660f22ef01cSRoman Divacky Module *M = new Module(Buffer->getBufferIdentifier(), Context); 466139d628a0SDimitry Andric BitcodeReader *R = 466239d628a0SDimitry Andric new BitcodeReader(Buffer.get(), Context, DiagnosticHandler); 4663f22ef01cSRoman Divacky M->setMaterializer(R); 466439d628a0SDimitry Andric 466539d628a0SDimitry Andric auto cleanupOnError = [&](std::error_code EC) { 466691bc56edSDimitry Andric R->releaseBuffer(); // Never take ownership on error. 4667f22ef01cSRoman Divacky delete M; // Also deletes R. 466891bc56edSDimitry Andric return EC; 466939d628a0SDimitry Andric }; 4670dff0c46cSDimitry Andric 4671ff0cc061SDimitry Andric // Delay parsing Metadata if ShouldLazyLoadMetadata is true. 4672ff0cc061SDimitry Andric if (std::error_code EC = R->ParseBitcodeInto(M, ShouldLazyLoadMetadata)) 467339d628a0SDimitry Andric return cleanupOnError(EC); 4674dff0c46cSDimitry Andric 467539d628a0SDimitry Andric if (!WillMaterializeAll) 467639d628a0SDimitry Andric // Resolve forward references from blockaddresses. 467739d628a0SDimitry Andric if (std::error_code EC = R->materializeForwardReferencedFunctions()) 467839d628a0SDimitry Andric return cleanupOnError(EC); 467939d628a0SDimitry Andric 468039d628a0SDimitry Andric Buffer.release(); // The BitcodeReader owns it now. 4681dff0c46cSDimitry Andric return M; 4682dff0c46cSDimitry Andric } 4683dff0c46cSDimitry Andric 468439d628a0SDimitry Andric ErrorOr<Module *> 468539d628a0SDimitry Andric llvm::getLazyBitcodeModule(std::unique_ptr<MemoryBuffer> &&Buffer, 4686dff0c46cSDimitry Andric LLVMContext &Context, 4687ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4688ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 468939d628a0SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buffer), Context, false, 4690ff0cc061SDimitry Andric DiagnosticHandler, ShouldLazyLoadMetadata); 4691f22ef01cSRoman Divacky } 4692f22ef01cSRoman Divacky 469339d628a0SDimitry Andric ErrorOr<std::unique_ptr<Module>> 469439d628a0SDimitry Andric llvm::getStreamedBitcodeModule(StringRef Name, DataStreamer *Streamer, 469539d628a0SDimitry Andric LLVMContext &Context, 469639d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 469739d628a0SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 469839d628a0SDimitry Andric BitcodeReader *R = new BitcodeReader(Streamer, Context, DiagnosticHandler); 469939d628a0SDimitry Andric M->setMaterializer(R); 470039d628a0SDimitry Andric if (std::error_code EC = R->ParseBitcodeInto(M.get())) 470139d628a0SDimitry Andric return EC; 470239d628a0SDimitry Andric return std::move(M); 470339d628a0SDimitry Andric } 470439d628a0SDimitry Andric 470539d628a0SDimitry Andric ErrorOr<Module *> 470639d628a0SDimitry Andric llvm::parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, 470739d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 470839d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 470939d628a0SDimitry Andric ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModuleImpl( 471039d628a0SDimitry Andric std::move(Buf), Context, true, DiagnosticHandler); 471191bc56edSDimitry Andric if (!ModuleOrErr) 471291bc56edSDimitry Andric return ModuleOrErr; 471391bc56edSDimitry Andric Module *M = ModuleOrErr.get(); 4714f22ef01cSRoman Divacky // Read in the entire module, and destroy the BitcodeReader. 471539d628a0SDimitry Andric if (std::error_code EC = M->materializeAllPermanently()) { 4716f22ef01cSRoman Divacky delete M; 471791bc56edSDimitry Andric return EC; 4718f22ef01cSRoman Divacky } 47192754fe60SDimitry Andric 4720dff0c46cSDimitry Andric // TODO: Restore the use-lists to the in-memory state when the bitcode was 4721dff0c46cSDimitry Andric // written. We must defer until the Module has been fully materialized. 4722dff0c46cSDimitry Andric 4723f22ef01cSRoman Divacky return M; 4724f22ef01cSRoman Divacky } 47252754fe60SDimitry Andric 472639d628a0SDimitry Andric std::string 472739d628a0SDimitry Andric llvm::getBitcodeTargetTriple(MemoryBufferRef Buffer, LLVMContext &Context, 472839d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 472939d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 473039d628a0SDimitry Andric auto R = llvm::make_unique<BitcodeReader>(Buf.release(), Context, 473139d628a0SDimitry Andric DiagnosticHandler); 473291bc56edSDimitry Andric ErrorOr<std::string> Triple = R->parseTriple(); 473391bc56edSDimitry Andric if (Triple.getError()) 473491bc56edSDimitry Andric return ""; 473591bc56edSDimitry Andric return Triple.get(); 47362754fe60SDimitry Andric } 4737