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 7008f0fd8f6SDimitry Andric static void upgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) { 70191bc56edSDimitry Andric switch (Val) { 70291bc56edSDimitry Andric case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; 70391bc56edSDimitry Andric case 6: GV->setDLLStorageClass(GlobalValue::DLLExportStorageClass); break; 70491bc56edSDimitry Andric } 70591bc56edSDimitry Andric } 70691bc56edSDimitry Andric 707f22ef01cSRoman Divacky namespace llvm { 708f22ef01cSRoman Divacky namespace { 7098f0fd8f6SDimitry Andric /// \brief A class for maintaining the slot number definition 710f22ef01cSRoman Divacky /// as a placeholder for the actual definition for forward constants defs. 711f22ef01cSRoman Divacky class ConstantPlaceHolder : public ConstantExpr { 712ff0cc061SDimitry Andric void operator=(const ConstantPlaceHolder &) = delete; 7138f0fd8f6SDimitry Andric 714f22ef01cSRoman Divacky public: 715f22ef01cSRoman Divacky // allocate space for exactly one operand 7168f0fd8f6SDimitry Andric void *operator new(size_t s) { return User::operator new(s, 1); } 7176122f3e6SDimitry Andric explicit ConstantPlaceHolder(Type *Ty, LLVMContext &Context) 718f22ef01cSRoman Divacky : ConstantExpr(Ty, Instruction::UserOp1, &Op<0>(), 1) { 719f22ef01cSRoman Divacky Op<0>() = UndefValue::get(Type::getInt32Ty(Context)); 720f22ef01cSRoman Divacky } 721f22ef01cSRoman Divacky 7228f0fd8f6SDimitry Andric /// \brief Methods to support type inquiry through isa, cast, and dyn_cast. 723f22ef01cSRoman Divacky static bool classof(const Value *V) { 724f22ef01cSRoman Divacky return isa<ConstantExpr>(V) && 725f22ef01cSRoman Divacky cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; 726f22ef01cSRoman Divacky } 727f22ef01cSRoman Divacky 728f22ef01cSRoman Divacky /// Provide fast operand accessors 72939d628a0SDimitry Andric DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 730f22ef01cSRoman Divacky }; 7313dac3a9bSDimitry Andric } 732f22ef01cSRoman Divacky 733f22ef01cSRoman Divacky // FIXME: can we inherit this from ConstantExpr? 734f22ef01cSRoman Divacky template <> 7352754fe60SDimitry Andric struct OperandTraits<ConstantPlaceHolder> : 7362754fe60SDimitry Andric public FixedNumOperandTraits<ConstantPlaceHolder, 1> { 737f22ef01cSRoman Divacky }; 73839d628a0SDimitry Andric DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantPlaceHolder, Value) 7393dac3a9bSDimitry Andric } 740f22ef01cSRoman Divacky 7418f0fd8f6SDimitry Andric void BitcodeReaderValueList::assignValue(Value *V, unsigned Idx) { 742f22ef01cSRoman Divacky if (Idx == size()) { 743f22ef01cSRoman Divacky push_back(V); 744f22ef01cSRoman Divacky return; 745f22ef01cSRoman Divacky } 746f22ef01cSRoman Divacky 747f22ef01cSRoman Divacky if (Idx >= size()) 748f22ef01cSRoman Divacky resize(Idx+1); 749f22ef01cSRoman Divacky 750f22ef01cSRoman Divacky WeakVH &OldV = ValuePtrs[Idx]; 75191bc56edSDimitry Andric if (!OldV) { 752f22ef01cSRoman Divacky OldV = V; 753f22ef01cSRoman Divacky return; 754f22ef01cSRoman Divacky } 755f22ef01cSRoman Divacky 756f22ef01cSRoman Divacky // Handle constants and non-constants (e.g. instrs) differently for 757f22ef01cSRoman Divacky // efficiency. 758f22ef01cSRoman Divacky if (Constant *PHC = dyn_cast<Constant>(&*OldV)) { 759f22ef01cSRoman Divacky ResolveConstants.push_back(std::make_pair(PHC, Idx)); 760f22ef01cSRoman Divacky OldV = V; 761f22ef01cSRoman Divacky } else { 762f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 763f22ef01cSRoman Divacky Value *PrevVal = OldV; 764f22ef01cSRoman Divacky OldV->replaceAllUsesWith(V); 765f22ef01cSRoman Divacky delete PrevVal; 766f22ef01cSRoman Divacky } 767f22ef01cSRoman Divacky } 768f22ef01cSRoman Divacky 769f22ef01cSRoman Divacky 770f22ef01cSRoman Divacky Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx, 7716122f3e6SDimitry Andric Type *Ty) { 772f22ef01cSRoman Divacky if (Idx >= size()) 773f22ef01cSRoman Divacky resize(Idx + 1); 774f22ef01cSRoman Divacky 775f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 776ff0cc061SDimitry Andric if (Ty != V->getType()) 777ff0cc061SDimitry Andric report_fatal_error("Type mismatch in constant table!"); 778f22ef01cSRoman Divacky return cast<Constant>(V); 779f22ef01cSRoman Divacky } 780f22ef01cSRoman Divacky 781f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 782f22ef01cSRoman Divacky Constant *C = new ConstantPlaceHolder(Ty, Context); 783f22ef01cSRoman Divacky ValuePtrs[Idx] = C; 784f22ef01cSRoman Divacky return C; 785f22ef01cSRoman Divacky } 786f22ef01cSRoman Divacky 7876122f3e6SDimitry Andric Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty) { 788ff0cc061SDimitry Andric // Bail out for a clearly invalid value. This would make us call resize(0) 789ff0cc061SDimitry Andric if (Idx == UINT_MAX) 790ff0cc061SDimitry Andric return nullptr; 791ff0cc061SDimitry Andric 792f22ef01cSRoman Divacky if (Idx >= size()) 793f22ef01cSRoman Divacky resize(Idx + 1); 794f22ef01cSRoman Divacky 795f22ef01cSRoman Divacky if (Value *V = ValuePtrs[Idx]) { 796ff0cc061SDimitry Andric // If the types don't match, it's invalid. 797ff0cc061SDimitry Andric if (Ty && Ty != V->getType()) 798ff0cc061SDimitry Andric return nullptr; 799f22ef01cSRoman Divacky return V; 800f22ef01cSRoman Divacky } 801f22ef01cSRoman Divacky 802f22ef01cSRoman Divacky // No type specified, must be invalid reference. 80391bc56edSDimitry Andric if (!Ty) return nullptr; 804f22ef01cSRoman Divacky 805f22ef01cSRoman Divacky // Create and return a placeholder, which will later be RAUW'd. 806f22ef01cSRoman Divacky Value *V = new Argument(Ty); 807f22ef01cSRoman Divacky ValuePtrs[Idx] = V; 808f22ef01cSRoman Divacky return V; 809f22ef01cSRoman Divacky } 810f22ef01cSRoman Divacky 8118f0fd8f6SDimitry Andric /// Once all constants are read, this method bulk resolves any forward 8128f0fd8f6SDimitry Andric /// references. The idea behind this is that we sometimes get constants (such 8138f0fd8f6SDimitry Andric /// as large arrays) which reference *many* forward ref constants. Replacing 8148f0fd8f6SDimitry Andric /// each of these causes a lot of thrashing when building/reuniquing the 8158f0fd8f6SDimitry Andric /// constant. Instead of doing this, we look at all the uses and rewrite all 8168f0fd8f6SDimitry Andric /// the place holders at once for any constant that uses a placeholder. 8178f0fd8f6SDimitry Andric void BitcodeReaderValueList::resolveConstantForwardRefs() { 818f22ef01cSRoman Divacky // Sort the values by-pointer so that they are efficient to look up with a 819f22ef01cSRoman Divacky // binary search. 820f22ef01cSRoman Divacky std::sort(ResolveConstants.begin(), ResolveConstants.end()); 821f22ef01cSRoman Divacky 822f22ef01cSRoman Divacky SmallVector<Constant*, 64> NewOps; 823f22ef01cSRoman Divacky 824f22ef01cSRoman Divacky while (!ResolveConstants.empty()) { 825f22ef01cSRoman Divacky Value *RealVal = operator[](ResolveConstants.back().second); 826f22ef01cSRoman Divacky Constant *Placeholder = ResolveConstants.back().first; 827f22ef01cSRoman Divacky ResolveConstants.pop_back(); 828f22ef01cSRoman Divacky 829f22ef01cSRoman Divacky // Loop over all users of the placeholder, updating them to reference the 830f22ef01cSRoman Divacky // new value. If they reference more than one placeholder, update them all 831f22ef01cSRoman Divacky // at once. 832f22ef01cSRoman Divacky while (!Placeholder->use_empty()) { 83391bc56edSDimitry Andric auto UI = Placeholder->user_begin(); 834ffd1746dSEd Schouten User *U = *UI; 835f22ef01cSRoman Divacky 836f22ef01cSRoman Divacky // If the using object isn't uniqued, just update the operands. This 837f22ef01cSRoman Divacky // handles instructions and initializers for global variables. 838ffd1746dSEd Schouten if (!isa<Constant>(U) || isa<GlobalValue>(U)) { 839f22ef01cSRoman Divacky UI.getUse().set(RealVal); 840f22ef01cSRoman Divacky continue; 841f22ef01cSRoman Divacky } 842f22ef01cSRoman Divacky 843f22ef01cSRoman Divacky // Otherwise, we have a constant that uses the placeholder. Replace that 844f22ef01cSRoman Divacky // constant with a new constant that has *all* placeholder uses updated. 845ffd1746dSEd Schouten Constant *UserC = cast<Constant>(U); 846f22ef01cSRoman Divacky for (User::op_iterator I = UserC->op_begin(), E = UserC->op_end(); 847f22ef01cSRoman Divacky I != E; ++I) { 848f22ef01cSRoman Divacky Value *NewOp; 849f22ef01cSRoman Divacky if (!isa<ConstantPlaceHolder>(*I)) { 850f22ef01cSRoman Divacky // Not a placeholder reference. 851f22ef01cSRoman Divacky NewOp = *I; 852f22ef01cSRoman Divacky } else if (*I == Placeholder) { 853f22ef01cSRoman Divacky // Common case is that it just references this one placeholder. 854f22ef01cSRoman Divacky NewOp = RealVal; 855f22ef01cSRoman Divacky } else { 856f22ef01cSRoman Divacky // Otherwise, look up the placeholder in ResolveConstants. 857f22ef01cSRoman Divacky ResolveConstantsTy::iterator It = 858f22ef01cSRoman Divacky std::lower_bound(ResolveConstants.begin(), ResolveConstants.end(), 859f22ef01cSRoman Divacky std::pair<Constant*, unsigned>(cast<Constant>(*I), 860f22ef01cSRoman Divacky 0)); 861f22ef01cSRoman Divacky assert(It != ResolveConstants.end() && It->first == *I); 862f22ef01cSRoman Divacky NewOp = operator[](It->second); 863f22ef01cSRoman Divacky } 864f22ef01cSRoman Divacky 865f22ef01cSRoman Divacky NewOps.push_back(cast<Constant>(NewOp)); 866f22ef01cSRoman Divacky } 867f22ef01cSRoman Divacky 868f22ef01cSRoman Divacky // Make the new constant. 869f22ef01cSRoman Divacky Constant *NewC; 870f22ef01cSRoman Divacky if (ConstantArray *UserCA = dyn_cast<ConstantArray>(UserC)) { 87117a519f9SDimitry Andric NewC = ConstantArray::get(UserCA->getType(), NewOps); 872f22ef01cSRoman Divacky } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) { 87317a519f9SDimitry Andric NewC = ConstantStruct::get(UserCS->getType(), NewOps); 874f22ef01cSRoman Divacky } else if (isa<ConstantVector>(UserC)) { 8752754fe60SDimitry Andric NewC = ConstantVector::get(NewOps); 876f22ef01cSRoman Divacky } else { 877f22ef01cSRoman Divacky assert(isa<ConstantExpr>(UserC) && "Must be a ConstantExpr."); 8783b0f4066SDimitry Andric NewC = cast<ConstantExpr>(UserC)->getWithOperands(NewOps); 879f22ef01cSRoman Divacky } 880f22ef01cSRoman Divacky 881f22ef01cSRoman Divacky UserC->replaceAllUsesWith(NewC); 882f22ef01cSRoman Divacky UserC->destroyConstant(); 883f22ef01cSRoman Divacky NewOps.clear(); 884f22ef01cSRoman Divacky } 885f22ef01cSRoman Divacky 886f22ef01cSRoman Divacky // Update all ValueHandles, they should be the only users at this point. 887f22ef01cSRoman Divacky Placeholder->replaceAllUsesWith(RealVal); 888f22ef01cSRoman Divacky delete Placeholder; 889f22ef01cSRoman Divacky } 890f22ef01cSRoman Divacky } 891f22ef01cSRoman Divacky 8928f0fd8f6SDimitry Andric void BitcodeReaderMDValueList::assignValue(Metadata *MD, unsigned Idx) { 893f22ef01cSRoman Divacky if (Idx == size()) { 89439d628a0SDimitry Andric push_back(MD); 895f22ef01cSRoman Divacky return; 896f22ef01cSRoman Divacky } 897f22ef01cSRoman Divacky 898f22ef01cSRoman Divacky if (Idx >= size()) 899f22ef01cSRoman Divacky resize(Idx+1); 900f22ef01cSRoman Divacky 90139d628a0SDimitry Andric TrackingMDRef &OldMD = MDValuePtrs[Idx]; 90239d628a0SDimitry Andric if (!OldMD) { 90339d628a0SDimitry Andric OldMD.reset(MD); 904f22ef01cSRoman Divacky return; 905f22ef01cSRoman Divacky } 906f22ef01cSRoman Divacky 907f22ef01cSRoman Divacky // If there was a forward reference to this value, replace it. 908ff0cc061SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 90939d628a0SDimitry Andric PrevMD->replaceAllUsesWith(MD); 91039d628a0SDimitry Andric --NumFwdRefs; 911f22ef01cSRoman Divacky } 912f22ef01cSRoman Divacky 91339d628a0SDimitry Andric Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) { 914f22ef01cSRoman Divacky if (Idx >= size()) 915f22ef01cSRoman Divacky resize(Idx + 1); 916f22ef01cSRoman Divacky 91739d628a0SDimitry Andric if (Metadata *MD = MDValuePtrs[Idx]) 91839d628a0SDimitry Andric return MD; 919f22ef01cSRoman Divacky 920b09980d1SDimitry Andric // Track forward refs to be resolved later. 921b09980d1SDimitry Andric if (AnyFwdRefs) { 922b09980d1SDimitry Andric MinFwdRef = std::min(MinFwdRef, Idx); 923b09980d1SDimitry Andric MaxFwdRef = std::max(MaxFwdRef, Idx); 924b09980d1SDimitry Andric } else { 92539d628a0SDimitry Andric AnyFwdRefs = true; 926b09980d1SDimitry Andric MinFwdRef = MaxFwdRef = Idx; 927b09980d1SDimitry Andric } 92839d628a0SDimitry Andric ++NumFwdRefs; 929b09980d1SDimitry Andric 930b09980d1SDimitry Andric // Create and return a placeholder, which will later be RAUW'd. 931ff0cc061SDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release(); 93239d628a0SDimitry Andric MDValuePtrs[Idx].reset(MD); 93339d628a0SDimitry Andric return MD; 93439d628a0SDimitry Andric } 93539d628a0SDimitry Andric 93639d628a0SDimitry Andric void BitcodeReaderMDValueList::tryToResolveCycles() { 93739d628a0SDimitry Andric if (!AnyFwdRefs) 93839d628a0SDimitry Andric // Nothing to do. 93939d628a0SDimitry Andric return; 94039d628a0SDimitry Andric 94139d628a0SDimitry Andric if (NumFwdRefs) 94239d628a0SDimitry Andric // Still forward references... can't resolve cycles. 94339d628a0SDimitry Andric return; 94439d628a0SDimitry Andric 94539d628a0SDimitry Andric // Resolve any cycles. 946b09980d1SDimitry Andric for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) { 947b09980d1SDimitry Andric auto &MD = MDValuePtrs[I]; 948ff0cc061SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 949ff0cc061SDimitry Andric if (!N) 950ff0cc061SDimitry Andric continue; 951ff0cc061SDimitry Andric 952ff0cc061SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference"); 95339d628a0SDimitry Andric N->resolveCycles(); 95439d628a0SDimitry Andric } 955b09980d1SDimitry Andric 956b09980d1SDimitry Andric // Make sure we return early again until there's another forward ref. 957b09980d1SDimitry Andric AnyFwdRefs = false; 958f22ef01cSRoman Divacky } 959f22ef01cSRoman Divacky 96017a519f9SDimitry Andric Type *BitcodeReader::getTypeByID(unsigned ID) { 96117a519f9SDimitry Andric // The type table size is always specified correctly. 96217a519f9SDimitry Andric if (ID >= TypeList.size()) 96391bc56edSDimitry Andric return nullptr; 964f22ef01cSRoman Divacky 96517a519f9SDimitry Andric if (Type *Ty = TypeList[ID]) 96617a519f9SDimitry Andric return Ty; 96717a519f9SDimitry Andric 96817a519f9SDimitry Andric // If we have a forward reference, the only possible case is when it is to a 96917a519f9SDimitry Andric // named struct. Just create a placeholder for now. 97039d628a0SDimitry Andric return TypeList[ID] = createIdentifiedStructType(Context); 97139d628a0SDimitry Andric } 97239d628a0SDimitry Andric 97339d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context, 97439d628a0SDimitry Andric StringRef Name) { 97539d628a0SDimitry Andric auto *Ret = StructType::create(Context, Name); 97639d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 97739d628a0SDimitry Andric return Ret; 97839d628a0SDimitry Andric } 97939d628a0SDimitry Andric 98039d628a0SDimitry Andric StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &Context) { 98139d628a0SDimitry Andric auto *Ret = StructType::create(Context); 98239d628a0SDimitry Andric IdentifiedStructTypes.push_back(Ret); 98339d628a0SDimitry Andric return Ret; 984f22ef01cSRoman Divacky } 985f22ef01cSRoman Divacky 98617a519f9SDimitry Andric 987f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 988f22ef01cSRoman Divacky // Functions for parsing blocks from the bitcode file 989f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 990f22ef01cSRoman Divacky 991139f7f9bSDimitry Andric 992139f7f9bSDimitry Andric /// \brief This fills an AttrBuilder object with the LLVM attributes that have 993139f7f9bSDimitry Andric /// been decoded from the given integer. This function must stay in sync with 994139f7f9bSDimitry Andric /// 'encodeLLVMAttributesForBitcode'. 995139f7f9bSDimitry Andric static void decodeLLVMAttributesForBitcode(AttrBuilder &B, 996139f7f9bSDimitry Andric uint64_t EncodedAttrs) { 997139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 998139f7f9bSDimitry Andric 999139f7f9bSDimitry Andric // The alignment is stored as a 16-bit raw value from bits 31--16. We shift 1000139f7f9bSDimitry Andric // the bits above 31 down by 11 bits. 1001139f7f9bSDimitry Andric unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16; 1002139f7f9bSDimitry Andric assert((!Alignment || isPowerOf2_32(Alignment)) && 1003139f7f9bSDimitry Andric "Alignment must be a power of two."); 1004139f7f9bSDimitry Andric 1005139f7f9bSDimitry Andric if (Alignment) 1006139f7f9bSDimitry Andric B.addAlignmentAttr(Alignment); 1007139f7f9bSDimitry Andric B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | 1008139f7f9bSDimitry Andric (EncodedAttrs & 0xffff)); 1009139f7f9bSDimitry Andric } 1010139f7f9bSDimitry Andric 10118f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttributeBlock() { 1012f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) 10138f0fd8f6SDimitry Andric return error("Invalid record"); 1014f22ef01cSRoman Divacky 1015f22ef01cSRoman Divacky if (!MAttributes.empty()) 10168f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1017f22ef01cSRoman Divacky 1018f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1019f22ef01cSRoman Divacky 1020139f7f9bSDimitry Andric SmallVector<AttributeSet, 8> Attrs; 1021f22ef01cSRoman Divacky 1022f22ef01cSRoman Divacky // Read all the records. 1023f22ef01cSRoman Divacky while (1) { 1024139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1025139f7f9bSDimitry Andric 1026139f7f9bSDimitry Andric switch (Entry.Kind) { 1027139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1028139f7f9bSDimitry Andric case BitstreamEntry::Error: 10298f0fd8f6SDimitry Andric return error("Malformed block"); 1030139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 103191bc56edSDimitry Andric return std::error_code(); 1032139f7f9bSDimitry Andric case BitstreamEntry::Record: 1033139f7f9bSDimitry Andric // The interesting case. 1034139f7f9bSDimitry Andric break; 1035f22ef01cSRoman Divacky } 1036f22ef01cSRoman Divacky 1037f22ef01cSRoman Divacky // Read a record. 1038f22ef01cSRoman Divacky Record.clear(); 1039139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1040f22ef01cSRoman Divacky default: // Default behavior: ignore. 1041f22ef01cSRoman Divacky break; 1042139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY_OLD: { // ENTRY: [paramidx0, attr0, ...] 1043139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 1044f22ef01cSRoman Divacky if (Record.size() & 1) 10458f0fd8f6SDimitry Andric return error("Invalid record"); 1046f22ef01cSRoman Divacky 1047f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size(); i != e; i += 2) { 1048139f7f9bSDimitry Andric AttrBuilder B; 1049139f7f9bSDimitry Andric decodeLLVMAttributesForBitcode(B, Record[i+1]); 1050139f7f9bSDimitry Andric Attrs.push_back(AttributeSet::get(Context, Record[i], B)); 1051f22ef01cSRoman Divacky } 1052f22ef01cSRoman Divacky 1053139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1054f22ef01cSRoman Divacky Attrs.clear(); 1055f22ef01cSRoman Divacky break; 1056f22ef01cSRoman Divacky } 1057139f7f9bSDimitry Andric case bitc::PARAMATTR_CODE_ENTRY: { // ENTRY: [attrgrp0, attrgrp1, ...] 1058139f7f9bSDimitry Andric for (unsigned i = 0, e = Record.size(); i != e; ++i) 1059139f7f9bSDimitry Andric Attrs.push_back(MAttributeGroups[Record[i]]); 1060139f7f9bSDimitry Andric 1061139f7f9bSDimitry Andric MAttributes.push_back(AttributeSet::get(Context, Attrs)); 1062139f7f9bSDimitry Andric Attrs.clear(); 1063139f7f9bSDimitry Andric break; 1064139f7f9bSDimitry Andric } 1065139f7f9bSDimitry Andric } 1066139f7f9bSDimitry Andric } 1067139f7f9bSDimitry Andric } 1068139f7f9bSDimitry Andric 1069f785676fSDimitry Andric // Returns Attribute::None on unrecognized codes. 10708f0fd8f6SDimitry Andric static Attribute::AttrKind getAttrFromCode(uint64_t Code) { 1071f785676fSDimitry Andric switch (Code) { 1072f785676fSDimitry Andric default: 1073f785676fSDimitry Andric return Attribute::None; 1074f785676fSDimitry Andric case bitc::ATTR_KIND_ALIGNMENT: 1075f785676fSDimitry Andric return Attribute::Alignment; 1076f785676fSDimitry Andric case bitc::ATTR_KIND_ALWAYS_INLINE: 1077f785676fSDimitry Andric return Attribute::AlwaysInline; 1078f785676fSDimitry Andric case bitc::ATTR_KIND_BUILTIN: 1079f785676fSDimitry Andric return Attribute::Builtin; 1080f785676fSDimitry Andric case bitc::ATTR_KIND_BY_VAL: 1081f785676fSDimitry Andric return Attribute::ByVal; 108291bc56edSDimitry Andric case bitc::ATTR_KIND_IN_ALLOCA: 108391bc56edSDimitry Andric return Attribute::InAlloca; 1084f785676fSDimitry Andric case bitc::ATTR_KIND_COLD: 1085f785676fSDimitry Andric return Attribute::Cold; 1086ff0cc061SDimitry Andric case bitc::ATTR_KIND_CONVERGENT: 1087ff0cc061SDimitry Andric return Attribute::Convergent; 1088f785676fSDimitry Andric case bitc::ATTR_KIND_INLINE_HINT: 1089f785676fSDimitry Andric return Attribute::InlineHint; 1090f785676fSDimitry Andric case bitc::ATTR_KIND_IN_REG: 1091f785676fSDimitry Andric return Attribute::InReg; 109291bc56edSDimitry Andric case bitc::ATTR_KIND_JUMP_TABLE: 109391bc56edSDimitry Andric return Attribute::JumpTable; 1094f785676fSDimitry Andric case bitc::ATTR_KIND_MIN_SIZE: 1095f785676fSDimitry Andric return Attribute::MinSize; 1096f785676fSDimitry Andric case bitc::ATTR_KIND_NAKED: 1097f785676fSDimitry Andric return Attribute::Naked; 1098f785676fSDimitry Andric case bitc::ATTR_KIND_NEST: 1099f785676fSDimitry Andric return Attribute::Nest; 1100f785676fSDimitry Andric case bitc::ATTR_KIND_NO_ALIAS: 1101f785676fSDimitry Andric return Attribute::NoAlias; 1102f785676fSDimitry Andric case bitc::ATTR_KIND_NO_BUILTIN: 1103f785676fSDimitry Andric return Attribute::NoBuiltin; 1104f785676fSDimitry Andric case bitc::ATTR_KIND_NO_CAPTURE: 1105f785676fSDimitry Andric return Attribute::NoCapture; 1106f785676fSDimitry Andric case bitc::ATTR_KIND_NO_DUPLICATE: 1107f785676fSDimitry Andric return Attribute::NoDuplicate; 1108f785676fSDimitry Andric case bitc::ATTR_KIND_NO_IMPLICIT_FLOAT: 1109f785676fSDimitry Andric return Attribute::NoImplicitFloat; 1110f785676fSDimitry Andric case bitc::ATTR_KIND_NO_INLINE: 1111f785676fSDimitry Andric return Attribute::NoInline; 1112f785676fSDimitry Andric case bitc::ATTR_KIND_NON_LAZY_BIND: 1113f785676fSDimitry Andric return Attribute::NonLazyBind; 111491bc56edSDimitry Andric case bitc::ATTR_KIND_NON_NULL: 111591bc56edSDimitry Andric return Attribute::NonNull; 111691bc56edSDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE: 111791bc56edSDimitry Andric return Attribute::Dereferenceable; 1118ff0cc061SDimitry Andric case bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL: 1119ff0cc061SDimitry Andric return Attribute::DereferenceableOrNull; 1120f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RED_ZONE: 1121f785676fSDimitry Andric return Attribute::NoRedZone; 1122f785676fSDimitry Andric case bitc::ATTR_KIND_NO_RETURN: 1123f785676fSDimitry Andric return Attribute::NoReturn; 1124f785676fSDimitry Andric case bitc::ATTR_KIND_NO_UNWIND: 1125f785676fSDimitry Andric return Attribute::NoUnwind; 1126f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE: 1127f785676fSDimitry Andric return Attribute::OptimizeForSize; 1128f785676fSDimitry Andric case bitc::ATTR_KIND_OPTIMIZE_NONE: 1129f785676fSDimitry Andric return Attribute::OptimizeNone; 1130f785676fSDimitry Andric case bitc::ATTR_KIND_READ_NONE: 1131f785676fSDimitry Andric return Attribute::ReadNone; 1132f785676fSDimitry Andric case bitc::ATTR_KIND_READ_ONLY: 1133f785676fSDimitry Andric return Attribute::ReadOnly; 1134f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNED: 1135f785676fSDimitry Andric return Attribute::Returned; 1136f785676fSDimitry Andric case bitc::ATTR_KIND_RETURNS_TWICE: 1137f785676fSDimitry Andric return Attribute::ReturnsTwice; 1138f785676fSDimitry Andric case bitc::ATTR_KIND_S_EXT: 1139f785676fSDimitry Andric return Attribute::SExt; 1140f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_ALIGNMENT: 1141f785676fSDimitry Andric return Attribute::StackAlignment; 1142f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT: 1143f785676fSDimitry Andric return Attribute::StackProtect; 1144f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_REQ: 1145f785676fSDimitry Andric return Attribute::StackProtectReq; 1146f785676fSDimitry Andric case bitc::ATTR_KIND_STACK_PROTECT_STRONG: 1147f785676fSDimitry Andric return Attribute::StackProtectStrong; 11488f0fd8f6SDimitry Andric case bitc::ATTR_KIND_SAFESTACK: 11498f0fd8f6SDimitry Andric return Attribute::SafeStack; 1150f785676fSDimitry Andric case bitc::ATTR_KIND_STRUCT_RET: 1151f785676fSDimitry Andric return Attribute::StructRet; 1152f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_ADDRESS: 1153f785676fSDimitry Andric return Attribute::SanitizeAddress; 1154f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_THREAD: 1155f785676fSDimitry Andric return Attribute::SanitizeThread; 1156f785676fSDimitry Andric case bitc::ATTR_KIND_SANITIZE_MEMORY: 1157f785676fSDimitry Andric return Attribute::SanitizeMemory; 1158f785676fSDimitry Andric case bitc::ATTR_KIND_UW_TABLE: 1159f785676fSDimitry Andric return Attribute::UWTable; 1160f785676fSDimitry Andric case bitc::ATTR_KIND_Z_EXT: 1161f785676fSDimitry Andric return Attribute::ZExt; 1162f785676fSDimitry Andric } 1163f785676fSDimitry Andric } 1164f785676fSDimitry Andric 1165ff0cc061SDimitry Andric std::error_code BitcodeReader::parseAlignmentValue(uint64_t Exponent, 1166ff0cc061SDimitry Andric unsigned &Alignment) { 1167ff0cc061SDimitry Andric // Note: Alignment in bitcode files is incremented by 1, so that zero 1168ff0cc061SDimitry Andric // can be used for default alignment. 1169ff0cc061SDimitry Andric if (Exponent > Value::MaxAlignmentExponent + 1) 11708f0fd8f6SDimitry Andric return error("Invalid alignment value"); 1171ff0cc061SDimitry Andric Alignment = (1 << static_cast<unsigned>(Exponent)) >> 1; 1172ff0cc061SDimitry Andric return std::error_code(); 1173ff0cc061SDimitry Andric } 1174ff0cc061SDimitry Andric 11758f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttrKind(uint64_t Code, 1176f785676fSDimitry Andric Attribute::AttrKind *Kind) { 11778f0fd8f6SDimitry Andric *Kind = getAttrFromCode(Code); 1178f785676fSDimitry Andric if (*Kind == Attribute::None) 11798f0fd8f6SDimitry Andric return error(BitcodeError::CorruptedBitcode, 118039d628a0SDimitry Andric "Unknown attribute kind (" + Twine(Code) + ")"); 118191bc56edSDimitry Andric return std::error_code(); 1182f785676fSDimitry Andric } 1183f785676fSDimitry Andric 11848f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseAttributeGroupBlock() { 1185139f7f9bSDimitry Andric if (Stream.EnterSubBlock(bitc::PARAMATTR_GROUP_BLOCK_ID)) 11868f0fd8f6SDimitry Andric return error("Invalid record"); 1187139f7f9bSDimitry Andric 1188139f7f9bSDimitry Andric if (!MAttributeGroups.empty()) 11898f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1190139f7f9bSDimitry Andric 1191139f7f9bSDimitry Andric SmallVector<uint64_t, 64> Record; 1192139f7f9bSDimitry Andric 1193139f7f9bSDimitry Andric // Read all the records. 1194139f7f9bSDimitry Andric while (1) { 1195139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1196139f7f9bSDimitry Andric 1197139f7f9bSDimitry Andric switch (Entry.Kind) { 1198139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1199139f7f9bSDimitry Andric case BitstreamEntry::Error: 12008f0fd8f6SDimitry Andric return error("Malformed block"); 1201139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 120291bc56edSDimitry Andric return std::error_code(); 1203139f7f9bSDimitry Andric case BitstreamEntry::Record: 1204139f7f9bSDimitry Andric // The interesting case. 1205139f7f9bSDimitry Andric break; 1206139f7f9bSDimitry Andric } 1207139f7f9bSDimitry Andric 1208139f7f9bSDimitry Andric // Read a record. 1209139f7f9bSDimitry Andric Record.clear(); 1210139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1211139f7f9bSDimitry Andric default: // Default behavior: ignore. 1212139f7f9bSDimitry Andric break; 1213139f7f9bSDimitry Andric case bitc::PARAMATTR_GRP_CODE_ENTRY: { // ENTRY: [grpid, idx, a0, a1, ...] 1214139f7f9bSDimitry Andric if (Record.size() < 3) 12158f0fd8f6SDimitry Andric return error("Invalid record"); 1216139f7f9bSDimitry Andric 1217139f7f9bSDimitry Andric uint64_t GrpID = Record[0]; 1218139f7f9bSDimitry Andric uint64_t Idx = Record[1]; // Index of the object this attribute refers to. 1219139f7f9bSDimitry Andric 1220139f7f9bSDimitry Andric AttrBuilder B; 1221139f7f9bSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1222139f7f9bSDimitry Andric if (Record[i] == 0) { // Enum attribute 1223f785676fSDimitry Andric Attribute::AttrKind Kind; 12248f0fd8f6SDimitry Andric if (std::error_code EC = parseAttrKind(Record[++i], &Kind)) 1225f785676fSDimitry Andric return EC; 1226f785676fSDimitry Andric 1227f785676fSDimitry Andric B.addAttribute(Kind); 122891bc56edSDimitry Andric } else if (Record[i] == 1) { // Integer attribute 1229f785676fSDimitry Andric Attribute::AttrKind Kind; 12308f0fd8f6SDimitry Andric if (std::error_code EC = parseAttrKind(Record[++i], &Kind)) 1231f785676fSDimitry Andric return EC; 1232f785676fSDimitry Andric if (Kind == Attribute::Alignment) 1233139f7f9bSDimitry Andric B.addAlignmentAttr(Record[++i]); 123491bc56edSDimitry Andric else if (Kind == Attribute::StackAlignment) 1235139f7f9bSDimitry Andric B.addStackAlignmentAttr(Record[++i]); 123691bc56edSDimitry Andric else if (Kind == Attribute::Dereferenceable) 123791bc56edSDimitry Andric B.addDereferenceableAttr(Record[++i]); 1238ff0cc061SDimitry Andric else if (Kind == Attribute::DereferenceableOrNull) 1239ff0cc061SDimitry Andric B.addDereferenceableOrNullAttr(Record[++i]); 1240139f7f9bSDimitry Andric } else { // String attribute 1241139f7f9bSDimitry Andric assert((Record[i] == 3 || Record[i] == 4) && 1242139f7f9bSDimitry Andric "Invalid attribute group entry"); 1243139f7f9bSDimitry Andric bool HasValue = (Record[i++] == 4); 1244139f7f9bSDimitry Andric SmallString<64> KindStr; 1245139f7f9bSDimitry Andric SmallString<64> ValStr; 1246139f7f9bSDimitry Andric 1247139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1248139f7f9bSDimitry Andric KindStr += Record[i++]; 1249139f7f9bSDimitry Andric assert(Record[i] == 0 && "Kind string not null terminated"); 1250139f7f9bSDimitry Andric 1251139f7f9bSDimitry Andric if (HasValue) { 1252139f7f9bSDimitry Andric // Has a value associated with it. 1253139f7f9bSDimitry Andric ++i; // Skip the '0' that terminates the "kind" string. 1254139f7f9bSDimitry Andric while (Record[i] != 0 && i != e) 1255139f7f9bSDimitry Andric ValStr += Record[i++]; 1256139f7f9bSDimitry Andric assert(Record[i] == 0 && "Value string not null terminated"); 1257139f7f9bSDimitry Andric } 1258139f7f9bSDimitry Andric 1259139f7f9bSDimitry Andric B.addAttribute(KindStr.str(), ValStr.str()); 1260139f7f9bSDimitry Andric } 1261139f7f9bSDimitry Andric } 1262139f7f9bSDimitry Andric 1263139f7f9bSDimitry Andric MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B); 1264139f7f9bSDimitry Andric break; 1265139f7f9bSDimitry Andric } 1266f22ef01cSRoman Divacky } 1267f22ef01cSRoman Divacky } 1268f22ef01cSRoman Divacky } 1269f22ef01cSRoman Divacky 12708f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseTypeTable() { 127117a519f9SDimitry Andric if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_NEW)) 12728f0fd8f6SDimitry Andric return error("Invalid record"); 1273f22ef01cSRoman Divacky 12748f0fd8f6SDimitry Andric return parseTypeTableBody(); 127517a519f9SDimitry Andric } 127617a519f9SDimitry Andric 12778f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseTypeTableBody() { 1278f22ef01cSRoman Divacky if (!TypeList.empty()) 12798f0fd8f6SDimitry Andric return error("Invalid multiple blocks"); 1280f22ef01cSRoman Divacky 1281f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1282f22ef01cSRoman Divacky unsigned NumRecords = 0; 1283f22ef01cSRoman Divacky 128417a519f9SDimitry Andric SmallString<64> TypeName; 128517a519f9SDimitry Andric 1286f22ef01cSRoman Divacky // Read all the records for this type table. 1287f22ef01cSRoman Divacky while (1) { 1288139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1289139f7f9bSDimitry Andric 1290139f7f9bSDimitry Andric switch (Entry.Kind) { 1291139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1292139f7f9bSDimitry Andric case BitstreamEntry::Error: 12938f0fd8f6SDimitry Andric return error("Malformed block"); 1294139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 1295f22ef01cSRoman Divacky if (NumRecords != TypeList.size()) 12968f0fd8f6SDimitry Andric return error("Malformed block"); 129791bc56edSDimitry Andric return std::error_code(); 1298139f7f9bSDimitry Andric case BitstreamEntry::Record: 1299139f7f9bSDimitry Andric // The interesting case. 1300139f7f9bSDimitry Andric break; 1301f22ef01cSRoman Divacky } 1302f22ef01cSRoman Divacky 1303f22ef01cSRoman Divacky // Read a record. 1304f22ef01cSRoman Divacky Record.clear(); 130591bc56edSDimitry Andric Type *ResultTy = nullptr; 1306139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1307f785676fSDimitry Andric default: 13088f0fd8f6SDimitry Andric return error("Invalid value"); 1309f22ef01cSRoman Divacky case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] 1310f22ef01cSRoman Divacky // TYPE_CODE_NUMENTRY contains a count of the number of types in the 1311f22ef01cSRoman Divacky // type list. This allows us to reserve space. 1312f22ef01cSRoman Divacky if (Record.size() < 1) 13138f0fd8f6SDimitry Andric return error("Invalid record"); 131417a519f9SDimitry Andric TypeList.resize(Record[0]); 1315f22ef01cSRoman Divacky continue; 1316f22ef01cSRoman Divacky case bitc::TYPE_CODE_VOID: // VOID 1317f22ef01cSRoman Divacky ResultTy = Type::getVoidTy(Context); 1318f22ef01cSRoman Divacky break; 1319dff0c46cSDimitry Andric case bitc::TYPE_CODE_HALF: // HALF 1320dff0c46cSDimitry Andric ResultTy = Type::getHalfTy(Context); 1321dff0c46cSDimitry Andric break; 1322f22ef01cSRoman Divacky case bitc::TYPE_CODE_FLOAT: // FLOAT 1323f22ef01cSRoman Divacky ResultTy = Type::getFloatTy(Context); 1324f22ef01cSRoman Divacky break; 1325f22ef01cSRoman Divacky case bitc::TYPE_CODE_DOUBLE: // DOUBLE 1326f22ef01cSRoman Divacky ResultTy = Type::getDoubleTy(Context); 1327f22ef01cSRoman Divacky break; 1328f22ef01cSRoman Divacky case bitc::TYPE_CODE_X86_FP80: // X86_FP80 1329f22ef01cSRoman Divacky ResultTy = Type::getX86_FP80Ty(Context); 1330f22ef01cSRoman Divacky break; 1331f22ef01cSRoman Divacky case bitc::TYPE_CODE_FP128: // FP128 1332f22ef01cSRoman Divacky ResultTy = Type::getFP128Ty(Context); 1333f22ef01cSRoman Divacky break; 1334f22ef01cSRoman Divacky case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128 1335f22ef01cSRoman Divacky ResultTy = Type::getPPC_FP128Ty(Context); 1336f22ef01cSRoman Divacky break; 1337f22ef01cSRoman Divacky case bitc::TYPE_CODE_LABEL: // LABEL 1338f22ef01cSRoman Divacky ResultTy = Type::getLabelTy(Context); 1339f22ef01cSRoman Divacky break; 1340f22ef01cSRoman Divacky case bitc::TYPE_CODE_METADATA: // METADATA 1341f22ef01cSRoman Divacky ResultTy = Type::getMetadataTy(Context); 1342f22ef01cSRoman Divacky break; 13432754fe60SDimitry Andric case bitc::TYPE_CODE_X86_MMX: // X86_MMX 13442754fe60SDimitry Andric ResultTy = Type::getX86_MMXTy(Context); 13452754fe60SDimitry Andric break; 1346ff0cc061SDimitry Andric case bitc::TYPE_CODE_INTEGER: { // INTEGER: [width] 1347f22ef01cSRoman Divacky if (Record.size() < 1) 13488f0fd8f6SDimitry Andric return error("Invalid record"); 1349f22ef01cSRoman Divacky 1350ff0cc061SDimitry Andric uint64_t NumBits = Record[0]; 1351ff0cc061SDimitry Andric if (NumBits < IntegerType::MIN_INT_BITS || 1352ff0cc061SDimitry Andric NumBits > IntegerType::MAX_INT_BITS) 13538f0fd8f6SDimitry Andric return error("Bitwidth for integer type out of range"); 1354ff0cc061SDimitry Andric ResultTy = IntegerType::get(Context, NumBits); 1355f22ef01cSRoman Divacky break; 1356ff0cc061SDimitry Andric } 1357f22ef01cSRoman Divacky case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or 1358f22ef01cSRoman Divacky // [pointee type, address space] 1359f22ef01cSRoman Divacky if (Record.size() < 1) 13608f0fd8f6SDimitry Andric return error("Invalid record"); 1361f22ef01cSRoman Divacky unsigned AddressSpace = 0; 1362f22ef01cSRoman Divacky if (Record.size() == 2) 1363f22ef01cSRoman Divacky AddressSpace = Record[1]; 136417a519f9SDimitry Andric ResultTy = getTypeByID(Record[0]); 1365ff0cc061SDimitry Andric if (!ResultTy || 1366ff0cc061SDimitry Andric !PointerType::isValidElementType(ResultTy)) 13678f0fd8f6SDimitry Andric return error("Invalid type"); 136817a519f9SDimitry Andric ResultTy = PointerType::get(ResultTy, AddressSpace); 1369f22ef01cSRoman Divacky break; 1370f22ef01cSRoman Divacky } 1371dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION_OLD: { 13727ae0e2c9SDimitry Andric // FIXME: attrid is dead, remove it in LLVM 4.0 1373f22ef01cSRoman Divacky // FUNCTION: [vararg, attrid, retty, paramty x N] 1374f22ef01cSRoman Divacky if (Record.size() < 3) 13758f0fd8f6SDimitry Andric return error("Invalid record"); 1376dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 137717a519f9SDimitry Andric for (unsigned i = 3, e = Record.size(); i != e; ++i) { 137817a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 137917a519f9SDimitry Andric ArgTys.push_back(T); 138017a519f9SDimitry Andric else 1381f22ef01cSRoman Divacky break; 1382f22ef01cSRoman Divacky } 138317a519f9SDimitry Andric 138417a519f9SDimitry Andric ResultTy = getTypeByID(Record[2]); 138591bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-3) 13868f0fd8f6SDimitry Andric return error("Invalid type"); 138717a519f9SDimitry Andric 138817a519f9SDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 138917a519f9SDimitry Andric break; 139017a519f9SDimitry Andric } 1391dff0c46cSDimitry Andric case bitc::TYPE_CODE_FUNCTION: { 1392dff0c46cSDimitry Andric // FUNCTION: [vararg, retty, paramty x N] 1393dff0c46cSDimitry Andric if (Record.size() < 2) 13948f0fd8f6SDimitry Andric return error("Invalid record"); 1395dff0c46cSDimitry Andric SmallVector<Type*, 8> ArgTys; 1396dff0c46cSDimitry Andric for (unsigned i = 2, e = Record.size(); i != e; ++i) { 1397ff0cc061SDimitry Andric if (Type *T = getTypeByID(Record[i])) { 1398ff0cc061SDimitry Andric if (!FunctionType::isValidArgumentType(T)) 13998f0fd8f6SDimitry Andric return error("Invalid function argument type"); 1400dff0c46cSDimitry Andric ArgTys.push_back(T); 1401ff0cc061SDimitry Andric } 1402dff0c46cSDimitry Andric else 1403dff0c46cSDimitry Andric break; 1404dff0c46cSDimitry Andric } 1405dff0c46cSDimitry Andric 1406dff0c46cSDimitry Andric ResultTy = getTypeByID(Record[1]); 140791bc56edSDimitry Andric if (!ResultTy || ArgTys.size() < Record.size()-2) 14088f0fd8f6SDimitry Andric return error("Invalid type"); 1409dff0c46cSDimitry Andric 1410dff0c46cSDimitry Andric ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); 1411dff0c46cSDimitry Andric break; 1412dff0c46cSDimitry Andric } 141317a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_ANON: { // STRUCT: [ispacked, eltty x N] 1414f22ef01cSRoman Divacky if (Record.size() < 1) 14158f0fd8f6SDimitry Andric return error("Invalid record"); 1416dff0c46cSDimitry Andric SmallVector<Type*, 8> EltTys; 141717a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 141817a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 141917a519f9SDimitry Andric EltTys.push_back(T); 142017a519f9SDimitry Andric else 142117a519f9SDimitry Andric break; 142217a519f9SDimitry Andric } 142317a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 14248f0fd8f6SDimitry Andric return error("Invalid type"); 1425f22ef01cSRoman Divacky ResultTy = StructType::get(Context, EltTys, Record[0]); 1426f22ef01cSRoman Divacky break; 1427f22ef01cSRoman Divacky } 142817a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAME: // STRUCT_NAME: [strchr x N] 14298f0fd8f6SDimitry Andric if (convertToString(Record, 0, TypeName)) 14308f0fd8f6SDimitry Andric return error("Invalid record"); 143117a519f9SDimitry Andric continue; 143217a519f9SDimitry Andric 143317a519f9SDimitry Andric case bitc::TYPE_CODE_STRUCT_NAMED: { // STRUCT: [ispacked, eltty x N] 143417a519f9SDimitry Andric if (Record.size() < 1) 14358f0fd8f6SDimitry Andric return error("Invalid record"); 143617a519f9SDimitry Andric 143717a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 14388f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 143917a519f9SDimitry Andric 144017a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 144117a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 144217a519f9SDimitry Andric if (Res) { 144317a519f9SDimitry Andric Res->setName(TypeName); 144491bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 144517a519f9SDimitry Andric } else // Otherwise, create a new struct. 144639d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 144717a519f9SDimitry Andric TypeName.clear(); 144817a519f9SDimitry Andric 144917a519f9SDimitry Andric SmallVector<Type*, 8> EltTys; 145017a519f9SDimitry Andric for (unsigned i = 1, e = Record.size(); i != e; ++i) { 145117a519f9SDimitry Andric if (Type *T = getTypeByID(Record[i])) 145217a519f9SDimitry Andric EltTys.push_back(T); 145317a519f9SDimitry Andric else 145417a519f9SDimitry Andric break; 145517a519f9SDimitry Andric } 145617a519f9SDimitry Andric if (EltTys.size() != Record.size()-1) 14578f0fd8f6SDimitry Andric return error("Invalid record"); 145817a519f9SDimitry Andric Res->setBody(EltTys, Record[0]); 145917a519f9SDimitry Andric ResultTy = Res; 146017a519f9SDimitry Andric break; 146117a519f9SDimitry Andric } 146217a519f9SDimitry Andric case bitc::TYPE_CODE_OPAQUE: { // OPAQUE: [] 146317a519f9SDimitry Andric if (Record.size() != 1) 14648f0fd8f6SDimitry Andric return error("Invalid record"); 146517a519f9SDimitry Andric 146617a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 14678f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 146817a519f9SDimitry Andric 146917a519f9SDimitry Andric // Check to see if this was forward referenced, if so fill in the temp. 147017a519f9SDimitry Andric StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]); 147117a519f9SDimitry Andric if (Res) { 147217a519f9SDimitry Andric Res->setName(TypeName); 147391bc56edSDimitry Andric TypeList[NumRecords] = nullptr; 147417a519f9SDimitry Andric } else // Otherwise, create a new struct with no body. 147539d628a0SDimitry Andric Res = createIdentifiedStructType(Context, TypeName); 147617a519f9SDimitry Andric TypeName.clear(); 147717a519f9SDimitry Andric ResultTy = Res; 147817a519f9SDimitry Andric break; 147917a519f9SDimitry Andric } 1480f22ef01cSRoman Divacky case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty] 1481f22ef01cSRoman Divacky if (Record.size() < 2) 14828f0fd8f6SDimitry Andric return error("Invalid record"); 1483ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1484ff0cc061SDimitry Andric if (!ResultTy || !ArrayType::isValidElementType(ResultTy)) 14858f0fd8f6SDimitry Andric return error("Invalid type"); 1486ff0cc061SDimitry Andric ResultTy = ArrayType::get(ResultTy, Record[0]); 1487f22ef01cSRoman Divacky break; 1488f22ef01cSRoman Divacky case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty] 1489f22ef01cSRoman Divacky if (Record.size() < 2) 14908f0fd8f6SDimitry Andric return error("Invalid record"); 149197bc6c73SDimitry Andric if (Record[0] == 0) 14928f0fd8f6SDimitry Andric return error("Invalid vector length"); 1493ff0cc061SDimitry Andric ResultTy = getTypeByID(Record[1]); 1494ff0cc061SDimitry Andric if (!ResultTy || !StructType::isValidElementType(ResultTy)) 14958f0fd8f6SDimitry Andric return error("Invalid type"); 1496ff0cc061SDimitry Andric ResultTy = VectorType::get(ResultTy, Record[0]); 1497f22ef01cSRoman Divacky break; 1498f22ef01cSRoman Divacky } 1499f22ef01cSRoman Divacky 150017a519f9SDimitry Andric if (NumRecords >= TypeList.size()) 15018f0fd8f6SDimitry Andric return error("Invalid TYPE table"); 1502ff0cc061SDimitry Andric if (TypeList[NumRecords]) 15038f0fd8f6SDimitry Andric return error( 1504ff0cc061SDimitry Andric "Invalid TYPE table: Only named structs can be forward referenced"); 150517a519f9SDimitry Andric assert(ResultTy && "Didn't read a type?"); 150617a519f9SDimitry Andric TypeList[NumRecords++] = ResultTy; 1507f22ef01cSRoman Divacky } 1508f22ef01cSRoman Divacky } 150917a519f9SDimitry Andric 15108f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseValueSymbolTable() { 1511f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID)) 15128f0fd8f6SDimitry Andric return error("Invalid record"); 1513f22ef01cSRoman Divacky 1514f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1515f22ef01cSRoman Divacky 1516ff0cc061SDimitry Andric Triple TT(TheModule->getTargetTriple()); 1517ff0cc061SDimitry Andric 1518f22ef01cSRoman Divacky // Read all the records for this value table. 1519f22ef01cSRoman Divacky SmallString<128> ValueName; 1520f22ef01cSRoman Divacky while (1) { 1521139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1522f22ef01cSRoman Divacky 1523139f7f9bSDimitry Andric switch (Entry.Kind) { 1524139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1525139f7f9bSDimitry Andric case BitstreamEntry::Error: 15268f0fd8f6SDimitry Andric return error("Malformed block"); 1527139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 152891bc56edSDimitry Andric return std::error_code(); 1529139f7f9bSDimitry Andric case BitstreamEntry::Record: 1530139f7f9bSDimitry Andric // The interesting case. 1531139f7f9bSDimitry Andric break; 1532f22ef01cSRoman Divacky } 1533f22ef01cSRoman Divacky 1534f22ef01cSRoman Divacky // Read a record. 1535f22ef01cSRoman Divacky Record.clear(); 1536139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 1537f22ef01cSRoman Divacky default: // Default behavior: unknown type. 1538f22ef01cSRoman Divacky break; 1539f22ef01cSRoman Divacky case bitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] 15408f0fd8f6SDimitry Andric if (convertToString(Record, 1, ValueName)) 15418f0fd8f6SDimitry Andric return error("Invalid record"); 1542f22ef01cSRoman Divacky unsigned ValueID = Record[0]; 154391bc56edSDimitry Andric if (ValueID >= ValueList.size() || !ValueList[ValueID]) 15448f0fd8f6SDimitry Andric return error("Invalid record"); 1545f22ef01cSRoman Divacky Value *V = ValueList[ValueID]; 1546f22ef01cSRoman Divacky 1547f22ef01cSRoman Divacky V->setName(StringRef(ValueName.data(), ValueName.size())); 1548ff0cc061SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(V)) { 1549ff0cc061SDimitry Andric if (GO->getComdat() == reinterpret_cast<Comdat *>(1)) { 1550ff0cc061SDimitry Andric if (TT.isOSBinFormatMachO()) 1551ff0cc061SDimitry Andric GO->setComdat(nullptr); 1552ff0cc061SDimitry Andric else 1553ff0cc061SDimitry Andric GO->setComdat(TheModule->getOrInsertComdat(V->getName())); 1554ff0cc061SDimitry Andric } 1555ff0cc061SDimitry Andric } 1556f22ef01cSRoman Divacky ValueName.clear(); 1557f22ef01cSRoman Divacky break; 1558f22ef01cSRoman Divacky } 1559f22ef01cSRoman Divacky case bitc::VST_CODE_BBENTRY: { 15608f0fd8f6SDimitry Andric if (convertToString(Record, 1, ValueName)) 15618f0fd8f6SDimitry Andric return error("Invalid record"); 1562f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[0]); 156391bc56edSDimitry Andric if (!BB) 15648f0fd8f6SDimitry Andric return error("Invalid record"); 1565f22ef01cSRoman Divacky 1566f22ef01cSRoman Divacky BB->setName(StringRef(ValueName.data(), ValueName.size())); 1567f22ef01cSRoman Divacky ValueName.clear(); 1568f22ef01cSRoman Divacky break; 1569f22ef01cSRoman Divacky } 1570f22ef01cSRoman Divacky } 1571f22ef01cSRoman Divacky } 1572f22ef01cSRoman Divacky } 1573f22ef01cSRoman Divacky 1574ff0cc061SDimitry Andric static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; } 1575ff0cc061SDimitry Andric 15768f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseMetadata() { 1577ff0cc061SDimitry Andric IsMetadataMaterialized = true; 1578f22ef01cSRoman Divacky unsigned NextMDValueNo = MDValueList.size(); 1579f22ef01cSRoman Divacky 1580f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 15818f0fd8f6SDimitry Andric return error("Invalid record"); 1582f22ef01cSRoman Divacky 1583f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 1584f22ef01cSRoman Divacky 1585ff0cc061SDimitry Andric auto getMD = 1586ff0cc061SDimitry Andric [&](unsigned ID) -> Metadata *{ return MDValueList.getValueFwdRef(ID); }; 1587ff0cc061SDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata *{ 1588ff0cc061SDimitry Andric if (ID) 1589ff0cc061SDimitry Andric return getMD(ID - 1); 1590ff0cc061SDimitry Andric return nullptr; 1591ff0cc061SDimitry Andric }; 1592ff0cc061SDimitry Andric auto getMDString = [&](unsigned ID) -> MDString *{ 1593ff0cc061SDimitry Andric // This requires that the ID is not really a forward reference. In 1594ff0cc061SDimitry Andric // particular, the MDString must already have been resolved. 1595ff0cc061SDimitry Andric return cast_or_null<MDString>(getMDOrNull(ID)); 1596ff0cc061SDimitry Andric }; 1597ff0cc061SDimitry Andric 1598ff0cc061SDimitry Andric #define GET_OR_DISTINCT(CLASS, DISTINCT, ARGS) \ 1599ff0cc061SDimitry Andric (DISTINCT ? CLASS::getDistinct ARGS : CLASS::get ARGS) 1600ff0cc061SDimitry Andric 1601f22ef01cSRoman Divacky // Read all the records. 1602f22ef01cSRoman Divacky while (1) { 1603139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 1604139f7f9bSDimitry Andric 1605139f7f9bSDimitry Andric switch (Entry.Kind) { 1606139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 1607139f7f9bSDimitry Andric case BitstreamEntry::Error: 16088f0fd8f6SDimitry Andric return error("Malformed block"); 1609139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 161039d628a0SDimitry Andric MDValueList.tryToResolveCycles(); 161191bc56edSDimitry Andric return std::error_code(); 1612139f7f9bSDimitry Andric case BitstreamEntry::Record: 1613139f7f9bSDimitry Andric // The interesting case. 1614139f7f9bSDimitry Andric break; 1615f22ef01cSRoman Divacky } 1616f22ef01cSRoman Divacky 1617f22ef01cSRoman Divacky // Read a record. 1618f22ef01cSRoman Divacky Record.clear(); 1619139f7f9bSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record); 162039d628a0SDimitry Andric bool IsDistinct = false; 1621e580952dSDimitry Andric switch (Code) { 1622f22ef01cSRoman Divacky default: // Default behavior: ignore. 1623f22ef01cSRoman Divacky break; 1624f22ef01cSRoman Divacky case bitc::METADATA_NAME: { 1625139f7f9bSDimitry Andric // Read name of the named metadata. 16267ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 1627f22ef01cSRoman Divacky Record.clear(); 1628f22ef01cSRoman Divacky Code = Stream.ReadCode(); 1629f22ef01cSRoman Divacky 1630139f7f9bSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record); 163197bc6c73SDimitry Andric if (NextBitCode != bitc::METADATA_NAMED_NODE) 16328f0fd8f6SDimitry Andric return error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 1633f22ef01cSRoman Divacky 1634f22ef01cSRoman Divacky // Read named metadata elements. 1635f22ef01cSRoman Divacky unsigned Size = Record.size(); 1636e580952dSDimitry Andric NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name); 1637f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) { 163891bc56edSDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i])); 163991bc56edSDimitry Andric if (!MD) 16408f0fd8f6SDimitry Andric return error("Invalid record"); 1641e580952dSDimitry Andric NMD->addOperand(MD); 1642f22ef01cSRoman Divacky } 1643f22ef01cSRoman Divacky break; 1644f22ef01cSRoman Divacky } 164539d628a0SDimitry Andric case bitc::METADATA_OLD_FN_NODE: { 164639d628a0SDimitry Andric // FIXME: Remove in 4.0. 164739d628a0SDimitry Andric // This is a LocalAsMetadata record, the only type of function-local 164839d628a0SDimitry Andric // metadata. 1649ffd1746dSEd Schouten if (Record.size() % 2 == 1) 16508f0fd8f6SDimitry Andric return error("Invalid record"); 165139d628a0SDimitry Andric 165239d628a0SDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used 165339d628a0SDimitry Andric // to be legal, but there's no upgrade path. 165439d628a0SDimitry Andric auto dropRecord = [&] { 16558f0fd8f6SDimitry Andric MDValueList.assignValue(MDNode::get(Context, None), NextMDValueNo++); 165639d628a0SDimitry Andric }; 165739d628a0SDimitry Andric if (Record.size() != 2) { 165839d628a0SDimitry Andric dropRecord(); 165939d628a0SDimitry Andric break; 166039d628a0SDimitry Andric } 166139d628a0SDimitry Andric 166239d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 166339d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) { 166439d628a0SDimitry Andric dropRecord(); 166539d628a0SDimitry Andric break; 166639d628a0SDimitry Andric } 166739d628a0SDimitry Andric 16688f0fd8f6SDimitry Andric MDValueList.assignValue( 166939d628a0SDimitry Andric LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 167039d628a0SDimitry Andric NextMDValueNo++); 167139d628a0SDimitry Andric break; 167239d628a0SDimitry Andric } 167339d628a0SDimitry Andric case bitc::METADATA_OLD_NODE: { 167439d628a0SDimitry Andric // FIXME: Remove in 4.0. 167539d628a0SDimitry Andric if (Record.size() % 2 == 1) 16768f0fd8f6SDimitry Andric return error("Invalid record"); 1677f22ef01cSRoman Divacky 1678f22ef01cSRoman Divacky unsigned Size = Record.size(); 167939d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 1680f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; i += 2) { 16816122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[i]); 1682f785676fSDimitry Andric if (!Ty) 16838f0fd8f6SDimitry Andric return error("Invalid record"); 1684f22ef01cSRoman Divacky if (Ty->isMetadataTy()) 1685f22ef01cSRoman Divacky Elts.push_back(MDValueList.getValueFwdRef(Record[i+1])); 168639d628a0SDimitry Andric else if (!Ty->isVoidTy()) { 168739d628a0SDimitry Andric auto *MD = 168839d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty)); 168939d628a0SDimitry Andric assert(isa<ConstantAsMetadata>(MD) && 169039d628a0SDimitry Andric "Expected non-function-local metadata"); 169139d628a0SDimitry Andric Elts.push_back(MD); 169239d628a0SDimitry Andric } else 169391bc56edSDimitry Andric Elts.push_back(nullptr); 1694f22ef01cSRoman Divacky } 16958f0fd8f6SDimitry Andric MDValueList.assignValue(MDNode::get(Context, Elts), NextMDValueNo++); 169639d628a0SDimitry Andric break; 169739d628a0SDimitry Andric } 169839d628a0SDimitry Andric case bitc::METADATA_VALUE: { 169939d628a0SDimitry Andric if (Record.size() != 2) 17008f0fd8f6SDimitry Andric return error("Invalid record"); 170139d628a0SDimitry Andric 170239d628a0SDimitry Andric Type *Ty = getTypeByID(Record[0]); 170339d628a0SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) 17048f0fd8f6SDimitry Andric return error("Invalid record"); 170539d628a0SDimitry Andric 17068f0fd8f6SDimitry Andric MDValueList.assignValue( 170739d628a0SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 170839d628a0SDimitry Andric NextMDValueNo++); 170939d628a0SDimitry Andric break; 171039d628a0SDimitry Andric } 171139d628a0SDimitry Andric case bitc::METADATA_DISTINCT_NODE: 171239d628a0SDimitry Andric IsDistinct = true; 171339d628a0SDimitry Andric // fallthrough... 171439d628a0SDimitry Andric case bitc::METADATA_NODE: { 171539d628a0SDimitry Andric SmallVector<Metadata *, 8> Elts; 171639d628a0SDimitry Andric Elts.reserve(Record.size()); 171739d628a0SDimitry Andric for (unsigned ID : Record) 171839d628a0SDimitry Andric Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr); 17198f0fd8f6SDimitry Andric MDValueList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 172039d628a0SDimitry Andric : MDNode::get(Context, Elts), 172139d628a0SDimitry Andric NextMDValueNo++); 172239d628a0SDimitry Andric break; 172339d628a0SDimitry Andric } 172439d628a0SDimitry Andric case bitc::METADATA_LOCATION: { 172539d628a0SDimitry Andric if (Record.size() != 5) 17268f0fd8f6SDimitry Andric return error("Invalid record"); 172739d628a0SDimitry Andric 172839d628a0SDimitry Andric unsigned Line = Record[1]; 172939d628a0SDimitry Andric unsigned Column = Record[2]; 173039d628a0SDimitry Andric MDNode *Scope = cast<MDNode>(MDValueList.getValueFwdRef(Record[3])); 173139d628a0SDimitry Andric Metadata *InlinedAt = 173239d628a0SDimitry Andric Record[4] ? MDValueList.getValueFwdRef(Record[4] - 1) : nullptr; 17338f0fd8f6SDimitry Andric MDValueList.assignValue( 1734ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocation, Record[0], 1735ff0cc061SDimitry Andric (Context, Line, Column, Scope, InlinedAt)), 1736ff0cc061SDimitry Andric NextMDValueNo++); 1737ff0cc061SDimitry Andric break; 1738ff0cc061SDimitry Andric } 1739ff0cc061SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: { 1740ff0cc061SDimitry Andric if (Record.size() < 4) 17418f0fd8f6SDimitry Andric return error("Invalid record"); 1742ff0cc061SDimitry Andric 1743ff0cc061SDimitry Andric unsigned Tag = Record[1]; 1744ff0cc061SDimitry Andric unsigned Version = Record[2]; 1745ff0cc061SDimitry Andric 1746ff0cc061SDimitry Andric if (Tag >= 1u << 16 || Version != 0) 17478f0fd8f6SDimitry Andric return error("Invalid record"); 1748ff0cc061SDimitry Andric 1749ff0cc061SDimitry Andric auto *Header = getMDString(Record[3]); 1750ff0cc061SDimitry Andric SmallVector<Metadata *, 8> DwarfOps; 1751ff0cc061SDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I) 1752ff0cc061SDimitry Andric DwarfOps.push_back(Record[I] ? MDValueList.getValueFwdRef(Record[I] - 1) 1753ff0cc061SDimitry Andric : nullptr); 17548f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(GenericDINode, Record[0], 1755ff0cc061SDimitry Andric (Context, Tag, Header, DwarfOps)), 1756ff0cc061SDimitry Andric NextMDValueNo++); 1757ff0cc061SDimitry Andric break; 1758ff0cc061SDimitry Andric } 1759ff0cc061SDimitry Andric case bitc::METADATA_SUBRANGE: { 1760ff0cc061SDimitry Andric if (Record.size() != 3) 17618f0fd8f6SDimitry Andric return error("Invalid record"); 1762ff0cc061SDimitry Andric 17638f0fd8f6SDimitry Andric MDValueList.assignValue( 1764ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubrange, Record[0], 1765ff0cc061SDimitry Andric (Context, Record[1], unrotateSign(Record[2]))), 1766ff0cc061SDimitry Andric NextMDValueNo++); 1767ff0cc061SDimitry Andric break; 1768ff0cc061SDimitry Andric } 1769ff0cc061SDimitry Andric case bitc::METADATA_ENUMERATOR: { 1770ff0cc061SDimitry Andric if (Record.size() != 3) 17718f0fd8f6SDimitry Andric return error("Invalid record"); 1772ff0cc061SDimitry Andric 17738f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(DIEnumerator, Record[0], 1774ff0cc061SDimitry Andric (Context, unrotateSign(Record[1]), 1775ff0cc061SDimitry Andric getMDString(Record[2]))), 1776ff0cc061SDimitry Andric NextMDValueNo++); 1777ff0cc061SDimitry Andric break; 1778ff0cc061SDimitry Andric } 1779ff0cc061SDimitry Andric case bitc::METADATA_BASIC_TYPE: { 1780ff0cc061SDimitry Andric if (Record.size() != 6) 17818f0fd8f6SDimitry Andric return error("Invalid record"); 1782ff0cc061SDimitry Andric 17838f0fd8f6SDimitry Andric MDValueList.assignValue( 1784ff0cc061SDimitry Andric GET_OR_DISTINCT(DIBasicType, Record[0], 1785ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1786ff0cc061SDimitry Andric Record[3], Record[4], Record[5])), 1787ff0cc061SDimitry Andric NextMDValueNo++); 1788ff0cc061SDimitry Andric break; 1789ff0cc061SDimitry Andric } 1790ff0cc061SDimitry Andric case bitc::METADATA_DERIVED_TYPE: { 1791ff0cc061SDimitry Andric if (Record.size() != 12) 17928f0fd8f6SDimitry Andric return error("Invalid record"); 1793ff0cc061SDimitry Andric 17948f0fd8f6SDimitry Andric MDValueList.assignValue( 1795ff0cc061SDimitry Andric GET_OR_DISTINCT(DIDerivedType, Record[0], 1796ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1797ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1798ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1799ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1800ff0cc061SDimitry Andric getMDOrNull(Record[11]))), 1801ff0cc061SDimitry Andric NextMDValueNo++); 1802ff0cc061SDimitry Andric break; 1803ff0cc061SDimitry Andric } 1804ff0cc061SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: { 1805ff0cc061SDimitry Andric if (Record.size() != 16) 18068f0fd8f6SDimitry Andric return error("Invalid record"); 1807ff0cc061SDimitry Andric 18088f0fd8f6SDimitry Andric MDValueList.assignValue( 1809ff0cc061SDimitry Andric GET_OR_DISTINCT(DICompositeType, Record[0], 1810ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1811ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 1812ff0cc061SDimitry Andric getMDOrNull(Record[5]), getMDOrNull(Record[6]), 1813ff0cc061SDimitry Andric Record[7], Record[8], Record[9], Record[10], 1814ff0cc061SDimitry Andric getMDOrNull(Record[11]), Record[12], 1815ff0cc061SDimitry Andric getMDOrNull(Record[13]), getMDOrNull(Record[14]), 1816ff0cc061SDimitry Andric getMDString(Record[15]))), 1817ff0cc061SDimitry Andric NextMDValueNo++); 1818ff0cc061SDimitry Andric break; 1819ff0cc061SDimitry Andric } 1820ff0cc061SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: { 1821ff0cc061SDimitry Andric if (Record.size() != 3) 18228f0fd8f6SDimitry Andric return error("Invalid record"); 1823ff0cc061SDimitry Andric 18248f0fd8f6SDimitry Andric MDValueList.assignValue( 1825ff0cc061SDimitry Andric GET_OR_DISTINCT(DISubroutineType, Record[0], 1826ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]))), 1827ff0cc061SDimitry Andric NextMDValueNo++); 1828ff0cc061SDimitry Andric break; 1829ff0cc061SDimitry Andric } 18303dac3a9bSDimitry Andric 18313dac3a9bSDimitry Andric case bitc::METADATA_MODULE: { 18323dac3a9bSDimitry Andric if (Record.size() != 6) 18333dac3a9bSDimitry Andric return error("Invalid record"); 18343dac3a9bSDimitry Andric 18353dac3a9bSDimitry Andric MDValueList.assignValue( 18363dac3a9bSDimitry Andric GET_OR_DISTINCT(DIModule, Record[0], 18373dac3a9bSDimitry Andric (Context, getMDOrNull(Record[1]), 18383dac3a9bSDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 18393dac3a9bSDimitry Andric getMDString(Record[4]), getMDString(Record[5]))), 18403dac3a9bSDimitry Andric NextMDValueNo++); 18413dac3a9bSDimitry Andric break; 18423dac3a9bSDimitry Andric } 18433dac3a9bSDimitry Andric 1844ff0cc061SDimitry Andric case bitc::METADATA_FILE: { 1845ff0cc061SDimitry Andric if (Record.size() != 3) 18468f0fd8f6SDimitry Andric return error("Invalid record"); 1847ff0cc061SDimitry Andric 18488f0fd8f6SDimitry Andric MDValueList.assignValue( 1849ff0cc061SDimitry Andric GET_OR_DISTINCT(DIFile, Record[0], (Context, getMDString(Record[1]), 1850ff0cc061SDimitry Andric getMDString(Record[2]))), 1851ff0cc061SDimitry Andric NextMDValueNo++); 1852ff0cc061SDimitry Andric break; 1853ff0cc061SDimitry Andric } 1854ff0cc061SDimitry Andric case bitc::METADATA_COMPILE_UNIT: { 1855ff0cc061SDimitry Andric if (Record.size() < 14 || Record.size() > 15) 18568f0fd8f6SDimitry Andric return error("Invalid record"); 1857ff0cc061SDimitry Andric 18588f0fd8f6SDimitry Andric MDValueList.assignValue( 18598f0fd8f6SDimitry Andric GET_OR_DISTINCT( 18608f0fd8f6SDimitry Andric DICompileUnit, Record[0], 1861ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 18628f0fd8f6SDimitry Andric getMDString(Record[3]), Record[4], getMDString(Record[5]), 18638f0fd8f6SDimitry Andric Record[6], getMDString(Record[7]), Record[8], 1864ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1865ff0cc061SDimitry Andric getMDOrNull(Record[11]), getMDOrNull(Record[12]), 18668f0fd8f6SDimitry Andric getMDOrNull(Record[13]), Record.size() == 14 ? 0 : Record[14])), 1867ff0cc061SDimitry Andric NextMDValueNo++); 1868ff0cc061SDimitry Andric break; 1869ff0cc061SDimitry Andric } 1870ff0cc061SDimitry Andric case bitc::METADATA_SUBPROGRAM: { 1871ff0cc061SDimitry Andric if (Record.size() != 19) 18728f0fd8f6SDimitry Andric return error("Invalid record"); 1873ff0cc061SDimitry Andric 18748f0fd8f6SDimitry Andric MDValueList.assignValue( 1875ff0cc061SDimitry Andric GET_OR_DISTINCT( 1876ff0cc061SDimitry Andric DISubprogram, Record[0], 1877ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1878ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1879ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], Record[9], 1880ff0cc061SDimitry Andric getMDOrNull(Record[10]), Record[11], Record[12], Record[13], 1881ff0cc061SDimitry Andric Record[14], getMDOrNull(Record[15]), getMDOrNull(Record[16]), 1882ff0cc061SDimitry Andric getMDOrNull(Record[17]), getMDOrNull(Record[18]))), 1883ff0cc061SDimitry Andric NextMDValueNo++); 1884ff0cc061SDimitry Andric break; 1885ff0cc061SDimitry Andric } 1886ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: { 1887ff0cc061SDimitry Andric if (Record.size() != 5) 18888f0fd8f6SDimitry Andric return error("Invalid record"); 1889ff0cc061SDimitry Andric 18908f0fd8f6SDimitry Andric MDValueList.assignValue( 1891ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlock, Record[0], 1892ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1893ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])), 1894ff0cc061SDimitry Andric NextMDValueNo++); 1895ff0cc061SDimitry Andric break; 1896ff0cc061SDimitry Andric } 1897ff0cc061SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: { 1898ff0cc061SDimitry Andric if (Record.size() != 4) 18998f0fd8f6SDimitry Andric return error("Invalid record"); 1900ff0cc061SDimitry Andric 19018f0fd8f6SDimitry Andric MDValueList.assignValue( 1902ff0cc061SDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile, Record[0], 1903ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1904ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3])), 1905ff0cc061SDimitry Andric NextMDValueNo++); 1906ff0cc061SDimitry Andric break; 1907ff0cc061SDimitry Andric } 1908ff0cc061SDimitry Andric case bitc::METADATA_NAMESPACE: { 1909ff0cc061SDimitry Andric if (Record.size() != 5) 19108f0fd8f6SDimitry Andric return error("Invalid record"); 1911ff0cc061SDimitry Andric 19128f0fd8f6SDimitry Andric MDValueList.assignValue( 1913ff0cc061SDimitry Andric GET_OR_DISTINCT(DINamespace, Record[0], 1914ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1915ff0cc061SDimitry Andric getMDOrNull(Record[2]), getMDString(Record[3]), 1916ff0cc061SDimitry Andric Record[4])), 1917ff0cc061SDimitry Andric NextMDValueNo++); 1918ff0cc061SDimitry Andric break; 1919ff0cc061SDimitry Andric } 1920ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: { 1921ff0cc061SDimitry Andric if (Record.size() != 3) 19228f0fd8f6SDimitry Andric return error("Invalid record"); 1923ff0cc061SDimitry Andric 19248f0fd8f6SDimitry Andric MDValueList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter, 1925ff0cc061SDimitry Andric Record[0], 1926ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 1927ff0cc061SDimitry Andric getMDOrNull(Record[2]))), 1928ff0cc061SDimitry Andric NextMDValueNo++); 1929ff0cc061SDimitry Andric break; 1930ff0cc061SDimitry Andric } 1931ff0cc061SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: { 1932ff0cc061SDimitry Andric if (Record.size() != 5) 19338f0fd8f6SDimitry Andric return error("Invalid record"); 1934ff0cc061SDimitry Andric 19358f0fd8f6SDimitry Andric MDValueList.assignValue( 1936ff0cc061SDimitry Andric GET_OR_DISTINCT(DITemplateValueParameter, Record[0], 1937ff0cc061SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1938ff0cc061SDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]))), 1939ff0cc061SDimitry Andric NextMDValueNo++); 1940ff0cc061SDimitry Andric break; 1941ff0cc061SDimitry Andric } 1942ff0cc061SDimitry Andric case bitc::METADATA_GLOBAL_VAR: { 1943ff0cc061SDimitry Andric if (Record.size() != 11) 19448f0fd8f6SDimitry Andric return error("Invalid record"); 1945ff0cc061SDimitry Andric 19468f0fd8f6SDimitry Andric MDValueList.assignValue( 1947ff0cc061SDimitry Andric GET_OR_DISTINCT(DIGlobalVariable, Record[0], 1948ff0cc061SDimitry Andric (Context, getMDOrNull(Record[1]), 1949ff0cc061SDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 1950ff0cc061SDimitry Andric getMDOrNull(Record[4]), Record[5], 1951ff0cc061SDimitry Andric getMDOrNull(Record[6]), Record[7], Record[8], 1952ff0cc061SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]))), 1953ff0cc061SDimitry Andric NextMDValueNo++); 1954ff0cc061SDimitry Andric break; 1955ff0cc061SDimitry Andric } 1956ff0cc061SDimitry Andric case bitc::METADATA_LOCAL_VAR: { 1957ff0cc061SDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field. 1958ff0cc061SDimitry Andric if (Record.size() != 9 && Record.size() != 10) 19598f0fd8f6SDimitry Andric return error("Invalid record"); 1960ff0cc061SDimitry Andric 19618f0fd8f6SDimitry Andric MDValueList.assignValue( 1962ff0cc061SDimitry Andric GET_OR_DISTINCT(DILocalVariable, Record[0], 1963ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 1964ff0cc061SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), 1965ff0cc061SDimitry Andric Record[5], getMDOrNull(Record[6]), Record[7], 1966ff0cc061SDimitry Andric Record[8])), 1967ff0cc061SDimitry Andric NextMDValueNo++); 1968ff0cc061SDimitry Andric break; 1969ff0cc061SDimitry Andric } 1970ff0cc061SDimitry Andric case bitc::METADATA_EXPRESSION: { 1971ff0cc061SDimitry Andric if (Record.size() < 1) 19728f0fd8f6SDimitry Andric return error("Invalid record"); 1973ff0cc061SDimitry Andric 19748f0fd8f6SDimitry Andric MDValueList.assignValue( 1975ff0cc061SDimitry Andric GET_OR_DISTINCT(DIExpression, Record[0], 1976ff0cc061SDimitry Andric (Context, makeArrayRef(Record).slice(1))), 1977ff0cc061SDimitry Andric NextMDValueNo++); 1978ff0cc061SDimitry Andric break; 1979ff0cc061SDimitry Andric } 1980ff0cc061SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: { 1981ff0cc061SDimitry Andric if (Record.size() != 8) 19828f0fd8f6SDimitry Andric return error("Invalid record"); 1983ff0cc061SDimitry Andric 19848f0fd8f6SDimitry Andric MDValueList.assignValue( 1985ff0cc061SDimitry Andric GET_OR_DISTINCT(DIObjCProperty, Record[0], 1986ff0cc061SDimitry Andric (Context, getMDString(Record[1]), 1987ff0cc061SDimitry Andric getMDOrNull(Record[2]), Record[3], 1988ff0cc061SDimitry Andric getMDString(Record[4]), getMDString(Record[5]), 1989ff0cc061SDimitry Andric Record[6], getMDOrNull(Record[7]))), 1990ff0cc061SDimitry Andric NextMDValueNo++); 1991ff0cc061SDimitry Andric break; 1992ff0cc061SDimitry Andric } 1993ff0cc061SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: { 1994ff0cc061SDimitry Andric if (Record.size() != 6) 19958f0fd8f6SDimitry Andric return error("Invalid record"); 1996ff0cc061SDimitry Andric 19978f0fd8f6SDimitry Andric MDValueList.assignValue( 1998ff0cc061SDimitry Andric GET_OR_DISTINCT(DIImportedEntity, Record[0], 1999ff0cc061SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 2000ff0cc061SDimitry Andric getMDOrNull(Record[3]), Record[4], 2001ff0cc061SDimitry Andric getMDString(Record[5]))), 200239d628a0SDimitry Andric NextMDValueNo++); 2003f22ef01cSRoman Divacky break; 2004f22ef01cSRoman Divacky } 2005f22ef01cSRoman Divacky case bitc::METADATA_STRING: { 200691bc56edSDimitry Andric std::string String(Record.begin(), Record.end()); 200791bc56edSDimitry Andric llvm::UpgradeMDStringConstant(String); 200839d628a0SDimitry Andric Metadata *MD = MDString::get(Context, String); 20098f0fd8f6SDimitry Andric MDValueList.assignValue(MD, NextMDValueNo++); 2010f22ef01cSRoman Divacky break; 2011f22ef01cSRoman Divacky } 2012f22ef01cSRoman Divacky case bitc::METADATA_KIND: { 20137ae0e2c9SDimitry Andric if (Record.size() < 2) 20148f0fd8f6SDimitry Andric return error("Invalid record"); 20157ae0e2c9SDimitry Andric 2016f22ef01cSRoman Divacky unsigned Kind = Record[0]; 20177ae0e2c9SDimitry Andric SmallString<8> Name(Record.begin()+1, Record.end()); 2018f22ef01cSRoman Divacky 2019f22ef01cSRoman Divacky unsigned NewKind = TheModule->getMDKindID(Name.str()); 2020e580952dSDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 20218f0fd8f6SDimitry Andric return error("Conflicting METADATA_KIND records"); 2022f22ef01cSRoman Divacky break; 2023f22ef01cSRoman Divacky } 2024f22ef01cSRoman Divacky } 2025f22ef01cSRoman Divacky } 2026ff0cc061SDimitry Andric #undef GET_OR_DISTINCT 2027f22ef01cSRoman Divacky } 2028f22ef01cSRoman Divacky 20298f0fd8f6SDimitry Andric /// Decode a signed value stored with the sign bit in the LSB for dense VBR 20308f0fd8f6SDimitry Andric /// encoding. 20313861d79fSDimitry Andric uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { 2032f22ef01cSRoman Divacky if ((V & 1) == 0) 2033f22ef01cSRoman Divacky return V >> 1; 2034f22ef01cSRoman Divacky if (V != 1) 2035f22ef01cSRoman Divacky return -(V >> 1); 2036f22ef01cSRoman Divacky // There is no such thing as -0 with integers. "-0" really means MININT. 2037f22ef01cSRoman Divacky return 1ULL << 63; 2038f22ef01cSRoman Divacky } 2039f22ef01cSRoman Divacky 20408f0fd8f6SDimitry Andric /// Resolve all of the initializers for global values and aliases that we can. 20418f0fd8f6SDimitry Andric std::error_code BitcodeReader::resolveGlobalAndAliasInits() { 2042f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitWorklist; 2043f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> > AliasInitWorklist; 2044f785676fSDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrefixWorklist; 204539d628a0SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPrologueWorklist; 20468f0fd8f6SDimitry Andric std::vector<std::pair<Function*, unsigned> > FunctionPersonalityFnWorklist; 2047f22ef01cSRoman Divacky 2048f22ef01cSRoman Divacky GlobalInitWorklist.swap(GlobalInits); 2049f22ef01cSRoman Divacky AliasInitWorklist.swap(AliasInits); 2050f785676fSDimitry Andric FunctionPrefixWorklist.swap(FunctionPrefixes); 205139d628a0SDimitry Andric FunctionPrologueWorklist.swap(FunctionPrologues); 20528f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.swap(FunctionPersonalityFns); 2053f22ef01cSRoman Divacky 2054f22ef01cSRoman Divacky while (!GlobalInitWorklist.empty()) { 2055f22ef01cSRoman Divacky unsigned ValID = GlobalInitWorklist.back().second; 2056f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2057f22ef01cSRoman Divacky // Not ready to resolve this yet, it requires something later in the file. 2058f22ef01cSRoman Divacky GlobalInits.push_back(GlobalInitWorklist.back()); 2059f22ef01cSRoman Divacky } else { 206091bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2061f22ef01cSRoman Divacky GlobalInitWorklist.back().first->setInitializer(C); 2062f22ef01cSRoman Divacky else 20638f0fd8f6SDimitry Andric return error("Expected a constant"); 2064f22ef01cSRoman Divacky } 2065f22ef01cSRoman Divacky GlobalInitWorklist.pop_back(); 2066f22ef01cSRoman Divacky } 2067f22ef01cSRoman Divacky 2068f22ef01cSRoman Divacky while (!AliasInitWorklist.empty()) { 2069f22ef01cSRoman Divacky unsigned ValID = AliasInitWorklist.back().second; 2070f22ef01cSRoman Divacky if (ValID >= ValueList.size()) { 2071f22ef01cSRoman Divacky AliasInits.push_back(AliasInitWorklist.back()); 2072f22ef01cSRoman Divacky } else { 207397bc6c73SDimitry Andric Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]); 207497bc6c73SDimitry Andric if (!C) 20758f0fd8f6SDimitry Andric return error("Expected a constant"); 207697bc6c73SDimitry Andric GlobalAlias *Alias = AliasInitWorklist.back().first; 207797bc6c73SDimitry Andric if (C->getType() != Alias->getType()) 20788f0fd8f6SDimitry Andric return error("Alias and aliasee types don't match"); 207997bc6c73SDimitry Andric Alias->setAliasee(C); 2080f22ef01cSRoman Divacky } 2081f22ef01cSRoman Divacky AliasInitWorklist.pop_back(); 2082f22ef01cSRoman Divacky } 2083f785676fSDimitry Andric 2084f785676fSDimitry Andric while (!FunctionPrefixWorklist.empty()) { 2085f785676fSDimitry Andric unsigned ValID = FunctionPrefixWorklist.back().second; 2086f785676fSDimitry Andric if (ValID >= ValueList.size()) { 2087f785676fSDimitry Andric FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); 2088f785676fSDimitry Andric } else { 208991bc56edSDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 2090f785676fSDimitry Andric FunctionPrefixWorklist.back().first->setPrefixData(C); 2091f785676fSDimitry Andric else 20928f0fd8f6SDimitry Andric return error("Expected a constant"); 2093f785676fSDimitry Andric } 2094f785676fSDimitry Andric FunctionPrefixWorklist.pop_back(); 2095f785676fSDimitry Andric } 2096f785676fSDimitry Andric 209739d628a0SDimitry Andric while (!FunctionPrologueWorklist.empty()) { 209839d628a0SDimitry Andric unsigned ValID = FunctionPrologueWorklist.back().second; 209939d628a0SDimitry Andric if (ValID >= ValueList.size()) { 210039d628a0SDimitry Andric FunctionPrologues.push_back(FunctionPrologueWorklist.back()); 210139d628a0SDimitry Andric } else { 210239d628a0SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 210339d628a0SDimitry Andric FunctionPrologueWorklist.back().first->setPrologueData(C); 210439d628a0SDimitry Andric else 21058f0fd8f6SDimitry Andric return error("Expected a constant"); 210639d628a0SDimitry Andric } 210739d628a0SDimitry Andric FunctionPrologueWorklist.pop_back(); 210839d628a0SDimitry Andric } 210939d628a0SDimitry Andric 21108f0fd8f6SDimitry Andric while (!FunctionPersonalityFnWorklist.empty()) { 21118f0fd8f6SDimitry Andric unsigned ValID = FunctionPersonalityFnWorklist.back().second; 21128f0fd8f6SDimitry Andric if (ValID >= ValueList.size()) { 21138f0fd8f6SDimitry Andric FunctionPersonalityFns.push_back(FunctionPersonalityFnWorklist.back()); 21148f0fd8f6SDimitry Andric } else { 21158f0fd8f6SDimitry Andric if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) 21168f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.back().first->setPersonalityFn(C); 21178f0fd8f6SDimitry Andric else 21188f0fd8f6SDimitry Andric return error("Expected a constant"); 21198f0fd8f6SDimitry Andric } 21208f0fd8f6SDimitry Andric FunctionPersonalityFnWorklist.pop_back(); 21218f0fd8f6SDimitry Andric } 21228f0fd8f6SDimitry Andric 212391bc56edSDimitry Andric return std::error_code(); 2124f22ef01cSRoman Divacky } 2125f22ef01cSRoman Divacky 21268f0fd8f6SDimitry Andric static APInt readWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) { 21277ae0e2c9SDimitry Andric SmallVector<uint64_t, 8> Words(Vals.size()); 21287ae0e2c9SDimitry Andric std::transform(Vals.begin(), Vals.end(), Words.begin(), 21293861d79fSDimitry Andric BitcodeReader::decodeSignRotatedValue); 21307ae0e2c9SDimitry Andric 21317ae0e2c9SDimitry Andric return APInt(TypeBits, Words); 21327ae0e2c9SDimitry Andric } 21337ae0e2c9SDimitry Andric 21348f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseConstants() { 2135f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID)) 21368f0fd8f6SDimitry Andric return error("Invalid record"); 2137f22ef01cSRoman Divacky 2138f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 2139f22ef01cSRoman Divacky 2140f22ef01cSRoman Divacky // Read all the records for this value table. 21416122f3e6SDimitry Andric Type *CurTy = Type::getInt32Ty(Context); 2142f22ef01cSRoman Divacky unsigned NextCstNo = ValueList.size(); 2143f22ef01cSRoman Divacky while (1) { 2144139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2145139f7f9bSDimitry Andric 2146139f7f9bSDimitry Andric switch (Entry.Kind) { 2147139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2148139f7f9bSDimitry Andric case BitstreamEntry::Error: 21498f0fd8f6SDimitry Andric return error("Malformed block"); 2150139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 2151139f7f9bSDimitry Andric if (NextCstNo != ValueList.size()) 21528f0fd8f6SDimitry Andric return error("Invalid ronstant reference"); 2153139f7f9bSDimitry Andric 2154139f7f9bSDimitry Andric // Once all the constants have been read, go through and resolve forward 2155139f7f9bSDimitry Andric // references. 21568f0fd8f6SDimitry Andric ValueList.resolveConstantForwardRefs(); 215791bc56edSDimitry Andric return std::error_code(); 2158139f7f9bSDimitry Andric case BitstreamEntry::Record: 2159139f7f9bSDimitry Andric // The interesting case. 2160f22ef01cSRoman Divacky break; 2161f22ef01cSRoman Divacky } 2162f22ef01cSRoman Divacky 2163f22ef01cSRoman Divacky // Read a record. 2164f22ef01cSRoman Divacky Record.clear(); 216591bc56edSDimitry Andric Value *V = nullptr; 2166139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 2167f22ef01cSRoman Divacky switch (BitCode) { 2168f22ef01cSRoman Divacky default: // Default behavior: unknown constant 2169f22ef01cSRoman Divacky case bitc::CST_CODE_UNDEF: // UNDEF 2170f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2171f22ef01cSRoman Divacky break; 2172f22ef01cSRoman Divacky case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] 2173f22ef01cSRoman Divacky if (Record.empty()) 21748f0fd8f6SDimitry Andric return error("Invalid record"); 217591bc56edSDimitry Andric if (Record[0] >= TypeList.size() || !TypeList[Record[0]]) 21768f0fd8f6SDimitry Andric return error("Invalid record"); 2177f22ef01cSRoman Divacky CurTy = TypeList[Record[0]]; 2178f22ef01cSRoman Divacky continue; // Skip the ValueList manipulation. 2179f22ef01cSRoman Divacky case bitc::CST_CODE_NULL: // NULL 2180f22ef01cSRoman Divacky V = Constant::getNullValue(CurTy); 2181f22ef01cSRoman Divacky break; 2182f22ef01cSRoman Divacky case bitc::CST_CODE_INTEGER: // INTEGER: [intval] 2183f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 21848f0fd8f6SDimitry Andric return error("Invalid record"); 21853861d79fSDimitry Andric V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0])); 2186f22ef01cSRoman Divacky break; 2187f22ef01cSRoman Divacky case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval] 2188f22ef01cSRoman Divacky if (!CurTy->isIntegerTy() || Record.empty()) 21898f0fd8f6SDimitry Andric return error("Invalid record"); 2190f22ef01cSRoman Divacky 21918f0fd8f6SDimitry Andric APInt VInt = 21928f0fd8f6SDimitry Andric readWideAPInt(Record, cast<IntegerType>(CurTy)->getBitWidth()); 21937ae0e2c9SDimitry Andric V = ConstantInt::get(Context, VInt); 21947ae0e2c9SDimitry Andric 2195f22ef01cSRoman Divacky break; 2196f22ef01cSRoman Divacky } 2197f22ef01cSRoman Divacky case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval] 2198f22ef01cSRoman Divacky if (Record.empty()) 21998f0fd8f6SDimitry Andric return error("Invalid record"); 2200dff0c46cSDimitry Andric if (CurTy->isHalfTy()) 2201139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf, 2202139f7f9bSDimitry Andric APInt(16, (uint16_t)Record[0]))); 2203dff0c46cSDimitry Andric else if (CurTy->isFloatTy()) 2204139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, 2205139f7f9bSDimitry Andric APInt(32, (uint32_t)Record[0]))); 2206f22ef01cSRoman Divacky else if (CurTy->isDoubleTy()) 2207139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, 2208139f7f9bSDimitry Andric APInt(64, Record[0]))); 2209f22ef01cSRoman Divacky else if (CurTy->isX86_FP80Ty()) { 2210f22ef01cSRoman Divacky // Bits are not stored the same way as a normal i80 APInt, compensate. 2211f22ef01cSRoman Divacky uint64_t Rearrange[2]; 2212f22ef01cSRoman Divacky Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16); 2213f22ef01cSRoman Divacky Rearrange[1] = Record[0] >> 48; 2214139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::x87DoubleExtended, 2215139f7f9bSDimitry Andric APInt(80, Rearrange))); 2216f22ef01cSRoman Divacky } else if (CurTy->isFP128Ty()) 2217139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::IEEEquad, 2218139f7f9bSDimitry Andric APInt(128, Record))); 2219f22ef01cSRoman Divacky else if (CurTy->isPPC_FP128Ty()) 2220139f7f9bSDimitry Andric V = ConstantFP::get(Context, APFloat(APFloat::PPCDoubleDouble, 2221139f7f9bSDimitry Andric APInt(128, Record))); 2222f22ef01cSRoman Divacky else 2223f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2224f22ef01cSRoman Divacky break; 2225f22ef01cSRoman Divacky } 2226f22ef01cSRoman Divacky 2227f22ef01cSRoman Divacky case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n x value number] 2228f22ef01cSRoman Divacky if (Record.empty()) 22298f0fd8f6SDimitry Andric return error("Invalid record"); 2230f22ef01cSRoman Divacky 2231f22ef01cSRoman Divacky unsigned Size = Record.size(); 2232dff0c46cSDimitry Andric SmallVector<Constant*, 16> Elts; 2233f22ef01cSRoman Divacky 22346122f3e6SDimitry Andric if (StructType *STy = dyn_cast<StructType>(CurTy)) { 2235f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2236f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], 2237f22ef01cSRoman Divacky STy->getElementType(i))); 2238f22ef01cSRoman Divacky V = ConstantStruct::get(STy, Elts); 22396122f3e6SDimitry Andric } else if (ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) { 22406122f3e6SDimitry Andric Type *EltTy = ATy->getElementType(); 2241f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2242f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2243f22ef01cSRoman Divacky V = ConstantArray::get(ATy, Elts); 22446122f3e6SDimitry Andric } else if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) { 22456122f3e6SDimitry Andric Type *EltTy = VTy->getElementType(); 2246f22ef01cSRoman Divacky for (unsigned i = 0; i != Size; ++i) 2247f22ef01cSRoman Divacky Elts.push_back(ValueList.getConstantFwdRef(Record[i], EltTy)); 2248f22ef01cSRoman Divacky V = ConstantVector::get(Elts); 2249f22ef01cSRoman Divacky } else { 2250f22ef01cSRoman Divacky V = UndefValue::get(CurTy); 2251f22ef01cSRoman Divacky } 2252f22ef01cSRoman Divacky break; 2253f22ef01cSRoman Divacky } 2254dff0c46cSDimitry Andric case bitc::CST_CODE_STRING: // STRING: [values] 2255f22ef01cSRoman Divacky case bitc::CST_CODE_CSTRING: { // CSTRING: [values] 2256f22ef01cSRoman Divacky if (Record.empty()) 22578f0fd8f6SDimitry Andric return error("Invalid record"); 2258f22ef01cSRoman Divacky 22597ae0e2c9SDimitry Andric SmallString<16> Elts(Record.begin(), Record.end()); 2260dff0c46cSDimitry Andric V = ConstantDataArray::getString(Context, Elts, 2261dff0c46cSDimitry Andric BitCode == bitc::CST_CODE_CSTRING); 2262f22ef01cSRoman Divacky break; 2263f22ef01cSRoman Divacky } 2264dff0c46cSDimitry Andric case bitc::CST_CODE_DATA: {// DATA: [n x value] 2265dff0c46cSDimitry Andric if (Record.empty()) 22668f0fd8f6SDimitry Andric return error("Invalid record"); 2267dff0c46cSDimitry Andric 2268dff0c46cSDimitry Andric Type *EltTy = cast<SequentialType>(CurTy)->getElementType(); 2269dff0c46cSDimitry Andric unsigned Size = Record.size(); 2270dff0c46cSDimitry Andric 2271dff0c46cSDimitry Andric if (EltTy->isIntegerTy(8)) { 2272dff0c46cSDimitry Andric SmallVector<uint8_t, 16> Elts(Record.begin(), Record.end()); 2273dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2274dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2275dff0c46cSDimitry Andric else 2276dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2277dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(16)) { 2278dff0c46cSDimitry Andric SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end()); 2279dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2280dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2281dff0c46cSDimitry Andric else 2282dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2283dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(32)) { 2284dff0c46cSDimitry Andric SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end()); 2285dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2286dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2287dff0c46cSDimitry Andric else 2288dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2289dff0c46cSDimitry Andric } else if (EltTy->isIntegerTy(64)) { 2290dff0c46cSDimitry Andric SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end()); 2291dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2292dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2293dff0c46cSDimitry Andric else 2294dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2295dff0c46cSDimitry Andric } else if (EltTy->isFloatTy()) { 22967ae0e2c9SDimitry Andric SmallVector<float, 16> Elts(Size); 22977ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), BitsToFloat); 2298dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2299dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2300dff0c46cSDimitry Andric else 2301dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2302dff0c46cSDimitry Andric } else if (EltTy->isDoubleTy()) { 23037ae0e2c9SDimitry Andric SmallVector<double, 16> Elts(Size); 23047ae0e2c9SDimitry Andric std::transform(Record.begin(), Record.end(), Elts.begin(), 23057ae0e2c9SDimitry Andric BitsToDouble); 2306dff0c46cSDimitry Andric if (isa<VectorType>(CurTy)) 2307dff0c46cSDimitry Andric V = ConstantDataVector::get(Context, Elts); 2308dff0c46cSDimitry Andric else 2309dff0c46cSDimitry Andric V = ConstantDataArray::get(Context, Elts); 2310dff0c46cSDimitry Andric } else { 23118f0fd8f6SDimitry Andric return error("Invalid type for value"); 2312dff0c46cSDimitry Andric } 2313dff0c46cSDimitry Andric break; 2314dff0c46cSDimitry Andric } 2315dff0c46cSDimitry Andric 2316f22ef01cSRoman Divacky case bitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] 2317f785676fSDimitry Andric if (Record.size() < 3) 23188f0fd8f6SDimitry Andric return error("Invalid record"); 23198f0fd8f6SDimitry Andric int Opc = getDecodedBinaryOpcode(Record[0], CurTy); 2320f22ef01cSRoman Divacky if (Opc < 0) { 2321f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown binop. 2322f22ef01cSRoman Divacky } else { 2323f22ef01cSRoman Divacky Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); 2324f22ef01cSRoman Divacky Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); 2325f22ef01cSRoman Divacky unsigned Flags = 0; 2326f22ef01cSRoman Divacky if (Record.size() >= 4) { 2327f22ef01cSRoman Divacky if (Opc == Instruction::Add || 2328f22ef01cSRoman Divacky Opc == Instruction::Sub || 23292754fe60SDimitry Andric Opc == Instruction::Mul || 23302754fe60SDimitry Andric Opc == Instruction::Shl) { 2331f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 2332f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoSignedWrap; 2333f22ef01cSRoman Divacky if (Record[3] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 2334f22ef01cSRoman Divacky Flags |= OverflowingBinaryOperator::NoUnsignedWrap; 23352754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 23362754fe60SDimitry Andric Opc == Instruction::UDiv || 23372754fe60SDimitry Andric Opc == Instruction::LShr || 23382754fe60SDimitry Andric Opc == Instruction::AShr) { 23392754fe60SDimitry Andric if (Record[3] & (1 << bitc::PEO_EXACT)) 2340f22ef01cSRoman Divacky Flags |= SDivOperator::IsExact; 2341f22ef01cSRoman Divacky } 2342f22ef01cSRoman Divacky } 2343f22ef01cSRoman Divacky V = ConstantExpr::get(Opc, LHS, RHS, Flags); 2344f22ef01cSRoman Divacky } 2345f22ef01cSRoman Divacky break; 2346f22ef01cSRoman Divacky } 2347f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] 2348f785676fSDimitry Andric if (Record.size() < 3) 23498f0fd8f6SDimitry Andric return error("Invalid record"); 23508f0fd8f6SDimitry Andric int Opc = getDecodedCastOpcode(Record[0]); 2351f22ef01cSRoman Divacky if (Opc < 0) { 2352f22ef01cSRoman Divacky V = UndefValue::get(CurTy); // Unknown cast. 2353f22ef01cSRoman Divacky } else { 23546122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 2355f785676fSDimitry Andric if (!OpTy) 23568f0fd8f6SDimitry Andric return error("Invalid record"); 2357f22ef01cSRoman Divacky Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); 2358f785676fSDimitry Andric V = UpgradeBitCastExpr(Opc, Op, CurTy); 2359f785676fSDimitry Andric if (!V) V = ConstantExpr::getCast(Opc, Op, CurTy); 2360f22ef01cSRoman Divacky } 2361f22ef01cSRoman Divacky break; 2362f22ef01cSRoman Divacky } 2363f22ef01cSRoman Divacky case bitc::CST_CODE_CE_INBOUNDS_GEP: 2364f22ef01cSRoman Divacky case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] 2365ff0cc061SDimitry Andric unsigned OpNum = 0; 2366ff0cc061SDimitry Andric Type *PointeeType = nullptr; 2367ff0cc061SDimitry Andric if (Record.size() % 2) 2368ff0cc061SDimitry Andric PointeeType = getTypeByID(Record[OpNum++]); 2369f22ef01cSRoman Divacky SmallVector<Constant*, 16> Elts; 2370ff0cc061SDimitry Andric while (OpNum != Record.size()) { 2371ff0cc061SDimitry Andric Type *ElTy = getTypeByID(Record[OpNum++]); 2372f785676fSDimitry Andric if (!ElTy) 23738f0fd8f6SDimitry Andric return error("Invalid record"); 2374ff0cc061SDimitry Andric Elts.push_back(ValueList.getConstantFwdRef(Record[OpNum++], ElTy)); 2375f22ef01cSRoman Divacky } 2376ff0cc061SDimitry Andric 2377ff0cc061SDimitry Andric if (PointeeType && 2378ff0cc061SDimitry Andric PointeeType != 2379ff0cc061SDimitry Andric cast<SequentialType>(Elts[0]->getType()->getScalarType()) 2380ff0cc061SDimitry Andric ->getElementType()) 23818f0fd8f6SDimitry Andric return error("Explicit gep operator type does not match pointee type " 2382ff0cc061SDimitry Andric "of pointer operand"); 2383ff0cc061SDimitry Andric 23846122f3e6SDimitry Andric ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); 2385ff0cc061SDimitry Andric V = ConstantExpr::getGetElementPtr(PointeeType, Elts[0], Indices, 23866122f3e6SDimitry Andric BitCode == 23876122f3e6SDimitry Andric bitc::CST_CODE_CE_INBOUNDS_GEP); 2388f22ef01cSRoman Divacky break; 2389f22ef01cSRoman Divacky } 2390f785676fSDimitry Andric case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#] 2391f785676fSDimitry Andric if (Record.size() < 3) 23928f0fd8f6SDimitry Andric return error("Invalid record"); 2393f785676fSDimitry Andric 2394f785676fSDimitry Andric Type *SelectorTy = Type::getInt1Ty(Context); 2395f785676fSDimitry Andric 2396f785676fSDimitry Andric // If CurTy is a vector of length n, then Record[0] must be a <n x i1> 2397f785676fSDimitry Andric // vector. Otherwise, it must be a single bit. 2398f785676fSDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) 2399f785676fSDimitry Andric SelectorTy = VectorType::get(Type::getInt1Ty(Context), 2400f785676fSDimitry Andric VTy->getNumElements()); 2401f785676fSDimitry Andric 2402f785676fSDimitry Andric V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], 2403f785676fSDimitry Andric SelectorTy), 2404f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[1],CurTy), 2405f22ef01cSRoman Divacky ValueList.getConstantFwdRef(Record[2],CurTy)); 2406f22ef01cSRoman Divacky break; 2407f785676fSDimitry Andric } 240891bc56edSDimitry Andric case bitc::CST_CODE_CE_EXTRACTELT 240991bc56edSDimitry Andric : { // CE_EXTRACTELT: [opty, opval, opty, opval] 2410f785676fSDimitry Andric if (Record.size() < 3) 24118f0fd8f6SDimitry Andric return error("Invalid record"); 24126122f3e6SDimitry Andric VectorType *OpTy = 2413f22ef01cSRoman Divacky dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 241491bc56edSDimitry Andric if (!OpTy) 24158f0fd8f6SDimitry Andric return error("Invalid record"); 2416f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 241791bc56edSDimitry Andric Constant *Op1 = nullptr; 241891bc56edSDimitry Andric if (Record.size() == 4) { 241991bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 242091bc56edSDimitry Andric if (!IdxTy) 24218f0fd8f6SDimitry Andric return error("Invalid record"); 242291bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[3], IdxTy); 242391bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 242491bc56edSDimitry Andric Op1 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 242591bc56edSDimitry Andric if (!Op1) 24268f0fd8f6SDimitry Andric return error("Invalid record"); 2427f22ef01cSRoman Divacky V = ConstantExpr::getExtractElement(Op0, Op1); 2428f22ef01cSRoman Divacky break; 2429f22ef01cSRoman Divacky } 243091bc56edSDimitry Andric case bitc::CST_CODE_CE_INSERTELT 243191bc56edSDimitry Andric : { // CE_INSERTELT: [opval, opval, opty, opval] 24326122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 243391bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 24348f0fd8f6SDimitry Andric return error("Invalid record"); 2435f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2436f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], 2437f22ef01cSRoman Divacky OpTy->getElementType()); 243891bc56edSDimitry Andric Constant *Op2 = nullptr; 243991bc56edSDimitry Andric if (Record.size() == 4) { 244091bc56edSDimitry Andric Type *IdxTy = getTypeByID(Record[2]); 244191bc56edSDimitry Andric if (!IdxTy) 24428f0fd8f6SDimitry Andric return error("Invalid record"); 244391bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[3], IdxTy); 244491bc56edSDimitry Andric } else // TODO: Remove with llvm 4.0 244591bc56edSDimitry Andric Op2 = ValueList.getConstantFwdRef(Record[2], Type::getInt32Ty(Context)); 244691bc56edSDimitry Andric if (!Op2) 24478f0fd8f6SDimitry Andric return error("Invalid record"); 2448f22ef01cSRoman Divacky V = ConstantExpr::getInsertElement(Op0, Op1, Op2); 2449f22ef01cSRoman Divacky break; 2450f22ef01cSRoman Divacky } 2451f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] 24526122f3e6SDimitry Andric VectorType *OpTy = dyn_cast<VectorType>(CurTy); 245391bc56edSDimitry Andric if (Record.size() < 3 || !OpTy) 24548f0fd8f6SDimitry Andric return error("Invalid record"); 2455f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); 2456f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); 24576122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2458f22ef01cSRoman Divacky OpTy->getNumElements()); 2459f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); 2460f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2461f22ef01cSRoman Divacky break; 2462f22ef01cSRoman Divacky } 2463f22ef01cSRoman Divacky case bitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] 24646122f3e6SDimitry Andric VectorType *RTy = dyn_cast<VectorType>(CurTy); 24656122f3e6SDimitry Andric VectorType *OpTy = 24662754fe60SDimitry Andric dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); 246791bc56edSDimitry Andric if (Record.size() < 4 || !RTy || !OpTy) 24688f0fd8f6SDimitry Andric return error("Invalid record"); 2469f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2470f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 24716122f3e6SDimitry Andric Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), 2472f22ef01cSRoman Divacky RTy->getNumElements()); 2473f22ef01cSRoman Divacky Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); 2474f22ef01cSRoman Divacky V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); 2475f22ef01cSRoman Divacky break; 2476f22ef01cSRoman Divacky } 2477f22ef01cSRoman Divacky case bitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] 2478f785676fSDimitry Andric if (Record.size() < 4) 24798f0fd8f6SDimitry Andric return error("Invalid record"); 24806122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 248191bc56edSDimitry Andric if (!OpTy) 24828f0fd8f6SDimitry Andric return error("Invalid record"); 2483f22ef01cSRoman Divacky Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); 2484f22ef01cSRoman Divacky Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); 2485f22ef01cSRoman Divacky 2486f22ef01cSRoman Divacky if (OpTy->isFPOrFPVectorTy()) 2487f22ef01cSRoman Divacky V = ConstantExpr::getFCmp(Record[3], Op0, Op1); 2488f22ef01cSRoman Divacky else 2489f22ef01cSRoman Divacky V = ConstantExpr::getICmp(Record[3], Op0, Op1); 2490f22ef01cSRoman Divacky break; 2491f22ef01cSRoman Divacky } 24923861d79fSDimitry Andric // This maintains backward compatibility, pre-asm dialect keywords. 24933861d79fSDimitry Andric // FIXME: Remove with the 4.0 release. 24943861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM_OLD: { 2495f785676fSDimitry Andric if (Record.size() < 2) 24968f0fd8f6SDimitry Andric return error("Invalid record"); 2497f22ef01cSRoman Divacky std::string AsmStr, ConstrStr; 2498f22ef01cSRoman Divacky bool HasSideEffects = Record[0] & 1; 2499f22ef01cSRoman Divacky bool IsAlignStack = Record[0] >> 1; 2500f22ef01cSRoman Divacky unsigned AsmStrSize = Record[1]; 2501f22ef01cSRoman Divacky if (2+AsmStrSize >= Record.size()) 25028f0fd8f6SDimitry Andric return error("Invalid record"); 2503f22ef01cSRoman Divacky unsigned ConstStrSize = Record[2+AsmStrSize]; 2504f22ef01cSRoman Divacky if (3+AsmStrSize+ConstStrSize > Record.size()) 25058f0fd8f6SDimitry Andric return error("Invalid record"); 2506f22ef01cSRoman Divacky 2507f22ef01cSRoman Divacky for (unsigned i = 0; i != AsmStrSize; ++i) 2508f22ef01cSRoman Divacky AsmStr += (char)Record[2+i]; 2509f22ef01cSRoman Divacky for (unsigned i = 0; i != ConstStrSize; ++i) 2510f22ef01cSRoman Divacky ConstrStr += (char)Record[3+AsmStrSize+i]; 25116122f3e6SDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 2512f22ef01cSRoman Divacky V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 2513f22ef01cSRoman Divacky AsmStr, ConstrStr, HasSideEffects, IsAlignStack); 2514f22ef01cSRoman Divacky break; 2515f22ef01cSRoman Divacky } 25163861d79fSDimitry Andric // This version adds support for the asm dialect keywords (e.g., 25173861d79fSDimitry Andric // inteldialect). 25183861d79fSDimitry Andric case bitc::CST_CODE_INLINEASM: { 2519f785676fSDimitry Andric if (Record.size() < 2) 25208f0fd8f6SDimitry Andric return error("Invalid record"); 25213861d79fSDimitry Andric std::string AsmStr, ConstrStr; 25223861d79fSDimitry Andric bool HasSideEffects = Record[0] & 1; 25233861d79fSDimitry Andric bool IsAlignStack = (Record[0] >> 1) & 1; 25243861d79fSDimitry Andric unsigned AsmDialect = Record[0] >> 2; 25253861d79fSDimitry Andric unsigned AsmStrSize = Record[1]; 25263861d79fSDimitry Andric if (2+AsmStrSize >= Record.size()) 25278f0fd8f6SDimitry Andric return error("Invalid record"); 25283861d79fSDimitry Andric unsigned ConstStrSize = Record[2+AsmStrSize]; 25293861d79fSDimitry Andric if (3+AsmStrSize+ConstStrSize > Record.size()) 25308f0fd8f6SDimitry Andric return error("Invalid record"); 25313861d79fSDimitry Andric 25323861d79fSDimitry Andric for (unsigned i = 0; i != AsmStrSize; ++i) 25333861d79fSDimitry Andric AsmStr += (char)Record[2+i]; 25343861d79fSDimitry Andric for (unsigned i = 0; i != ConstStrSize; ++i) 25353861d79fSDimitry Andric ConstrStr += (char)Record[3+AsmStrSize+i]; 25363861d79fSDimitry Andric PointerType *PTy = cast<PointerType>(CurTy); 25373861d79fSDimitry Andric V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), 25383861d79fSDimitry Andric AsmStr, ConstrStr, HasSideEffects, IsAlignStack, 25393861d79fSDimitry Andric InlineAsm::AsmDialect(AsmDialect)); 25403861d79fSDimitry Andric break; 25413861d79fSDimitry Andric } 2542f22ef01cSRoman Divacky case bitc::CST_CODE_BLOCKADDRESS:{ 2543f785676fSDimitry Andric if (Record.size() < 3) 25448f0fd8f6SDimitry Andric return error("Invalid record"); 25456122f3e6SDimitry Andric Type *FnTy = getTypeByID(Record[0]); 254691bc56edSDimitry Andric if (!FnTy) 25478f0fd8f6SDimitry Andric return error("Invalid record"); 2548f22ef01cSRoman Divacky Function *Fn = 2549f22ef01cSRoman Divacky dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy)); 255091bc56edSDimitry Andric if (!Fn) 25518f0fd8f6SDimitry Andric return error("Invalid record"); 255239d628a0SDimitry Andric 255339d628a0SDimitry Andric // Don't let Fn get dematerialized. 255439d628a0SDimitry Andric BlockAddressesTaken.insert(Fn); 2555f22ef01cSRoman Divacky 25563861d79fSDimitry Andric // If the function is already parsed we can insert the block address right 25573861d79fSDimitry Andric // away. 255839d628a0SDimitry Andric BasicBlock *BB; 255939d628a0SDimitry Andric unsigned BBID = Record[2]; 256039d628a0SDimitry Andric if (!BBID) 256139d628a0SDimitry Andric // Invalid reference to entry block. 25628f0fd8f6SDimitry Andric return error("Invalid ID"); 25633861d79fSDimitry Andric if (!Fn->empty()) { 25643861d79fSDimitry Andric Function::iterator BBI = Fn->begin(), BBE = Fn->end(); 256539d628a0SDimitry Andric for (size_t I = 0, E = BBID; I != E; ++I) { 25663861d79fSDimitry Andric if (BBI == BBE) 25678f0fd8f6SDimitry Andric return error("Invalid ID"); 25683861d79fSDimitry Andric ++BBI; 25693861d79fSDimitry Andric } 257039d628a0SDimitry Andric BB = BBI; 25713861d79fSDimitry Andric } else { 25723861d79fSDimitry Andric // Otherwise insert a placeholder and remember it so it can be inserted 25733861d79fSDimitry Andric // when the function is parsed. 257439d628a0SDimitry Andric auto &FwdBBs = BasicBlockFwdRefs[Fn]; 257539d628a0SDimitry Andric if (FwdBBs.empty()) 257639d628a0SDimitry Andric BasicBlockFwdRefQueue.push_back(Fn); 257739d628a0SDimitry Andric if (FwdBBs.size() < BBID + 1) 257839d628a0SDimitry Andric FwdBBs.resize(BBID + 1); 257939d628a0SDimitry Andric if (!FwdBBs[BBID]) 258039d628a0SDimitry Andric FwdBBs[BBID] = BasicBlock::Create(Context); 258139d628a0SDimitry Andric BB = FwdBBs[BBID]; 25823861d79fSDimitry Andric } 258339d628a0SDimitry Andric V = BlockAddress::get(Fn, BB); 2584f22ef01cSRoman Divacky break; 2585f22ef01cSRoman Divacky } 2586f22ef01cSRoman Divacky } 2587f22ef01cSRoman Divacky 25888f0fd8f6SDimitry Andric ValueList.assignValue(V, NextCstNo); 2589f22ef01cSRoman Divacky ++NextCstNo; 2590f22ef01cSRoman Divacky } 2591f22ef01cSRoman Divacky } 2592f22ef01cSRoman Divacky 25938f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseUseLists() { 2594dff0c46cSDimitry Andric if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID)) 25958f0fd8f6SDimitry Andric return error("Invalid record"); 2596dff0c46cSDimitry Andric 2597dff0c46cSDimitry Andric // Read all the records. 259839d628a0SDimitry Andric SmallVector<uint64_t, 64> Record; 2599dff0c46cSDimitry Andric while (1) { 2600139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 2601139f7f9bSDimitry Andric 2602139f7f9bSDimitry Andric switch (Entry.Kind) { 2603139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 2604139f7f9bSDimitry Andric case BitstreamEntry::Error: 26058f0fd8f6SDimitry Andric return error("Malformed block"); 2606139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 260791bc56edSDimitry Andric return std::error_code(); 2608139f7f9bSDimitry Andric case BitstreamEntry::Record: 2609139f7f9bSDimitry Andric // The interesting case. 2610139f7f9bSDimitry Andric break; 2611dff0c46cSDimitry Andric } 2612dff0c46cSDimitry Andric 2613dff0c46cSDimitry Andric // Read a use list record. 2614dff0c46cSDimitry Andric Record.clear(); 261539d628a0SDimitry Andric bool IsBB = false; 2616139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2617dff0c46cSDimitry Andric default: // Default behavior: unknown type. 2618dff0c46cSDimitry Andric break; 261939d628a0SDimitry Andric case bitc::USELIST_CODE_BB: 262039d628a0SDimitry Andric IsBB = true; 262139d628a0SDimitry Andric // fallthrough 262239d628a0SDimitry Andric case bitc::USELIST_CODE_DEFAULT: { 2623dff0c46cSDimitry Andric unsigned RecordLength = Record.size(); 262439d628a0SDimitry Andric if (RecordLength < 3) 262539d628a0SDimitry Andric // Records should have at least an ID and two indexes. 26268f0fd8f6SDimitry Andric return error("Invalid record"); 262739d628a0SDimitry Andric unsigned ID = Record.back(); 262839d628a0SDimitry Andric Record.pop_back(); 262939d628a0SDimitry Andric 263039d628a0SDimitry Andric Value *V; 263139d628a0SDimitry Andric if (IsBB) { 263239d628a0SDimitry Andric assert(ID < FunctionBBs.size() && "Basic block not found"); 263339d628a0SDimitry Andric V = FunctionBBs[ID]; 263439d628a0SDimitry Andric } else 263539d628a0SDimitry Andric V = ValueList[ID]; 263639d628a0SDimitry Andric unsigned NumUses = 0; 263739d628a0SDimitry Andric SmallDenseMap<const Use *, unsigned, 16> Order; 263839d628a0SDimitry Andric for (const Use &U : V->uses()) { 263939d628a0SDimitry Andric if (++NumUses > Record.size()) 264039d628a0SDimitry Andric break; 264139d628a0SDimitry Andric Order[&U] = Record[NumUses - 1]; 264239d628a0SDimitry Andric } 264339d628a0SDimitry Andric if (Order.size() != Record.size() || NumUses > Record.size()) 264439d628a0SDimitry Andric // Mismatches can happen if the functions are being materialized lazily 264539d628a0SDimitry Andric // (out-of-order), or a value has been upgraded. 264639d628a0SDimitry Andric break; 264739d628a0SDimitry Andric 264839d628a0SDimitry Andric V->sortUseList([&](const Use &L, const Use &R) { 264939d628a0SDimitry Andric return Order.lookup(&L) < Order.lookup(&R); 265039d628a0SDimitry Andric }); 2651dff0c46cSDimitry Andric break; 2652dff0c46cSDimitry Andric } 2653dff0c46cSDimitry Andric } 2654dff0c46cSDimitry Andric } 2655dff0c46cSDimitry Andric } 2656dff0c46cSDimitry Andric 2657ff0cc061SDimitry Andric /// When we see the block for metadata, remember where it is and then skip it. 2658ff0cc061SDimitry Andric /// This lets us lazily deserialize the metadata. 2659ff0cc061SDimitry Andric std::error_code BitcodeReader::rememberAndSkipMetadata() { 2660ff0cc061SDimitry Andric // Save the current stream state. 2661ff0cc061SDimitry Andric uint64_t CurBit = Stream.GetCurrentBitNo(); 2662ff0cc061SDimitry Andric DeferredMetadataInfo.push_back(CurBit); 2663ff0cc061SDimitry Andric 2664ff0cc061SDimitry Andric // Skip over the block for now. 2665ff0cc061SDimitry Andric if (Stream.SkipBlock()) 26668f0fd8f6SDimitry Andric return error("Invalid record"); 2667ff0cc061SDimitry Andric return std::error_code(); 2668ff0cc061SDimitry Andric } 2669ff0cc061SDimitry Andric 2670ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeMetadata() { 2671ff0cc061SDimitry Andric for (uint64_t BitPos : DeferredMetadataInfo) { 2672ff0cc061SDimitry Andric // Move the bit stream to the saved position. 2673ff0cc061SDimitry Andric Stream.JumpToBit(BitPos); 26748f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 2675ff0cc061SDimitry Andric return EC; 2676ff0cc061SDimitry Andric } 2677ff0cc061SDimitry Andric DeferredMetadataInfo.clear(); 2678ff0cc061SDimitry Andric return std::error_code(); 2679ff0cc061SDimitry Andric } 2680ff0cc061SDimitry Andric 2681ff0cc061SDimitry Andric void BitcodeReader::setStripDebugInfo() { StripDebugInfo = true; } 2682ff0cc061SDimitry Andric 26838f0fd8f6SDimitry Andric /// When we see the block for a function body, remember where it is and then 26848f0fd8f6SDimitry Andric /// skip it. This lets us lazily deserialize the functions. 26858f0fd8f6SDimitry Andric std::error_code BitcodeReader::rememberAndSkipFunctionBody() { 2686f22ef01cSRoman Divacky // Get the function we are talking about. 2687f22ef01cSRoman Divacky if (FunctionsWithBodies.empty()) 26888f0fd8f6SDimitry Andric return error("Insufficient function protos"); 2689f22ef01cSRoman Divacky 2690f22ef01cSRoman Divacky Function *Fn = FunctionsWithBodies.back(); 2691f22ef01cSRoman Divacky FunctionsWithBodies.pop_back(); 2692f22ef01cSRoman Divacky 2693f22ef01cSRoman Divacky // Save the current stream state. 2694f22ef01cSRoman Divacky uint64_t CurBit = Stream.GetCurrentBitNo(); 2695f22ef01cSRoman Divacky DeferredFunctionInfo[Fn] = CurBit; 2696f22ef01cSRoman Divacky 2697f22ef01cSRoman Divacky // Skip over the function block for now. 2698f22ef01cSRoman Divacky if (Stream.SkipBlock()) 26998f0fd8f6SDimitry Andric return error("Invalid record"); 270091bc56edSDimitry Andric return std::error_code(); 2701f22ef01cSRoman Divacky } 2702f22ef01cSRoman Divacky 27038f0fd8f6SDimitry Andric std::error_code BitcodeReader::globalCleanup() { 2704f22ef01cSRoman Divacky // Patch the initializers for globals and aliases up. 27058f0fd8f6SDimitry Andric resolveGlobalAndAliasInits(); 2706f22ef01cSRoman Divacky if (!GlobalInits.empty() || !AliasInits.empty()) 27078f0fd8f6SDimitry Andric return error("Malformed global initializer set"); 2708f22ef01cSRoman Divacky 2709f22ef01cSRoman Divacky // Look for intrinsic functions which need to be upgraded at some point 27108f0fd8f6SDimitry Andric for (Function &F : *TheModule) { 2711f22ef01cSRoman Divacky Function *NewFn; 27128f0fd8f6SDimitry Andric if (UpgradeIntrinsicFunction(&F, NewFn)) 27133dac3a9bSDimitry Andric UpgradedIntrinsics[&F] = NewFn; 2714f22ef01cSRoman Divacky } 2715f22ef01cSRoman Divacky 2716e580952dSDimitry Andric // Look for global variables which need to be renamed. 27178f0fd8f6SDimitry Andric for (GlobalVariable &GV : TheModule->globals()) 27188f0fd8f6SDimitry Andric UpgradeGlobalVariable(&GV); 271991bc56edSDimitry Andric 2720f22ef01cSRoman Divacky // Force deallocation of memory for these vectors to favor the client that 2721f22ef01cSRoman Divacky // want lazy deserialization. 2722f22ef01cSRoman Divacky std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); 2723f22ef01cSRoman Divacky std::vector<std::pair<GlobalAlias*, unsigned> >().swap(AliasInits); 272491bc56edSDimitry Andric return std::error_code(); 2725f22ef01cSRoman Divacky } 2726f22ef01cSRoman Divacky 27278f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseModule(bool Resume, 2728ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata) { 2729dff0c46cSDimitry Andric if (Resume) 2730dff0c46cSDimitry Andric Stream.JumpToBit(NextUnreadBit); 2731dff0c46cSDimitry Andric else if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 27328f0fd8f6SDimitry Andric return error("Invalid record"); 2733dff0c46cSDimitry Andric 2734dff0c46cSDimitry Andric SmallVector<uint64_t, 64> Record; 2735dff0c46cSDimitry Andric std::vector<std::string> SectionTable; 2736dff0c46cSDimitry Andric std::vector<std::string> GCTable; 2737dff0c46cSDimitry Andric 2738dff0c46cSDimitry Andric // Read all the records for this module. 2739139f7f9bSDimitry Andric while (1) { 2740139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 2741dff0c46cSDimitry Andric 2742139f7f9bSDimitry Andric switch (Entry.Kind) { 2743139f7f9bSDimitry Andric case BitstreamEntry::Error: 27448f0fd8f6SDimitry Andric return error("Malformed block"); 2745139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 27468f0fd8f6SDimitry Andric return globalCleanup(); 2747dff0c46cSDimitry Andric 2748139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 2749139f7f9bSDimitry Andric switch (Entry.ID) { 2750f22ef01cSRoman Divacky default: // Skip unknown content. 2751f22ef01cSRoman Divacky if (Stream.SkipBlock()) 27528f0fd8f6SDimitry Andric return error("Invalid record"); 2753f22ef01cSRoman Divacky break; 2754f22ef01cSRoman Divacky case bitc::BLOCKINFO_BLOCK_ID: 2755f22ef01cSRoman Divacky if (Stream.ReadBlockInfoBlock()) 27568f0fd8f6SDimitry Andric return error("Malformed block"); 2757f22ef01cSRoman Divacky break; 2758f22ef01cSRoman Divacky case bitc::PARAMATTR_BLOCK_ID: 27598f0fd8f6SDimitry Andric if (std::error_code EC = parseAttributeBlock()) 2760f785676fSDimitry Andric return EC; 2761f22ef01cSRoman Divacky break; 2762139f7f9bSDimitry Andric case bitc::PARAMATTR_GROUP_BLOCK_ID: 27638f0fd8f6SDimitry Andric if (std::error_code EC = parseAttributeGroupBlock()) 2764f785676fSDimitry Andric return EC; 2765139f7f9bSDimitry Andric break; 276617a519f9SDimitry Andric case bitc::TYPE_BLOCK_ID_NEW: 27678f0fd8f6SDimitry Andric if (std::error_code EC = parseTypeTable()) 2768f785676fSDimitry Andric return EC; 2769f22ef01cSRoman Divacky break; 2770f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 27718f0fd8f6SDimitry Andric if (std::error_code EC = parseValueSymbolTable()) 2772f785676fSDimitry Andric return EC; 2773dff0c46cSDimitry Andric SeenValueSymbolTable = true; 2774f22ef01cSRoman Divacky break; 2775f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 27768f0fd8f6SDimitry Andric if (std::error_code EC = parseConstants()) 2777f785676fSDimitry Andric return EC; 27788f0fd8f6SDimitry Andric if (std::error_code EC = resolveGlobalAndAliasInits()) 2779f785676fSDimitry Andric return EC; 2780f22ef01cSRoman Divacky break; 2781f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 2782ff0cc061SDimitry Andric if (ShouldLazyLoadMetadata && !IsMetadataMaterialized) { 2783ff0cc061SDimitry Andric if (std::error_code EC = rememberAndSkipMetadata()) 2784ff0cc061SDimitry Andric return EC; 2785ff0cc061SDimitry Andric break; 2786ff0cc061SDimitry Andric } 2787ff0cc061SDimitry Andric assert(DeferredMetadataInfo.empty() && "Unexpected deferred metadata"); 27888f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 2789f785676fSDimitry Andric return EC; 2790f22ef01cSRoman Divacky break; 2791f22ef01cSRoman Divacky case bitc::FUNCTION_BLOCK_ID: 2792f22ef01cSRoman Divacky // If this is the first function body we've seen, reverse the 2793f22ef01cSRoman Divacky // FunctionsWithBodies list. 2794dff0c46cSDimitry Andric if (!SeenFirstFunctionBody) { 2795f22ef01cSRoman Divacky std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); 27968f0fd8f6SDimitry Andric if (std::error_code EC = globalCleanup()) 2797f785676fSDimitry Andric return EC; 2798dff0c46cSDimitry Andric SeenFirstFunctionBody = true; 2799f22ef01cSRoman Divacky } 2800f22ef01cSRoman Divacky 28018f0fd8f6SDimitry Andric if (std::error_code EC = rememberAndSkipFunctionBody()) 2802f785676fSDimitry Andric return EC; 28033dac3a9bSDimitry Andric // Suspend parsing when we reach the function bodies. Subsequent 28043dac3a9bSDimitry Andric // materialization calls will resume it when necessary. If the bitcode 28053dac3a9bSDimitry Andric // file is old, the symbol table will be at the end instead and will not 28063dac3a9bSDimitry Andric // have been seen yet. In this case, just finish the parse now. 28073dac3a9bSDimitry Andric if (SeenValueSymbolTable) { 2808dff0c46cSDimitry Andric NextUnreadBit = Stream.GetCurrentBitNo(); 280991bc56edSDimitry Andric return std::error_code(); 2810dff0c46cSDimitry Andric } 2811dff0c46cSDimitry Andric break; 2812dff0c46cSDimitry Andric case bitc::USELIST_BLOCK_ID: 28138f0fd8f6SDimitry Andric if (std::error_code EC = parseUseLists()) 2814f785676fSDimitry Andric return EC; 2815f22ef01cSRoman Divacky break; 2816f22ef01cSRoman Divacky } 2817f22ef01cSRoman Divacky continue; 2818139f7f9bSDimitry Andric 2819139f7f9bSDimitry Andric case BitstreamEntry::Record: 2820139f7f9bSDimitry Andric // The interesting case. 2821139f7f9bSDimitry Andric break; 2822f22ef01cSRoman Divacky } 2823f22ef01cSRoman Divacky 2824f22ef01cSRoman Divacky 2825f22ef01cSRoman Divacky // Read a record. 2826139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 2827f22ef01cSRoman Divacky default: break; // Default behavior, ignore unknown content. 28283861d79fSDimitry Andric case bitc::MODULE_CODE_VERSION: { // VERSION: [version#] 2829f22ef01cSRoman Divacky if (Record.size() < 1) 28308f0fd8f6SDimitry Andric return error("Invalid record"); 28313861d79fSDimitry Andric // Only version #0 and #1 are supported so far. 28323861d79fSDimitry Andric unsigned module_version = Record[0]; 28333861d79fSDimitry Andric switch (module_version) { 2834f785676fSDimitry Andric default: 28358f0fd8f6SDimitry Andric return error("Invalid value"); 28363861d79fSDimitry Andric case 0: 28373861d79fSDimitry Andric UseRelativeIDs = false; 2838f22ef01cSRoman Divacky break; 28393861d79fSDimitry Andric case 1: 28403861d79fSDimitry Andric UseRelativeIDs = true; 28413861d79fSDimitry Andric break; 28423861d79fSDimitry Andric } 28433861d79fSDimitry Andric break; 28443861d79fSDimitry Andric } 2845f22ef01cSRoman Divacky case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 2846f22ef01cSRoman Divacky std::string S; 28478f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28488f0fd8f6SDimitry Andric return error("Invalid record"); 2849f22ef01cSRoman Divacky TheModule->setTargetTriple(S); 2850f22ef01cSRoman Divacky break; 2851f22ef01cSRoman Divacky } 2852f22ef01cSRoman Divacky case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strchr x N] 2853f22ef01cSRoman Divacky std::string S; 28548f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28558f0fd8f6SDimitry Andric return error("Invalid record"); 2856f22ef01cSRoman Divacky TheModule->setDataLayout(S); 2857f22ef01cSRoman Divacky break; 2858f22ef01cSRoman Divacky } 2859f22ef01cSRoman Divacky case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] 2860f22ef01cSRoman Divacky std::string S; 28618f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28628f0fd8f6SDimitry Andric return error("Invalid record"); 2863f22ef01cSRoman Divacky TheModule->setModuleInlineAsm(S); 2864f22ef01cSRoman Divacky break; 2865f22ef01cSRoman Divacky } 2866f22ef01cSRoman Divacky case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] 2867139f7f9bSDimitry Andric // FIXME: Remove in 4.0. 2868f22ef01cSRoman Divacky std::string S; 28698f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28708f0fd8f6SDimitry Andric return error("Invalid record"); 2871139f7f9bSDimitry Andric // Ignore value. 2872f22ef01cSRoman Divacky break; 2873f22ef01cSRoman Divacky } 2874f22ef01cSRoman Divacky case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strchr x N] 2875f22ef01cSRoman Divacky std::string S; 28768f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28778f0fd8f6SDimitry Andric return error("Invalid record"); 2878f22ef01cSRoman Divacky SectionTable.push_back(S); 2879f22ef01cSRoman Divacky break; 2880f22ef01cSRoman Divacky } 2881f22ef01cSRoman Divacky case bitc::MODULE_CODE_GCNAME: { // SECTIONNAME: [strchr x N] 2882f22ef01cSRoman Divacky std::string S; 28838f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 28848f0fd8f6SDimitry Andric return error("Invalid record"); 2885f22ef01cSRoman Divacky GCTable.push_back(S); 2886f22ef01cSRoman Divacky break; 2887f22ef01cSRoman Divacky } 288891bc56edSDimitry Andric case bitc::MODULE_CODE_COMDAT: { // COMDAT: [selection_kind, name] 288991bc56edSDimitry Andric if (Record.size() < 2) 28908f0fd8f6SDimitry Andric return error("Invalid record"); 289191bc56edSDimitry Andric Comdat::SelectionKind SK = getDecodedComdatSelectionKind(Record[0]); 289291bc56edSDimitry Andric unsigned ComdatNameSize = Record[1]; 289391bc56edSDimitry Andric std::string ComdatName; 289491bc56edSDimitry Andric ComdatName.reserve(ComdatNameSize); 289591bc56edSDimitry Andric for (unsigned i = 0; i != ComdatNameSize; ++i) 289691bc56edSDimitry Andric ComdatName += (char)Record[2 + i]; 289791bc56edSDimitry Andric Comdat *C = TheModule->getOrInsertComdat(ComdatName); 289891bc56edSDimitry Andric C->setSelectionKind(SK); 289991bc56edSDimitry Andric ComdatList.push_back(C); 290091bc56edSDimitry Andric break; 290191bc56edSDimitry Andric } 2902f22ef01cSRoman Divacky // GLOBALVAR: [pointer type, isconst, initid, 29032754fe60SDimitry Andric // linkage, alignment, section, visibility, threadlocal, 2904ff0cc061SDimitry Andric // unnamed_addr, externally_initialized, dllstorageclass, 2905ff0cc061SDimitry Andric // comdat] 2906f22ef01cSRoman Divacky case bitc::MODULE_CODE_GLOBALVAR: { 2907f22ef01cSRoman Divacky if (Record.size() < 6) 29088f0fd8f6SDimitry Andric return error("Invalid record"); 29096122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2910f785676fSDimitry Andric if (!Ty) 29118f0fd8f6SDimitry Andric return error("Invalid record"); 2912ff0cc061SDimitry Andric bool isConstant = Record[1] & 1; 2913ff0cc061SDimitry Andric bool explicitType = Record[1] & 2; 2914ff0cc061SDimitry Andric unsigned AddressSpace; 2915ff0cc061SDimitry Andric if (explicitType) { 2916ff0cc061SDimitry Andric AddressSpace = Record[1] >> 2; 2917ff0cc061SDimitry Andric } else { 2918f22ef01cSRoman Divacky if (!Ty->isPointerTy()) 29198f0fd8f6SDimitry Andric return error("Invalid type for value"); 2920ff0cc061SDimitry Andric AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); 2921f22ef01cSRoman Divacky Ty = cast<PointerType>(Ty)->getElementType(); 2922ff0cc061SDimitry Andric } 2923f22ef01cSRoman Divacky 2924ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 2925ff0cc061SDimitry Andric GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); 2926ff0cc061SDimitry Andric unsigned Alignment; 2927ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[4], Alignment)) 2928ff0cc061SDimitry Andric return EC; 2929f22ef01cSRoman Divacky std::string Section; 2930f22ef01cSRoman Divacky if (Record[5]) { 2931f22ef01cSRoman Divacky if (Record[5]-1 >= SectionTable.size()) 29328f0fd8f6SDimitry Andric return error("Invalid ID"); 2933f22ef01cSRoman Divacky Section = SectionTable[Record[5]-1]; 2934f22ef01cSRoman Divacky } 2935f22ef01cSRoman Divacky GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 293691bc56edSDimitry Andric // Local linkage must have default visibility. 293791bc56edSDimitry Andric if (Record.size() > 6 && !GlobalValue::isLocalLinkage(Linkage)) 293891bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 29398f0fd8f6SDimitry Andric Visibility = getDecodedVisibility(Record[6]); 29407ae0e2c9SDimitry Andric 29417ae0e2c9SDimitry Andric GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal; 2942f22ef01cSRoman Divacky if (Record.size() > 7) 29438f0fd8f6SDimitry Andric TLM = getDecodedThreadLocalMode(Record[7]); 2944f22ef01cSRoman Divacky 29452754fe60SDimitry Andric bool UnnamedAddr = false; 29462754fe60SDimitry Andric if (Record.size() > 8) 29472754fe60SDimitry Andric UnnamedAddr = Record[8]; 29482754fe60SDimitry Andric 2949139f7f9bSDimitry Andric bool ExternallyInitialized = false; 2950139f7f9bSDimitry Andric if (Record.size() > 9) 2951139f7f9bSDimitry Andric ExternallyInitialized = Record[9]; 2952139f7f9bSDimitry Andric 2953f22ef01cSRoman Divacky GlobalVariable *NewGV = 295491bc56edSDimitry Andric new GlobalVariable(*TheModule, Ty, isConstant, Linkage, nullptr, "", nullptr, 2955139f7f9bSDimitry Andric TLM, AddressSpace, ExternallyInitialized); 2956f22ef01cSRoman Divacky NewGV->setAlignment(Alignment); 2957f22ef01cSRoman Divacky if (!Section.empty()) 2958f22ef01cSRoman Divacky NewGV->setSection(Section); 2959f22ef01cSRoman Divacky NewGV->setVisibility(Visibility); 29602754fe60SDimitry Andric NewGV->setUnnamedAddr(UnnamedAddr); 2961f22ef01cSRoman Divacky 296291bc56edSDimitry Andric if (Record.size() > 10) 29638f0fd8f6SDimitry Andric NewGV->setDLLStorageClass(getDecodedDLLStorageClass(Record[10])); 296491bc56edSDimitry Andric else 29658f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(NewGV, RawLinkage); 296691bc56edSDimitry Andric 2967f22ef01cSRoman Divacky ValueList.push_back(NewGV); 2968f22ef01cSRoman Divacky 2969f22ef01cSRoman Divacky // Remember which value to use for the global initializer. 2970f22ef01cSRoman Divacky if (unsigned InitID = Record[2]) 2971f22ef01cSRoman Divacky GlobalInits.push_back(std::make_pair(NewGV, InitID-1)); 297291bc56edSDimitry Andric 2973ff0cc061SDimitry Andric if (Record.size() > 11) { 297491bc56edSDimitry Andric if (unsigned ComdatID = Record[11]) { 2975ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 29768f0fd8f6SDimitry Andric return error("Invalid global variable comdat ID"); 297791bc56edSDimitry Andric NewGV->setComdat(ComdatList[ComdatID - 1]); 297891bc56edSDimitry Andric } 2979ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 2980ff0cc061SDimitry Andric NewGV->setComdat(reinterpret_cast<Comdat *>(1)); 2981ff0cc061SDimitry Andric } 2982f22ef01cSRoman Divacky break; 2983f22ef01cSRoman Divacky } 2984f22ef01cSRoman Divacky // FUNCTION: [type, callingconv, isproto, linkage, paramattr, 298591bc56edSDimitry Andric // alignment, section, visibility, gc, unnamed_addr, 298639d628a0SDimitry Andric // prologuedata, dllstorageclass, comdat, prefixdata] 2987f22ef01cSRoman Divacky case bitc::MODULE_CODE_FUNCTION: { 2988f22ef01cSRoman Divacky if (Record.size() < 8) 29898f0fd8f6SDimitry Andric return error("Invalid record"); 29906122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 2991f785676fSDimitry Andric if (!Ty) 29928f0fd8f6SDimitry Andric return error("Invalid record"); 2993ff0cc061SDimitry Andric if (auto *PTy = dyn_cast<PointerType>(Ty)) 2994ff0cc061SDimitry Andric Ty = PTy->getElementType(); 2995ff0cc061SDimitry Andric auto *FTy = dyn_cast<FunctionType>(Ty); 2996f22ef01cSRoman Divacky if (!FTy) 29978f0fd8f6SDimitry Andric return error("Invalid type for value"); 2998f22ef01cSRoman Divacky 2999f22ef01cSRoman Divacky Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, 3000f22ef01cSRoman Divacky "", TheModule); 3001f22ef01cSRoman Divacky 3002f22ef01cSRoman Divacky Func->setCallingConv(static_cast<CallingConv::ID>(Record[1])); 3003f22ef01cSRoman Divacky bool isProto = Record[2]; 3004ff0cc061SDimitry Andric uint64_t RawLinkage = Record[3]; 3005ff0cc061SDimitry Andric Func->setLinkage(getDecodedLinkage(RawLinkage)); 3006f22ef01cSRoman Divacky Func->setAttributes(getAttributes(Record[4])); 3007f22ef01cSRoman Divacky 3008ff0cc061SDimitry Andric unsigned Alignment; 3009ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[5], Alignment)) 3010ff0cc061SDimitry Andric return EC; 3011ff0cc061SDimitry Andric Func->setAlignment(Alignment); 3012f22ef01cSRoman Divacky if (Record[6]) { 3013f22ef01cSRoman Divacky if (Record[6]-1 >= SectionTable.size()) 30148f0fd8f6SDimitry Andric return error("Invalid ID"); 3015f22ef01cSRoman Divacky Func->setSection(SectionTable[Record[6]-1]); 3016f22ef01cSRoman Divacky } 301791bc56edSDimitry Andric // Local linkage must have default visibility. 301891bc56edSDimitry Andric if (!Func->hasLocalLinkage()) 301991bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 30208f0fd8f6SDimitry Andric Func->setVisibility(getDecodedVisibility(Record[7])); 3021f22ef01cSRoman Divacky if (Record.size() > 8 && Record[8]) { 3022ff0cc061SDimitry Andric if (Record[8]-1 >= GCTable.size()) 30238f0fd8f6SDimitry Andric return error("Invalid ID"); 3024f22ef01cSRoman Divacky Func->setGC(GCTable[Record[8]-1].c_str()); 3025f22ef01cSRoman Divacky } 30262754fe60SDimitry Andric bool UnnamedAddr = false; 30272754fe60SDimitry Andric if (Record.size() > 9) 30282754fe60SDimitry Andric UnnamedAddr = Record[9]; 30292754fe60SDimitry Andric Func->setUnnamedAddr(UnnamedAddr); 3030f785676fSDimitry Andric if (Record.size() > 10 && Record[10] != 0) 303139d628a0SDimitry Andric FunctionPrologues.push_back(std::make_pair(Func, Record[10]-1)); 303291bc56edSDimitry Andric 303391bc56edSDimitry Andric if (Record.size() > 11) 30348f0fd8f6SDimitry Andric Func->setDLLStorageClass(getDecodedDLLStorageClass(Record[11])); 303591bc56edSDimitry Andric else 30368f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(Func, RawLinkage); 303791bc56edSDimitry Andric 3038ff0cc061SDimitry Andric if (Record.size() > 12) { 303991bc56edSDimitry Andric if (unsigned ComdatID = Record[12]) { 3040ff0cc061SDimitry Andric if (ComdatID > ComdatList.size()) 30418f0fd8f6SDimitry Andric return error("Invalid function comdat ID"); 304291bc56edSDimitry Andric Func->setComdat(ComdatList[ComdatID - 1]); 304391bc56edSDimitry Andric } 3044ff0cc061SDimitry Andric } else if (hasImplicitComdat(RawLinkage)) { 3045ff0cc061SDimitry Andric Func->setComdat(reinterpret_cast<Comdat *>(1)); 3046ff0cc061SDimitry Andric } 304791bc56edSDimitry Andric 304839d628a0SDimitry Andric if (Record.size() > 13 && Record[13] != 0) 304939d628a0SDimitry Andric FunctionPrefixes.push_back(std::make_pair(Func, Record[13]-1)); 305039d628a0SDimitry Andric 30518f0fd8f6SDimitry Andric if (Record.size() > 14 && Record[14] != 0) 30528f0fd8f6SDimitry Andric FunctionPersonalityFns.push_back(std::make_pair(Func, Record[14] - 1)); 30538f0fd8f6SDimitry Andric 3054f22ef01cSRoman Divacky ValueList.push_back(Func); 3055f22ef01cSRoman Divacky 3056f22ef01cSRoman Divacky // If this is a function with a body, remember the prototype we are 3057f22ef01cSRoman Divacky // creating now, so that we can match up the body with them later. 3058dff0c46cSDimitry Andric if (!isProto) { 305939d628a0SDimitry Andric Func->setIsMaterializable(true); 3060f22ef01cSRoman Divacky FunctionsWithBodies.push_back(Func); 306139d628a0SDimitry Andric DeferredFunctionInfo[Func] = 0; 3062dff0c46cSDimitry Andric } 3063f22ef01cSRoman Divacky break; 3064f22ef01cSRoman Divacky } 3065f22ef01cSRoman Divacky // ALIAS: [alias type, aliasee val#, linkage] 306691bc56edSDimitry Andric // ALIAS: [alias type, aliasee val#, linkage, visibility, dllstorageclass] 3067f22ef01cSRoman Divacky case bitc::MODULE_CODE_ALIAS: { 3068f22ef01cSRoman Divacky if (Record.size() < 3) 30698f0fd8f6SDimitry Andric return error("Invalid record"); 30706122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3071f785676fSDimitry Andric if (!Ty) 30728f0fd8f6SDimitry Andric return error("Invalid record"); 307391bc56edSDimitry Andric auto *PTy = dyn_cast<PointerType>(Ty); 307491bc56edSDimitry Andric if (!PTy) 30758f0fd8f6SDimitry Andric return error("Invalid type for value"); 3076f22ef01cSRoman Divacky 307791bc56edSDimitry Andric auto *NewGA = 3078ff0cc061SDimitry Andric GlobalAlias::create(PTy, getDecodedLinkage(Record[2]), "", TheModule); 3079f22ef01cSRoman Divacky // Old bitcode files didn't have visibility field. 308091bc56edSDimitry Andric // Local linkage must have default visibility. 308191bc56edSDimitry Andric if (Record.size() > 3 && !NewGA->hasLocalLinkage()) 308291bc56edSDimitry Andric // FIXME: Change to an error if non-default in 4.0. 30838f0fd8f6SDimitry Andric NewGA->setVisibility(getDecodedVisibility(Record[3])); 308491bc56edSDimitry Andric if (Record.size() > 4) 30858f0fd8f6SDimitry Andric NewGA->setDLLStorageClass(getDecodedDLLStorageClass(Record[4])); 308691bc56edSDimitry Andric else 30878f0fd8f6SDimitry Andric upgradeDLLImportExportLinkage(NewGA, Record[2]); 308891bc56edSDimitry Andric if (Record.size() > 5) 30898f0fd8f6SDimitry Andric NewGA->setThreadLocalMode(getDecodedThreadLocalMode(Record[5])); 309091bc56edSDimitry Andric if (Record.size() > 6) 309191bc56edSDimitry Andric NewGA->setUnnamedAddr(Record[6]); 3092f22ef01cSRoman Divacky ValueList.push_back(NewGA); 3093f22ef01cSRoman Divacky AliasInits.push_back(std::make_pair(NewGA, Record[1])); 3094f22ef01cSRoman Divacky break; 3095f22ef01cSRoman Divacky } 3096f22ef01cSRoman Divacky /// MODULE_CODE_PURGEVALS: [numvals] 3097f22ef01cSRoman Divacky case bitc::MODULE_CODE_PURGEVALS: 3098f22ef01cSRoman Divacky // Trim down the value list to the specified size. 3099f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] > ValueList.size()) 31008f0fd8f6SDimitry Andric return error("Invalid record"); 3101f22ef01cSRoman Divacky ValueList.shrinkTo(Record[0]); 3102f22ef01cSRoman Divacky break; 3103f22ef01cSRoman Divacky } 3104f22ef01cSRoman Divacky Record.clear(); 3105f22ef01cSRoman Divacky } 3106f22ef01cSRoman Divacky } 3107f22ef01cSRoman Divacky 31088f0fd8f6SDimitry Andric std::error_code 31098f0fd8f6SDimitry Andric BitcodeReader::parseBitcodeInto(std::unique_ptr<DataStreamer> Streamer, 31108f0fd8f6SDimitry Andric Module *M, bool ShouldLazyLoadMetadata) { 31118f0fd8f6SDimitry Andric TheModule = M; 3112f22ef01cSRoman Divacky 31138f0fd8f6SDimitry Andric if (std::error_code EC = initStream(std::move(Streamer))) 3114f785676fSDimitry Andric return EC; 3115f22ef01cSRoman Divacky 3116f22ef01cSRoman Divacky // Sniff for the signature. 3117f22ef01cSRoman Divacky if (Stream.Read(8) != 'B' || 3118f22ef01cSRoman Divacky Stream.Read(8) != 'C' || 3119f22ef01cSRoman Divacky Stream.Read(4) != 0x0 || 3120f22ef01cSRoman Divacky Stream.Read(4) != 0xC || 3121f22ef01cSRoman Divacky Stream.Read(4) != 0xE || 3122f22ef01cSRoman Divacky Stream.Read(4) != 0xD) 31238f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 3124f22ef01cSRoman Divacky 3125f22ef01cSRoman Divacky // We expect a number of well-defined blocks, though we don't necessarily 3126f22ef01cSRoman Divacky // need to understand them all. 3127139f7f9bSDimitry Andric while (1) { 3128ff0cc061SDimitry Andric if (Stream.AtEndOfStream()) { 3129ff0cc061SDimitry Andric // We didn't really read a proper Module. 31308f0fd8f6SDimitry Andric return error("Malformed IR file"); 3131ff0cc061SDimitry Andric } 3132bd5abe19SDimitry Andric 3133139f7f9bSDimitry Andric BitstreamEntry Entry = 3134139f7f9bSDimitry Andric Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); 3135f22ef01cSRoman Divacky 31368f0fd8f6SDimitry Andric if (Entry.Kind != BitstreamEntry::SubBlock) 31378f0fd8f6SDimitry Andric return error("Malformed block"); 3138f22ef01cSRoman Divacky 31398f0fd8f6SDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 31408f0fd8f6SDimitry Andric return parseModule(false, ShouldLazyLoadMetadata); 31418f0fd8f6SDimitry Andric 3142f22ef01cSRoman Divacky if (Stream.SkipBlock()) 31438f0fd8f6SDimitry Andric return error("Invalid record"); 3144139f7f9bSDimitry Andric } 3145f22ef01cSRoman Divacky } 3146f22ef01cSRoman Divacky 314791bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseModuleTriple() { 31482754fe60SDimitry Andric if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID)) 31498f0fd8f6SDimitry Andric return error("Invalid record"); 31502754fe60SDimitry Andric 31512754fe60SDimitry Andric SmallVector<uint64_t, 64> Record; 31522754fe60SDimitry Andric 315391bc56edSDimitry Andric std::string Triple; 31542754fe60SDimitry Andric // Read all the records for this module. 3155139f7f9bSDimitry Andric while (1) { 3156139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 31572754fe60SDimitry Andric 3158139f7f9bSDimitry Andric switch (Entry.Kind) { 3159139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3160139f7f9bSDimitry Andric case BitstreamEntry::Error: 31618f0fd8f6SDimitry Andric return error("Malformed block"); 3162139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 316391bc56edSDimitry Andric return Triple; 3164139f7f9bSDimitry Andric case BitstreamEntry::Record: 3165139f7f9bSDimitry Andric // The interesting case. 31662754fe60SDimitry Andric break; 31672754fe60SDimitry Andric } 31682754fe60SDimitry Andric 31692754fe60SDimitry Andric // Read a record. 3170139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 31712754fe60SDimitry Andric default: break; // Default behavior, ignore unknown content. 31722754fe60SDimitry Andric case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N] 31732754fe60SDimitry Andric std::string S; 31748f0fd8f6SDimitry Andric if (convertToString(Record, 0, S)) 31758f0fd8f6SDimitry Andric return error("Invalid record"); 31762754fe60SDimitry Andric Triple = S; 31772754fe60SDimitry Andric break; 31782754fe60SDimitry Andric } 31792754fe60SDimitry Andric } 31802754fe60SDimitry Andric Record.clear(); 31812754fe60SDimitry Andric } 318291bc56edSDimitry Andric llvm_unreachable("Exit infinite loop"); 31832754fe60SDimitry Andric } 31842754fe60SDimitry Andric 318591bc56edSDimitry Andric ErrorOr<std::string> BitcodeReader::parseTriple() { 31868f0fd8f6SDimitry Andric if (std::error_code EC = initStream(nullptr)) 3187f785676fSDimitry Andric return EC; 31882754fe60SDimitry Andric 31892754fe60SDimitry Andric // Sniff for the signature. 31902754fe60SDimitry Andric if (Stream.Read(8) != 'B' || 31912754fe60SDimitry Andric Stream.Read(8) != 'C' || 31922754fe60SDimitry Andric Stream.Read(4) != 0x0 || 31932754fe60SDimitry Andric Stream.Read(4) != 0xC || 31942754fe60SDimitry Andric Stream.Read(4) != 0xE || 31952754fe60SDimitry Andric Stream.Read(4) != 0xD) 31968f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 31972754fe60SDimitry Andric 31982754fe60SDimitry Andric // We expect a number of well-defined blocks, though we don't necessarily 31992754fe60SDimitry Andric // need to understand them all. 3200139f7f9bSDimitry Andric while (1) { 3201139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 32022754fe60SDimitry Andric 3203139f7f9bSDimitry Andric switch (Entry.Kind) { 3204139f7f9bSDimitry Andric case BitstreamEntry::Error: 32058f0fd8f6SDimitry Andric return error("Malformed block"); 3206139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 320791bc56edSDimitry Andric return std::error_code(); 3208139f7f9bSDimitry Andric 3209139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3210139f7f9bSDimitry Andric if (Entry.ID == bitc::MODULE_BLOCK_ID) 321191bc56edSDimitry Andric return parseModuleTriple(); 3212139f7f9bSDimitry Andric 3213139f7f9bSDimitry Andric // Ignore other sub-blocks. 3214f785676fSDimitry Andric if (Stream.SkipBlock()) 32158f0fd8f6SDimitry Andric return error("Malformed block"); 3216139f7f9bSDimitry Andric continue; 3217139f7f9bSDimitry Andric 3218139f7f9bSDimitry Andric case BitstreamEntry::Record: 3219139f7f9bSDimitry Andric Stream.skipRecord(Entry.ID); 3220139f7f9bSDimitry Andric continue; 3221139f7f9bSDimitry Andric } 3222139f7f9bSDimitry Andric } 32232754fe60SDimitry Andric } 32242754fe60SDimitry Andric 32258f0fd8f6SDimitry Andric /// Parse metadata attachments. 32268f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseMetadataAttachment(Function &F) { 3227f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 32288f0fd8f6SDimitry Andric return error("Invalid record"); 3229f22ef01cSRoman Divacky 3230f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3231f22ef01cSRoman Divacky while (1) { 3232139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3233139f7f9bSDimitry Andric 3234139f7f9bSDimitry Andric switch (Entry.Kind) { 3235139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 3236139f7f9bSDimitry Andric case BitstreamEntry::Error: 32378f0fd8f6SDimitry Andric return error("Malformed block"); 3238139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 323991bc56edSDimitry Andric return std::error_code(); 3240139f7f9bSDimitry Andric case BitstreamEntry::Record: 3241139f7f9bSDimitry Andric // The interesting case. 3242f22ef01cSRoman Divacky break; 3243f22ef01cSRoman Divacky } 3244139f7f9bSDimitry Andric 3245f22ef01cSRoman Divacky // Read a metadata attachment record. 3246f22ef01cSRoman Divacky Record.clear(); 3247139f7f9bSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) { 3248f22ef01cSRoman Divacky default: // Default behavior: ignore. 3249f22ef01cSRoman Divacky break; 325017a519f9SDimitry Andric case bitc::METADATA_ATTACHMENT: { 3251f22ef01cSRoman Divacky unsigned RecordLength = Record.size(); 3252ff0cc061SDimitry Andric if (Record.empty()) 32538f0fd8f6SDimitry Andric return error("Invalid record"); 3254ff0cc061SDimitry Andric if (RecordLength % 2 == 0) { 3255ff0cc061SDimitry Andric // A function attachment. 3256ff0cc061SDimitry Andric for (unsigned I = 0; I != RecordLength; I += 2) { 3257ff0cc061SDimitry Andric auto K = MDKindMap.find(Record[I]); 3258ff0cc061SDimitry Andric if (K == MDKindMap.end()) 32598f0fd8f6SDimitry Andric return error("Invalid ID"); 3260ff0cc061SDimitry Andric Metadata *MD = MDValueList.getValueFwdRef(Record[I + 1]); 3261ff0cc061SDimitry Andric F.setMetadata(K->second, cast<MDNode>(MD)); 3262ff0cc061SDimitry Andric } 3263ff0cc061SDimitry Andric continue; 3264ff0cc061SDimitry Andric } 3265ff0cc061SDimitry Andric 3266ff0cc061SDimitry Andric // An instruction attachment. 3267f22ef01cSRoman Divacky Instruction *Inst = InstructionList[Record[0]]; 3268f22ef01cSRoman Divacky for (unsigned i = 1; i != RecordLength; i = i+2) { 3269f22ef01cSRoman Divacky unsigned Kind = Record[i]; 3270e580952dSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = 3271e580952dSDimitry Andric MDKindMap.find(Kind); 3272e580952dSDimitry Andric if (I == MDKindMap.end()) 32738f0fd8f6SDimitry Andric return error("Invalid ID"); 327439d628a0SDimitry Andric Metadata *Node = MDValueList.getValueFwdRef(Record[i + 1]); 327539d628a0SDimitry Andric if (isa<LocalAsMetadata>(Node)) 327639d628a0SDimitry Andric // Drop the attachment. This used to be legal, but there's no 327739d628a0SDimitry Andric // upgrade path. 327839d628a0SDimitry Andric break; 3279e580952dSDimitry Andric Inst->setMetadata(I->second, cast<MDNode>(Node)); 3280f785676fSDimitry Andric if (I->second == LLVMContext::MD_tbaa) 3281f785676fSDimitry Andric InstsWithTBAATag.push_back(Inst); 3282f22ef01cSRoman Divacky } 3283f22ef01cSRoman Divacky break; 3284f22ef01cSRoman Divacky } 3285f22ef01cSRoman Divacky } 3286f22ef01cSRoman Divacky } 3287f22ef01cSRoman Divacky } 3288f22ef01cSRoman Divacky 32898f0fd8f6SDimitry Andric static std::error_code typeCheckLoadStoreInst(DiagnosticHandlerFunction DH, 3290ff0cc061SDimitry Andric Type *ValType, Type *PtrType) { 3291ff0cc061SDimitry Andric if (!isa<PointerType>(PtrType)) 32928f0fd8f6SDimitry Andric return error(DH, "Load/Store operand is not a pointer type"); 3293ff0cc061SDimitry Andric Type *ElemType = cast<PointerType>(PtrType)->getElementType(); 3294ff0cc061SDimitry Andric 3295ff0cc061SDimitry Andric if (ValType && ValType != ElemType) 32968f0fd8f6SDimitry Andric return error(DH, "Explicit load/store type does not match pointee type of " 3297ff0cc061SDimitry Andric "pointer operand"); 3298ff0cc061SDimitry Andric if (!PointerType::isLoadableOrStorableType(ElemType)) 32998f0fd8f6SDimitry Andric return error(DH, "Cannot load/store from pointer"); 3300ff0cc061SDimitry Andric return std::error_code(); 3301ff0cc061SDimitry Andric } 3302ff0cc061SDimitry Andric 33038f0fd8f6SDimitry Andric /// Lazily parse the specified function body block. 33048f0fd8f6SDimitry Andric std::error_code BitcodeReader::parseFunctionBody(Function *F) { 3305f22ef01cSRoman Divacky if (Stream.EnterSubBlock(bitc::FUNCTION_BLOCK_ID)) 33068f0fd8f6SDimitry Andric return error("Invalid record"); 3307f22ef01cSRoman Divacky 3308f22ef01cSRoman Divacky InstructionList.clear(); 3309f22ef01cSRoman Divacky unsigned ModuleValueListSize = ValueList.size(); 3310e580952dSDimitry Andric unsigned ModuleMDValueListSize = MDValueList.size(); 3311f22ef01cSRoman Divacky 3312f22ef01cSRoman Divacky // Add all the function arguments to the value table. 3313f22ef01cSRoman Divacky for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) 3314f22ef01cSRoman Divacky ValueList.push_back(I); 3315f22ef01cSRoman Divacky 3316f22ef01cSRoman Divacky unsigned NextValueNo = ValueList.size(); 331791bc56edSDimitry Andric BasicBlock *CurBB = nullptr; 3318f22ef01cSRoman Divacky unsigned CurBBNo = 0; 3319f22ef01cSRoman Divacky 3320f22ef01cSRoman Divacky DebugLoc LastLoc; 332139d628a0SDimitry Andric auto getLastInstruction = [&]() -> Instruction * { 332239d628a0SDimitry Andric if (CurBB && !CurBB->empty()) 332339d628a0SDimitry Andric return &CurBB->back(); 332439d628a0SDimitry Andric else if (CurBBNo && FunctionBBs[CurBBNo - 1] && 332539d628a0SDimitry Andric !FunctionBBs[CurBBNo - 1]->empty()) 332639d628a0SDimitry Andric return &FunctionBBs[CurBBNo - 1]->back(); 332739d628a0SDimitry Andric return nullptr; 332839d628a0SDimitry Andric }; 3329f22ef01cSRoman Divacky 3330f22ef01cSRoman Divacky // Read all the records. 3331f22ef01cSRoman Divacky SmallVector<uint64_t, 64> Record; 3332f22ef01cSRoman Divacky while (1) { 3333139f7f9bSDimitry Andric BitstreamEntry Entry = Stream.advance(); 3334f22ef01cSRoman Divacky 3335139f7f9bSDimitry Andric switch (Entry.Kind) { 3336139f7f9bSDimitry Andric case BitstreamEntry::Error: 33378f0fd8f6SDimitry Andric return error("Malformed block"); 3338139f7f9bSDimitry Andric case BitstreamEntry::EndBlock: 3339139f7f9bSDimitry Andric goto OutOfRecordLoop; 3340139f7f9bSDimitry Andric 3341139f7f9bSDimitry Andric case BitstreamEntry::SubBlock: 3342139f7f9bSDimitry Andric switch (Entry.ID) { 3343f22ef01cSRoman Divacky default: // Skip unknown content. 3344f22ef01cSRoman Divacky if (Stream.SkipBlock()) 33458f0fd8f6SDimitry Andric return error("Invalid record"); 3346f22ef01cSRoman Divacky break; 3347f22ef01cSRoman Divacky case bitc::CONSTANTS_BLOCK_ID: 33488f0fd8f6SDimitry Andric if (std::error_code EC = parseConstants()) 3349f785676fSDimitry Andric return EC; 3350f22ef01cSRoman Divacky NextValueNo = ValueList.size(); 3351f22ef01cSRoman Divacky break; 3352f22ef01cSRoman Divacky case bitc::VALUE_SYMTAB_BLOCK_ID: 33538f0fd8f6SDimitry Andric if (std::error_code EC = parseValueSymbolTable()) 3354f785676fSDimitry Andric return EC; 3355f22ef01cSRoman Divacky break; 3356f22ef01cSRoman Divacky case bitc::METADATA_ATTACHMENT_ID: 33578f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadataAttachment(*F)) 3358f785676fSDimitry Andric return EC; 3359f22ef01cSRoman Divacky break; 3360f22ef01cSRoman Divacky case bitc::METADATA_BLOCK_ID: 33618f0fd8f6SDimitry Andric if (std::error_code EC = parseMetadata()) 3362f785676fSDimitry Andric return EC; 3363f22ef01cSRoman Divacky break; 336439d628a0SDimitry Andric case bitc::USELIST_BLOCK_ID: 33658f0fd8f6SDimitry Andric if (std::error_code EC = parseUseLists()) 336639d628a0SDimitry Andric return EC; 336739d628a0SDimitry Andric break; 3368f22ef01cSRoman Divacky } 3369f22ef01cSRoman Divacky continue; 3370f22ef01cSRoman Divacky 3371139f7f9bSDimitry Andric case BitstreamEntry::Record: 3372139f7f9bSDimitry Andric // The interesting case. 3373139f7f9bSDimitry Andric break; 3374f22ef01cSRoman Divacky } 3375f22ef01cSRoman Divacky 3376f22ef01cSRoman Divacky // Read a record. 3377f22ef01cSRoman Divacky Record.clear(); 337891bc56edSDimitry Andric Instruction *I = nullptr; 3379139f7f9bSDimitry Andric unsigned BitCode = Stream.readRecord(Entry.ID, Record); 3380f22ef01cSRoman Divacky switch (BitCode) { 3381f22ef01cSRoman Divacky default: // Default behavior: reject 33828f0fd8f6SDimitry Andric return error("Invalid value"); 338339d628a0SDimitry Andric case bitc::FUNC_CODE_DECLAREBLOCKS: { // DECLAREBLOCKS: [nblocks] 3384f22ef01cSRoman Divacky if (Record.size() < 1 || Record[0] == 0) 33858f0fd8f6SDimitry Andric return error("Invalid record"); 3386f22ef01cSRoman Divacky // Create all the basic blocks for the function. 3387f22ef01cSRoman Divacky FunctionBBs.resize(Record[0]); 338839d628a0SDimitry Andric 338939d628a0SDimitry Andric // See if anything took the address of blocks in this function. 339039d628a0SDimitry Andric auto BBFRI = BasicBlockFwdRefs.find(F); 339139d628a0SDimitry Andric if (BBFRI == BasicBlockFwdRefs.end()) { 3392f22ef01cSRoman Divacky for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) 3393f22ef01cSRoman Divacky FunctionBBs[i] = BasicBlock::Create(Context, "", F); 339439d628a0SDimitry Andric } else { 339539d628a0SDimitry Andric auto &BBRefs = BBFRI->second; 339639d628a0SDimitry Andric // Check for invalid basic block references. 339739d628a0SDimitry Andric if (BBRefs.size() > FunctionBBs.size()) 33988f0fd8f6SDimitry Andric return error("Invalid ID"); 339939d628a0SDimitry Andric assert(!BBRefs.empty() && "Unexpected empty array"); 340039d628a0SDimitry Andric assert(!BBRefs.front() && "Invalid reference to entry block"); 340139d628a0SDimitry Andric for (unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size(); I != E; 340239d628a0SDimitry Andric ++I) 340339d628a0SDimitry Andric if (I < RE && BBRefs[I]) { 340439d628a0SDimitry Andric BBRefs[I]->insertInto(F); 340539d628a0SDimitry Andric FunctionBBs[I] = BBRefs[I]; 340639d628a0SDimitry Andric } else { 340739d628a0SDimitry Andric FunctionBBs[I] = BasicBlock::Create(Context, "", F); 340839d628a0SDimitry Andric } 340939d628a0SDimitry Andric 341039d628a0SDimitry Andric // Erase from the table. 341139d628a0SDimitry Andric BasicBlockFwdRefs.erase(BBFRI); 341239d628a0SDimitry Andric } 341339d628a0SDimitry Andric 3414f22ef01cSRoman Divacky CurBB = FunctionBBs[0]; 3415f22ef01cSRoman Divacky continue; 341639d628a0SDimitry Andric } 3417f22ef01cSRoman Divacky 3418f22ef01cSRoman Divacky case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: // DEBUG_LOC_AGAIN 3419f22ef01cSRoman Divacky // This record indicates that the last instruction is at the same 3420f22ef01cSRoman Divacky // location as the previous instruction with a location. 342139d628a0SDimitry Andric I = getLastInstruction(); 3422f22ef01cSRoman Divacky 342391bc56edSDimitry Andric if (!I) 34248f0fd8f6SDimitry Andric return error("Invalid record"); 3425f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 342691bc56edSDimitry Andric I = nullptr; 3427f22ef01cSRoman Divacky continue; 3428f22ef01cSRoman Divacky 342917a519f9SDimitry Andric case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia] 343039d628a0SDimitry Andric I = getLastInstruction(); 343191bc56edSDimitry Andric if (!I || Record.size() < 4) 34328f0fd8f6SDimitry Andric return error("Invalid record"); 3433f22ef01cSRoman Divacky 3434f22ef01cSRoman Divacky unsigned Line = Record[0], Col = Record[1]; 3435f22ef01cSRoman Divacky unsigned ScopeID = Record[2], IAID = Record[3]; 3436f22ef01cSRoman Divacky 343791bc56edSDimitry Andric MDNode *Scope = nullptr, *IA = nullptr; 3438f22ef01cSRoman Divacky if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); 3439f22ef01cSRoman Divacky if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); 3440f22ef01cSRoman Divacky LastLoc = DebugLoc::get(Line, Col, Scope, IA); 3441f22ef01cSRoman Divacky I->setDebugLoc(LastLoc); 344291bc56edSDimitry Andric I = nullptr; 3443f22ef01cSRoman Divacky continue; 3444f22ef01cSRoman Divacky } 3445f22ef01cSRoman Divacky 3446f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BINOP: { // BINOP: [opval, ty, opval, opcode] 3447f22ef01cSRoman Divacky unsigned OpNum = 0; 3448f22ef01cSRoman Divacky Value *LHS, *RHS; 3449f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 34503861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3451f22ef01cSRoman Divacky OpNum+1 > Record.size()) 34528f0fd8f6SDimitry Andric return error("Invalid record"); 3453f22ef01cSRoman Divacky 34548f0fd8f6SDimitry Andric int Opc = getDecodedBinaryOpcode(Record[OpNum++], LHS->getType()); 3455f785676fSDimitry Andric if (Opc == -1) 34568f0fd8f6SDimitry Andric return error("Invalid record"); 3457f22ef01cSRoman Divacky I = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS); 3458f22ef01cSRoman Divacky InstructionList.push_back(I); 3459f22ef01cSRoman Divacky if (OpNum < Record.size()) { 3460f22ef01cSRoman Divacky if (Opc == Instruction::Add || 3461f22ef01cSRoman Divacky Opc == Instruction::Sub || 34622754fe60SDimitry Andric Opc == Instruction::Mul || 34632754fe60SDimitry Andric Opc == Instruction::Shl) { 3464f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_SIGNED_WRAP)) 3465f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoSignedWrap(true); 3466f22ef01cSRoman Divacky if (Record[OpNum] & (1 << bitc::OBO_NO_UNSIGNED_WRAP)) 3467f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setHasNoUnsignedWrap(true); 34682754fe60SDimitry Andric } else if (Opc == Instruction::SDiv || 34692754fe60SDimitry Andric Opc == Instruction::UDiv || 34702754fe60SDimitry Andric Opc == Instruction::LShr || 34712754fe60SDimitry Andric Opc == Instruction::AShr) { 34722754fe60SDimitry Andric if (Record[OpNum] & (1 << bitc::PEO_EXACT)) 3473f22ef01cSRoman Divacky cast<BinaryOperator>(I)->setIsExact(true); 3474139f7f9bSDimitry Andric } else if (isa<FPMathOperator>(I)) { 3475139f7f9bSDimitry Andric FastMathFlags FMF; 3476139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) 3477139f7f9bSDimitry Andric FMF.setUnsafeAlgebra(); 3478139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) 3479139f7f9bSDimitry Andric FMF.setNoNaNs(); 3480139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) 3481139f7f9bSDimitry Andric FMF.setNoInfs(); 3482139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) 3483139f7f9bSDimitry Andric FMF.setNoSignedZeros(); 3484139f7f9bSDimitry Andric if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) 3485139f7f9bSDimitry Andric FMF.setAllowReciprocal(); 3486139f7f9bSDimitry Andric if (FMF.any()) 3487139f7f9bSDimitry Andric I->setFastMathFlags(FMF); 3488f22ef01cSRoman Divacky } 3489139f7f9bSDimitry Andric 3490f22ef01cSRoman Divacky } 3491f22ef01cSRoman Divacky break; 3492f22ef01cSRoman Divacky } 3493f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CAST: { // CAST: [opval, opty, destty, castopc] 3494f22ef01cSRoman Divacky unsigned OpNum = 0; 3495f22ef01cSRoman Divacky Value *Op; 3496f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 3497f22ef01cSRoman Divacky OpNum+2 != Record.size()) 34988f0fd8f6SDimitry Andric return error("Invalid record"); 3499f22ef01cSRoman Divacky 35006122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[OpNum]); 35018f0fd8f6SDimitry Andric int Opc = getDecodedCastOpcode(Record[OpNum + 1]); 350291bc56edSDimitry Andric if (Opc == -1 || !ResTy) 35038f0fd8f6SDimitry Andric return error("Invalid record"); 350491bc56edSDimitry Andric Instruction *Temp = nullptr; 3505f785676fSDimitry Andric if ((I = UpgradeBitCastInst(Opc, Op, ResTy, Temp))) { 3506f785676fSDimitry Andric if (Temp) { 3507f785676fSDimitry Andric InstructionList.push_back(Temp); 3508f785676fSDimitry Andric CurBB->getInstList().push_back(Temp); 3509f785676fSDimitry Andric } 3510f785676fSDimitry Andric } else { 3511f22ef01cSRoman Divacky I = CastInst::Create((Instruction::CastOps)Opc, Op, ResTy); 3512f785676fSDimitry Andric } 3513f22ef01cSRoman Divacky InstructionList.push_back(I); 3514f22ef01cSRoman Divacky break; 3515f22ef01cSRoman Divacky } 3516ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD: 3517ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP_OLD: 3518ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_GEP: { // GEP: type, [n x operands] 3519f22ef01cSRoman Divacky unsigned OpNum = 0; 3520ff0cc061SDimitry Andric 3521ff0cc061SDimitry Andric Type *Ty; 3522ff0cc061SDimitry Andric bool InBounds; 3523ff0cc061SDimitry Andric 3524ff0cc061SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_GEP) { 3525ff0cc061SDimitry Andric InBounds = Record[OpNum++]; 3526ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 3527ff0cc061SDimitry Andric } else { 3528ff0cc061SDimitry Andric InBounds = BitCode == bitc::FUNC_CODE_INST_INBOUNDS_GEP_OLD; 3529ff0cc061SDimitry Andric Ty = nullptr; 3530ff0cc061SDimitry Andric } 3531ff0cc061SDimitry Andric 3532f22ef01cSRoman Divacky Value *BasePtr; 3533f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr)) 35348f0fd8f6SDimitry Andric return error("Invalid record"); 3535f22ef01cSRoman Divacky 3536ff0cc061SDimitry Andric if (!Ty) 3537ff0cc061SDimitry Andric Ty = cast<SequentialType>(BasePtr->getType()->getScalarType()) 3538ff0cc061SDimitry Andric ->getElementType(); 3539ff0cc061SDimitry Andric else if (Ty != 3540ff0cc061SDimitry Andric cast<SequentialType>(BasePtr->getType()->getScalarType()) 3541ff0cc061SDimitry Andric ->getElementType()) 35428f0fd8f6SDimitry Andric return error( 3543ff0cc061SDimitry Andric "Explicit gep type does not match pointee type of pointer operand"); 3544ff0cc061SDimitry Andric 3545f22ef01cSRoman Divacky SmallVector<Value*, 16> GEPIdx; 3546f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3547f22ef01cSRoman Divacky Value *Op; 3548f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 35498f0fd8f6SDimitry Andric return error("Invalid record"); 3550f22ef01cSRoman Divacky GEPIdx.push_back(Op); 3551f22ef01cSRoman Divacky } 3552f22ef01cSRoman Divacky 3553ff0cc061SDimitry Andric I = GetElementPtrInst::Create(Ty, BasePtr, GEPIdx); 3554ff0cc061SDimitry Andric 3555f22ef01cSRoman Divacky InstructionList.push_back(I); 3556ff0cc061SDimitry Andric if (InBounds) 3557f22ef01cSRoman Divacky cast<GetElementPtrInst>(I)->setIsInBounds(true); 3558f22ef01cSRoman Divacky break; 3559f22ef01cSRoman Divacky } 3560f22ef01cSRoman Divacky 3561f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTVAL: { 3562f22ef01cSRoman Divacky // EXTRACTVAL: [opty, opval, n x indices] 3563f22ef01cSRoman Divacky unsigned OpNum = 0; 3564f22ef01cSRoman Divacky Value *Agg; 3565f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 35668f0fd8f6SDimitry Andric return error("Invalid record"); 3567f22ef01cSRoman Divacky 3568ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3569ff0cc061SDimitry Andric if (OpNum == RecSize) 35708f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid instruction with 0 indices"); 3571ff0cc061SDimitry Andric 3572f22ef01cSRoman Divacky SmallVector<unsigned, 4> EXTRACTVALIdx; 3573ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3574ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3575ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3576ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3577f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3578ff0cc061SDimitry Andric 3579ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 35808f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid type"); 3581f22ef01cSRoman Divacky if ((unsigned)Index != Index) 35828f0fd8f6SDimitry Andric return error("Invalid value"); 3583ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 35848f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid struct index"); 3585ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 35868f0fd8f6SDimitry Andric return error("EXTRACTVAL: Invalid array index"); 3587f22ef01cSRoman Divacky EXTRACTVALIdx.push_back((unsigned)Index); 3588ff0cc061SDimitry Andric 3589ff0cc061SDimitry Andric if (IsStruct) 3590ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3591ff0cc061SDimitry Andric else 3592ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3593f22ef01cSRoman Divacky } 3594f22ef01cSRoman Divacky 359517a519f9SDimitry Andric I = ExtractValueInst::Create(Agg, EXTRACTVALIdx); 3596f22ef01cSRoman Divacky InstructionList.push_back(I); 3597f22ef01cSRoman Divacky break; 3598f22ef01cSRoman Divacky } 3599f22ef01cSRoman Divacky 3600f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTVAL: { 3601f22ef01cSRoman Divacky // INSERTVAL: [opty, opval, opty, opval, n x indices] 3602f22ef01cSRoman Divacky unsigned OpNum = 0; 3603f22ef01cSRoman Divacky Value *Agg; 3604f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Agg)) 36058f0fd8f6SDimitry Andric return error("Invalid record"); 3606f22ef01cSRoman Divacky Value *Val; 3607f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Val)) 36088f0fd8f6SDimitry Andric return error("Invalid record"); 3609f22ef01cSRoman Divacky 3610ff0cc061SDimitry Andric unsigned RecSize = Record.size(); 3611ff0cc061SDimitry Andric if (OpNum == RecSize) 36128f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid instruction with 0 indices"); 3613ff0cc061SDimitry Andric 3614f22ef01cSRoman Divacky SmallVector<unsigned, 4> INSERTVALIdx; 3615ff0cc061SDimitry Andric Type *CurTy = Agg->getType(); 3616ff0cc061SDimitry Andric for (; OpNum != RecSize; ++OpNum) { 3617ff0cc061SDimitry Andric bool IsArray = CurTy->isArrayTy(); 3618ff0cc061SDimitry Andric bool IsStruct = CurTy->isStructTy(); 3619f22ef01cSRoman Divacky uint64_t Index = Record[OpNum]; 3620ff0cc061SDimitry Andric 3621ff0cc061SDimitry Andric if (!IsStruct && !IsArray) 36228f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid type"); 3623f22ef01cSRoman Divacky if ((unsigned)Index != Index) 36248f0fd8f6SDimitry Andric return error("Invalid value"); 3625ff0cc061SDimitry Andric if (IsStruct && Index >= CurTy->subtypes().size()) 36268f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid struct index"); 3627ff0cc061SDimitry Andric if (IsArray && Index >= CurTy->getArrayNumElements()) 36288f0fd8f6SDimitry Andric return error("INSERTVAL: Invalid array index"); 3629ff0cc061SDimitry Andric 3630f22ef01cSRoman Divacky INSERTVALIdx.push_back((unsigned)Index); 3631ff0cc061SDimitry Andric if (IsStruct) 3632ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[Index]; 3633ff0cc061SDimitry Andric else 3634ff0cc061SDimitry Andric CurTy = CurTy->subtypes()[0]; 3635f22ef01cSRoman Divacky } 3636f22ef01cSRoman Divacky 3637ff0cc061SDimitry Andric if (CurTy != Val->getType()) 36388f0fd8f6SDimitry Andric return error("Inserted value type doesn't match aggregate type"); 3639ff0cc061SDimitry Andric 364017a519f9SDimitry Andric I = InsertValueInst::Create(Agg, Val, INSERTVALIdx); 3641f22ef01cSRoman Divacky InstructionList.push_back(I); 3642f22ef01cSRoman Divacky break; 3643f22ef01cSRoman Divacky } 3644f22ef01cSRoman Divacky 3645f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SELECT: { // SELECT: [opval, ty, opval, opval] 3646f22ef01cSRoman Divacky // obsolete form of select 3647f22ef01cSRoman Divacky // handles select i1 ... in old bitcode 3648f22ef01cSRoman Divacky unsigned OpNum = 0; 3649f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3650f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36513861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 36523861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond)) 36538f0fd8f6SDimitry Andric return error("Invalid record"); 3654f22ef01cSRoman Divacky 3655f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3656f22ef01cSRoman Divacky InstructionList.push_back(I); 3657f22ef01cSRoman Divacky break; 3658f22ef01cSRoman Divacky } 3659f22ef01cSRoman Divacky 3660f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [ty,opval,opval,predty,pred] 3661f22ef01cSRoman Divacky // new form of select 3662f22ef01cSRoman Divacky // handles select i1 or select [N x i1] 3663f22ef01cSRoman Divacky unsigned OpNum = 0; 3664f22ef01cSRoman Divacky Value *TrueVal, *FalseVal, *Cond; 3665f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || 36663861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || 3667f22ef01cSRoman Divacky getValueTypePair(Record, OpNum, NextValueNo, Cond)) 36688f0fd8f6SDimitry Andric return error("Invalid record"); 3669f22ef01cSRoman Divacky 3670f22ef01cSRoman Divacky // select condition can be either i1 or [N x i1] 36716122f3e6SDimitry Andric if (VectorType* vector_type = 36726122f3e6SDimitry Andric dyn_cast<VectorType>(Cond->getType())) { 3673f22ef01cSRoman Divacky // expect <n x i1> 3674f22ef01cSRoman Divacky if (vector_type->getElementType() != Type::getInt1Ty(Context)) 36758f0fd8f6SDimitry Andric return error("Invalid type for value"); 3676f22ef01cSRoman Divacky } else { 3677f22ef01cSRoman Divacky // expect i1 3678f22ef01cSRoman Divacky if (Cond->getType() != Type::getInt1Ty(Context)) 36798f0fd8f6SDimitry Andric return error("Invalid type for value"); 3680f22ef01cSRoman Divacky } 3681f22ef01cSRoman Divacky 3682f22ef01cSRoman Divacky I = SelectInst::Create(Cond, TrueVal, FalseVal); 3683f22ef01cSRoman Divacky InstructionList.push_back(I); 3684f22ef01cSRoman Divacky break; 3685f22ef01cSRoman Divacky } 3686f22ef01cSRoman Divacky 3687f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opval] 3688f22ef01cSRoman Divacky unsigned OpNum = 0; 3689f22ef01cSRoman Divacky Value *Vec, *Idx; 3690f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || 369191bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 36928f0fd8f6SDimitry Andric return error("Invalid record"); 3693ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 36948f0fd8f6SDimitry Andric return error("Invalid type for value"); 3695f22ef01cSRoman Divacky I = ExtractElementInst::Create(Vec, Idx); 3696f22ef01cSRoman Divacky InstructionList.push_back(I); 3697f22ef01cSRoman Divacky break; 3698f22ef01cSRoman Divacky } 3699f22ef01cSRoman Divacky 3700f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [ty, opval,opval,opval] 3701f22ef01cSRoman Divacky unsigned OpNum = 0; 3702f22ef01cSRoman Divacky Value *Vec, *Elt, *Idx; 3703ff0cc061SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Vec)) 37048f0fd8f6SDimitry Andric return error("Invalid record"); 3705ff0cc061SDimitry Andric if (!Vec->getType()->isVectorTy()) 37068f0fd8f6SDimitry Andric return error("Invalid type for value"); 3707ff0cc061SDimitry Andric if (popValue(Record, OpNum, NextValueNo, 3708f22ef01cSRoman Divacky cast<VectorType>(Vec->getType())->getElementType(), Elt) || 370991bc56edSDimitry Andric getValueTypePair(Record, OpNum, NextValueNo, Idx)) 37108f0fd8f6SDimitry Andric return error("Invalid record"); 3711f22ef01cSRoman Divacky I = InsertElementInst::Create(Vec, Elt, Idx); 3712f22ef01cSRoman Divacky InstructionList.push_back(I); 3713f22ef01cSRoman Divacky break; 3714f22ef01cSRoman Divacky } 3715f22ef01cSRoman Divacky 3716f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SHUFFLEVEC: {// SHUFFLEVEC: [opval,ty,opval,opval] 3717f22ef01cSRoman Divacky unsigned OpNum = 0; 3718f22ef01cSRoman Divacky Value *Vec1, *Vec2, *Mask; 3719f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || 37203861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2)) 37218f0fd8f6SDimitry Andric return error("Invalid record"); 3722f22ef01cSRoman Divacky 3723f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) 37248f0fd8f6SDimitry Andric return error("Invalid record"); 3725ff0cc061SDimitry Andric if (!Vec1->getType()->isVectorTy() || !Vec2->getType()->isVectorTy()) 37268f0fd8f6SDimitry Andric return error("Invalid type for value"); 3727f22ef01cSRoman Divacky I = new ShuffleVectorInst(Vec1, Vec2, Mask); 3728f22ef01cSRoman Divacky InstructionList.push_back(I); 3729f22ef01cSRoman Divacky break; 3730f22ef01cSRoman Divacky } 3731f22ef01cSRoman Divacky 3732f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP: // CMP: [opty, opval, opval, pred] 3733f22ef01cSRoman Divacky // Old form of ICmp/FCmp returning bool 3734f22ef01cSRoman Divacky // Existed to differentiate between icmp/fcmp and vicmp/vfcmp which were 3735f22ef01cSRoman Divacky // both legal on vectors but had different behaviour. 3736f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_CMP2: { // CMP2: [opty, opval, opval, pred] 3737f22ef01cSRoman Divacky // FCmp/ICmp returning bool or vector of bool 3738f22ef01cSRoman Divacky 3739f22ef01cSRoman Divacky unsigned OpNum = 0; 3740f22ef01cSRoman Divacky Value *LHS, *RHS; 3741f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || 37423861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || 3743f22ef01cSRoman Divacky OpNum+1 != Record.size()) 37448f0fd8f6SDimitry Andric return error("Invalid record"); 3745f22ef01cSRoman Divacky 3746f22ef01cSRoman Divacky if (LHS->getType()->isFPOrFPVectorTy()) 3747f22ef01cSRoman Divacky I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); 3748f22ef01cSRoman Divacky else 3749f22ef01cSRoman Divacky I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); 3750f22ef01cSRoman Divacky InstructionList.push_back(I); 3751f22ef01cSRoman Divacky break; 3752f22ef01cSRoman Divacky } 3753f22ef01cSRoman Divacky 3754f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_RET: // RET: [opty,opval<optional>] 3755f22ef01cSRoman Divacky { 3756f22ef01cSRoman Divacky unsigned Size = Record.size(); 3757f22ef01cSRoman Divacky if (Size == 0) { 3758f22ef01cSRoman Divacky I = ReturnInst::Create(Context); 3759f22ef01cSRoman Divacky InstructionList.push_back(I); 3760f22ef01cSRoman Divacky break; 3761f22ef01cSRoman Divacky } 3762f22ef01cSRoman Divacky 3763f22ef01cSRoman Divacky unsigned OpNum = 0; 376491bc56edSDimitry Andric Value *Op = nullptr; 3765f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 37668f0fd8f6SDimitry Andric return error("Invalid record"); 376717a519f9SDimitry Andric if (OpNum != Record.size()) 37688f0fd8f6SDimitry Andric return error("Invalid record"); 3769f22ef01cSRoman Divacky 377017a519f9SDimitry Andric I = ReturnInst::Create(Context, Op); 3771f22ef01cSRoman Divacky InstructionList.push_back(I); 3772f22ef01cSRoman Divacky break; 3773f22ef01cSRoman Divacky } 3774f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] 3775f22ef01cSRoman Divacky if (Record.size() != 1 && Record.size() != 3) 37768f0fd8f6SDimitry Andric return error("Invalid record"); 3777f22ef01cSRoman Divacky BasicBlock *TrueDest = getBasicBlock(Record[0]); 377891bc56edSDimitry Andric if (!TrueDest) 37798f0fd8f6SDimitry Andric return error("Invalid record"); 3780f22ef01cSRoman Divacky 3781f22ef01cSRoman Divacky if (Record.size() == 1) { 3782f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest); 3783f22ef01cSRoman Divacky InstructionList.push_back(I); 3784f22ef01cSRoman Divacky } 3785f22ef01cSRoman Divacky else { 3786f22ef01cSRoman Divacky BasicBlock *FalseDest = getBasicBlock(Record[1]); 37873861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, 37883861d79fSDimitry Andric Type::getInt1Ty(Context)); 378991bc56edSDimitry Andric if (!FalseDest || !Cond) 37908f0fd8f6SDimitry Andric return error("Invalid record"); 3791f22ef01cSRoman Divacky I = BranchInst::Create(TrueDest, FalseDest, Cond); 3792f22ef01cSRoman Divacky InstructionList.push_back(I); 3793f22ef01cSRoman Divacky } 3794f22ef01cSRoman Divacky break; 3795f22ef01cSRoman Divacky } 3796f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] 37977ae0e2c9SDimitry Andric // Check magic 37987ae0e2c9SDimitry Andric if ((Record[0] >> 16) == SWITCH_INST_MAGIC) { 3799f785676fSDimitry Andric // "New" SwitchInst format with case ranges. The changes to write this 3800f785676fSDimitry Andric // format were reverted but we still recognize bitcode that uses it. 3801f785676fSDimitry Andric // Hopefully someday we will have support for case ranges and can use 3802f785676fSDimitry Andric // this format again. 38037ae0e2c9SDimitry Andric 38047ae0e2c9SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 38057ae0e2c9SDimitry Andric unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); 38067ae0e2c9SDimitry Andric 38073861d79fSDimitry Andric Value *Cond = getValue(Record, 2, NextValueNo, OpTy); 38087ae0e2c9SDimitry Andric BasicBlock *Default = getBasicBlock(Record[3]); 380991bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 38108f0fd8f6SDimitry Andric return error("Invalid record"); 38117ae0e2c9SDimitry Andric 38127ae0e2c9SDimitry Andric unsigned NumCases = Record[4]; 38137ae0e2c9SDimitry Andric 38147ae0e2c9SDimitry Andric SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 38157ae0e2c9SDimitry Andric InstructionList.push_back(SI); 38167ae0e2c9SDimitry Andric 38177ae0e2c9SDimitry Andric unsigned CurIdx = 5; 38187ae0e2c9SDimitry Andric for (unsigned i = 0; i != NumCases; ++i) { 3819f785676fSDimitry Andric SmallVector<ConstantInt*, 1> CaseVals; 38207ae0e2c9SDimitry Andric unsigned NumItems = Record[CurIdx++]; 38217ae0e2c9SDimitry Andric for (unsigned ci = 0; ci != NumItems; ++ci) { 38227ae0e2c9SDimitry Andric bool isSingleNumber = Record[CurIdx++]; 38237ae0e2c9SDimitry Andric 38247ae0e2c9SDimitry Andric APInt Low; 38257ae0e2c9SDimitry Andric unsigned ActiveWords = 1; 38267ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38277ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38288f0fd8f6SDimitry Andric Low = readWideAPInt(makeArrayRef(&Record[CurIdx], ActiveWords), 38297ae0e2c9SDimitry Andric ValueBitWidth); 38307ae0e2c9SDimitry Andric CurIdx += ActiveWords; 38317ae0e2c9SDimitry Andric 38327ae0e2c9SDimitry Andric if (!isSingleNumber) { 38337ae0e2c9SDimitry Andric ActiveWords = 1; 38347ae0e2c9SDimitry Andric if (ValueBitWidth > 64) 38357ae0e2c9SDimitry Andric ActiveWords = Record[CurIdx++]; 38368f0fd8f6SDimitry Andric APInt High = readWideAPInt( 38378f0fd8f6SDimitry Andric makeArrayRef(&Record[CurIdx], ActiveWords), ValueBitWidth); 38387ae0e2c9SDimitry Andric CurIdx += ActiveWords; 3839f785676fSDimitry Andric 3840f785676fSDimitry Andric // FIXME: It is not clear whether values in the range should be 3841f785676fSDimitry Andric // compared as signed or unsigned values. The partially 3842f785676fSDimitry Andric // implemented changes that used this format in the past used 3843f785676fSDimitry Andric // unsigned comparisons. 3844f785676fSDimitry Andric for ( ; Low.ule(High); ++Low) 3845f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38467ae0e2c9SDimitry Andric } else 3847f785676fSDimitry Andric CaseVals.push_back(ConstantInt::get(Context, Low)); 38487ae0e2c9SDimitry Andric } 38497ae0e2c9SDimitry Andric BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); 3850f785676fSDimitry Andric for (SmallVector<ConstantInt*, 1>::iterator cvi = CaseVals.begin(), 3851f785676fSDimitry Andric cve = CaseVals.end(); cvi != cve; ++cvi) 3852f785676fSDimitry Andric SI->addCase(*cvi, DestBB); 38537ae0e2c9SDimitry Andric } 38547ae0e2c9SDimitry Andric I = SI; 38557ae0e2c9SDimitry Andric break; 38567ae0e2c9SDimitry Andric } 38577ae0e2c9SDimitry Andric 38587ae0e2c9SDimitry Andric // Old SwitchInst format without case ranges. 38597ae0e2c9SDimitry Andric 3860f22ef01cSRoman Divacky if (Record.size() < 3 || (Record.size() & 1) == 0) 38618f0fd8f6SDimitry Andric return error("Invalid record"); 38626122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 38633861d79fSDimitry Andric Value *Cond = getValue(Record, 1, NextValueNo, OpTy); 3864f22ef01cSRoman Divacky BasicBlock *Default = getBasicBlock(Record[2]); 386591bc56edSDimitry Andric if (!OpTy || !Cond || !Default) 38668f0fd8f6SDimitry Andric return error("Invalid record"); 3867f22ef01cSRoman Divacky unsigned NumCases = (Record.size()-3)/2; 3868f22ef01cSRoman Divacky SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); 3869f22ef01cSRoman Divacky InstructionList.push_back(SI); 3870f22ef01cSRoman Divacky for (unsigned i = 0, e = NumCases; i != e; ++i) { 3871f22ef01cSRoman Divacky ConstantInt *CaseVal = 3872f22ef01cSRoman Divacky dyn_cast_or_null<ConstantInt>(getFnValueByID(Record[3+i*2], OpTy)); 3873f22ef01cSRoman Divacky BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]); 387491bc56edSDimitry Andric if (!CaseVal || !DestBB) { 3875f22ef01cSRoman Divacky delete SI; 38768f0fd8f6SDimitry Andric return error("Invalid record"); 3877f22ef01cSRoman Divacky } 3878f22ef01cSRoman Divacky SI->addCase(CaseVal, DestBB); 3879f22ef01cSRoman Divacky } 3880f22ef01cSRoman Divacky I = SI; 3881f22ef01cSRoman Divacky break; 3882f22ef01cSRoman Divacky } 3883f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INDIRECTBR: { // INDIRECTBR: [opty, op0, op1, ...] 3884f22ef01cSRoman Divacky if (Record.size() < 2) 38858f0fd8f6SDimitry Andric return error("Invalid record"); 38866122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 38873861d79fSDimitry Andric Value *Address = getValue(Record, 1, NextValueNo, OpTy); 388891bc56edSDimitry Andric if (!OpTy || !Address) 38898f0fd8f6SDimitry Andric return error("Invalid record"); 3890f22ef01cSRoman Divacky unsigned NumDests = Record.size()-2; 3891f22ef01cSRoman Divacky IndirectBrInst *IBI = IndirectBrInst::Create(Address, NumDests); 3892f22ef01cSRoman Divacky InstructionList.push_back(IBI); 3893f22ef01cSRoman Divacky for (unsigned i = 0, e = NumDests; i != e; ++i) { 3894f22ef01cSRoman Divacky if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) { 3895f22ef01cSRoman Divacky IBI->addDestination(DestBB); 3896f22ef01cSRoman Divacky } else { 3897f22ef01cSRoman Divacky delete IBI; 38988f0fd8f6SDimitry Andric return error("Invalid record"); 3899f22ef01cSRoman Divacky } 3900f22ef01cSRoman Divacky } 3901f22ef01cSRoman Divacky I = IBI; 3902f22ef01cSRoman Divacky break; 3903f22ef01cSRoman Divacky } 3904f22ef01cSRoman Divacky 3905f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_INVOKE: { 3906f22ef01cSRoman Divacky // INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...] 3907f785676fSDimitry Andric if (Record.size() < 4) 39088f0fd8f6SDimitry Andric return error("Invalid record"); 3909ff0cc061SDimitry Andric unsigned OpNum = 0; 3910ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 3911ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 3912ff0cc061SDimitry Andric BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]); 3913ff0cc061SDimitry Andric BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]); 3914f22ef01cSRoman Divacky 3915ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 3916ff0cc061SDimitry Andric if (CCInfo >> 13 & 1 && 3917ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 39188f0fd8f6SDimitry Andric return error("Explicit invoke type is not a function type"); 3919ff0cc061SDimitry Andric 3920f22ef01cSRoman Divacky Value *Callee; 3921f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 39228f0fd8f6SDimitry Andric return error("Invalid record"); 3923f22ef01cSRoman Divacky 39246122f3e6SDimitry Andric PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType()); 3925ff0cc061SDimitry Andric if (!CalleeTy) 39268f0fd8f6SDimitry Andric return error("Callee is not a pointer"); 3927ff0cc061SDimitry Andric if (!FTy) { 3928ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(CalleeTy->getElementType()); 3929ff0cc061SDimitry Andric if (!FTy) 39308f0fd8f6SDimitry Andric return error("Callee is not of pointer to function type"); 3931ff0cc061SDimitry Andric } else if (CalleeTy->getElementType() != FTy) 39328f0fd8f6SDimitry Andric return error("Explicit invoke type does not match pointee type of " 3933ff0cc061SDimitry Andric "callee operand"); 3934ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 39358f0fd8f6SDimitry Andric return error("Insufficient operands to call"); 3936f22ef01cSRoman Divacky 3937f22ef01cSRoman Divacky SmallVector<Value*, 16> Ops; 3938f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 39393861d79fSDimitry Andric Ops.push_back(getValue(Record, OpNum, NextValueNo, 39403861d79fSDimitry Andric FTy->getParamType(i))); 394191bc56edSDimitry Andric if (!Ops.back()) 39428f0fd8f6SDimitry Andric return error("Invalid record"); 3943f22ef01cSRoman Divacky } 3944f22ef01cSRoman Divacky 3945f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 3946f22ef01cSRoman Divacky if (Record.size() != OpNum) 39478f0fd8f6SDimitry Andric return error("Invalid record"); 3948f22ef01cSRoman Divacky } else { 3949f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 3950f22ef01cSRoman Divacky while (OpNum != Record.size()) { 3951f22ef01cSRoman Divacky Value *Op; 3952f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 39538f0fd8f6SDimitry Andric return error("Invalid record"); 3954f22ef01cSRoman Divacky Ops.push_back(Op); 3955f22ef01cSRoman Divacky } 3956f22ef01cSRoman Divacky } 3957f22ef01cSRoman Divacky 395817a519f9SDimitry Andric I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops); 3959f22ef01cSRoman Divacky InstructionList.push_back(I); 3960ff0cc061SDimitry Andric cast<InvokeInst>(I) 3961ff0cc061SDimitry Andric ->setCallingConv(static_cast<CallingConv::ID>(~(1U << 13) & CCInfo)); 3962f22ef01cSRoman Divacky cast<InvokeInst>(I)->setAttributes(PAL); 3963f22ef01cSRoman Divacky break; 3964f22ef01cSRoman Divacky } 39656122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_RESUME: { // RESUME: [opval] 39666122f3e6SDimitry Andric unsigned Idx = 0; 396791bc56edSDimitry Andric Value *Val = nullptr; 39686122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) 39698f0fd8f6SDimitry Andric return error("Invalid record"); 39706122f3e6SDimitry Andric I = ResumeInst::Create(Val); 39716122f3e6SDimitry Andric InstructionList.push_back(I); 39726122f3e6SDimitry Andric break; 39736122f3e6SDimitry Andric } 3974f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE 3975f22ef01cSRoman Divacky I = new UnreachableInst(Context); 3976f22ef01cSRoman Divacky InstructionList.push_back(I); 3977f22ef01cSRoman Divacky break; 3978f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] 3979f22ef01cSRoman Divacky if (Record.size() < 1 || ((Record.size()-1)&1)) 39808f0fd8f6SDimitry Andric return error("Invalid record"); 39816122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[0]); 3982f785676fSDimitry Andric if (!Ty) 39838f0fd8f6SDimitry Andric return error("Invalid record"); 3984f22ef01cSRoman Divacky 39853b0f4066SDimitry Andric PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); 3986f22ef01cSRoman Divacky InstructionList.push_back(PN); 3987f22ef01cSRoman Divacky 3988f22ef01cSRoman Divacky for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { 39893861d79fSDimitry Andric Value *V; 39903861d79fSDimitry Andric // With the new function encoding, it is possible that operands have 39913861d79fSDimitry Andric // negative IDs (for forward references). Use a signed VBR 39923861d79fSDimitry Andric // representation to keep the encoding small. 39933861d79fSDimitry Andric if (UseRelativeIDs) 39943861d79fSDimitry Andric V = getValueSigned(Record, 1+i, NextValueNo, Ty); 39953861d79fSDimitry Andric else 39963861d79fSDimitry Andric V = getValue(Record, 1+i, NextValueNo, Ty); 3997f22ef01cSRoman Divacky BasicBlock *BB = getBasicBlock(Record[2+i]); 3998f785676fSDimitry Andric if (!V || !BB) 39998f0fd8f6SDimitry Andric return error("Invalid record"); 4000f22ef01cSRoman Divacky PN->addIncoming(V, BB); 4001f22ef01cSRoman Divacky } 4002f22ef01cSRoman Divacky I = PN; 4003f22ef01cSRoman Divacky break; 4004f22ef01cSRoman Divacky } 4005f22ef01cSRoman Divacky 40068f0fd8f6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD: 40078f0fd8f6SDimitry Andric case bitc::FUNC_CODE_INST_LANDINGPAD_OLD: { 40086122f3e6SDimitry Andric // LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?] 40096122f3e6SDimitry Andric unsigned Idx = 0; 40108f0fd8f6SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_LANDINGPAD) { 40118f0fd8f6SDimitry Andric if (Record.size() < 3) 40128f0fd8f6SDimitry Andric return error("Invalid record"); 40138f0fd8f6SDimitry Andric } else { 40148f0fd8f6SDimitry Andric assert(BitCode == bitc::FUNC_CODE_INST_LANDINGPAD_OLD); 40156122f3e6SDimitry Andric if (Record.size() < 4) 40168f0fd8f6SDimitry Andric return error("Invalid record"); 40178f0fd8f6SDimitry Andric } 40186122f3e6SDimitry Andric Type *Ty = getTypeByID(Record[Idx++]); 4019f785676fSDimitry Andric if (!Ty) 40208f0fd8f6SDimitry Andric return error("Invalid record"); 40218f0fd8f6SDimitry Andric if (BitCode == bitc::FUNC_CODE_INST_LANDINGPAD_OLD) { 402291bc56edSDimitry Andric Value *PersFn = nullptr; 40236122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, PersFn)) 40248f0fd8f6SDimitry Andric return error("Invalid record"); 40258f0fd8f6SDimitry Andric 40268f0fd8f6SDimitry Andric if (!F->hasPersonalityFn()) 40278f0fd8f6SDimitry Andric F->setPersonalityFn(cast<Constant>(PersFn)); 40288f0fd8f6SDimitry Andric else if (F->getPersonalityFn() != cast<Constant>(PersFn)) 40298f0fd8f6SDimitry Andric return error("Personality function mismatch"); 40308f0fd8f6SDimitry Andric } 40316122f3e6SDimitry Andric 40326122f3e6SDimitry Andric bool IsCleanup = !!Record[Idx++]; 40336122f3e6SDimitry Andric unsigned NumClauses = Record[Idx++]; 40348f0fd8f6SDimitry Andric LandingPadInst *LP = LandingPadInst::Create(Ty, NumClauses); 40356122f3e6SDimitry Andric LP->setCleanup(IsCleanup); 40366122f3e6SDimitry Andric for (unsigned J = 0; J != NumClauses; ++J) { 40376122f3e6SDimitry Andric LandingPadInst::ClauseType CT = 40386122f3e6SDimitry Andric LandingPadInst::ClauseType(Record[Idx++]); (void)CT; 40396122f3e6SDimitry Andric Value *Val; 40406122f3e6SDimitry Andric 40416122f3e6SDimitry Andric if (getValueTypePair(Record, Idx, NextValueNo, Val)) { 40426122f3e6SDimitry Andric delete LP; 40438f0fd8f6SDimitry Andric return error("Invalid record"); 40446122f3e6SDimitry Andric } 40456122f3e6SDimitry Andric 40466122f3e6SDimitry Andric assert((CT != LandingPadInst::Catch || 40476122f3e6SDimitry Andric !isa<ArrayType>(Val->getType())) && 40486122f3e6SDimitry Andric "Catch clause has a invalid type!"); 40496122f3e6SDimitry Andric assert((CT != LandingPadInst::Filter || 40506122f3e6SDimitry Andric isa<ArrayType>(Val->getType())) && 40516122f3e6SDimitry Andric "Filter clause has invalid type!"); 405291bc56edSDimitry Andric LP->addClause(cast<Constant>(Val)); 40536122f3e6SDimitry Andric } 40546122f3e6SDimitry Andric 40556122f3e6SDimitry Andric I = LP; 40566122f3e6SDimitry Andric InstructionList.push_back(I); 40576122f3e6SDimitry Andric break; 40586122f3e6SDimitry Andric } 40596122f3e6SDimitry Andric 406017a519f9SDimitry Andric case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align] 406117a519f9SDimitry Andric if (Record.size() != 4) 40628f0fd8f6SDimitry Andric return error("Invalid record"); 4063ff0cc061SDimitry Andric uint64_t AlignRecord = Record[3]; 4064ff0cc061SDimitry Andric const uint64_t InAllocaMask = uint64_t(1) << 5; 4065ff0cc061SDimitry Andric const uint64_t ExplicitTypeMask = uint64_t(1) << 6; 4066ff0cc061SDimitry Andric const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask; 4067ff0cc061SDimitry Andric bool InAlloca = AlignRecord & InAllocaMask; 4068ff0cc061SDimitry Andric Type *Ty = getTypeByID(Record[0]); 4069ff0cc061SDimitry Andric if ((AlignRecord & ExplicitTypeMask) == 0) { 4070ff0cc061SDimitry Andric auto *PTy = dyn_cast_or_null<PointerType>(Ty); 4071ff0cc061SDimitry Andric if (!PTy) 40728f0fd8f6SDimitry Andric return error("Old-style alloca with a non-pointer type"); 4073ff0cc061SDimitry Andric Ty = PTy->getElementType(); 4074ff0cc061SDimitry Andric } 40756122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[1]); 407617a519f9SDimitry Andric Value *Size = getFnValueByID(Record[2], OpTy); 4077ff0cc061SDimitry Andric unsigned Align; 4078ff0cc061SDimitry Andric if (std::error_code EC = 4079ff0cc061SDimitry Andric parseAlignmentValue(AlignRecord & ~FlagMask, Align)) { 4080ff0cc061SDimitry Andric return EC; 4081ff0cc061SDimitry Andric } 4082f785676fSDimitry Andric if (!Ty || !Size) 40838f0fd8f6SDimitry Andric return error("Invalid record"); 4084ff0cc061SDimitry Andric AllocaInst *AI = new AllocaInst(Ty, Size, Align); 408591bc56edSDimitry Andric AI->setUsedWithInAlloca(InAlloca); 408691bc56edSDimitry Andric I = AI; 4087f22ef01cSRoman Divacky InstructionList.push_back(I); 4088f22ef01cSRoman Divacky break; 4089f22ef01cSRoman Divacky } 4090f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_LOAD: { // LOAD: [opty, op, align, vol] 4091f22ef01cSRoman Divacky unsigned OpNum = 0; 4092f22ef01cSRoman Divacky Value *Op; 4093f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4094ff0cc061SDimitry Andric (OpNum + 2 != Record.size() && OpNum + 3 != Record.size())) 40958f0fd8f6SDimitry Andric return error("Invalid record"); 4096f22ef01cSRoman Divacky 4097ff0cc061SDimitry Andric Type *Ty = nullptr; 4098ff0cc061SDimitry Andric if (OpNum + 3 == Record.size()) 4099ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4100ff0cc061SDimitry Andric if (std::error_code EC = 41018f0fd8f6SDimitry Andric typeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4102ff0cc061SDimitry Andric return EC; 4103ff0cc061SDimitry Andric if (!Ty) 4104ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4105ff0cc061SDimitry Andric 4106ff0cc061SDimitry Andric unsigned Align; 4107ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4108ff0cc061SDimitry Andric return EC; 4109ff0cc061SDimitry Andric I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align); 4110ff0cc061SDimitry Andric 4111f22ef01cSRoman Divacky InstructionList.push_back(I); 4112f22ef01cSRoman Divacky break; 4113f22ef01cSRoman Divacky } 41146122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_LOADATOMIC: { 41156122f3e6SDimitry Andric // LOADATOMIC: [opty, op, align, vol, ordering, synchscope] 41166122f3e6SDimitry Andric unsigned OpNum = 0; 41176122f3e6SDimitry Andric Value *Op; 41186122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Op) || 4119ff0cc061SDimitry Andric (OpNum + 4 != Record.size() && OpNum + 5 != Record.size())) 41208f0fd8f6SDimitry Andric return error("Invalid record"); 41216122f3e6SDimitry Andric 4122ff0cc061SDimitry Andric Type *Ty = nullptr; 4123ff0cc061SDimitry Andric if (OpNum + 5 == Record.size()) 4124ff0cc061SDimitry Andric Ty = getTypeByID(Record[OpNum++]); 4125ff0cc061SDimitry Andric if (std::error_code EC = 41268f0fd8f6SDimitry Andric typeCheckLoadStoreInst(DiagnosticHandler, Ty, Op->getType())) 4127ff0cc061SDimitry Andric return EC; 4128ff0cc061SDimitry Andric if (!Ty) 4129ff0cc061SDimitry Andric Ty = cast<PointerType>(Op->getType())->getElementType(); 4130ff0cc061SDimitry Andric 41318f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 41326122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Release || 41336122f3e6SDimitry Andric Ordering == AcquireRelease) 41348f0fd8f6SDimitry Andric return error("Invalid record"); 41356122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 41368f0fd8f6SDimitry Andric return error("Invalid record"); 41378f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 41386122f3e6SDimitry Andric 4139ff0cc061SDimitry Andric unsigned Align; 4140ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4141ff0cc061SDimitry Andric return EC; 4142ff0cc061SDimitry Andric I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope); 4143ff0cc061SDimitry Andric 41446122f3e6SDimitry Andric InstructionList.push_back(I); 41456122f3e6SDimitry Andric break; 41466122f3e6SDimitry Andric } 4147ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE: 4148ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STORE_OLD: { // STORE2:[ptrty, ptr, val, align, vol] 4149f22ef01cSRoman Divacky unsigned OpNum = 0; 4150f22ef01cSRoman Divacky Value *Val, *Ptr; 4151f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4152ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STORE 4153ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4154ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4155ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4156ff0cc061SDimitry Andric Val)) || 4157f22ef01cSRoman Divacky OpNum + 2 != Record.size()) 41588f0fd8f6SDimitry Andric return error("Invalid record"); 4159f22ef01cSRoman Divacky 41608f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4161ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4162ff0cc061SDimitry Andric return EC; 4163ff0cc061SDimitry Andric unsigned Align; 4164ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4165ff0cc061SDimitry Andric return EC; 4166ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align); 4167f22ef01cSRoman Divacky InstructionList.push_back(I); 4168f22ef01cSRoman Divacky break; 4169f22ef01cSRoman Divacky } 4170ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC: 4171ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_STOREATOMIC_OLD: { 41726122f3e6SDimitry Andric // STOREATOMIC: [ptrty, ptr, val, align, vol, ordering, synchscope] 41736122f3e6SDimitry Andric unsigned OpNum = 0; 41746122f3e6SDimitry Andric Value *Val, *Ptr; 41756122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4176ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_STOREATOMIC 4177ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Val) 4178ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4179ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4180ff0cc061SDimitry Andric Val)) || 41816122f3e6SDimitry Andric OpNum + 4 != Record.size()) 41828f0fd8f6SDimitry Andric return error("Invalid record"); 41836122f3e6SDimitry Andric 41848f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4185ff0cc061SDimitry Andric DiagnosticHandler, Val->getType(), Ptr->getType())) 4186ff0cc061SDimitry Andric return EC; 41878f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 41886122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Acquire || 41896122f3e6SDimitry Andric Ordering == AcquireRelease) 41908f0fd8f6SDimitry Andric return error("Invalid record"); 41918f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 41926122f3e6SDimitry Andric if (Ordering != NotAtomic && Record[OpNum] == 0) 41938f0fd8f6SDimitry Andric return error("Invalid record"); 41946122f3e6SDimitry Andric 4195ff0cc061SDimitry Andric unsigned Align; 4196ff0cc061SDimitry Andric if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) 4197ff0cc061SDimitry Andric return EC; 4198ff0cc061SDimitry Andric I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SynchScope); 41996122f3e6SDimitry Andric InstructionList.push_back(I); 42006122f3e6SDimitry Andric break; 42016122f3e6SDimitry Andric } 4202ff0cc061SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG_OLD: 42036122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_CMPXCHG: { 420491bc56edSDimitry Andric // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, 420591bc56edSDimitry Andric // failureordering?, isweak?] 42066122f3e6SDimitry Andric unsigned OpNum = 0; 42076122f3e6SDimitry Andric Value *Ptr, *Cmp, *New; 42086122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 4209ff0cc061SDimitry Andric (BitCode == bitc::FUNC_CODE_INST_CMPXCHG 4210ff0cc061SDimitry Andric ? getValueTypePair(Record, OpNum, NextValueNo, Cmp) 4211ff0cc061SDimitry Andric : popValue(Record, OpNum, NextValueNo, 4212ff0cc061SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), 4213ff0cc061SDimitry Andric Cmp)) || 4214ff0cc061SDimitry Andric popValue(Record, OpNum, NextValueNo, Cmp->getType(), New) || 4215ff0cc061SDimitry Andric Record.size() < OpNum + 3 || Record.size() > OpNum + 5) 42168f0fd8f6SDimitry Andric return error("Invalid record"); 42178f0fd8f6SDimitry Andric AtomicOrdering SuccessOrdering = getDecodedOrdering(Record[OpNum + 1]); 421891bc56edSDimitry Andric if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered) 42198f0fd8f6SDimitry Andric return error("Invalid record"); 42208f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 2]); 422191bc56edSDimitry Andric 42228f0fd8f6SDimitry Andric if (std::error_code EC = typeCheckLoadStoreInst( 4223ff0cc061SDimitry Andric DiagnosticHandler, Cmp->getType(), Ptr->getType())) 4224ff0cc061SDimitry Andric return EC; 422591bc56edSDimitry Andric AtomicOrdering FailureOrdering; 422691bc56edSDimitry Andric if (Record.size() < 7) 422791bc56edSDimitry Andric FailureOrdering = 422891bc56edSDimitry Andric AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrdering); 422991bc56edSDimitry Andric else 42308f0fd8f6SDimitry Andric FailureOrdering = getDecodedOrdering(Record[OpNum + 3]); 423191bc56edSDimitry Andric 423291bc56edSDimitry Andric I = new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering, FailureOrdering, 423391bc56edSDimitry Andric SynchScope); 42346122f3e6SDimitry Andric cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); 423591bc56edSDimitry Andric 423691bc56edSDimitry Andric if (Record.size() < 8) { 423791bc56edSDimitry Andric // Before weak cmpxchgs existed, the instruction simply returned the 423891bc56edSDimitry Andric // value loaded from memory, so bitcode files from that era will be 423991bc56edSDimitry Andric // expecting the first component of a modern cmpxchg. 424091bc56edSDimitry Andric CurBB->getInstList().push_back(I); 424191bc56edSDimitry Andric I = ExtractValueInst::Create(I, 0); 424291bc56edSDimitry Andric } else { 424391bc56edSDimitry Andric cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum+4]); 424491bc56edSDimitry Andric } 424591bc56edSDimitry Andric 42466122f3e6SDimitry Andric InstructionList.push_back(I); 42476122f3e6SDimitry Andric break; 42486122f3e6SDimitry Andric } 42496122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_ATOMICRMW: { 42506122f3e6SDimitry Andric // ATOMICRMW:[ptrty, ptr, val, op, vol, ordering, synchscope] 42516122f3e6SDimitry Andric unsigned OpNum = 0; 42526122f3e6SDimitry Andric Value *Ptr, *Val; 42536122f3e6SDimitry Andric if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || 42543861d79fSDimitry Andric popValue(Record, OpNum, NextValueNo, 42556122f3e6SDimitry Andric cast<PointerType>(Ptr->getType())->getElementType(), Val) || 42566122f3e6SDimitry Andric OpNum+4 != Record.size()) 42578f0fd8f6SDimitry Andric return error("Invalid record"); 42588f0fd8f6SDimitry Andric AtomicRMWInst::BinOp Operation = getDecodedRMWOperation(Record[OpNum]); 42596122f3e6SDimitry Andric if (Operation < AtomicRMWInst::FIRST_BINOP || 42606122f3e6SDimitry Andric Operation > AtomicRMWInst::LAST_BINOP) 42618f0fd8f6SDimitry Andric return error("Invalid record"); 42628f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[OpNum + 2]); 42636122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered) 42648f0fd8f6SDimitry Andric return error("Invalid record"); 42658f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[OpNum + 3]); 42666122f3e6SDimitry Andric I = new AtomicRMWInst(Operation, Ptr, Val, Ordering, SynchScope); 42676122f3e6SDimitry Andric cast<AtomicRMWInst>(I)->setVolatile(Record[OpNum+1]); 42686122f3e6SDimitry Andric InstructionList.push_back(I); 42696122f3e6SDimitry Andric break; 42706122f3e6SDimitry Andric } 42716122f3e6SDimitry Andric case bitc::FUNC_CODE_INST_FENCE: { // FENCE:[ordering, synchscope] 42726122f3e6SDimitry Andric if (2 != Record.size()) 42738f0fd8f6SDimitry Andric return error("Invalid record"); 42748f0fd8f6SDimitry Andric AtomicOrdering Ordering = getDecodedOrdering(Record[0]); 42756122f3e6SDimitry Andric if (Ordering == NotAtomic || Ordering == Unordered || 42766122f3e6SDimitry Andric Ordering == Monotonic) 42778f0fd8f6SDimitry Andric return error("Invalid record"); 42788f0fd8f6SDimitry Andric SynchronizationScope SynchScope = getDecodedSynchScope(Record[1]); 42796122f3e6SDimitry Andric I = new FenceInst(Context, Ordering, SynchScope); 42806122f3e6SDimitry Andric InstructionList.push_back(I); 42816122f3e6SDimitry Andric break; 42826122f3e6SDimitry Andric } 428317a519f9SDimitry Andric case bitc::FUNC_CODE_INST_CALL: { 4284f22ef01cSRoman Divacky // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...] 4285f22ef01cSRoman Divacky if (Record.size() < 3) 42868f0fd8f6SDimitry Andric return error("Invalid record"); 4287f22ef01cSRoman Divacky 4288ff0cc061SDimitry Andric unsigned OpNum = 0; 4289ff0cc061SDimitry Andric AttributeSet PAL = getAttributes(Record[OpNum++]); 4290ff0cc061SDimitry Andric unsigned CCInfo = Record[OpNum++]; 4291f22ef01cSRoman Divacky 4292ff0cc061SDimitry Andric FunctionType *FTy = nullptr; 4293ff0cc061SDimitry Andric if (CCInfo >> 15 & 1 && 4294ff0cc061SDimitry Andric !(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++])))) 42958f0fd8f6SDimitry Andric return error("Explicit call type is not a function type"); 4296ff0cc061SDimitry Andric 4297f22ef01cSRoman Divacky Value *Callee; 4298f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Callee)) 42998f0fd8f6SDimitry Andric return error("Invalid record"); 4300f22ef01cSRoman Divacky 43016122f3e6SDimitry Andric PointerType *OpTy = dyn_cast<PointerType>(Callee->getType()); 4302ff0cc061SDimitry Andric if (!OpTy) 43038f0fd8f6SDimitry Andric return error("Callee is not a pointer type"); 4304ff0cc061SDimitry Andric if (!FTy) { 4305ff0cc061SDimitry Andric FTy = dyn_cast<FunctionType>(OpTy->getElementType()); 4306ff0cc061SDimitry Andric if (!FTy) 43078f0fd8f6SDimitry Andric return error("Callee is not of pointer to function type"); 4308ff0cc061SDimitry Andric } else if (OpTy->getElementType() != FTy) 43098f0fd8f6SDimitry Andric return error("Explicit call type does not match pointee type of " 4310ff0cc061SDimitry Andric "callee operand"); 4311ff0cc061SDimitry Andric if (Record.size() < FTy->getNumParams() + OpNum) 43128f0fd8f6SDimitry Andric return error("Insufficient operands to call"); 4313f22ef01cSRoman Divacky 4314f22ef01cSRoman Divacky SmallVector<Value*, 16> Args; 4315f22ef01cSRoman Divacky // Read the fixed params. 4316f22ef01cSRoman Divacky for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { 431717a519f9SDimitry Andric if (FTy->getParamType(i)->isLabelTy()) 4318f22ef01cSRoman Divacky Args.push_back(getBasicBlock(Record[OpNum])); 4319f22ef01cSRoman Divacky else 43203861d79fSDimitry Andric Args.push_back(getValue(Record, OpNum, NextValueNo, 43213861d79fSDimitry Andric FTy->getParamType(i))); 432291bc56edSDimitry Andric if (!Args.back()) 43238f0fd8f6SDimitry Andric return error("Invalid record"); 4324f22ef01cSRoman Divacky } 4325f22ef01cSRoman Divacky 4326f22ef01cSRoman Divacky // Read type/value pairs for varargs params. 4327f22ef01cSRoman Divacky if (!FTy->isVarArg()) { 4328f22ef01cSRoman Divacky if (OpNum != Record.size()) 43298f0fd8f6SDimitry Andric return error("Invalid record"); 4330f22ef01cSRoman Divacky } else { 4331f22ef01cSRoman Divacky while (OpNum != Record.size()) { 4332f22ef01cSRoman Divacky Value *Op; 4333f22ef01cSRoman Divacky if (getValueTypePair(Record, OpNum, NextValueNo, Op)) 43348f0fd8f6SDimitry Andric return error("Invalid record"); 4335f22ef01cSRoman Divacky Args.push_back(Op); 4336f22ef01cSRoman Divacky } 4337f22ef01cSRoman Divacky } 4338f22ef01cSRoman Divacky 4339ff0cc061SDimitry Andric I = CallInst::Create(FTy, Callee, Args); 4340f22ef01cSRoman Divacky InstructionList.push_back(I); 4341f22ef01cSRoman Divacky cast<CallInst>(I)->setCallingConv( 434291bc56edSDimitry Andric static_cast<CallingConv::ID>((~(1U << 14) & CCInfo) >> 1)); 434391bc56edSDimitry Andric CallInst::TailCallKind TCK = CallInst::TCK_None; 434491bc56edSDimitry Andric if (CCInfo & 1) 434591bc56edSDimitry Andric TCK = CallInst::TCK_Tail; 434691bc56edSDimitry Andric if (CCInfo & (1 << 14)) 434791bc56edSDimitry Andric TCK = CallInst::TCK_MustTail; 434891bc56edSDimitry Andric cast<CallInst>(I)->setTailCallKind(TCK); 4349f22ef01cSRoman Divacky cast<CallInst>(I)->setAttributes(PAL); 4350f22ef01cSRoman Divacky break; 4351f22ef01cSRoman Divacky } 4352f22ef01cSRoman Divacky case bitc::FUNC_CODE_INST_VAARG: { // VAARG: [valistty, valist, instty] 4353f22ef01cSRoman Divacky if (Record.size() < 3) 43548f0fd8f6SDimitry Andric return error("Invalid record"); 43556122f3e6SDimitry Andric Type *OpTy = getTypeByID(Record[0]); 43563861d79fSDimitry Andric Value *Op = getValue(Record, 1, NextValueNo, OpTy); 43576122f3e6SDimitry Andric Type *ResTy = getTypeByID(Record[2]); 4358f22ef01cSRoman Divacky if (!OpTy || !Op || !ResTy) 43598f0fd8f6SDimitry Andric return error("Invalid record"); 4360f22ef01cSRoman Divacky I = new VAArgInst(Op, ResTy); 4361f22ef01cSRoman Divacky InstructionList.push_back(I); 4362f22ef01cSRoman Divacky break; 4363f22ef01cSRoman Divacky } 4364f22ef01cSRoman Divacky } 4365f22ef01cSRoman Divacky 4366f22ef01cSRoman Divacky // Add instruction to end of current BB. If there is no current BB, reject 4367f22ef01cSRoman Divacky // this file. 436891bc56edSDimitry Andric if (!CurBB) { 4369f22ef01cSRoman Divacky delete I; 43708f0fd8f6SDimitry Andric return error("Invalid instruction with no BB"); 4371f22ef01cSRoman Divacky } 4372f22ef01cSRoman Divacky CurBB->getInstList().push_back(I); 4373f22ef01cSRoman Divacky 4374f22ef01cSRoman Divacky // If this was a terminator instruction, move to the next block. 4375f22ef01cSRoman Divacky if (isa<TerminatorInst>(I)) { 4376f22ef01cSRoman Divacky ++CurBBNo; 437791bc56edSDimitry Andric CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr; 4378f22ef01cSRoman Divacky } 4379f22ef01cSRoman Divacky 4380f22ef01cSRoman Divacky // Non-void values get registered in the value table for future use. 4381f22ef01cSRoman Divacky if (I && !I->getType()->isVoidTy()) 43828f0fd8f6SDimitry Andric ValueList.assignValue(I, NextValueNo++); 4383f22ef01cSRoman Divacky } 4384f22ef01cSRoman Divacky 4385139f7f9bSDimitry Andric OutOfRecordLoop: 4386139f7f9bSDimitry Andric 4387f22ef01cSRoman Divacky // Check the function list for unresolved values. 4388f22ef01cSRoman Divacky if (Argument *A = dyn_cast<Argument>(ValueList.back())) { 438991bc56edSDimitry Andric if (!A->getParent()) { 4390f22ef01cSRoman Divacky // We found at least one unresolved value. Nuke them all to avoid leaks. 4391f22ef01cSRoman Divacky for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ 439291bc56edSDimitry Andric if ((A = dyn_cast_or_null<Argument>(ValueList[i])) && !A->getParent()) { 4393f22ef01cSRoman Divacky A->replaceAllUsesWith(UndefValue::get(A->getType())); 4394f22ef01cSRoman Divacky delete A; 4395f22ef01cSRoman Divacky } 4396f22ef01cSRoman Divacky } 43978f0fd8f6SDimitry Andric return error("Never resolved value found in function"); 4398f22ef01cSRoman Divacky } 4399f22ef01cSRoman Divacky } 4400f22ef01cSRoman Divacky 4401e580952dSDimitry Andric // FIXME: Check for unresolved forward-declared metadata references 4402e580952dSDimitry Andric // and clean up leaks. 4403e580952dSDimitry Andric 4404f22ef01cSRoman Divacky // Trim the value list down to the size it was before we parsed this function. 4405f22ef01cSRoman Divacky ValueList.shrinkTo(ModuleValueListSize); 4406e580952dSDimitry Andric MDValueList.shrinkTo(ModuleMDValueListSize); 4407f22ef01cSRoman Divacky std::vector<BasicBlock*>().swap(FunctionBBs); 440891bc56edSDimitry Andric return std::error_code(); 4409f22ef01cSRoman Divacky } 4410f22ef01cSRoman Divacky 4411f785676fSDimitry Andric /// Find the function body in the bitcode stream 44128f0fd8f6SDimitry Andric std::error_code BitcodeReader::findFunctionInStream( 441391bc56edSDimitry Andric Function *F, 4414dff0c46cSDimitry Andric DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) { 4415dff0c46cSDimitry Andric while (DeferredFunctionInfoIterator->second == 0) { 4416dff0c46cSDimitry Andric if (Stream.AtEndOfStream()) 44178f0fd8f6SDimitry Andric return error("Could not find function in stream"); 4418dff0c46cSDimitry Andric // ParseModule will parse the next body in the stream and set its 4419dff0c46cSDimitry Andric // position in the DeferredFunctionInfo map. 44208f0fd8f6SDimitry Andric if (std::error_code EC = parseModule(true)) 4421f785676fSDimitry Andric return EC; 4422dff0c46cSDimitry Andric } 442391bc56edSDimitry Andric return std::error_code(); 4424dff0c46cSDimitry Andric } 4425dff0c46cSDimitry Andric 4426f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4427f22ef01cSRoman Divacky // GVMaterializer implementation 4428f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4429f22ef01cSRoman Divacky 443091bc56edSDimitry Andric void BitcodeReader::releaseBuffer() { Buffer.release(); } 4431f22ef01cSRoman Divacky 443239d628a0SDimitry Andric std::error_code BitcodeReader::materialize(GlobalValue *GV) { 4433ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4434ff0cc061SDimitry Andric return EC; 4435ff0cc061SDimitry Andric 4436f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4437f22ef01cSRoman Divacky // If it's not a function or is already material, ignore the request. 4438f785676fSDimitry Andric if (!F || !F->isMaterializable()) 443991bc56edSDimitry Andric return std::error_code(); 4440f22ef01cSRoman Divacky 4441f22ef01cSRoman Divacky DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F); 4442f22ef01cSRoman Divacky assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!"); 4443dff0c46cSDimitry Andric // If its position is recorded as 0, its body is somewhere in the stream 4444dff0c46cSDimitry Andric // but we haven't seen it yet. 44453dac3a9bSDimitry Andric if (DFII->second == 0) 44468f0fd8f6SDimitry Andric if (std::error_code EC = findFunctionInStream(F, DFII)) 4447f785676fSDimitry Andric return EC; 4448f22ef01cSRoman Divacky 4449f22ef01cSRoman Divacky // Move the bit stream to the saved position of the deferred function body. 4450f22ef01cSRoman Divacky Stream.JumpToBit(DFII->second); 4451f22ef01cSRoman Divacky 44528f0fd8f6SDimitry Andric if (std::error_code EC = parseFunctionBody(F)) 4453f785676fSDimitry Andric return EC; 445439d628a0SDimitry Andric F->setIsMaterializable(false); 4455f22ef01cSRoman Divacky 4456ff0cc061SDimitry Andric if (StripDebugInfo) 4457ff0cc061SDimitry Andric stripDebugInfo(*F); 4458ff0cc061SDimitry Andric 4459f22ef01cSRoman Divacky // Upgrade any old intrinsic calls in the function. 44603dac3a9bSDimitry Andric for (auto &I : UpgradedIntrinsics) { 44613dac3a9bSDimitry Andric if (I.first != I.second) { 44623dac3a9bSDimitry Andric for (auto UI = I.first->user_begin(), UE = I.first->user_end(); 446391bc56edSDimitry Andric UI != UE;) { 44643dac3a9bSDimitry Andric User *U = *UI; 44653dac3a9bSDimitry Andric ++UI; 44663dac3a9bSDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(U)) 44673dac3a9bSDimitry Andric UpgradeIntrinsicCall(CI, I.second); 4468f22ef01cSRoman Divacky } 4469f22ef01cSRoman Divacky } 4470f22ef01cSRoman Divacky } 4471f22ef01cSRoman Divacky 447239d628a0SDimitry Andric // Bring in any functions that this function forward-referenced via 447339d628a0SDimitry Andric // blockaddresses. 447439d628a0SDimitry Andric return materializeForwardReferencedFunctions(); 4475f22ef01cSRoman Divacky } 4476f22ef01cSRoman Divacky 4477f22ef01cSRoman Divacky bool BitcodeReader::isDematerializable(const GlobalValue *GV) const { 4478f22ef01cSRoman Divacky const Function *F = dyn_cast<Function>(GV); 4479f22ef01cSRoman Divacky if (!F || F->isDeclaration()) 4480f22ef01cSRoman Divacky return false; 448139d628a0SDimitry Andric 448239d628a0SDimitry Andric // Dematerializing F would leave dangling references that wouldn't be 448339d628a0SDimitry Andric // reconnected on re-materialization. 448439d628a0SDimitry Andric if (BlockAddressesTaken.count(F)) 448539d628a0SDimitry Andric return false; 448639d628a0SDimitry Andric 4487f22ef01cSRoman Divacky return DeferredFunctionInfo.count(const_cast<Function*>(F)); 4488f22ef01cSRoman Divacky } 4489f22ef01cSRoman Divacky 4490ff0cc061SDimitry Andric void BitcodeReader::dematerialize(GlobalValue *GV) { 4491f22ef01cSRoman Divacky Function *F = dyn_cast<Function>(GV); 4492f22ef01cSRoman Divacky // If this function isn't dematerializable, this is a noop. 4493f22ef01cSRoman Divacky if (!F || !isDematerializable(F)) 4494f22ef01cSRoman Divacky return; 4495f22ef01cSRoman Divacky 4496f22ef01cSRoman Divacky assert(DeferredFunctionInfo.count(F) && "No info to read function later?"); 4497f22ef01cSRoman Divacky 4498f22ef01cSRoman Divacky // Just forget the function body, we can remat it later. 449939d628a0SDimitry Andric F->dropAllReferences(); 450039d628a0SDimitry Andric F->setIsMaterializable(true); 4501f22ef01cSRoman Divacky } 4502f22ef01cSRoman Divacky 4503ff0cc061SDimitry Andric std::error_code BitcodeReader::materializeModule(Module *M) { 4504f22ef01cSRoman Divacky assert(M == TheModule && 4505f22ef01cSRoman Divacky "Can only Materialize the Module this BitcodeReader is attached to."); 450639d628a0SDimitry Andric 4507ff0cc061SDimitry Andric if (std::error_code EC = materializeMetadata()) 4508ff0cc061SDimitry Andric return EC; 4509ff0cc061SDimitry Andric 451039d628a0SDimitry Andric // Promise to materialize all forward references. 451139d628a0SDimitry Andric WillMaterializeAllForwardRefs = true; 451239d628a0SDimitry Andric 4513f22ef01cSRoman Divacky // Iterate over the module, deserializing any functions that are still on 4514f22ef01cSRoman Divacky // disk. 4515f22ef01cSRoman Divacky for (Module::iterator F = TheModule->begin(), E = TheModule->end(); 4516f785676fSDimitry Andric F != E; ++F) { 451739d628a0SDimitry Andric if (std::error_code EC = materialize(F)) 4518f785676fSDimitry Andric return EC; 4519f785676fSDimitry Andric } 4520dff0c46cSDimitry Andric // At this point, if there are any function bodies, the current bit is 4521dff0c46cSDimitry Andric // pointing to the END_BLOCK record after them. Now make sure the rest 4522dff0c46cSDimitry Andric // of the bits in the module have been read. 4523dff0c46cSDimitry Andric if (NextUnreadBit) 45248f0fd8f6SDimitry Andric parseModule(true); 4525dff0c46cSDimitry Andric 452639d628a0SDimitry Andric // Check that all block address forward references got resolved (as we 452739d628a0SDimitry Andric // promised above). 452839d628a0SDimitry Andric if (!BasicBlockFwdRefs.empty()) 45298f0fd8f6SDimitry Andric return error("Never resolved function from blockaddress"); 453039d628a0SDimitry Andric 4531f22ef01cSRoman Divacky // Upgrade any intrinsic calls that slipped through (should not happen!) and 4532f22ef01cSRoman Divacky // delete the old functions to clean up. We can't do this unless the entire 4533f22ef01cSRoman Divacky // module is materialized because there could always be another function body 4534f22ef01cSRoman Divacky // with calls to the old function. 45353dac3a9bSDimitry Andric for (auto &I : UpgradedIntrinsics) { 45363dac3a9bSDimitry Andric if (I.first != I.second) { 45373dac3a9bSDimitry Andric for (auto *U : I.first->users()) { 45383dac3a9bSDimitry Andric if (CallInst *CI = dyn_cast<CallInst>(U)) 45393dac3a9bSDimitry Andric UpgradeIntrinsicCall(CI, I.second); 4540f22ef01cSRoman Divacky } 45413dac3a9bSDimitry Andric if (!I.first->use_empty()) 45423dac3a9bSDimitry Andric I.first->replaceAllUsesWith(I.second); 45433dac3a9bSDimitry Andric I.first->eraseFromParent(); 4544f22ef01cSRoman Divacky } 4545f22ef01cSRoman Divacky } 45463dac3a9bSDimitry Andric UpgradedIntrinsics.clear(); 4547f22ef01cSRoman Divacky 4548f785676fSDimitry Andric for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) 4549f785676fSDimitry Andric UpgradeInstWithTBAATag(InstsWithTBAATag[I]); 4550f785676fSDimitry Andric 4551f785676fSDimitry Andric UpgradeDebugInfo(*M); 455291bc56edSDimitry Andric return std::error_code(); 4553dff0c46cSDimitry Andric } 45546122f3e6SDimitry Andric 455539d628a0SDimitry Andric std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes() const { 455639d628a0SDimitry Andric return IdentifiedStructTypes; 455739d628a0SDimitry Andric } 455839d628a0SDimitry Andric 45598f0fd8f6SDimitry Andric std::error_code 45608f0fd8f6SDimitry Andric BitcodeReader::initStream(std::unique_ptr<DataStreamer> Streamer) { 45618f0fd8f6SDimitry Andric if (Streamer) 45628f0fd8f6SDimitry Andric return initLazyStream(std::move(Streamer)); 45638f0fd8f6SDimitry Andric return initStreamFromBuffer(); 4564dff0c46cSDimitry Andric } 4565dff0c46cSDimitry Andric 45668f0fd8f6SDimitry Andric std::error_code BitcodeReader::initStreamFromBuffer() { 45673861d79fSDimitry Andric const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); 4568dff0c46cSDimitry Andric const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); 4569dff0c46cSDimitry Andric 457039d628a0SDimitry Andric if (Buffer->getBufferSize() & 3) 45718f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4572dff0c46cSDimitry Andric 4573dff0c46cSDimitry Andric // If we have a wrapper header, parse it and ignore the non-bc file contents. 4574dff0c46cSDimitry Andric // The magic number is 0x0B17C0DE stored in little endian. 4575dff0c46cSDimitry Andric if (isBitcodeWrapper(BufPtr, BufEnd)) 4576dff0c46cSDimitry Andric if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true)) 45778f0fd8f6SDimitry Andric return error("Invalid bitcode wrapper header"); 4578dff0c46cSDimitry Andric 4579dff0c46cSDimitry Andric StreamFile.reset(new BitstreamReader(BufPtr, BufEnd)); 458039d628a0SDimitry Andric Stream.init(&*StreamFile); 4581f22ef01cSRoman Divacky 458291bc56edSDimitry Andric return std::error_code(); 4583f22ef01cSRoman Divacky } 4584f22ef01cSRoman Divacky 45858f0fd8f6SDimitry Andric std::error_code 45868f0fd8f6SDimitry Andric BitcodeReader::initLazyStream(std::unique_ptr<DataStreamer> Streamer) { 4587dff0c46cSDimitry Andric // Check and strip off the bitcode wrapper; BitstreamReader expects never to 4588dff0c46cSDimitry Andric // see it. 45898f0fd8f6SDimitry Andric auto OwnedBytes = 45908f0fd8f6SDimitry Andric llvm::make_unique<StreamingMemoryObject>(std::move(Streamer)); 459139d628a0SDimitry Andric StreamingMemoryObject &Bytes = *OwnedBytes; 459239d628a0SDimitry Andric StreamFile = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes)); 459339d628a0SDimitry Andric Stream.init(&*StreamFile); 4594dff0c46cSDimitry Andric 4595dff0c46cSDimitry Andric unsigned char buf[16]; 459639d628a0SDimitry Andric if (Bytes.readBytes(buf, 16, 0) != 16) 45978f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4598dff0c46cSDimitry Andric 4599dff0c46cSDimitry Andric if (!isBitcode(buf, buf + 16)) 46008f0fd8f6SDimitry Andric return error("Invalid bitcode signature"); 4601dff0c46cSDimitry Andric 4602dff0c46cSDimitry Andric if (isBitcodeWrapper(buf, buf + 4)) { 4603dff0c46cSDimitry Andric const unsigned char *bitcodeStart = buf; 4604dff0c46cSDimitry Andric const unsigned char *bitcodeEnd = buf + 16; 4605dff0c46cSDimitry Andric SkipBitcodeWrapperHeader(bitcodeStart, bitcodeEnd, false); 460639d628a0SDimitry Andric Bytes.dropLeadingBytes(bitcodeStart - buf); 460739d628a0SDimitry Andric Bytes.setKnownObjectSize(bitcodeEnd - bitcodeStart); 4608dff0c46cSDimitry Andric } 460991bc56edSDimitry Andric return std::error_code(); 4610f785676fSDimitry Andric } 4611f785676fSDimitry Andric 4612f785676fSDimitry Andric namespace { 461391bc56edSDimitry Andric class BitcodeErrorCategoryType : public std::error_category { 461491bc56edSDimitry Andric const char *name() const LLVM_NOEXCEPT override { 4615f785676fSDimitry Andric return "llvm.bitcode"; 4616f785676fSDimitry Andric } 461791bc56edSDimitry Andric std::string message(int IE) const override { 461839d628a0SDimitry Andric BitcodeError E = static_cast<BitcodeError>(IE); 4619f785676fSDimitry Andric switch (E) { 462039d628a0SDimitry Andric case BitcodeError::InvalidBitcodeSignature: 4621f785676fSDimitry Andric return "Invalid bitcode signature"; 462239d628a0SDimitry Andric case BitcodeError::CorruptedBitcode: 462339d628a0SDimitry Andric return "Corrupted bitcode"; 4624f785676fSDimitry Andric } 4625f785676fSDimitry Andric llvm_unreachable("Unknown error type!"); 4626f785676fSDimitry Andric } 4627f785676fSDimitry Andric }; 46283dac3a9bSDimitry Andric } 4629f785676fSDimitry Andric 463039d628a0SDimitry Andric static ManagedStatic<BitcodeErrorCategoryType> ErrorCategory; 463139d628a0SDimitry Andric 463239d628a0SDimitry Andric const std::error_category &llvm::BitcodeErrorCategory() { 463339d628a0SDimitry Andric return *ErrorCategory; 4634dff0c46cSDimitry Andric } 4635f22ef01cSRoman Divacky 4636f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4637f22ef01cSRoman Divacky // External interface 4638f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 4639f22ef01cSRoman Divacky 46408f0fd8f6SDimitry Andric static ErrorOr<std::unique_ptr<Module>> 46418f0fd8f6SDimitry Andric getBitcodeModuleImpl(std::unique_ptr<DataStreamer> Streamer, StringRef Name, 46428f0fd8f6SDimitry Andric BitcodeReader *R, LLVMContext &Context, 46438f0fd8f6SDimitry Andric bool MaterializeAll, bool ShouldLazyLoadMetadata) { 46448f0fd8f6SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 46458f0fd8f6SDimitry Andric M->setMaterializer(R); 46468f0fd8f6SDimitry Andric 46478f0fd8f6SDimitry Andric auto cleanupOnError = [&](std::error_code EC) { 46488f0fd8f6SDimitry Andric R->releaseBuffer(); // Never take ownership on error. 46498f0fd8f6SDimitry Andric return EC; 46508f0fd8f6SDimitry Andric }; 46518f0fd8f6SDimitry Andric 46528f0fd8f6SDimitry Andric // Delay parsing Metadata if ShouldLazyLoadMetadata is true. 46538f0fd8f6SDimitry Andric if (std::error_code EC = R->parseBitcodeInto(std::move(Streamer), M.get(), 46548f0fd8f6SDimitry Andric ShouldLazyLoadMetadata)) 46558f0fd8f6SDimitry Andric return cleanupOnError(EC); 46568f0fd8f6SDimitry Andric 46578f0fd8f6SDimitry Andric if (MaterializeAll) { 46588f0fd8f6SDimitry Andric // Read in the entire module, and destroy the BitcodeReader. 46598f0fd8f6SDimitry Andric if (std::error_code EC = M->materializeAllPermanently()) 46608f0fd8f6SDimitry Andric return cleanupOnError(EC); 46618f0fd8f6SDimitry Andric } else { 46628f0fd8f6SDimitry Andric // Resolve forward references from blockaddresses. 46638f0fd8f6SDimitry Andric if (std::error_code EC = R->materializeForwardReferencedFunctions()) 46648f0fd8f6SDimitry Andric return cleanupOnError(EC); 46658f0fd8f6SDimitry Andric } 46668f0fd8f6SDimitry Andric return std::move(M); 46678f0fd8f6SDimitry Andric } 46688f0fd8f6SDimitry Andric 466939d628a0SDimitry Andric /// \brief Get a lazy one-at-time loading module from bitcode. 4670f22ef01cSRoman Divacky /// 467139d628a0SDimitry Andric /// This isn't always used in a lazy context. In particular, it's also used by 467239d628a0SDimitry Andric /// \a parseBitcodeFile(). If this is truly lazy, then we need to eagerly pull 467339d628a0SDimitry Andric /// in forward-referenced functions from block address references. 467439d628a0SDimitry Andric /// 46758f0fd8f6SDimitry Andric /// \param[in] MaterializeAll Set to \c true if we should materialize 46768f0fd8f6SDimitry Andric /// everything. 46778f0fd8f6SDimitry Andric static ErrorOr<std::unique_ptr<Module>> 467839d628a0SDimitry Andric getLazyBitcodeModuleImpl(std::unique_ptr<MemoryBuffer> &&Buffer, 46798f0fd8f6SDimitry Andric LLVMContext &Context, bool MaterializeAll, 4680ff0cc061SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, 4681ff0cc061SDimitry Andric bool ShouldLazyLoadMetadata = false) { 468239d628a0SDimitry Andric BitcodeReader *R = 468339d628a0SDimitry Andric new BitcodeReader(Buffer.get(), Context, DiagnosticHandler); 468439d628a0SDimitry Andric 46858f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> Ret = 46868f0fd8f6SDimitry Andric getBitcodeModuleImpl(nullptr, Buffer->getBufferIdentifier(), R, Context, 46878f0fd8f6SDimitry Andric MaterializeAll, ShouldLazyLoadMetadata); 46888f0fd8f6SDimitry Andric if (!Ret) 46898f0fd8f6SDimitry Andric return Ret; 469039d628a0SDimitry Andric 469139d628a0SDimitry Andric Buffer.release(); // The BitcodeReader owns it now. 46928f0fd8f6SDimitry Andric return Ret; 4693dff0c46cSDimitry Andric } 4694dff0c46cSDimitry Andric 46958f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> llvm::getLazyBitcodeModule( 46968f0fd8f6SDimitry Andric std::unique_ptr<MemoryBuffer> &&Buffer, LLVMContext &Context, 46978f0fd8f6SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler, bool ShouldLazyLoadMetadata) { 469839d628a0SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buffer), Context, false, 4699ff0cc061SDimitry Andric DiagnosticHandler, ShouldLazyLoadMetadata); 4700f22ef01cSRoman Divacky } 4701f22ef01cSRoman Divacky 47028f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> llvm::getStreamedBitcodeModule( 47038f0fd8f6SDimitry Andric StringRef Name, std::unique_ptr<DataStreamer> Streamer, 47048f0fd8f6SDimitry Andric LLVMContext &Context, DiagnosticHandlerFunction DiagnosticHandler) { 470539d628a0SDimitry Andric std::unique_ptr<Module> M = make_unique<Module>(Name, Context); 47068f0fd8f6SDimitry Andric BitcodeReader *R = new BitcodeReader(Context, DiagnosticHandler); 47078f0fd8f6SDimitry Andric 47088f0fd8f6SDimitry Andric return getBitcodeModuleImpl(std::move(Streamer), Name, R, Context, false, 47098f0fd8f6SDimitry Andric false); 471039d628a0SDimitry Andric } 471139d628a0SDimitry Andric 47128f0fd8f6SDimitry Andric ErrorOr<std::unique_ptr<Module>> 471339d628a0SDimitry Andric llvm::parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, 471439d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 471539d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 47168f0fd8f6SDimitry Andric return getLazyBitcodeModuleImpl(std::move(Buf), Context, true, 47178f0fd8f6SDimitry Andric DiagnosticHandler); 4718dff0c46cSDimitry Andric // TODO: Restore the use-lists to the in-memory state when the bitcode was 4719dff0c46cSDimitry Andric // written. We must defer until the Module has been fully materialized. 4720f22ef01cSRoman Divacky } 47212754fe60SDimitry Andric 472239d628a0SDimitry Andric std::string 472339d628a0SDimitry Andric llvm::getBitcodeTargetTriple(MemoryBufferRef Buffer, LLVMContext &Context, 472439d628a0SDimitry Andric DiagnosticHandlerFunction DiagnosticHandler) { 472539d628a0SDimitry Andric std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Buffer, false); 472639d628a0SDimitry Andric auto R = llvm::make_unique<BitcodeReader>(Buf.release(), Context, 472739d628a0SDimitry Andric DiagnosticHandler); 472891bc56edSDimitry Andric ErrorOr<std::string> Triple = R->parseTriple(); 472991bc56edSDimitry Andric if (Triple.getError()) 473091bc56edSDimitry Andric return ""; 473191bc56edSDimitry Andric return Triple.get(); 47322754fe60SDimitry Andric } 4733