Rename include guard, patch contributed by Evan Jones!
[oota-llvm.git] / include / llvm / Support / Mangler.h
index 5b312f8ef447a7186a1e12b04bb109e98da429d6..14d68b59d3292c6e09d479afbb4b6909b06049c4 100644 (file)
@@ -1,4 +1,4 @@
-//===-- Mangler.h - Self-contained c/asm llvm name mangler ------*- C++ -*-===//
+//===-- llvm/Support/Mangler.h - Self-contained name mangler ----*- C++ -*-===//
 // 
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,25 +7,22 @@
 // 
 //===----------------------------------------------------------------------===//
 //
-// Unified name mangler for CWriter and assembly backends.
+// Unified name mangler for various backends.
 //
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_SUPPORT_MANGLER_H
 #define LLVM_SUPPORT_MANGLER_H
 
-namespace llvm {
-
-class Value;
-class Module;
-
-} // End llvm namespace
-
 #include <map>
 #include <set>
 #include <string>
 
 namespace llvm {
+class Value;
+class Type;
+class Module;
+class GlobalValue;
 
 class Mangler {
   /// This keeps track of which global values have had their names
@@ -34,17 +31,26 @@ class Mangler {
   std::set<const Value *> MangledGlobals;
 
   Module &M;
-  bool AddUnderscorePrefix;
+  const char *Prefix;
+
+  unsigned TypeCounter;
+  std::map<const Type*, unsigned> TypeMap;
 
   typedef std::map<const Value *, std::string> ValueMap;
   ValueMap Memo;
 
   unsigned Count;
+
+  void InsertName(GlobalValue *GV, std::map<std::string, GlobalValue*> &Names);
 public:
 
-  // Mangler ctor - if AddUnderscorePrefix is true, then all public global
-  // symbols will be prefixed with an underscore.
-  Mangler(Module &M, bool AddUnderscorePrefix = false);
+  // Mangler ctor - if a prefix is specified, it will be prepended onto all
+  // symbols.
+  Mangler(Module &M, const char *Prefix = "");
+
+  /// getTypeID - Return a unique ID for the specified LLVM type.
+  ///
+  unsigned getTypeID(const Type *Ty);
 
   /// getValueName - Returns the mangled name of V, an LLVM Value,
   /// in the current module.