136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- llvm/IR/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
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_IR_MANGLER_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_IR_MANGLER_H
16b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
178001524f43c0d04b7576efceefeac9be27f7dc0cOwen Anderson#include "llvm/ADT/DenseMap.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h"
19b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
21cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DataLayout;
23d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue;
24cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendlingtemplate <typename T> class SmallVectorImpl;
25cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendlingclass Twine;
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
27b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler {
283d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
293d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  enum ManglerPrefixTy {
305c0ba804c02777c53c0842d0be2d16d1d92b9a46Bill Wendling    Default,               ///< Emit default string before each symbol.
315c0ba804c02777c53c0842d0be2d16d1d92b9a46Bill Wendling    Private,               ///< Emit "private" prefix before each symbol.
3207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling    LinkerPrivate          ///< Emit "linker private" prefix before each symbol.
333d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  };
343d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
353d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingprivate:
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const DataLayout *DL;
373d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
3859ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// AnonGlobalIDs - We need to give global values the same name every time
3959ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// they are mangled.  This keeps track of the number we give to anonymous
4059ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// ones.
416c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  mutable DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs;
432b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
4459ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// NextAnonGlobalID - This simple counter is used to unique value names.
456c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  mutable unsigned NextAnonGlobalID;
47fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
483d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Mangler(const DataLayout *DL) : DL(DL), NextAnonGlobalID(1) {}
5073ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Print the appropriate prefix and the specified global variable's name.
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// If the global variable doesn't have a name, this fills in a unique name
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// for the global.
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV,
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         bool CannotUsePrivateLabel) const;
56145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         bool CannotUsePrivateLabel) const;
5803753aa7598a0c313846fd49fc7eaf75c2d9f003Nadav Rotem
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Print the appropriate prefix and the specified name as the global variable
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// name. GVName must not be empty.
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getNameWithPrefix(raw_ostream &OS, const Twine &GVName,
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         ManglerPrefixTy PrefixTy = Mangler::Default) const;
63145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const Twine &GVName,
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         ManglerPrefixTy PrefixTy = Mangler::Default) const;
65b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke};
66b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
67d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
68d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
70