Mangler.h revision d11e6472573c61c44ca946c843ad83acdbe3c71f
1d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner//===-- Mangler.h - Self-contained llvm name mangler ------------*- C++ -*-===// 26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 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 17b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#include <map> 184166445b7cde22f81cd1a18b6f33fe94b94bdbb6Brian Gaeke#include <set> 19ebb20c51fa003192493a1718e37ce45a9e3998c5Tanya Lattner#include <string> 20b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 22d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Value; 23d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass Module; 24d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattnerclass GlobalValue; 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekeclass Mangler { 272b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner /// This keeps track of which global values have had their names 282b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner /// mangled in the current module. 292b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner /// 302b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner std::set<const Value *> MangledGlobals; 312b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 322b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner Module &M; 332b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner bool AddUnderscorePrefix; 342b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 352b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner typedef std::map<const Value *, std::string> ValueMap; 362b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner ValueMap Memo; 372b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 382b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner unsigned Count; 39d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner 40d11e6472573c61c44ca946c843ad83acdbe3c71fChris Lattner void InsertName(GlobalValue *GV, std::map<std::string, GlobalValue*> &Names); 41b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaekepublic: 422b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 432b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner // Mangler ctor - if AddUnderscorePrefix is true, then all public global 442b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner // symbols will be prefixed with an underscore. 452b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner Mangler(Module &M, bool AddUnderscorePrefix = false); 462b3860faebe96b45a5654d4e4ca9faa18ed97dbbChris Lattner 47b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// getValueName - Returns the mangled name of V, an LLVM Value, 48b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// in the current module. 49b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// 50b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke std::string getValueName(const Value *V); 51b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 52b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// makeNameProper - We don't want identifier names with ., space, or 53b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// - in them, so we mangle these characters into the strings "d_", 54b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// "s_", and "D_", respectively. This is a very simple mangling that 55b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// doesn't guarantee unique names for values. getValueName already 56b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// does this for you, so there's no point calling it on the result 57b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// from getValueName. 58b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke /// 594166445b7cde22f81cd1a18b6f33fe94b94bdbb6Brian Gaeke static std::string makeNameProper(const std::string &x); 60b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke}; 61b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 62d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 63d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 64b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke#endif // LLVM_SUPPORT_MANGLER_H 65