diff --git a/llvm/lib/Target/NVPTX/CMakeLists.txt b/llvm/lib/Target/NVPTX/CMakeLists.txt --- a/llvm/lib/Target/NVPTX/CMakeLists.txt +++ b/llvm/lib/Target/NVPTX/CMakeLists.txt @@ -32,7 +32,6 @@ NVPTXSubtarget.cpp NVPTXTargetMachine.cpp NVPTXTargetTransformInfo.cpp - NVPTXUtilities.cpp NVVMIntrRange.cpp NVVMReflect.cpp NVPTXProxyRegErasure.cpp @@ -57,6 +56,7 @@ TargetParser TransformUtils Vectorize + NVPTXUtils ADD_TO_COMPONENT NVPTX @@ -64,3 +64,4 @@ add_subdirectory(MCTargetDesc) add_subdirectory(TargetInfo) +add_subdirectory(Utils) diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/CMakeLists.txt b/llvm/lib/Target/NVPTX/MCTargetDesc/CMakeLists.txt --- a/llvm/lib/Target/NVPTX/MCTargetDesc/CMakeLists.txt +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/CMakeLists.txt @@ -7,6 +7,7 @@ LINK_COMPONENTS MC NVPTXInfo + NVPTXUtils Support TargetParser diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h @@ -48,6 +48,7 @@ /// /// This is used to emit bytes in \p Data as sequence of .byte directives. void emitRawBytes(StringRef Data) override; + void emitValue(const MCExpr *Value) override; }; class NVPTXAsmTargetStreamer : public NVPTXTargetStreamer { diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp @@ -11,8 +11,10 @@ //===----------------------------------------------------------------------===// #include "NVPTXTargetStreamer.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCObjectFileInfo.h" using namespace llvm; @@ -105,6 +107,17 @@ } } +void NVPTXTargetStreamer::emitValue(const MCExpr *Value) { + if (Value->getKind() != MCExpr::ExprKind::SymbolRef) + return MCTargetStreamer::emitValue(Value); + + SmallString<128> Str; + raw_svector_ostream OS(Str); + Value->print(OS, Streamer.getContext().getAsmInfo()); + + Streamer.emitRawText(sanitizePTXSymName(Str)); +} + void NVPTXTargetStreamer::emitRawBytes(StringRef Data) { MCTargetStreamer::emitRawBytes(Data); // TODO: enable this once the bug in the ptxas with the packed bytes is diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp --- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -22,7 +22,7 @@ #include "NVPTXRegisterInfo.h" #include "NVPTXSubtarget.h" #include "NVPTXTargetMachine.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "TargetInfo/NVPTXTargetInfo.h" #include "cl_common_defines.h" #include "llvm/ADT/APFloat.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp b/llvm/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp --- a/llvm/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include "NVPTX.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/LegacyPassManager.h" @@ -57,32 +58,18 @@ // Note: this does not create collisions - if setName is asked to set the // name to something that already exists, it adds a proper postfix to // avoid collisions. - GV.setName(cleanUpName(GV.getName())); + GV.setName(sanitizePTXSymName(GV.getName())); } } // Do the same for local functions. for (Function &F : M.functions()) if (F.hasLocalLinkage()) - F.setName(cleanUpName(F.getName())); + F.setName(sanitizePTXSymName(F.getName())); return true; } -std::string NVPTXAssignValidGlobalNames::cleanUpName(StringRef Name) { - std::string ValidName; - raw_string_ostream ValidNameStream(ValidName); - for (char C : Name) { - if (C == '.' || C == '@') { - ValidNameStream << "_$_"; - } else { - ValidNameStream << C; - } - } - - return ValidNameStream.str(); -} - ModulePass *llvm::createNVPTXAssignValidGlobalNamesPass() { return new NVPTXAssignValidGlobalNames(); } diff --git a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp --- a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -13,7 +13,7 @@ #include "MCTargetDesc/NVPTXBaseInfo.h" #include "NVPTX.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp --- a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp @@ -12,7 +12,7 @@ #include "NVPTXISelDAGToDAG.h" #include "MCTargetDesc/NVPTXBaseInfo.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/Instructions.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -17,7 +17,7 @@ #include "NVPTXSubtarget.h" #include "NVPTXTargetMachine.h" #include "NVPTXTargetObjectFile.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp --- a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp @@ -14,7 +14,7 @@ //===----------------------------------------------------------------------===// #include "NVPTX.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Intrinsics.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXLowerAlloca.cpp b/llvm/lib/Target/NVPTX/NVPTXLowerAlloca.cpp --- a/llvm/lib/Target/NVPTX/NVPTXLowerAlloca.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXLowerAlloca.cpp @@ -24,9 +24,9 @@ // //===----------------------------------------------------------------------===// -#include "NVPTX.h" -#include "NVPTXUtilities.h" #include "MCTargetDesc/NVPTXBaseInfo.h" +#include "NVPTX.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp b/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp --- a/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp @@ -91,7 +91,7 @@ #include "MCTargetDesc/NVPTXBaseInfo.h" #include "NVPTX.h" #include "NVPTXTargetMachine.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp --- a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "NVPTXTargetTransformInfo.h" -#include "NVPTXUtilities.h" +#include "Utils/NVPTXUtilities.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Analysis/ValueTracking.h" diff --git a/llvm/lib/Target/NVPTX/Utils/CMakeLists.txt b/llvm/lib/Target/NVPTX/Utils/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/llvm/lib/Target/NVPTX/Utils/CMakeLists.txt @@ -0,0 +1,9 @@ +add_llvm_component_library(LLVMNVPTXUtils + NVPTXUtilities.cpp + + LINK_COMPONENTS + Support + + ADD_TO_COMPONENT + NVPTX + ) diff --git a/llvm/lib/Target/NVPTX/NVPTXUtilities.h b/llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.h rename from llvm/lib/Target/NVPTX/NVPTXUtilities.h rename to llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.h --- a/llvm/lib/Target/NVPTX/NVPTXUtilities.h +++ b/llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.h @@ -74,6 +74,9 @@ } bool shouldEmitPTXNoReturn(const Value *V, const TargetMachine &TM); -} +/// `ptxas` doesn't like dots in symbol names. These show up for static locals +/// (among others). Get a legal replacement name +std::string sanitizePTXSymName(StringRef Name); +} // namespace llvm #endif diff --git a/llvm/lib/Target/NVPTX/NVPTXUtilities.cpp b/llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.cpp rename from llvm/lib/Target/NVPTX/NVPTXUtilities.cpp rename to llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.cpp --- a/llvm/lib/Target/NVPTX/NVPTXUtilities.cpp +++ b/llvm/lib/Target/NVPTX/Utils/NVPTXUtilities.cpp @@ -348,4 +348,16 @@ !isKernelFunction(*F); } +std::string sanitizePTXSymName(StringRef Name) { + std::string ValidName; + raw_string_ostream ValidNameStream(ValidName); + for (char C : Name) { + if (C == '.' || C == '@') { + ValidNameStream << "_$_"; + } else { + ValidNameStream << C; + } + } + return ValidNameStream.str(); +} } // namespace llvm