Initial revision

llvm-svn: 2
diff --git a/llvm/lib/AsmParser/ParserInternals.h b/llvm/lib/AsmParser/ParserInternals.h
new file mode 100644
index 0000000..2856c9b
--- /dev/null
+++ b/llvm/lib/AsmParser/ParserInternals.h
@@ -0,0 +1,159 @@
+//===-- ParserInternals.h - Definitions internal to the parser ---*- C++ -*--=//
+//
+//  This header file defines the various variables that are shared among the 
+//  different components of the parser...
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef PARSER_INTERNALS_H
+#define PARSER_INTERNALS_H
+
+#include <stdio.h>
+#define __STDC_LIMIT_MACROS
+
+#include "llvm/InstrTypes.h"
+#include "llvm/BasicBlock.h"
+#include "llvm/ConstPoolVals.h"
+#include "llvm/iOther.h"
+#include "llvm/Method.h"
+#include "llvm/Type.h"
+#include "llvm/Assembly/Parser.h"
+#include "llvm/Tools/CommandLine.h"
+#include "llvm/Tools/StringExtras.h"
+
+class Module;
+
+// Global variables exported from the lexer...
+extern FILE *llvmAsmin;
+extern int llvmAsmlineno;
+
+// Globals exported by the parser...
+extern const ToolCommandLine *CurOptions;
+Module *RunVMAsmParser(const ToolCommandLine &Opts, FILE *F);
+
+
+// ThrowException - Wrapper around the ParseException class that automatically
+// fills in file line number and column number and options info.
+//
+// This also helps me because I keep typing 'throw new ParseException' instead 
+// of just 'throw ParseException'... sigh...
+//
+static inline void ThrowException(const string &message) {
+  // TODO: column number in exception
+  throw ParseException(*CurOptions, message, llvmAsmlineno);
+}
+
+// ValID - Represents a reference of a definition of some sort.  This may either
+// be a numeric reference or a symbolic (%var) reference.  This is just a 
+// discriminated union.
+//
+// Note that I can't implement this class in a straight forward manner with 
+// constructors and stuff because it goes in a union, and GCC doesn't like 
+// putting classes with ctor's in unions.  :(
+//
+struct ValID {
+  int Type;               // 0 = number, 1 = name, 2 = const pool, 
+                          // 3 = unsigned const pool, 4 = const string
+  union {
+    int      Num;         // If it's a numeric reference
+    char    *Name;        // If it's a named reference.  Memory must be free'd.
+    int64_t  ConstPool64; // Constant pool reference.  This is the value
+    uint64_t UConstPool64;// Unsigned constant pool reference.
+  };
+
+  static ValID create(int Num) {
+    ValID D; D.Type = 0; D.Num = Num; return D;
+  }
+
+  static ValID create(char *Name) {
+    ValID D; D.Type = 1; D.Name = Name; return D;
+  }
+
+  static ValID create(int64_t Val) {
+    ValID D; D.Type = 2; D.ConstPool64 = Val; return D;
+  }
+
+  static ValID create(uint64_t Val) {
+    ValID D; D.Type = 3; D.UConstPool64 = Val; return D;
+  }
+
+  static ValID create_conststr(char *Name) {
+    ValID D; D.Type = 4; D.Name = Name; return D;
+  }
+
+  inline void destroy() {
+    if (Type == 1 || Type == 4) free(Name);  // Free this strdup'd memory...
+  }
+
+  inline ValID copy() const {
+    if (Type != 1 && Type != 4) return *this;
+    ValID Result = *this;
+    Result.Name = strdup(Name);
+    return Result;
+  }
+
+  inline string getName() const {
+    switch (Type) {
+    case 0:  return string("#") + itostr(Num);
+    case 1:  return Name;
+    case 4:  return string("\"") + Name + string("\"");
+    default: return string("%") + itostr(ConstPool64);
+    }
+  }
+};
+
+
+
+template<class SuperType>
+class PlaceholderDef : public SuperType {
+  ValID D;
+  // TODO: Placeholder def should hold Line #/Column # of definition in case
+  // there is an error resolving the defintition!
+public:
+  PlaceholderDef(const Type *Ty, const ValID &d) : SuperType(Ty), D(d) {}
+  ValID &getDef() { return D; }
+};
+
+struct InstPlaceHolderHelper : public Instruction {
+  InstPlaceHolderHelper(const Type *Ty) : Instruction(Ty, UserOp1, "") {}
+
+  virtual Instruction *clone() const { abort(); }
+
+  inline virtual void dropAllReferences() {}
+  virtual string getOpcode() const { return "placeholder"; }
+
+  // No "operands"...
+  virtual Value *getOperand(unsigned i) { return 0; }
+  virtual const Value *getOperand(unsigned i) const { return 0; }
+  virtual bool setOperand(unsigned i, Value *Val) { return false; }
+  virtual unsigned getNumOperands() const { return 0; }
+};
+
+struct BBPlaceHolderHelper : public BasicBlock {
+  BBPlaceHolderHelper(const Type *Ty) : BasicBlock() {
+    assert(Ty->isLabelType());
+  }
+};
+
+struct MethPlaceHolderHelper : public Method {
+  MethPlaceHolderHelper(const Type *Ty) 
+    : Method((const MethodType*)Ty) {
+    assert(Ty->isMethodType() && "Method placeholders must be method types!");
+  }
+};
+
+typedef PlaceholderDef<InstPlaceHolderHelper>  DefPlaceHolder;
+typedef PlaceholderDef<BBPlaceHolderHelper>    BBPlaceHolder;
+typedef PlaceholderDef<MethPlaceHolderHelper>  MethPlaceHolder;
+//typedef PlaceholderDef<ModulePlaceHolderHelper> ModulePlaceHolder;
+
+static inline ValID &getValIDFromPlaceHolder(Value *Def) {
+  switch (Def->getType()->getPrimitiveID()) {
+  case Type::LabelTyID:  return ((BBPlaceHolder*)Def)->getDef();
+  case Type::MethodTyID: return ((MethPlaceHolder*)Def)->getDef();
+//case Type::ModuleTyID:  return ((ModulePlaceHolder*)Def)->getDef();
+  default:               return ((DefPlaceHolder*)Def)->getDef();
+  }
+}
+
+#endif