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/IR/GlobalValue.h" 18 19 namespace llvm { 20 21 class DataLayout; 22 template <typename T> class SmallVectorImpl; 23 class Triple; 24 class Twine; 25 class raw_ostream; 26 27 class Mangler { 28 /// We need to give global values the same name every time they are mangled. 29 /// This keeps track of the number we give to anonymous ones. 30 mutable DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs; 31 32 public: 33 /// Print the appropriate prefix and the specified global variable's name. 34 /// If the global variable doesn't have a name, this fills in a unique name 35 /// for the global. 36 void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, 37 bool CannotUsePrivateLabel) const; 38 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV, 39 bool CannotUsePrivateLabel) const; 40 41 /// Print the appropriate prefix and the specified name as the global variable 42 /// name. GVName must not be empty. 43 static void getNameWithPrefix(raw_ostream &OS, const Twine &GVName, 44 const DataLayout &DL); 45 static void getNameWithPrefix(SmallVectorImpl<char> &OutName, 46 const Twine &GVName, const DataLayout &DL); 47 }; 48 49 void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, 50 const Triple &TT, Mangler &Mangler); 51 52 void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, 53 const Triple &T, Mangler &M); 54 55 } // End llvm namespace 56 57 #endif 58