diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -306,15 +306,10 @@ protected: CodeGenModule &CGM; - StringRef FirstSeparator, Separator; /// An OpenMP-IR-Builder instance. llvm::OpenMPIRBuilder OMPBuilder; - /// Constructor allowing to redefine the name separator for the variables. - explicit CGOpenMPRuntime(CodeGenModule &CGM, StringRef FirstSeparator, - StringRef Separator); - /// Helper to emit outlined function for 'target' directive. /// \param D Directive to emit. /// \param ParentName Name of the function that encloses the target region. @@ -691,8 +686,7 @@ Address DependenciesArray); public: - explicit CGOpenMPRuntime(CodeGenModule &CGM) - : CGOpenMPRuntime(CGM, ".", ".") {} + explicit CGOpenMPRuntime(CodeGenModule &CGM); virtual ~CGOpenMPRuntime() {} virtual void clear(); diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1057,14 +1057,11 @@ return Field; } -CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM, StringRef FirstSeparator, - StringRef Separator) - : CGM(CGM), FirstSeparator(FirstSeparator), Separator(Separator), - OMPBuilder(CGM.getModule()), OffloadEntriesInfoManager() { +CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM) + : CGM(CGM), OMPBuilder(CGM.getModule()), OffloadEntriesInfoManager() { KmpCriticalNameTy = llvm::ArrayType::get(CGM.Int32Ty, /*NumElements*/ 8); llvm::OpenMPIRBuilderConfig Config(CGM.getLangOpts().OpenMPIsDevice, false, hasRequiresUnifiedSharedMemory()); - // Initialize Types used in OpenMPIRBuilder from OMPKinds.def OMPBuilder.initialize(); OMPBuilder.setConfig(Config); @@ -1088,14 +1085,7 @@ } std::string CGOpenMPRuntime::getName(ArrayRef Parts) const { - SmallString<128> Buffer; - llvm::raw_svector_ostream OS(Buffer); - StringRef Sep = FirstSeparator; - for (StringRef Part : Parts) { - OS << Sep << Part; - Sep = Separator; - } - return std::string(OS.str()); + return OMPBuilder.createPlatformSpecificName(Parts); } static llvm::Function * diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp --- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp @@ -889,7 +889,7 @@ } CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM) - : CGOpenMPRuntime(CGM, "_", "$") { + : CGOpenMPRuntime(CGM) { llvm::OpenMPIRBuilderConfig Config(CGM.getLangOpts().OpenMPIsDevice, true, hasRequiresUnifiedSharedMemory()); OMPBuilder.setConfig(Config); diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -92,34 +92,61 @@ /// directive is present or not. Optional HasRequiresUnifiedSharedMemory; + /// First separator used between the initial two parts of a name. + Optional FirstSeparator; + /// Separator used between all of the rest consecutive parts of s name + Optional Separator; + OpenMPIRBuilderConfig() {} OpenMPIRBuilderConfig(bool IsEmbedded, bool IsTargetCodegen, bool HasRequiresUnifiedSharedMemory) : IsEmbedded(IsEmbedded), IsTargetCodegen(IsTargetCodegen), HasRequiresUnifiedSharedMemory(HasRequiresUnifiedSharedMemory) {} - // Convenience getter functions that assert if the value is not present. - bool isEmbedded() { + // Getters functions that assert if the required values are not present. + bool isEmbedded() const { assert(IsEmbedded.has_value() && "IsEmbedded is not set"); return IsEmbedded.value(); } - bool isTargetCodegen() { + bool isTargetCodegen() const { assert(IsTargetCodegen.has_value() && "IsTargetCodegen is not set"); return IsTargetCodegen.value(); } - bool hasRequiresUnifiedSharedMemory() { + bool hasRequiresUnifiedSharedMemory() const { assert(HasRequiresUnifiedSharedMemory.has_value() && "HasUnifiedSharedMemory is not set"); return HasRequiresUnifiedSharedMemory.value(); } + // Returns the FirstSeparator if set, otherwise use the default + // separator depending on isTargetCodegen + StringRef firstSeparator() const { + if (FirstSeparator.has_value()) + return FirstSeparator.value(); + if (isTargetCodegen()) + return "_"; + return "."; + } + + // Returns the Separator if set, otherwise use the default + // separator depending on isTargetCodegen + StringRef separator() const { + if (Separator.has_value()) + return Separator.value(); + if (isTargetCodegen()) + return "$"; + return "."; + } + void setIsEmbedded(bool Value) { IsEmbedded = Value; } void setIsTargetCodegen(bool Value) { IsTargetCodegen = Value; } void setHasRequiresUnifiedSharedMemory(bool Value) { HasRequiresUnifiedSharedMemory = Value; } + void setFirstSeparator(StringRef FS) { FirstSeparator = FS; } + void setSeparator(StringRef S) { Separator = S; } }; /// An interface to create LLVM-IR for OpenMP directives. @@ -150,6 +177,16 @@ /// Type used throughout for insertion points. using InsertPointTy = IRBuilder<>::InsertPoint; + /// Get the create a name using the platform specific separators. + /// \param Parts parts of the final name that needs separation + /// The created name has a first separator between the first and second part + /// and a second separator between all other parts. + /// E.g. with FirstSeparator "$" and Separator "." and + /// parts: "p1", "p2", "p3", "p4" + /// The resulting name is "p1$p2.p3.p4" + /// The separators are retrieved from the OpenMPIRBuilderConfig. + std::string createPlatformSpecificName(ArrayRef Parts) const; + /// Callback type for variable finalization (think destructors). /// /// \param CodeGenIP is the insertion point at which the finalization code diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -3963,6 +3963,12 @@ return OS.str().str(); } +std::string +OpenMPIRBuilder::createPlatformSpecificName(ArrayRef Parts) const { + return OpenMPIRBuilder::getNameWithSeparators(Parts, Config.firstSeparator(), + Config.separator()); +} + GlobalVariable * OpenMPIRBuilder::getOrCreateInternalVariable(Type *Ty, const StringRef &Name, unsigned AddressSpace) {