Add support for the link-time pass list to Modules.
authorReid Spencer <rspencer@reidspencer.com>
Mon, 13 Sep 2004 23:44:23 +0000 (23:44 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 13 Sep 2004 23:44:23 +0000 (23:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16321 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Module.h
lib/AsmParser/Lexer.l
lib/AsmParser/llvmAsmParser.y
lib/VMCore/AsmWriter.cpp
lib/VMCore/Module.cpp

index b864cce38d793be53a91184f1bc85bc21db6c4ce..64a84d4db10f0357c9419e0279ce0695ad1fb9bf 100644 (file)
@@ -49,6 +49,7 @@ public:
   typedef iplist<GlobalVariable> GlobalListType;
   typedef iplist<Function> FunctionListType;
   typedef SetVector<std::string> LibraryListType;
+  typedef std::vector<std::string> PassListType;
 
   // Global Variable iterators...
   typedef GlobalListType::iterator                             giterator;
@@ -65,6 +66,9 @@ public:
   // Library list iterators
   typedef LibraryListType::const_iterator lib_iterator;
 
+  // Link-time Pass list iterators
+  typedef PassListType::const_iterator pass_iterator;
+
   enum Endianness  { AnyEndianness, LittleEndian, BigEndian };
   enum PointerSize { AnyPointerSize, Pointer32, Pointer64 };
 
@@ -72,6 +76,7 @@ private:
   GlobalListType GlobalList;     // The Global Variables in the module
   FunctionListType FunctionList; // The Functions in the module
   LibraryListType LibraryList;   // The Libraries needed by the module
+  PassListType PassList;         // The Passes needed by the module at link time
   SymbolTable *SymTab;           // Symbol Table for the module
   std::string ModuleID;          // Human readable identifier for the module
   std::string TargetTriple;      // Platform target triple Module compiled on
@@ -227,7 +232,7 @@ public:
   inline       Function          &back()       { return FunctionList.back(); }
 
   //===--------------------------------------------------------------------===//
-  // List of dependent library access functionsns
+  // List of dependent library access functions
 
   /// @brief Get a constant iterator to beginning of dependent library list.
   inline lib_iterator lib_begin() const { return LibraryList.begin(); }
@@ -247,6 +252,30 @@ public:
   /// @brief Get all the libraries 
   inline const LibraryListType& getLibraries() const { return LibraryList; }
 
+  //===--------------------------------------------------------------------===//
+  // Access functions for Link-time pass list
+
+  /// @brief Get a constant iterator to beginning of pass list.
+  inline pass_iterator pass_begin() const { return PassList.begin(); }
+
+  /// @brief Get a constant iterator to end of pass list.
+  inline pass_iterator pass_end() const { return PassList.end(); }
+
+  /// @brief Returns the number of items in the list of passes.
+  inline unsigned pass_size() const { return PassList.size(); }
+
+  /// @brief Add a library to the list of passes
+  inline void addPass(const std::string& Pass){ PassList.push_back(Pass); }
+
+  /// @brief Remove a library from the list of passes
+  void removePass(const std::string& Lib); 
+
+  /// @brief Get all the passes 
+  inline const PassListType& getPasses() const { return PassList; }
+
+  //===--------------------------------------------------------------------===//
+  // Utility functions for printing and dumping Module objects
+
   void print(std::ostream &OS) const { print(OS, 0); }
   void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;
 
index 45361bd77b8e6ee5218208098f6b05615671251b..9290cf1ae077c4bf73ec9ac07f174dc3e5d35d90 100644 (file)
@@ -195,6 +195,7 @@ not             { return NOT; }  /* Deprecated, turned into XOR */
 target          { return TARGET; }
 triple          { return TRIPLE; }
 deplibs         { return DEPLIBS; }
+passes          { return PASSES; }
 endian          { return ENDIAN; }
 pointersize     { return POINTERSIZE; }
 little          { return LITTLE; }
index 1fd8782daea2d570b09494ef3b1cb1d9a6d31168..aec7b38dbdc19c5eea6e70be6e9978906aa368c4 100644 (file)
@@ -910,7 +910,7 @@ Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
 %token DECLARE GLOBAL CONSTANT VOLATILE
 %token TO DOTDOTDOT NULL_TOK CONST INTERNAL LINKONCE WEAK  APPENDING
 %token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG
-%token DEPLIBS
+%token DEPLIBS PASSES
 
 // Basic Block Terminating Operators 
 %token <TermOpVal> RET BR SWITCH INVOKE UNWIND
@@ -1484,6 +1484,8 @@ ConstPool : ConstPool OptAssign TYPE TypesV {  // Types can be defined in the co
   }
   | ConstPool DEPLIBS '=' LibrariesDefinition {
   }
+  | ConstPool PASSES '=' PassesDefinition {
+  }
   | /* empty: end of list */ { 
   };
 
@@ -1522,6 +1524,19 @@ LibList : LibList ',' STRINGCONSTANT {
         }
         ;
 
+PassesDefinition : '[' PassList ']';
+PassList : PassList ',' STRINGCONSTANT {
+           CurModule.CurrentModule->addLibrary($3);
+           free($3);
+         }
+         | STRINGCONSTANT {
+           CurModule.CurrentModule->addLibrary($1);
+           free($1);
+         }
+         | /* empty: end of list */ {
+         }
+         ;
+
 //===----------------------------------------------------------------------===//
 //                       Rules to match Function Headers
 //===----------------------------------------------------------------------===//
index 0c4a1f78267c36b6b2c4e804cae4d6447dcb0404..7f862dfbc593f32bfcf186a8bee3558596615679 100644 (file)
@@ -777,6 +777,20 @@ void AssemblyWriter::printModule(const Module *M) {
     }
     Out << " ]\n";
   }
+
+  // Loop over the link time pass list and emit them
+  Module::pass_iterator PI = M->pass_begin();
+  Module::pass_iterator PE = M->pass_end();
+  if (LI != LE) {
+    Out << "passes = [\n";
+    while (LI != LE) {
+      Out << "\"" << *LI << "\"";
+      ++LI;
+      if (LI != LE)
+        Out << ",\n";
+    }
+    Out << " ]\n";
+  }
   
   // Loop over the symbol table, emitting all named constants...
   printSymbolTable(M->getSymbolTable());
index d8caf7f1175af47c08bc19ac640d1acbf2a271d0..1dae14ec53f901acd0f66f803cb3258c22225b53 100644 (file)
@@ -270,6 +270,12 @@ std::string Module::getTypeName(const Type *Ty) const {
   return "";     // Must not have found anything...
 }
 
+void Module::removePass(const std::string& Lib) { 
+  PassListType::iterator I = find(PassList.begin(),PassList.end(),Lib);
+  if (I != PassList.end())
+    PassList.erase(I);
+}
+
 
 //===----------------------------------------------------------------------===//
 // Other module related stuff.