jhuber6 created this revision. jhuber6 added a reviewer: jdoerfert. Herald added subscribers: asavonic, dexonsmith, guansong, yaxunl. Herald added a project: All. jhuber6 requested review of this revision. Herald added subscribers: llvm-commits, cfe-commits, sstefan1. Herald added projects: clang, LLVM.
The OpenMP variant clause current ensures unique function identifiers by mangling the name with `$ompvariant...`. This patch adds an extension to prevent this by stripping off the mangling during code generation. Doing this will conflict with the other symbols in the module, but it will allow us to overload the names of existing symbols if their definitions are allowed to be dropped. This is most useful for overloading the meaning of math functions without changing the symbol so they can still be identified by LLVM. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D122760 Files: clang/include/clang/Basic/IdentifierTable.h clang/lib/CodeGen/CodeGenModule.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp llvm/include/llvm/Frontend/OpenMP/OMPKinds.def
Index: llvm/include/llvm/Frontend/OpenMP/OMPKinds.def =================================================================== --- llvm/include/llvm/Frontend/OpenMP/OMPKinds.def +++ llvm/include/llvm/Frontend/OpenMP/OMPKinds.def @@ -1157,6 +1157,7 @@ __OMP_TRAIT_PROPERTY(implementation, extension, match_none) __OMP_TRAIT_PROPERTY(implementation, extension, disable_implicit_base) __OMP_TRAIT_PROPERTY(implementation, extension, allow_templates) +__OMP_TRAIT_PROPERTY(implementation, extension, keep_original_name) __OMP_TRAIT_SET(user) Index: clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp =================================================================== --- clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp +++ clang/test/OpenMP/nvptx_declare_variant_name_mangling.cpp @@ -8,12 +8,16 @@ // CHECK-DAG: @_Z3bazv // CHECK-DAG: define{{.*}} @"_Z53bar$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv" // CHECK-DAG: define{{.*}} @"_Z53baz$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv" +// CHECK-DAG: define{{.*}} @_ZL73foo // CHECK-DAG: call noundef i32 @"_Z53bar$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"() // CHECK-DAG: call noundef i32 @"_Z53baz$ompvariant$S2$s7$Pnvptx$Pnvptx64$S3$s9$Pmatch_anyv"() +// CHECK-DAG: call noundef i32 @_ZL73foo() #ifndef HEADER #define HEADER +static int foo() { return 3; } + #pragma omp declare target int bar() { return 1; } @@ -28,13 +32,22 @@ #pragma omp end declare variant +#pragma omp begin declare variant match(device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any, keep_original_name)}) + +static int foo() { return 2; } + +#pragma omp end declare variant + #pragma omp end declare target int main() { int res; #pragma omp target map(from \ : res) - res = bar() + baz(); + res += bar() + baz(); +#pragma omp target map(from \ + : res) + res += foo(); return res; } Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -6881,6 +6881,8 @@ IdentifierInfo &VariantII = Context.Idents.get(MangledName); VariantII.setMangledOpenMPVariantName(true); + VariantII.setKeepOpenMPVariantName(DVScope.TI->isExtensionActive( + llvm::omp::TraitProperty::implementation_extension_keep_original_name)); D.SetIdentifier(&VariantII, D.getBeginLoc()); } Index: clang/lib/Parse/ParseOpenMP.cpp =================================================================== --- clang/lib/Parse/ParseOpenMP.cpp +++ clang/lib/Parse/ParseOpenMP.cpp @@ -957,6 +957,10 @@ TraitProperty::implementation_extension_allow_templates) return true; + if (TIProperty.Kind == + TraitProperty::implementation_extension_keep_original_name) + return true; + auto IsMatchExtension = [](OMPTraitProperty &TP) { return (TP.Kind == llvm::omp::TraitProperty::implementation_extension_match_all || Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -1477,6 +1477,14 @@ GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel), ND)); + // If this is an OpenMP variant with the `keep_original_name` extension we + // remove the variant mangling. + const IdentifierInfo *II = ND->getIdentifier(); + if (II && II->isMangledOpenMPVariantName() && II->keepOpenMPVariantName()) + MangledName = StringRef(MangledName) + .split(getOpenMPVariantManglingSeparatorStr()) + .first.str(); + auto Result = Manglings.insert(std::make_pair(MangledName, GD)); return MangledDeclNames[CanonicalGD] = Result.first->first(); } Index: clang/include/clang/Basic/IdentifierTable.h =================================================================== --- clang/include/clang/Basic/IdentifierTable.h +++ clang/include/clang/Basic/IdentifierTable.h @@ -138,6 +138,9 @@ // True if this is a mangled OpenMP variant name. unsigned IsMangledOpenMPVariantName : 1; + // True if we should keep the original name after mangling. + unsigned KeepOpenMPVariantName : 1; + // True if this is a deprecated macro. unsigned IsDeprecatedMacro : 1; @@ -161,7 +164,8 @@ NeedsHandleIdentifier(false), IsFromAST(false), ChangedAfterLoad(false), FEChangedAfterLoad(false), RevertedTokenID(false), OutOfDate(false), IsModulesImport(false), IsMangledOpenMPVariantName(false), - IsDeprecatedMacro(false), IsRestrictExpansion(false), IsFinal(false) {} + KeepOpenMPVariantName(false), IsDeprecatedMacro(false), + IsRestrictExpansion(false), IsFinal(false) {} public: IdentifierInfo(const IdentifierInfo &) = delete; @@ -441,6 +445,12 @@ /// Set whether this is the mangled name of an OpenMP variant. void setMangledOpenMPVariantName(bool I) { IsMangledOpenMPVariantName = I; } + /// Determine if we should use the original name instead of the mangled one. + bool keepOpenMPVariantName() const { return KeepOpenMPVariantName; } + + /// Set whether we should emit the unmangled name at code generation. + void setKeepOpenMPVariantName(bool I) { KeepOpenMPVariantName = I; } + /// Return true if this identifier is an editor placeholder. /// /// Editor placeholders are produced by the code-completion engine and are
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits