Mangler.h revision d11e6472573c61c44ca946c843ad83acdbe3c71f
1d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner//===-- Mangler.h - Self-contained llvm name mangler ------------*- C++ -*-===//
26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under
66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
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
17b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#include <map>
184166445b7cde22f81cd1a18b6f33fe94b94bdbb6Brian Gaeke#include <set>
19ebb20c51fa003192493a1718e37ce45a9e3998c5Tanya Lattner#include <string>
20b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
22d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Value;
23d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Module;
24d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue;
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler {
272b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  /// This keeps track of which global values have had their names
282b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  /// mangled in the current module.
292b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  ///
302b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  std::set<const Value *> MangledGlobals;
312b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
322b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  Module &M;
332b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  bool AddUnderscorePrefix;
342b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
352b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  typedef std::map<const Value *, std::string> ValueMap;
362b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  ValueMap Memo;
372b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
382b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  unsigned Count;
39d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner
40d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner  void InsertName(GlobalValue *GV, std::map<std::string, GlobalValue*> &Names);
41b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekepublic:
422b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
432b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  // Mangler ctor - if AddUnderscorePrefix is true, then all public global
442b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  // symbols will be prefixed with an underscore.
452b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner  Mangler(Module &M, bool AddUnderscorePrefix = false);
462b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
47b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// getValueName - Returns the mangled name of V, an LLVM Value,
48b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// in the current module.
49b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  ///
50b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  std::string getValueName(const Value *V);
51b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
52b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// makeNameProper - We don't want identifier names with ., space, or
53b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// - in them, so we mangle these characters into the strings "d_",
54b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// "s_", and "D_", respectively. This is a very simple mangling that
55b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// doesn't guarantee unique names for values. getValueName already
56b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// does this for you, so there's no point calling it on the result
57b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  /// from getValueName.
58b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke  ///
594166445b7cde22f81cd1a18b6f33fe94b94bdbb6Brian Gaeke  static std::string makeNameProper(const std::string &x);
60b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke};
61b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
62d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
63d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
64b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#endif // LLVM_SUPPORT_MANGLER_H
65