Mangler.h revision 3d10a5a75794356a0a568ce283713adc3a963200
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/Mangler.h - Self-contained name mangler ----*- C++ -*-===//
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke//
10d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner// Unified name mangler for various backends.
11b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke//
12b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke//===----------------------------------------------------------------------===//
13b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
14b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#ifndef LLVM_SUPPORT_MANGLER_H
15b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#define LLVM_SUPPORT_MANGLER_H
16b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
178001524f43c0d04b7576efceefeac9be27f7dc0cOwen Anderson#include "llvm/ADT/DenseMap.h"
18250c1d8734ae29b8e408e16dc575b21a31fcb0d7Evan Cheng#include "llvm/ADT/SmallPtrSet.h"
19ebb20c51fa003192493a1718e37ce45a9e3998c5Tanya Lattner#include <string>
20b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
22ddc49d6121d90728fc08c1fdc03e2cccdf58d272Chris Lattnerclass Type;
23d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Module;
24a112e0f44721848363b42ddeb7c6354f934878e0Chris Lattnerclass Value;
25d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue;
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
27b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler {
283d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
293d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  enum ManglerPrefixTy {
303d10a5a75794356a0a568ce283713adc3a963200Bill Wendling    DefaultPrefixTy,       ///< Emit default string before each symbol.
313d10a5a75794356a0a568ce283713adc3a963200Bill Wendling    PrivatePrefixTy,       ///< Emit "private" prefix before each symbol.
323d10a5a75794356a0a568ce283713adc3a963200Bill Wendling    LinkerPrivatePrefixTy  ///< Emit "linker private" prefix before each symbol.
333d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  };
343d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
353d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingprivate:
366c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  /// Prefix - This string is added to each symbol that is emitted, unless the
376c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  /// symbol is marked as not needing this prefix.
382c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner  const char *Prefix;
39fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
408f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng  /// PrivatePrefix - This string is emitted before each symbol with private
418f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng  /// linkage.
42bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola  const char *PrivatePrefix;
438f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng
443d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  /// LinkerPrivatePrefix - This string is emitted before each symbol with
453d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  /// "linker_private" linkage.
463d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  const char *LinkerPrivatePrefix;
473d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
48fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman  /// UseQuotes - If this is set, the target accepts global names in quotes,
49ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  /// e.g. "foo bar" is a legal name.  This syntax is used instead of escaping
50ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  /// the space character.  By default, this is false.
51ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  bool UseQuotes;
52fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
5359ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// AnonGlobalIDs - We need to give global values the same name every time
5459ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// they are mangled.  This keeps track of the number we give to anonymous
5559ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// ones.
566c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
5759ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs;
582b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
5959ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// NextAnonGlobalID - This simple counter is used to unique value names.
606c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
6159ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  unsigned NextAnonGlobalID;
62fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
63d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  /// AcceptableChars - This bitfield contains a one for each character that is
64d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  /// allowed to be part of an unmangled name.
653d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  unsigned AcceptableChars[256 / 32];
662b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
673d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
682c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner  // Mangler ctor - if a prefix is specified, it will be prepended onto all
692c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner  // symbols.
703d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  Mangler(Module &M, const char *Prefix = "", const char *privatePrefix = "",
713d10a5a75794356a0a568ce283713adc3a963200Bill Wendling          const char *linkerPrivatePrefix = "");
722b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
73ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  /// setUseQuotes - If UseQuotes is set to true, this target accepts quoted
74ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  /// strings for assembler labels.
75ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner  void setUseQuotes(bool Val) { UseQuotes = Val; }
76fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
77d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  /// Acceptable Characters - This allows the target to specify which characters
78d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  /// are acceptable to the assembler without being mangled.  By default we
79d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  /// allow letters, numbers, '_', '$', and '.', which is what GAS accepts.
80d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  void markCharAcceptable(unsigned char X) {
81d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner    AcceptableChars[X/32] |= 1 << (X&31);
82d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  }
83d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  void markCharUnacceptable(unsigned char X) {
84d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner    AcceptableChars[X/32] &= ~(1 << (X&31));
85d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  }
86d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  bool isCharAcceptable(unsigned char X) const {
87d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner    return (AcceptableChars[X/32] & (1 << (X&31))) != 0;
88d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner  }
89fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
90b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner  /// getMangledName - Returns the mangled name of V, an LLVM Value,
91b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner  /// in the current module.  If 'Suffix' is specified, the name ends with the
92b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner  /// specified suffix.  If 'ForcePrivate' is specified, the label is specified
93b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner  /// to have a private label prefix.
94b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  ///
95b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner  std::string getMangledName(const GlobalValue *V, const char *Suffix = "",
96b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner                             bool ForcePrivate = false);
97b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
98b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// makeNameProper - We don't want identifier names with ., space, or
99b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// - in them, so we mangle these characters into the strings "d_",
100b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// "s_", and "D_", respectively. This is a very simple mangling that
101b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// doesn't guarantee unique names for values. getValueName already
102b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// does this for you, so there's no point calling it on the result
103b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// from getValueName.
10463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  ///
1051cda87c3a07dc097f27e365f7f3ff4bcb31f5699Chris Lattner  std::string makeNameProper(const std::string &x,
1063d10a5a75794356a0a568ce283713adc3a963200Bill Wendling                             ManglerPrefixTy PrefixTy = DefaultPrefixTy);
107b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke};
108b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
109d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
110d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
111b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#endif // LLVM_SUPPORT_MANGLER_H
112