Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 1 | //===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This header defines the BitcodeReader class. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #ifndef BITCODE_READER_H |
| 15 | #define BITCODE_READER_H |
| 16 | |
Chandler Carruth | a1514e2 | 2012-12-04 07:12:27 +0000 | [diff] [blame] | 17 | #include "llvm/ADT/DenseMap.h" |
Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 18 | #include "llvm/Bitcode/BitstreamReader.h" |
Chris Lattner | 47f96bf | 2007-04-23 01:01:37 +0000 | [diff] [blame] | 19 | #include "llvm/Bitcode/LLVMBitCodes.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 20 | #include "llvm/IR/Attributes.h" |
Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 21 | #include "llvm/IR/GVMaterializer.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 22 | #include "llvm/IR/OperandTraits.h" |
| 23 | #include "llvm/IR/Type.h" |
Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 24 | #include "llvm/IR/ValueHandle.h" |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 25 | #include "llvm/Support/system_error.h" |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 26 | #include <vector> |
| 27 | |
| 28 | namespace llvm { |
Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 29 | class MemoryBuffer; |
Benjamin Kramer | 12ddd40 | 2009-08-11 17:45:13 +0000 | [diff] [blame] | 30 | class LLVMContext; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 31 | |
Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 32 | //===----------------------------------------------------------------------===// |
| 33 | // BitcodeReaderValueList Class |
| 34 | //===----------------------------------------------------------------------===// |
| 35 | |
Benjamin Kramer | 55c06ae | 2013-09-11 18:05:11 +0000 | [diff] [blame] | 36 | class BitcodeReaderValueList { |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 37 | std::vector<WeakVH> ValuePtrs; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 38 | |
Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 39 | /// ResolveConstants - As we resolve forward-referenced constants, we add |
| 40 | /// information about them to this vector. This allows us to resolve them in |
| 41 | /// bulk instead of resolving each reference at a time. See the code in |
| 42 | /// ResolveConstantForwardRefs for more information about this. |
| 43 | /// |
| 44 | /// The key of this vector is the placeholder constant, the value is the slot |
| 45 | /// number that holds the resolved value. |
| 46 | typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; |
| 47 | ResolveConstantsTy ResolveConstants; |
Chris Lattner | 7af453a | 2011-07-07 05:12:37 +0000 | [diff] [blame] | 48 | LLVMContext &Context; |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 49 | public: |
Chris Lattner | 7af453a | 2011-07-07 05:12:37 +0000 | [diff] [blame] | 50 | BitcodeReaderValueList(LLVMContext &C) : Context(C) {} |
Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 51 | ~BitcodeReaderValueList() { |
| 52 | assert(ResolveConstants.empty() && "Constants not resolved?"); |
| 53 | } |
Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 54 | |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 55 | // vector compatibility methods |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 56 | unsigned size() const { return ValuePtrs.size(); } |
| 57 | void resize(unsigned N) { ValuePtrs.resize(N); } |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 58 | void push_back(Value *V) { |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 59 | ValuePtrs.push_back(V); |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 60 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 61 | |
Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 62 | void clear() { |
Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 63 | assert(ResolveConstants.empty() && "Constants not resolved?"); |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 64 | ValuePtrs.clear(); |
Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 65 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 66 | |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 67 | Value *operator[](unsigned i) const { |
| 68 | assert(i < ValuePtrs.size()); |
| 69 | return ValuePtrs[i]; |
| 70 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 71 | |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 72 | Value *back() const { return ValuePtrs.back(); } |
| 73 | void pop_back() { ValuePtrs.pop_back(); } |
| 74 | bool empty() const { return ValuePtrs.empty(); } |
Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 75 | void shrinkTo(unsigned N) { |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 76 | assert(N <= size() && "Invalid shrinkTo request!"); |
| 77 | ValuePtrs.resize(N); |
Chris Lattner | 198f34a | 2007-04-26 03:27:58 +0000 | [diff] [blame] | 78 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 79 | |
Chris Lattner | db125cf | 2011-07-18 04:54:35 +0000 | [diff] [blame] | 80 | Constant *getConstantFwdRef(unsigned Idx, Type *Ty); |
| 81 | Value *getValueFwdRef(unsigned Idx, Type *Ty); |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 82 | |
Chris Lattner | 46e7740 | 2009-03-31 22:55:09 +0000 | [diff] [blame] | 83 | void AssignValue(Value *V, unsigned Idx); |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 84 | |
Chris Lattner | ea693df | 2008-08-21 02:34:16 +0000 | [diff] [blame] | 85 | /// ResolveConstantForwardRefs - Once all constants are read, this method bulk |
| 86 | /// resolves any forward references. |
| 87 | void ResolveConstantForwardRefs(); |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 88 | }; |
Gabor Greif | efe6536 | 2008-05-10 08:32:32 +0000 | [diff] [blame] | 89 | |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 90 | |
| 91 | //===----------------------------------------------------------------------===// |
| 92 | // BitcodeReaderMDValueList Class |
| 93 | //===----------------------------------------------------------------------===// |
| 94 | |
Benjamin Kramer | 55c06ae | 2013-09-11 18:05:11 +0000 | [diff] [blame] | 95 | class BitcodeReaderMDValueList { |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 96 | std::vector<WeakVH> MDValuePtrs; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 97 | |
Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 98 | LLVMContext &Context; |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 99 | public: |
| 100 | BitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} |
| 101 | |
| 102 | // vector compatibility methods |
| 103 | unsigned size() const { return MDValuePtrs.size(); } |
| 104 | void resize(unsigned N) { MDValuePtrs.resize(N); } |
| 105 | void push_back(Value *V) { MDValuePtrs.push_back(V); } |
| 106 | void clear() { MDValuePtrs.clear(); } |
| 107 | Value *back() const { return MDValuePtrs.back(); } |
| 108 | void pop_back() { MDValuePtrs.pop_back(); } |
| 109 | bool empty() const { return MDValuePtrs.empty(); } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 110 | |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 111 | Value *operator[](unsigned i) const { |
| 112 | assert(i < MDValuePtrs.size()); |
| 113 | return MDValuePtrs[i]; |
| 114 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 115 | |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 116 | void shrinkTo(unsigned N) { |
| 117 | assert(N <= size() && "Invalid shrinkTo request!"); |
| 118 | MDValuePtrs.resize(N); |
| 119 | } |
| 120 | |
| 121 | Value *getValueFwdRef(unsigned Idx); |
| 122 | void AssignValue(Value *V, unsigned Idx); |
| 123 | }; |
| 124 | |
Benjamin Kramer | 55c06ae | 2013-09-11 18:05:11 +0000 | [diff] [blame] | 125 | class BitcodeReader : public GVMaterializer { |
Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 126 | LLVMContext &Context; |
Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 127 | Module *TheModule; |
Chris Lattner | c453f76 | 2007-04-29 07:54:31 +0000 | [diff] [blame] | 128 | MemoryBuffer *Buffer; |
Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 129 | bool BufferOwned; |
Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 130 | std::unique_ptr<BitstreamReader> StreamFile; |
Chris Lattner | 962dde3 | 2009-04-26 20:59:02 +0000 | [diff] [blame] | 131 | BitstreamCursor Stream; |
Derek Schuff | 2ea9387 | 2012-02-06 22:30:29 +0000 | [diff] [blame] | 132 | DataStreamer *LazyStreamer; |
| 133 | uint64_t NextUnreadBit; |
| 134 | bool SeenValueSymbolTable; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 135 | |
Chris Lattner | 1afcace | 2011-07-09 17:41:24 +0000 | [diff] [blame] | 136 | std::vector<Type*> TypeList; |
Chris Lattner | 522b7b1 | 2007-04-24 05:48:56 +0000 | [diff] [blame] | 137 | BitcodeReaderValueList ValueList; |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 138 | BitcodeReaderMDValueList MDValueList; |
Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 139 | SmallVector<Instruction *, 64> InstructionList; |
Chad Rosier | cbbb096 | 2011-12-07 21:44:12 +0000 | [diff] [blame] | 140 | SmallVector<SmallVector<uint64_t, 64>, 64> UseListRecords; |
Devang Patel | e8e0213 | 2009-09-18 19:26:43 +0000 | [diff] [blame] | 141 | |
Chris Lattner | e16504e | 2007-04-24 03:30:34 +0000 | [diff] [blame] | 142 | std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; |
Chris Lattner | 07d98b4 | 2007-04-26 02:46:40 +0000 | [diff] [blame] | 143 | std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; |
Peter Collingbourne | 1e3037f | 2013-09-16 01:08:15 +0000 | [diff] [blame] | 144 | std::vector<std::pair<Function*, unsigned> > FunctionPrefixes; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 145 | |
Manman Ren | 804f034 | 2013-09-28 00:22:27 +0000 | [diff] [blame] | 146 | SmallVector<Instruction*, 64> InstsWithTBAATag; |
| 147 | |
Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 148 | /// MAttributes - The set of attributes by index. Index zero in the |
Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 149 | /// file is for null, and is thus not represented here. As such all indices |
| 150 | /// are off by one. |
Bill Wendling | 99faa3b | 2012-12-07 23:16:57 +0000 | [diff] [blame] | 151 | std::vector<AttributeSet> MAttributes; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 152 | |
Bill Wendling | c3ba0a8 | 2013-02-10 23:24:25 +0000 | [diff] [blame] | 153 | /// \brief The set of attribute groups. |
Bill Wendling | 04ef4be | 2013-02-11 22:32:29 +0000 | [diff] [blame] | 154 | std::map<unsigned, AttributeSet> MAttributeGroups; |
Bill Wendling | c3ba0a8 | 2013-02-10 23:24:25 +0000 | [diff] [blame] | 155 | |
Chris Lattner | 980e5aa | 2007-05-01 05:52:21 +0000 | [diff] [blame] | 156 | /// FunctionBBs - While parsing a function body, this is a list of the basic |
| 157 | /// blocks for the function. |
| 158 | std::vector<BasicBlock*> FunctionBBs; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 159 | |
Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 160 | // When reading the module header, this list is populated with functions that |
| 161 | // have bodies later in the file. |
| 162 | std::vector<Function*> FunctionsWithBodies; |
Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 163 | |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 164 | // When intrinsic functions are encountered which require upgrading they are |
Chandler Carruth | 6994040 | 2007-08-04 01:51:18 +0000 | [diff] [blame] | 165 | // stored here with their replacement function. |
| 166 | typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; |
| 167 | UpgradedIntrinsicMap UpgradedIntrinsics; |
Dan Gohman | 19538d1 | 2010-07-20 21:42:28 +0000 | [diff] [blame] | 168 | |
| 169 | // Map the bitcode's custom MDKind ID to the Module's MDKind ID. |
| 170 | DenseMap<unsigned, unsigned> MDKindMap; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 171 | |
Derek Schuff | 2ea9387 | 2012-02-06 22:30:29 +0000 | [diff] [blame] | 172 | // Several operations happen after the module header has been read, but |
| 173 | // before function bodies are processed. This keeps track of whether |
| 174 | // we've done this yet. |
| 175 | bool SeenFirstFunctionBody; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 176 | |
Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 177 | /// DeferredFunctionInfo - When function bodies are initially scanned, this |
Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 178 | /// map contains info about where to find deferred function body in the |
| 179 | /// stream. |
| 180 | DenseMap<Function*, uint64_t> DeferredFunctionInfo; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 181 | |
Chris Lattner | 50b136d | 2009-10-28 05:53:48 +0000 | [diff] [blame] | 182 | /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These |
| 183 | /// are resolved lazily when functions are loaded. |
| 184 | typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; |
| 185 | DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; |
Dan Gohman | 9b10dfb | 2010-09-13 18:00:48 +0000 | [diff] [blame] | 186 | |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 187 | /// UseRelativeIDs - Indicates that we are using a new encoding for |
Jan Wen Voung | 7b8d949 | 2012-10-11 21:45:16 +0000 | [diff] [blame] | 188 | /// instruction operands where most operands in the current |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 189 | /// FUNCTION_BLOCK are encoded relative to the instruction number, |
| 190 | /// for a more compact encoding. Some instruction operands are not |
| 191 | /// relative to the instruction ID: basic block numbers, and types. |
| 192 | /// Once the old style function blocks have been phased out, we would |
| 193 | /// not need this flag. |
| 194 | bool UseRelativeIDs; |
| 195 | |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 196 | static const error_category &BitcodeErrorCategory(); |
| 197 | |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 198 | public: |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 199 | enum ErrorType { |
| 200 | BitcodeStreamInvalidSize, |
| 201 | ConflictingMETADATA_KINDRecords, |
| 202 | CouldNotFindFunctionInStream, |
| 203 | ExpectedConstant, |
| 204 | InsufficientFunctionProtos, |
| 205 | InvalidBitcodeSignature, |
| 206 | InvalidBitcodeWrapperHeader, |
| 207 | InvalidConstantReference, |
| 208 | InvalidID, // A read identifier is not found in the table it should be in. |
| 209 | InvalidInstructionWithNoBB, |
| 210 | InvalidRecord, // A read record doesn't have the expected size or structure |
| 211 | InvalidTypeForValue, // Type read OK, but is invalid for its use |
| 212 | InvalidTYPETable, |
| 213 | InvalidType, // We were unable to read a type |
| 214 | MalformedBlock, // We are unable to advance in the stream. |
| 215 | MalformedGlobalInitializerSet, |
| 216 | InvalidMultipleBlocks, // We found multiple blocks of a kind that should |
| 217 | // have only one |
| 218 | NeverResolvedValueFoundInFunction, |
| 219 | InvalidValue // Invalid version, inst number, attr number, etc |
| 220 | }; |
| 221 | |
| 222 | error_code Error(ErrorType E) { |
| 223 | return error_code(E, BitcodeErrorCategory()); |
| 224 | } |
| 225 | |
Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 226 | explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 227 | : Context(C), TheModule(nullptr), Buffer(buffer), BufferOwned(false), |
| 228 | LazyStreamer(nullptr), NextUnreadBit(0), SeenValueSymbolTable(false), |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 229 | ValueList(C), MDValueList(C), |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 230 | SeenFirstFunctionBody(false), UseRelativeIDs(false) { |
Derek Schuff | 2ea9387 | 2012-02-06 22:30:29 +0000 | [diff] [blame] | 231 | } |
| 232 | explicit BitcodeReader(DataStreamer *streamer, LLVMContext &C) |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 233 | : Context(C), TheModule(nullptr), Buffer(nullptr), BufferOwned(false), |
Derek Schuff | 0ffe698 | 2012-02-29 00:07:09 +0000 | [diff] [blame] | 234 | LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false), |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 235 | ValueList(C), MDValueList(C), |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 236 | SeenFirstFunctionBody(false), UseRelativeIDs(false) { |
Chris Lattner | 48f8487 | 2007-05-01 04:59:48 +0000 | [diff] [blame] | 237 | } |
Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 238 | ~BitcodeReader() { |
| 239 | FreeState(); |
| 240 | } |
Rafael Espindola | 47f79bb | 2012-01-02 07:49:53 +0000 | [diff] [blame] | 241 | |
| 242 | void materializeForwardReferencedFunctions(); |
| 243 | |
Chris Lattner | b348bb8 | 2007-05-18 04:02:46 +0000 | [diff] [blame] | 244 | void FreeState(); |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 245 | |
Jeffrey Yasskin | f0356fe | 2010-01-27 20:34:15 +0000 | [diff] [blame] | 246 | /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer |
| 247 | /// when the reader is destroyed. |
| 248 | void setBufferOwned(bool Owned) { BufferOwned = Owned; } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 249 | |
Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 250 | bool isMaterializable(const GlobalValue *GV) const override; |
| 251 | bool isDematerializable(const GlobalValue *GV) const override; |
| 252 | error_code Materialize(GlobalValue *GV) override; |
| 253 | error_code MaterializeModule(Module *M) override; |
| 254 | void Dematerialize(GlobalValue *GV) override; |
Chris Lattner | d67c632 | 2007-05-15 06:29:44 +0000 | [diff] [blame] | 255 | |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 256 | /// @brief Main interface to parsing a bitcode buffer. |
| 257 | /// @returns true if an error occurred. |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 258 | error_code ParseBitcodeInto(Module *M); |
Bill Wendling | 3471174 | 2010-10-06 01:22:42 +0000 | [diff] [blame] | 259 | |
| 260 | /// @brief Cheap mechanism to just extract module triple |
| 261 | /// @returns true if an error occurred. |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 262 | error_code ParseTriple(std::string &Triple); |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 263 | |
| 264 | static uint64_t decodeSignRotatedValue(uint64_t V); |
| 265 | |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 266 | private: |
Chris Lattner | 1afcace | 2011-07-09 17:41:24 +0000 | [diff] [blame] | 267 | Type *getTypeByID(unsigned ID); |
Chris Lattner | db125cf | 2011-07-18 04:54:35 +0000 | [diff] [blame] | 268 | Value *getFnValueByID(unsigned ID, Type *Ty) { |
Chris Lattner | cbd40f8 | 2011-07-07 05:29:18 +0000 | [diff] [blame] | 269 | if (Ty && Ty->isMetadataTy()) |
Devang Patel | d5ac404 | 2009-08-04 06:00:18 +0000 | [diff] [blame] | 270 | return MDValueList.getValueFwdRef(ID); |
Chris Lattner | 7af453a | 2011-07-07 05:12:37 +0000 | [diff] [blame] | 271 | return ValueList.getValueFwdRef(ID, Ty); |
Chris Lattner | a7c49aa | 2007-05-01 07:01:57 +0000 | [diff] [blame] | 272 | } |
Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 273 | BasicBlock *getBasicBlock(unsigned ID) const { |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 274 | if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID |
Chris Lattner | f4c8e52 | 2007-05-02 05:46:45 +0000 | [diff] [blame] | 275 | return FunctionBBs[ID]; |
| 276 | } |
Bill Wendling | 99faa3b | 2012-12-07 23:16:57 +0000 | [diff] [blame] | 277 | AttributeSet getAttributes(unsigned i) const { |
Devang Patel | 19c8746 | 2008-09-26 22:53:05 +0000 | [diff] [blame] | 278 | if (i-1 < MAttributes.size()) |
| 279 | return MAttributes[i-1]; |
Bill Wendling | 99faa3b | 2012-12-07 23:16:57 +0000 | [diff] [blame] | 280 | return AttributeSet(); |
Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 281 | } |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 282 | |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 283 | /// getValueTypePair - Read a value/type pair out of the specified record from |
| 284 | /// slot 'Slot'. Increment Slot past the number of slots used in the record. |
| 285 | /// Return true on failure. |
Craig Topper | 9e639e8 | 2013-07-11 16:22:38 +0000 | [diff] [blame] | 286 | bool getValueTypePair(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 287 | unsigned InstNum, Value *&ResVal) { |
| 288 | if (Slot == Record.size()) return true; |
Jeff Cohen | 650c938 | 2007-05-06 03:23:14 +0000 | [diff] [blame] | 289 | unsigned ValNo = (unsigned)Record[Slot++]; |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 290 | // Adjust the ValNo, if it was encoded relative to the InstNum. |
| 291 | if (UseRelativeIDs) |
| 292 | ValNo = InstNum - ValNo; |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 293 | if (ValNo < InstNum) { |
| 294 | // If this is not a forward reference, just return the value we already |
| 295 | // have. |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 296 | ResVal = getFnValueByID(ValNo, nullptr); |
| 297 | return ResVal == nullptr; |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 298 | } else if (Slot == Record.size()) { |
| 299 | return true; |
| 300 | } |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 301 | |
Jeff Cohen | 650c938 | 2007-05-06 03:23:14 +0000 | [diff] [blame] | 302 | unsigned TypeNo = (unsigned)Record[Slot++]; |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 303 | ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 304 | return ResVal == nullptr; |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 305 | } |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 306 | |
| 307 | /// popValue - Read a value out of the specified record from slot 'Slot'. |
| 308 | /// Increment Slot past the number of slots used by the value in the record. |
| 309 | /// Return true if there is an error. |
Craig Topper | 9e639e8 | 2013-07-11 16:22:38 +0000 | [diff] [blame] | 310 | bool popValue(SmallVectorImpl<uint64_t> &Record, unsigned &Slot, |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 311 | unsigned InstNum, Type *Ty, Value *&ResVal) { |
| 312 | if (getValue(Record, Slot, InstNum, Ty, ResVal)) |
| 313 | return true; |
| 314 | // All values currently take a single record slot. |
| 315 | ++Slot; |
| 316 | return false; |
| 317 | } |
| 318 | |
| 319 | /// getValue -- Like popValue, but does not increment the Slot number. |
Craig Topper | 9e639e8 | 2013-07-11 16:22:38 +0000 | [diff] [blame] | 320 | bool getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 321 | unsigned InstNum, Type *Ty, Value *&ResVal) { |
| 322 | ResVal = getValue(Record, Slot, InstNum, Ty); |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 323 | return ResVal == nullptr; |
Chris Lattner | 7337ab9 | 2007-05-06 00:00:00 +0000 | [diff] [blame] | 324 | } |
Chris Lattner | 48c85b8 | 2007-05-04 03:30:17 +0000 | [diff] [blame] | 325 | |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 326 | /// getValue -- Version of getValue that returns ResVal directly, |
| 327 | /// or 0 if there is an error. |
Craig Topper | 9e639e8 | 2013-07-11 16:22:38 +0000 | [diff] [blame] | 328 | Value *getValue(SmallVectorImpl<uint64_t> &Record, unsigned Slot, |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 329 | unsigned InstNum, Type *Ty) { |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 330 | if (Slot == Record.size()) return nullptr; |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 331 | unsigned ValNo = (unsigned)Record[Slot]; |
| 332 | // Adjust the ValNo, if it was encoded relative to the InstNum. |
| 333 | if (UseRelativeIDs) |
| 334 | ValNo = InstNum - ValNo; |
| 335 | return getFnValueByID(ValNo, Ty); |
| 336 | } |
| 337 | |
| 338 | /// getValueSigned -- Like getValue, but decodes signed VBRs. |
Craig Topper | 9e639e8 | 2013-07-11 16:22:38 +0000 | [diff] [blame] | 339 | Value *getValueSigned(SmallVectorImpl<uint64_t> &Record, unsigned Slot, |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 340 | unsigned InstNum, Type *Ty) { |
Stephen Hines | dce4a40 | 2014-05-29 02:49:00 -0700 | [diff] [blame] | 341 | if (Slot == Record.size()) return nullptr; |
Jan Wen Voung | d9a3bad | 2012-10-11 20:20:40 +0000 | [diff] [blame] | 342 | unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]); |
| 343 | // Adjust the ValNo, if it was encoded relative to the InstNum. |
| 344 | if (UseRelativeIDs) |
| 345 | ValNo = InstNum - ValNo; |
| 346 | return getFnValueByID(ValNo, Ty); |
| 347 | } |
| 348 | |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 349 | error_code ParseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); |
| 350 | error_code ParseModule(bool Resume); |
| 351 | error_code ParseAttributeBlock(); |
| 352 | error_code ParseAttributeGroupBlock(); |
| 353 | error_code ParseTypeTable(); |
| 354 | error_code ParseTypeTableBody(); |
Chris Lattner | 1afcace | 2011-07-09 17:41:24 +0000 | [diff] [blame] | 355 | |
Rafael Espindola | e076b53 | 2013-11-04 16:16:24 +0000 | [diff] [blame] | 356 | error_code ParseValueSymbolTable(); |
| 357 | error_code ParseConstants(); |
| 358 | error_code RememberAndSkipFunctionBody(); |
| 359 | error_code ParseFunctionBody(Function *F); |
| 360 | error_code GlobalCleanup(); |
| 361 | error_code ResolveGlobalAndAliasInits(); |
| 362 | error_code ParseMetadata(); |
| 363 | error_code ParseMetadataAttachment(); |
| 364 | error_code ParseModuleTriple(std::string &Triple); |
| 365 | error_code ParseUseLists(); |
| 366 | error_code InitStream(); |
| 367 | error_code InitStreamFromBuffer(); |
| 368 | error_code InitLazyStream(); |
Rafael Espindola | e05744b | 2013-11-05 17:16:08 +0000 | [diff] [blame] | 369 | error_code FindFunctionInStream(Function *F, |
Derek Schuff | 2ea9387 | 2012-02-06 22:30:29 +0000 | [diff] [blame] | 370 | DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator); |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 371 | }; |
Joe Abbey | 170a15e | 2012-11-25 15:23:39 +0000 | [diff] [blame] | 372 | |
Chris Lattner | caee0dc | 2007-04-22 06:23:29 +0000 | [diff] [blame] | 373 | } // End llvm namespace |
| 374 | |
| 375 | #endif |