Mangler.h revision 3d10a5a75794356a0a568ce283713adc3a963200
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/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 14b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#ifndef LLVM_SUPPORT_MANGLER_H 15b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#define LLVM_SUPPORT_MANGLER_H 16b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 178001524f43c0d04b7576efceefeac9be27f7dc0cOwen Anderson#include "llvm/ADT/DenseMap.h" 18250c1d8734ae29b8e408e16dc575b21a31fcb0d7Evan Cheng#include "llvm/ADT/SmallPtrSet.h" 19ebb20c51fa003192493a1718e37ce45a9e3998c5Tanya Lattner#include <string> 20b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 22ddc49d6121d90728fc08c1fdc03e2cccdf58d272Chris Lattnerclass Type; 23d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Module; 24a112e0f44721848363b42ddeb7c6354f934878e0Chris Lattnerclass Value; 25d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue; 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 27b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler { 283d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic: 293d10a5a75794356a0a568ce283713adc3a963200Bill Wendling enum ManglerPrefixTy { 303d10a5a75794356a0a568ce283713adc3a963200Bill Wendling DefaultPrefixTy, ///< Emit default string before each symbol. 313d10a5a75794356a0a568ce283713adc3a963200Bill Wendling PrivatePrefixTy, ///< Emit "private" prefix before each symbol. 323d10a5a75794356a0a568ce283713adc3a963200Bill Wendling LinkerPrivatePrefixTy ///< Emit "linker private" prefix before each symbol. 333d10a5a75794356a0a568ce283713adc3a963200Bill Wendling }; 343d10a5a75794356a0a568ce283713adc3a963200Bill Wendling 353d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingprivate: 366c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner /// Prefix - This string is added to each symbol that is emitted, unless the 376c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner /// symbol is marked as not needing this prefix. 382c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner const char *Prefix; 39fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 408f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng /// PrivatePrefix - This string is emitted before each symbol with private 418f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng /// linkage. 42bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola const char *PrivatePrefix; 438f18edd8b6fe00209314f4c56f33d7c3c18bbbffEvan Cheng 443d10a5a75794356a0a568ce283713adc3a963200Bill Wendling /// LinkerPrivatePrefix - This string is emitted before each symbol with 453d10a5a75794356a0a568ce283713adc3a963200Bill Wendling /// "linker_private" linkage. 463d10a5a75794356a0a568ce283713adc3a963200Bill Wendling const char *LinkerPrivatePrefix; 473d10a5a75794356a0a568ce283713adc3a963200Bill Wendling 48fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman /// UseQuotes - If this is set, the target accepts global names in quotes, 49ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner /// e.g. "foo bar" is a legal name. This syntax is used instead of escaping 50ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner /// the space character. By default, this is false. 51ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner bool UseQuotes; 52fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 5359ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner /// AnonGlobalIDs - We need to give global values the same name every time 5459ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner /// they are mangled. This keeps track of the number we give to anonymous 5559ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner /// ones. 566c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner /// 5759ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs; 582b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 5959ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner /// NextAnonGlobalID - This simple counter is used to unique value names. 606c636c0fffe03f4acc5a68ce9f9e2f22d6c8ec8aChris Lattner /// 6159ecdfbee3aaf1ed48e8ddf0a660044fa8a93729Chris Lattner unsigned NextAnonGlobalID; 62fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 63d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner /// AcceptableChars - This bitfield contains a one for each character that is 64d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner /// allowed to be part of an unmangled name. 653d10a5a75794356a0a568ce283713adc3a963200Bill Wendling unsigned AcceptableChars[256 / 32]; 662b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 673d10a5a75794356a0a568ce283713adc3a963200Bill Wendlingpublic: 682c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner // Mangler ctor - if a prefix is specified, it will be prepended onto all 692c2475296d55bd38281cba0c2b41ba3a897164ddChris Lattner // symbols. 703d10a5a75794356a0a568ce283713adc3a963200Bill Wendling Mangler(Module &M, const char *Prefix = "", const char *privatePrefix = "", 713d10a5a75794356a0a568ce283713adc3a963200Bill Wendling const char *linkerPrivatePrefix = ""); 722b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 73ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner /// setUseQuotes - If UseQuotes is set to true, this target accepts quoted 74ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner /// strings for assembler labels. 75ac8c83428886adcd6b6b2290252db87be184c71cChris Lattner void setUseQuotes(bool Val) { UseQuotes = Val; } 76fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 77d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner /// Acceptable Characters - This allows the target to specify which characters 78d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner /// are acceptable to the assembler without being mangled. By default we 79d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner /// allow letters, numbers, '_', '$', and '.', which is what GAS accepts. 80d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner void markCharAcceptable(unsigned char X) { 81d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner AcceptableChars[X/32] |= 1 << (X&31); 82d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner } 83d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner void markCharUnacceptable(unsigned char X) { 84d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner AcceptableChars[X/32] &= ~(1 << (X&31)); 85d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner } 86d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner bool isCharAcceptable(unsigned char X) const { 87d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner return (AcceptableChars[X/32] & (1 << (X&31))) != 0; 88d35f6056137788fcee34b25e70b0d14b453490fcChris Lattner } 89fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 90b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner /// getMangledName - Returns the mangled name of V, an LLVM Value, 91b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner /// in the current module. If 'Suffix' is specified, the name ends with the 92b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner /// specified suffix. If 'ForcePrivate' is specified, the label is specified 93b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner /// to have a private label prefix. 94b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// 95b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner std::string getMangledName(const GlobalValue *V, const char *Suffix = "", 96b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner bool ForcePrivate = false); 97b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 98b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// makeNameProper - We don't want identifier names with ., space, or 99b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// - in them, so we mangle these characters into the strings "d_", 100b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// "s_", and "D_", respectively. This is a very simple mangling that 101b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// doesn't guarantee unique names for values. getValueName already 102b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// does this for you, so there's no point calling it on the result 103b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// from getValueName. 10463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman /// 1051cda87c3a07dc097f27e365f7f3ff4bcb31f5699Chris Lattner std::string makeNameProper(const std::string &x, 1063d10a5a75794356a0a568ce283713adc3a963200Bill Wendling ManglerPrefixTy PrefixTy = DefaultPrefixTy); 107b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke}; 108b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 109d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 110d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 111b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#endif // LLVM_SUPPORT_MANGLER_H 112