diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -4560,7 +4560,7 @@ /// The new name looks likes this: /// + OpenMPVariantManglingSeparatorStr + static constexpr StringRef getOpenMPVariantManglingSeparatorStr() { - return ".ompvariant"; + return "$ompvariant"; } } // namespace clang diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -2167,22 +2167,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(); @@ -2191,7 +2190,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; @@ -2199,7 +2198,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; @@ -2207,11 +2206,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; diff --git a/clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp b/clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp new file mode 100644 --- /dev/null +++ b/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