BitcodeReader.h revision 980e5aad4cfaa32e13b297f4201eb1088ca96cc4
1caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===//
2caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//
3caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//                     The LLVM Compiler Infrastructure
4caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//
5caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// This file was developed by Chris Lattner and is distributed under
6caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// the University of Illinois Open Source 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"
18522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner#include "llvm/Type.h"
19522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner#include "llvm/User.h"
2048f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/Bitcode/BitstreamReader.h"
2147f96bf24687b5068aec7166cb8b3ac33ae964aeChris Lattner#include "llvm/Bitcode/LLVMBitCodes.h"
2248f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/ADT/DenseMap.h"
23caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include <vector>
24caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
25caee0dccffb77a003681345ab3281bcf8684526cChris Lattnernamespace llvm {
26c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  class MemoryBuffer;
27522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
28522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerclass BitcodeReaderValueList : public User {
29522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  std::vector<Use> Uses;
30522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerpublic:
31522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) {}
32522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
33522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  // vector compatibility methods
34522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  unsigned size() const { return getNumOperands(); }
35522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  void push_back(Value *V) {
36522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner    Uses.push_back(Use(V, this));
37522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner    OperandList = &Uses[0];
38522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner    ++NumOperands;
39522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  }
40522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
41522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  Value *operator[](unsigned i) const { return getOperand(i); }
42522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
43522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  Value *back() const { return Uses.back(); }
44522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  void pop_back() { Uses.pop_back(); --NumOperands; }
45522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  bool empty() const { return NumOperands == 0; }
46198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner  void shrinkTo(unsigned N) {
47980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner    assert(N <= NumOperands && "Invalid shrinkTo request!");
48198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner    Uses.resize(N);
49198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner    NumOperands = N;
50198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner  }
51522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  virtual void print(std::ostream&) const {}
52522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
53522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  Constant *getConstantFwdRef(unsigned Idx, const Type *Ty);
54522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  void initVal(unsigned Idx, Value *V) {
55522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner    assert(Uses[Idx] == 0 && "Cannot init an already init'd Use!");
56522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner    Uses[Idx].init(V, this);
57522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  }
58522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner};
59522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner
60caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
61caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider {
62c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  MemoryBuffer *Buffer;
6348f848716e80d01619b239111db48bfac77baad1Chris Lattner  BitstreamReader Stream;
6448f848716e80d01619b239111db48bfac77baad1Chris Lattner
65caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  const char *ErrorString;
66caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
67caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  std::vector<PATypeHolder> TypeList;
68522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner  BitcodeReaderValueList ValueList;
69e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner  std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits;
7007d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner  std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits;
7148f848716e80d01619b239111db48bfac77baad1Chris Lattner
72980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  /// FunctionBBs - While parsing a function body, this is a list of the basic
73980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  /// blocks for the function.
74980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  std::vector<BasicBlock*> FunctionBBs;
75980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner
7648f848716e80d01619b239111db48bfac77baad1Chris Lattner  // When reading the module header, this list is populated with functions that
7748f848716e80d01619b239111db48bfac77baad1Chris Lattner  // have bodies later in the file.
7848f848716e80d01619b239111db48bfac77baad1Chris Lattner  std::vector<Function*> FunctionsWithBodies;
7948f848716e80d01619b239111db48bfac77baad1Chris Lattner
8048f848716e80d01619b239111db48bfac77baad1Chris Lattner  // After the module header has been read, the FunctionsWithBodies list is
8148f848716e80d01619b239111db48bfac77baad1Chris Lattner  // reversed.  This keeps track of whether we've done this yet.
8248f848716e80d01619b239111db48bfac77baad1Chris Lattner  bool HasReversedFunctionsWithBodies;
8348f848716e80d01619b239111db48bfac77baad1Chris Lattner
8448f848716e80d01619b239111db48bfac77baad1Chris Lattner  /// DeferredFunctionInfo - When function bodies are initially scanned, this
8548f848716e80d01619b239111db48bfac77baad1Chris Lattner  /// map contains info about where to find deferred function body (in the
8648f848716e80d01619b239111db48bfac77baad1Chris Lattner  /// stream) and what linkage the original function had.
8748f848716e80d01619b239111db48bfac77baad1Chris Lattner  DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo;
88caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic:
8948f848716e80d01619b239111db48bfac77baad1Chris Lattner  BitcodeReader(MemoryBuffer *buffer) : Buffer(buffer), ErrorString(0) {
9048f848716e80d01619b239111db48bfac77baad1Chris Lattner    HasReversedFunctionsWithBodies = false;
9148f848716e80d01619b239111db48bfac77baad1Chris Lattner  }
92c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  ~BitcodeReader();
93caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
94c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner
95c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  /// releaseMemoryBuffer - This causes the reader to completely forget about
96c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  /// the memory buffer it contains, which prevents the buffer from being
97c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  /// destroyed when it is deleted.
98c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  void releaseMemoryBuffer() {
99c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner    Buffer = 0;
100c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  }
101caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
10248f848716e80d01619b239111db48bfac77baad1Chris Lattner  virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0);
103980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  virtual Module *materializeModule(std::string *ErrInfo = 0);
104caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
105caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  bool Error(const char *Str) {
106caee0dccffb77a003681345ab3281bcf8684526cChris Lattner    ErrorString = Str;
107caee0dccffb77a003681345ab3281bcf8684526cChris Lattner    return true;
108caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  }
109caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  const char *getErrorString() const { return ErrorString; }
110caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
111caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  /// @brief Main interface to parsing a bitcode buffer.
112caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  /// @returns true if an error occurred.
113c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner  bool ParseBitcode();
114caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate:
115caee0dccffb77a003681345ab3281bcf8684526cChris Lattner  const Type *getTypeByID(unsigned ID, bool isTypeTable = false);
116caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
117866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner  bool ParseModule(const std::string &ModuleID);
118866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner  bool ParseTypeTable();
119866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner  bool ParseTypeSymbolTable();
120866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner  bool ParseValueSymbolTable();
121866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner  bool ParseConstants();
122980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  bool RememberAndSkipFunctionBody();
123980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner  bool ParseFunctionBody(Function *F);
12407d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner  bool ResolveGlobalAndAliasInits();
125caee0dccffb77a003681345ab3281bcf8684526cChris Lattner};
126caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
127caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace
128caee0dccffb77a003681345ab3281bcf8684526cChris Lattner
129caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif
130