[PATCH] D80439: Replace separator in OpenMP variant name mangling.
LukasSommerTu created this revision. LukasSommerTu added reviewers: jdoerfert, Hahnfeld. LukasSommerTu added projects: OpenMP, clang. Herald added subscribers: cfe-commits, sstefan1, guansong, yaxunl. Nvidia PTX does not allow `.` to appear in identifiers, so OpenMP variant mangling now uses `$` to separate segments of the mangled name for variants of functions declared via `declare variant`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D80439 Files: clang/include/clang/AST/Decl.h clang/lib/AST/OpenMPClause.cpp Index: clang/lib/AST/OpenMPClause.cpp === --- clang/lib/AST/OpenMPClause.cpp +++ clang/lib/AST/OpenMPClause.cpp @@ -2109,22 +2109,21 @@ std::string MangledName; llvm::raw_string_ostream OS(MangledName); for (const OMPTraitSet &Set : Sets) { -OS << '.' << 'S' << unsigned(Set.Kind); +OS << '$' << 'S' << unsigned(Set.Kind); for (const OMPTraitSelector &Selector : Set.Selectors) { bool AllowsTraitScore = false; bool RequiresProperty = false; isValidTraitSelectorForTraitSet( Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty); - OS << '.' << 's' << unsigned(Selector.Kind); + OS << '$' << 's' << unsigned(Selector.Kind); if (!RequiresProperty || Selector.Kind == TraitSelector::user_condition) continue; for (const OMPTraitProperty &Property : Selector.Properties) -OS << '.' << 'P' - << getOpenMPContextTraitPropertyName(Property.Kind); +OS << '$' << 'P' << getOpenMPContextTraitPropertyName(Property.Kind); } } return OS.str(); @@ -2133,7 +2132,7 @@ OMPTraitInfo::OMPTraitInfo(StringRef MangledName) { unsigned long U; do { -if (!MangledName.consume_front(".S")) +if (!MangledName.consume_front("$S")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2141,7 +2140,7 @@ OMPTraitSet &Set = Sets.back(); Set.Kind = TraitSet(U); do { - if (!MangledName.consume_front(".s")) + if (!MangledName.consume_front("$s")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2149,11 +2148,11 @@ OMPTraitSelector &Selector = Set.Selectors.back(); Selector.Kind = TraitSelector(U); do { -if (!MangledName.consume_front(".P")) +if (!MangledName.consume_front("$P")) break; Selector.Properties.push_back(OMPTraitProperty()); OMPTraitProperty &Property = Selector.Properties.back(); -std::pair PropRestPair = MangledName.split('.'); +std::pair PropRestPair = MangledName.split('$'); Property.Kind = getOpenMPContextTraitPropertyKind(Set.Kind, PropRestPair.first); MangledName = PropRestPair.second; Index: clang/include/clang/AST/Decl.h === --- clang/include/clang/AST/Decl.h +++ clang/include/clang/AST/Decl.h @@ -4554,7 +4554,7 @@ /// The new name looks likes this: /// + OpenMPVariantManglingSeparatorStr + static constexpr StringRef getOpenMPVariantManglingSeparatorStr() { - return ".ompvariant"; + return "$ompvariant"; } } // namespace clang Index: clang/lib/AST/OpenMPClause.cpp === --- clang/lib/AST/OpenMPClause.cpp +++ clang/lib/AST/OpenMPClause.cpp @@ -2109,22 +2109,21 @@ std::string MangledName; llvm::raw_string_ostream OS(MangledName); for (const OMPTraitSet &Set : Sets) { -OS << '.' << 'S' << unsigned(Set.Kind); +OS << '$' << 'S' << unsigned(Set.Kind); for (const OMPTraitSelector &Selector : Set.Selectors) { bool AllowsTraitScore = false; bool RequiresProperty = false; isValidTraitSelectorForTraitSet( Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty); - OS << '.' << 's' << unsigned(Selector.Kind); + OS << '$' << 's' << unsigned(Selector.Kind); if (!RequiresProperty || Selector.Kind == TraitSelector::user_condition) continue; for (const OMPTraitProperty &Property : Selector.Properties) -OS << '.' << 'P' - << getOpenMPContextTraitPropertyName(Property.Kind); +OS << '$' << 'P' << getOpenMPContextTraitPropertyName(Property.Kind); } } return OS.str(); @@ -2133,7 +2132,7 @@ OMPTraitInfo::OMPTraitInfo(StringRef MangledName) { unsigned long U; do { -if (!MangledName.consume_front(".S")) +if (!MangledName.consume_front("$S")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2141,7 +2140,7 @@ OMPTraitSet &Set = Sets.back(); Set.Kind = TraitSet(U); do { - if (!MangledName.consume_front(".s")) + if (!MangledName.consume_front("$s")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2149,11 +2148,11 @@ OMPTraitSele
[PATCH] D80439: Replace separator in OpenMP variant name mangling.
LukasSommerTu added a comment. @jdoerfert: I've added a test. I kept it focused on the variants for NVPTX architecture (mangling is currently the same for all archs), let me know if that was what you had in mind. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D80439/new/ https://reviews.llvm.org/D80439 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D80439: Replace separator in OpenMP variant name mangling.
LukasSommerTu updated this revision to Diff 267902. LukasSommerTu added a comment. Added a small test checking for functions with the correctly mangled name. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D80439/new/ https://reviews.llvm.org/D80439 Files: clang/include/clang/AST/Decl.h clang/lib/AST/OpenMPClause.cpp clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp Index: clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp === --- /dev/null +++ clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp @@ -0,0 +1,41 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=50 +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='call i32 {@_Z3bazv|@_Z3barv}' +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -fopenmp-version=50 +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='call i32 {@_Z3bazv|@_Z3barv}' +// expected-no-diagnostics + +// CHECK-DAG: @_Z3barv +// CHECK-DAG: @_Z3bazv +// CHECK-DAG: @"_Z54bar$ompvariant$S2$s8$Pnvptx$Pnvptx64$S3$s10$Pmatch_anyv" +// CHECK-DAG: @"_Z54baz$ompvariant$S2$s8$Pnvptx$Pnvptx64$S3$s10$Pmatch_anyv" +// CHECK-DAG: call i32 @"_Z54bar$ompvariant$S2$s8$Pnvptx$Pnvptx64$S3$s10$Pmatch_anyv"() +// CHECK-DAG: call i32 @"_Z54baz$ompvariant$S2$s8$Pnvptx$Pnvptx64$S3$s10$Pmatch_anyv"() + +#ifndef HEADER +#define HEADER + +#pragma omp declare target + +int bar() { return 1; } + +int baz() { return 5; } + +#pragma omp begin declare variant match(device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)}) + +int bar() { return 2; } + +int baz() { return 6; } + +#pragma omp end declare variant + +#pragma omp end declare target + +int main() { + int res; +#pragma omp target map(from \ + : res) + res = bar() + baz(); + return res; +} + +#endif \ No newline at end of file Index: clang/lib/AST/OpenMPClause.cpp === --- clang/lib/AST/OpenMPClause.cpp +++ clang/lib/AST/OpenMPClause.cpp @@ -2109,22 +2109,21 @@ std::string MangledName; llvm::raw_string_ostream OS(MangledName); for (const OMPTraitSet &Set : Sets) { -OS << '.' << 'S' << unsigned(Set.Kind); +OS << '$' << 'S' << unsigned(Set.Kind); for (const OMPTraitSelector &Selector : Set.Selectors) { bool AllowsTraitScore = false; bool RequiresProperty = false; isValidTraitSelectorForTraitSet( Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty); - OS << '.' << 's' << unsigned(Selector.Kind); + OS << '$' << 's' << unsigned(Selector.Kind); if (!RequiresProperty || Selector.Kind == TraitSelector::user_condition) continue; for (const OMPTraitProperty &Property : Selector.Properties) -OS << '.' << 'P' - << getOpenMPContextTraitPropertyName(Property.Kind); +OS << '$' << 'P' << getOpenMPContextTraitPropertyName(Property.Kind); } } return OS.str(); @@ -2133,7 +2132,7 @@ OMPTraitInfo::OMPTraitInfo(StringRef MangledName) { unsigned long U; do { -if (!MangledName.consume_front(".S")) +if (!MangledName.consume_front("$S")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2141,7 +2140,7 @@ OMPTraitSet &Set = Sets.back(); Set.Kind = TraitSet(U); do { - if (!MangledName.consume_front(".s")) + if (!MangledName.consume_front("$s")) break; if (MangledName.consumeInteger(10, U)) break; @@ -2149,11 +2148,11 @@ OMPTraitSelector &Selector = Set.Selectors.back(); Selector.Kind = TraitSelector(U); do { -if (!MangledName.consume_front(".P")) +if (!MangledName.consume_front("$P")) break; Selector.Properties.push_back(OMPTraitProperty()); OMPTraitProperty &Property = Selector.Properties.back(); -std::pair PropRestPair = MangledName.split('.'); +std::pair PropRestPair = MangledName.split('$'); Property.Kind = getOpenMPContextTraitPropertyKind(Set.Kind, PropRestPair.first); MangledName = PropRestPair.second; Index: clang/include/clang/AST/Decl.h === --- clang/include/clang/AST/Decl.h +++ clang
[PATCH] D80439: Replace separator in OpenMP variant name mangling.
LukasSommerTu added a comment. @jdoerfert: Can you please commit for me, I do not have commit access. Thanks! CHANGES SINCE LAST ACTION https://reviews.llvm.org/D80439/new/ https://reviews.llvm.org/D80439 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits