10b57cec5SDimitry Andric //===-- llvm/IR/Mangler.h - Self-contained name mangler ---------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Unified name mangler for various backends. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_IR_MANGLER_H 140b57cec5SDimitry Andric #define LLVM_IR_MANGLER_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 170fca6ea1SDimitry Andric #include "llvm/ADT/StringRef.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric namespace llvm { 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric class DataLayout; 225ffd83dbSDimitry Andric class GlobalValue; 230b57cec5SDimitry Andric template <typename T> class SmallVectorImpl; 240b57cec5SDimitry Andric class Triple; 250b57cec5SDimitry Andric class Twine; 260b57cec5SDimitry Andric class raw_ostream; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric class Mangler { 290b57cec5SDimitry Andric /// We need to give global values the same name every time they are mangled. 300b57cec5SDimitry Andric /// This keeps track of the number we give to anonymous ones. 310b57cec5SDimitry Andric mutable DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric public: 340b57cec5SDimitry Andric /// Print the appropriate prefix and the specified global variable's name. 350b57cec5SDimitry Andric /// If the global variable doesn't have a name, this fills in a unique name 360b57cec5SDimitry Andric /// for the global. 370b57cec5SDimitry Andric void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, 380b57cec5SDimitry Andric bool CannotUsePrivateLabel) const; 390b57cec5SDimitry Andric void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV, 400b57cec5SDimitry Andric bool CannotUsePrivateLabel) const; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric /// Print the appropriate prefix and the specified name as the global variable 430b57cec5SDimitry Andric /// name. GVName must not be empty. 440b57cec5SDimitry Andric static void getNameWithPrefix(raw_ostream &OS, const Twine &GVName, 450b57cec5SDimitry Andric const DataLayout &DL); 460b57cec5SDimitry Andric static void getNameWithPrefix(SmallVectorImpl<char> &OutName, 470b57cec5SDimitry Andric const Twine &GVName, const DataLayout &DL); 480b57cec5SDimitry Andric }; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, 510b57cec5SDimitry Andric const Triple &TT, Mangler &Mangler); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, 540b57cec5SDimitry Andric const Triple &T, Mangler &M); 550b57cec5SDimitry Andric 560fca6ea1SDimitry Andric std::optional<std::string> getArm64ECMangledFunctionName(StringRef Name); 570fca6ea1SDimitry Andric std::optional<std::string> getArm64ECDemangledFunctionName(StringRef Name); 580fca6ea1SDimitry Andric 59*415efcecSDimitry Andric /// Check if an ARM64EC function name is mangled. 60*415efcecSDimitry Andric bool inline isArm64ECMangledFunctionName(StringRef Name) { 61*415efcecSDimitry Andric return Name[0] == '#' || 62*415efcecSDimitry Andric (Name[0] == '?' && Name.find("@$$h") != StringRef::npos); 63*415efcecSDimitry Andric } 64*415efcecSDimitry Andric 650b57cec5SDimitry Andric } // End llvm namespace 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric #endif 68