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 478f0fd8f6SDimitry Andric /// As we resolve forward-referenced constants, we add information about them 488f0fd8f6SDimitry Andric /// to this vector. This allows us to resolve them in bulk instead of 498f0fd8f6SDimitry Andric /// 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 898f0fd8f6SDimitry Andric void assignValue(Value *V, unsigned Idx); 90ff0cc061SDimitry Andric 918f0fd8f6SDimitry Andric /// Once all constants are read, this method bulk resolves any forward 928f0fd8f6SDimitry Andric /// references. 938f0fd8f6SDimitry 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); 1288f0fd8f6SDimitry 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; 1358f0fd8f6SDimitry Andric Module *TheModule = nullptr; 136ff0cc061SDimitry Andric std::unique_ptr<MemoryBuffer> Buffer; 137ff0cc061SDimitry Andric std::unique_ptr<BitstreamReader> StreamFile; 138ff0cc061SDimitry Andric BitstreamCursor Stream; 1398f0fd8f6SDimitry Andric uint64_t NextUnreadBit = 0; 1408f0fd8f6SDimitry Andric bool SeenValueSymbolTable = false; 141ff0cc061SDimitry Andric 142ff0cc061SDimitry Andric std::vector<Type*> TypeList; 143ff0cc061SDimitry Andric BitcodeReaderValueList ValueList; 144ff0cc061SDimitry Andric BitcodeReaderMDValueList MDValueList; 145ff0cc061SDimitry Andric std::vector<Comdat *> ComdatList; 146ff0cc061SDimitry Andric SmallVector<Instruction *, 64> InstructionList; 147ff0cc061SDimitry Andric 148ff0cc061SDimitry Andric std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 149ff0cc061SDimitry Andric std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 150ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixes; 151ff0cc061SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologues; 1528f0fd8f6SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPersonalityFns; 153ff0cc061SDimitry Andric 154ff0cc061SDimitry Andric SmallVector<Instruction*, 64> InstsWithTBAATag; 155ff0cc061SDimitry Andric 1568f0fd8f6SDimitry Andric /// The set of attributes by index. Index zero in the file is for null, and 1578f0fd8f6SDimitry Andric /// is thus not represented here. As such all indices are off by one. 158ff0cc061SDimitry Andric std::vector<AttributeSet> MAttributes; 159ff0cc061SDimitry Andric 160ff0cc061SDimitry Andric /// \brief The set of attribute groups. 161ff0cc061SDimitry Andric std::map<unsigned, AttributeSet> MAttributeGroups; 162ff0cc061SDimitry Andric 1638f0fd8f6SDimitry Andric /// While parsing a function body, this is a list of the basic blocks for the 1648f0fd8f6SDimitry Andric /// function. 165ff0cc061SDimitry Andric std::vector<BasicBlock*> FunctionBBs; 166ff0cc061SDimitry Andric 167ff0cc061SDimitry Andric // When reading the module header, this list is populated with functions that 168ff0cc061SDimitry Andric // have bodies later in the file. 169ff0cc061SDimitry Andric std::vector<Function*> FunctionsWithBodies; 170ff0cc061SDimitry Andric 171ff0cc061SDimitry Andric // When intrinsic functions are encountered which require upgrading they are 172ff0cc061SDimitry Andric // stored here with their replacement function. 1733dac3a9bSDimitry Andric typedef DenseMap<Function*, Function*> UpgradedIntrinsicMap; 174ff0cc061SDimitry Andric UpgradedIntrinsicMap UpgradedIntrinsics; 175ff0cc061SDimitry Andric 176ff0cc061SDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 177ff0cc061SDimitry Andric DenseMap<unsigned, unsigned> MDKindMap; 178ff0cc061SDimitry Andric 179ff0cc061SDimitry Andric // Several operations happen after the module header has been read, but 180ff0cc061SDimitry Andric // before function bodies are processed. This keeps track of whether 181ff0cc061SDimitry Andric // we've done this yet. 1828f0fd8f6SDimitry Andric bool SeenFirstFunctionBody = false; 183ff0cc061SDimitry Andric 1848f0fd8f6SDimitry Andric /// When function bodies are initially scanned, this map contains info about 1858f0fd8f6SDimitry Andric /// where to find deferred function body in the stream. 186ff0cc061SDimitry Andric DenseMap<Function*, uint64_t> DeferredFunctionInfo; 187ff0cc061SDimitry Andric 188ff0cc061SDimitry Andric /// When Metadata block is initially scanned when parsing the module, we may 189ff0cc061SDimitry Andric /// choose to defer parsing of the metadata. This vector contains info about 190ff0cc061SDimitry Andric /// which Metadata blocks are deferred. 191ff0cc061SDimitry Andric std::vector<uint64_t> DeferredMetadataInfo; 192ff0cc061SDimitry Andric 193ff0cc061SDimitry Andric /// These are basic blocks forward-referenced by block addresses. They are 194ff0cc061SDimitry Andric /// inserted lazily into functions when they're loaded. The basic block ID is 195ff0cc061SDimitry Andric /// its index into the vector. 196ff0cc061SDimitry Andric DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs; 197ff0cc061SDimitry Andric std::deque<Function *> BasicBlockFwdRefQueue; 198ff0cc061SDimitry Andric 1998f0fd8f6SDimitry Andric /// Indicates that we are using a new encoding for instruction operands where 2008f0fd8f6SDimitry Andric /// most operands in the current FUNCTION_BLOCK are encoded relative to the 2018f0fd8f6SDimitry Andric /// instruction number, for a more compact encoding. Some instruction 2028f0fd8f6SDimitry Andric /// operands are not relative to the instruction ID: basic block numbers, and 2038f0fd8f6SDimitry Andric /// types. Once the old style function blocks have been phased out, we would 204ff0cc061SDimitry Andric /// not need this flag. 2058f0fd8f6SDimitry Andric bool UseRelativeIDs = false; 206ff0cc061SDimitry Andric 207ff0cc061SDimitry Andric /// True if all functions will be materialized, negating the need to process 208ff0cc061SDimitry Andric /// (e.g.) blockaddress forward references. 2098f0fd8f6SDimitry Andric bool WillMaterializeAllForwardRefs = false; 210ff0cc061SDimitry Andric 211ff0cc061SDimitry Andric /// Functions that have block addresses taken. This is usually empty. 212ff0cc061SDimitry Andric SmallPtrSet<const Function *, 4> BlockAddressesTaken; 213ff0cc061SDimitry Andric 214ff0cc061SDimitry Andric /// True if any Metadata block has been materialized. 2158f0fd8f6SDimitry Andric bool IsMetadataMaterialized = false; 216ff0cc061SDimitry Andric 217ff0cc061SDimitry Andric bool StripDebugInfo = false; 218ff0cc061SDimitry Andric 219ff0cc061SDimitry Andric public: 2208f0fd8f6SDimitry Andric std::error_code error(BitcodeError E, const Twine &Message); 2218f0fd8f6SDimitry Andric std::error_code error(BitcodeError E); 2228f0fd8f6SDimitry Andric std::error_code error(const Twine &Message); 223ff0cc061SDimitry Andric 2248f0fd8f6SDimitry Andric BitcodeReader(MemoryBuffer *Buffer, LLVMContext &Context, 225ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 2268f0fd8f6SDimitry Andric BitcodeReader(LLVMContext &Context, 227ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler); 2288f0fd8f6SDimitry Andric ~BitcodeReader() override { freeState(); } 229ff0cc061SDimitry Andric 230ff0cc061SDimitry Andric std::error_code materializeForwardReferencedFunctions(); 231ff0cc061SDimitry Andric 2328f0fd8f6SDimitry Andric void freeState(); 233ff0cc061SDimitry Andric 234ff0cc061SDimitry Andric void releaseBuffer(); 235ff0cc061SDimitry Andric 236ff0cc061SDimitry Andric bool isDematerializable(const GlobalValue *GV) const override; 237ff0cc061SDimitry Andric std::error_code materialize(GlobalValue *GV) override; 238ff0cc061SDimitry Andric std::error_code materializeModule(Module *M) override; 239ff0cc061SDimitry Andric std::vector<StructType *> getIdentifiedStructTypes() const override; 240ff0cc061SDimitry Andric void dematerialize(GlobalValue *GV) override; 241ff0cc061SDimitry Andric 2428f0fd8f6SDimitry Andric /// \brief Main interface to parsing a bitcode buffer. 2438f0fd8f6SDimitry Andric /// \returns true if an error occurred. 2448f0fd8f6SDimitry Andric std::error_code parseBitcodeInto(std::unique_ptr<DataStreamer> Streamer, 2458f0fd8f6SDimitry Andric Module *M, 246ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false); 247ff0cc061SDimitry Andric 2488f0fd8f6SDimitry Andric /// \brief Cheap mechanism to just extract module triple 2498f0fd8f6SDimitry Andric /// \returns true if an error occurred. 250ff0cc061SDimitry Andric ErrorOr<std::string> parseTriple(); 251ff0cc061SDimitry Andric 252ff0cc061SDimitry Andric static uint64_t decodeSignRotatedValue(uint64_t V); 253ff0cc061SDimitry Andric 254ff0cc061SDimitry Andric /// Materialize any deferred Metadata block. 255ff0cc061SDimitry Andric std::error_code materializeMetadata() override; 256ff0cc061SDimitry Andric 257ff0cc061SDimitry Andric void setStripDebugInfo() override; 258ff0cc061SDimitry Andric 259ff0cc061SDimitry Andric private: 260ff0cc061SDimitry Andric std::vector<StructType *> IdentifiedStructTypes; 261ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name); 262ff0cc061SDimitry Andric StructType *createIdentifiedStructType(LLVMContext &Context); 263ff0cc061SDimitry Andric 264ff0cc061SDimitry Andric Type *getTypeByID(unsigned ID); 265ff0cc061SDimitry Andric Value *getFnValueByID(unsigned ID, Type *Ty) { 266ff0cc061SDimitry Andric if (Ty && Ty->isMetadataTy()) 267ff0cc061SDimitry Andric return MetadataAsValue::get(Ty->getContext(), getFnMetadataByID(ID)); 268ff0cc061SDimitry Andric return ValueList.getValueFwdRef(ID, Ty); 269ff0cc061SDimitry Andric } 270ff0cc061SDimitry Andric Metadata *getFnMetadataByID(unsigned ID) { 271ff0cc061SDimitry Andric return MDValueList.getValueFwdRef(ID); 272ff0cc061SDimitry Andric } 273ff0cc061SDimitry Andric BasicBlock *getBasicBlock(unsigned ID) const { 274ff0cc061SDimitry Andric if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID 275ff0cc061SDimitry Andric return FunctionBBs[ID]; 276ff0cc061SDimitry Andric } 277ff0cc061SDimitry Andric AttributeSet getAttributes(unsigned i) const { 278ff0cc061SDimitry Andric if (i-1 < MAttributes.size()) 279ff0cc061SDimitry Andric return MAttributes[i-1]; 280ff0cc061SDimitry Andric return AttributeSet(); 281ff0cc061SDimitry Andric } 282ff0cc061SDimitry Andric 2838f0fd8f6SDimitry Andric /// Read a value/type pair out of the specified record from slot 'Slot'. 2848f0fd8f6SDimitry Andric /// Increment Slot past the number of slots used in the record. Return true on 2858f0fd8f6SDimitry Andric /// failure. 286ff0cc061SDimitry Andric bool getValueTypePair(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 287ff0cc061SDimitry Andric unsigned InstNum, Value *&ResVal) { 288ff0cc061SDimitry Andric if (Slot == Record.size()) return true; 289ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot++]; 290ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 291ff0cc061SDimitry Andric if (UseRelativeIDs) 292ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 293ff0cc061SDimitry Andric if (ValNo < InstNum) { 294ff0cc061SDimitry Andric // If this is not a forward reference, just return the value we already 295ff0cc061SDimitry Andric // have. 296ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, nullptr); 297ff0cc061SDimitry Andric return ResVal == nullptr; 298ff0cc061SDimitry Andric } 299ff0cc061SDimitry Andric if (Slot == Record.size()) 300ff0cc061SDimitry Andric return true; 301ff0cc061SDimitry Andric 302ff0cc061SDimitry Andric unsigned TypeNo = (unsigned)Record[Slot++]; 303ff0cc061SDimitry Andric ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 304ff0cc061SDimitry Andric return ResVal == nullptr; 305ff0cc061SDimitry Andric } 306ff0cc061SDimitry Andric 3078f0fd8f6SDimitry Andric /// Read a value out of the specified record from slot 'Slot'. Increment Slot 3088f0fd8f6SDimitry Andric /// past the number of slots used by the value in the record. Return true if 3098f0fd8f6SDimitry Andric /// there is an error. 310ff0cc061SDimitry Andric bool popValue(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, 311ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 312ff0cc061SDimitry Andric if (getValue(Record, Slot, InstNum, Ty, ResVal)) 313ff0cc061SDimitry Andric return true; 314ff0cc061SDimitry Andric // All values currently take a single record slot. 315ff0cc061SDimitry Andric ++Slot; 316ff0cc061SDimitry Andric return false; 317ff0cc061SDimitry Andric } 318ff0cc061SDimitry Andric 3198f0fd8f6SDimitry Andric /// Like popValue, but does not increment the Slot number. 320ff0cc061SDimitry Andric bool getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 321ff0cc061SDimitry Andric unsigned InstNum, Type *Ty, Value *&ResVal) { 322ff0cc061SDimitry Andric ResVal = getValue(Record, Slot, InstNum, Ty); 323ff0cc061SDimitry Andric return ResVal == nullptr; 324ff0cc061SDimitry Andric } 325ff0cc061SDimitry Andric 3268f0fd8f6SDimitry Andric /// Version of getValue that returns ResVal directly, or 0 if there is an 3278f0fd8f6SDimitry Andric /// error. 328ff0cc061SDimitry Andric Value *getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 329ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 330ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 331ff0cc061SDimitry Andric unsigned ValNo = (unsigned)Record[Slot]; 332ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 333ff0cc061SDimitry Andric if (UseRelativeIDs) 334ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 335ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 336ff0cc061SDimitry Andric } 337ff0cc061SDimitry Andric 3388f0fd8f6SDimitry Andric /// Like getValue, but decodes signed VBRs. 339ff0cc061SDimitry Andric Value *getValueSigned(SmallVectorImpl<uint64_t> &Record, unsigned Slot, 340ff0cc061SDimitry Andric unsigned InstNum, Type *Ty) { 341ff0cc061SDimitry Andric if (Slot == Record.size()) return nullptr; 342ff0cc061SDimitry Andric unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]); 343ff0cc061SDimitry Andric // Adjust the ValNo, if it was encoded relative to the InstNum. 344ff0cc061SDimitry Andric if (UseRelativeIDs) 345ff0cc061SDimitry Andric ValNo = InstNum - ValNo; 346ff0cc061SDimitry Andric return getFnValueByID(ValNo, Ty); 347ff0cc061SDimitry Andric } 348ff0cc061SDimitry Andric 349ff0cc061SDimitry Andric /// Converts alignment exponent (i.e. power of two (or zero)) to the 350ff0cc061SDimitry Andric /// corresponding alignment to use. If alignment is too large, returns 351ff0cc061SDimitry Andric /// a corresponding error code. 352ff0cc061SDimitry Andric std::error_code parseAlignmentValue(uint64_t Exponent, unsigned &Alignment); 3538f0fd8f6SDimitry Andric std::error_code parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); 3548f0fd8f6SDimitry Andric std::error_code parseModule(bool Resume, bool ShouldLazyLoadMetadata = false); 3558f0fd8f6SDimitry Andric std::error_code parseAttributeBlock(); 3568f0fd8f6SDimitry Andric std::error_code parseAttributeGroupBlock(); 3578f0fd8f6SDimitry Andric std::error_code parseTypeTable(); 3588f0fd8f6SDimitry Andric std::error_code parseTypeTableBody(); 359ff0cc061SDimitry Andric 3608f0fd8f6SDimitry Andric std::error_code parseValueSymbolTable(); 3618f0fd8f6SDimitry Andric std::error_code parseConstants(); 3628f0fd8f6SDimitry Andric std::error_code rememberAndSkipFunctionBody(); 363ff0cc061SDimitry Andric /// Save the positions of the Metadata blocks and skip parsing the blocks. 364ff0cc061SDimitry Andric std::error_code rememberAndSkipMetadata(); 3658f0fd8f6SDimitry Andric std::error_code parseFunctionBody(Function *F); 3668f0fd8f6SDimitry Andric std::error_code globalCleanup(); 3678f0fd8f6SDimitry Andric std::error_code resolveGlobalAndAliasInits(); 3688f0fd8f6SDimitry Andric std::error_code parseMetadata(); 3698f0fd8f6SDimitry Andric std::error_code parseMetadataAttachment(Function &F); 370ff0cc061SDimitry Andric ErrorOr<std::string> parseModuleTriple(); 3718f0fd8f6SDimitry Andric std::error_code parseUseLists(); 3728f0fd8f6SDimitry Andric std::error_code initStream(std::unique_ptr<DataStreamer> Streamer); 3738f0fd8f6SDimitry Andric std::error_code initStreamFromBuffer(); 3748f0fd8f6SDimitry Andric std::error_code initLazyStream(std::unique_ptr<DataStreamer> Streamer); 3758f0fd8f6SDimitry Andric std::error_code findFunctionInStream( 376ff0cc061SDimitry Andric Function *F, 377ff0cc061SDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator); 378ff0cc061SDimitry Andric }; 379ff0cc061SDimitry Andric } // namespace 380ff0cc061SDimitry Andric 38139d628a0SDimitry Andric BitcodeDiagnosticInfo::BitcodeDiagnosticInfo(std::error_code EC, 38239d628a0SDimitry Andric DiagnosticSeverity Severity, 38339d628a0SDimitry Andric const Twine &Msg) 38439d628a0SDimitry Andric : DiagnosticInfo(DK_Bitcode, Severity), Msg(Msg), EC(EC) {} 38539d628a0SDimitry Andric 38639d628a0SDimitry Andric void BitcodeDiagnosticInfo::print(DiagnosticPrinter &DP) const { DP << Msg; } 38739d628a0SDimitry Andric 3888f0fd8f6SDimitry Andric static std::error_code error(DiagnosticHandlerFunction DiagnosticHandler, 38939d628a0SDimitry Andric std::error_code EC, const Twine &Message) { 39039d628a0SDimitry Andric BitcodeDiagnosticInfo DI(EC, DS_Error, Message); 39139d628a0SDimitry Andric DiagnosticHandler(DI); 39239d628a0SDimitry Andric return EC; 393dff0c46cSDimitry Andric } 39439d628a0SDimitry Andric 3958f0fd8f6SDimitry Andric static std::error_code error(DiagnosticHandlerFunction DiagnosticHandler, 39639d628a0SDimitry Andric std::error_code EC) { 3978f0fd8f6SDimitry Andric return error(DiagnosticHandler, EC, EC.message()); 39839d628a0SDimitry Andric } 39939d628a0SDimitry Andric 4008f0fd8f6SDimitry Andric static std::error_code error(DiagnosticHandlerFunction DiagnosticHandler, 401ff0cc061SDimitry Andric const Twine &Message) { 4028f0fd8f6SDimitry Andric return error(DiagnosticHandler, 403ff0cc061SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 404ff0cc061SDimitry Andric } 405ff0cc061SDimitry Andric 4068f0fd8f6SDimitry Andric std::error_code BitcodeReader::error(BitcodeError E, const Twine &Message) { 4078f0fd8f6SDimitry Andric return ::error(DiagnosticHandler, make_error_code(E), Message); 40839d628a0SDimitry Andric } 40939d628a0SDimitry Andric 4108f0fd8f6SDimitry Andric std::error_code BitcodeReader::error(const Twine &Message) { 4118f0fd8f6SDimitry Andric return ::error(DiagnosticHandler, 41239d628a0SDimitry Andric make_error_code(BitcodeError::CorruptedBitcode), Message); 41339d628a0SDimitry Andric } 41439d628a0SDimitry Andric 4158f0fd8f6SDimitry Andric std::error_code BitcodeReader::error(BitcodeError E) { 4168f0fd8f6SDimitry Andric return ::error(DiagnosticHandler, make_error_code(E)); 41739d628a0SDimitry Andric } 41839d628a0SDimitry Andric 41939d628a0SDimitry Andric static DiagnosticHandlerFunction getDiagHandler(DiagnosticHandlerFunction F, 42039d628a0SDimitry Andric LLVMContext &C) { 42139d628a0SDimitry Andric if (F) 42239d628a0SDimitry Andric return F; 42339d628a0SDimitry Andric return [&C](const DiagnosticInfo &DI) { C.diagnose(DI); }; 42439d628a0SDimitry Andric } 42539d628a0SDimitry Andric 4268f0fd8f6SDimitry Andric BitcodeReader::BitcodeReader(MemoryBuffer *Buffer, LLVMContext &Context, 42739d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 4288f0fd8f6SDimitry Andric : Context(Context), 4298f0fd8f6SDimitry Andric DiagnosticHandler(getDiagHandler(DiagnosticHandler, Context)), 4303dac3a9bSDimitry Andric Buffer(Buffer), ValueList(Context), MDValueList(Context) {} 43139d628a0SDimitry Andric 4328f0fd8f6SDimitry Andric BitcodeReader::BitcodeReader(LLVMContext &Context, 43339d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) 4348f0fd8f6SDimitry Andric : Context(Context), 4358f0fd8f6SDimitry Andric DiagnosticHandler(getDiagHandler(DiagnosticHandler, Context)), 4363dac3a9bSDimitry Andric Buffer(nullptr), ValueList(Context), MDValueList(Context) {} 43739d628a0SDimitry Andric 43839d628a0SDimitry Andric std::error_code BitcodeReader::materializeForwardReferencedFunctions() { 43939d628a0SDimitry Andric if (WillMaterializeAllForwardRefs) 44039d628a0SDimitry Andric return std::error_code(); 44139d628a0SDimitry Andric 44239d628a0SDimitry Andric // Prevent recursion. 44339d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 44439d628a0SDimitry Andric 44539d628a0SDimitry Andric while (!BasicBlockFwdRefQueue.empty()) { 44639d628a0SDimitry Andric Function *F = BasicBlockFwdRefQueue.front(); 44739d628a0SDimitry Andric BasicBlockFwdRefQueue.pop_front(); 44839d628a0SDimitry Andric assert(F && "Expected valid function"); 44939d628a0SDimitry Andric if (!BasicBlockFwdRefs.count(F)) 45039d628a0SDimitry Andric // Already materialized. 45139d628a0SDimitry Andric continue; 45239d628a0SDimitry Andric 45339d628a0SDimitry Andric // Check for a function that isn't materializable to prevent an infinite 45439d628a0SDimitry Andric // loop. When parsing a blockaddress stored in a global variable, there 45539d628a0SDimitry Andric // isn't a trivial way to check if a function will have a body without a 45639d628a0SDimitry Andric // linear search through FunctionsWithBodies, so just check it here. 45739d628a0SDimitry Andric if (!F->isMaterializable()) 4588f0fd8f6SDimitry Andric return error("Never resolved function from blockaddress"); 45939d628a0SDimitry Andric 46039d628a0SDimitry Andric // Try to materialize F. 46139d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 46239d628a0SDimitry Andric return EC; 46339d628a0SDimitry Andric } 46439d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Function missing from queue"); 46539d628a0SDimitry Andric 46639d628a0SDimitry Andric // Reset state. 46739d628a0SDimitry Andric WillMaterializeAllForwardRefs = false; 46839d628a0SDimitry Andric return std::error_code(); 469dff0c46cSDimitry Andric } 470dff0c46cSDimitry Andric 4718f0fd8f6SDimitry Andric void BitcodeReader::freeState() { 47291bc56edSDimitry Andric Buffer = nullptr; 47317a519f9SDimitry Andric std::vector<Type*>().swap(TypeList); 474f22ef01cSRoman Divacky ValueList.clear(); 475f22ef01cSRoman Divacky MDValueList.clear(); 47691bc56edSDimitry Andric std::vector<Comdat *>().swap(ComdatList); 477f22ef01cSRoman Divacky 478139f7f9bSDimitry Andric std::vector<AttributeSet>().swap(MAttributes); 479f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 480f22ef01cSRoman Divacky std::vector<Function*>().swap(FunctionsWithBodies); 481f22ef01cSRoman Divacky DeferredFunctionInfo.clear(); 482ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 483e580952dSDimitry Andric MDKindMap.clear(); 4843861d79fSDimitry Andric 48539d628a0SDimitry Andric assert(BasicBlockFwdRefs.empty() && "Unresolved blockaddress fwd references"); 48639d628a0SDimitry Andric BasicBlockFwdRefQueue.clear(); 487f22ef01cSRoman Divacky } 488f22ef01cSRoman Divacky 489f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 490f22ef01cSRoman Divacky // Helper functions to implement forward reference resolution, etc. 491f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 492f22ef01cSRoman Divacky 4938f0fd8f6SDimitry Andric /// Convert a string from a record into an std::string, return true on failure. 494f22ef01cSRoman Divacky template <typename StrTy> 4958f0fd8f6SDimitry Andric static bool convertToString(ArrayRef<uint64_t> Record, unsigned Idx, 496f22ef01cSRoman Divacky StrTy &Result) { 497f22ef01cSRoman Divacky if (Idx > Record.size()) 498f22ef01cSRoman Divacky return true; 499f22ef01cSRoman Divacky 500f22ef01cSRoman Divacky for (unsigned i = Idx, e = Record.size(); i != e; ++i) 501f22ef01cSRoman Divacky Result += (char)Record[i]; 502f22ef01cSRoman Divacky return false; 503f22ef01cSRoman Divacky } 504f22ef01cSRoman Divacky 505ff0cc061SDimitry Andric static bool hasImplicitComdat(size_t Val) { 506ff0cc061SDimitry Andric switch (Val) { 507ff0cc061SDimitry Andric default: 508ff0cc061SDimitry Andric return false; 509ff0cc061SDimitry Andric case 1: // Old WeakAnyLinkage 510ff0cc061SDimitry Andric case 4: // Old LinkOnceAnyLinkage 511ff0cc061SDimitry Andric case 10: // Old WeakODRLinkage 512ff0cc061SDimitry Andric case 11: // Old LinkOnceODRLinkage 513ff0cc061SDimitry Andric return true; 514ff0cc061SDimitry Andric } 515ff0cc061SDimitry Andric } 516ff0cc061SDimitry Andric 51739d628a0SDimitry Andric static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val) { 518f22ef01cSRoman Divacky switch (Val) { 519f22ef01cSRoman Divacky default: // Map unknown/new linkages to external 52039d628a0SDimitry Andric case 0: 52139d628a0SDimitry Andric return GlobalValue::ExternalLinkage; 52239d628a0SDimitry Andric case 2: 52339d628a0SDimitry Andric return GlobalValue::AppendingLinkage; 52439d628a0SDimitry Andric case 3: 52539d628a0SDimitry Andric return GlobalValue::InternalLinkage; 52639d628a0SDimitry Andric case 5: 52739d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLImportLinkage 52839d628a0SDimitry Andric case 6: 52939d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete DLLExportLinkage 53039d628a0SDimitry Andric case 7: 53139d628a0SDimitry Andric return GlobalValue::ExternalWeakLinkage; 53239d628a0SDimitry Andric case 8: 53339d628a0SDimitry Andric return GlobalValue::CommonLinkage; 53439d628a0SDimitry Andric case 9: 53539d628a0SDimitry Andric return GlobalValue::PrivateLinkage; 53639d628a0SDimitry Andric case 12: 53739d628a0SDimitry Andric return GlobalValue::AvailableExternallyLinkage; 53891bc56edSDimitry Andric case 13: 53991bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateLinkage 54091bc56edSDimitry Andric case 14: 54191bc56edSDimitry Andric return GlobalValue::PrivateLinkage; // Obsolete LinkerPrivateWeakLinkage 54239d628a0SDimitry Andric case 15: 54339d628a0SDimitry Andric return GlobalValue::ExternalLinkage; // Obsolete LinkOnceODRAutoHideLinkage 544ff0cc061SDimitry Andric case 1: // Old value with implicit comdat. 545ff0cc061SDimitry Andric case 16: 546ff0cc061SDimitry Andric return GlobalValue::WeakAnyLinkage; 547ff0cc061SDimitry Andric case 10: // Old value with implicit comdat. 548ff0cc061SDimitry Andric case 17: 549ff0cc061SDimitry Andric return GlobalValue::WeakODRLinkage; 550ff0cc061SDimitry Andric case 4: // Old value with implicit comdat. 551ff0cc061SDimitry Andric case 18: 552ff0cc061SDimitry Andric return GlobalValue::LinkOnceAnyLinkage; 553ff0cc061SDimitry Andric case 11: // Old value with implicit comdat. 554ff0cc061SDimitry Andric case 19: 555ff0cc061SDimitry Andric return GlobalValue::LinkOnceODRLinkage; 556f22ef01cSRoman Divacky } 557f22ef01cSRoman Divacky } 558f22ef01cSRoman Divacky 5598f0fd8f6SDimitry Andric static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val) { 560f22ef01cSRoman Divacky switch (Val) { 561f22ef01cSRoman Divacky default: // Map unknown visibilities to default. 562f22ef01cSRoman Divacky case 0: return GlobalValue::DefaultVisibility; 563f22ef01cSRoman Divacky case 1: return GlobalValue::HiddenVisibility; 564f22ef01cSRoman Divacky case 2: return GlobalValue::ProtectedVisibility; 565f22ef01cSRoman Divacky } 566f22ef01cSRoman Divacky } 567f22ef01cSRoman Divacky 56891bc56edSDimitry Andric static GlobalValue::DLLStorageClassTypes 5698f0fd8f6SDimitry Andric getDecodedDLLStorageClass(unsigned Val) { 57091bc56edSDimitry Andric switch (Val) { 57191bc56edSDimitry Andric default: // Map unknown values to default. 57291bc56edSDimitry Andric case 0: return GlobalValue::DefaultStorageClass; 57391bc56edSDimitry Andric case 1: return GlobalValue::DLLImportStorageClass; 57491bc56edSDimitry Andric case 2: return GlobalValue::DLLExportStorageClass; 57591bc56edSDimitry Andric } 57691bc56edSDimitry Andric } 57791bc56edSDimitry Andric 5788f0fd8f6SDimitry Andric static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val) { 5797ae0e2c9SDimitry Andric switch (Val) { 5807ae0e2c9SDimitry Andric case 0: return GlobalVariable::NotThreadLocal; 5817ae0e2c9SDimitry Andric default: // Map unknown non-zero value to general dynamic. 5827ae0e2c9SDimitry Andric case 1: return GlobalVariable::GeneralDynamicTLSModel; 5837ae0e2c9SDimitry Andric case 2: return GlobalVariable::LocalDynamicTLSModel; 5847ae0e2c9SDimitry Andric case 3: return GlobalVariable::InitialExecTLSModel; 5857ae0e2c9SDimitry Andric case 4: return GlobalVariable::LocalExecTLSModel; 5867ae0e2c9SDimitry Andric } 5877ae0e2c9SDimitry Andric } 5887ae0e2c9SDimitry Andric 5898f0fd8f6SDimitry Andric static int getDecodedCastOpcode(unsigned Val) { 590f22ef01cSRoman Divacky switch (Val) { 591f22ef01cSRoman Divacky default: return -1; 592f22ef01cSRoman Divacky case bitc::CAST_TRUNC : return Instruction::Trunc; 593f22ef01cSRoman Divacky case bitc::CAST_ZEXT : return Instruction::ZExt; 594f22ef01cSRoman Divacky case bitc::CAST_SEXT : return Instruction::SExt; 595f22ef01cSRoman Divacky case bitc::CAST_FPTOUI : return Instruction::FPToUI; 596f22ef01cSRoman Divacky case bitc::CAST_FPTOSI : return Instruction::FPToSI; 597f22ef01cSRoman Divacky case bitc::CAST_UITOFP : return Instruction::UIToFP; 598f22ef01cSRoman Divacky case bitc::CAST_SITOFP : return Instruction::SIToFP; 599f22ef01cSRoman Divacky case bitc::CAST_FPTRUNC : return Instruction::FPTrunc; 600f22ef01cSRoman Divacky case bitc::CAST_FPEXT : return Instruction::FPExt; 601f22ef01cSRoman Divacky case bitc::CAST_PTRTOINT: return Instruction::PtrToInt; 602f22ef01cSRoman Divacky case bitc::CAST_INTTOPTR: return Instruction::IntToPtr; 603f22ef01cSRoman Divacky case bitc::CAST_BITCAST : return Instruction::BitCast; 604f785676fSDimitry Andric case bitc::CAST_ADDRSPACECAST: return Instruction::AddrSpaceCast; 605f22ef01cSRoman Divacky } 606f22ef01cSRoman Divacky } 607ff0cc061SDimitry Andric 6088f0fd8f6SDimitry Andric static int getDecodedBinaryOpcode(unsigned Val, Type *Ty) { 609ff0cc061SDimitry Andric bool IsFP = Ty->isFPOrFPVectorTy(); 610ff0cc061SDimitry Andric // BinOps are only valid for int/fp or vector of int/fp types 611ff0cc061SDimitry Andric if (!IsFP && !Ty->isIntOrIntVectorTy()) 612ff0cc061SDimitry Andric return -1; 613ff0cc061SDimitry Andric 614f22ef01cSRoman Divacky switch (Val) { 615ff0cc061SDimitry Andric default: 616ff0cc061SDimitry Andric return -1; 617f22ef01cSRoman Divacky case bitc::BINOP_ADD: 618ff0cc061SDimitry Andric return IsFP ? Instruction::FAdd : Instruction::Add; 619f22ef01cSRoman Divacky case bitc::BINOP_SUB: 620ff0cc061SDimitry Andric return IsFP ? Instruction::FSub : Instruction::Sub; 621f22ef01cSRoman Divacky case bitc::BINOP_MUL: 622ff0cc061SDimitry Andric return IsFP ? Instruction::FMul : Instruction::Mul; 623ff0cc061SDimitry Andric case bitc::BINOP_UDIV: 624ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::UDiv; 625f22ef01cSRoman Divacky case bitc::BINOP_SDIV: 626ff0cc061SDimitry Andric return IsFP ? Instruction::FDiv : Instruction::SDiv; 627ff0cc061SDimitry Andric case bitc::BINOP_UREM: 628ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::URem; 629f22ef01cSRoman Divacky case bitc::BINOP_SREM: 630ff0cc061SDimitry Andric return IsFP ? Instruction::FRem : Instruction::SRem; 631ff0cc061SDimitry Andric case bitc::BINOP_SHL: 632ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Shl; 633ff0cc061SDimitry Andric case bitc::BINOP_LSHR: 634ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::LShr; 635ff0cc061SDimitry Andric case bitc::BINOP_ASHR: 636ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::AShr; 637ff0cc061SDimitry Andric case bitc::BINOP_AND: 638ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::And; 639ff0cc061SDimitry Andric case bitc::BINOP_OR: 640ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Or; 641ff0cc061SDimitry Andric case bitc::BINOP_XOR: 642ff0cc061SDimitry Andric return IsFP ? -1 : Instruction::Xor; 643f22ef01cSRoman Divacky } 644f22ef01cSRoman Divacky } 645f22ef01cSRoman Divacky 6468f0fd8f6SDimitry Andric static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val) { 6476122f3e6SDimitry Andric switch (Val) { 6486122f3e6SDimitry Andric default: return AtomicRMWInst::BAD_BINOP; 6496122f3e6SDimitry Andric case bitc::RMW_XCHG: return AtomicRMWInst::Xchg; 6506122f3e6SDimitry Andric case bitc::RMW_ADD: return AtomicRMWInst::Add; 6516122f3e6SDimitry Andric case bitc::RMW_SUB: return AtomicRMWInst::Sub; 6526122f3e6SDimitry Andric case bitc::RMW_AND: return AtomicRMWInst::And; 6536122f3e6SDimitry Andric case bitc::RMW_NAND: return AtomicRMWInst::Nand; 6546122f3e6SDimitry Andric case bitc::RMW_OR: return AtomicRMWInst::Or; 6556122f3e6SDimitry Andric case bitc::RMW_XOR: return AtomicRMWInst::Xor; 6566122f3e6SDimitry Andric case bitc::RMW_MAX: return AtomicRMWInst::Max; 6576122f3e6SDimitry Andric case bitc::RMW_MIN: return AtomicRMWInst::Min; 6586122f3e6SDimitry Andric case bitc::RMW_UMAX: return AtomicRMWInst::UMax; 6596122f3e6SDimitry Andric case bitc::RMW_UMIN: return AtomicRMWInst::UMin; 6606122f3e6SDimitry Andric } 6616122f3e6SDimitry Andric } 6626122f3e6SDimitry Andric 6638f0fd8f6SDimitry Andric static AtomicOrdering getDecodedOrdering(unsigned Val) { 6646122f3e6SDimitry Andric switch (Val) { 6656122f3e6SDimitry Andric case bitc::ORDERING_NOTATOMIC: return NotAtomic; 6666122f3e6SDimitry Andric case bitc::ORDERING_UNORDERED: return Unordered; 6676122f3e6SDimitry Andric case bitc::ORDERING_MONOTONIC: return Monotonic; 6686122f3e6SDimitry Andric case bitc::ORDERING_ACQUIRE: return Acquire; 6696122f3e6SDimitry Andric case bitc::ORDERING_RELEASE: return Release; 6706122f3e6SDimitry Andric case bitc::ORDERING_ACQREL: return AcquireRelease; 6716122f3e6SDimitry Andric default: // Map unknown orderings to sequentially-consistent. 6726122f3e6SDimitry Andric case bitc::ORDERING_SEQCST: return SequentiallyConsistent; 6736122f3e6SDimitry Andric } 6746122f3e6SDimitry Andric } 6756122f3e6SDimitry Andric 6768f0fd8f6SDimitry Andric static SynchronizationScope getDecodedSynchScope(unsigned Val) { 6776122f3e6SDimitry Andric switch (Val) { 6786122f3e6SDimitry Andric case bitc::SYNCHSCOPE_SINGLETHREAD: return SingleThread; 6796122f3e6SDimitry Andric default: // Map unknown scopes to cross-thread. 6806122f3e6SDimitry Andric case bitc::SYNCHSCOPE_CROSSTHREAD: return CrossThread; 6816122f3e6SDimitry Andric } 6826122f3e6SDimitry Andric } 6836122f3e6SDimitry Andric 68491bc56edSDimitry Andric static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) { 68591bc56edSDimitry Andric switch (Val) { 68691bc56edSDimitry Andric default: // Map unknown selection kinds to any. 68791bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_ANY: 68891bc56edSDimitry Andric return Comdat::Any; 68991bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_EXACT_MATCH: 69091bc56edSDimitry Andric return Comdat::ExactMatch; 69191bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_LARGEST: 69291bc56edSDimitry Andric return Comdat::Largest; 69391bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES: 69491bc56edSDimitry Andric return Comdat::NoDuplicates; 69591bc56edSDimitry Andric case bitc::COMDAT_SELECTION_KIND_SAME_SIZE: 69691bc56edSDimitry Andric return Comdat::SameSize; 69791bc56edSDimitry Andric } 69891bc56edSDimitry Andric } 69991bc56edSDimitry Andric 700875ed548SDimitry Andric static FastMathFlags getDecodedFastMathFlags(unsigned Val) { 701875ed548SDimitry Andric FastMathFlags FMF; 702875ed548SDimitry Andric if (0 != (Val & FastMathFlags::UnsafeAlgebra)) 703875ed548SDimitry Andric FMF.setUnsafeAlgebra(); 704875ed548SDimitry Andric if (0 != (Val & FastMathFlags::NoNaNs)) 705875ed548SDimitry Andric FMF.setNoNaNs(); 706875ed548SDimitry Andric if (0 != (Val & FastMathFlags::NoInfs)) 707875ed548SDimitry Andric FMF.setNoInfs(); 708875ed548SDimitry Andric if (0 != (Val & FastMathFlags::NoSignedZeros)) 709875ed548SDimitry Andric FMF.setNoSignedZeros(); 710875ed548SDimitry Andric if (0 != (Val & FastMathFlags::AllowReciprocal)) 711875ed548SDimitry Andric FMF.setAllowReciprocal(); 712875ed548SDimitry Andric return FMF; 713875ed548SDimitry Andric } 714875ed548SDimitry Andric 7158f0fd8f6SDimitry Andric static void upgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) { 71691bc56edSDimitry Andric switch (Val) { 71791bc56edSDimitry Andric case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; 71891bc56edSDimitry Andric case 6: GV->setDLLStorageClass(GlobalValue::DLLExportStorageClass); break; 71991bc56edSDimitry Andric } 72091bc56edSDimitry Andric } 72191bc56edSDimitry Andric 722f22ef01cSRoman Divacky namespace llvm { 723f22ef01cSRoman Divacky namespace { 7248f0fd8f6SDimitry Andric /// \brief A class for maintaining the slot number definition 725f22ef01cSRoman Divacky /// as a placeholder for the actual definition for forward constants defs. 726f22ef01cSRoman Divacky class ConstantPlaceHolder : public ConstantExpr { 727ff0cc061SDimitry Andric void operator=(const ConstantPlaceHolder &) = delete; 7288f0fd8f6SDimitry Andric 729f22ef01cSRoman Divacky public: 730f22ef01cSRoman Divacky // allocate space for exactly one operand 7318f0fd8f6SDimitry Andric void *operator new(size_t s) { return User::operator new(s, 1); } 7326122f3e6SDimitry Andric explicit ConstantPlaceHolder(Type *Ty, LLVMContext &Context) 733f22ef01cSRoman Divacky : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { 734f22ef01cSRoman Divacky Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); 735f22ef01cSRoman Divacky } 736f22ef01cSRoman Divacky 7378f0fd8f6SDimitry Andric /// \brief Methods to support type inquiry through isa, cast, and dyn_cast. 738f22ef01cSRoman Divacky static bool classof(const Value *V) { 739f22ef01cSRoman Divacky return isa<ConstantExpr>(V) && 740f22ef01cSRoman Divacky cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; 741f22ef01cSRoman Divacky } 742f22ef01cSRoman Divacky 743f22ef01cSRoman Divacky /// Provide fast operand accessors 74439d628a0SDimitry Andric DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 745f22ef01cSRoman Divacky }; 7463dac3a9bSDimitry Andric } 747f22ef01cSRoman Divacky 748f22ef01cSRoman Divacky // FIXME: can we inherit this from ConstantExpr? 749f22ef01cSRoman Divacky template <> 7502754fe60SDimitry Andric struct OperandTraits<ConstantPlaceHolder> : 7512754fe60SDimitry Andric public FixedNumOperandTraits<ConstantPlaceHolder, 1> { 752f22ef01cSRoman Divacky }; 75339d628a0SDimitry Andric DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantPlaceHolder, Value) 7543dac3a9bSDimitry Andric } 755f22ef01cSRoman Divacky 7568f0fd8f6SDimitry Andric void BitcodeReaderValueList::assignValue(Value *V, unsigned Idx) { 757f22ef01cSRoman Divacky if (Idx == size()) { 758f22ef01cSRoman Divacky push_back(V); 759f22ef01cSRoman Divacky return; 760f22ef01cSRoman Divacky } 761f22ef01cSRoman Divacky 762f22ef01cSRoman Divacky if (Idx >= size()) 763f22ef01cSRoman Divacky resize(Idx+1); 764f22ef01cSRoman Divacky 765f22ef01cSRoman Divacky WeakVH &OldV = ValuePtrs[Idx]; 76691bc56edSDimitry Andric if (!OldV) { 767f22ef01cSRoman Divacky OldV = V; 768f22ef01cSRoman Divacky return; 769f22ef01cSRoman Divacky } 770f22ef01cSRoman Divacky 771f22ef01cSRoman Divacky // Handle constants and non-constants (e.g. instrs) differently for 772f22ef01cSRoman Divacky // efficiency. 773f22ef01cSRoman Divacky if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { 774f22ef01cSRoman Divacky ResolveConstants.push_back(std::make_pair(PHC, Idx)); 775f22ef01cSRoman Divacky OldV = V; 776f22ef01cSRoman Divacky } else { 777f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 778f22ef01cSRoman Divacky Value *PrevVal = OldV; 779f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 780f22ef01cSRoman Divacky delete PrevVal; 781f22ef01cSRoman Divacky } 782f22ef01cSRoman Divacky } 783f22ef01cSRoman Divacky 784f22ef01cSRoman Divacky 785f22ef01cSRoman Divacky Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, 7866122f3e6SDimitry Andric Type *Ty) { 787f22ef01cSRoman Divacky if (Idx >= size()) 788f22ef01cSRoman Divacky resize(Idx + 1); 789f22ef01cSRoman Divacky 790f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 791ff0cc061SDimitry Andric if (Ty != V->getType()) 792ff0cc061SDimitry Andric report_fatal_error("Type mismatch in constant table!"); 793f22ef01cSRoman Divacky return cast<Constant>(V); 794f22ef01cSRoman Divacky } 795f22ef01cSRoman Divacky 796f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 797f22ef01cSRoman Divacky Constant *C = new ConstantPlaceHolder(Ty, Context); 798f22ef01cSRoman Divacky ValuePtrs[Idx] = C; 799f22ef01cSRoman Divacky return C; 800f22ef01cSRoman Divacky } 801f22ef01cSRoman Divacky 8026122f3e6SDimitry Andric Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { 803ff0cc061SDimitry Andric // Bail out for a clearly invalid value. This would make us call resize(0) 804ff0cc061SDimitry Andric if (Idx == UINT_MAX) 805ff0cc061SDimitry Andric return nullptr; 806ff0cc061SDimitry Andric 807f22ef01cSRoman Divacky if (Idx >= size()) 808f22ef01cSRoman Divacky resize(Idx + 1); 809f22ef01cSRoman Divacky 810f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 811ff0cc061SDimitry Andric // If the types don't match, it's invalid. 812ff0cc061SDimitry Andric if (Ty && Ty != V->getType()) 813ff0cc061SDimitry Andric return nullptr; 814f22ef01cSRoman Divacky return V; 815f22ef01cSRoman Divacky } 816f22ef01cSRoman Divacky 817f22ef01cSRoman Divacky // No type specified, must be invalid reference. 81891bc56edSDimitry Andric if (!Ty) return nullptr; 819f22ef01cSRoman Divacky 820f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 821f22ef01cSRoman Divacky Value *V = new Argument(Ty); 822f22ef01cSRoman Divacky ValuePtrs[Idx] = V; 823f22ef01cSRoman Divacky return V; 824f22ef01cSRoman Divacky } 825f22ef01cSRoman Divacky 8268f0fd8f6SDimitry Andric /// Once all constants are read, this method bulk resolves any forward 8278f0fd8f6SDimitry Andric /// references. The idea behind this is that we sometimes get constants (such 8288f0fd8f6SDimitry Andric /// as large arrays) which reference *many* forward ref constants. Replacing 8298f0fd8f6SDimitry Andric /// each of these causes a lot of thrashing when building/reuniquing the 8308f0fd8f6SDimitry Andric /// constant. Instead of doing this, we look at all the uses and rewrite all 8318f0fd8f6SDimitry Andric /// the place holders at once for any constant that uses a placeholder. 8328f0fd8f6SDimitry Andric void BitcodeReaderValueList::resolveConstantForwardRefs() { 833f22ef01cSRoman Divacky // Sort the values by-pointer so that they are efficient to look up with a 834f22ef01cSRoman Divacky // binary search. 835f22ef01cSRoman Divacky std::sort(ResolveConstants.begin(), ResolveConstants.end()); 836f22ef01cSRoman Divacky 837f22ef01cSRoman Divacky SmallVector<Constant*, 64> NewOps; 838f22ef01cSRoman Divacky 839f22ef01cSRoman Divacky while (!ResolveConstants.empty()) { 840f22ef01cSRoman Divacky Value *RealVal = operator[](ResolveConstants.back().second); 841f22ef01cSRoman Divacky Constant *Placeholder = ResolveConstants.back().first; 842f22ef01cSRoman Divacky ResolveConstants.pop_back(); 843f22ef01cSRoman Divacky 844f22ef01cSRoman Divacky // Loop over all users of the placeholder, updating them to reference the 845f22ef01cSRoman Divacky // new value. If they reference more than one placeholder, update them all 846f22ef01cSRoman Divacky // at once. 847f22ef01cSRoman Divacky while (!Placeholder->use_empty()) { 84891bc56edSDimitry Andric auto UI = Placeholder->user_begin(); 849ffd1746dSEd Schouten User *U = *UI; 850f22ef01cSRoman Divacky 851f22ef01cSRoman Divacky // If the using object isn't uniqued, just update the operands. This 852f22ef01cSRoman Divacky // handles instructions and initializers for global variables. 853ffd1746dSEd Schouten if (!isa<Constant>(U) || isa<GlobalValue>(U)) { 854f22ef01cSRoman Divacky UI.getUse().set(RealVal); 855f22ef01cSRoman Divacky continue; 856f22ef01cSRoman Divacky } 857f22ef01cSRoman Divacky 858f22ef01cSRoman Divacky // Otherwise, we have a constant that uses the placeholder. Replace that 859f22ef01cSRoman Divacky // constant with a new constant that has *all* placeholder uses updated. 860ffd1746dSEd Schouten Constant *UserC = cast<Constant>(U); 861f22ef01cSRoman Divacky for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); 862f22ef01cSRoman Divacky I != E; ++I) { 863f22ef01cSRoman Divacky Value *NewOp; 864f22ef01cSRoman Divacky if (!isa<ConstantPlaceHolder>(*I)) { 865f22ef01cSRoman Divacky // Not a placeholder reference. 866f22ef01cSRoman Divacky NewOp = *I; 867f22ef01cSRoman Divacky } else if (*I == Placeholder) { 868f22ef01cSRoman Divacky // Common case is that it just references this one placeholder. 869f22ef01cSRoman Divacky NewOp = RealVal; 870f22ef01cSRoman Divacky } else { 871f22ef01cSRoman Divacky // Otherwise, look up the placeholder in ResolveConstants. 872f22ef01cSRoman Divacky ResolveConstantsTy::iterator It = 873f22ef01cSRoman Divacky std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), 874f22ef01cSRoman Divacky std::pair<Constant*, unsigned>(cast<Constant>(*I), 875f22ef01cSRoman Divacky 0)); 876f22ef01cSRoman Divacky assert(It != ResolveConstants.end() && It->first == *I); 877f22ef01cSRoman Divacky NewOp = operator[](It->second); 878f22ef01cSRoman Divacky } 879f22ef01cSRoman Divacky 880f22ef01cSRoman Divacky NewOps.push_back(cast<Constant>(NewOp)); 881f22ef01cSRoman Divacky } 882f22ef01cSRoman Divacky 883f22ef01cSRoman Divacky // Make the new constant. 884f22ef01cSRoman Divacky Constant *NewC; 885f22ef01cSRoman Divacky if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { 88617a519f9SDimitry Andric NewC = ConstantArray::get(UserCA->getType(), NewOps); 887f22ef01cSRoman Divacky } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { 88817a519f9SDimitry Andric NewC = ConstantStruct::get(UserCS->getType(), NewOps); 889f22ef01cSRoman Divacky } else if (isa<ConstantVector>(UserC)) { 8902754fe60SDimitry Andric NewC = ConstantVector::get(NewOps); 891f22ef01cSRoman Divacky } else { 892f22ef01cSRoman Divacky assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); 8933b0f4066SDimitry Andric NewC = cast<ConstantExpr>(UserC)->getWithOperands(NewOps); 894f22ef01cSRoman Divacky } 895f22ef01cSRoman Divacky 896f22ef01cSRoman Divacky UserC->replaceAllUsesWith(NewC); 897f22ef01cSRoman Divacky UserC->destroyConstant(); 898f22ef01cSRoman Divacky NewOps.clear(); 899f22ef01cSRoman Divacky } 900f22ef01cSRoman Divacky 901f22ef01cSRoman Divacky // Update all ValueHandles, they should be the only users at this point. 902f22ef01cSRoman Divacky Placeholder->replaceAllUsesWith(RealVal); 903f22ef01cSRoman Divacky delete Placeholder; 904f22ef01cSRoman Divacky } 905f22ef01cSRoman Divacky } 906f22ef01cSRoman Divacky 9078f0fd8f6SDimitry Andric void BitcodeReaderMDValueList::assignValue(Metadata *MD, unsigned Idx) { 908f22ef01cSRoman Divacky if (Idx == size()) { 90939d628a0SDimitry Andric push_back(MD); 910f22ef01cSRoman Divacky return; 911f22ef01cSRoman Divacky } 912f22ef01cSRoman Divacky 913f22ef01cSRoman Divacky if (Idx >= size()) 914f22ef01cSRoman Divacky resize(Idx+1); 915f22ef01cSRoman Divacky 91639d628a0SDimitry Andric TrackingMDRef &OldMD = MDValuePtrs[Idx]; 91739d628a0SDimitry Andric if (!OldMD) { 91839d628a0SDimitry Andric OldMD.reset(MD); 919f22ef01cSRoman Divacky return; 920f22ef01cSRoman Divacky } 921f22ef01cSRoman Divacky 922f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 923ff0cc061SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 92439d628a0SDimitry Andric PrevMD->replaceAllUsesWith(MD); 92539d628a0SDimitry Andric --NumFwdRefs; 926f22ef01cSRoman Divacky } 927f22ef01cSRoman Divacky 92839d628a0SDimitry Andric Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { 929f22ef01cSRoman Divacky if (Idx >= size()) 930f22ef01cSRoman Divacky resize(Idx + 1); 931f22ef01cSRoman Divacky 93239d628a0SDimitry Andric if (Metadata *MD = MDValuePtrs[Idx]) 93339d628a0SDimitry Andric return MD; 934f22ef01cSRoman Divacky 935b09980d1SDimitry Andric // Track forward refs to be resolved later. 936b09980d1SDimitry Andric if (AnyFwdRefs) { 937b09980d1SDimitry Andric MinFwdRef = std::min(MinFwdRef, Idx); 938b09980d1SDimitry Andric MaxFwdRef = std::max(MaxFwdRef, Idx); 939b09980d1SDimitry Andric } else { 94039d628a0SDimitry Andric AnyFwdRefs = true; 941b09980d1SDimitry Andric MinFwdRef = MaxFwdRef = Idx; 942b09980d1SDimitry Andric } 94339d628a0SDimitry Andric ++NumFwdRefs; 944b09980d1SDimitry Andric 945b09980d1SDimitry Andric // Create and return a placeholder, which will later be RAUW'd. 946ff0cc061SDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release(); 94739d628a0SDimitry Andric MDValuePtrs[Idx].reset(MD); 94839d628a0SDimitry Andric return MD; 94939d628a0SDimitry Andric } 95039d628a0SDimitry Andric 95139d628a0SDimitry Andric void BitcodeReaderMDValueList::tryToResolveCycles() { 95239d628a0SDimitry Andric if (!AnyFwdRefs) 95339d628a0SDimitry Andric // Nothing to do. 95439d628a0SDimitry Andric return; 95539d628a0SDimitry Andric 95639d628a0SDimitry Andric if (NumFwdRefs) 95739d628a0SDimitry Andric // Still forward references... can't resolve cycles. 95839d628a0SDimitry Andric return; 95939d628a0SDimitry Andric 96039d628a0SDimitry Andric // Resolve any cycles. 961b09980d1SDimitry Andric for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) { 962b09980d1SDimitry Andric auto &MD = MDValuePtrs[I]; 963ff0cc061SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 964ff0cc061SDimitry Andric if (!N) 965ff0cc061SDimitry Andric continue; 966ff0cc061SDimitry Andric 967ff0cc061SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference"); 96839d628a0SDimitry Andric N->resolveCycles(); 96939d628a0SDimitry Andric } 970b09980d1SDimitry Andric 971b09980d1SDimitry Andric // Make sure we return early again until there's another forward ref. 972b09980d1SDimitry Andric AnyFwdRefs = false; 973f22ef01cSRoman Divacky } 974f22ef01cSRoman Divacky 97517a519f9SDimitry Andric Type *BitcodeReader::getTypeByID(unsigned ID) { 97617a519f9SDimitry Andric // The type table size is always specified correctly. 97717a519f9SDimitry Andric if (ID >= TypeList.size()) 97891bc56edSDimitry Andric return nullptr; 979f22ef01cSRoman Divacky 98017a519f9SDimitry Andric if (Type *Ty = TypeList[ID]) 98117a519f9SDimitry Andric return Ty; 98217a519f9SDimitry Andric 98317a519f9SDimitry Andric // If we have a forward reference, the only possible case is when it is to a 98417a519f9SDimitry Andric // named struct. Just create a placeholder for now. 98539d628a0SDimitry Andric return TypeList[ID] = createIdentifiedStructType(Context); 98639d628a0SDimitry Andric } 98739d628a0SDimitry Andric 98839d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context, 98939d628a0SDimitry Andric StringRef Name) { 99039d628a0SDimitry Andric auto *Ret = StructType::create(Context, Name); 99139d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 99239d628a0SDimitry Andric return Ret; 99339d628a0SDimitry Andric } 99439d628a0SDimitry Andric 99539d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context) { 99639d628a0SDimitry Andric auto *Ret = StructType::create(Context); 99739d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 99839d628a0SDimitry Andric return Ret; 999f22ef01cSRoman Divacky } 1000f22ef01cSRoman Divacky 100117a519f9SDimitry Andric 1002f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 1003f22ef01cSRoman Divacky // Functions for parsing blocks from the bitcode file 1004f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 1005f22ef01cSRoman Divacky 1006139f7f9bSDimitry Andric 1007139f7f9bSDimitry Andric /// \brief This fills an AttrBuilder object with the LLVM attributes that have 1008139f7f9bSDimitry Andric /// been decoded from the given integer. This function must stay in sync with 1009139f7f9bSDimitry Andric /// 'encodeLLVMAttributesForBitcode'. 1010139f7f9bSDimitry Andric static void decodeLLVMAttributesForBitcode(AttrBuilder &B, 1011139f7f9bSDimitry Andric uint64_t EncodedAttrs) { 1012139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1013139f7f9bSDimitry Andric 1014139f7f9bSDimitry Andric // The alignment is stored as a 16-bit raw value from bits 31--16. We shift 1015139f7f9bSDimitry Andric // the bits above 31 down by 11 bits. 1016139f7f9bSDimitry Andric unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; 1017139f7f9bSDimitry Andric assert((!Alignment || isPowerOf2_32(Alignment)) && 1018139f7f9bSDimitry Andric "Alignment must be a power of two."); 1019139f7f9bSDimitry Andric 1020139f7f9bSDimitry Andric if (Alignment) 1021139f7f9bSDimitry Andric B.addAlignmentAttr(Alignment); 1022139f7f9bSDimitry Andric B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | 1023139f7f9bSDimitry Andric (EncodedAttrs & 0xffff)); 1024139f7f9bSDimitry Andric } 1025139f7f9bSDimitry Andric 10268f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttributeBlock() { 1027f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) 10288f0fd8f6SDimitry Andric return error("Invalid record"); 1029f22ef01cSRoman Divacky 1030f22ef01cSRoman Divacky if (!MAttributes.empty()) 10318f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1032f22ef01cSRoman Divacky 1033f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1034f22ef01cSRoman Divacky 1035139f7f9bSDimitry Andric SmallVector<AttributeSet, 8> Attrs; 1036f22ef01cSRoman Divacky 1037f22ef01cSRoman Divacky // Read all the records. 1038f22ef01cSRoman Divacky while (1) { 1039139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1040139f7f9bSDimitry Andric 1041139f7f9bSDimitry Andric switch (Entry.Kind) { 1042139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1043139f7f9bSDimitry Andric case BitstreamEntry::Error: 10448f0fd8f6SDimitry Andric return error("Malformed block"); 1045139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 104691bc56edSDimitry Andric return std::error_code(); 1047139f7f9bSDimitry Andric case BitstreamEntry::Record: 1048139f7f9bSDimitry Andric // The interesting case. 1049139f7f9bSDimitry Andric break; 1050f22ef01cSRoman Divacky } 1051f22ef01cSRoman Divacky 1052f22ef01cSRoman Divacky // Read a record. 1053f22ef01cSRoman Divacky Record.clear(); 1054139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1055f22ef01cSRoman Divacky default: // Default behavior: ignore. 1056f22ef01cSRoman Divacky break; 1057139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] 1058139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1059f22ef01cSRoman Divacky if (Record.size() & 1) 10608f0fd8f6SDimitry Andric return error("Invalid record"); 1061f22ef01cSRoman Divacky 1062f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 1063139f7f9bSDimitry Andric AttrBuilder B; 1064139f7f9bSDimitry Andric decodeLLVMAttributesForBitcode(B, Record[i+1]); 1065139f7f9bSDimitry Andric Attrs.push_back(AttributeSet::get(Context, Record[i], B)); 1066f22ef01cSRoman Divacky } 1067f22ef01cSRoman Divacky 1068139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1069f22ef01cSRoman Divacky Attrs.clear(); 1070f22ef01cSRoman Divacky break; 1071f22ef01cSRoman Divacky } 1072139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] 1073139f7f9bSDimitry Andric for (unsigned i = 0, e = Record.size(); i != e; ++i) 1074139f7f9bSDimitry Andric Attrs.push_back(MAttributeGroups[Record[i]]); 1075139f7f9bSDimitry Andric 1076139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1077139f7f9bSDimitry Andric Attrs.clear(); 1078139f7f9bSDimitry Andric break; 1079139f7f9bSDimitry Andric } 1080139f7f9bSDimitry Andric } 1081139f7f9bSDimitry Andric } 1082139f7f9bSDimitry Andric } 1083139f7f9bSDimitry Andric 1084f785676fSDimitry Andric // Returns Attribute::None on unrecognized codes. 10858f0fd8f6SDimitry Andric static Attribute::AttrKind getAttrFromCode(uint64_t Code) { 1086f785676fSDimitry Andric switch (Code) { 1087f785676fSDimitry Andric default: 1088f785676fSDimitry Andric return Attribute::None; 1089f785676fSDimitry Andric case bitc::ATTR_KIND_ALIGNMENT: 1090f785676fSDimitry Andric return Attribute::Alignment; 1091f785676fSDimitry Andric case bitc::ATTR_KIND_ALWAYS_INLINE: 1092f785676fSDimitry Andric return Attribute::AlwaysInline; 1093875ed548SDimitry Andric case bitc::ATTR_KIND_ARGMEMONLY: 1094875ed548SDimitry Andric return Attribute::ArgMemOnly; 1095f785676fSDimitry Andric case bitc::ATTR_KIND_BUILTIN: 1096f785676fSDimitry Andric return Attribute::Builtin; 1097f785676fSDimitry Andric case bitc::ATTR_KIND_BY_VAL: 1098f785676fSDimitry Andric return Attribute::ByVal; 109991bc56edSDimitry Andric case bitc::ATTR_KIND_IN_ALLOCA: 110091bc56edSDimitry Andric return Attribute::InAlloca; 1101f785676fSDimitry Andric case bitc::ATTR_KIND_COLD: 1102f785676fSDimitry Andric return Attribute::Cold; 1103ff0cc061SDimitry Andric case bitc::ATTR_KIND_CONVERGENT: 1104ff0cc061SDimitry Andric return Attribute::Convergent; 1105f785676fSDimitry Andric case bitc::ATTR_KIND_INLINE_HINT: 1106f785676fSDimitry Andric return Attribute::InlineHint; 1107f785676fSDimitry Andric case bitc::ATTR_KIND_IN_REG: 1108f785676fSDimitry Andric return Attribute::InReg; 110991bc56edSDimitry Andric case bitc::ATTR_KIND_JUMP_TABLE: 111091bc56edSDimitry Andric return Attribute::JumpTable; 1111f785676fSDimitry Andric case bitc::ATTR_KIND_MIN_SIZE: 1112f785676fSDimitry Andric return Attribute::MinSize; 1113f785676fSDimitry Andric case bitc::ATTR_KIND_NAKED: 1114f785676fSDimitry Andric return Attribute::Naked; 1115f785676fSDimitry Andric case bitc::ATTR_KIND_NEST: 1116f785676fSDimitry Andric return Attribute::Nest; 1117f785676fSDimitry Andric case bitc::ATTR_KIND_NO_ALIAS: 1118f785676fSDimitry Andric return Attribute::NoAlias; 1119f785676fSDimitry Andric case bitc::ATTR_KIND_NO_BUILTIN: 1120f785676fSDimitry Andric return Attribute::NoBuiltin; 1121f785676fSDimitry Andric case bitc::ATTR_KIND_NO_CAPTURE: 1122f785676fSDimitry Andric return Attribute::NoCapture; 1123f785676fSDimitry Andric case bitc::ATTR_KIND_NO_DUPLICATE: 1124f785676fSDimitry Andric return Attribute::NoDuplicate; 1125f785676fSDimitry Andric case bitc::ATTR_KIND_NO_IMPLICIT_FLOAT: 1126f785676fSDimitry Andric return Attribute::NoImplicitFloat; 1127f785676fSDimitry Andric case bitc::ATTR_KIND_NO_INLINE: 1128f785676fSDimitry Andric return Attribute::NoInline; 1129f785676fSDimitry Andric case bitc::ATTR_KIND_NON_LAZY_BIND: 1130f785676fSDimitry Andric return Attribute::NonLazyBind; 113191bc56edSDimitry Andric case bitc::ATTR_KIND_NON_NULL: 113291bc56edSDimitry Andric return Attribute::NonNull; 113391bc56edSDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE: 113491bc56edSDimitry Andric return Attribute::Dereferenceable; 1135ff0cc061SDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL: 1136ff0cc061SDimitry Andric return Attribute::DereferenceableOrNull; 1137f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RED_ZONE: 1138f785676fSDimitry Andric return Attribute::NoRedZone; 1139f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RETURN: 1140f785676fSDimitry Andric return Attribute::NoReturn; 1141f785676fSDimitry Andric case bitc::ATTR_KIND_NO_UNWIND: 1142f785676fSDimitry Andric return Attribute::NoUnwind; 1143f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: 1144f785676fSDimitry Andric return Attribute::OptimizeForSize; 1145f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_NONE: 1146f785676fSDimitry Andric return Attribute::OptimizeNone; 1147f785676fSDimitry Andric case bitc::ATTR_KIND_READ_NONE: 1148f785676fSDimitry Andric return Attribute::ReadNone; 1149f785676fSDimitry Andric case bitc::ATTR_KIND_READ_ONLY: 1150f785676fSDimitry Andric return Attribute::ReadOnly; 1151f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNED: 1152f785676fSDimitry Andric return Attribute::Returned; 1153f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNS_TWICE: 1154f785676fSDimitry Andric return Attribute::ReturnsTwice; 1155f785676fSDimitry Andric case bitc::ATTR_KIND_S_EXT: 1156f785676fSDimitry Andric return Attribute::SExt; 1157f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_ALIGNMENT: 1158f785676fSDimitry Andric return Attribute::StackAlignment; 1159f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT: 1160f785676fSDimitry Andric return Attribute::StackProtect; 1161f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_REQ: 1162f785676fSDimitry Andric return Attribute::StackProtectReq; 1163f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_STRONG: 1164f785676fSDimitry Andric return Attribute::StackProtectStrong; 11658f0fd8f6SDimitry Andric case bitc::ATTR_KIND_SAFESTACK: 11668f0fd8f6SDimitry Andric return Attribute::SafeStack; 1167f785676fSDimitry Andric case bitc::ATTR_KIND_STRUCT_RET: 1168f785676fSDimitry Andric return Attribute::StructRet; 1169f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_ADDRESS: 1170f785676fSDimitry Andric return Attribute::SanitizeAddress; 1171f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_THREAD: 1172f785676fSDimitry Andric return Attribute::SanitizeThread; 1173f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_MEMORY: 1174f785676fSDimitry Andric return Attribute::SanitizeMemory; 1175f785676fSDimitry Andric case bitc::ATTR_KIND_UW_TABLE: 1176f785676fSDimitry Andric return Attribute::UWTable; 1177f785676fSDimitry Andric case bitc::ATTR_KIND_Z_EXT: 1178f785676fSDimitry Andric return Attribute::ZExt; 1179f785676fSDimitry Andric } 1180f785676fSDimitry Andric } 1181f785676fSDimitry Andric 1182ff0cc061SDimitry Andric std::error_code BitcodeReader::parseAlignmentValue(uint64_t Exponent, 1183ff0cc061SDimitry Andric unsigned &Alignment) { 1184ff0cc061SDimitry Andric // Note: Alignment in bitcode files is incremented by 1, so that zero 1185ff0cc061SDimitry Andric // can be used for default alignment. 1186ff0cc061SDimitry Andric if (Exponent > Value::MaxAlignmentExponent + 1) 11878f0fd8f6SDimitry Andric return error("Invalid alignment value"); 1188ff0cc061SDimitry Andric Alignment = (1 << static_cast<unsigned>(Exponent)) >> 1; 1189ff0cc061SDimitry Andric return std::error_code(); 1190ff0cc061SDimitry Andric } 1191ff0cc061SDimitry Andric 11928f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttrKind(uint64_t Code, 1193f785676fSDimitry Andric Attribute::AttrKind *Kind) { 11948f0fd8f6SDimitry Andric *Kind = getAttrFromCode(Code); 1195f785676fSDimitry Andric if (*Kind == Attribute::None) 11968f0fd8f6SDimitry Andric return error(BitcodeError::CorruptedBitcode, 119739d628a0SDimitry Andric "Unknown attribute kind (" + Twine(Code) + ")"); 119891bc56edSDimitry Andric return std::error_code(); 1199f785676fSDimitry Andric } 1200f785676fSDimitry Andric 12018f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttributeGroupBlock() { 1202139f7f9bSDimitry Andric if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) 12038f0fd8f6SDimitry Andric return error("Invalid record"); 1204139f7f9bSDimitry Andric 1205139f7f9bSDimitry Andric if (!MAttributeGroups.empty()) 12068f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1207139f7f9bSDimitry Andric 1208139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 1209139f7f9bSDimitry Andric 1210139f7f9bSDimitry Andric // Read all the records. 1211139f7f9bSDimitry Andric while (1) { 1212139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1213139f7f9bSDimitry Andric 1214139f7f9bSDimitry Andric switch (Entry.Kind) { 1215139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1216139f7f9bSDimitry Andric case BitstreamEntry::Error: 12178f0fd8f6SDimitry Andric return error("Malformed block"); 1218139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 121991bc56edSDimitry Andric return std::error_code(); 1220139f7f9bSDimitry Andric case BitstreamEntry::Record: 1221139f7f9bSDimitry Andric // The interesting case. 1222139f7f9bSDimitry Andric break; 1223139f7f9bSDimitry Andric } 1224139f7f9bSDimitry Andric 1225139f7f9bSDimitry Andric // Read a record. 1226139f7f9bSDimitry Andric Record.clear(); 1227139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1228139f7f9bSDimitry Andric default: // Default behavior: ignore. 1229139f7f9bSDimitry Andric break; 1230139f7f9bSDimitry Andric case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] 1231139f7f9bSDimitry Andric if (Record.size() < 3) 12328f0fd8f6SDimitry Andric return error("Invalid record"); 1233139f7f9bSDimitry Andric 1234139f7f9bSDimitry Andric uint64_t GrpID = Record[0]; 1235139f7f9bSDimitry Andric uint64_t Idx = Record[1]; // Index of the object this attribute refers to. 1236139f7f9bSDimitry Andric 1237139f7f9bSDimitry Andric AttrBuilder B; 1238139f7f9bSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1239139f7f9bSDimitry Andric if (Record[i] == 0) { // Enum attribute 1240f785676fSDimitry Andric Attribute::AttrKind Kind; 12418f0fd8f6SDimitry Andric if (std::error_code EC = parseAttrKind(Record[++i], &Kind)) 1242f785676fSDimitry Andric return EC; 1243f785676fSDimitry Andric 1244f785676fSDimitry Andric B.addAttribute(Kind); 124591bc56edSDimitry Andric } else if (Record[i] == 1) { // Integer attribute 1246f785676fSDimitry Andric Attribute::AttrKind Kind; 12478f0fd8f6SDimitry Andric if (std::error_code EC = parseAttrKind(Record[++i], &Kind)) 1248f785676fSDimitry Andric return EC; 1249f785676fSDimitry Andric if (Kind == Attribute::Alignment) 1250139f7f9bSDimitry Andric B.addAlignmentAttr(Record[++i]); 125191bc56edSDimitry Andric else if (Kind == Attribute::StackAlignment) 1252139f7f9bSDimitry Andric B.addStackAlignmentAttr(Record[++i]); 125391bc56edSDimitry Andric else if (Kind == Attribute::Dereferenceable) 125491bc56edSDimitry Andric B.addDereferenceableAttr(Record[++i]); 1255ff0cc061SDimitry Andric else if (Kind == Attribute::DereferenceableOrNull) 1256ff0cc061SDimitry Andric B.addDereferenceableOrNullAttr(Record[++i]); 1257139f7f9bSDimitry Andric } else { // String attribute 1258139f7f9bSDimitry Andric assert((Record[i] == 3 || Record[i] == 4) && 1259139f7f9bSDimitry Andric "Invalid attribute group entry"); 1260139f7f9bSDimitry Andric bool HasValue = (Record[i++] == 4); 1261139f7f9bSDimitry Andric SmallString<64> KindStr; 1262139f7f9bSDimitry Andric SmallString<64> ValStr; 1263139f7f9bSDimitry Andric 1264139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1265139f7f9bSDimitry Andric KindStr += Record[i++]; 1266139f7f9bSDimitry Andric assert(Record[i] == 0 && "Kind string not null terminated"); 1267139f7f9bSDimitry Andric 1268139f7f9bSDimitry Andric if (HasValue) { 1269139f7f9bSDimitry Andric // Has a value associated with it. 1270139f7f9bSDimitry Andric ++i; // Skip the '0' that terminates the "kind" string. 1271139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1272139f7f9bSDimitry Andric ValStr += Record[i++]; 1273139f7f9bSDimitry Andric assert(Record[i] == 0 && "Value string not null terminated"); 1274139f7f9bSDimitry Andric } 1275139f7f9bSDimitry Andric 1276139f7f9bSDimitry Andric B.addAttribute(KindStr.str(), ValStr.str()); 1277139f7f9bSDimitry Andric } 1278139f7f9bSDimitry Andric } 1279139f7f9bSDimitry Andric 1280139f7f9bSDimitry Andric MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); 1281139f7f9bSDimitry Andric break; 1282139f7f9bSDimitry Andric } 1283f22ef01cSRoman Divacky } 1284f22ef01cSRoman Divacky } 1285f22ef01cSRoman Divacky } 1286f22ef01cSRoman Divacky 12878f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseTypeTable() { 128817a519f9SDimitry Andric if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) 12898f0fd8f6SDimitry Andric return error("Invalid record"); 1290f22ef01cSRoman Divacky 12918f0fd8f6SDimitry Andric return parseTypeTableBody(); 129217a519f9SDimitry Andric } 129317a519f9SDimitry Andric 12948f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseTypeTableBody() { 1295f22ef01cSRoman Divacky if (!TypeList.empty()) 12968f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1297f22ef01cSRoman Divacky 1298f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1299f22ef01cSRoman Divacky unsigned NumRecords = 0; 1300f22ef01cSRoman Divacky 130117a519f9SDimitry Andric SmallString<64> TypeName; 130217a519f9SDimitry Andric 1303f22ef01cSRoman Divacky // Read all the records for this type table. 1304f22ef01cSRoman Divacky while (1) { 1305139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1306139f7f9bSDimitry Andric 1307139f7f9bSDimitry Andric switch (Entry.Kind) { 1308139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1309139f7f9bSDimitry Andric case BitstreamEntry::Error: 13108f0fd8f6SDimitry Andric return error("Malformed block"); 1311139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1312f22ef01cSRoman Divacky if (NumRecords != TypeList.size()) 13138f0fd8f6SDimitry Andric return error("Malformed block"); 131491bc56edSDimitry Andric return std::error_code(); 1315139f7f9bSDimitry Andric case BitstreamEntry::Record: 1316139f7f9bSDimitry Andric // The interesting case. 1317139f7f9bSDimitry Andric break; 1318f22ef01cSRoman Divacky } 1319f22ef01cSRoman Divacky 1320f22ef01cSRoman Divacky // Read a record. 1321f22ef01cSRoman Divacky Record.clear(); 132291bc56edSDimitry Andric Type *ResultTy = nullptr; 1323139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1324f785676fSDimitry Andric default: 13258f0fd8f6SDimitry Andric return error("Invalid value"); 1326f22ef01cSRoman Divacky case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] 1327f22ef01cSRoman Divacky // TYPE_CODE_NUMENTRY contains a count of the number of types in the 1328f22ef01cSRoman Divacky // type list. This allows us to reserve space. 1329f22ef01cSRoman Divacky if (Record.size() < 1) 13308f0fd8f6SDimitry Andric return error("Invalid record"); 133117a519f9SDimitry Andric TypeList.resize(Record[0]); 1332f22ef01cSRoman Divacky continue; 1333f22ef01cSRoman Divacky case bitc::TYPE_CODE_VOID: // VOID 1334f22ef01cSRoman Divacky ResultTy = Type::getVoidTy(Context); 1335f22ef01cSRoman Divacky break; 1336dff0c46cSDimitry Andric case bitc::TYPE_CODE_HALF: // HALF 1337dff0c46cSDimitry Andric ResultTy = Type::getHalfTy(Context); 1338dff0c46cSDimitry Andric break; 1339f22ef01cSRoman Divacky case bitc::TYPE_CODE_FLOAT: // FLOAT 1340f22ef01cSRoman Divacky ResultTy = Type::getFloatTy(Context); 1341f22ef01cSRoman Divacky break; 1342f22ef01cSRoman Divacky case bitc::TYPE_CODE_DOUBLE: // DOUBLE 1343f22ef01cSRoman Divacky ResultTy = Type::getDoubleTy(Context); 1344f22ef01cSRoman Divacky break; 1345f22ef01cSRoman Divacky case bitc::TYPE_CODE_X86_FP80: // X86_FP80 1346f22ef01cSRoman Divacky ResultTy = Type::getX86_FP80Ty(Context); 1347f22ef01cSRoman Divacky break; 1348f22ef01cSRoman Divacky case bitc::TYPE_CODE_FP128: // FP128 1349f22ef01cSRoman Divacky ResultTy = Type::getFP128Ty(Context); 1350f22ef01cSRoman Divacky break; 1351f22ef01cSRoman Divacky case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 1352f22ef01cSRoman Divacky ResultTy = Type::getPPC_FP128Ty(Context); 1353f22ef01cSRoman Divacky break; 1354f22ef01cSRoman Divacky case bitc::TYPE_CODE_LABEL: // LABEL 1355f22ef01cSRoman Divacky ResultTy = Type::getLabelTy(Context); 1356f22ef01cSRoman Divacky break; 1357f22ef01cSRoman Divacky case bitc::TYPE_CODE_METADATA: // METADATA 1358f22ef01cSRoman Divacky ResultTy = Type::getMetadataTy(Context); 1359f22ef01cSRoman Divacky break; 13602754fe60SDimitry Andric case bitc::TYPE_CODE_X86_MMX: // X86_MMX 13612754fe60SDimitry Andric ResultTy = Type::getX86_MMXTy(Context); 13622754fe60SDimitry Andric break; 1363ff0cc061SDimitry Andric case bitc::TYPE_CODE_INTEGER: { // INTEGER: [width] 1364f22ef01cSRoman Divacky if (Record.size() < 1) 13658f0fd8f6SDimitry Andric return error("Invalid record"); 1366f22ef01cSRoman Divacky 1367ff0cc061SDimitry Andric uint64_t NumBits = Record[0]; 1368ff0cc061SDimitry Andric if (NumBits < IntegerType::MIN_INT_BITS || 1369ff0cc061SDimitry Andric NumBits > IntegerType::MAX_INT_BITS) 13708f0fd8f6SDimitry Andric return error("Bitwidth for integer type out of range"); 1371ff0cc061SDimitry Andric ResultTy = IntegerType::get(Context, NumBits); 1372f22ef01cSRoman Divacky break; 1373ff0cc061SDimitry Andric } 1374f22ef01cSRoman Divacky case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or 1375f22ef01cSRoman Divacky // [pointee type, address space] 1376f22ef01cSRoman Divacky if (Record.size() < 1) 13778f0fd8f6SDimitry Andric return error("Invalid record"); 1378f22ef01cSRoman Divacky unsigned AddressSpace = 0; 1379f22ef01cSRoman Divacky if (Record.size() == 2) 1380f22ef01cSRoman Divacky AddressSpace = Record[1]; 138117a519f9SDimitry Andric ResultTy = getTypeByID(Record[0]); 1382ff0cc061SDimitry Andric if (!ResultTy || 1383ff0cc061SDimitry Andric !PointerType::isValidElementType(ResultTy)) 13848f0fd8f6SDimitry Andric return error("Invalid type"); 138517a519f9SDimitry Andric ResultTy = PointerType::get(ResultTy, AddressSpace); 1386f22ef01cSRoman Divacky break; 1387f22ef01cSRoman Divacky } 1388dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION_OLD: { 13897ae0e2c9SDimitry Andric // FIXME: attrid is dead, remove it in LLVM 4.0 1390f22ef01cSRoman Divacky // FUNCTION: [vararg, attrid, retty, paramty x N] 1391f22ef01cSRoman Divacky if (Record.size() < 3) 13928f0fd8f6SDimitry Andric return error("Invalid record"); 1393dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 139417a519f9SDimitry Andric for (unsigned i = 3, e = Record.size(); i != e; ++i) { 139517a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 139617a519f9SDimitry Andric ArgTys.push_back(T); 139717a519f9SDimitry Andric else 1398f22ef01cSRoman Divacky break; 1399f22ef01cSRoman Divacky } 140017a519f9SDimitry Andric 140117a519f9SDimitry Andric ResultTy = getTypeByID(Record[2]); 140291bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-3) 14038f0fd8f6SDimitry Andric return error("Invalid type"); 140417a519f9SDimitry Andric 140517a519f9SDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 140617a519f9SDimitry Andric break; 140717a519f9SDimitry Andric } 1408dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION: { 1409dff0c46cSDimitry Andric // FUNCTION: [vararg, retty, paramty x N] 1410dff0c46cSDimitry Andric if (Record.size() < 2) 14118f0fd8f6SDimitry Andric return error("Invalid record"); 1412dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 1413dff0c46cSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1414ff0cc061SDimitry Andric if (Type *T = getTypeByID(Record[i])) { 1415ff0cc061SDimitry Andric if (!FunctionType::isValidArgumentType(T)) 14168f0fd8f6SDimitry Andric return error("Invalid function argument type"); 1417dff0c46cSDimitry Andric ArgTys.push_back(T); 1418ff0cc061SDimitry Andric } 1419dff0c46cSDimitry Andric else 1420dff0c46cSDimitry Andric break; 1421dff0c46cSDimitry Andric } 1422dff0c46cSDimitry Andric 1423dff0c46cSDimitry Andric ResultTy = getTypeByID(Record[1]); 142491bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-2) 14258f0fd8f6SDimitry Andric return error("Invalid type"); 1426dff0c46cSDimitry Andric 1427dff0c46cSDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 1428dff0c46cSDimitry Andric break; 1429dff0c46cSDimitry Andric } 143017a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] 1431f22ef01cSRoman Divacky if (Record.size() < 1) 14328f0fd8f6SDimitry Andric return error("Invalid record"); 1433dff0c46cSDimitry Andric SmallVector<Type*, 8> EltTys; 143417a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 143517a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 143617a519f9SDimitry Andric EltTys.push_back(T); 143717a519f9SDimitry Andric else 143817a519f9SDimitry Andric break; 143917a519f9SDimitry Andric } 144017a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 14418f0fd8f6SDimitry Andric return error("Invalid type"); 1442f22ef01cSRoman Divacky ResultTy = StructType::get(Context, EltTys, Record[0]); 1443f22ef01cSRoman Divacky break; 1444f22ef01cSRoman Divacky } 144517a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] 14468f0fd8f6SDimitry Andric if (convertToString(Record, 0, TypeName)) 14478f0fd8f6SDimitry Andric return error("Invalid record"); 144817a519f9SDimitry Andric continue; 144917a519f9SDimitry Andric 145017a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] 145117a519f9SDimitry Andric if (Record.size() < 1) 14528f0fd8f6SDimitry Andric return error("Invalid record"); 145317a519f9SDimitry Andric 145417a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 14558f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 145617a519f9SDimitry Andric 145717a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 145817a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 145917a519f9SDimitry Andric if (Res) { 146017a519f9SDimitry Andric Res->setName(TypeName); 146191bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 146217a519f9SDimitry Andric } else // Otherwise, create a new struct. 146339d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 146417a519f9SDimitry Andric TypeName.clear(); 146517a519f9SDimitry Andric 146617a519f9SDimitry Andric SmallVector<Type*, 8> EltTys; 146717a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 146817a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 146917a519f9SDimitry Andric EltTys.push_back(T); 147017a519f9SDimitry Andric else 147117a519f9SDimitry Andric break; 147217a519f9SDimitry Andric } 147317a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 14748f0fd8f6SDimitry Andric return error("Invalid record"); 147517a519f9SDimitry Andric Res->setBody(EltTys, Record[0]); 147617a519f9SDimitry Andric ResultTy = Res; 147717a519f9SDimitry Andric break; 147817a519f9SDimitry Andric } 147917a519f9SDimitry Andric case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] 148017a519f9SDimitry Andric if (Record.size() != 1) 14818f0fd8f6SDimitry Andric return error("Invalid record"); 148217a519f9SDimitry Andric 148317a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 14848f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 148517a519f9SDimitry Andric 148617a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 148717a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 148817a519f9SDimitry Andric if (Res) { 148917a519f9SDimitry Andric Res->setName(TypeName); 149091bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 149117a519f9SDimitry Andric } else // Otherwise, create a new struct with no body. 149239d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 149317a519f9SDimitry Andric TypeName.clear(); 149417a519f9SDimitry Andric ResultTy = Res; 149517a519f9SDimitry Andric break; 149617a519f9SDimitry Andric } 1497f22ef01cSRoman Divacky case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] 1498f22ef01cSRoman Divacky if (Record.size() < 2) 14998f0fd8f6SDimitry Andric return error("Invalid record"); 1500ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1501ff0cc061SDimitry Andric if (!ResultTy || !ArrayType::isValidElementType(ResultTy)) 15028f0fd8f6SDimitry Andric return error("Invalid type"); 1503ff0cc061SDimitry Andric ResultTy = ArrayType::get(ResultTy, Record[0]); 1504f22ef01cSRoman Divacky break; 1505f22ef01cSRoman Divacky case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] 1506f22ef01cSRoman Divacky if (Record.size() < 2) 15078f0fd8f6SDimitry Andric return error("Invalid record"); 150897bc6c73SDimitry Andric if (Record[0] == 0) 15098f0fd8f6SDimitry Andric return error("Invalid vector length"); 1510ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1511ff0cc061SDimitry Andric if (!ResultTy || !StructType::isValidElementType(ResultTy)) 15128f0fd8f6SDimitry Andric return error("Invalid type"); 1513ff0cc061SDimitry Andric ResultTy = VectorType::get(ResultTy, Record[0]); 1514f22ef01cSRoman Divacky break; 1515f22ef01cSRoman Divacky } 1516f22ef01cSRoman Divacky 151717a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 15188f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 1519ff0cc061SDimitry Andric if (TypeList[NumRecords]) 15208f0fd8f6SDimitry Andric return error( 1521ff0cc061SDimitry Andric "Invalid TYPE table: Only named structs can be forward referenced"); 152217a519f9SDimitry Andric assert(ResultTy && "Didn't read a type?"); 152317a519f9SDimitry Andric TypeList[NumRecords++] = ResultTy; 1524f22ef01cSRoman Divacky } 1525f22ef01cSRoman Divacky } 152617a519f9SDimitry Andric 15278f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseValueSymbolTable() { 1528f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) 15298f0fd8f6SDimitry Andric return error("Invalid record"); 1530f22ef01cSRoman Divacky 1531f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1532f22ef01cSRoman Divacky 1533ff0cc061SDimitry Andric Triple TT(TheModule->getTargetTriple()); 1534ff0cc061SDimitry Andric 1535f22ef01cSRoman Divacky // Read all the records for this value table. 1536f22ef01cSRoman Divacky SmallString<128> ValueName; 1537f22ef01cSRoman Divacky while (1) { 1538139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1539f22ef01cSRoman Divacky 1540139f7f9bSDimitry Andric switch (Entry.Kind) { 1541139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1542139f7f9bSDimitry Andric case BitstreamEntry::Error: 15438f0fd8f6SDimitry Andric return error("Malformed block"); 1544139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 154591bc56edSDimitry Andric return std::error_code(); 1546139f7f9bSDimitry Andric case BitstreamEntry::Record: 1547139f7f9bSDimitry Andric // The interesting case. 1548139f7f9bSDimitry Andric break; 1549f22ef01cSRoman Divacky } 1550f22ef01cSRoman Divacky 1551f22ef01cSRoman Divacky // Read a record. 1552f22ef01cSRoman Divacky Record.clear(); 1553139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1554f22ef01cSRoman Divacky default: // Default behavior: unknown type. 1555f22ef01cSRoman Divacky break; 1556f22ef01cSRoman Divacky case bitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] 15578f0fd8f6SDimitry Andric if (convertToString(Record, 1, ValueName)) 15588f0fd8f6SDimitry Andric return error("Invalid record"); 1559f22ef01cSRoman Divacky unsigned ValueID = Record[0]; 156091bc56edSDimitry Andric if (ValueID >= ValueList.size() || !ValueList[ValueID]) 15618f0fd8f6SDimitry Andric return error("Invalid record"); 1562f22ef01cSRoman Divacky Value *V = ValueList[ValueID]; 1563f22ef01cSRoman Divacky 1564f22ef01cSRoman Divacky V->setName(StringRef(ValueName.data(), ValueName.size())); 1565ff0cc061SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(V)) { 1566ff0cc061SDimitry Andric if (GO->getComdat() == reinterpret_cast<Comdat *>(1)) { 1567ff0cc061SDimitry Andric if (TT.isOSBinFormatMachO()) 1568ff0cc061SDimitry Andric GO->setComdat(nullptr); 1569ff0cc061SDimitry Andric else 1570ff0cc061SDimitry Andric GO->setComdat(TheModule->getOrInsertComdat(V->getName())); 1571ff0cc061SDimitry Andric } 1572ff0cc061SDimitry Andric } 1573f22ef01cSRoman Divacky ValueName.clear(); 1574f22ef01cSRoman Divacky break; 1575f22ef01cSRoman Divacky } 1576f22ef01cSRoman Divacky case bitc::VST_CODE_BBENTRY: { 15778f0fd8f6SDimitry Andric if (convertToString(Record, 1, ValueName)) 15788f0fd8f6SDimitry Andric return error("Invalid record"); 1579f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[0]); 158091bc56edSDimitry Andric if (!BB) 15818f0fd8f6SDimitry Andric return error("Invalid record"); 1582f22ef01cSRoman Divacky 1583f22ef01cSRoman Divacky BB->setName(StringRef(ValueName.data(), ValueName.size())); 1584f22ef01cSRoman Divacky ValueName.clear(); 1585f22ef01cSRoman Divacky break; 1586f22ef01cSRoman Divacky } 1587f22ef01cSRoman Divacky } 1588f22ef01cSRoman Divacky } 1589f22ef01cSRoman Divacky } 1590f22ef01cSRoman Divacky 1591ff0cc061SDimitry Andric static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; } 1592ff0cc061SDimitry Andric 15938f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseMetadata() { 1594ff0cc061SDimitry Andric IsMetadataMaterialized = true; 1595f22ef01cSRoman Divacky unsigned NextMDValueNo = MDValueList.size(); 1596f22ef01cSRoman Divacky 1597f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 15988f0fd8f6SDimitry Andric return error("Invalid record"); 1599f22ef01cSRoman Divacky 1600f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1601f22ef01cSRoman Divacky 1602ff0cc061SDimitry Andric auto getMD = 1603ff0cc061SDimitry Andric [&](unsigned ID) -> Metadata *{ return MDValueList.getValueFwdRef(ID); }; 1604ff0cc061SDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata *{ 1605ff0cc061SDimitry Andric if (ID) 1606ff0cc061SDimitry Andric return getMD(ID - 1); 1607ff0cc061SDimitry Andric return nullptr; 1608ff0cc061SDimitry Andric }; 1609ff0cc061SDimitry Andric auto getMDString = [&](unsigned ID) -> MDString *{ 1610ff0cc061SDimitry Andric // This requires that the ID is not really a forward reference. In 1611ff0cc061SDimitry Andric // particular, the MDString must already have been resolved. 1612ff0cc061SDimitry Andric return cast_or_null<MDString>(getMDOrNull(ID)); 1613ff0cc061SDimitry Andric }; 1614ff0cc061SDimitry Andric 1615ff0cc061SDimitry Andric #define GET_OR_DISTINCT(CLASS, DISTINCT, ARGS) \ 1616ff0cc061SDimitry Andric (DISTINCT ? CLASS::getDistinct ARGS : CLASS::get ARGS) 1617ff0cc061SDimitry Andric 1618f22ef01cSRoman Divacky // Read all the records. 1619f22ef01cSRoman Divacky while (1) { 1620139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1621139f7f9bSDimitry Andric 1622139f7f9bSDimitry Andric switch (Entry.Kind) { 1623139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1624139f7f9bSDimitry Andric case BitstreamEntry::Error: 16258f0fd8f6SDimitry Andric return error("Malformed block"); 1626139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 162739d628a0SDimitry Andric MDValueList.tryToResolveCycles(); 162891bc56edSDimitry Andric return std::error_code(); 1629139f7f9bSDimitry Andric case BitstreamEntry::Record: 1630139f7f9bSDimitry Andric // The interesting case. 1631139f7f9bSDimitry Andric break; 1632f22ef01cSRoman Divacky } 1633f22ef01cSRoman Divacky 1634f22ef01cSRoman Divacky // Read a record. 1635f22ef01cSRoman Divacky Record.clear(); 1636139f7f9bSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record); 163739d628a0SDimitry Andric bool IsDistinct = false; 1638e580952dSDimitry Andric switch (Code) { 1639f22ef01cSRoman Divacky default: // Default behavior: ignore. 1640f22ef01cSRoman Divacky break; 1641f22ef01cSRoman Divacky case bitc::METADATA_NAME: { 1642139f7f9bSDimitry Andric // Read name of the named metadata. 16437ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 1644f22ef01cSRoman Divacky Record.clear(); 1645f22ef01cSRoman Divacky Code = Stream.ReadCode(); 1646f22ef01cSRoman Divacky 1647139f7f9bSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record); 164897bc6c73SDimitry Andric if (NextBitCode != bitc::METADATA_NAMED_NODE) 16498f0fd8f6SDimitry Andric return error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 1650f22ef01cSRoman Divacky 1651f22ef01cSRoman Divacky // Read named metadata elements. 1652f22ef01cSRoman Divacky unsigned Size = Record.size(); 1653e580952dSDimitry Andric NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); 1654f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) { 165591bc56edSDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i])); 165691bc56edSDimitry Andric if (!MD) 16578f0fd8f6SDimitry Andric return error("Invalid record"); 1658e580952dSDimitry Andric NMD->addOperand(MD); 1659f22ef01cSRoman Divacky } 1660f22ef01cSRoman Divacky break; 1661f22ef01cSRoman Divacky } 166239d628a0SDimitry Andric case bitc::METADATA_OLD_FN_NODE: { 166339d628a0SDimitry Andric // FIXME: Remove in 4.0. 166439d628a0SDimitry Andric // This is a LocalAsMetadata record, the only type of function-local 166539d628a0SDimitry Andric // metadata. 1666ffd1746dSEd Schouten if (Record.size() % 2 == 1) 16678f0fd8f6SDimitry Andric return error("Invalid record"); 166839d628a0SDimitry Andric 166939d628a0SDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used 167039d628a0SDimitry Andric // to be legal, but there's no upgrade path. 167139d628a0SDimitry Andric auto dropRecord = [&] { 16728f0fd8f6SDimitry Andric MDValueList.assignValue(MDNode::get(Context, None), NextMDValueNo++); 167339d628a0SDimitry Andric }; 167439d628a0SDimitry Andric if (Record.size() != 2) { 167539d628a0SDimitry Andric dropRecord(); 167639d628a0SDimitry Andric break; 167739d628a0SDimitry Andric } 167839d628a0SDimitry Andric 167939d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 168039d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) { 168139d628a0SDimitry Andric dropRecord(); 168239d628a0SDimitry Andric break; 168339d628a0SDimitry Andric } 168439d628a0SDimitry Andric 16858f0fd8f6SDimitry Andric MDValueList.assignValue( 168639d628a0SDimitry Andric LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 168739d628a0SDimitry Andric NextMDValueNo++); 168839d628a0SDimitry Andric break; 168939d628a0SDimitry Andric } 169039d628a0SDimitry Andric case bitc::METADATA_OLD_NODE: { 169139d628a0SDimitry Andric // FIXME: Remove in 4.0. 169239d628a0SDimitry Andric if (Record.size() % 2 == 1) 16938f0fd8f6SDimitry Andric return error("Invalid record"); 1694f22ef01cSRoman Divacky 1695f22ef01cSRoman Divacky unsigned Size = Record.size(); 169639d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 1697f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; i += 2) { 16986122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[i]); 1699f785676fSDimitry Andric if (!Ty) 17008f0fd8f6SDimitry Andric return error("Invalid record"); 1701f22ef01cSRoman Divacky if (Ty->isMetadataTy()) 1702f22ef01cSRoman Divacky Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); 170339d628a0SDimitry Andric else if (!Ty->isVoidTy()) { 170439d628a0SDimitry Andric auto *MD = 170539d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty)); 170639d628a0SDimitry Andric assert(isa<ConstantAsMetadata>(MD) && 170739d628a0SDimitry Andric "Expected non-function-local metadata"); 170839d628a0SDimitry Andric Elts.push_back(MD); 170939d628a0SDimitry Andric } else 171091bc56edSDimitry Andric Elts.push_back(nullptr); 1711f22ef01cSRoman Divacky } 17128f0fd8f6SDimitry Andric MDValueList.assignValue(MDNode::get(Context, Elts), NextMDValueNo++); 171339d628a0SDimitry Andric break; 171439d628a0SDimitry Andric } 171539d628a0SDimitry Andric case bitc::METADATA_VALUE: { 171639d628a0SDimitry Andric if (Record.size() != 2) 17178f0fd8f6SDimitry Andric return error("Invalid record"); 171839d628a0SDimitry Andric 171939d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 172039d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) 17218f0fd8f6SDimitry Andric return error("Invalid record"); 172239d628a0SDimitry Andric 17238f0fd8f6SDimitry Andric MDValueList.assignValue( 172439d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 172539d628a0SDimitry Andric NextMDValueNo++); 172639d628a0SDimitry Andric break; 172739d628a0SDimitry Andric } 172839d628a0SDimitry Andric case bitc::METADATA_DISTINCT_NODE: 172939d628a0SDimitry Andric IsDistinct = true; 173039d628a0SDimitry Andric // fallthrough... 173139d628a0SDimitry Andric case bitc::METADATA_NODE: { 173239d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 173339d628a0SDimitry Andric Elts.reserve(Record.size()); 173439d628a0SDimitry Andric for (unsigned ID : Record) 173539d628a0SDimitry Andric Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr); 17368f0fd8f6SDimitry Andric MDValueList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 173739d628a0SDimitry Andric : MDNode::get(Context, Elts), 173839d628a0SDimitry Andric NextMDValueNo++); 173939d628a0SDimitry Andric break; 174039d628a0SDimitry Andric } 174139d628a0SDimitry Andric case bitc::METADATA_LOCATION: { 174239d628a0SDimitry Andric if (Record.size() != 5) 17438f0fd8f6SDimitry Andric return error("Invalid record"); 174439d628a0SDimitry Andric 174539d628a0SDimitry Andric unsigned Line = Record[1]; 174639d628a0SDimitry Andric unsigned Column = Record[2]; 174739d628a0SDimitry Andric MDNode *Scope = cast<MDNode>(MDValueList.getValueFwdRef(Record[3])); 174839d628a0SDimitry Andric Metadata *InlinedAt = 174939d628a0SDimitry Andric Record[4] ? MDValueList.getValueFwdRef(Record[4] - 1) : nullptr; 17508f0fd8f6SDimitry Andric MDValueList.assignValue( 1751ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocation, Record[0], 1752ff0cc061SDimitry Andric (Context, Line, Column, Scope, InlinedAt)), 1753ff0cc061SDimitry Andric NextMDValueNo++); 1754ff0cc061SDimitry Andric break; 1755ff0cc061SDimitry Andric } 1756ff0cc061SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: { 1757ff0cc061SDimitry Andric if (Record.size() < 4) 17588f0fd8f6SDimitry Andric return error("Invalid record"); 1759ff0cc061SDimitry Andric 1760ff0cc061SDimitry Andric unsigned Tag = Record[1]; 1761ff0cc061SDimitry Andric unsigned Version = Record[2]; 1762ff0cc061SDimitry Andric 1763ff0cc061SDimitry Andric if (Tag >= 1u << 16 || Version != 0) 17648f0fd8f6SDimitry Andric return error("Invalid record"); 1765ff0cc061SDimitry Andric 1766ff0cc061SDimitry Andric auto *Header = getMDString(Record[3]); 1767ff0cc061SDimitry Andric SmallVector<Metadata *, 8> DwarfOps; 1768ff0cc061SDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I) 1769ff0cc061SDimitry Andric DwarfOps.push_back(Record[I] ? MDValueList.getValueFwdRef(Record[I] - 1) 1770ff0cc061SDimitry Andric : nullptr); 17718f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(GenericDINode, Record[0], 1772ff0cc061SDimitry Andric (Context, Tag, Header, DwarfOps)), 1773ff0cc061SDimitry Andric NextMDValueNo++); 1774ff0cc061SDimitry Andric break; 1775ff0cc061SDimitry Andric } 1776ff0cc061SDimitry Andric case bitc::METADATA_SUBRANGE: { 1777ff0cc061SDimitry Andric if (Record.size() != 3) 17788f0fd8f6SDimitry Andric return error("Invalid record"); 1779ff0cc061SDimitry Andric 17808f0fd8f6SDimitry Andric MDValueList.assignValue( 1781ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubrange, Record[0], 1782ff0cc061SDimitry Andric (Context, Record[1], unrotateSign(Record[2]))), 1783ff0cc061SDimitry Andric NextMDValueNo++); 1784ff0cc061SDimitry Andric break; 1785ff0cc061SDimitry Andric } 1786ff0cc061SDimitry Andric case bitc::METADATA_ENUMERATOR: { 1787ff0cc061SDimitry Andric if (Record.size() != 3) 17888f0fd8f6SDimitry Andric return error("Invalid record"); 1789ff0cc061SDimitry Andric 17908f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(DIEnumerator, Record[0], 1791ff0cc061SDimitry Andric (Context, unrotateSign(Record[1]), 1792ff0cc061SDimitry Andric getMDString(Record[2]))), 1793ff0cc061SDimitry Andric NextMDValueNo++); 1794ff0cc061SDimitry Andric break; 1795ff0cc061SDimitry Andric } 1796ff0cc061SDimitry Andric case bitc::METADATA_BASIC_TYPE: { 1797ff0cc061SDimitry Andric if (Record.size() != 6) 17988f0fd8f6SDimitry Andric return error("Invalid record"); 1799ff0cc061SDimitry Andric 18008f0fd8f6SDimitry Andric MDValueList.assignValue( 1801ff0cc061SDimitry Andric GET_OR_DISTINCT(DIBasicType, Record[0], 1802ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1803ff0cc061SDimitry Andric Record[3], Record[4], Record[5])), 1804ff0cc061SDimitry Andric NextMDValueNo++); 1805ff0cc061SDimitry Andric break; 1806ff0cc061SDimitry Andric } 1807ff0cc061SDimitry Andric case bitc::METADATA_DERIVED_TYPE: { 1808ff0cc061SDimitry Andric if (Record.size() != 12) 18098f0fd8f6SDimitry Andric return error("Invalid record"); 1810ff0cc061SDimitry Andric 18118f0fd8f6SDimitry Andric MDValueList.assignValue( 1812ff0cc061SDimitry Andric GET_OR_DISTINCT(DIDerivedType, Record[0], 1813ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1814ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1815ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1816ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1817ff0cc061SDimitry Andric getMDOrNull(Record[11]))), 1818ff0cc061SDimitry Andric NextMDValueNo++); 1819ff0cc061SDimitry Andric break; 1820ff0cc061SDimitry Andric } 1821ff0cc061SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: { 1822ff0cc061SDimitry Andric if (Record.size() != 16) 18238f0fd8f6SDimitry Andric return error("Invalid record"); 1824ff0cc061SDimitry Andric 18258f0fd8f6SDimitry Andric MDValueList.assignValue( 1826ff0cc061SDimitry Andric GET_OR_DISTINCT(DICompositeType, Record[0], 1827ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1828ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1829ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1830ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1831ff0cc061SDimitry Andric getMDOrNull(Record[11]), Record[12], 1832ff0cc061SDimitry Andric getMDOrNull(Record[13]), getMDOrNull(Record[14]), 1833ff0cc061SDimitry Andric getMDString(Record[15]))), 1834ff0cc061SDimitry Andric NextMDValueNo++); 1835ff0cc061SDimitry Andric break; 1836ff0cc061SDimitry Andric } 1837ff0cc061SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: { 1838ff0cc061SDimitry Andric if (Record.size() != 3) 18398f0fd8f6SDimitry Andric return error("Invalid record"); 1840ff0cc061SDimitry Andric 18418f0fd8f6SDimitry Andric MDValueList.assignValue( 1842ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubroutineType, Record[0], 1843ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]))), 1844ff0cc061SDimitry Andric NextMDValueNo++); 1845ff0cc061SDimitry Andric break; 1846ff0cc061SDimitry Andric } 18473dac3a9bSDimitry Andric 18483dac3a9bSDimitry Andric case bitc::METADATA_MODULE: { 18493dac3a9bSDimitry Andric if (Record.size() != 6) 18503dac3a9bSDimitry Andric return error("Invalid record"); 18513dac3a9bSDimitry Andric 18523dac3a9bSDimitry Andric MDValueList.assignValue( 18533dac3a9bSDimitry Andric GET_OR_DISTINCT(DIModule, Record[0], 18543dac3a9bSDimitry Andric (Context, getMDOrNull(Record[1]), 18553dac3a9bSDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 18563dac3a9bSDimitry Andric getMDString(Record[4]), getMDString(Record[5]))), 18573dac3a9bSDimitry Andric NextMDValueNo++); 18583dac3a9bSDimitry Andric break; 18593dac3a9bSDimitry Andric } 18603dac3a9bSDimitry Andric 1861ff0cc061SDimitry Andric case bitc::METADATA_FILE: { 1862ff0cc061SDimitry Andric if (Record.size() != 3) 18638f0fd8f6SDimitry Andric return error("Invalid record"); 1864ff0cc061SDimitry Andric 18658f0fd8f6SDimitry Andric MDValueList.assignValue( 1866ff0cc061SDimitry Andric GET_OR_DISTINCT(DIFile, Record[0], (Context, getMDString(Record[1]), 1867ff0cc061SDimitry Andric getMDString(Record[2]))), 1868ff0cc061SDimitry Andric NextMDValueNo++); 1869ff0cc061SDimitry Andric break; 1870ff0cc061SDimitry Andric } 1871ff0cc061SDimitry Andric case bitc::METADATA_COMPILE_UNIT: { 1872ff0cc061SDimitry Andric if (Record.size() < 14 || Record.size() > 15) 18738f0fd8f6SDimitry Andric return error("Invalid record"); 1874ff0cc061SDimitry Andric 18758f0fd8f6SDimitry Andric MDValueList.assignValue( 18768f0fd8f6SDimitry Andric GET_OR_DISTINCT( 18778f0fd8f6SDimitry Andric DICompileUnit, Record[0], 1878ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 18798f0fd8f6SDimitry Andric getMDString(Record[3]), Record[4], getMDString(Record[5]), 18808f0fd8f6SDimitry Andric Record[6], getMDString(Record[7]), Record[8], 1881ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1882ff0cc061SDimitry Andric getMDOrNull(Record[11]), getMDOrNull(Record[12]), 18838f0fd8f6SDimitry Andric getMDOrNull(Record[13]), Record.size() == 14 ? 0 : Record[14])), 1884ff0cc061SDimitry Andric NextMDValueNo++); 1885ff0cc061SDimitry Andric break; 1886ff0cc061SDimitry Andric } 1887ff0cc061SDimitry Andric case bitc::METADATA_SUBPROGRAM: { 1888ff0cc061SDimitry Andric if (Record.size() != 19) 18898f0fd8f6SDimitry Andric return error("Invalid record"); 1890ff0cc061SDimitry Andric 18918f0fd8f6SDimitry Andric MDValueList.assignValue( 1892ff0cc061SDimitry Andric GET_OR_DISTINCT( 1893ff0cc061SDimitry Andric DISubprogram, Record[0], 1894ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1895ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1896ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], Record[9], 1897ff0cc061SDimitry Andric getMDOrNull(Record[10]), Record[11], Record[12], Record[13], 1898ff0cc061SDimitry Andric Record[14], getMDOrNull(Record[15]), getMDOrNull(Record[16]), 1899ff0cc061SDimitry Andric getMDOrNull(Record[17]), getMDOrNull(Record[18]))), 1900ff0cc061SDimitry Andric NextMDValueNo++); 1901ff0cc061SDimitry Andric break; 1902ff0cc061SDimitry Andric } 1903ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: { 1904ff0cc061SDimitry Andric if (Record.size() != 5) 19058f0fd8f6SDimitry Andric return error("Invalid record"); 1906ff0cc061SDimitry Andric 19078f0fd8f6SDimitry Andric MDValueList.assignValue( 1908ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlock, Record[0], 1909ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1910ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])), 1911ff0cc061SDimitry Andric NextMDValueNo++); 1912ff0cc061SDimitry Andric break; 1913ff0cc061SDimitry Andric } 1914ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: { 1915ff0cc061SDimitry Andric if (Record.size() != 4) 19168f0fd8f6SDimitry Andric return error("Invalid record"); 1917ff0cc061SDimitry Andric 19188f0fd8f6SDimitry Andric MDValueList.assignValue( 1919ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile, Record[0], 1920ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1921ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3])), 1922ff0cc061SDimitry Andric NextMDValueNo++); 1923ff0cc061SDimitry Andric break; 1924ff0cc061SDimitry Andric } 1925ff0cc061SDimitry Andric case bitc::METADATA_NAMESPACE: { 1926ff0cc061SDimitry Andric if (Record.size() != 5) 19278f0fd8f6SDimitry Andric return error("Invalid record"); 1928ff0cc061SDimitry Andric 19298f0fd8f6SDimitry Andric MDValueList.assignValue( 1930ff0cc061SDimitry Andric GET_OR_DISTINCT(DINamespace, Record[0], 1931ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1932ff0cc061SDimitry Andric getMDOrNull(Record[2]), getMDString(Record[3]), 1933ff0cc061SDimitry Andric Record[4])), 1934ff0cc061SDimitry Andric NextMDValueNo++); 1935ff0cc061SDimitry Andric break; 1936ff0cc061SDimitry Andric } 1937ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: { 1938ff0cc061SDimitry Andric if (Record.size() != 3) 19398f0fd8f6SDimitry Andric return error("Invalid record"); 1940ff0cc061SDimitry Andric 19418f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter, 1942ff0cc061SDimitry Andric Record[0], 1943ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 1944ff0cc061SDimitry Andric getMDOrNull(Record[2]))), 1945ff0cc061SDimitry Andric NextMDValueNo++); 1946ff0cc061SDimitry Andric break; 1947ff0cc061SDimitry Andric } 1948ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: { 1949ff0cc061SDimitry Andric if (Record.size() != 5) 19508f0fd8f6SDimitry Andric return error("Invalid record"); 1951ff0cc061SDimitry Andric 19528f0fd8f6SDimitry Andric MDValueList.assignValue( 1953ff0cc061SDimitry Andric GET_OR_DISTINCT(DITemplateValueParameter, Record[0], 1954ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1955ff0cc061SDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]))), 1956ff0cc061SDimitry Andric NextMDValueNo++); 1957ff0cc061SDimitry Andric break; 1958ff0cc061SDimitry Andric } 1959ff0cc061SDimitry Andric case bitc::METADATA_GLOBAL_VAR: { 1960ff0cc061SDimitry Andric if (Record.size() != 11) 19618f0fd8f6SDimitry Andric return error("Invalid record"); 1962ff0cc061SDimitry Andric 19638f0fd8f6SDimitry Andric MDValueList.assignValue( 1964ff0cc061SDimitry Andric GET_OR_DISTINCT(DIGlobalVariable, Record[0], 1965ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1966ff0cc061SDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 1967ff0cc061SDimitry Andric getMDOrNull(Record[4]), Record[5], 1968ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], 1969ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]))), 1970ff0cc061SDimitry Andric NextMDValueNo++); 1971ff0cc061SDimitry Andric break; 1972ff0cc061SDimitry Andric } 1973ff0cc061SDimitry Andric case bitc::METADATA_LOCAL_VAR: { 1974ff0cc061SDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field. 1975ff0cc061SDimitry Andric if (Record.size() != 9 && Record.size() != 10) 19768f0fd8f6SDimitry Andric return error("Invalid record"); 1977ff0cc061SDimitry Andric 19788f0fd8f6SDimitry Andric MDValueList.assignValue( 1979ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocalVariable, Record[0], 1980ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 1981ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), 1982ff0cc061SDimitry Andric Record[5], getMDOrNull(Record[6]), Record[7], 1983ff0cc061SDimitry Andric Record[8])), 1984ff0cc061SDimitry Andric NextMDValueNo++); 1985ff0cc061SDimitry Andric break; 1986ff0cc061SDimitry Andric } 1987ff0cc061SDimitry Andric case bitc::METADATA_EXPRESSION: { 1988ff0cc061SDimitry Andric if (Record.size() < 1) 19898f0fd8f6SDimitry Andric return error("Invalid record"); 1990ff0cc061SDimitry Andric 19918f0fd8f6SDimitry Andric MDValueList.assignValue( 1992ff0cc061SDimitry Andric GET_OR_DISTINCT(DIExpression, Record[0], 1993ff0cc061SDimitry Andric (Context, makeArrayRef(Record).slice(1))), 1994ff0cc061SDimitry Andric NextMDValueNo++); 1995ff0cc061SDimitry Andric break; 1996ff0cc061SDimitry Andric } 1997ff0cc061SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: { 1998ff0cc061SDimitry Andric if (Record.size() != 8) 19998f0fd8f6SDimitry Andric return error("Invalid record"); 2000ff0cc061SDimitry Andric 20018f0fd8f6SDimitry Andric MDValueList.assignValue( 2002ff0cc061SDimitry Andric GET_OR_DISTINCT(DIObjCProperty, Record[0], 2003ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 2004ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], 2005ff0cc061SDimitry Andric getMDString(Record[4]), getMDString(Record[5]), 2006ff0cc061SDimitry Andric Record[6], getMDOrNull(Record[7]))), 2007ff0cc061SDimitry Andric NextMDValueNo++); 2008ff0cc061SDimitry Andric break; 2009ff0cc061SDimitry Andric } 2010ff0cc061SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: { 2011ff0cc061SDimitry Andric if (Record.size() != 6) 20128f0fd8f6SDimitry Andric return error("Invalid record"); 2013ff0cc061SDimitry Andric 20148f0fd8f6SDimitry Andric MDValueList.assignValue( 2015ff0cc061SDimitry Andric GET_OR_DISTINCT(DIImportedEntity, Record[0], 2016ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 2017ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 2018ff0cc061SDimitry Andric getMDString(Record[5]))), 201939d628a0SDimitry Andric NextMDValueNo++); 2020f22ef01cSRoman Divacky break; 2021f22ef01cSRoman Divacky } 2022f22ef01cSRoman Divacky case bitc::METADATA_STRING: { 202391bc56edSDimitry Andric std::string String(Record.begin(), Record.end()); 202491bc56edSDimitry Andric llvm::UpgradeMDStringConstant(String); 202539d628a0SDimitry Andric Metadata *MD = MDString::get(Context, String); 20268f0fd8f6SDimitry Andric MDValueList.assignValue(MD, NextMDValueNo++); 2027f22ef01cSRoman Divacky break; 2028f22ef01cSRoman Divacky } 2029f22ef01cSRoman Divacky case bitc::METADATA_KIND: { 20307ae0e2c9SDimitry Andric if (Record.size() < 2) 20318f0fd8f6SDimitry Andric return error("Invalid record"); 20327ae0e2c9SDimitry Andric 2033f22ef01cSRoman Divacky unsigned Kind = Record[0]; 20347ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin()+1, Record.end()); 2035f22ef01cSRoman Divacky 2036f22ef01cSRoman Divacky unsigned NewKind = TheModule->getMDKindID(Name.str()); 2037e580952dSDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 20388f0fd8f6SDimitry Andric return error("Conflicting METADATA_KIND records"); 2039f22ef01cSRoman Divacky break; 2040f22ef01cSRoman Divacky } 2041f22ef01cSRoman Divacky } 2042f22ef01cSRoman Divacky } 2043ff0cc061SDimitry Andric #undef GET_OR_DISTINCT 2044f22ef01cSRoman Divacky } 2045f22ef01cSRoman Divacky 20468f0fd8f6SDimitry Andric /// Decode a signed value stored with the sign bit in the LSB for dense VBR 20478f0fd8f6SDimitry Andric /// encoding. 20483861d79fSDimitry Andric uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { 2049f22ef01cSRoman Divacky if ((V & 1) == 0) 2050f22ef01cSRoman Divacky return V >> 1; 2051f22ef01cSRoman Divacky if (V != 1) 2052f22ef01cSRoman Divacky return -(V >> 1); 2053f22ef01cSRoman Divacky // There is no such thing as -0 with integers. "-0" really means MININT. 2054f22ef01cSRoman Divacky return 1ULL << 63; 2055f22ef01cSRoman Divacky } 2056f22ef01cSRoman Divacky 20578f0fd8f6SDimitry Andric /// Resolve all of the initializers for global values and aliases that we can. 20588f0fd8f6SDimitry Andric std::error_code BitcodeReader::resolveGlobalAndAliasInits() { 2059f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; 2060f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; 2061f785676fSDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixWorklist; 206239d628a0SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologueWorklist; 20638f0fd8f6SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPersonalityFnWorklist; 2064f22ef01cSRoman Divacky 2065f22ef01cSRoman Divacky GlobalInitWorklist.swap(GlobalInits); 2066f22ef01cSRoman Divacky AliasInitWorklist.swap(AliasInits); 2067f785676fSDimitry Andric FunctionPrefixWorklist.swap(FunctionPrefixes); 206839d628a0SDimitry Andric FunctionPrologueWorklist.swap(FunctionPrologues); 20698f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.swap(FunctionPersonalityFns); 2070f22ef01cSRoman Divacky 2071f22ef01cSRoman Divacky while (!GlobalInitWorklist.empty()) { 2072f22ef01cSRoman Divacky unsigned ValID = GlobalInitWorklist.back().second; 2073f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2074f22ef01cSRoman Divacky // Not ready to resolve this yet, it requires something later in the file. 2075f22ef01cSRoman Divacky GlobalInits.push_back(GlobalInitWorklist.back()); 2076f22ef01cSRoman Divacky } else { 207791bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2078f22ef01cSRoman Divacky GlobalInitWorklist.back().first->setInitializer(C); 2079f22ef01cSRoman Divacky else 20808f0fd8f6SDimitry Andric return error("Expected a constant"); 2081f22ef01cSRoman Divacky } 2082f22ef01cSRoman Divacky GlobalInitWorklist.pop_back(); 2083f22ef01cSRoman Divacky } 2084f22ef01cSRoman Divacky 2085f22ef01cSRoman Divacky while (!AliasInitWorklist.empty()) { 2086f22ef01cSRoman Divacky unsigned ValID = AliasInitWorklist.back().second; 2087f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2088f22ef01cSRoman Divacky AliasInits.push_back(AliasInitWorklist.back()); 2089f22ef01cSRoman Divacky } else { 209097bc6c73SDimitry Andric Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]); 209197bc6c73SDimitry Andric if (!C) 20928f0fd8f6SDimitry Andric return error("Expected a constant"); 209397bc6c73SDimitry Andric GlobalAlias *Alias = AliasInitWorklist.back().first; 209497bc6c73SDimitry Andric if (C->getType() != Alias->getType()) 20958f0fd8f6SDimitry Andric return error("Alias and aliasee types don't match"); 209697bc6c73SDimitry Andric Alias->setAliasee(C); 2097f22ef01cSRoman Divacky } 2098f22ef01cSRoman Divacky AliasInitWorklist.pop_back(); 2099f22ef01cSRoman Divacky } 2100f785676fSDimitry Andric 2101f785676fSDimitry Andric while (!FunctionPrefixWorklist.empty()) { 2102f785676fSDimitry Andric unsigned ValID = FunctionPrefixWorklist.back().second; 2103f785676fSDimitry Andric if (ValID >= ValueList.size()) { 2104f785676fSDimitry Andric FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); 2105f785676fSDimitry Andric } else { 210691bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2107f785676fSDimitry Andric FunctionPrefixWorklist.back().first->setPrefixData(C); 2108f785676fSDimitry Andric else 21098f0fd8f6SDimitry Andric return error("Expected a constant"); 2110f785676fSDimitry Andric } 2111f785676fSDimitry Andric FunctionPrefixWorklist.pop_back(); 2112f785676fSDimitry Andric } 2113f785676fSDimitry Andric 211439d628a0SDimitry Andric while (!FunctionPrologueWorklist.empty()) { 211539d628a0SDimitry Andric unsigned ValID = FunctionPrologueWorklist.back().second; 211639d628a0SDimitry Andric if (ValID >= ValueList.size()) { 211739d628a0SDimitry Andric FunctionPrologues.push_back(FunctionPrologueWorklist.back()); 211839d628a0SDimitry Andric } else { 211939d628a0SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 212039d628a0SDimitry Andric FunctionPrologueWorklist.back().first->setPrologueData(C); 212139d628a0SDimitry Andric else 21228f0fd8f6SDimitry Andric return error("Expected a constant"); 212339d628a0SDimitry Andric } 212439d628a0SDimitry Andric FunctionPrologueWorklist.pop_back(); 212539d628a0SDimitry Andric } 212639d628a0SDimitry Andric 21278f0fd8f6SDimitry Andric while (!FunctionPersonalityFnWorklist.empty()) { 21288f0fd8f6SDimitry Andric unsigned ValID = FunctionPersonalityFnWorklist.back().second; 21298f0fd8f6SDimitry Andric if (ValID >= ValueList.size()) { 21308f0fd8f6SDimitry Andric FunctionPersonalityFns.push_back(FunctionPersonalityFnWorklist.back()); 21318f0fd8f6SDimitry Andric } else { 21328f0fd8f6SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 21338f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.back().first->setPersonalityFn(C); 21348f0fd8f6SDimitry Andric else 21358f0fd8f6SDimitry Andric return error("Expected a constant"); 21368f0fd8f6SDimitry Andric } 21378f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.pop_back(); 21388f0fd8f6SDimitry Andric } 21398f0fd8f6SDimitry Andric 214091bc56edSDimitry Andric return std::error_code(); 2141f22ef01cSRoman Divacky } 2142f22ef01cSRoman Divacky 21438f0fd8f6SDimitry Andric static APInt readWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { 21447ae0e2c9SDimitry Andric SmallVector<uint64_t, 8> Words(Vals.size()); 21457ae0e2c9SDimitry Andric std::transform(Vals.begin(), Vals.end(), Words.begin(), 21463861d79fSDimitry Andric BitcodeReader::decodeSignRotatedValue); 21477ae0e2c9SDimitry Andric 21487ae0e2c9SDimitry Andric return APInt(TypeBits, Words); 21497ae0e2c9SDimitry Andric } 21507ae0e2c9SDimitry Andric 21518f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseConstants() { 2152f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) 21538f0fd8f6SDimitry Andric return error("Invalid record"); 2154f22ef01cSRoman Divacky 2155f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2156f22ef01cSRoman Divacky 2157f22ef01cSRoman Divacky // Read all the records for this value table. 21586122f3e6SDimitry Andric Type *CurTy = Type::getInt32Ty(Context); 2159f22ef01cSRoman Divacky unsigned NextCstNo = ValueList.size(); 2160f22ef01cSRoman Divacky while (1) { 2161139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2162139f7f9bSDimitry Andric 2163139f7f9bSDimitry Andric switch (Entry.Kind) { 2164139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2165139f7f9bSDimitry Andric case BitstreamEntry::Error: 21668f0fd8f6SDimitry Andric return error("Malformed block"); 2167139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2168139f7f9bSDimitry Andric if (NextCstNo != ValueList.size()) 21698f0fd8f6SDimitry Andric return error("Invalid ronstant reference"); 2170139f7f9bSDimitry Andric 2171139f7f9bSDimitry Andric // Once all the constants have been read, go through and resolve forward 2172139f7f9bSDimitry Andric // references. 21738f0fd8f6SDimitry Andric ValueList.resolveConstantForwardRefs(); 217491bc56edSDimitry Andric return std::error_code(); 2175139f7f9bSDimitry Andric case BitstreamEntry::Record: 2176139f7f9bSDimitry Andric // The interesting case. 2177f22ef01cSRoman Divacky break; 2178f22ef01cSRoman Divacky } 2179f22ef01cSRoman Divacky 2180f22ef01cSRoman Divacky // Read a record. 2181f22ef01cSRoman Divacky Record.clear(); 218291bc56edSDimitry Andric Value *V = nullptr; 2183139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 2184f22ef01cSRoman Divacky switch (BitCode) { 2185f22ef01cSRoman Divacky default: // Default behavior: unknown constant 2186f22ef01cSRoman Divacky case bitc::CST_CODE_UNDEF: // UNDEF 2187f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2188f22ef01cSRoman Divacky break; 2189f22ef01cSRoman Divacky case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] 2190f22ef01cSRoman Divacky if (Record.empty()) 21918f0fd8f6SDimitry Andric return error("Invalid record"); 219291bc56edSDimitry Andric if (Record[0] >= TypeList.size() || !TypeList[Record[0]]) 21938f0fd8f6SDimitry Andric return error("Invalid record"); 2194f22ef01cSRoman Divacky CurTy = TypeList[Record[0]]; 2195f22ef01cSRoman Divacky continue; // Skip the ValueList manipulation. 2196f22ef01cSRoman Divacky case bitc::CST_CODE_NULL: // NULL 2197f22ef01cSRoman Divacky V = Constant::getNullValue(CurTy); 2198f22ef01cSRoman Divacky break; 2199f22ef01cSRoman Divacky case bitc::CST_CODE_INTEGER: // INTEGER: [intval] 2200f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 22018f0fd8f6SDimitry Andric return error("Invalid record"); 22023861d79fSDimitry Andric V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); 2203f22ef01cSRoman Divacky break; 2204f22ef01cSRoman Divacky case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] 2205f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 22068f0fd8f6SDimitry Andric return error("Invalid record"); 2207f22ef01cSRoman Divacky 22088f0fd8f6SDimitry Andric APInt VInt = 22098f0fd8f6SDimitry Andric readWideAPInt(Record, cast<IntegerType>(CurTy)->getBitWidth()); 22107ae0e2c9SDimitry Andric V = ConstantInt::get(Context, VInt); 22117ae0e2c9SDimitry Andric 2212f22ef01cSRoman Divacky break; 2213f22ef01cSRoman Divacky } 2214f22ef01cSRoman Divacky case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] 2215f22ef01cSRoman Divacky if (Record.empty()) 22168f0fd8f6SDimitry Andric return error("Invalid record"); 2217dff0c46cSDimitry Andric if (CurTy->isHalfTy()) 2218139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, 2219139f7f9bSDimitry Andric APInt(16, (uint16_t)Record[0]))); 2220dff0c46cSDimitry Andric else if (CurTy->isFloatTy()) 2221139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, 2222139f7f9bSDimitry Andric APInt(32, (uint32_t)Record[0]))); 2223f22ef01cSRoman Divacky else if (CurTy->isDoubleTy()) 2224139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, 2225139f7f9bSDimitry Andric APInt(64, Record[0]))); 2226f22ef01cSRoman Divacky else if (CurTy->isX86_FP80Ty()) { 2227f22ef01cSRoman Divacky // Bits are not stored the same way as a normal i80 APInt, compensate. 2228f22ef01cSRoman Divacky uint64_t Rearrange[2]; 2229f22ef01cSRoman Divacky Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); 2230f22ef01cSRoman Divacky Rearrange[1] = Record[0] >> 48; 2231139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, 2232139f7f9bSDimitry Andric APInt(80, Rearrange))); 2233f22ef01cSRoman Divacky } else if (CurTy->isFP128Ty()) 2234139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, 2235139f7f9bSDimitry Andric APInt(128, Record))); 2236f22ef01cSRoman Divacky else if (CurTy->isPPC_FP128Ty()) 2237139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, 2238139f7f9bSDimitry Andric APInt(128, Record))); 2239f22ef01cSRoman Divacky else 2240f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2241f22ef01cSRoman Divacky break; 2242f22ef01cSRoman Divacky } 2243f22ef01cSRoman Divacky 2244f22ef01cSRoman Divacky case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] 2245f22ef01cSRoman Divacky if (Record.empty()) 22468f0fd8f6SDimitry Andric return error("Invalid record"); 2247f22ef01cSRoman Divacky 2248f22ef01cSRoman Divacky unsigned Size = Record.size(); 2249dff0c46cSDimitry Andric SmallVector<Constant*, 16> Elts; 2250f22ef01cSRoman Divacky 22516122f3e6SDimitry Andric if (StructType *STy = dyn_cast<StructType>(CurTy)) { 2252f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2253f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], 2254f22ef01cSRoman Divacky STy->getElementType(i))); 2255f22ef01cSRoman Divacky V = ConstantStruct::get(STy, Elts); 22566122f3e6SDimitry Andric } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { 22576122f3e6SDimitry Andric Type *EltTy = ATy->getElementType(); 2258f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2259f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2260f22ef01cSRoman Divacky V = ConstantArray::get(ATy, Elts); 22616122f3e6SDimitry Andric } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { 22626122f3e6SDimitry Andric Type *EltTy = VTy->getElementType(); 2263f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2264f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2265f22ef01cSRoman Divacky V = ConstantVector::get(Elts); 2266f22ef01cSRoman Divacky } else { 2267f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2268f22ef01cSRoman Divacky } 2269f22ef01cSRoman Divacky break; 2270f22ef01cSRoman Divacky } 2271dff0c46cSDimitry Andric case bitc::CST_CODE_STRING: // STRING: [values] 2272f22ef01cSRoman Divacky case bitc::CST_CODE_CSTRING: { // CSTRING: [values] 2273f22ef01cSRoman Divacky if (Record.empty()) 22748f0fd8f6SDimitry Andric return error("Invalid record"); 2275f22ef01cSRoman Divacky 22767ae0e2c9SDimitry Andric SmallString<16> Elts(Record.begin(), Record.end()); 2277dff0c46cSDimitry Andric V = ConstantDataArray::getString(Context, Elts, 2278dff0c46cSDimitry Andric BitCode == bitc::CST_CODE_CSTRING); 2279f22ef01cSRoman Divacky break; 2280f22ef01cSRoman Divacky } 2281dff0c46cSDimitry Andric case bitc::CST_CODE_DATA: {// DATA: [n x value] 2282dff0c46cSDimitry Andric if (Record.empty()) 22838f0fd8f6SDimitry Andric return error("Invalid record"); 2284dff0c46cSDimitry Andric 2285dff0c46cSDimitry Andric Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); 2286dff0c46cSDimitry Andric unsigned Size = Record.size(); 2287dff0c46cSDimitry Andric 2288dff0c46cSDimitry Andric if (EltTy->isIntegerTy(8)) { 2289dff0c46cSDimitry Andric SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); 2290dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2291dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2292dff0c46cSDimitry Andric else 2293dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2294dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(16)) { 2295dff0c46cSDimitry Andric SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end()); 2296dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2297dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2298dff0c46cSDimitry Andric else 2299dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2300dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(32)) { 2301dff0c46cSDimitry Andric SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end()); 2302dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2303dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2304dff0c46cSDimitry Andric else 2305dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2306dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(64)) { 2307dff0c46cSDimitry Andric SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end()); 2308dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2309dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2310dff0c46cSDimitry Andric else 2311dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2312dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 23137ae0e2c9SDimitry Andric SmallVector<float, 16> Elts(Size); 23147ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), BitsToFloat); 2315dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2316dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2317dff0c46cSDimitry Andric else 2318dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2319dff0c46cSDimitry Andric } else if (EltTy->isDoubleTy()) { 23207ae0e2c9SDimitry Andric SmallVector<double, 16> Elts(Size); 23217ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), 23227ae0e2c9SDimitry Andric BitsToDouble); 2323dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2324dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2325dff0c46cSDimitry Andric else 2326dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2327dff0c46cSDimitry Andric } else { 23288f0fd8f6SDimitry Andric return error("Invalid type for value"); 2329dff0c46cSDimitry Andric } 2330dff0c46cSDimitry Andric break; 2331dff0c46cSDimitry Andric } 2332dff0c46cSDimitry Andric 2333f22ef01cSRoman Divacky case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] 2334f785676fSDimitry Andric if (Record.size() < 3) 23358f0fd8f6SDimitry Andric return error("Invalid record"); 23368f0fd8f6SDimitry Andric int Opc = getDecodedBinaryOpcode(Record[0], CurTy); 2337f22ef01cSRoman Divacky if (Opc < 0) { 2338f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown binop. 2339f22ef01cSRoman Divacky } else { 2340f22ef01cSRoman Divacky Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); 2341f22ef01cSRoman Divacky Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); 2342f22ef01cSRoman Divacky unsigned Flags = 0; 2343f22ef01cSRoman Divacky if (Record.size() >= 4) { 2344f22ef01cSRoman Divacky if (Opc == Instruction::Add || 2345f22ef01cSRoman Divacky Opc == Instruction::Sub || 23462754fe60SDimitry Andric Opc == Instruction::Mul || 23472754fe60SDimitry Andric Opc == Instruction::Shl) { 2348f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 2349f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoSignedWrap; 2350f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 2351f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoUnsignedWrap; 23522754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 23532754fe60SDimitry Andric Opc == Instruction::UDiv || 23542754fe60SDimitry Andric Opc == Instruction::LShr || 23552754fe60SDimitry Andric Opc == Instruction::AShr) { 23562754fe60SDimitry Andric if (Record[3] & (1 << bitc::PEO_EXACT)) 2357f22ef01cSRoman Divacky Flags |= SDivOperator::IsExact; 2358f22ef01cSRoman Divacky } 2359f22ef01cSRoman Divacky } 2360f22ef01cSRoman Divacky V = ConstantExpr::get(Opc, LHS, RHS, Flags); 2361f22ef01cSRoman Divacky } 2362f22ef01cSRoman Divacky break; 2363f22ef01cSRoman Divacky } 2364f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] 2365f785676fSDimitry Andric if (Record.size() < 3) 23668f0fd8f6SDimitry Andric return error("Invalid record"); 23678f0fd8f6SDimitry Andric int Opc = getDecodedCastOpcode(Record[0]); 2368f22ef01cSRoman Divacky if (Opc < 0) { 2369f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown cast. 2370f22ef01cSRoman Divacky } else { 23716122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 2372f785676fSDimitry Andric if (!OpTy) 23738f0fd8f6SDimitry Andric return error("Invalid record"); 2374f22ef01cSRoman Divacky Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); 2375f785676fSDimitry Andric V = UpgradeBitCastExpr(Opc, Op, CurTy); 2376f785676fSDimitry Andric if (!V) V = ConstantExpr::getCast(Opc, Op, CurTy); 2377f22ef01cSRoman Divacky } 2378f22ef01cSRoman Divacky break; 2379f22ef01cSRoman Divacky } 2380f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INBOUNDS_GEP: 2381f22ef01cSRoman Divacky case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] 2382ff0cc061SDimitry Andric unsigned OpNum = 0; 2383ff0cc061SDimitry Andric Type *PointeeType = nullptr; 2384ff0cc061SDimitry Andric if (Record.size() % 2) 2385ff0cc061SDimitry Andric PointeeType = getTypeByID(Record[OpNum++]); 2386f22ef01cSRoman Divacky SmallVector<Constant*, 16> Elts; 2387ff0cc061SDimitry Andric while (OpNum != Record.size()) { 2388ff0cc061SDimitry Andric Type *ElTy = getTypeByID(Record[OpNum++]); 2389f785676fSDimitry Andric if (!ElTy) 23908f0fd8f6SDimitry Andric return error("Invalid record"); 2391ff0cc061SDimitry Andric Elts.push_back(ValueList.getConstantFwdRef(Record[OpNum++], ElTy)); 2392f22ef01cSRoman Divacky } 2393ff0cc061SDimitry Andric 2394ff0cc061SDimitry Andric if (PointeeType && 2395ff0cc061SDimitry Andric PointeeType != 2396ff0cc061SDimitry Andric cast<SequentialType>(Elts[0]->getType()->getScalarType()) 2397ff0cc061SDimitry Andric ->getElementType()) 23988f0fd8f6SDimitry Andric return error("Explicit gep operator type does not match pointee type " 2399ff0cc061SDimitry Andric "of pointer operand"); 2400ff0cc061SDimitry Andric 24016122f3e6SDimitry Andric ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); 2402ff0cc061SDimitry Andric V = ConstantExpr::getGetElementPtr(PointeeType, Elts[0], Indices, 24036122f3e6SDimitry Andric BitCode == 24046122f3e6SDimitry Andric bitc::CST_CODE_CE_INBOUNDS_GEP); 2405f22ef01cSRoman Divacky break; 2406f22ef01cSRoman Divacky } 2407f785676fSDimitry Andric case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#] 2408f785676fSDimitry Andric if (Record.size() < 3) 24098f0fd8f6SDimitry Andric return error("Invalid record"); 2410f785676fSDimitry Andric 2411f785676fSDimitry Andric Type *SelectorTy = Type::getInt1Ty(Context); 2412f785676fSDimitry Andric 2413f785676fSDimitry Andric // If CurTy is a vector of length n, then Record[0] must be a <n x i1> 2414f785676fSDimitry Andric // vector. Otherwise, it must be a single bit. 2415f785676fSDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) 2416f785676fSDimitry Andric SelectorTy = VectorType::get(Type::getInt1Ty(Context), 2417f785676fSDimitry Andric VTy->getNumElements()); 2418f785676fSDimitry Andric 2419f785676fSDimitry Andric V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], 2420f785676fSDimitry Andric SelectorTy), 2421f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[1],CurTy), 2422f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[2],CurTy)); 2423f22ef01cSRoman Divacky break; 2424f785676fSDimitry Andric } 242591bc56edSDimitry Andric case bitc::CST_CODE_CE_EXTRACTELT 242691bc56edSDimitry Andric : { // CE_EXTRACTELT: [opty, opval, opty, opval] 2427f785676fSDimitry Andric if (Record.size() < 3) 24288f0fd8f6SDimitry Andric return error("Invalid record"); 24296122f3e6SDimitry Andric VectorType *OpTy = 2430f22ef01cSRoman Divacky dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 243191bc56edSDimitry Andric if (!OpTy) 24328f0fd8f6SDimitry Andric return error("Invalid record"); 2433f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 243491bc56edSDimitry Andric Constant *Op1 = nullptr; 243591bc56edSDimitry Andric if (Record.size() == 4) { 243691bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 243791bc56edSDimitry Andric if (!IdxTy) 24388f0fd8f6SDimitry Andric return error("Invalid record"); 243991bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[3], IdxTy); 244091bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 244191bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 244291bc56edSDimitry Andric if (!Op1) 24438f0fd8f6SDimitry Andric return error("Invalid record"); 2444f22ef01cSRoman Divacky V = ConstantExpr::getExtractElement(Op0, Op1); 2445f22ef01cSRoman Divacky break; 2446f22ef01cSRoman Divacky } 244791bc56edSDimitry Andric case bitc::CST_CODE_CE_INSERTELT 244891bc56edSDimitry Andric : { // CE_INSERTELT: [opval, opval, opty, opval] 24496122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 245091bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 24518f0fd8f6SDimitry Andric return error("Invalid record"); 2452f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2453f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], 2454f22ef01cSRoman Divacky OpTy->getElementType()); 245591bc56edSDimitry Andric Constant *Op2 = nullptr; 245691bc56edSDimitry Andric if (Record.size() == 4) { 245791bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 245891bc56edSDimitry Andric if (!IdxTy) 24598f0fd8f6SDimitry Andric return error("Invalid record"); 246091bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[3], IdxTy); 246191bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 246291bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 246391bc56edSDimitry Andric if (!Op2) 24648f0fd8f6SDimitry Andric return error("Invalid record"); 2465f22ef01cSRoman Divacky V = ConstantExpr::getInsertElement(Op0, Op1, Op2); 2466f22ef01cSRoman Divacky break; 2467f22ef01cSRoman Divacky } 2468f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] 24696122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 247091bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 24718f0fd8f6SDimitry Andric return error("Invalid record"); 2472f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2473f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); 24746122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2475f22ef01cSRoman Divacky OpTy->getNumElements()); 2476f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); 2477f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2478f22ef01cSRoman Divacky break; 2479f22ef01cSRoman Divacky } 2480f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] 24816122f3e6SDimitry Andric VectorType *RTy = dyn_cast<VectorType>(CurTy); 24826122f3e6SDimitry Andric VectorType *OpTy = 24832754fe60SDimitry Andric dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 248491bc56edSDimitry Andric if (Record.size() < 4 || !RTy || !OpTy) 24858f0fd8f6SDimitry Andric return error("Invalid record"); 2486f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2487f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 24886122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2489f22ef01cSRoman Divacky RTy->getNumElements()); 2490f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); 2491f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2492f22ef01cSRoman Divacky break; 2493f22ef01cSRoman Divacky } 2494f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] 2495f785676fSDimitry Andric if (Record.size() < 4) 24968f0fd8f6SDimitry Andric return error("Invalid record"); 24976122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 249891bc56edSDimitry Andric if (!OpTy) 24998f0fd8f6SDimitry Andric return error("Invalid record"); 2500f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2501f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 2502f22ef01cSRoman Divacky 2503f22ef01cSRoman Divacky if (OpTy->isFPOrFPVectorTy()) 2504f22ef01cSRoman Divacky V = ConstantExpr::getFCmp(Record[3], Op0, Op1); 2505f22ef01cSRoman Divacky else 2506f22ef01cSRoman Divacky V = ConstantExpr::getICmp(Record[3], Op0, Op1); 2507f22ef01cSRoman Divacky break; 2508f22ef01cSRoman Divacky } 25093861d79fSDimitry Andric // This maintains backward compatibility, pre-asm dialect keywords. 25103861d79fSDimitry Andric // FIXME: Remove with the 4.0 release. 25113861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM_OLD: { 2512f785676fSDimitry Andric if (Record.size() < 2) 25138f0fd8f6SDimitry Andric return error("Invalid record"); 2514f22ef01cSRoman Divacky std::string AsmStr, ConstrStr; 2515f22ef01cSRoman Divacky bool HasSideEffects = Record[0] & 1; 2516f22ef01cSRoman Divacky bool IsAlignStack = Record[0] >> 1; 2517f22ef01cSRoman Divacky unsigned AsmStrSize = Record[1]; 2518f22ef01cSRoman Divacky if (2+AsmStrSize >= Record.size()) 25198f0fd8f6SDimitry Andric return error("Invalid record"); 2520f22ef01cSRoman Divacky unsigned ConstStrSize = Record[2+AsmStrSize]; 2521f22ef01cSRoman Divacky if (3+AsmStrSize+ConstStrSize > Record.size()) 25228f0fd8f6SDimitry Andric return error("Invalid record"); 2523f22ef01cSRoman Divacky 2524f22ef01cSRoman Divacky for (unsigned i = 0; i != AsmStrSize; ++i) 2525f22ef01cSRoman Divacky AsmStr += (char)Record[2+i]; 2526f22ef01cSRoman Divacky for (unsigned i = 0; i != ConstStrSize; ++i) 2527f22ef01cSRoman Divacky ConstrStr += (char)Record[3+AsmStrSize+i]; 25286122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 2529f22ef01cSRoman Divacky V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 2530f22ef01cSRoman Divacky AsmStr, ConstrStr, HasSideEffects, IsAlignStack); 2531f22ef01cSRoman Divacky break; 2532f22ef01cSRoman Divacky } 25333861d79fSDimitry Andric // This version adds support for the asm dialect keywords (e.g., 25343861d79fSDimitry Andric // inteldialect). 25353861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM: { 2536f785676fSDimitry Andric if (Record.size() < 2) 25378f0fd8f6SDimitry Andric return error("Invalid record"); 25383861d79fSDimitry Andric std::string AsmStr, ConstrStr; 25393861d79fSDimitry Andric bool HasSideEffects = Record[0] & 1; 25403861d79fSDimitry Andric bool IsAlignStack = (Record[0] >> 1) & 1; 25413861d79fSDimitry Andric unsigned AsmDialect = Record[0] >> 2; 25423861d79fSDimitry Andric unsigned AsmStrSize = Record[1]; 25433861d79fSDimitry Andric if (2+AsmStrSize >= Record.size()) 25448f0fd8f6SDimitry Andric return error("Invalid record"); 25453861d79fSDimitry Andric unsigned ConstStrSize = Record[2+AsmStrSize]; 25463861d79fSDimitry Andric if (3+AsmStrSize+ConstStrSize > Record.size()) 25478f0fd8f6SDimitry Andric return error("Invalid record"); 25483861d79fSDimitry Andric 25493861d79fSDimitry Andric for (unsigned i = 0; i != AsmStrSize; ++i) 25503861d79fSDimitry Andric AsmStr += (char)Record[2+i]; 25513861d79fSDimitry Andric for (unsigned i = 0; i != ConstStrSize; ++i) 25523861d79fSDimitry Andric ConstrStr += (char)Record[3+AsmStrSize+i]; 25533861d79fSDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 25543861d79fSDimitry Andric V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 25553861d79fSDimitry Andric AsmStr, ConstrStr, HasSideEffects, IsAlignStack, 25563861d79fSDimitry Andric InlineAsm::AsmDialect(AsmDialect)); 25573861d79fSDimitry Andric break; 25583861d79fSDimitry Andric } 2559f22ef01cSRoman Divacky case bitc::CST_CODE_BLOCKADDRESS:{ 2560f785676fSDimitry Andric if (Record.size() < 3) 25618f0fd8f6SDimitry Andric return error("Invalid record"); 25626122f3e6SDimitry Andric Type *FnTy = getTypeByID(Record[0]); 256391bc56edSDimitry Andric if (!FnTy) 25648f0fd8f6SDimitry Andric return error("Invalid record"); 2565f22ef01cSRoman Divacky Function *Fn = 2566f22ef01cSRoman Divacky dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); 256791bc56edSDimitry Andric if (!Fn) 25688f0fd8f6SDimitry Andric return error("Invalid record"); 256939d628a0SDimitry Andric 257039d628a0SDimitry Andric // Don't let Fn get dematerialized. 257139d628a0SDimitry Andric BlockAddressesTaken.insert(Fn); 2572f22ef01cSRoman Divacky 25733861d79fSDimitry Andric // If the function is already parsed we can insert the block address right 25743861d79fSDimitry Andric // away. 257539d628a0SDimitry Andric BasicBlock *BB; 257639d628a0SDimitry Andric unsigned BBID = Record[2]; 257739d628a0SDimitry Andric if (!BBID) 257839d628a0SDimitry Andric // Invalid reference to entry block. 25798f0fd8f6SDimitry Andric return error("Invalid ID"); 25803861d79fSDimitry Andric if (!Fn->empty()) { 25813861d79fSDimitry Andric Function::iterator BBI = Fn->begin(), BBE = Fn->end(); 258239d628a0SDimitry Andric for (size_t I = 0, E = BBID; I != E; ++I) { 25833861d79fSDimitry Andric if (BBI == BBE) 25848f0fd8f6SDimitry Andric return error("Invalid ID"); 25853861d79fSDimitry Andric ++BBI; 25863861d79fSDimitry Andric } 258739d628a0SDimitry Andric BB = BBI; 25883861d79fSDimitry Andric } else { 25893861d79fSDimitry Andric // Otherwise insert a placeholder and remember it so it can be inserted 25903861d79fSDimitry Andric // when the function is parsed. 259139d628a0SDimitry Andric auto &FwdBBs = BasicBlockFwdRefs[Fn]; 259239d628a0SDimitry Andric if (FwdBBs.empty()) 259339d628a0SDimitry Andric BasicBlockFwdRefQueue.push_back(Fn); 259439d628a0SDimitry Andric if (FwdBBs.size() < BBID + 1) 259539d628a0SDimitry Andric FwdBBs.resize(BBID + 1); 259639d628a0SDimitry Andric if (!FwdBBs[BBID]) 259739d628a0SDimitry Andric FwdBBs[BBID] = BasicBlock::Create(Context); 259839d628a0SDimitry Andric BB = FwdBBs[BBID]; 25993861d79fSDimitry Andric } 260039d628a0SDimitry Andric V = BlockAddress::get(Fn, BB); 2601f22ef01cSRoman Divacky break; 2602f22ef01cSRoman Divacky } 2603f22ef01cSRoman Divacky } 2604f22ef01cSRoman Divacky 26058f0fd8f6SDimitry Andric ValueList.assignValue(V, NextCstNo); 2606f22ef01cSRoman Divacky ++NextCstNo; 2607f22ef01cSRoman Divacky } 2608f22ef01cSRoman Divacky } 2609f22ef01cSRoman Divacky 26108f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseUseLists() { 2611dff0c46cSDimitry Andric if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) 26128f0fd8f6SDimitry Andric return error("Invalid record"); 2613dff0c46cSDimitry Andric 2614dff0c46cSDimitry Andric // Read all the records. 261539d628a0SDimitry Andric SmallVector<uint64_t, 64> Record; 2616dff0c46cSDimitry Andric while (1) { 2617139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2618139f7f9bSDimitry Andric 2619139f7f9bSDimitry Andric switch (Entry.Kind) { 2620139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2621139f7f9bSDimitry Andric case BitstreamEntry::Error: 26228f0fd8f6SDimitry Andric return error("Malformed block"); 2623139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 262491bc56edSDimitry Andric return std::error_code(); 2625139f7f9bSDimitry Andric case BitstreamEntry::Record: 2626139f7f9bSDimitry Andric // The interesting case. 2627139f7f9bSDimitry Andric break; 2628dff0c46cSDimitry Andric } 2629dff0c46cSDimitry Andric 2630dff0c46cSDimitry Andric // Read a use list record. 2631dff0c46cSDimitry Andric Record.clear(); 263239d628a0SDimitry Andric bool IsBB = false; 2633139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2634dff0c46cSDimitry Andric default: // Default behavior: unknown type. 2635dff0c46cSDimitry Andric break; 263639d628a0SDimitry Andric case bitc::USELIST_CODE_BB: 263739d628a0SDimitry Andric IsBB = true; 263839d628a0SDimitry Andric // fallthrough 263939d628a0SDimitry Andric case bitc::USELIST_CODE_DEFAULT: { 2640dff0c46cSDimitry Andric unsigned RecordLength = Record.size(); 264139d628a0SDimitry Andric if (RecordLength < 3) 264239d628a0SDimitry Andric // Records should have at least an ID and two indexes. 26438f0fd8f6SDimitry Andric return error("Invalid record"); 264439d628a0SDimitry Andric unsigned ID = Record.back(); 264539d628a0SDimitry Andric Record.pop_back(); 264639d628a0SDimitry Andric 264739d628a0SDimitry Andric Value *V; 264839d628a0SDimitry Andric if (IsBB) { 264939d628a0SDimitry Andric assert(ID < FunctionBBs.size() && "Basic block not found"); 265039d628a0SDimitry Andric V = FunctionBBs[ID]; 265139d628a0SDimitry Andric } else 265239d628a0SDimitry Andric V = ValueList[ID]; 265339d628a0SDimitry Andric unsigned NumUses = 0; 265439d628a0SDimitry Andric SmallDenseMap<const Use *, unsigned, 16> Order; 265539d628a0SDimitry Andric for (const Use &U : V->uses()) { 265639d628a0SDimitry Andric if (++NumUses > Record.size()) 265739d628a0SDimitry Andric break; 265839d628a0SDimitry Andric Order[&U] = Record[NumUses - 1]; 265939d628a0SDimitry Andric } 266039d628a0SDimitry Andric if (Order.size() != Record.size() || NumUses > Record.size()) 266139d628a0SDimitry Andric // Mismatches can happen if the functions are being materialized lazily 266239d628a0SDimitry Andric // (out-of-order), or a value has been upgraded. 266339d628a0SDimitry Andric break; 266439d628a0SDimitry Andric 266539d628a0SDimitry Andric V->sortUseList([&](const Use &L, const Use &R) { 266639d628a0SDimitry Andric return Order.lookup(&L) < Order.lookup(&R); 266739d628a0SDimitry Andric }); 2668dff0c46cSDimitry Andric break; 2669dff0c46cSDimitry Andric } 2670dff0c46cSDimitry Andric } 2671dff0c46cSDimitry Andric } 2672dff0c46cSDimitry Andric } 2673dff0c46cSDimitry Andric 2674ff0cc061SDimitry Andric /// When we see the block for metadata, remember where it is and then skip it. 2675ff0cc061SDimitry Andric /// This lets us lazily deserialize the metadata. 2676ff0cc061SDimitry Andric std::error_code BitcodeReader::rememberAndSkipMetadata() { 2677ff0cc061SDimitry Andric // Save the current stream state. 2678ff0cc061SDimitry Andric uint64_t CurBit = Stream.GetCurrentBitNo(); 2679ff0cc061SDimitry Andric DeferredMetadataInfo.push_back(CurBit); 2680ff0cc061SDimitry Andric 2681ff0cc061SDimitry Andric // Skip over the block for now. 2682ff0cc061SDimitry Andric if (Stream.SkipBlock()) 26838f0fd8f6SDimitry Andric return error("Invalid record"); 2684ff0cc061SDimitry Andric return std::error_code(); 2685ff0cc061SDimitry Andric } 2686ff0cc061SDimitry Andric 2687ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeMetadata() { 2688ff0cc061SDimitry Andric for (uint64_t BitPos : DeferredMetadataInfo) { 2689ff0cc061SDimitry Andric // Move the bit stream to the saved position. 2690ff0cc061SDimitry Andric Stream.JumpToBit(BitPos); 26918f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 2692ff0cc061SDimitry Andric return EC; 2693ff0cc061SDimitry Andric } 2694ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 2695ff0cc061SDimitry Andric return std::error_code(); 2696ff0cc061SDimitry Andric } 2697ff0cc061SDimitry Andric 2698ff0cc061SDimitry Andric void BitcodeReader::setStripDebugInfo() { StripDebugInfo = true; } 2699ff0cc061SDimitry Andric 27008f0fd8f6SDimitry Andric /// When we see the block for a function body, remember where it is and then 27018f0fd8f6SDimitry Andric /// skip it. This lets us lazily deserialize the functions. 27028f0fd8f6SDimitry Andric std::error_code BitcodeReader::rememberAndSkipFunctionBody() { 2703f22ef01cSRoman Divacky // Get the function we are talking about. 2704f22ef01cSRoman Divacky if (FunctionsWithBodies.empty()) 27058f0fd8f6SDimitry Andric return error("Insufficient function protos"); 2706f22ef01cSRoman Divacky 2707f22ef01cSRoman Divacky Function *Fn = FunctionsWithBodies.back(); 2708f22ef01cSRoman Divacky FunctionsWithBodies.pop_back(); 2709f22ef01cSRoman Divacky 2710f22ef01cSRoman Divacky // Save the current stream state. 2711f22ef01cSRoman Divacky uint64_t CurBit = Stream.GetCurrentBitNo(); 2712f22ef01cSRoman Divacky DeferredFunctionInfo[Fn] = CurBit; 2713f22ef01cSRoman Divacky 2714f22ef01cSRoman Divacky // Skip over the function block for now. 2715f22ef01cSRoman Divacky if (Stream.SkipBlock()) 27168f0fd8f6SDimitry Andric return error("Invalid record"); 271791bc56edSDimitry Andric return std::error_code(); 2718f22ef01cSRoman Divacky } 2719f22ef01cSRoman Divacky 27208f0fd8f6SDimitry Andric std::error_code BitcodeReader::globalCleanup() { 2721f22ef01cSRoman Divacky // Patch the initializers for globals and aliases up. 27228f0fd8f6SDimitry Andric resolveGlobalAndAliasInits(); 2723f22ef01cSRoman Divacky if (!GlobalInits.empty() || !AliasInits.empty()) 27248f0fd8f6SDimitry Andric return error("Malformed global initializer set"); 2725f22ef01cSRoman Divacky 2726f22ef01cSRoman Divacky // Look for intrinsic functions which need to be upgraded at some point 27278f0fd8f6SDimitry Andric for (Function &F : *TheModule) { 2728f22ef01cSRoman Divacky Function *NewFn; 27298f0fd8f6SDimitry Andric if (UpgradeIntrinsicFunction(&F, NewFn)) 27303dac3a9bSDimitry Andric UpgradedIntrinsics[&F] = NewFn; 2731f22ef01cSRoman Divacky } 2732f22ef01cSRoman Divacky 2733e580952dSDimitry Andric // Look for global variables which need to be renamed. 27348f0fd8f6SDimitry Andric for (GlobalVariable &GV : TheModule->globals()) 27358f0fd8f6SDimitry Andric UpgradeGlobalVariable(&GV); 273691bc56edSDimitry Andric 2737f22ef01cSRoman Divacky // Force deallocation of memory for these vectors to favor the client that 2738f22ef01cSRoman Divacky // want lazy deserialization. 2739f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); 2740f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); 274191bc56edSDimitry Andric return std::error_code(); 2742f22ef01cSRoman Divacky } 2743f22ef01cSRoman Divacky 27448f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseModule(bool Resume, 2745ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 2746dff0c46cSDimitry Andric if (Resume) 2747dff0c46cSDimitry Andric Stream.JumpToBit(NextUnreadBit); 2748dff0c46cSDimitry Andric else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 27498f0fd8f6SDimitry Andric return error("Invalid record"); 2750dff0c46cSDimitry Andric 2751dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 2752dff0c46cSDimitry Andric std::vector<std::string> SectionTable; 2753dff0c46cSDimitry Andric std::vector<std::string> GCTable; 2754dff0c46cSDimitry Andric 2755dff0c46cSDimitry Andric // Read all the records for this module. 2756139f7f9bSDimitry Andric while (1) { 2757139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 2758dff0c46cSDimitry Andric 2759139f7f9bSDimitry Andric switch (Entry.Kind) { 2760139f7f9bSDimitry Andric case BitstreamEntry::Error: 27618f0fd8f6SDimitry Andric return error("Malformed block"); 2762139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 27638f0fd8f6SDimitry Andric return globalCleanup(); 2764dff0c46cSDimitry Andric 2765139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2766139f7f9bSDimitry Andric switch (Entry.ID) { 2767f22ef01cSRoman Divacky default: // Skip unknown content. 2768f22ef01cSRoman Divacky if (Stream.SkipBlock()) 27698f0fd8f6SDimitry Andric return error("Invalid record"); 2770f22ef01cSRoman Divacky break; 2771f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 2772f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 27738f0fd8f6SDimitry Andric return error("Malformed block"); 2774f22ef01cSRoman Divacky break; 2775f22ef01cSRoman Divacky case bitc::PARAMATTR_BLOCK_ID: 27768f0fd8f6SDimitry Andric if (std::error_code EC = parseAttributeBlock()) 2777f785676fSDimitry Andric return EC; 2778f22ef01cSRoman Divacky break; 2779139f7f9bSDimitry Andric case bitc::PARAMATTR_GROUP_BLOCK_ID: 27808f0fd8f6SDimitry Andric if (std::error_code EC = parseAttributeGroupBlock()) 2781f785676fSDimitry Andric return EC; 2782139f7f9bSDimitry Andric break; 278317a519f9SDimitry Andric case bitc::TYPE_BLOCK_ID_NEW: 27848f0fd8f6SDimitry Andric if (std::error_code EC = parseTypeTable()) 2785f785676fSDimitry Andric return EC; 2786f22ef01cSRoman Divacky break; 2787f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 27888f0fd8f6SDimitry Andric if (std::error_code EC = parseValueSymbolTable()) 2789f785676fSDimitry Andric return EC; 2790dff0c46cSDimitry Andric SeenValueSymbolTable = true; 2791f22ef01cSRoman Divacky break; 2792f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 27938f0fd8f6SDimitry Andric if (std::error_code EC = parseConstants()) 2794f785676fSDimitry Andric return EC; 27958f0fd8f6SDimitry Andric if (std::error_code EC = resolveGlobalAndAliasInits()) 2796f785676fSDimitry Andric return EC; 2797f22ef01cSRoman Divacky break; 2798f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 2799ff0cc061SDimitry Andric if (ShouldLazyLoadMetadata && !IsMetadataMaterialized) { 2800ff0cc061SDimitry Andric if (std::error_code EC = rememberAndSkipMetadata()) 2801ff0cc061SDimitry Andric return EC; 2802ff0cc061SDimitry Andric break; 2803ff0cc061SDimitry Andric } 2804ff0cc061SDimitry Andric assert(DeferredMetadataInfo.empty() && "Unexpected deferred metadata"); 28058f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 2806f785676fSDimitry Andric return EC; 2807f22ef01cSRoman Divacky break; 2808f22ef01cSRoman Divacky case bitc::FUNCTION_BLOCK_ID: 2809f22ef01cSRoman Divacky // If this is the first function body we've seen, reverse the 2810f22ef01cSRoman Divacky // FunctionsWithBodies list. 2811dff0c46cSDimitry Andric if (!SeenFirstFunctionBody) { 2812f22ef01cSRoman Divacky std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); 28138f0fd8f6SDimitry Andric if (std::error_code EC = globalCleanup()) 2814f785676fSDimitry Andric return EC; 2815dff0c46cSDimitry Andric SeenFirstFunctionBody = true; 2816f22ef01cSRoman Divacky } 2817f22ef01cSRoman Divacky 28188f0fd8f6SDimitry Andric if (std::error_code EC = rememberAndSkipFunctionBody()) 2819f785676fSDimitry Andric return EC; 28203dac3a9bSDimitry Andric // Suspend parsing when we reach the function bodies. Subsequent 28213dac3a9bSDimitry Andric // materialization calls will resume it when necessary. If the bitcode 28223dac3a9bSDimitry Andric // file is old, the symbol table will be at the end instead and will not 28233dac3a9bSDimitry Andric // have been seen yet. In this case, just finish the parse now. 28243dac3a9bSDimitry Andric if (SeenValueSymbolTable) { 2825dff0c46cSDimitry Andric NextUnreadBit = Stream.GetCurrentBitNo(); 282691bc56edSDimitry Andric return std::error_code(); 2827dff0c46cSDimitry Andric } 2828dff0c46cSDimitry Andric break; 2829dff0c46cSDimitry Andric case bitc::USELIST_BLOCK_ID: 28308f0fd8f6SDimitry Andric if (std::error_code EC = parseUseLists()) 2831f785676fSDimitry Andric return EC; 2832f22ef01cSRoman Divacky break; 2833f22ef01cSRoman Divacky } 2834f22ef01cSRoman Divacky continue; 2835139f7f9bSDimitry Andric 2836139f7f9bSDimitry Andric case BitstreamEntry::Record: 2837139f7f9bSDimitry Andric // The interesting case. 2838139f7f9bSDimitry Andric break; 2839f22ef01cSRoman Divacky } 2840f22ef01cSRoman Divacky 2841f22ef01cSRoman Divacky 2842f22ef01cSRoman Divacky // Read a record. 2843139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2844f22ef01cSRoman Divacky default: break; // Default behavior, ignore unknown content. 28453861d79fSDimitry Andric case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] 2846f22ef01cSRoman Divacky if (Record.size() < 1) 28478f0fd8f6SDimitry Andric return error("Invalid record"); 28483861d79fSDimitry Andric // Only version #0 and #1 are supported so far. 28493861d79fSDimitry Andric unsigned module_version = Record[0]; 28503861d79fSDimitry Andric switch (module_version) { 2851f785676fSDimitry Andric default: 28528f0fd8f6SDimitry Andric return error("Invalid value"); 28533861d79fSDimitry Andric case 0: 28543861d79fSDimitry Andric UseRelativeIDs = false; 2855f22ef01cSRoman Divacky break; 28563861d79fSDimitry Andric case 1: 28573861d79fSDimitry Andric UseRelativeIDs = true; 28583861d79fSDimitry Andric break; 28593861d79fSDimitry Andric } 28603861d79fSDimitry Andric break; 28613861d79fSDimitry Andric } 2862f22ef01cSRoman Divacky case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 2863f22ef01cSRoman Divacky std::string S; 28648f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28658f0fd8f6SDimitry Andric return error("Invalid record"); 2866f22ef01cSRoman Divacky TheModule->setTargetTriple(S); 2867f22ef01cSRoman Divacky break; 2868f22ef01cSRoman Divacky } 2869f22ef01cSRoman Divacky case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] 2870f22ef01cSRoman Divacky std::string S; 28718f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28728f0fd8f6SDimitry Andric return error("Invalid record"); 2873f22ef01cSRoman Divacky TheModule->setDataLayout(S); 2874f22ef01cSRoman Divacky break; 2875f22ef01cSRoman Divacky } 2876f22ef01cSRoman Divacky case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] 2877f22ef01cSRoman Divacky std::string S; 28788f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28798f0fd8f6SDimitry Andric return error("Invalid record"); 2880f22ef01cSRoman Divacky TheModule->setModuleInlineAsm(S); 2881f22ef01cSRoman Divacky break; 2882f22ef01cSRoman Divacky } 2883f22ef01cSRoman Divacky case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] 2884139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 2885f22ef01cSRoman Divacky std::string S; 28868f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28878f0fd8f6SDimitry Andric return error("Invalid record"); 2888139f7f9bSDimitry Andric // Ignore value. 2889f22ef01cSRoman Divacky break; 2890f22ef01cSRoman Divacky } 2891f22ef01cSRoman Divacky case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] 2892f22ef01cSRoman Divacky std::string S; 28938f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28948f0fd8f6SDimitry Andric return error("Invalid record"); 2895f22ef01cSRoman Divacky SectionTable.push_back(S); 2896f22ef01cSRoman Divacky break; 2897f22ef01cSRoman Divacky } 2898f22ef01cSRoman Divacky case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] 2899f22ef01cSRoman Divacky std::string S; 29008f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 29018f0fd8f6SDimitry Andric return error("Invalid record"); 2902f22ef01cSRoman Divacky GCTable.push_back(S); 2903f22ef01cSRoman Divacky break; 2904f22ef01cSRoman Divacky } 290591bc56edSDimitry Andric case bitc::MODULE_CODE_COMDAT: { // COMDAT: [selection_kind, name] 290691bc56edSDimitry Andric if (Record.size() < 2) 29078f0fd8f6SDimitry Andric return error("Invalid record"); 290891bc56edSDimitry Andric Comdat::SelectionKind SK = getDecodedComdatSelectionKind(Record[0]); 290991bc56edSDimitry Andric unsigned ComdatNameSize = Record[1]; 291091bc56edSDimitry Andric std::string ComdatName; 291191bc56edSDimitry Andric ComdatName.reserve(ComdatNameSize); 291291bc56edSDimitry Andric for (unsigned i = 0; i != ComdatNameSize; ++i) 291391bc56edSDimitry Andric ComdatName += (char)Record[2 + i]; 291491bc56edSDimitry Andric Comdat *C = TheModule->getOrInsertComdat(ComdatName); 291591bc56edSDimitry Andric C->setSelectionKind(SK); 291691bc56edSDimitry Andric ComdatList.push_back(C); 291791bc56edSDimitry Andric break; 291891bc56edSDimitry Andric } 2919f22ef01cSRoman Divacky // GLOBALVAR: [pointer type, isconst, initid, 29202754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 2921ff0cc061SDimitry Andric // unnamed_addr, externally_initialized, dllstorageclass, 2922ff0cc061SDimitry Andric // comdat] 2923f22ef01cSRoman Divacky case bitc::MODULE_CODE_GLOBALVAR: { 2924f22ef01cSRoman Divacky if (Record.size() < 6) 29258f0fd8f6SDimitry Andric return error("Invalid record"); 29266122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2927f785676fSDimitry Andric if (!Ty) 29288f0fd8f6SDimitry Andric return error("Invalid record"); 2929ff0cc061SDimitry Andric bool isConstant = Record[1] & 1; 2930ff0cc061SDimitry Andric bool explicitType = Record[1] & 2; 2931ff0cc061SDimitry Andric unsigned AddressSpace; 2932ff0cc061SDimitry Andric if (explicitType) { 2933ff0cc061SDimitry Andric AddressSpace = Record[1] >> 2; 2934ff0cc061SDimitry Andric } else { 2935f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 29368f0fd8f6SDimitry Andric return error("Invalid type for value"); 2937ff0cc061SDimitry Andric AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); 2938f22ef01cSRoman Divacky Ty = cast<PointerType>(Ty)->getElementType(); 2939ff0cc061SDimitry Andric } 2940f22ef01cSRoman Divacky 2941ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2942ff0cc061SDimitry Andric GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); 2943ff0cc061SDimitry Andric unsigned Alignment; 2944ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[4], Alignment)) 2945ff0cc061SDimitry Andric return EC; 2946f22ef01cSRoman Divacky std::string Section; 2947f22ef01cSRoman Divacky if (Record[5]) { 2948f22ef01cSRoman Divacky if (Record[5]-1 >= SectionTable.size()) 29498f0fd8f6SDimitry Andric return error("Invalid ID"); 2950f22ef01cSRoman Divacky Section = SectionTable[Record[5]-1]; 2951f22ef01cSRoman Divacky } 2952f22ef01cSRoman Divacky GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 295391bc56edSDimitry Andric // Local linkage must have default visibility. 295491bc56edSDimitry Andric if (Record.size() > 6 && !GlobalValue::isLocalLinkage(Linkage)) 295591bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 29568f0fd8f6SDimitry Andric Visibility = getDecodedVisibility(Record[6]); 29577ae0e2c9SDimitry Andric 29587ae0e2c9SDimitry Andric GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; 2959f22ef01cSRoman Divacky if (Record.size() > 7) 29608f0fd8f6SDimitry Andric TLM = getDecodedThreadLocalMode(Record[7]); 2961f22ef01cSRoman Divacky 29622754fe60SDimitry Andric bool UnnamedAddr = false; 29632754fe60SDimitry Andric if (Record.size() > 8) 29642754fe60SDimitry Andric UnnamedAddr = Record[8]; 29652754fe60SDimitry Andric 2966139f7f9bSDimitry Andric bool ExternallyInitialized = false; 2967139f7f9bSDimitry Andric if (Record.size() > 9) 2968139f7f9bSDimitry Andric ExternallyInitialized = Record[9]; 2969139f7f9bSDimitry Andric 2970f22ef01cSRoman Divacky GlobalVariable *NewGV = 297191bc56edSDimitry Andric new GlobalVariable(*TheModule, Ty, isConstant, Linkage, nullptr, "", nullptr, 2972139f7f9bSDimitry Andric TLM, AddressSpace, ExternallyInitialized); 2973f22ef01cSRoman Divacky NewGV->setAlignment(Alignment); 2974f22ef01cSRoman Divacky if (!Section.empty()) 2975f22ef01cSRoman Divacky NewGV->setSection(Section); 2976f22ef01cSRoman Divacky NewGV->setVisibility(Visibility); 29772754fe60SDimitry Andric NewGV->setUnnamedAddr(UnnamedAddr); 2978f22ef01cSRoman Divacky 297991bc56edSDimitry Andric if (Record.size() > 10) 29808f0fd8f6SDimitry Andric NewGV->setDLLStorageClass(getDecodedDLLStorageClass(Record[10])); 298191bc56edSDimitry Andric else 29828f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(NewGV, RawLinkage); 298391bc56edSDimitry Andric 2984f22ef01cSRoman Divacky ValueList.push_back(NewGV); 2985f22ef01cSRoman Divacky 2986f22ef01cSRoman Divacky // Remember which value to use for the global initializer. 2987f22ef01cSRoman Divacky if (unsigned InitID = Record[2]) 2988f22ef01cSRoman Divacky GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); 298991bc56edSDimitry Andric 2990ff0cc061SDimitry Andric if (Record.size() > 11) { 299191bc56edSDimitry Andric if (unsigned ComdatID = Record[11]) { 2992ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 29938f0fd8f6SDimitry Andric return error("Invalid global variable comdat ID"); 299491bc56edSDimitry Andric NewGV->setComdat(ComdatList[ComdatID - 1]); 299591bc56edSDimitry Andric } 2996ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 2997ff0cc061SDimitry Andric NewGV->setComdat(reinterpret_cast<Comdat *>(1)); 2998ff0cc061SDimitry Andric } 2999f22ef01cSRoman Divacky break; 3000f22ef01cSRoman Divacky } 3001f22ef01cSRoman Divacky // FUNCTION: [type, callingconv, isproto, linkage, paramattr, 300291bc56edSDimitry Andric // alignment, section, visibility, gc, unnamed_addr, 300339d628a0SDimitry Andric // prologuedata, dllstorageclass, comdat, prefixdata] 3004f22ef01cSRoman Divacky case bitc::MODULE_CODE_FUNCTION: { 3005f22ef01cSRoman Divacky if (Record.size() < 8) 30068f0fd8f6SDimitry Andric return error("Invalid record"); 30076122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3008f785676fSDimitry Andric if (!Ty) 30098f0fd8f6SDimitry Andric return error("Invalid record"); 3010ff0cc061SDimitry Andric if (auto *PTy = dyn_cast<PointerType>(Ty)) 3011ff0cc061SDimitry Andric Ty = PTy->getElementType(); 3012ff0cc061SDimitry Andric auto *FTy = dyn_cast<FunctionType>(Ty); 3013f22ef01cSRoman Divacky if (!FTy) 30148f0fd8f6SDimitry Andric return error("Invalid type for value"); 3015f22ef01cSRoman Divacky 3016f22ef01cSRoman Divacky Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, 3017f22ef01cSRoman Divacky "", TheModule); 3018f22ef01cSRoman Divacky 3019f22ef01cSRoman Divacky Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); 3020f22ef01cSRoman Divacky bool isProto = Record[2]; 3021ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 3022ff0cc061SDimitry Andric Func->setLinkage(getDecodedLinkage(RawLinkage)); 3023f22ef01cSRoman Divacky Func->setAttributes(getAttributes(Record[4])); 3024f22ef01cSRoman Divacky 3025ff0cc061SDimitry Andric unsigned Alignment; 3026ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[5], Alignment)) 3027ff0cc061SDimitry Andric return EC; 3028ff0cc061SDimitry Andric Func->setAlignment(Alignment); 3029f22ef01cSRoman Divacky if (Record[6]) { 3030f22ef01cSRoman Divacky if (Record[6]-1 >= SectionTable.size()) 30318f0fd8f6SDimitry Andric return error("Invalid ID"); 3032f22ef01cSRoman Divacky Func->setSection(SectionTable[Record[6]-1]); 3033f22ef01cSRoman Divacky } 303491bc56edSDimitry Andric // Local linkage must have default visibility. 303591bc56edSDimitry Andric if (!Func->hasLocalLinkage()) 303691bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 30378f0fd8f6SDimitry Andric Func->setVisibility(getDecodedVisibility(Record[7])); 3038f22ef01cSRoman Divacky if (Record.size() > 8 && Record[8]) { 3039ff0cc061SDimitry Andric if (Record[8]-1 >= GCTable.size()) 30408f0fd8f6SDimitry Andric return error("Invalid ID"); 3041f22ef01cSRoman Divacky Func->setGC(GCTable[Record[8]-1].c_str()); 3042f22ef01cSRoman Divacky } 30432754fe60SDimitry Andric bool UnnamedAddr = false; 30442754fe60SDimitry Andric if (Record.size() > 9) 30452754fe60SDimitry Andric UnnamedAddr = Record[9]; 30462754fe60SDimitry Andric Func->setUnnamedAddr(UnnamedAddr); 3047f785676fSDimitry Andric if (Record.size() > 10 && Record[10] != 0) 304839d628a0SDimitry Andric FunctionPrologues.push_back(std::make_pair(Func, Record[10]-1)); 304991bc56edSDimitry Andric 305091bc56edSDimitry Andric if (Record.size() > 11) 30518f0fd8f6SDimitry Andric Func->setDLLStorageClass(getDecodedDLLStorageClass(Record[11])); 305291bc56edSDimitry Andric else 30538f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(Func, RawLinkage); 305491bc56edSDimitry Andric 3055ff0cc061SDimitry Andric if (Record.size() > 12) { 305691bc56edSDimitry Andric if (unsigned ComdatID = Record[12]) { 3057ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 30588f0fd8f6SDimitry Andric return error("Invalid function comdat ID"); 305991bc56edSDimitry Andric Func->setComdat(ComdatList[ComdatID - 1]); 306091bc56edSDimitry Andric } 3061ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 3062ff0cc061SDimitry Andric Func->setComdat(reinterpret_cast<Comdat *>(1)); 3063ff0cc061SDimitry Andric } 306491bc56edSDimitry Andric 306539d628a0SDimitry Andric if (Record.size() > 13 && Record[13] != 0) 306639d628a0SDimitry Andric FunctionPrefixes.push_back(std::make_pair(Func, Record[13]-1)); 306739d628a0SDimitry Andric 30688f0fd8f6SDimitry Andric if (Record.size() > 14 && Record[14] != 0) 30698f0fd8f6SDimitry Andric FunctionPersonalityFns.push_back(std::make_pair(Func, Record[14] - 1)); 30708f0fd8f6SDimitry Andric 3071f22ef01cSRoman Divacky ValueList.push_back(Func); 3072f22ef01cSRoman Divacky 3073f22ef01cSRoman Divacky // If this is a function with a body, remember the prototype we are 3074f22ef01cSRoman Divacky // creating now, so that we can match up the body with them later. 3075dff0c46cSDimitry Andric if (!isProto) { 307639d628a0SDimitry Andric Func->setIsMaterializable(true); 3077f22ef01cSRoman Divacky FunctionsWithBodies.push_back(Func); 307839d628a0SDimitry Andric DeferredFunctionInfo[Func] = 0; 3079dff0c46cSDimitry Andric } 3080f22ef01cSRoman Divacky break; 3081f22ef01cSRoman Divacky } 3082f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage] 308391bc56edSDimitry Andric // ALIAS: [alias type, aliasee val#, linkage, visibility, dllstorageclass] 3084f22ef01cSRoman Divacky case bitc::MODULE_CODE_ALIAS: { 3085f22ef01cSRoman Divacky if (Record.size() < 3) 30868f0fd8f6SDimitry Andric return error("Invalid record"); 30876122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3088f785676fSDimitry Andric if (!Ty) 30898f0fd8f6SDimitry Andric return error("Invalid record"); 309091bc56edSDimitry Andric auto *PTy = dyn_cast<PointerType>(Ty); 309191bc56edSDimitry Andric if (!PTy) 30928f0fd8f6SDimitry Andric return error("Invalid type for value"); 3093f22ef01cSRoman Divacky 309491bc56edSDimitry Andric auto *NewGA = 3095ff0cc061SDimitry Andric GlobalAlias::create(PTy, getDecodedLinkage(Record[2]), "", TheModule); 3096f22ef01cSRoman Divacky // Old bitcode files didn't have visibility field. 309791bc56edSDimitry Andric // Local linkage must have default visibility. 309891bc56edSDimitry Andric if (Record.size() > 3 && !NewGA->hasLocalLinkage()) 309991bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 31008f0fd8f6SDimitry Andric NewGA->setVisibility(getDecodedVisibility(Record[3])); 310191bc56edSDimitry Andric if (Record.size() > 4) 31028f0fd8f6SDimitry Andric NewGA->setDLLStorageClass(getDecodedDLLStorageClass(Record[4])); 310391bc56edSDimitry Andric else 31048f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(NewGA, Record[2]); 310591bc56edSDimitry Andric if (Record.size() > 5) 31068f0fd8f6SDimitry Andric NewGA->setThreadLocalMode(getDecodedThreadLocalMode(Record[5])); 310791bc56edSDimitry Andric if (Record.size() > 6) 310891bc56edSDimitry Andric NewGA->setUnnamedAddr(Record[6]); 3109f22ef01cSRoman Divacky ValueList.push_back(NewGA); 3110f22ef01cSRoman Divacky AliasInits.push_back(std::make_pair(NewGA, Record[1])); 3111f22ef01cSRoman Divacky break; 3112f22ef01cSRoman Divacky } 3113f22ef01cSRoman Divacky /// MODULE_CODE_PURGEVALS: [numvals] 3114f22ef01cSRoman Divacky case bitc::MODULE_CODE_PURGEVALS: 3115f22ef01cSRoman Divacky // Trim down the value list to the specified size. 3116f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] > ValueList.size()) 31178f0fd8f6SDimitry Andric return error("Invalid record"); 3118f22ef01cSRoman Divacky ValueList.shrinkTo(Record[0]); 3119f22ef01cSRoman Divacky break; 3120f22ef01cSRoman Divacky } 3121f22ef01cSRoman Divacky Record.clear(); 3122f22ef01cSRoman Divacky } 3123f22ef01cSRoman Divacky } 3124f22ef01cSRoman Divacky 31258f0fd8f6SDimitry Andric std::error_code 31268f0fd8f6SDimitry Andric BitcodeReader::parseBitcodeInto(std::unique_ptr<DataStreamer> Streamer, 31278f0fd8f6SDimitry Andric Module *M, bool ShouldLazyLoadMetadata) { 31288f0fd8f6SDimitry Andric TheModule = M; 3129f22ef01cSRoman Divacky 31308f0fd8f6SDimitry Andric if (std::error_code EC = initStream(std::move(Streamer))) 3131f785676fSDimitry Andric return EC; 3132f22ef01cSRoman Divacky 3133f22ef01cSRoman Divacky // Sniff for the signature. 3134f22ef01cSRoman Divacky if (Stream.Read(8) != 'B' || 3135f22ef01cSRoman Divacky Stream.Read(8) != 'C' || 3136f22ef01cSRoman Divacky Stream.Read(4) != 0x0 || 3137f22ef01cSRoman Divacky Stream.Read(4) != 0xC || 3138f22ef01cSRoman Divacky Stream.Read(4) != 0xE || 3139f22ef01cSRoman Divacky Stream.Read(4) != 0xD) 31408f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 3141f22ef01cSRoman Divacky 3142f22ef01cSRoman Divacky // We expect a number of well-defined blocks, though we don't necessarily 3143f22ef01cSRoman Divacky // need to understand them all. 3144139f7f9bSDimitry Andric while (1) { 3145ff0cc061SDimitry Andric if (Stream.AtEndOfStream()) { 3146ff0cc061SDimitry Andric // We didn't really read a proper Module. 31478f0fd8f6SDimitry Andric return error("Malformed IR file"); 3148ff0cc061SDimitry Andric } 3149bd5abe19SDimitry Andric 3150139f7f9bSDimitry Andric BitstreamEntry Entry = 3151139f7f9bSDimitry Andric Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); 3152f22ef01cSRoman Divacky 31538f0fd8f6SDimitry Andric if (Entry.Kind != BitstreamEntry::SubBlock) 31548f0fd8f6SDimitry Andric return error("Malformed block"); 3155f22ef01cSRoman Divacky 31568f0fd8f6SDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 31578f0fd8f6SDimitry Andric return parseModule(false, ShouldLazyLoadMetadata); 31588f0fd8f6SDimitry Andric 3159f22ef01cSRoman Divacky if (Stream.SkipBlock()) 31608f0fd8f6SDimitry Andric return error("Invalid record"); 3161139f7f9bSDimitry Andric } 3162f22ef01cSRoman Divacky } 3163f22ef01cSRoman Divacky 316491bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseModuleTriple() { 31652754fe60SDimitry Andric if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 31668f0fd8f6SDimitry Andric return error("Invalid record"); 31672754fe60SDimitry Andric 31682754fe60SDimitry Andric SmallVector<uint64_t, 64> Record; 31692754fe60SDimitry Andric 317091bc56edSDimitry Andric std::string Triple; 31712754fe60SDimitry Andric // Read all the records for this module. 3172139f7f9bSDimitry Andric while (1) { 3173139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 31742754fe60SDimitry Andric 3175139f7f9bSDimitry Andric switch (Entry.Kind) { 3176139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3177139f7f9bSDimitry Andric case BitstreamEntry::Error: 31788f0fd8f6SDimitry Andric return error("Malformed block"); 3179139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 318091bc56edSDimitry Andric return Triple; 3181139f7f9bSDimitry Andric case BitstreamEntry::Record: 3182139f7f9bSDimitry Andric // The interesting case. 31832754fe60SDimitry Andric break; 31842754fe60SDimitry Andric } 31852754fe60SDimitry Andric 31862754fe60SDimitry Andric // Read a record. 3187139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 31882754fe60SDimitry Andric default: break; // Default behavior, ignore unknown content. 31892754fe60SDimitry Andric case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 31902754fe60SDimitry Andric std::string S; 31918f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 31928f0fd8f6SDimitry Andric return error("Invalid record"); 31932754fe60SDimitry Andric Triple = S; 31942754fe60SDimitry Andric break; 31952754fe60SDimitry Andric } 31962754fe60SDimitry Andric } 31972754fe60SDimitry Andric Record.clear(); 31982754fe60SDimitry Andric } 319991bc56edSDimitry Andric llvm_unreachable("Exit infinite loop"); 32002754fe60SDimitry Andric } 32012754fe60SDimitry Andric 320291bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseTriple() { 32038f0fd8f6SDimitry Andric if (std::error_code EC = initStream(nullptr)) 3204f785676fSDimitry Andric return EC; 32052754fe60SDimitry Andric 32062754fe60SDimitry Andric // Sniff for the signature. 32072754fe60SDimitry Andric if (Stream.Read(8) != 'B' || 32082754fe60SDimitry Andric Stream.Read(8) != 'C' || 32092754fe60SDimitry Andric Stream.Read(4) != 0x0 || 32102754fe60SDimitry Andric Stream.Read(4) != 0xC || 32112754fe60SDimitry Andric Stream.Read(4) != 0xE || 32122754fe60SDimitry Andric Stream.Read(4) != 0xD) 32138f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 32142754fe60SDimitry Andric 32152754fe60SDimitry Andric // We expect a number of well-defined blocks, though we don't necessarily 32162754fe60SDimitry Andric // need to understand them all. 3217139f7f9bSDimitry Andric while (1) { 3218139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 32192754fe60SDimitry Andric 3220139f7f9bSDimitry Andric switch (Entry.Kind) { 3221139f7f9bSDimitry Andric case BitstreamEntry::Error: 32228f0fd8f6SDimitry Andric return error("Malformed block"); 3223139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 322491bc56edSDimitry Andric return std::error_code(); 3225139f7f9bSDimitry Andric 3226139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3227139f7f9bSDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 322891bc56edSDimitry Andric return parseModuleTriple(); 3229139f7f9bSDimitry Andric 3230139f7f9bSDimitry Andric // Ignore other sub-blocks. 3231f785676fSDimitry Andric if (Stream.SkipBlock()) 32328f0fd8f6SDimitry Andric return error("Malformed block"); 3233139f7f9bSDimitry Andric continue; 3234139f7f9bSDimitry Andric 3235139f7f9bSDimitry Andric case BitstreamEntry::Record: 3236139f7f9bSDimitry Andric Stream.skipRecord(Entry.ID); 3237139f7f9bSDimitry Andric continue; 3238139f7f9bSDimitry Andric } 3239139f7f9bSDimitry Andric } 32402754fe60SDimitry Andric } 32412754fe60SDimitry Andric 32428f0fd8f6SDimitry Andric /// Parse metadata attachments. 32438f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseMetadataAttachment(Function &F) { 3244f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 32458f0fd8f6SDimitry Andric return error("Invalid record"); 3246f22ef01cSRoman Divacky 3247f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3248f22ef01cSRoman Divacky while (1) { 3249139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3250139f7f9bSDimitry Andric 3251139f7f9bSDimitry Andric switch (Entry.Kind) { 3252139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3253139f7f9bSDimitry Andric case BitstreamEntry::Error: 32548f0fd8f6SDimitry Andric return error("Malformed block"); 3255139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 325691bc56edSDimitry Andric return std::error_code(); 3257139f7f9bSDimitry Andric case BitstreamEntry::Record: 3258139f7f9bSDimitry Andric // The interesting case. 3259f22ef01cSRoman Divacky break; 3260f22ef01cSRoman Divacky } 3261139f7f9bSDimitry Andric 3262f22ef01cSRoman Divacky // Read a metadata attachment record. 3263f22ef01cSRoman Divacky Record.clear(); 3264139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 3265f22ef01cSRoman Divacky default: // Default behavior: ignore. 3266f22ef01cSRoman Divacky break; 326717a519f9SDimitry Andric case bitc::METADATA_ATTACHMENT: { 3268f22ef01cSRoman Divacky unsigned RecordLength = Record.size(); 3269ff0cc061SDimitry Andric if (Record.empty()) 32708f0fd8f6SDimitry Andric return error("Invalid record"); 3271ff0cc061SDimitry Andric if (RecordLength % 2 == 0) { 3272ff0cc061SDimitry Andric // A function attachment. 3273ff0cc061SDimitry Andric for (unsigned I = 0; I != RecordLength; I += 2) { 3274ff0cc061SDimitry Andric auto K = MDKindMap.find(Record[I]); 3275ff0cc061SDimitry Andric if (K == MDKindMap.end()) 32768f0fd8f6SDimitry Andric return error("Invalid ID"); 3277ff0cc061SDimitry Andric Metadata *MD = MDValueList.getValueFwdRef(Record[I + 1]); 3278ff0cc061SDimitry Andric F.setMetadata(K->second, cast<MDNode>(MD)); 3279ff0cc061SDimitry Andric } 3280ff0cc061SDimitry Andric continue; 3281ff0cc061SDimitry Andric } 3282ff0cc061SDimitry Andric 3283ff0cc061SDimitry Andric // An instruction attachment. 3284f22ef01cSRoman Divacky Instruction *Inst = InstructionList[Record[0]]; 3285f22ef01cSRoman Divacky for (unsigned i = 1; i != RecordLength; i = i+2) { 3286f22ef01cSRoman Divacky unsigned Kind = Record[i]; 3287e580952dSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = 3288e580952dSDimitry Andric MDKindMap.find(Kind); 3289e580952dSDimitry Andric if (I == MDKindMap.end()) 32908f0fd8f6SDimitry Andric return error("Invalid ID"); 329139d628a0SDimitry Andric Metadata *Node = MDValueList.getValueFwdRef(Record[i + 1]); 329239d628a0SDimitry Andric if (isa<LocalAsMetadata>(Node)) 329339d628a0SDimitry Andric // Drop the attachment. This used to be legal, but there's no 329439d628a0SDimitry Andric // upgrade path. 329539d628a0SDimitry Andric break; 3296e580952dSDimitry Andric Inst->setMetadata(I->second, cast<MDNode>(Node)); 3297f785676fSDimitry Andric if (I->second == LLVMContext::MD_tbaa) 3298f785676fSDimitry Andric InstsWithTBAATag.push_back(Inst); 3299f22ef01cSRoman Divacky } 3300f22ef01cSRoman Divacky break; 3301f22ef01cSRoman Divacky } 3302f22ef01cSRoman Divacky } 3303f22ef01cSRoman Divacky } 3304f22ef01cSRoman Divacky } 3305f22ef01cSRoman Divacky 33068f0fd8f6SDimitry Andric static std::error_code typeCheckLoadStoreInst(DiagnosticHandlerFunction DH, 3307ff0cc061SDimitry Andric Type *ValType, Type *PtrType) { 3308ff0cc061SDimitry Andric if (!isa<PointerType>(PtrType)) 33098f0fd8f6SDimitry Andric return error(DH, "Load/Store operand is not a pointer type"); 3310ff0cc061SDimitry Andric Type *ElemType = cast<PointerType>(PtrType)->getElementType(); 3311ff0cc061SDimitry Andric 3312ff0cc061SDimitry Andric if (ValType && ValType != ElemType) 33138f0fd8f6SDimitry Andric return error(DH, "Explicit load/store type does not match pointee type of " 3314ff0cc061SDimitry Andric "pointer operand"); 3315ff0cc061SDimitry Andric if (!PointerType::isLoadableOrStorableType(ElemType)) 33168f0fd8f6SDimitry Andric return error(DH, "Cannot load/store from pointer"); 3317ff0cc061SDimitry Andric return std::error_code(); 3318ff0cc061SDimitry Andric } 3319ff0cc061SDimitry Andric 33208f0fd8f6SDimitry Andric /// Lazily parse the specified function body block. 33218f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseFunctionBody(Function *F) { 3322f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) 33238f0fd8f6SDimitry Andric return error("Invalid record"); 3324f22ef01cSRoman Divacky 3325f22ef01cSRoman Divacky InstructionList.clear(); 3326f22ef01cSRoman Divacky unsigned ModuleValueListSize = ValueList.size(); 3327e580952dSDimitry Andric unsigned ModuleMDValueListSize = MDValueList.size(); 3328f22ef01cSRoman Divacky 3329f22ef01cSRoman Divacky // Add all the function arguments to the value table. 3330f22ef01cSRoman Divacky for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) 3331f22ef01cSRoman Divacky ValueList.push_back(I); 3332f22ef01cSRoman Divacky 3333f22ef01cSRoman Divacky unsigned NextValueNo = ValueList.size(); 333491bc56edSDimitry Andric BasicBlock *CurBB = nullptr; 3335f22ef01cSRoman Divacky unsigned CurBBNo = 0; 3336f22ef01cSRoman Divacky 3337f22ef01cSRoman Divacky DebugLoc LastLoc; 333839d628a0SDimitry Andric auto getLastInstruction = [&]() -> Instruction * { 333939d628a0SDimitry Andric if (CurBB && !CurBB->empty()) 334039d628a0SDimitry Andric return &CurBB->back(); 334139d628a0SDimitry Andric else if (CurBBNo && FunctionBBs[CurBBNo - 1] && 334239d628a0SDimitry Andric !FunctionBBs[CurBBNo - 1]->empty()) 334339d628a0SDimitry Andric return &FunctionBBs[CurBBNo - 1]->back(); 334439d628a0SDimitry Andric return nullptr; 334539d628a0SDimitry Andric }; 3346f22ef01cSRoman Divacky 3347f22ef01cSRoman Divacky // Read all the records. 3348f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3349f22ef01cSRoman Divacky while (1) { 3350139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 3351f22ef01cSRoman Divacky 3352139f7f9bSDimitry Andric switch (Entry.Kind) { 3353139f7f9bSDimitry Andric case BitstreamEntry::Error: 33548f0fd8f6SDimitry Andric return error("Malformed block"); 3355139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 3356139f7f9bSDimitry Andric goto OutOfRecordLoop; 3357139f7f9bSDimitry Andric 3358139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3359139f7f9bSDimitry Andric switch (Entry.ID) { 3360f22ef01cSRoman Divacky default: // Skip unknown content. 3361f22ef01cSRoman Divacky if (Stream.SkipBlock()) 33628f0fd8f6SDimitry Andric return error("Invalid record"); 3363f22ef01cSRoman Divacky break; 3364f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 33658f0fd8f6SDimitry Andric if (std::error_code EC = parseConstants()) 3366f785676fSDimitry Andric return EC; 3367f22ef01cSRoman Divacky NextValueNo = ValueList.size(); 3368f22ef01cSRoman Divacky break; 3369f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 33708f0fd8f6SDimitry Andric if (std::error_code EC = parseValueSymbolTable()) 3371f785676fSDimitry Andric return EC; 3372f22ef01cSRoman Divacky break; 3373f22ef01cSRoman Divacky case bitc::METADATA_ATTACHMENT_ID: 33748f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadataAttachment(*F)) 3375f785676fSDimitry Andric return EC; 3376f22ef01cSRoman Divacky break; 3377f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 33788f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 3379f785676fSDimitry Andric return EC; 3380f22ef01cSRoman Divacky break; 338139d628a0SDimitry Andric case bitc::USELIST_BLOCK_ID: 33828f0fd8f6SDimitry Andric if (std::error_code EC = parseUseLists()) 338339d628a0SDimitry Andric return EC; 338439d628a0SDimitry Andric break; 3385f22ef01cSRoman Divacky } 3386f22ef01cSRoman Divacky continue; 3387f22ef01cSRoman Divacky 3388139f7f9bSDimitry Andric case BitstreamEntry::Record: 3389139f7f9bSDimitry Andric // The interesting case. 3390139f7f9bSDimitry Andric break; 3391f22ef01cSRoman Divacky } 3392f22ef01cSRoman Divacky 3393f22ef01cSRoman Divacky // Read a record. 3394f22ef01cSRoman Divacky Record.clear(); 339591bc56edSDimitry Andric Instruction *I = nullptr; 3396139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 3397f22ef01cSRoman Divacky switch (BitCode) { 3398f22ef01cSRoman Divacky default: // Default behavior: reject 33998f0fd8f6SDimitry Andric return error("Invalid value"); 340039d628a0SDimitry Andric case bitc::FUNC_CODE_DECLAREBLOCKS: { // DECLAREBLOCKS: [nblocks] 3401f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] == 0) 34028f0fd8f6SDimitry Andric return error("Invalid record"); 3403f22ef01cSRoman Divacky // Create all the basic blocks for the function. 3404f22ef01cSRoman Divacky FunctionBBs.resize(Record[0]); 340539d628a0SDimitry Andric 340639d628a0SDimitry Andric // See if anything took the address of blocks in this function. 340739d628a0SDimitry Andric auto BBFRI = BasicBlockFwdRefs.find(F); 340839d628a0SDimitry Andric if (BBFRI == BasicBlockFwdRefs.end()) { 3409f22ef01cSRoman Divacky for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) 3410f22ef01cSRoman Divacky FunctionBBs[i] = BasicBlock::Create(Context, "", F); 341139d628a0SDimitry Andric } else { 341239d628a0SDimitry Andric auto &BBRefs = BBFRI->second; 341339d628a0SDimitry Andric // Check for invalid basic block references. 341439d628a0SDimitry Andric if (BBRefs.size() > FunctionBBs.size()) 34158f0fd8f6SDimitry Andric return error("Invalid ID"); 341639d628a0SDimitry Andric assert(!BBRefs.empty() && "Unexpected empty array"); 341739d628a0SDimitry Andric assert(!BBRefs.front() && "Invalid reference to entry block"); 341839d628a0SDimitry Andric for (unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size(); I != E; 341939d628a0SDimitry Andric ++I) 342039d628a0SDimitry Andric if (I < RE && BBRefs[I]) { 342139d628a0SDimitry Andric BBRefs[I]->insertInto(F); 342239d628a0SDimitry Andric FunctionBBs[I] = BBRefs[I]; 342339d628a0SDimitry Andric } else { 342439d628a0SDimitry Andric FunctionBBs[I] = BasicBlock::Create(Context, "", F); 342539d628a0SDimitry Andric } 342639d628a0SDimitry Andric 342739d628a0SDimitry Andric // Erase from the table. 342839d628a0SDimitry Andric BasicBlockFwdRefs.erase(BBFRI); 342939d628a0SDimitry Andric } 343039d628a0SDimitry Andric 3431f22ef01cSRoman Divacky CurBB = FunctionBBs[0]; 3432f22ef01cSRoman Divacky continue; 343339d628a0SDimitry Andric } 3434f22ef01cSRoman Divacky 3435f22ef01cSRoman Divacky case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN 3436f22ef01cSRoman Divacky // This record indicates that the last instruction is at the same 3437f22ef01cSRoman Divacky // location as the previous instruction with a location. 343839d628a0SDimitry Andric I = getLastInstruction(); 3439f22ef01cSRoman Divacky 344091bc56edSDimitry Andric if (!I) 34418f0fd8f6SDimitry Andric return error("Invalid record"); 3442f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 344391bc56edSDimitry Andric I = nullptr; 3444f22ef01cSRoman Divacky continue; 3445f22ef01cSRoman Divacky 344617a519f9SDimitry Andric case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] 344739d628a0SDimitry Andric I = getLastInstruction(); 344891bc56edSDimitry Andric if (!I || Record.size() < 4) 34498f0fd8f6SDimitry Andric return error("Invalid record"); 3450f22ef01cSRoman Divacky 3451f22ef01cSRoman Divacky unsigned Line = Record[0], Col = Record[1]; 3452f22ef01cSRoman Divacky unsigned ScopeID = Record[2], IAID = Record[3]; 3453f22ef01cSRoman Divacky 345491bc56edSDimitry Andric MDNode *Scope = nullptr, *IA = nullptr; 3455f22ef01cSRoman Divacky if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); 3456f22ef01cSRoman Divacky if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); 3457f22ef01cSRoman Divacky LastLoc = DebugLoc::get(Line, Col, Scope, IA); 3458f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 345991bc56edSDimitry Andric I = nullptr; 3460f22ef01cSRoman Divacky continue; 3461f22ef01cSRoman Divacky } 3462f22ef01cSRoman Divacky 3463f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] 3464f22ef01cSRoman Divacky unsigned OpNum = 0; 3465f22ef01cSRoman Divacky Value *LHS, *RHS; 3466f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 34673861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3468f22ef01cSRoman Divacky OpNum+1 > Record.size()) 34698f0fd8f6SDimitry Andric return error("Invalid record"); 3470f22ef01cSRoman Divacky 34718f0fd8f6SDimitry Andric int Opc = getDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); 3472f785676fSDimitry Andric if (Opc == -1) 34738f0fd8f6SDimitry Andric return error("Invalid record"); 3474f22ef01cSRoman Divacky I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); 3475f22ef01cSRoman Divacky InstructionList.push_back(I); 3476f22ef01cSRoman Divacky if (OpNum < Record.size()) { 3477f22ef01cSRoman Divacky if (Opc == Instruction::Add || 3478f22ef01cSRoman Divacky Opc == Instruction::Sub || 34792754fe60SDimitry Andric Opc == Instruction::Mul || 34802754fe60SDimitry Andric Opc == Instruction::Shl) { 3481f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 3482f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoSignedWrap(true); 3483f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 3484f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); 34852754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 34862754fe60SDimitry Andric Opc == Instruction::UDiv || 34872754fe60SDimitry Andric Opc == Instruction::LShr || 34882754fe60SDimitry Andric Opc == Instruction::AShr) { 34892754fe60SDimitry Andric if (Record[OpNum] & (1 << bitc::PEO_EXACT)) 3490f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setIsExact(true); 3491139f7f9bSDimitry Andric } else if (isa<FPMathOperator>(I)) { 3492875ed548SDimitry Andric FastMathFlags FMF = getDecodedFastMathFlags(Record[OpNum]); 3493139f7f9bSDimitry Andric if (FMF.any()) 3494139f7f9bSDimitry Andric I->setFastMathFlags(FMF); 3495f22ef01cSRoman Divacky } 3496139f7f9bSDimitry Andric 3497f22ef01cSRoman Divacky } 3498f22ef01cSRoman Divacky break; 3499f22ef01cSRoman Divacky } 3500f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] 3501f22ef01cSRoman Divacky unsigned OpNum = 0; 3502f22ef01cSRoman Divacky Value *Op; 3503f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 3504f22ef01cSRoman Divacky OpNum+2 != Record.size()) 35058f0fd8f6SDimitry Andric return error("Invalid record"); 3506f22ef01cSRoman Divacky 35076122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[OpNum]); 35088f0fd8f6SDimitry Andric int Opc = getDecodedCastOpcode(Record[OpNum + 1]); 350991bc56edSDimitry Andric if (Opc == -1 || !ResTy) 35108f0fd8f6SDimitry Andric return error("Invalid record"); 351191bc56edSDimitry Andric Instruction *Temp = nullptr; 3512f785676fSDimitry Andric if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) { 3513f785676fSDimitry Andric if (Temp) { 3514f785676fSDimitry Andric InstructionList.push_back(Temp); 3515f785676fSDimitry Andric CurBB->getInstList().push_back(Temp); 3516f785676fSDimitry Andric } 3517f785676fSDimitry Andric } else { 3518f22ef01cSRoman Divacky I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); 3519f785676fSDimitry Andric } 3520f22ef01cSRoman Divacky InstructionList.push_back(I); 3521f22ef01cSRoman Divacky break; 3522f22ef01cSRoman Divacky } 3523ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD: 3524ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP_OLD: 3525ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP: { // GEP: type, [n x operands] 3526f22ef01cSRoman Divacky unsigned OpNum = 0; 3527ff0cc061SDimitry Andric 3528ff0cc061SDimitry Andric Type *Ty; 3529ff0cc061SDimitry Andric bool InBounds; 3530ff0cc061SDimitry Andric 3531ff0cc061SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_GEP) { 3532ff0cc061SDimitry Andric InBounds = Record[OpNum++]; 3533ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 3534ff0cc061SDimitry Andric } else { 3535ff0cc061SDimitry Andric InBounds = BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD; 3536ff0cc061SDimitry Andric Ty = nullptr; 3537ff0cc061SDimitry Andric } 3538ff0cc061SDimitry Andric 3539f22ef01cSRoman Divacky Value *BasePtr; 3540f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) 35418f0fd8f6SDimitry Andric return error("Invalid record"); 3542f22ef01cSRoman Divacky 3543ff0cc061SDimitry Andric if (!Ty) 3544ff0cc061SDimitry Andric Ty = cast<SequentialType>(BasePtr->getType()->getScalarType()) 3545ff0cc061SDimitry Andric ->getElementType(); 3546ff0cc061SDimitry Andric else if (Ty != 3547ff0cc061SDimitry Andric cast<SequentialType>(BasePtr->getType()->getScalarType()) 3548ff0cc061SDimitry Andric ->getElementType()) 35498f0fd8f6SDimitry Andric return error( 3550ff0cc061SDimitry Andric "Explicit gep type does not match pointee type of pointer operand"); 3551ff0cc061SDimitry Andric 3552f22ef01cSRoman Divacky SmallVector<Value*, 16> GEPIdx; 3553f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3554f22ef01cSRoman Divacky Value *Op; 3555f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 35568f0fd8f6SDimitry Andric return error("Invalid record"); 3557f22ef01cSRoman Divacky GEPIdx.push_back(Op); 3558f22ef01cSRoman Divacky } 3559f22ef01cSRoman Divacky 3560ff0cc061SDimitry Andric I = GetElementPtrInst::Create(Ty, BasePtr, GEPIdx); 3561ff0cc061SDimitry Andric 3562f22ef01cSRoman Divacky InstructionList.push_back(I); 3563ff0cc061SDimitry Andric if (InBounds) 3564f22ef01cSRoman Divacky cast<GetElementPtrInst>(I)->setIsInBounds(true); 3565f22ef01cSRoman Divacky break; 3566f22ef01cSRoman Divacky } 3567f22ef01cSRoman Divacky 3568f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTVAL: { 3569f22ef01cSRoman Divacky // EXTRACTVAL: [opty, opval, n x indices] 3570f22ef01cSRoman Divacky unsigned OpNum = 0; 3571f22ef01cSRoman Divacky Value *Agg; 3572f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 35738f0fd8f6SDimitry Andric return error("Invalid record"); 3574f22ef01cSRoman Divacky 3575ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3576ff0cc061SDimitry Andric if (OpNum == RecSize) 35778f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid instruction with 0 indices"); 3578ff0cc061SDimitry Andric 3579f22ef01cSRoman Divacky SmallVector<unsigned, 4> EXTRACTVALIdx; 3580ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3581ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3582ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3583ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3584f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3585ff0cc061SDimitry Andric 3586ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 35878f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid type"); 3588f22ef01cSRoman Divacky if ((unsigned)Index != Index) 35898f0fd8f6SDimitry Andric return error("Invalid value"); 3590ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 35918f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid struct index"); 3592ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 35938f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid array index"); 3594f22ef01cSRoman Divacky EXTRACTVALIdx.push_back((unsigned)Index); 3595ff0cc061SDimitry Andric 3596ff0cc061SDimitry Andric if (IsStruct) 3597ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3598ff0cc061SDimitry Andric else 3599ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3600f22ef01cSRoman Divacky } 3601f22ef01cSRoman Divacky 360217a519f9SDimitry Andric I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); 3603f22ef01cSRoman Divacky InstructionList.push_back(I); 3604f22ef01cSRoman Divacky break; 3605f22ef01cSRoman Divacky } 3606f22ef01cSRoman Divacky 3607f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTVAL: { 3608f22ef01cSRoman Divacky // INSERTVAL: [opty, opval, opty, opval, n x indices] 3609f22ef01cSRoman Divacky unsigned OpNum = 0; 3610f22ef01cSRoman Divacky Value *Agg; 3611f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 36128f0fd8f6SDimitry Andric return error("Invalid record"); 3613f22ef01cSRoman Divacky Value *Val; 3614f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Val)) 36158f0fd8f6SDimitry Andric return error("Invalid record"); 3616f22ef01cSRoman Divacky 3617ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3618ff0cc061SDimitry Andric if (OpNum == RecSize) 36198f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid instruction with 0 indices"); 3620ff0cc061SDimitry Andric 3621f22ef01cSRoman Divacky SmallVector<unsigned, 4> INSERTVALIdx; 3622ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3623ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3624ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3625ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3626f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3627ff0cc061SDimitry Andric 3628ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 36298f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid type"); 3630f22ef01cSRoman Divacky if ((unsigned)Index != Index) 36318f0fd8f6SDimitry Andric return error("Invalid value"); 3632ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 36338f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid struct index"); 3634ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 36358f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid array index"); 3636ff0cc061SDimitry Andric 3637f22ef01cSRoman Divacky INSERTVALIdx.push_back((unsigned)Index); 3638ff0cc061SDimitry Andric if (IsStruct) 3639ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3640ff0cc061SDimitry Andric else 3641ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3642f22ef01cSRoman Divacky } 3643f22ef01cSRoman Divacky 3644ff0cc061SDimitry Andric if (CurTy != Val->getType()) 36458f0fd8f6SDimitry Andric return error("Inserted value type doesn't match aggregate type"); 3646ff0cc061SDimitry Andric 364717a519f9SDimitry Andric I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); 3648f22ef01cSRoman Divacky InstructionList.push_back(I); 3649f22ef01cSRoman Divacky break; 3650f22ef01cSRoman Divacky } 3651f22ef01cSRoman Divacky 3652f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] 3653f22ef01cSRoman Divacky // obsolete form of select 3654f22ef01cSRoman Divacky // handles select i1 ... in old bitcode 3655f22ef01cSRoman Divacky unsigned OpNum = 0; 3656f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3657f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36583861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 36593861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) 36608f0fd8f6SDimitry Andric return error("Invalid record"); 3661f22ef01cSRoman Divacky 3662f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3663f22ef01cSRoman Divacky InstructionList.push_back(I); 3664f22ef01cSRoman Divacky break; 3665f22ef01cSRoman Divacky } 3666f22ef01cSRoman Divacky 3667f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] 3668f22ef01cSRoman Divacky // new form of select 3669f22ef01cSRoman Divacky // handles select i1 or select [N x i1] 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) || 3674f22ef01cSRoman Divacky getValueTypePair(Record, OpNum, NextValueNo, Cond)) 36758f0fd8f6SDimitry Andric return error("Invalid record"); 3676f22ef01cSRoman Divacky 3677f22ef01cSRoman Divacky // select condition can be either i1 or [N x i1] 36786122f3e6SDimitry Andric if (VectorType* vector_type = 36796122f3e6SDimitry Andric dyn_cast<VectorType>(Cond->getType())) { 3680f22ef01cSRoman Divacky // expect <n x i1> 3681f22ef01cSRoman Divacky if (vector_type->getElementType() != Type::getInt1Ty(Context)) 36828f0fd8f6SDimitry Andric return error("Invalid type for value"); 3683f22ef01cSRoman Divacky } else { 3684f22ef01cSRoman Divacky // expect i1 3685f22ef01cSRoman Divacky if (Cond->getType() != Type::getInt1Ty(Context)) 36868f0fd8f6SDimitry Andric return error("Invalid type for value"); 3687f22ef01cSRoman Divacky } 3688f22ef01cSRoman Divacky 3689f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3690f22ef01cSRoman Divacky InstructionList.push_back(I); 3691f22ef01cSRoman Divacky break; 3692f22ef01cSRoman Divacky } 3693f22ef01cSRoman Divacky 3694f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] 3695f22ef01cSRoman Divacky unsigned OpNum = 0; 3696f22ef01cSRoman Divacky Value *Vec, *Idx; 3697f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 369891bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 36998f0fd8f6SDimitry Andric return error("Invalid record"); 3700ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 37018f0fd8f6SDimitry Andric return error("Invalid type for value"); 3702f22ef01cSRoman Divacky I = ExtractElementInst::Create(Vec, Idx); 3703f22ef01cSRoman Divacky InstructionList.push_back(I); 3704f22ef01cSRoman Divacky break; 3705f22ef01cSRoman Divacky } 3706f22ef01cSRoman Divacky 3707f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] 3708f22ef01cSRoman Divacky unsigned OpNum = 0; 3709f22ef01cSRoman Divacky Value *Vec, *Elt, *Idx; 3710ff0cc061SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Vec)) 37118f0fd8f6SDimitry Andric return error("Invalid record"); 3712ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 37138f0fd8f6SDimitry Andric return error("Invalid type for value"); 3714ff0cc061SDimitry Andric if (popValue(Record, OpNum, NextValueNo, 3715f22ef01cSRoman Divacky cast<VectorType>(Vec->getType())->getElementType(), Elt) || 371691bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 37178f0fd8f6SDimitry Andric return error("Invalid record"); 3718f22ef01cSRoman Divacky I = InsertElementInst::Create(Vec, Elt, Idx); 3719f22ef01cSRoman Divacky InstructionList.push_back(I); 3720f22ef01cSRoman Divacky break; 3721f22ef01cSRoman Divacky } 3722f22ef01cSRoman Divacky 3723f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] 3724f22ef01cSRoman Divacky unsigned OpNum = 0; 3725f22ef01cSRoman Divacky Value *Vec1, *Vec2, *Mask; 3726f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || 37273861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) 37288f0fd8f6SDimitry Andric return error("Invalid record"); 3729f22ef01cSRoman Divacky 3730f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) 37318f0fd8f6SDimitry Andric return error("Invalid record"); 3732ff0cc061SDimitry Andric if (!Vec1->getType()->isVectorTy() || !Vec2->getType()->isVectorTy()) 37338f0fd8f6SDimitry Andric return error("Invalid type for value"); 3734f22ef01cSRoman Divacky I = new ShuffleVectorInst(Vec1, Vec2, Mask); 3735f22ef01cSRoman Divacky InstructionList.push_back(I); 3736f22ef01cSRoman Divacky break; 3737f22ef01cSRoman Divacky } 3738f22ef01cSRoman Divacky 3739f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] 3740f22ef01cSRoman Divacky // Old form of ICmp/FCmp returning bool 3741f22ef01cSRoman Divacky // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were 3742f22ef01cSRoman Divacky // both legal on vectors but had different behaviour. 3743f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] 3744f22ef01cSRoman Divacky // FCmp/ICmp returning bool or vector of bool 3745f22ef01cSRoman Divacky 3746f22ef01cSRoman Divacky unsigned OpNum = 0; 3747f22ef01cSRoman Divacky Value *LHS, *RHS; 3748f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 3749875ed548SDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS)) 3750875ed548SDimitry Andric return error("Invalid record"); 3751875ed548SDimitry Andric 3752875ed548SDimitry Andric unsigned PredVal = Record[OpNum]; 3753875ed548SDimitry Andric bool IsFP = LHS->getType()->isFPOrFPVectorTy(); 3754875ed548SDimitry Andric FastMathFlags FMF; 3755875ed548SDimitry Andric if (IsFP && Record.size() > OpNum+1) 3756875ed548SDimitry Andric FMF = getDecodedFastMathFlags(Record[++OpNum]); 3757875ed548SDimitry Andric 3758875ed548SDimitry Andric if (OpNum+1 != Record.size()) 37598f0fd8f6SDimitry Andric return error("Invalid record"); 3760f22ef01cSRoman Divacky 3761f22ef01cSRoman Divacky if (LHS->getType()->isFPOrFPVectorTy()) 3762875ed548SDimitry Andric I = new FCmpInst((FCmpInst::Predicate)PredVal, LHS, RHS); 3763f22ef01cSRoman Divacky else 3764875ed548SDimitry Andric I = new ICmpInst((ICmpInst::Predicate)PredVal, LHS, RHS); 3765875ed548SDimitry Andric 3766875ed548SDimitry Andric if (FMF.any()) 3767875ed548SDimitry Andric I->setFastMathFlags(FMF); 3768f22ef01cSRoman Divacky InstructionList.push_back(I); 3769f22ef01cSRoman Divacky break; 3770f22ef01cSRoman Divacky } 3771f22ef01cSRoman Divacky 3772f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] 3773f22ef01cSRoman Divacky { 3774f22ef01cSRoman Divacky unsigned Size = Record.size(); 3775f22ef01cSRoman Divacky if (Size == 0) { 3776f22ef01cSRoman Divacky I = ReturnInst::Create(Context); 3777f22ef01cSRoman Divacky InstructionList.push_back(I); 3778f22ef01cSRoman Divacky break; 3779f22ef01cSRoman Divacky } 3780f22ef01cSRoman Divacky 3781f22ef01cSRoman Divacky unsigned OpNum = 0; 378291bc56edSDimitry Andric Value *Op = nullptr; 3783f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 37848f0fd8f6SDimitry Andric return error("Invalid record"); 378517a519f9SDimitry Andric if (OpNum != Record.size()) 37868f0fd8f6SDimitry Andric return error("Invalid record"); 3787f22ef01cSRoman Divacky 378817a519f9SDimitry Andric I = ReturnInst::Create(Context, Op); 3789f22ef01cSRoman Divacky InstructionList.push_back(I); 3790f22ef01cSRoman Divacky break; 3791f22ef01cSRoman Divacky } 3792f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] 3793f22ef01cSRoman Divacky if (Record.size() != 1 && Record.size() != 3) 37948f0fd8f6SDimitry Andric return error("Invalid record"); 3795f22ef01cSRoman Divacky BasicBlock *TrueDest = getBasicBlock(Record[0]); 379691bc56edSDimitry Andric if (!TrueDest) 37978f0fd8f6SDimitry Andric return error("Invalid record"); 3798f22ef01cSRoman Divacky 3799f22ef01cSRoman Divacky if (Record.size() == 1) { 3800f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest); 3801f22ef01cSRoman Divacky InstructionList.push_back(I); 3802f22ef01cSRoman Divacky } 3803f22ef01cSRoman Divacky else { 3804f22ef01cSRoman Divacky BasicBlock *FalseDest = getBasicBlock(Record[1]); 38053861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, 38063861d79fSDimitry Andric Type::getInt1Ty(Context)); 380791bc56edSDimitry Andric if (!FalseDest || !Cond) 38088f0fd8f6SDimitry Andric return error("Invalid record"); 3809f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest, FalseDest, Cond); 3810f22ef01cSRoman Divacky InstructionList.push_back(I); 3811f22ef01cSRoman Divacky } 3812f22ef01cSRoman Divacky break; 3813f22ef01cSRoman Divacky } 3814f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] 38157ae0e2c9SDimitry Andric // Check magic 38167ae0e2c9SDimitry Andric if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { 3817f785676fSDimitry Andric // "New" SwitchInst format with case ranges. The changes to write this 3818f785676fSDimitry Andric // format were reverted but we still recognize bitcode that uses it. 3819f785676fSDimitry Andric // Hopefully someday we will have support for case ranges and can use 3820f785676fSDimitry Andric // this format again. 38217ae0e2c9SDimitry Andric 38227ae0e2c9SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 38237ae0e2c9SDimitry Andric unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); 38247ae0e2c9SDimitry Andric 38253861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, OpTy); 38267ae0e2c9SDimitry Andric BasicBlock *Default = getBasicBlock(Record[3]); 382791bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 38288f0fd8f6SDimitry Andric return error("Invalid record"); 38297ae0e2c9SDimitry Andric 38307ae0e2c9SDimitry Andric unsigned NumCases = Record[4]; 38317ae0e2c9SDimitry Andric 38327ae0e2c9SDimitry Andric SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 38337ae0e2c9SDimitry Andric InstructionList.push_back(SI); 38347ae0e2c9SDimitry Andric 38357ae0e2c9SDimitry Andric unsigned CurIdx = 5; 38367ae0e2c9SDimitry Andric for (unsigned i = 0; i != NumCases; ++i) { 3837f785676fSDimitry Andric SmallVector<ConstantInt*, 1> CaseVals; 38387ae0e2c9SDimitry Andric unsigned NumItems = Record[CurIdx++]; 38397ae0e2c9SDimitry Andric for (unsigned ci = 0; ci != NumItems; ++ci) { 38407ae0e2c9SDimitry Andric bool isSingleNumber = Record[CurIdx++]; 38417ae0e2c9SDimitry Andric 38427ae0e2c9SDimitry Andric APInt Low; 38437ae0e2c9SDimitry Andric unsigned ActiveWords = 1; 38447ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38457ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38468f0fd8f6SDimitry Andric Low = readWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38477ae0e2c9SDimitry Andric ValueBitWidth); 38487ae0e2c9SDimitry Andric CurIdx += ActiveWords; 38497ae0e2c9SDimitry Andric 38507ae0e2c9SDimitry Andric if (!isSingleNumber) { 38517ae0e2c9SDimitry Andric ActiveWords = 1; 38527ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38537ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38548f0fd8f6SDimitry Andric APInt High = readWideAPInt( 38558f0fd8f6SDimitry Andric makeArrayRef(&Record[CurIdx], ActiveWords), ValueBitWidth); 38567ae0e2c9SDimitry Andric CurIdx += ActiveWords; 3857f785676fSDimitry Andric 3858f785676fSDimitry Andric // FIXME: It is not clear whether values in the range should be 3859f785676fSDimitry Andric // compared as signed or unsigned values. The partially 3860f785676fSDimitry Andric // implemented changes that used this format in the past used 3861f785676fSDimitry Andric // unsigned comparisons. 3862f785676fSDimitry Andric for ( ; Low.ule(High); ++Low) 3863f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38647ae0e2c9SDimitry Andric } else 3865f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38667ae0e2c9SDimitry Andric } 38677ae0e2c9SDimitry Andric BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); 3868f785676fSDimitry Andric for (SmallVector<ConstantInt*, 1>::iterator cvi = CaseVals.begin(), 3869f785676fSDimitry Andric cve = CaseVals.end(); cvi != cve; ++cvi) 3870f785676fSDimitry Andric SI->addCase(*cvi, DestBB); 38717ae0e2c9SDimitry Andric } 38727ae0e2c9SDimitry Andric I = SI; 38737ae0e2c9SDimitry Andric break; 38747ae0e2c9SDimitry Andric } 38757ae0e2c9SDimitry Andric 38767ae0e2c9SDimitry Andric // Old SwitchInst format without case ranges. 38777ae0e2c9SDimitry Andric 3878f22ef01cSRoman Divacky if (Record.size() < 3 || (Record.size() & 1) == 0) 38798f0fd8f6SDimitry Andric return error("Invalid record"); 38806122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 38813861d79fSDimitry Andric Value *Cond = getValue(Record, 1, NextValueNo, OpTy); 3882f22ef01cSRoman Divacky BasicBlock *Default = getBasicBlock(Record[2]); 388391bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 38848f0fd8f6SDimitry Andric return error("Invalid record"); 3885f22ef01cSRoman Divacky unsigned NumCases = (Record.size()-3)/2; 3886f22ef01cSRoman Divacky SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 3887f22ef01cSRoman Divacky InstructionList.push_back(SI); 3888f22ef01cSRoman Divacky for (unsigned i = 0, e = NumCases; i != e; ++i) { 3889f22ef01cSRoman Divacky ConstantInt *CaseVal = 3890f22ef01cSRoman Divacky dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); 3891f22ef01cSRoman Divacky BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); 389291bc56edSDimitry Andric if (!CaseVal || !DestBB) { 3893f22ef01cSRoman Divacky delete SI; 38948f0fd8f6SDimitry Andric return error("Invalid record"); 3895f22ef01cSRoman Divacky } 3896f22ef01cSRoman Divacky SI->addCase(CaseVal, DestBB); 3897f22ef01cSRoman Divacky } 3898f22ef01cSRoman Divacky I = SI; 3899f22ef01cSRoman Divacky break; 3900f22ef01cSRoman Divacky } 3901f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] 3902f22ef01cSRoman Divacky if (Record.size() < 2) 39038f0fd8f6SDimitry Andric return error("Invalid record"); 39046122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 39053861d79fSDimitry Andric Value *Address = getValue(Record, 1, NextValueNo, OpTy); 390691bc56edSDimitry Andric if (!OpTy || !Address) 39078f0fd8f6SDimitry Andric return error("Invalid record"); 3908f22ef01cSRoman Divacky unsigned NumDests = Record.size()-2; 3909f22ef01cSRoman Divacky IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); 3910f22ef01cSRoman Divacky InstructionList.push_back(IBI); 3911f22ef01cSRoman Divacky for (unsigned i = 0, e = NumDests; i != e; ++i) { 3912f22ef01cSRoman Divacky if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { 3913f22ef01cSRoman Divacky IBI->addDestination(DestBB); 3914f22ef01cSRoman Divacky } else { 3915f22ef01cSRoman Divacky delete IBI; 39168f0fd8f6SDimitry Andric return error("Invalid record"); 3917f22ef01cSRoman Divacky } 3918f22ef01cSRoman Divacky } 3919f22ef01cSRoman Divacky I = IBI; 3920f22ef01cSRoman Divacky break; 3921f22ef01cSRoman Divacky } 3922f22ef01cSRoman Divacky 3923f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INVOKE: { 3924f22ef01cSRoman Divacky // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] 3925f785676fSDimitry Andric if (Record.size() < 4) 39268f0fd8f6SDimitry Andric return error("Invalid record"); 3927ff0cc061SDimitry Andric unsigned OpNum = 0; 3928ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 3929ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 3930ff0cc061SDimitry Andric BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]); 3931ff0cc061SDimitry Andric BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]); 3932f22ef01cSRoman Divacky 3933ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 3934ff0cc061SDimitry Andric if (CCInfo >> 13 & 1 && 3935ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 39368f0fd8f6SDimitry Andric return error("Explicit invoke type is not a function type"); 3937ff0cc061SDimitry Andric 3938f22ef01cSRoman Divacky Value *Callee; 3939f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 39408f0fd8f6SDimitry Andric return error("Invalid record"); 3941f22ef01cSRoman Divacky 39426122f3e6SDimitry Andric PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); 3943ff0cc061SDimitry Andric if (!CalleeTy) 39448f0fd8f6SDimitry Andric return error("Callee is not a pointer"); 3945ff0cc061SDimitry Andric if (!FTy) { 3946ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(CalleeTy->getElementType()); 3947ff0cc061SDimitry Andric if (!FTy) 39488f0fd8f6SDimitry Andric return error("Callee is not of pointer to function type"); 3949ff0cc061SDimitry Andric } else if (CalleeTy->getElementType() != FTy) 39508f0fd8f6SDimitry Andric return error("Explicit invoke type does not match pointee type of " 3951ff0cc061SDimitry Andric "callee operand"); 3952ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 39538f0fd8f6SDimitry Andric return error("Insufficient operands to call"); 3954f22ef01cSRoman Divacky 3955f22ef01cSRoman Divacky SmallVector<Value*, 16> Ops; 3956f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 39573861d79fSDimitry Andric Ops.push_back(getValue(Record, OpNum, NextValueNo, 39583861d79fSDimitry Andric FTy->getParamType(i))); 395991bc56edSDimitry Andric if (!Ops.back()) 39608f0fd8f6SDimitry Andric return error("Invalid record"); 3961f22ef01cSRoman Divacky } 3962f22ef01cSRoman Divacky 3963f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 3964f22ef01cSRoman Divacky if (Record.size() != OpNum) 39658f0fd8f6SDimitry Andric return error("Invalid record"); 3966f22ef01cSRoman Divacky } else { 3967f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 3968f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3969f22ef01cSRoman Divacky Value *Op; 3970f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 39718f0fd8f6SDimitry Andric return error("Invalid record"); 3972f22ef01cSRoman Divacky Ops.push_back(Op); 3973f22ef01cSRoman Divacky } 3974f22ef01cSRoman Divacky } 3975f22ef01cSRoman Divacky 397617a519f9SDimitry Andric I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); 3977f22ef01cSRoman Divacky InstructionList.push_back(I); 3978ff0cc061SDimitry Andric cast<InvokeInst>(I) 3979ff0cc061SDimitry Andric ->setCallingConv(static_cast<CallingConv::ID>(~(1U << 13) & CCInfo)); 3980f22ef01cSRoman Divacky cast<InvokeInst>(I)->setAttributes(PAL); 3981f22ef01cSRoman Divacky break; 3982f22ef01cSRoman Divacky } 39836122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] 39846122f3e6SDimitry Andric unsigned Idx = 0; 398591bc56edSDimitry Andric Value *Val = nullptr; 39866122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) 39878f0fd8f6SDimitry Andric return error("Invalid record"); 39886122f3e6SDimitry Andric I = ResumeInst::Create(Val); 39896122f3e6SDimitry Andric InstructionList.push_back(I); 39906122f3e6SDimitry Andric break; 39916122f3e6SDimitry Andric } 3992f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE 3993f22ef01cSRoman Divacky I = new UnreachableInst(Context); 3994f22ef01cSRoman Divacky InstructionList.push_back(I); 3995f22ef01cSRoman Divacky break; 3996f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] 3997f22ef01cSRoman Divacky if (Record.size() < 1 || ((Record.size()-1)&1)) 39988f0fd8f6SDimitry Andric return error("Invalid record"); 39996122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4000f785676fSDimitry Andric if (!Ty) 40018f0fd8f6SDimitry Andric return error("Invalid record"); 4002f22ef01cSRoman Divacky 40033b0f4066SDimitry Andric PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); 4004f22ef01cSRoman Divacky InstructionList.push_back(PN); 4005f22ef01cSRoman Divacky 4006f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { 40073861d79fSDimitry Andric Value *V; 40083861d79fSDimitry Andric // With the new function encoding, it is possible that operands have 40093861d79fSDimitry Andric // negative IDs (for forward references). Use a signed VBR 40103861d79fSDimitry Andric // representation to keep the encoding small. 40113861d79fSDimitry Andric if (UseRelativeIDs) 40123861d79fSDimitry Andric V = getValueSigned(Record, 1+i, NextValueNo, Ty); 40133861d79fSDimitry Andric else 40143861d79fSDimitry Andric V = getValue(Record, 1+i, NextValueNo, Ty); 4015f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[2+i]); 4016f785676fSDimitry Andric if (!V || !BB) 40178f0fd8f6SDimitry Andric return error("Invalid record"); 4018f22ef01cSRoman Divacky PN->addIncoming(V, BB); 4019f22ef01cSRoman Divacky } 4020f22ef01cSRoman Divacky I = PN; 4021f22ef01cSRoman Divacky break; 4022f22ef01cSRoman Divacky } 4023f22ef01cSRoman Divacky 40248f0fd8f6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD: 40258f0fd8f6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD_OLD: { 40266122f3e6SDimitry Andric // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] 40276122f3e6SDimitry Andric unsigned Idx = 0; 40288f0fd8f6SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_LANDINGPAD) { 40298f0fd8f6SDimitry Andric if (Record.size() < 3) 40308f0fd8f6SDimitry Andric return error("Invalid record"); 40318f0fd8f6SDimitry Andric } else { 40328f0fd8f6SDimitry Andric assert(BitCode == bitc::FUNC_CODE_INST_LANDINGPAD_OLD); 40336122f3e6SDimitry Andric if (Record.size() < 4) 40348f0fd8f6SDimitry Andric return error("Invalid record"); 40358f0fd8f6SDimitry Andric } 40366122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[Idx++]); 4037f785676fSDimitry Andric if (!Ty) 40388f0fd8f6SDimitry Andric return error("Invalid record"); 40398f0fd8f6SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_LANDINGPAD_OLD) { 404091bc56edSDimitry Andric Value *PersFn = nullptr; 40416122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) 40428f0fd8f6SDimitry Andric return error("Invalid record"); 40438f0fd8f6SDimitry Andric 40448f0fd8f6SDimitry Andric if (!F->hasPersonalityFn()) 40458f0fd8f6SDimitry Andric F->setPersonalityFn(cast<Constant>(PersFn)); 40468f0fd8f6SDimitry Andric else if (F->getPersonalityFn() != cast<Constant>(PersFn)) 40478f0fd8f6SDimitry Andric return error("Personality function mismatch"); 40488f0fd8f6SDimitry Andric } 40496122f3e6SDimitry Andric 40506122f3e6SDimitry Andric bool IsCleanup = !!Record[Idx++]; 40516122f3e6SDimitry Andric unsigned NumClauses = Record[Idx++]; 40528f0fd8f6SDimitry Andric LandingPadInst *LP = LandingPadInst::Create(Ty, NumClauses); 40536122f3e6SDimitry Andric LP->setCleanup(IsCleanup); 40546122f3e6SDimitry Andric for (unsigned J = 0; J != NumClauses; ++J) { 40556122f3e6SDimitry Andric LandingPadInst::ClauseType CT = 40566122f3e6SDimitry Andric LandingPadInst::ClauseType(Record[Idx++]); (void)CT; 40576122f3e6SDimitry Andric Value *Val; 40586122f3e6SDimitry Andric 40596122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) { 40606122f3e6SDimitry Andric delete LP; 40618f0fd8f6SDimitry Andric return error("Invalid record"); 40626122f3e6SDimitry Andric } 40636122f3e6SDimitry Andric 40646122f3e6SDimitry Andric assert((CT != LandingPadInst::Catch || 40656122f3e6SDimitry Andric !isa<ArrayType>(Val->getType())) && 40666122f3e6SDimitry Andric "Catch clause has a invalid type!"); 40676122f3e6SDimitry Andric assert((CT != LandingPadInst::Filter || 40686122f3e6SDimitry Andric isa<ArrayType>(Val->getType())) && 40696122f3e6SDimitry Andric "Filter clause has invalid type!"); 407091bc56edSDimitry Andric LP->addClause(cast<Constant>(Val)); 40716122f3e6SDimitry Andric } 40726122f3e6SDimitry Andric 40736122f3e6SDimitry Andric I = LP; 40746122f3e6SDimitry Andric InstructionList.push_back(I); 40756122f3e6SDimitry Andric break; 40766122f3e6SDimitry Andric } 40776122f3e6SDimitry Andric 407817a519f9SDimitry Andric case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] 407917a519f9SDimitry Andric if (Record.size() != 4) 40808f0fd8f6SDimitry Andric return error("Invalid record"); 4081ff0cc061SDimitry Andric uint64_t AlignRecord = Record[3]; 4082ff0cc061SDimitry Andric const uint64_t InAllocaMask = uint64_t(1) << 5; 4083ff0cc061SDimitry Andric const uint64_t ExplicitTypeMask = uint64_t(1) << 6; 4084ff0cc061SDimitry Andric const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask; 4085ff0cc061SDimitry Andric bool InAlloca = AlignRecord & InAllocaMask; 4086ff0cc061SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4087ff0cc061SDimitry Andric if ((AlignRecord & ExplicitTypeMask) == 0) { 4088ff0cc061SDimitry Andric auto *PTy = dyn_cast_or_null<PointerType>(Ty); 4089ff0cc061SDimitry Andric if (!PTy) 40908f0fd8f6SDimitry Andric return error("Old-style alloca with a non-pointer type"); 4091ff0cc061SDimitry Andric Ty = PTy->getElementType(); 4092ff0cc061SDimitry Andric } 40936122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 409417a519f9SDimitry Andric Value *Size = getFnValueByID(Record[2], OpTy); 4095ff0cc061SDimitry Andric unsigned Align; 4096ff0cc061SDimitry Andric if (std::error_code EC = 4097ff0cc061SDimitry Andric parseAlignmentValue(AlignRecord & ~FlagMask, Align)) { 4098ff0cc061SDimitry Andric return EC; 4099ff0cc061SDimitry Andric } 4100f785676fSDimitry Andric if (!Ty || !Size) 41018f0fd8f6SDimitry Andric return error("Invalid record"); 4102ff0cc061SDimitry Andric AllocaInst *AI = new AllocaInst(Ty, Size, Align); 410391bc56edSDimitry Andric AI->setUsedWithInAlloca(InAlloca); 410491bc56edSDimitry Andric I = AI; 4105f22ef01cSRoman Divacky InstructionList.push_back(I); 4106f22ef01cSRoman Divacky break; 4107f22ef01cSRoman Divacky } 4108f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] 4109f22ef01cSRoman Divacky unsigned OpNum = 0; 4110f22ef01cSRoman Divacky Value *Op; 4111f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4112ff0cc061SDimitry Andric (OpNum + 2 != Record.size() && OpNum + 3 != Record.size())) 41138f0fd8f6SDimitry Andric return error("Invalid record"); 4114f22ef01cSRoman Divacky 4115ff0cc061SDimitry Andric Type *Ty = nullptr; 4116ff0cc061SDimitry Andric if (OpNum + 3 == Record.size()) 4117ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4118ff0cc061SDimitry Andric if (std::error_code EC = 41198f0fd8f6SDimitry Andric typeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4120ff0cc061SDimitry Andric return EC; 4121ff0cc061SDimitry Andric if (!Ty) 4122ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4123ff0cc061SDimitry Andric 4124ff0cc061SDimitry Andric unsigned Align; 4125ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4126ff0cc061SDimitry Andric return EC; 4127ff0cc061SDimitry Andric I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align); 4128ff0cc061SDimitry Andric 4129f22ef01cSRoman Divacky InstructionList.push_back(I); 4130f22ef01cSRoman Divacky break; 4131f22ef01cSRoman Divacky } 41326122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LOADATOMIC: { 41336122f3e6SDimitry Andric // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] 41346122f3e6SDimitry Andric unsigned OpNum = 0; 41356122f3e6SDimitry Andric Value *Op; 41366122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4137ff0cc061SDimitry Andric (OpNum + 4 != Record.size() && OpNum + 5 != Record.size())) 41388f0fd8f6SDimitry Andric return error("Invalid record"); 41396122f3e6SDimitry Andric 4140ff0cc061SDimitry Andric Type *Ty = nullptr; 4141ff0cc061SDimitry Andric if (OpNum + 5 == Record.size()) 4142ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4143ff0cc061SDimitry Andric if (std::error_code EC = 41448f0fd8f6SDimitry Andric typeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4145ff0cc061SDimitry Andric return EC; 4146ff0cc061SDimitry Andric if (!Ty) 4147ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4148ff0cc061SDimitry Andric 41498f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 41506122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Release || 41516122f3e6SDimitry Andric Ordering == AcquireRelease) 41528f0fd8f6SDimitry Andric return error("Invalid record"); 41536122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 41548f0fd8f6SDimitry Andric return error("Invalid record"); 41558f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 41566122f3e6SDimitry Andric 4157ff0cc061SDimitry Andric unsigned Align; 4158ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4159ff0cc061SDimitry Andric return EC; 4160ff0cc061SDimitry Andric I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope); 4161ff0cc061SDimitry Andric 41626122f3e6SDimitry Andric InstructionList.push_back(I); 41636122f3e6SDimitry Andric break; 41646122f3e6SDimitry Andric } 4165ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE: 4166ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE_OLD: { // STORE2:[ptrty, ptr, val, align, vol] 4167f22ef01cSRoman Divacky unsigned OpNum = 0; 4168f22ef01cSRoman Divacky Value *Val, *Ptr; 4169f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4170ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STORE 4171ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4172ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4173ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4174ff0cc061SDimitry Andric Val)) || 4175f22ef01cSRoman Divacky OpNum + 2 != Record.size()) 41768f0fd8f6SDimitry Andric return error("Invalid record"); 4177f22ef01cSRoman Divacky 41788f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4179ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4180ff0cc061SDimitry Andric return EC; 4181ff0cc061SDimitry Andric unsigned Align; 4182ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4183ff0cc061SDimitry Andric return EC; 4184ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align); 4185f22ef01cSRoman Divacky InstructionList.push_back(I); 4186f22ef01cSRoman Divacky break; 4187f22ef01cSRoman Divacky } 4188ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC: 4189ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC_OLD: { 41906122f3e6SDimitry Andric // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] 41916122f3e6SDimitry Andric unsigned OpNum = 0; 41926122f3e6SDimitry Andric Value *Val, *Ptr; 41936122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4194ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STOREATOMIC 4195ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4196ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4197ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4198ff0cc061SDimitry Andric Val)) || 41996122f3e6SDimitry Andric OpNum + 4 != Record.size()) 42008f0fd8f6SDimitry Andric return error("Invalid record"); 42016122f3e6SDimitry Andric 42028f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4203ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4204ff0cc061SDimitry Andric return EC; 42058f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 42066122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Acquire || 42076122f3e6SDimitry Andric Ordering == AcquireRelease) 42088f0fd8f6SDimitry Andric return error("Invalid record"); 42098f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 42106122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 42118f0fd8f6SDimitry Andric return error("Invalid record"); 42126122f3e6SDimitry Andric 4213ff0cc061SDimitry Andric unsigned Align; 4214ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4215ff0cc061SDimitry Andric return EC; 4216ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SynchScope); 42176122f3e6SDimitry Andric InstructionList.push_back(I); 42186122f3e6SDimitry Andric break; 42196122f3e6SDimitry Andric } 4220ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG_OLD: 42216122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG: { 422291bc56edSDimitry Andric // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, 422391bc56edSDimitry Andric // failureordering?, isweak?] 42246122f3e6SDimitry Andric unsigned OpNum = 0; 42256122f3e6SDimitry Andric Value *Ptr, *Cmp, *New; 42266122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4227ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_CMPXCHG 4228ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Cmp) 4229ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4230ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4231ff0cc061SDimitry Andric Cmp)) || 4232ff0cc061SDimitry Andric popValue(Record, OpNum, NextValueNo, Cmp->getType(), New) || 4233ff0cc061SDimitry Andric Record.size() < OpNum + 3 || Record.size() > OpNum + 5) 42348f0fd8f6SDimitry Andric return error("Invalid record"); 42358f0fd8f6SDimitry Andric AtomicOrdering SuccessOrdering = getDecodedOrdering(Record[OpNum + 1]); 423691bc56edSDimitry Andric if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered) 42378f0fd8f6SDimitry Andric return error("Invalid record"); 42388f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 2]); 423991bc56edSDimitry Andric 42408f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4241ff0cc061SDimitry Andric DiagnosticHandler, Cmp->getType(), Ptr->getType())) 4242ff0cc061SDimitry Andric return EC; 424391bc56edSDimitry Andric AtomicOrdering FailureOrdering; 424491bc56edSDimitry Andric if (Record.size() < 7) 424591bc56edSDimitry Andric FailureOrdering = 424691bc56edSDimitry Andric AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrdering); 424791bc56edSDimitry Andric else 42488f0fd8f6SDimitry Andric FailureOrdering = getDecodedOrdering(Record[OpNum + 3]); 424991bc56edSDimitry Andric 425091bc56edSDimitry Andric I = new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering, FailureOrdering, 425191bc56edSDimitry Andric SynchScope); 42526122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); 425391bc56edSDimitry Andric 425491bc56edSDimitry Andric if (Record.size() < 8) { 425591bc56edSDimitry Andric // Before weak cmpxchgs existed, the instruction simply returned the 425691bc56edSDimitry Andric // value loaded from memory, so bitcode files from that era will be 425791bc56edSDimitry Andric // expecting the first component of a modern cmpxchg. 425891bc56edSDimitry Andric CurBB->getInstList().push_back(I); 425991bc56edSDimitry Andric I = ExtractValueInst::Create(I, 0); 426091bc56edSDimitry Andric } else { 426191bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum+4]); 426291bc56edSDimitry Andric } 426391bc56edSDimitry Andric 42646122f3e6SDimitry Andric InstructionList.push_back(I); 42656122f3e6SDimitry Andric break; 42666122f3e6SDimitry Andric } 42676122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_ATOMICRMW: { 42686122f3e6SDimitry Andric // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] 42696122f3e6SDimitry Andric unsigned OpNum = 0; 42706122f3e6SDimitry Andric Value *Ptr, *Val; 42716122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 42723861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 42736122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 42746122f3e6SDimitry Andric OpNum+4 != Record.size()) 42758f0fd8f6SDimitry Andric return error("Invalid record"); 42768f0fd8f6SDimitry Andric AtomicRMWInst::BinOp Operation = getDecodedRMWOperation(Record[OpNum]); 42776122f3e6SDimitry Andric if (Operation < AtomicRMWInst::FIRST_BINOP || 42786122f3e6SDimitry Andric Operation > AtomicRMWInst::LAST_BINOP) 42798f0fd8f6SDimitry Andric return error("Invalid record"); 42808f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 42816122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 42828f0fd8f6SDimitry Andric return error("Invalid record"); 42838f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 42846122f3e6SDimitry Andric I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); 42856122f3e6SDimitry Andric cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); 42866122f3e6SDimitry Andric InstructionList.push_back(I); 42876122f3e6SDimitry Andric break; 42886122f3e6SDimitry Andric } 42896122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] 42906122f3e6SDimitry Andric if (2 != Record.size()) 42918f0fd8f6SDimitry Andric return error("Invalid record"); 42928f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[0]); 42936122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered || 42946122f3e6SDimitry Andric Ordering == Monotonic) 42958f0fd8f6SDimitry Andric return error("Invalid record"); 42968f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[1]); 42976122f3e6SDimitry Andric I = new FenceInst(Context, Ordering, SynchScope); 42986122f3e6SDimitry Andric InstructionList.push_back(I); 42996122f3e6SDimitry Andric break; 43006122f3e6SDimitry Andric } 430117a519f9SDimitry Andric case bitc::FUNC_CODE_INST_CALL: { 4302f22ef01cSRoman Divacky // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] 4303f22ef01cSRoman Divacky if (Record.size() < 3) 43048f0fd8f6SDimitry Andric return error("Invalid record"); 4305f22ef01cSRoman Divacky 4306ff0cc061SDimitry Andric unsigned OpNum = 0; 4307ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 4308ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 4309f22ef01cSRoman Divacky 4310ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 4311ff0cc061SDimitry Andric if (CCInfo >> 15 & 1 && 4312ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 43138f0fd8f6SDimitry Andric return error("Explicit call type is not a function type"); 4314ff0cc061SDimitry Andric 4315f22ef01cSRoman Divacky Value *Callee; 4316f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 43178f0fd8f6SDimitry Andric return error("Invalid record"); 4318f22ef01cSRoman Divacky 43196122f3e6SDimitry Andric PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); 4320ff0cc061SDimitry Andric if (!OpTy) 43218f0fd8f6SDimitry Andric return error("Callee is not a pointer type"); 4322ff0cc061SDimitry Andric if (!FTy) { 4323ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(OpTy->getElementType()); 4324ff0cc061SDimitry Andric if (!FTy) 43258f0fd8f6SDimitry Andric return error("Callee is not of pointer to function type"); 4326ff0cc061SDimitry Andric } else if (OpTy->getElementType() != FTy) 43278f0fd8f6SDimitry Andric return error("Explicit call type does not match pointee type of " 4328ff0cc061SDimitry Andric "callee operand"); 4329ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 43308f0fd8f6SDimitry Andric return error("Insufficient operands to call"); 4331f22ef01cSRoman Divacky 4332f22ef01cSRoman Divacky SmallVector<Value*, 16> Args; 4333f22ef01cSRoman Divacky // Read the fixed params. 4334f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 433517a519f9SDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 4336f22ef01cSRoman Divacky Args.push_back(getBasicBlock(Record[OpNum])); 4337f22ef01cSRoman Divacky else 43383861d79fSDimitry Andric Args.push_back(getValue(Record, OpNum, NextValueNo, 43393861d79fSDimitry Andric FTy->getParamType(i))); 434091bc56edSDimitry Andric if (!Args.back()) 43418f0fd8f6SDimitry Andric return error("Invalid record"); 4342f22ef01cSRoman Divacky } 4343f22ef01cSRoman Divacky 4344f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 4345f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 4346f22ef01cSRoman Divacky if (OpNum != Record.size()) 43478f0fd8f6SDimitry Andric return error("Invalid record"); 4348f22ef01cSRoman Divacky } else { 4349f22ef01cSRoman Divacky while (OpNum != Record.size()) { 4350f22ef01cSRoman Divacky Value *Op; 4351f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 43528f0fd8f6SDimitry Andric return error("Invalid record"); 4353f22ef01cSRoman Divacky Args.push_back(Op); 4354f22ef01cSRoman Divacky } 4355f22ef01cSRoman Divacky } 4356f22ef01cSRoman Divacky 4357ff0cc061SDimitry Andric I = CallInst::Create(FTy, Callee, Args); 4358f22ef01cSRoman Divacky InstructionList.push_back(I); 4359f22ef01cSRoman Divacky cast<CallInst>(I)->setCallingConv( 436091bc56edSDimitry Andric static_cast<CallingConv::ID>((~(1U << 14) & CCInfo) >> 1)); 436191bc56edSDimitry Andric CallInst::TailCallKind TCK = CallInst::TCK_None; 436291bc56edSDimitry Andric if (CCInfo & 1) 436391bc56edSDimitry Andric TCK = CallInst::TCK_Tail; 436491bc56edSDimitry Andric if (CCInfo & (1 << 14)) 436591bc56edSDimitry Andric TCK = CallInst::TCK_MustTail; 436691bc56edSDimitry Andric cast<CallInst>(I)->setTailCallKind(TCK); 4367f22ef01cSRoman Divacky cast<CallInst>(I)->setAttributes(PAL); 4368f22ef01cSRoman Divacky break; 4369f22ef01cSRoman Divacky } 4370f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] 4371f22ef01cSRoman Divacky if (Record.size() < 3) 43728f0fd8f6SDimitry Andric return error("Invalid record"); 43736122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 43743861d79fSDimitry Andric Value *Op = getValue(Record, 1, NextValueNo, OpTy); 43756122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[2]); 4376f22ef01cSRoman Divacky if (!OpTy || !Op || !ResTy) 43778f0fd8f6SDimitry Andric return error("Invalid record"); 4378f22ef01cSRoman Divacky I = new VAArgInst(Op, ResTy); 4379f22ef01cSRoman Divacky InstructionList.push_back(I); 4380f22ef01cSRoman Divacky break; 4381f22ef01cSRoman Divacky } 4382f22ef01cSRoman Divacky } 4383f22ef01cSRoman Divacky 4384f22ef01cSRoman Divacky // Add instruction to end of current BB. If there is no current BB, reject 4385f22ef01cSRoman Divacky // this file. 438691bc56edSDimitry Andric if (!CurBB) { 4387f22ef01cSRoman Divacky delete I; 43888f0fd8f6SDimitry Andric return error("Invalid instruction with no BB"); 4389f22ef01cSRoman Divacky } 4390f22ef01cSRoman Divacky CurBB->getInstList().push_back(I); 4391f22ef01cSRoman Divacky 4392f22ef01cSRoman Divacky // If this was a terminator instruction, move to the next block. 4393f22ef01cSRoman Divacky if (isa<TerminatorInst>(I)) { 4394f22ef01cSRoman Divacky ++CurBBNo; 439591bc56edSDimitry Andric CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr; 4396f22ef01cSRoman Divacky } 4397f22ef01cSRoman Divacky 4398f22ef01cSRoman Divacky // Non-void values get registered in the value table for future use. 4399f22ef01cSRoman Divacky if (I && !I->getType()->isVoidTy()) 44008f0fd8f6SDimitry Andric ValueList.assignValue(I, NextValueNo++); 4401f22ef01cSRoman Divacky } 4402f22ef01cSRoman Divacky 4403139f7f9bSDimitry Andric OutOfRecordLoop: 4404139f7f9bSDimitry Andric 4405f22ef01cSRoman Divacky // Check the function list for unresolved values. 4406f22ef01cSRoman Divacky if (Argument *A = dyn_cast<Argument>(ValueList.back())) { 440791bc56edSDimitry Andric if (!A->getParent()) { 4408f22ef01cSRoman Divacky // We found at least one unresolved value. Nuke them all to avoid leaks. 4409f22ef01cSRoman Divacky for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ 441091bc56edSDimitry Andric if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && !A->getParent()) { 4411f22ef01cSRoman Divacky A->replaceAllUsesWith(UndefValue::get(A->getType())); 4412f22ef01cSRoman Divacky delete A; 4413f22ef01cSRoman Divacky } 4414f22ef01cSRoman Divacky } 44158f0fd8f6SDimitry Andric return error("Never resolved value found in function"); 4416f22ef01cSRoman Divacky } 4417f22ef01cSRoman Divacky } 4418f22ef01cSRoman Divacky 4419e580952dSDimitry Andric // FIXME: Check for unresolved forward-declared metadata references 4420e580952dSDimitry Andric // and clean up leaks. 4421e580952dSDimitry Andric 4422f22ef01cSRoman Divacky // Trim the value list down to the size it was before we parsed this function. 4423f22ef01cSRoman Divacky ValueList.shrinkTo(ModuleValueListSize); 4424e580952dSDimitry Andric MDValueList.shrinkTo(ModuleMDValueListSize); 4425f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 442691bc56edSDimitry Andric return std::error_code(); 4427f22ef01cSRoman Divacky } 4428f22ef01cSRoman Divacky 4429f785676fSDimitry Andric /// Find the function body in the bitcode stream 44308f0fd8f6SDimitry Andric std::error_code BitcodeReader::findFunctionInStream( 443191bc56edSDimitry Andric Function *F, 4432dff0c46cSDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) { 4433dff0c46cSDimitry Andric while (DeferredFunctionInfoIterator->second == 0) { 4434dff0c46cSDimitry Andric if (Stream.AtEndOfStream()) 44358f0fd8f6SDimitry Andric return error("Could not find function in stream"); 4436dff0c46cSDimitry Andric // ParseModule will parse the next body in the stream and set its 4437dff0c46cSDimitry Andric // position in the DeferredFunctionInfo map. 44388f0fd8f6SDimitry Andric if (std::error_code EC = parseModule(true)) 4439f785676fSDimitry Andric return EC; 4440dff0c46cSDimitry Andric } 444191bc56edSDimitry Andric return std::error_code(); 4442dff0c46cSDimitry Andric } 4443dff0c46cSDimitry Andric 4444f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4445f22ef01cSRoman Divacky // GVMaterializer implementation 4446f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4447f22ef01cSRoman Divacky 444891bc56edSDimitry Andric void BitcodeReader::releaseBuffer() { Buffer.release(); } 4449f22ef01cSRoman Divacky 445039d628a0SDimitry Andric std::error_code BitcodeReader::materialize(GlobalValue *GV) { 4451ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4452ff0cc061SDimitry Andric return EC; 4453ff0cc061SDimitry Andric 4454f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4455f22ef01cSRoman Divacky // If it's not a function or is already material, ignore the request. 4456f785676fSDimitry Andric if (!F || !F->isMaterializable()) 445791bc56edSDimitry Andric return std::error_code(); 4458f22ef01cSRoman Divacky 4459f22ef01cSRoman Divacky DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); 4460f22ef01cSRoman Divacky assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); 4461dff0c46cSDimitry Andric // If its position is recorded as 0, its body is somewhere in the stream 4462dff0c46cSDimitry Andric // but we haven't seen it yet. 44633dac3a9bSDimitry Andric if (DFII->second == 0) 44648f0fd8f6SDimitry Andric if (std::error_code EC = findFunctionInStream(F, DFII)) 4465f785676fSDimitry Andric return EC; 4466f22ef01cSRoman Divacky 4467f22ef01cSRoman Divacky // Move the bit stream to the saved position of the deferred function body. 4468f22ef01cSRoman Divacky Stream.JumpToBit(DFII->second); 4469f22ef01cSRoman Divacky 44708f0fd8f6SDimitry Andric if (std::error_code EC = parseFunctionBody(F)) 4471f785676fSDimitry Andric return EC; 447239d628a0SDimitry Andric F->setIsMaterializable(false); 4473f22ef01cSRoman Divacky 4474ff0cc061SDimitry Andric if (StripDebugInfo) 4475ff0cc061SDimitry Andric stripDebugInfo(*F); 4476ff0cc061SDimitry Andric 4477f22ef01cSRoman Divacky // Upgrade any old intrinsic calls in the function. 44783dac3a9bSDimitry Andric for (auto &I : UpgradedIntrinsics) { 4479875ed548SDimitry Andric for (auto UI = I.first->user_begin(), UE = I.first->user_end(); UI != UE;) { 44803dac3a9bSDimitry Andric User *U = *UI; 44813dac3a9bSDimitry Andric ++UI; 44823dac3a9bSDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(U)) 44833dac3a9bSDimitry Andric UpgradeIntrinsicCall(CI, I.second); 4484f22ef01cSRoman Divacky } 4485f22ef01cSRoman Divacky } 4486f22ef01cSRoman Divacky 448739d628a0SDimitry Andric // Bring in any functions that this function forward-referenced via 448839d628a0SDimitry Andric // blockaddresses. 448939d628a0SDimitry Andric return materializeForwardReferencedFunctions(); 4490f22ef01cSRoman Divacky } 4491f22ef01cSRoman Divacky 4492f22ef01cSRoman Divacky bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { 4493f22ef01cSRoman Divacky const Function *F = dyn_cast<Function>(GV); 4494f22ef01cSRoman Divacky if (!F || F->isDeclaration()) 4495f22ef01cSRoman Divacky return false; 449639d628a0SDimitry Andric 449739d628a0SDimitry Andric // Dematerializing F would leave dangling references that wouldn't be 449839d628a0SDimitry Andric // reconnected on re-materialization. 449939d628a0SDimitry Andric if (BlockAddressesTaken.count(F)) 450039d628a0SDimitry Andric return false; 450139d628a0SDimitry Andric 4502f22ef01cSRoman Divacky return DeferredFunctionInfo.count(const_cast<Function*>(F)); 4503f22ef01cSRoman Divacky } 4504f22ef01cSRoman Divacky 4505ff0cc061SDimitry Andric void BitcodeReader::dematerialize(GlobalValue *GV) { 4506f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4507f22ef01cSRoman Divacky // If this function isn't dematerializable, this is a noop. 4508f22ef01cSRoman Divacky if (!F || !isDematerializable(F)) 4509f22ef01cSRoman Divacky return; 4510f22ef01cSRoman Divacky 4511f22ef01cSRoman Divacky assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); 4512f22ef01cSRoman Divacky 4513f22ef01cSRoman Divacky // Just forget the function body, we can remat it later. 451439d628a0SDimitry Andric F->dropAllReferences(); 451539d628a0SDimitry Andric F->setIsMaterializable(true); 4516f22ef01cSRoman Divacky } 4517f22ef01cSRoman Divacky 4518ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeModule(Module *M) { 4519f22ef01cSRoman Divacky assert(M == TheModule && 4520f22ef01cSRoman Divacky "Can only Materialize the Module this BitcodeReader is attached to."); 452139d628a0SDimitry Andric 4522ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4523ff0cc061SDimitry Andric return EC; 4524ff0cc061SDimitry Andric 452539d628a0SDimitry Andric // Promise to materialize all forward references. 452639d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 452739d628a0SDimitry Andric 4528f22ef01cSRoman Divacky // Iterate over the module, deserializing any functions that are still on 4529f22ef01cSRoman Divacky // disk. 4530f22ef01cSRoman Divacky for (Module::iterator F = TheModule->begin(), E = TheModule->end(); 4531f785676fSDimitry Andric F != E; ++F) { 453239d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 4533f785676fSDimitry Andric return EC; 4534f785676fSDimitry Andric } 4535dff0c46cSDimitry Andric // At this point, if there are any function bodies, the current bit is 4536dff0c46cSDimitry Andric // pointing to the END_BLOCK record after them. Now make sure the rest 4537dff0c46cSDimitry Andric // of the bits in the module have been read. 4538dff0c46cSDimitry Andric if (NextUnreadBit) 45398f0fd8f6SDimitry Andric parseModule(true); 4540dff0c46cSDimitry Andric 454139d628a0SDimitry Andric // Check that all block address forward references got resolved (as we 454239d628a0SDimitry Andric // promised above). 454339d628a0SDimitry Andric if (!BasicBlockFwdRefs.empty()) 45448f0fd8f6SDimitry Andric return error("Never resolved function from blockaddress"); 454539d628a0SDimitry Andric 4546f22ef01cSRoman Divacky // Upgrade any intrinsic calls that slipped through (should not happen!) and 4547f22ef01cSRoman Divacky // delete the old functions to clean up. We can't do this unless the entire 4548f22ef01cSRoman Divacky // module is materialized because there could always be another function body 4549f22ef01cSRoman Divacky // with calls to the old function. 45503dac3a9bSDimitry Andric for (auto &I : UpgradedIntrinsics) { 45513dac3a9bSDimitry Andric for (auto *U : I.first->users()) { 45523dac3a9bSDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(U)) 45533dac3a9bSDimitry Andric UpgradeIntrinsicCall(CI, I.second); 4554f22ef01cSRoman Divacky } 45553dac3a9bSDimitry Andric if (!I.first->use_empty()) 45563dac3a9bSDimitry Andric I.first->replaceAllUsesWith(I.second); 45573dac3a9bSDimitry Andric I.first->eraseFromParent(); 4558f22ef01cSRoman Divacky } 45593dac3a9bSDimitry Andric UpgradedIntrinsics.clear(); 4560f22ef01cSRoman Divacky 4561f785676fSDimitry Andric for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) 4562f785676fSDimitry Andric UpgradeInstWithTBAATag(InstsWithTBAATag[I]); 4563f785676fSDimitry Andric 4564f785676fSDimitry Andric UpgradeDebugInfo(*M); 456591bc56edSDimitry Andric return std::error_code(); 4566dff0c46cSDimitry Andric } 45676122f3e6SDimitry Andric 456839d628a0SDimitry Andric std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes() const { 456939d628a0SDimitry Andric return IdentifiedStructTypes; 457039d628a0SDimitry Andric } 457139d628a0SDimitry Andric 45728f0fd8f6SDimitry Andric std::error_code 45738f0fd8f6SDimitry Andric BitcodeReader::initStream(std::unique_ptr<DataStreamer> Streamer) { 45748f0fd8f6SDimitry Andric if (Streamer) 45758f0fd8f6SDimitry Andric return initLazyStream(std::move(Streamer)); 45768f0fd8f6SDimitry Andric return initStreamFromBuffer(); 4577dff0c46cSDimitry Andric } 4578dff0c46cSDimitry Andric 45798f0fd8f6SDimitry Andric std::error_code BitcodeReader::initStreamFromBuffer() { 45803861d79fSDimitry Andric const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); 4581dff0c46cSDimitry Andric const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); 4582dff0c46cSDimitry Andric 458339d628a0SDimitry Andric if (Buffer->getBufferSize() & 3) 45848f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4585dff0c46cSDimitry Andric 4586dff0c46cSDimitry Andric // If we have a wrapper header, parse it and ignore the non-bc file contents. 4587dff0c46cSDimitry Andric // The magic number is 0x0B17C0DE stored in little endian. 4588dff0c46cSDimitry Andric if (isBitcodeWrapper(BufPtr, BufEnd)) 4589dff0c46cSDimitry Andric if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) 45908f0fd8f6SDimitry Andric return error("Invalid bitcode wrapper header"); 4591dff0c46cSDimitry Andric 4592dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); 459339d628a0SDimitry Andric Stream.init(&*StreamFile); 4594f22ef01cSRoman Divacky 459591bc56edSDimitry Andric return std::error_code(); 4596f22ef01cSRoman Divacky } 4597f22ef01cSRoman Divacky 45988f0fd8f6SDimitry Andric std::error_code 45998f0fd8f6SDimitry Andric BitcodeReader::initLazyStream(std::unique_ptr<DataStreamer> Streamer) { 4600dff0c46cSDimitry Andric // Check and strip off the bitcode wrapper; BitstreamReader expects never to 4601dff0c46cSDimitry Andric // see it. 46028f0fd8f6SDimitry Andric auto OwnedBytes = 46038f0fd8f6SDimitry Andric llvm::make_unique<StreamingMemoryObject>(std::move(Streamer)); 460439d628a0SDimitry Andric StreamingMemoryObject &Bytes = *OwnedBytes; 460539d628a0SDimitry Andric StreamFile = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes)); 460639d628a0SDimitry Andric Stream.init(&*StreamFile); 4607dff0c46cSDimitry Andric 4608dff0c46cSDimitry Andric unsigned char buf[16]; 460939d628a0SDimitry Andric if (Bytes.readBytes(buf, 16, 0) != 16) 46108f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4611dff0c46cSDimitry Andric 4612dff0c46cSDimitry Andric if (!isBitcode(buf, buf + 16)) 46138f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4614dff0c46cSDimitry Andric 4615dff0c46cSDimitry Andric if (isBitcodeWrapper(buf, buf + 4)) { 4616dff0c46cSDimitry Andric const unsigned char *bitcodeStart = buf; 4617dff0c46cSDimitry Andric const unsigned char *bitcodeEnd = buf + 16; 4618dff0c46cSDimitry Andric SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); 461939d628a0SDimitry Andric Bytes.dropLeadingBytes(bitcodeStart - buf); 462039d628a0SDimitry Andric Bytes.setKnownObjectSize(bitcodeEnd - bitcodeStart); 4621dff0c46cSDimitry Andric } 462291bc56edSDimitry Andric return std::error_code(); 4623f785676fSDimitry Andric } 4624f785676fSDimitry Andric 4625f785676fSDimitry Andric namespace { 462691bc56edSDimitry Andric class BitcodeErrorCategoryType : public std::error_category { 462791bc56edSDimitry Andric const char *name() const LLVM_NOEXCEPT override { 4628f785676fSDimitry Andric return "llvm.bitcode"; 4629f785676fSDimitry Andric } 463091bc56edSDimitry Andric std::string message(int IE) const override { 463139d628a0SDimitry Andric BitcodeError E = static_cast<BitcodeError>(IE); 4632f785676fSDimitry Andric switch (E) { 463339d628a0SDimitry Andric case BitcodeError::InvalidBitcodeSignature: 4634f785676fSDimitry Andric return "Invalid bitcode signature"; 463539d628a0SDimitry Andric case BitcodeError::CorruptedBitcode: 463639d628a0SDimitry Andric return "Corrupted bitcode"; 4637f785676fSDimitry Andric } 4638f785676fSDimitry Andric llvm_unreachable("Unknown error type!"); 4639f785676fSDimitry Andric } 4640f785676fSDimitry Andric }; 46413dac3a9bSDimitry Andric } 4642f785676fSDimitry Andric 464339d628a0SDimitry Andric static ManagedStatic<BitcodeErrorCategoryType> ErrorCategory; 464439d628a0SDimitry Andric 464539d628a0SDimitry Andric const std::error_category &llvm::BitcodeErrorCategory() { 464639d628a0SDimitry Andric return *ErrorCategory; 4647dff0c46cSDimitry Andric } 4648f22ef01cSRoman Divacky 4649f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4650f22ef01cSRoman Divacky // External interface 4651f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4652f22ef01cSRoman Divacky 46538f0fd8f6SDimitry Andric static ErrorOr<std::unique_ptr<Module>> 46548f0fd8f6SDimitry Andric getBitcodeModuleImpl(std::unique_ptr<DataStreamer> Streamer, StringRef Name, 46558f0fd8f6SDimitry Andric BitcodeReader *R, LLVMContext &Context, 46568f0fd8f6SDimitry Andric bool MaterializeAll, bool ShouldLazyLoadMetadata) { 46578f0fd8f6SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 46588f0fd8f6SDimitry Andric M->setMaterializer(R); 46598f0fd8f6SDimitry Andric 46608f0fd8f6SDimitry Andric auto cleanupOnError = [&](std::error_code EC) { 46618f0fd8f6SDimitry Andric R->releaseBuffer(); // Never take ownership on error. 46628f0fd8f6SDimitry Andric return EC; 46638f0fd8f6SDimitry Andric }; 46648f0fd8f6SDimitry Andric 46658f0fd8f6SDimitry Andric // Delay parsing Metadata if ShouldLazyLoadMetadata is true. 46668f0fd8f6SDimitry Andric if (std::error_code EC = R->parseBitcodeInto(std::move(Streamer), M.get(), 46678f0fd8f6SDimitry Andric ShouldLazyLoadMetadata)) 46688f0fd8f6SDimitry Andric return cleanupOnError(EC); 46698f0fd8f6SDimitry Andric 46708f0fd8f6SDimitry Andric if (MaterializeAll) { 46718f0fd8f6SDimitry Andric // Read in the entire module, and destroy the BitcodeReader. 46728f0fd8f6SDimitry Andric if (std::error_code EC = M->materializeAllPermanently()) 46738f0fd8f6SDimitry Andric return cleanupOnError(EC); 46748f0fd8f6SDimitry Andric } else { 46758f0fd8f6SDimitry Andric // Resolve forward references from blockaddresses. 46768f0fd8f6SDimitry Andric if (std::error_code EC = R->materializeForwardReferencedFunctions()) 46778f0fd8f6SDimitry Andric return cleanupOnError(EC); 46788f0fd8f6SDimitry Andric } 46798f0fd8f6SDimitry Andric return std::move(M); 46808f0fd8f6SDimitry Andric } 46818f0fd8f6SDimitry Andric 468239d628a0SDimitry Andric /// \brief Get a lazy one-at-time loading module from bitcode. 4683f22ef01cSRoman Divacky /// 468439d628a0SDimitry Andric /// This isn't always used in a lazy context. In particular, it's also used by 468539d628a0SDimitry Andric /// \a parseBitcodeFile(). If this is truly lazy, then we need to eagerly pull 468639d628a0SDimitry Andric /// in forward-referenced functions from block address references. 468739d628a0SDimitry Andric /// 46888f0fd8f6SDimitry Andric /// \param[in] MaterializeAll Set to \c true if we should materialize 46898f0fd8f6SDimitry Andric /// everything. 46908f0fd8f6SDimitry Andric static ErrorOr<std::unique_ptr<Module>> 469139d628a0SDimitry Andric getLazyBitcodeModuleImpl(std::unique_ptr<MemoryBuffer> &&Buffer, 46928f0fd8f6SDimitry Andric LLVMContext &Context, bool MaterializeAll, 4693ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4694ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false) { 469539d628a0SDimitry Andric BitcodeReader *R = 469639d628a0SDimitry Andric new BitcodeReader(Buffer.get(), Context, DiagnosticHandler); 469739d628a0SDimitry Andric 46988f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> Ret = 46998f0fd8f6SDimitry Andric getBitcodeModuleImpl(nullptr, Buffer->getBufferIdentifier(), R, Context, 47008f0fd8f6SDimitry Andric MaterializeAll, ShouldLazyLoadMetadata); 47018f0fd8f6SDimitry Andric if (!Ret) 47028f0fd8f6SDimitry Andric return Ret; 470339d628a0SDimitry Andric 470439d628a0SDimitry Andric Buffer.release(); // The BitcodeReader owns it now. 47058f0fd8f6SDimitry Andric return Ret; 4706dff0c46cSDimitry Andric } 4707dff0c46cSDimitry Andric 47088f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> llvm::getLazyBitcodeModule( 47098f0fd8f6SDimitry Andric std::unique_ptr<MemoryBuffer> &&Buffer, LLVMContext &Context, 47108f0fd8f6SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, bool ShouldLazyLoadMetadata) { 471139d628a0SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buffer), Context, false, 4712ff0cc061SDimitry Andric DiagnosticHandler, ShouldLazyLoadMetadata); 4713f22ef01cSRoman Divacky } 4714f22ef01cSRoman Divacky 47158f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> llvm::getStreamedBitcodeModule( 47168f0fd8f6SDimitry Andric StringRef Name, std::unique_ptr<DataStreamer> Streamer, 47178f0fd8f6SDimitry Andric LLVMContext &Context, DiagnosticHandlerFunction DiagnosticHandler) { 471839d628a0SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 47198f0fd8f6SDimitry Andric BitcodeReader *R = new BitcodeReader(Context, DiagnosticHandler); 47208f0fd8f6SDimitry Andric 47218f0fd8f6SDimitry Andric return getBitcodeModuleImpl(std::move(Streamer), Name, R, Context, false, 47228f0fd8f6SDimitry Andric false); 472339d628a0SDimitry Andric } 472439d628a0SDimitry Andric 47258f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> 472639d628a0SDimitry Andric llvm::parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, 472739d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 472839d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 47298f0fd8f6SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buf), Context, true, 47308f0fd8f6SDimitry Andric DiagnosticHandler); 4731dff0c46cSDimitry Andric // TODO: Restore the use-lists to the in-memory state when the bitcode was 4732dff0c46cSDimitry Andric // written. We must defer until the Module has been fully materialized. 4733f22ef01cSRoman Divacky } 47342754fe60SDimitry Andric 473539d628a0SDimitry Andric std::string 473639d628a0SDimitry Andric llvm::getBitcodeTargetTriple(MemoryBufferRef Buffer, LLVMContext &Context, 473739d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 473839d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 473939d628a0SDimitry Andric auto R = llvm::make_unique<BitcodeReader>(Buf.release(), Context, 474039d628a0SDimitry Andric DiagnosticHandler); 474191bc56edSDimitry Andric ErrorOr<std::string> Triple = R->parseTriple(); 474291bc56edSDimitry Andric if (Triple.getError()) 474391bc56edSDimitry Andric return ""; 474491bc56edSDimitry Andric return Triple.get(); 47452754fe60SDimitry Andric } 4746