1*9880d681SAndroid Build Coastguard Worker //===-- NVPTXAssignValidGlobalNames.cpp - Assign valid names to globals ---===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // Clean up the names of global variables in the module to not contain symbols 11*9880d681SAndroid Build Coastguard Worker // that are invalid in PTX. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker // Currently NVPTX, like other backends, relies on generic symbol name 14*9880d681SAndroid Build Coastguard Worker // sanitizing done by MC. However, the ptxas assembler is more stringent and 15*9880d681SAndroid Build Coastguard Worker // disallows some additional characters in symbol names. This pass makes sure 16*9880d681SAndroid Build Coastguard Worker // such names do not reach MC at all. 17*9880d681SAndroid Build Coastguard Worker // 18*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker #include "NVPTX.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalVariable.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 25*9880d681SAndroid Build Coastguard Worker #include <string> 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker using namespace llvm; 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker namespace { 30*9880d681SAndroid Build Coastguard Worker /// \brief NVPTXAssignValidGlobalNames 31*9880d681SAndroid Build Coastguard Worker class NVPTXAssignValidGlobalNames : public ModulePass { 32*9880d681SAndroid Build Coastguard Worker public: 33*9880d681SAndroid Build Coastguard Worker static char ID; NVPTXAssignValidGlobalNames()34*9880d681SAndroid Build Coastguard Worker NVPTXAssignValidGlobalNames() : ModulePass(ID) {} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker bool runOnModule(Module &M) override; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker /// \brief Clean up the name to remove symbols invalid in PTX. 39*9880d681SAndroid Build Coastguard Worker std::string cleanUpName(StringRef Name); 40*9880d681SAndroid Build Coastguard Worker }; 41*9880d681SAndroid Build Coastguard Worker } 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker char NVPTXAssignValidGlobalNames::ID = 0; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker namespace llvm { 46*9880d681SAndroid Build Coastguard Worker void initializeNVPTXAssignValidGlobalNamesPass(PassRegistry &); 47*9880d681SAndroid Build Coastguard Worker } 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(NVPTXAssignValidGlobalNames, "nvptx-assign-valid-global-names", 50*9880d681SAndroid Build Coastguard Worker "Assign valid PTX names to globals", false, false) 51*9880d681SAndroid Build Coastguard Worker runOnModule(Module & M)52*9880d681SAndroid Build Coastguard Workerbool NVPTXAssignValidGlobalNames::runOnModule(Module &M) { 53*9880d681SAndroid Build Coastguard Worker for (GlobalVariable &GV : M.globals()) { 54*9880d681SAndroid Build Coastguard Worker // We are only allowed to rename local symbols. 55*9880d681SAndroid Build Coastguard Worker if (GV.hasLocalLinkage()) { 56*9880d681SAndroid Build Coastguard Worker // setName doesn't do extra work if the name does not change. 57*9880d681SAndroid Build Coastguard Worker // Note: this does not create collisions - if setName is asked to set the 58*9880d681SAndroid Build Coastguard Worker // name to something that already exists, it adds a proper postfix to 59*9880d681SAndroid Build Coastguard Worker // avoid collisions. 60*9880d681SAndroid Build Coastguard Worker GV.setName(cleanUpName(GV.getName())); 61*9880d681SAndroid Build Coastguard Worker } 62*9880d681SAndroid Build Coastguard Worker } 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker return true; 65*9880d681SAndroid Build Coastguard Worker } 66*9880d681SAndroid Build Coastguard Worker cleanUpName(StringRef Name)67*9880d681SAndroid Build Coastguard Workerstd::string NVPTXAssignValidGlobalNames::cleanUpName(StringRef Name) { 68*9880d681SAndroid Build Coastguard Worker std::string ValidName; 69*9880d681SAndroid Build Coastguard Worker raw_string_ostream ValidNameStream(ValidName); 70*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0, E = Name.size(); I != E; ++I) { 71*9880d681SAndroid Build Coastguard Worker char C = Name[I]; 72*9880d681SAndroid Build Coastguard Worker if (C == '.' || C == '@') { 73*9880d681SAndroid Build Coastguard Worker ValidNameStream << "_$_"; 74*9880d681SAndroid Build Coastguard Worker } else { 75*9880d681SAndroid Build Coastguard Worker ValidNameStream << C; 76*9880d681SAndroid Build Coastguard Worker } 77*9880d681SAndroid Build Coastguard Worker } 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker return ValidNameStream.str(); 80*9880d681SAndroid Build Coastguard Worker } 81*9880d681SAndroid Build Coastguard Worker createNVPTXAssignValidGlobalNamesPass()82*9880d681SAndroid Build Coastguard WorkerModulePass *llvm::createNVPTXAssignValidGlobalNamesPass() { 83*9880d681SAndroid Build Coastguard Worker return new NVPTXAssignValidGlobalNames(); 84*9880d681SAndroid Build Coastguard Worker } 85