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