173ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner//===-- llvm/Target/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
14674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_TARGET_MANGLER_H
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_TARGET_MANGLER_H
16b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
178001524f43c0d04b7576efceefeac9be27f7dc0cOwen Anderson#include "llvm/ADT/DenseMap.h"
18b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
20cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling
21d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue;
225ef31a039dbb9c36cfd78442b3554d1b6974ec4cChris Lattnerclass MCContext;
2373ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattnerclass MCSymbol;
24cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendlingtemplate <typename T> class SmallVectorImpl;
25cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendlingclass TargetMachine;
26cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendlingclass Twine;
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler {
293d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
303d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  enum ManglerPrefixTy {
315c0ba804c02777c53c0842d0be2d16d1d92b9a46Bill Wendling    Default,               ///< Emit default string before each symbol.
325c0ba804c02777c53c0842d0be2d16d1d92b9a46Bill Wendling    Private,               ///< Emit "private" prefix before each symbol.
3307d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling    LinkerPrivate          ///< Emit "linker private" prefix before each symbol.
343d10a5a75794356a0a568ce283713adc3a963200Bill Wendling  };
353d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
363d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingprivate:
3773ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner  MCContext &Context;
38cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling  const TargetMachine *TM;
393d10a5a75794356a0a568ce283713adc3a963200Bill Wendling
4059ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// AnonGlobalIDs - We need to give global values the same name every time
4159ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// they are mangled.  This keeps track of the number we give to anonymous
4259ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// ones.
436c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
4459ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs;
452b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
4659ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  /// NextAnonGlobalID - This simple counter is used to unique value names.
476c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner  ///
4859ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner  unsigned NextAnonGlobalID;
49fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
503d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic:
51cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling  Mangler(MCContext &Context, const TargetMachine *TM)
52cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling    : Context(Context), TM(TM), NextAnonGlobalID(1) {}
532b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner
5473ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner  /// getSymbol - Return the MCSymbol for the specified global value.  This
5573ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner  /// symbol is the main label that is the address of the global.
5673ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner  MCSymbol *getSymbol(const GlobalValue *GV);
5773ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner
58145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
59145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// and the specified global variable's name.  If the global variable doesn't
60145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// have a name, this fills in a unique name for the global.
61145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
62fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck                         bool isImplicitlyPrivate, bool UseGlobalPrefix = true);
6303753aa7598a0c313846fd49fc7eaf75c2d9f003Nadav Rotem
64145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
65145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// and the specified name as the global variable name.  GVName must not be
66145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  /// empty.
67145438489fc2ecdc223e19b1356712a6de06de1dChris Lattner  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const Twine &GVName,
68fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck                         ManglerPrefixTy PrefixTy = Mangler::Default,
69fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck                         bool UseGlobalPrefix = true);
70b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke};
71b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke
72d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
73d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
74674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#endif // LLVM_TARGET_MANGLER_H
75