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