NVPTXAssignValidGlobalNames.cpp [plain text]
#include "NVPTX.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Module.h"
#include "llvm/PassManager.h"
#include "llvm/Support/raw_ostream.h"
#include <string>
using namespace llvm;
namespace {
class NVPTXAssignValidGlobalNames : public ModulePass {
public:
static char ID;
NVPTXAssignValidGlobalNames() : ModulePass(ID) {}
bool runOnModule(Module &M) override;
std::string cleanUpName(StringRef Name);
};
}
char NVPTXAssignValidGlobalNames::ID = 0;
namespace llvm {
void initializeNVPTXAssignValidGlobalNamesPass(PassRegistry &);
}
INITIALIZE_PASS(NVPTXAssignValidGlobalNames, "nvptx-assign-valid-global-names",
"Assign valid PTX names to globals", false, false)
bool NVPTXAssignValidGlobalNames::runOnModule(Module &M) {
for (GlobalVariable &GV : M.globals()) {
if (GV.hasLocalLinkage()) {
GV.setName(cleanUpName(GV.getName()));
}
}
return true;
}
std::string NVPTXAssignValidGlobalNames::cleanUpName(StringRef Name) {
std::string ValidName;
raw_string_ostream ValidNameStream(ValidName);
for (unsigned I = 0, E = Name.size(); I != E; ++I) {
char C = Name[I];
if (C == '.' || C == '@') {
ValidNameStream << "_$_";
} else {
ValidNameStream << C;
}
}
return ValidNameStream.str();
}
ModulePass *llvm::createNVPTXAssignValidGlobalNamesPass() {
return new NVPTXAssignValidGlobalNames();
}