167253e2714c3a921fc3fb4c6bc8008932fb8b41
[oota-llvm.git] / include / llvm / Target / Mangler.h
1 //===-- llvm/Target/Mangler.h - Self-contained name mangler -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Unified name mangler for various backends.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_SUPPORT_MANGLER_H
15 #define LLVM_SUPPORT_MANGLER_H
16
17 #include "llvm/ADT/DenseMap.h"
18 #include <string>
19
20 namespace llvm {
21 class StringRef;
22 class Twine;
23 class Value;
24 class GlobalValue;
25 template <typename T> class SmallVectorImpl; 
26 class MCContext;
27 class MCSymbol;
28 class TargetData;
29
30 class Mangler {
31 public:
32   enum ManglerPrefixTy {
33     Default,               ///< Emit default string before each symbol.
34     Private,               ///< Emit "private" prefix before each symbol.
35     LinkerPrivate,         ///< Emit "linker private" prefix before each symbol.
36     LinkerWeak             ///< Emit "linker weak" prefix before each symbol.
37   };
38
39 private:
40   MCContext &Context;
41   const TargetData &TD;
42
43   /// AnonGlobalIDs - We need to give global values the same name every time
44   /// they are mangled.  This keeps track of the number we give to anonymous
45   /// ones.
46   ///
47   DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs;
48
49   /// NextAnonGlobalID - This simple counter is used to unique value names.
50   ///
51   unsigned NextAnonGlobalID;
52
53 public:
54   Mangler(MCContext &context, const TargetData &td)
55     : Context(context), TD(td), NextAnonGlobalID(1) {}
56
57   /// getSymbol - Return the MCSymbol for the specified global value.  This
58   /// symbol is the main label that is the address of the global.
59   MCSymbol *getSymbol(const GlobalValue *GV);
60
61   
62   /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
63   /// and the specified global variable's name.  If the global variable doesn't
64   /// have a name, this fills in a unique name for the global.
65   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
66                          bool isImplicitlyPrivate);
67   
68   /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
69   /// and the specified name as the global variable name.  GVName must not be
70   /// empty.
71   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const Twine &GVName,
72                          ManglerPrefixTy PrefixTy = Mangler::Default);
73
74   /// getNameWithPrefix - Return the name of the appropriate prefix
75   /// and the specified global variable's name.  If the global variable doesn't
76   /// have a name, this fills in a unique name for the global.
77   std::string getNameWithPrefix(const GlobalValue *GV,
78                                 bool isImplicitlyPrivate = false);
79 };
80
81 } // End llvm namespace
82
83 #endif // LLVM_SUPPORT_MANGLER_H