BitcodeReader.h revision efe65369a74871c3140a540a6c95ce5d1f080954
1caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// 2caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 3caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// The LLVM Compiler Infrastructure 4caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 8caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===----------------------------------------------------------------------===// 9caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 10caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// This header defines the BitcodeReader class. 11caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 12caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===----------------------------------------------------------------------===// 13caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 14caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#ifndef BITCODE_READER_H 15caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#define BITCODE_READER_H 16caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 17caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include "llvm/ModuleProvider.h" 1858d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner#include "llvm/ParameterAttributes.h" 19522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner#include "llvm/Type.h" 20efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif#include "llvm/OperandTraits.h" 2148f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/Bitcode/BitstreamReader.h" 2247f96bf24687b5068aec7166cb8b3ac33ae964aeChris Lattner#include "llvm/Bitcode/LLVMBitCodes.h" 2348f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/ADT/DenseMap.h" 24caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include <vector> 25caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 26caee0dccffb77a003681345ab3281bcf8684526cChris Lattnernamespace llvm { 27c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner class MemoryBuffer; 28522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 29efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===// 30efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// BitcodeReaderValueList Class 31efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===// 32efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif 33522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerclass BitcodeReaderValueList : public User { 34efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif unsigned Capacity; 35522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerpublic: 36efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) 37efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif , Capacity(0) {} 38efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif 39efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif /// Provide fast operand accessors 40efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 41efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif 42522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner // vector compatibility methods 43522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner unsigned size() const { return getNumOperands(); } 44efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif void resize(unsigned); 45522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void push_back(Value *V) { 46efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif unsigned OldOps(NumOperands), NewOps(NumOperands + 1); 47efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif resize(NewOps); 48efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif NumOperands = NewOps; 49efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif OperandList[OldOps] = V; 50522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 51522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 52b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner void clear() { 53efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif if (OperandList) dropHungoffUses(OperandList); 54efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif Capacity = 0; 55b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner } 56b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner 57522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *operator[](unsigned i) const { return getOperand(i); } 58522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 59efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif Value *back() const { return getOperand(size() - 1); } 60efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif void pop_back() { setOperand(size() - 1, 0); --NumOperands; } 61522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner bool empty() const { return NumOperands == 0; } 62198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner void shrinkTo(unsigned N) { 63980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner assert(N <= NumOperands && "Invalid shrinkTo request!"); 64efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif while (NumOperands > N) 65efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif pop_back(); 66198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner } 67522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner virtual void print(std::ostream&) const {} 68522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 69522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Constant *getConstantFwdRef(unsigned Idx, const Type *Ty); 70a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getValueFwdRef(unsigned Idx, const Type *Ty); 71a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 72a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner void AssignValue(Value *V, unsigned Idx) { 73a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner if (Idx == size()) { 74a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner push_back(V); 75a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else if (Value *OldV = getOperand(Idx)) { 76a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner // If there was a forward reference to this value, replace it. 77a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner setOperand(Idx, V); 78a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner OldV->replaceAllUsesWith(V); 79a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner delete OldV; 80a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else { 81a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner initVal(Idx, V); 82a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 83a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 84a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 85a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattnerprivate: 86522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void initVal(unsigned Idx, Value *V) { 87efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif if (Idx >= size()) { 88efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif // Insert a bunch of null values. 89efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif resize(Idx * 2 + 1); 90efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif } 91efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif assert(getOperand(Idx) == 0 && "Cannot init an already init'd Use!"); 92efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif OperandList[Idx].init(V, this); 93522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 94522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner}; 95efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif 96efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greiftemplate <> 97efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifstruct OperandTraits<BitcodeReaderValueList> : HungoffOperandTraits</*16 FIXME*/> { 98efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif}; 99efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif 100efe65369a74871c3140a540a6c95ce5d1f080954Gabor GreifDEFINE_TRANSPARENT_OPERAND_ACCESSORS(BitcodeReaderValueList, Value) 101caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 102caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider { 103c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner MemoryBuffer *Buffer; 10448f848716e80d01619b239111db48bfac77baad1Chris Lattner BitstreamReader Stream; 10548f848716e80d01619b239111db48bfac77baad1Chris Lattner 106caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *ErrorString; 107caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 108caee0dccffb77a003681345ab3281bcf8684526cChris Lattner std::vector<PATypeHolder> TypeList; 109522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList ValueList; 110e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 11107d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 11248f848716e80d01619b239111db48bfac77baad1Chris Lattner 11348c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// ParamAttrs - The set of parameter attributes by index. Index zero in the 11448c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// file is for null, and is thus not represented here. As such all indices 11548c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// are off by one. 11658d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner std::vector<PAListPtr> ParamAttrs; 11748c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 118980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// FunctionBBs - While parsing a function body, this is a list of the basic 119980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// blocks for the function. 120980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner std::vector<BasicBlock*> FunctionBBs; 121980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner 12248f848716e80d01619b239111db48bfac77baad1Chris Lattner // When reading the module header, this list is populated with functions that 12348f848716e80d01619b239111db48bfac77baad1Chris Lattner // have bodies later in the file. 12448f848716e80d01619b239111db48bfac77baad1Chris Lattner std::vector<Function*> FunctionsWithBodies; 1256994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 1266994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // When intrinsic functions are encountered which require upgrading they are 1276994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // stored here with their replacement function. 1286994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 1296994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth UpgradedIntrinsicMap UpgradedIntrinsics; 13048f848716e80d01619b239111db48bfac77baad1Chris Lattner 13148f848716e80d01619b239111db48bfac77baad1Chris Lattner // After the module header has been read, the FunctionsWithBodies list is 13248f848716e80d01619b239111db48bfac77baad1Chris Lattner // reversed. This keeps track of whether we've done this yet. 13348f848716e80d01619b239111db48bfac77baad1Chris Lattner bool HasReversedFunctionsWithBodies; 13448f848716e80d01619b239111db48bfac77baad1Chris Lattner 13548f848716e80d01619b239111db48bfac77baad1Chris Lattner /// DeferredFunctionInfo - When function bodies are initially scanned, this 13648f848716e80d01619b239111db48bfac77baad1Chris Lattner /// map contains info about where to find deferred function body (in the 13748f848716e80d01619b239111db48bfac77baad1Chris Lattner /// stream) and what linkage the original function had. 13848f848716e80d01619b239111db48bfac77baad1Chris Lattner DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo; 139caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic: 140950a4c40b823cd4f09dc71be635229246dfd6cacDan Gohman explicit BitcodeReader(MemoryBuffer *buffer) 141950a4c40b823cd4f09dc71be635229246dfd6cacDan Gohman : Buffer(buffer), ErrorString(0) { 14248f848716e80d01619b239111db48bfac77baad1Chris Lattner HasReversedFunctionsWithBodies = false; 14348f848716e80d01619b239111db48bfac77baad1Chris Lattner } 144b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner ~BitcodeReader() { 145b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner FreeState(); 146b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner } 147caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 148b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner void FreeState(); 149c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner 150c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// releaseMemoryBuffer - This causes the reader to completely forget about 151c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// the memory buffer it contains, which prevents the buffer from being 152c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// destroyed when it is deleted. 153c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner void releaseMemoryBuffer() { 154c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner Buffer = 0; 155c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner } 156caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 15748f848716e80d01619b239111db48bfac77baad1Chris Lattner virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0); 158980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner virtual Module *materializeModule(std::string *ErrInfo = 0); 159d67c632d968157e228cf42b588f8759059730ec0Chris Lattner virtual void dematerializeFunction(Function *F); 160b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner virtual Module *releaseModule(std::string *ErrInfo = 0); 161d67c632d968157e228cf42b588f8759059730ec0Chris Lattner 162caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool Error(const char *Str) { 163caee0dccffb77a003681345ab3281bcf8684526cChris Lattner ErrorString = Str; 164caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return true; 165caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 166caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *getErrorString() const { return ErrorString; } 167caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 168caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @brief Main interface to parsing a bitcode buffer. 169caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @returns true if an error occurred. 170c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner bool ParseBitcode(); 171caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate: 172caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const Type *getTypeByID(unsigned ID, bool isTypeTable = false); 173a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getFnValueByID(unsigned ID, const Type *Ty) { 174a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner return ValueList.getValueFwdRef(ID, Ty); 175a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 176f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner BasicBlock *getBasicBlock(unsigned ID) const { 177f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner if (ID >= FunctionBBs.size()) return 0; // Invalid ID 178f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner return FunctionBBs[ID]; 179f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner } 18058d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner PAListPtr getParamAttrs(unsigned i) const { 18148c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner if (i-1 < ParamAttrs.size()) 18248c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner return ParamAttrs[i-1]; 18358d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner return PAListPtr(); 18448c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner } 1857337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 1867337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// getValueTypePair - Read a value/type pair out of the specified record from 1877337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// slot 'Slot'. Increment Slot past the number of slots used in the record. 1887337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// Return true on failure. 1897337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 1907337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner unsigned InstNum, Value *&ResVal) { 1917337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 192650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 1937337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (ValNo < InstNum) { 1947337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // If this is not a forward reference, just return the value we already 1957337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // have. 1967337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, 0); 1977337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1987337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } else if (Slot == Record.size()) { 1997337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return true; 2007337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 2017337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 202650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned TypeNo = (unsigned)Record[Slot++]; 2037337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 2047337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 2057337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 2067337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2077337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner const Type *Ty, Value *&ResVal) { 2087337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 209650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 2107337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, Ty); 2117337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 2127337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 21348c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 214caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 215866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseModule(const std::string &ModuleID); 21648c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner bool ParseParamAttrBlock(); 217866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeTable(); 218866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeSymbolTable(); 219866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseValueSymbolTable(); 220866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseConstants(); 221980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool RememberAndSkipFunctionBody(); 222980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool ParseFunctionBody(Function *F); 22307d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner bool ResolveGlobalAndAliasInits(); 224caee0dccffb77a003681345ab3281bcf8684526cChris Lattner}; 225caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 226caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace 227caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 228caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif 229