1 //===-- llvm/IR/Mangler.h - Self-contained name mangler ---------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Unified name mangler for various backends. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_IR_MANGLER_H 14 #define LLVM_IR_MANGLER_H 15 16 #include "llvm/ADT/DenseMap.h" 17 #include "llvm/ADT/StringRef.h" 18 19 namespace llvm { 20 21 class DataLayout; 22 class GlobalValue; 23 template <typename T> class SmallVectorImpl; 24 class Triple; 25 class Twine; 26 class raw_ostream; 27 28 class Mangler { 29 /// We need to give global values the same name every time they are mangled. 30 /// This keeps track of the number we give to anonymous ones. 31 mutable DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs; 32 33 public: 34 /// Print the appropriate prefix and the specified global variable's name. 35 /// If the global variable doesn't have a name, this fills in a unique name 36 /// for the global. 37 void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, 38 bool CannotUsePrivateLabel) const; 39 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV, 40 bool CannotUsePrivateLabel) const; 41 42 /// Print the appropriate prefix and the specified name as the global variable 43 /// name. GVName must not be empty. 44 static void getNameWithPrefix(raw_ostream &OS, const Twine &GVName, 45 const DataLayout &DL); 46 static void getNameWithPrefix(SmallVectorImpl<char> &OutName, 47 const Twine &GVName, const DataLayout &DL); 48 }; 49 50 void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, 51 const Triple &TT, Mangler &Mangler); 52 53 void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, 54 const Triple &T, Mangler &M); 55 56 std::optional<std::string> getArm64ECMangledFunctionName(StringRef Name); 57 std::optional<std::string> getArm64ECDemangledFunctionName(StringRef Name); 58 59 } // End llvm namespace 60 61 #endif 62